nat: 1:1 policy NAT
[vpp.git] / src / tools / vppapigen / vppapigen.py
index b80dd4d..33510b8 100755 (executable)
@@ -64,6 +64,7 @@ class VPPAPILexer(object):
         'manual_endian': 'MANUAL_ENDIAN',
         'dont_trace': 'DONT_TRACE',
         'autoreply': 'AUTOREPLY',
+        'autoendian': 'AUTOENDIAN',
         'option': 'OPTION',
         'u8': 'U8',
         'u16': 'U16',
@@ -308,7 +309,7 @@ class Define(Processable):
         self.manual_print = False
         self.manual_endian = False
         self.autoreply = False
-        self.singular = False
+        self.autoendian = 0
         self.options = {}
         for f in flags:
             if f == 'dont_trace':
@@ -319,14 +320,13 @@ class Define(Processable):
                 self.manual_endian = True
             elif f == 'autoreply':
                 self.autoreply = True
+            elif f == 'autoendian':
+                self.autoendian = 1
 
         remove = []
         for b in block:
             if isinstance(b, Option):
-                if b[1] == 'singular' and b[2] == 'true':
-                    self.singular = True
-                else:
-                    self.options[b.option] = b.value
+                self.options[b.option] = b.value
                 remove.append(b)
 
         block = [x for x in block if x not in remove]
@@ -635,7 +635,7 @@ class VPPAPIParser(object):
         '''counter_elements : counter_element
                             | counter_elements counter_element'''
         if len(p) == 2:
-            p[0] = p[1]
+            p[0] = [p[1]]
         else:
             if type(p[1]) is dict:
                 p[0] = [p[1], p[2]]
@@ -723,7 +723,7 @@ class VPPAPIParser(object):
         p[0] = EnumFlag(p[2], p[4])
 
     def p_enumflag_type(self, p):
-        ''' enumflag : ENUMFLAG ID ':' enum_size '{' enum_statements '}' ';' '''  # noqa : E502
+        ''' enumflag : ENUMFLAG ID ':' enumflag_size '{' enum_statements '}' ';' '''  # noqa : E502
         if len(p) == 9:
             p[0] = EnumFlag(p[2], p[6], enumtype=p[4])
         else:
@@ -732,7 +732,16 @@ class VPPAPIParser(object):
     def p_enum_size(self, p):
         ''' enum_size : U8
                       | U16
-                      | U32 '''
+                      | U32
+                      | I8
+                      | I16
+                      | I32 '''
+        p[0] = p[1]
+
+    def p_enumflag_size(self, p):
+        ''' enumflag_size : U8
+                          | U16
+                          | U32 '''
         p[0] = p[1]
 
     def p_define(self, p):
@@ -763,6 +772,7 @@ class VPPAPIParser(object):
                 | MANUAL_ENDIAN
                 | DONT_TRACE
                 | TYPEONLY
+                | AUTOENDIAN
                 | AUTOREPLY'''
         if len(p) == 1:
             return
@@ -1042,8 +1052,6 @@ class VPPAPI():
         for d in msgs:
             if d in seen_services:
                 continue
-            if msgs[d].singular is True:
-                continue
             if d.endswith('_reply'):
                 if d[:-6] in svcs:
                     continue