diff options
author | Ole Troan <ot@cisco.com> | 2019-04-30 10:04:36 +0200 |
---|---|---|
committer | Paul Vinciguerra <pvinci@vinciconsulting.com> | 2019-06-07 10:38:35 +0000 |
commit | 85465588b18fef9c4712f864f512e00741e2d4f2 (patch) | |
tree | d5914b37782edfa7d85a2366e080ca97bc7ece1f /src/vpp-api/python/vpp_papi/vpp_serializer.py | |
parent | 8dbfb433619011b649b1b511ad88969a7f909861 (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.py | 66 |
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 |