vppapigen: allow for enum size other than u32 79/18379/3
authorAndrew Yourtchenko <ayourtch@gmail.com>
Tue, 19 Mar 2019 13:52:29 +0000 (14:52 +0100)
committerPaul Vinciguerra <pvinci@vinciconsulting.com>
Fri, 22 Mar 2019 12:53:01 +0000 (12:53 +0000)
Change-Id: If20d2fbab9b854b7db276c81918fdff6abcb8385
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
src/tools/vppapigen/vppapigen_c.py
src/vpp-api/python/vpp_papi/vpp_serializer.py

index e189b02..6c4ca35 100644 (file)
@@ -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
index 1e59e36..bd5f050 100644 (file)
@@ -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