From 5c4b9f1efd1c5d9853a3c508e2a103d0f5679173 Mon Sep 17 00:00:00 2001 From: Andrew Yourtchenko Date: Tue, 19 Mar 2019 14:52:29 +0100 Subject: [PATCH 1/1] vppapigen: allow for enum size other than u32 Change-Id: If20d2fbab9b854b7db276c81918fdff6abcb8385 Signed-off-by: Andrew Yourtchenko --- src/tools/vppapigen/vppapigen_c.py | 11 ++++++++++- src/vpp-api/python/vpp_papi/vpp_serializer.py | 8 +++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/tools/vppapigen/vppapigen_c.py b/src/tools/vppapigen/vppapigen_c.py index e189b024454..6c4ca356f3a 100644 --- a/src/tools/vppapigen/vppapigen_c.py +++ b/src/tools/vppapigen/vppapigen_c.py @@ -127,10 +127,19 @@ def typedefs(objs, aliases, filename): tname = o.__class__.__name__ output += duplicate_wrapper_head(o.name) if tname == 'Enum': - output += "typedef enum {\n" + if o.enumtype == 'u32': + output += "typedef enum {\n" + else: + output += "typedef enum __attribute__((__packed__)) {\n" + for b in o.block: output += " %s = %s,\n" % (b[0], b[1]) output += '} vl_api_%s_t;\n' % o.name + if o.enumtype != 'u32': + size1 = 'sizeof(vl_api_%s_t)' % o.name + size2 = 'sizeof(%s)' % o.enumtype + err_str = 'size of API enum %s is wrong' % o.name + output += 'STATIC_ASSERT(%s == %s, "%s");\n' % (size1, size2, err_str) else: if tname == 'Union': output += "typedef VL_API_PACKED(union _vl_api_%s {\n" % o.name diff --git a/src/vpp-api/python/vpp_papi/vpp_serializer.py b/src/vpp-api/python/vpp_papi/vpp_serializer.py index 1e59e366a8f..bd5f050bba9 100644 --- a/src/vpp-api/python/vpp_papi/vpp_serializer.py +++ b/src/vpp-api/python/vpp_papi/vpp_serializer.py @@ -279,11 +279,13 @@ class VLAList_legacy(): class VPPEnumType(object): def __init__(self, name, msgdef): self.size = types['u32'].size + self.enumtype = 'u32' e_hash = {} for f in msgdef: if type(f) is dict and 'enumtype' in f: if f['enumtype'] != 'u32': - raise NotImplementedError + self.size = types[f['enumtype']].size + self.enumtype = f['enumtype'] continue ename, evalue = f e_hash[ename] = evalue @@ -297,10 +299,10 @@ class VPPEnumType(object): return True def pack(self, data, kwargs=None): - return types['u32'].pack(data) + return types[self.enumtype].pack(data) def unpack(self, data, offset=0, result=None, ntc=False): - x, size = types['u32'].unpack(data, offset) + x, size = types[self.enumtype].unpack(data, offset) return self.enum(x), size -- 2.16.6