Skip to content
Snippets Groups Projects
Commit c58e3184 authored by Phil's avatar Phil
Browse files

Ability to reference a packet's fields in another packet's fields description

class Test(Packet):
    fields_desc = [ IntField("test1",0),
                    SNAP,
                    IntField("test2",1) ]


>>> ls(SNAP)
OUI        : X3BytesField         = (0)
code       : XShortEnumField      = (0)
>>> ls(Test)
test1      : IntField             = (0)
OUI        : X3BytesField         = (0)
code       : XShortEnumField      = (0)
test2      : IntField             = (1)
parent 75bc9139
No related branches found
No related tags found
No related merge requests found
......@@ -122,8 +122,35 @@ class OID(Gen):
class Packet_metaclass(type):
def __new__(cls, name, bases, dct):
if "fields_desc" in dct: # perform resolution of references to other packets
current_fld = dct["fields_desc"]
resolved_fld = []
for f in current_fld:
if isinstance(f, Packet_metaclass): # reference to another fields_desc
for f2 in f.fields_desc:
resolved_fld.append(f2)
else:
resolved_fld.append(f)
else: # look for a field_desc in parent classes
resolved_fld = None
for b in bases:
if hasattr(b,"fields_desc"):
resolved_fld = b.fields_desc
break
if resolved_fld: # perform default value replacements
final_fld = []
for f in resolved_fld:
if f.name in dct:
f = f.copy()
f.default = dct[f.name]
del(dct[f.name])
final_fld.append(f)
dct["fields_desc"] = final_fld
newcls = super(Packet_metaclass, cls).__new__(cls, name, bases, dct)
for f in newcls.fields_desc:
for f in newcls.fields_desc:
f.register_owner(newcls)
config.conf.layers.register(newcls)
return newcls
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment