diff --git a/scapy/base_classes.py b/scapy/base_classes.py index 1a77642e9e040460614071853ce18ef1653ccf08..221ada6b1abbcbc11a3de3ceb9271896aac40a89 100644 --- a/scapy/base_classes.py +++ b/scapy/base_classes.py @@ -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