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