From 454a3b02aeb8004c69aeff436c227a5fada6fba9 Mon Sep 17 00:00:00 2001 From: Phil <phil@secdev.org> Date: Sun, 8 Mar 2009 10:56:23 +0100 Subject: [PATCH] Added ability to hook packet class creation Typical use is to register many different kinds of a packet at their declaration. --- scapy/base_classes.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scapy/base_classes.py b/scapy/base_classes.py index 42670e0b..2f40f61c 100644 --- a/scapy/base_classes.py +++ b/scapy/base_classes.py @@ -150,16 +150,27 @@ class Packet_metaclass(type): dct["fields_desc"] = final_fld newcls = super(Packet_metaclass, cls).__new__(cls, name, bases, dct) + if hasattr(newcls,"register_variant"): + newcls.register_variant() for f in newcls.fields_desc: f.register_owner(newcls) config.conf.layers.register(newcls) return newcls + def __getattr__(self, attr): for k in self.fields_desc: if k.name == attr: return k raise AttributeError(attr) + def __call__(cls, *args, **kargs): + if "dispatch_hook" in cls.__dict__: + cls = cls.dispatch_hook(*args, **kargs) + i = cls.__new__(cls, cls.__name__, cls.__bases__, cls.__dict__) + i.__init__(*args, **kargs) + return i + + class NewDefaultValues(Packet_metaclass): """NewDefaultValues is deprecated (not needed anymore) -- GitLab