pyloxi: add padding as its own member type
Also remove it from pretty-printing.
diff --git a/py_gen/codegen.py b/py_gen/codegen.py
index 45adc5d..01dd782 100644
--- a/py_gen/codegen.py
+++ b/py_gen/codegen.py
@@ -26,6 +26,7 @@
# under the EPL.
from collections import namedtuple
+import struct
import of_g
import loxi_front_end.type_maps as type_maps
import loxi_utils.loxi_utils as utils
@@ -37,6 +38,7 @@
Member = namedtuple('Member', ['name', 'oftype', 'offset', 'skip'])
LengthMember = namedtuple('LengthMember', ['name', 'oftype', 'offset'])
TypeMember = namedtuple('TypeMember', ['name', 'oftype', 'offset', 'value'])
+PadMember = namedtuple('PadMember', ['offset', 'length'])
def get_type_values(cls, version):
"""
@@ -116,16 +118,14 @@
oftype=oftype.OFType(member['m_type'], version),
value=type_values[member['name']]))
type_members.append(members[-1])
- else: # HACK ensure member names are unique
- if member['name'].startswith("pad"):
- if pad_count == 0:
- m_name = 'pad'
- else:
- m_name = "pad%d" % pad_count
- pad_count += 1
- else:
- m_name = member['name']
- members.append(Member(name=m_name,
+ elif member['name'].startswith("pad"):
+ # HACK this should be moved to the frontend
+ pad_oftype = oftype.OFType(member['m_type'], version)
+ length = struct.calcsize("!" + pad_oftype._pack_fmt())
+ if pad_oftype.is_array: length *= pad_oftype.array_length
+ members.append(PadMember(offset=member['offset'], length=length))
+ else:
+ members.append(Member(name=member['name'],
oftype=oftype.OFType(member['m_type'], version),
offset=member['offset'],
skip=member['name'] in of_g.skip_members))
diff --git a/py_gen/templates/_pack.py b/py_gen/templates/_pack.py
index 15645ee..66ee763 100644
--- a/py_gen/templates/_pack.py
+++ b/py_gen/templates/_pack.py
@@ -26,7 +26,7 @@
:: # under the EPL.
::
:: # TODO coalesce format strings
-:: from py_gen.codegen import Member, LengthMember, TypeMember
+:: from py_gen.codegen import Member, LengthMember, TypeMember, PadMember
:: length_member = None
:: length_member_index = None
:: index = 0
@@ -35,6 +35,8 @@
:: length_member = m
:: length_member_index = index
packed.append(${m.oftype.gen_pack_expr('0')}) # placeholder for ${m.name} at index ${length_member_index}
+:: elif type(m) == PadMember:
+ packed.append('\x00' * ${m.length})
:: else:
packed.append(${m.oftype.gen_pack_expr('self.' + m.name)})
:: #endif
diff --git a/py_gen/templates/_unpack.py b/py_gen/templates/_unpack.py
index 6003725..91186cc 100644
--- a/py_gen/templates/_unpack.py
+++ b/py_gen/templates/_unpack.py
@@ -26,8 +26,11 @@
:: # under the EPL.
::
:: # TODO coalesce format strings
-:: from py_gen.codegen import Member, LengthMember, TypeMember
+:: from py_gen.codegen import Member, LengthMember, TypeMember, PadMember
:: for m in ofclass.members:
+:: if type(m) == PadMember:
+:: continue
+:: #endif
:: unpack_expr = m.oftype.gen_unpack_expr('buf', m.offset)
:: if type(m) == LengthMember:
_length = ${unpack_expr}
diff --git a/py_gen/tests/of10.py b/py_gen/tests/of10.py
index faa3a3e..e636973 100644
--- a/py_gen/tests/of10.py
+++ b/py_gen/tests/of10.py
@@ -690,11 +690,9 @@
eth_dst = cd:ef:01:23:45:67,
vlan_vid = 0x0,
vlan_pcp = 0x0,
- pad = 0x0,
eth_type = 0x0,
ip_dscp = 0x0,
ip_proto = 0x0,
- pad1 = [ 0, 0 ],
ipv4_src = 192.168.3.127,
ipv4_dst = 255.255.255.255,
tcp_src = 0x0,
@@ -709,7 +707,7 @@
flags = 0x0,
actions = [
output { port = OFPP_FLOOD, max_len = 0x0 },
- nicira_dec_ttl { pad = 0x0, pad1 = 0x0 },
+ nicira_dec_ttl { },
bsn_set_tunnel_dst { dst = 0x0 }
]
}"""