papi: vla list of fixed strings

Handle a variable length array of fixed strings.
Like:
fixed_string = VPPType("fixed_string", [["string", "data", 32]])
s = VPPType("string_vla", [["u32", "length"], ["fixed_string", "services", 0, "length"]])

Previously instead of packing and unpacking as strings, exception packed as u8 instead
of list.

Type: fix
Signed-off-by: Ole Troan <ot@cisco.com>
Change-Id: I501a8a4755828042e1539fd5a54eacec21c5e364
Signed-off-by: Ole Troan <ot@cisco.com>
This commit is contained in:
Ole Troan
2022-12-07 15:30:58 +01:00
committed by Dave Wallace
parent d76c029a85
commit 86698fca30
2 changed files with 28 additions and 4 deletions

View File

@ -426,6 +426,32 @@ class TestAddType(unittest.TestCase):
nt, size = s.unpack(b)
self.assertEqual(len(b), size)
# Try same with VLA u8
byte_array = [b"\0"] * (10)
vla_u8 = VPPType("vla_u8", [["u8", "length"], ["u8", "data", 0, "length"]])
b = vla_u8.pack({"length": len(byte_array), "data": byte_array})
nt, size = vla_u8.unpack(b)
# VLA Array of fixed length strings
fixed_string = VPPType("fixed_string", [["string", "data", 32]])
s = VPPType(
"string_vla", [["u32", "length"], ["fixed_string", "services", 0, "length"]]
)
string_list = [{"data": "foobar1"}, {"data": "foobar2"}]
b = s.pack({"length": 2, "services": string_list})
nt, size = s.unpack(b)
# Try same with u8
fixed_u8 = VPPType("fixed_u8", [["u8", "data", 32]])
s = VPPType(
"u8_vla", [["u32", "length"], ["fixed_string", "services", 0, "length"]]
)
u8_list = [{"data": "foobar1"}, {"data": "foobar2"}]
b = s.pack({"length": 2, "services": u8_list})
nt, size = s.unpack(b)
def test_message(self):
foo = VPPMessage(
"foo",

View File

@ -304,9 +304,8 @@ class VLAList(Packer):
len(lst), kwargs[self.length_field]
)
)
# u8 array
if self.packer.size == 1:
if self.packer.size == 1 and self.field_type == "u8":
if isinstance(lst, list):
return b"".join(lst)
return bytes(lst)
@ -321,7 +320,7 @@ class VLAList(Packer):
total = 0
# u8 array
if self.packer.size == 1:
if self.packer.size == 1 and self.field_type == "u8":
if result[self.index] == 0:
return b"", 0
p = BaseTypes("u8", result[self.index])
@ -618,7 +617,6 @@ class VPPType(Packer):
self.packers.append(p)
size += p.size
self.size = size
self.tuple = collections.namedtuple(name, self.fields, rename=True)
types[name] = self