diff --git a/scapy/layers/l2.py b/scapy/layers/l2.py index e6aece9448ad4e30be40278a97587d7d345e8b81..a923b0e7daf3b6ad085039e1979a3f87b9453251 100644 --- a/scapy/layers/l2.py +++ b/scapy/layers/l2.py @@ -127,20 +127,8 @@ class ARPSourceMACField(MACField): ### Layers -class Ether_or_Dot3_metaclass(Packet_metaclass): - def __call__(self, _pkt=None, *args, **kargs): - cls = self - if _pkt and len(_pkt) >= 14: - if struct.unpack("!H", _pkt[12:14])[0] <= 1500: - cls = Dot3 - else: - cls = Ether - i = cls.__new__(cls, cls.__name__, cls.__bases__, cls.__dict__) - i.__init__(_pkt=_pkt, *args, **kargs) - return i class Ether(Packet): - __metaclass__ = Ether_or_Dot3_metaclass name = "Ethernet" fields_desc = [ DestMACField("dst"), SourceMACField("src"), @@ -154,9 +142,15 @@ class Ether(Packet): return 0 def mysummary(self): return self.sprintf("%src% > %dst% (%type%)") + @classmethod + def dispatch_hook(cls, _pkt=None, *args, **kargs): + if _pkt and len(_pkt) >= 14: + if struct.unpack("!H", _pkt[12:14])[0] <= 1500: + return Dot3 + return cls + class Dot3(Packet): - __metaclass__ = Ether_or_Dot3_metaclass name = "802.3" fields_desc = [ DestMACField("dst"), MACField("src", ETHER_ANY), @@ -170,6 +164,12 @@ class Dot3(Packet): return 0 def mysummary(self): return "802.3 %s > %s" % (self.src, self.dst) + @classmethod + def dispatch_hook(cls, _pkt=None, *args, **kargs): + if _pkt and len(_pkt) >= 14: + if struct.unpack("!H", _pkt[12:14])[0] > 1500: + return Ether + return cls class LLC(Packet):