summaryrefslogtreecommitdiffstats
path: root/src/vpp-api/python/vpp_papi/vpp_serializer.py
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2019-04-30 10:04:36 +0200
committerPaul Vinciguerra <pvinci@vinciconsulting.com>2019-06-07 10:38:35 +0000
commit85465588b18fef9c4712f864f512e00741e2d4f2 (patch)
treed5914b37782edfa7d85a2366e080ca97bc7ece1f /src/vpp-api/python/vpp_papi/vpp_serializer.py
parent8dbfb433619011b649b1b511ad88969a7f909861 (diff)
API: Add support for "defaults"
Add support in the API language for specifying a field default. Add default support in Python binding. define foo { u16 mtu [default = 1500]; }; This is client side only. I.e. if the mtu argument is not passed to the foo function, the client language binding will set it default to 1500. Change-Id: I5df43f3cd87cb300b40ca38e15dcab25b40e424a Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vpp-api/python/vpp_papi/vpp_serializer.py')
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_serializer.py66
1 files changed, 51 insertions, 15 deletions
diff --git a/src/vpp-api/python/vpp_papi/vpp_serializer.py b/src/vpp-api/python/vpp_papi/vpp_serializer.py
index d1093318ed0..2d775d558b4 100644
--- a/src/vpp-api/python/vpp_papi/vpp_serializer.py
+++ b/src/vpp-api/python/vpp_papi/vpp_serializer.py
@@ -16,6 +16,10 @@
import struct
import collections
import sys
+import logging
+from . import vpp_format
+import ipaddress
+import socket
if sys.version_info <= (3, 4):
from aenum import IntEnum
@@ -27,11 +31,6 @@ if sys.version_info <= (3, 6):
else:
from enum import IntFlag
-import logging
-from . import vpp_format
-import ipaddress
-
-import socket
#
# Set log-level in application by doing e.g.:
@@ -69,7 +68,7 @@ def conversion_unpacker(data, field_type):
class BaseTypes(object):
- def __init__(self, type, elements=0):
+ def __init__(self, type, elements=0, options=None):
base_types = {'u8': '>B',
'string': '>s',
'u16': '>H',
@@ -85,10 +84,18 @@ class BaseTypes(object):
else:
self.packer = struct.Struct(base_types[type])
self.size = self.packer.size
+ self.options = options
+
+ def __call__(self, args):
+ self.options = args
+ return self
def pack(self, data, kwargs=None):
if not data: # Default to zero if not specified
- data = 0
+ if self.options and 'default' in self.options:
+ data = self.options['default']
+ else:
+ data = 0
return self.packer.pack(data)
def unpack(self, data, offset, result=None, ntc=False):
@@ -148,6 +155,10 @@ class FixedList_u8(object):
self.size = self.packer.size
self.field_type = field_type
+ def __call__(self, args):
+ self.options = args
+ return self
+
def pack(self, data, kwargs=None):
"""Packs a fixed length bytestring. Left-pads with zeros
if input data is too short."""
@@ -183,6 +194,10 @@ class FixedList(object):
self.name = name
self.field_type = field_type
+ def __call__(self, args):
+ self.options = args
+ return self
+
def pack(self, list, kwargs):
if len(list) != self.num:
raise VPPSerializerValueError(
@@ -214,6 +229,10 @@ class VLAList(object):
self.size = self.packer.size
self.length_field = len_field_name
+ def __call__(self, args):
+ self.options = args
+ return self
+
def pack(self, list, kwargs=None):
if not list:
return b""
@@ -257,6 +276,10 @@ class VLAList_legacy():
self.packer = types[field_type]
self.size = self.packer.size
+ def __call__(self, args):
+ self.options = args
+ return self
+
def pack(self, list, kwargs=None):
if self.packer.size == 1:
return bytes(list)
@@ -298,6 +321,10 @@ class VPPEnumType(object):
self.enum = IntFlag(name, e_hash)
types[name] = self
+ def __call__(self, args):
+ self.options = args
+ return self
+
def __getattr__(self, name):
return self.enum[name]
@@ -338,6 +365,10 @@ class VPPUnionType(object):
types[name] = self
self.tuple = collections.namedtuple(name, fields, rename=True)
+ def __call__(self, args):
+ self.options = args
+ return self
+
# Union of variable length?
def pack(self, data, kwargs=None):
if not data:
@@ -383,6 +414,10 @@ class VPPTypeAlias(object):
types[name] = self
+ def __call__(self, args):
+ self.options = args
+ return self
+
def pack(self, data, kwargs=None):
if data and conversion_required(data, self.name):
try:
@@ -423,14 +458,14 @@ class VPPType(object):
raise VPPSerializerValueError(
'Unknown message type {}'.format(f_type))
- l = len(f)
+ fieldlen = len(f)
options = [x for x in f if type(x) is dict]
if len(options):
self.options = options[0]
- l -= 1
+ fieldlen -= 1
else:
self.options = {}
- if l == 3: # list
+ if fieldlen == 3: # list
list_elements = f[2]
if list_elements == 0:
p = VLAList_legacy(f_name, f_type)
@@ -443,15 +478,12 @@ class VPPType(object):
p = FixedList(f_name, f_type, list_elements)
self.packers.append(p)
size += p.size
- elif l == 4: # Variable length list
+ elif fieldlen == 4: # Variable length list
length_index = self.fields.index(f[3])
p = VLAList(f_name, f_type, f[3], length_index)
self.packers.append(p)
else:
- if f_type == 'string':
- p = types[f_type](self.options)
- else:
- p = types[f_type]
+ p = types[f_type](self.options)
self.packers.append(p)
size += p.size
@@ -459,6 +491,10 @@ class VPPType(object):
self.tuple = collections.namedtuple(name, self.fields, rename=True)
types[name] = self
+ def __call__(self, args):
+ self.options = args
+ return self
+
def pack(self, data, kwargs=None):
if not kwargs:
kwargs = data