diff --git a/scapy/asn1packet.py b/scapy/asn1packet.py index 4c476d2a5f52e66f701450ffc4aefb475f10c0cc..1b83c3a3e2f29152208717fcf8006da5546b3e5c 100644 --- a/scapy/asn1packet.py +++ b/scapy/asn1packet.py @@ -9,13 +9,16 @@ Packet holding data in Abstract Syntax Notation (ASN.1). from packet import * +class ASN1Packet_metaclass(Packet_metaclass): + def __new__(cls, name, bases, dct): + if dct["ASN1_root"] is not None: + dct["fields_desc"] = dct["ASN1_root"].get_fields_list() + return super(ASN1Packet_metaclass, cls).__new__(cls, name, bases, dct) + class ASN1_Packet(Packet): + __metaclass__ = ASN1Packet_metaclass ASN1_root = None ASN1_codec = None - def init_fields(self): - flist = self.ASN1_root.get_fields_list() - self.do_init_fields(flist) - self.fields_desc = flist def self_build(self): if self.raw_packet_cache is not None: return self.raw_packet_cache diff --git a/scapy/base_classes.py b/scapy/base_classes.py index d9c26aaeec697543a1637f12a03f26ef92f085fa..1d499653845ca6c2eddd629b584630785f3185ec 100644 --- a/scapy/base_classes.py +++ b/scapy/base_classes.py @@ -17,6 +17,7 @@ import error import types class Gen(object): + __slots__ = [] def __iter__(self): return iter([]) @@ -177,11 +178,27 @@ class Packet_metaclass(type): dct["fields_desc"] = final_fld + if "__slots__" not in dct: + dct["__slots__"] = [] + if "name" in dct: + dct["_name"] = dct.pop("name") newcls = super(Packet_metaclass, cls).__new__(cls, name, bases, dct) + newcls.__all_slots__ = set( + attr + for cls in newcls.__mro__ if hasattr(cls, "__slots__") + for attr in cls.__slots__ + ) + + if hasattr(newcls, "aliastypes"): + newcls.aliastypes = [newcls] + newcls.aliastypes + else: + newcls.aliastypes = [newcls] + if hasattr(newcls,"register_variant"): newcls.register_variant() - for f in newcls.fields_desc: - f.register_owner(newcls) + for f in newcls.fields_desc: + if hasattr(f, "register_owner"): + f.register_owner(newcls) config.conf.layers.register(newcls) return newcls @@ -198,6 +215,12 @@ class Packet_metaclass(type): i.__init__(*args, **kargs) return i +class Field_metaclass(type): + def __new__(cls, name, bases, dct): + if "__slots__" not in dct: + dct["__slots__"] = [] + newcls = super(Field_metaclass, cls).__new__(cls, name, bases, dct) + return newcls class NewDefaultValues(Packet_metaclass): """NewDefaultValues is deprecated (not needed anymore) @@ -222,15 +245,12 @@ class NewDefaultValues(Packet_metaclass): return super(NewDefaultValues, cls).__new__(cls, name, bases, dct) class BasePacket(Gen): - pass + __slots__ = [] ############################# ## Packet list base classe ## ############################# -class BasePacketList: - pass - - - +class BasePacketList(object): + __slots__ = [] diff --git a/scapy/contrib/HomePlugAV.py b/scapy/contrib/HomePlugAV.py index 20022c67593ea66e5db368b11ec3924d491a5f5b..54f962985e3693740b1d2a29de37527966317ef0 100644 --- a/scapy/contrib/HomePlugAV.py +++ b/scapy/contrib/HomePlugAV.py @@ -658,421 +658,422 @@ class ModulePIB(Packet): /!\ A wrong slice would produce 'bad' results """ name = "ModulePIB" + __slots__ = ["_ModulePIB__offset", "_ModulePIB__length"] + fields_desc=[ + ConditionalField(XByteField("FirmwareMajorVersion", 0x00), + lambda pkt:(0x0 == pkt.__offset and 0x1 <= pkt.__offset+pkt.__length)), # The following conditional fiels just check if the current field fits in the data range + ConditionalField(XByteField("PIBMinorVersion", 0x00), + lambda pkt:(0x1 >= pkt.__offset and 0x2 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("reserved_1" , 0x0000), + lambda pkt:(0x2 >= pkt.__offset and 0x4 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("PIBLength" , 0x0000), + lambda pkt:(0x4 >= pkt.__offset and 0x6 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("reserved_2" , 0x0000), + lambda pkt:(0x6 >= pkt.__offset and 0x8 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("checksumPIB", None), + lambda pkt:(0x8 >= pkt.__offset and 0xC <= pkt.__offset+pkt.__length)), + ConditionalField(MACField("PIBMACAddr", "00:00:00:00:00:00"), + lambda pkt:(0xC >= pkt.__offset and 0x12 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("DAK", + "\x00"*16, + 16), + lambda pkt:(0x12 >= pkt.__offset and 0x22 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("reserved_3" , 0x0000), + lambda pkt:(0x22 >= pkt.__offset and 0x24 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("ManufactorID", + "\x00"*64, + 64), + lambda pkt:(0x24 >= pkt.__offset and 0x64 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("NMK", + "\x00"*16, + 16), + lambda pkt:(0x64 >= pkt.__offset and 0x74 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("UserID", + "\x00"*64, + 64), + lambda pkt:(0x74 >= pkt.__offset and 0xB4 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("AVLN_ID", + "\x00"*64, + 64), + lambda pkt:(0xB4 >= pkt.__offset and 0xF4 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("CCoSelection", 0x00), + lambda pkt:(0xF4 >= pkt.__offset and 0xF5 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("CoExistSelection", 0x00), + lambda pkt:(0xF5 >= pkt.__offset and 0xF6 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PLFreqSelection", 0x00), + lambda pkt:(0xF6 >= pkt.__offset and 0xF7 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("H3CDowngradeShld", 0x00), + lambda pkt:(0xF7 >= pkt.__offset and 0xF8 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("PreferredNID", + "\x00"*7, + 7), + lambda pkt:(0xF8 >= pkt.__offset and 0xFF <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("AutoFWUpgradeable", 0x00), + lambda pkt:(0xFF >= pkt.__offset and 0x100 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("MDUConfiguration", 0x00), + lambda pkt:(0x100 >= pkt.__offset and 0x101 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("MDURole", 0x00), + lambda pkt:(0x101 >= pkt.__offset and 0x102 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("SnifferEnabled", 0x00), + lambda pkt:(0x102 >= pkt.__offset and 0x103 <= pkt.__offset+pkt.__length)), + ConditionalField(MACField("SnifferMACAddrRetrn", "00:00:00:00:00:00"), + lambda pkt:(0x103 >= pkt.__offset and 0x109 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("WireTapEnable", 0x00), + lambda pkt:(0x109 >= pkt.__offset and 0x10A <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("reserved_4" , 0x0000), + lambda pkt:(0x10A >= pkt.__offset and 0x10C <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("StaticNetworkEnabled" , 0x00), + lambda pkt:(0x10C >= pkt.__offset and 0x10D <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("LD_TEI" , 0x00), + lambda pkt:(0x10D >= pkt.__offset and 0x10E <= pkt.__offset+pkt.__length)), + ConditionalField(MACField("CCo_MACAdd", "00:00:00:00:00:00"), + lambda pkt:(0x10E >= pkt.__offset and 0x114 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("SNID", 0x00), + lambda pkt:(0x114 >= pkt.__offset and 0x115 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("NumOfPeerNodes", 0x00), + lambda pkt:(0x115 >= pkt.__offset and 0x116 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("PeerNodes", "", PeerNode, length_from=lambda x: 56), + lambda pkt:(0x116 >= pkt.__offset and 0x11C <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_5", + "\x00"*62, + 62), + lambda pkt:(0x146 >= pkt.__offset and 0x14e <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("OverideModeDefaults" , 0x00), + lambda pkt:(0x18C >= pkt.__offset and 0x18D <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("DisableFlowControl" , 0x00), + lambda pkt:(0x18D >= pkt.__offset and 0x18E <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("AdvertisementCapabilities" , 0x00), + lambda pkt:(0x18E >= pkt.__offset and 0x18F <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("OverrideMeteringDefaults" , 0x00), + lambda pkt:(0x18F >= pkt.__offset and 0x190 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("MaxFramesPerSec" , 0), + lambda pkt:(0x190 >= pkt.__offset and 0x194 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("DisableAutoNegotiation" , 0x00), + lambda pkt:(0x194 >= pkt.__offset and 0x195 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("EnetSpeedSetting" , 0x00), + lambda pkt:(0x195 >= pkt.__offset and 0x196 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("EnetDuplexSetting" , 0x00), + lambda pkt:(0x196 >= pkt.__offset and 0x197 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("DisableTxFlowControl" , 0x00), + lambda pkt:(0x197 >= pkt.__offset and 0x198 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("DisableRxFlowControl" , 0x00), + lambda pkt:(0x198 >= pkt.__offset and 0x199 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PhyAddressSelection" , 0x00), + lambda pkt:(0x199 >= pkt.__offset and 0x19A <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PhyAddressSelection_Data" , 0x00), + lambda pkt:(0x19A >= pkt.__offset and 0x19B <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("reserved_6" , 0x00), + lambda pkt:(0x19B >= pkt.__offset and 0x19C <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("Force33MHz" , 0x00), + lambda pkt:(0x19C >= pkt.__offset and 0x19D <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("LinkStatusOnPowerline" , 0x00), + lambda pkt:(0x19D >= pkt.__offset and 0x19E <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("OverrideIdDefaults" , 0x00), + lambda pkt:(0x19E >= pkt.__offset and 0x19F <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("OverrideSubIdDefaults" , 0x00), + lambda pkt:(0x19F >= pkt.__offset and 0x1A0 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("PCIDeviceID" , 0x0000), + lambda pkt:(0x1A0 >= pkt.__offset and 0x1A2 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("PCIVendorID" , 0x0000), + lambda pkt:(0x1A2 >= pkt.__offset and 0x1A4 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("reserved_7" , 0x00), + lambda pkt:(0x1A4 >= pkt.__offset and 0x1A5 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PCIClassCode" , 0x00), + lambda pkt:(0x1A5 >= pkt.__offset and 0x1A6 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PCIClassCodeSubClass" , 0x00), + lambda pkt:(0x1A6 >= pkt.__offset and 0x1A7 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PCIRevisionID" , 0x00), + lambda pkt:(0x1A7 >= pkt.__offset and 0x1A8 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("PCISubsystemID" , 0x0000), + lambda pkt:(0x1A8 >= pkt.__offset and 0x1AA <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("PCISybsystemVendorID" , 0x0000), + lambda pkt:(0x1AA >= pkt.__offset and 0x1AC <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_8", + "\x00"*64, + 64), + lambda pkt:(0x1AC >= pkt.__offset and 0x1EC <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("OverrideIGMPDefaults" , 0x00), + lambda pkt:(0x1EC >= pkt.__offset and 0x1ED <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ConfigFlags" , 0x00), + lambda pkt:(0x1ED >= pkt.__offset and 0x1EE <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("NumCpToSend_PLFrames" , 0x00), + lambda pkt:(0x1EE >= pkt.__offset and 0x1EF <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_9", + "\x00"*29, + 29), + lambda pkt:(0x1EF >= pkt.__offset and 0x20C <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("UniCastPriority" , 0x00), + lambda pkt:(0x20C >= pkt.__offset and 0x20D <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("McastPriority" , 0x00), + lambda pkt:(0x20D >= pkt.__offset and 0x20E <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("IGMPPriority" , 0x00), + lambda pkt:(0x20E >= pkt.__offset and 0x20F <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("AVStreamPriority" , 0x00), + lambda pkt:(0x20F >= pkt.__offset and 0x210 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("PriorityTTL_0" , 0), + lambda pkt:(0x210 >= pkt.__offset and 0x214 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("PriorityTTL_1" , 0), + lambda pkt:(0x214 >= pkt.__offset and 0x218 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("PriorityTTL_2" , 0), + lambda pkt:(0x218 >= pkt.__offset and 0x21C <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("PriorityTTL_3" , 0), + lambda pkt:(0x21C >= pkt.__offset and 0x220 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("EnableVLANOver" , 0x00), + lambda pkt:(0x220 >= pkt.__offset and 0x221 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("EnableTOSOver" , 0x00), + lambda pkt:(0x221 >= pkt.__offset and 0x222 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("reserved_10" , 0x0000), + lambda pkt:(0x222 >= pkt.__offset and 0x224 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("VLANPrioTOSPrecMatrix" , 0), + lambda pkt:(0x224 >= pkt.__offset and 0x228 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("NumClassifierPriorityMaps" , 0), + lambda pkt:(0x228 >= pkt.__offset and 0x22C <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("NumAutoConnections" , 0), + lambda pkt:(0x22C >= pkt.__offset and 0x230 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("ClassifierPriorityMaps", "", ClassifierPriorityMap, length_from=lambda x: 224), + lambda pkt:(0x230 >= pkt.__offset and 0x244 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("AutoConnections", "", AutoConnection, length_from=lambda x: 1600), + lambda pkt:(0x310 >= pkt.__offset and 0x36e <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("NumberOfConfigEntries" , 0x00), + lambda pkt:(0x950 >= pkt.__offset and 0x951 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("AggregateConfigEntries", "", AggregateConfigEntrie, length_from=lambda x: 16), + lambda pkt:(0x951 >= pkt.__offset and 0x961 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("RSVD_CustomAggregationParameters", "", RSVD_CustomAggregationParameter, length_from=lambda x: 48), + lambda pkt:(0x961 >= pkt.__offset and 0x991 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_11", + "\x00"*123, + 123), + lambda pkt:(0x991 >= pkt.__offset and 0xA0C <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("ToneMaskType" , 0), + lambda pkt:(0xA0C >= pkt.__offset and 0xA10 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("ToneMaskEnabled" , 0), + lambda pkt:(0xA10 >= pkt.__offset and 0xA14 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("StartTone" , 0), + lambda pkt:(0xA14 >= pkt.__offset and 0xA18 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("EndTone" , 0), + lambda pkt:(0xA18 >= pkt.__offset and 0xA1C <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_12", + "\x00"*12, + 12), + lambda pkt:(0xA1C >= pkt.__offset and 0xA28 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("PsdIndex" , 0), + lambda pkt:(0xA28 >= pkt.__offset and 0xA2C <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("TxPrescalerType" , 0), + lambda pkt:(0xA2C >= pkt.__offset and 0xA30 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("PrescalerValues", "", PrescalerValue, length_from=lambda x: 3600), + lambda pkt:(0xA30 >= pkt.__offset and 0xA34 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_13", + "\x00"*1484, + 1484), + lambda pkt:(0x1840 >= pkt.__offset and 0x1E0C <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("AllowNEKRotation" , 0), + lambda pkt:(0x1E0C >= pkt.__offset and 0x1E10 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("OverrideLocalNEK" , 0), + lambda pkt:(0x1E10 >= pkt.__offset and 0x1E14 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("LocalNEKToUse", + "\x00"*16, + 16), + lambda pkt:(0x1E14 >= pkt.__offset and 0x1E24 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("OverrideNEKRotationTimer" , 0), + lambda pkt:(0x1E24 >= pkt.__offset and 0x1E28 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("NEKRotationTime_Min" , 0), + lambda pkt:(0x1E28 >= pkt.__offset and 0x1E2C <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_14", + "\x00"*96, + 96), + lambda pkt:(0x1E2C >= pkt.__offset and 0x1E8C <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("AVLNMembership" , 0), + lambda pkt:(0x1E8C >= pkt.__offset and 0x1E90 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("SimpleConnectTimeout" , 0), + lambda pkt:(0x1E90 >= pkt.__offset and 0x1E94 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("EnableLEDThroughputIndicate" , 0), + lambda pkt:(0x1E94 >= pkt.__offset and 0x1E95 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("MidLEDThroughputThreshold_Mbps" , 0), + lambda pkt:(0x1E95 >= pkt.__offset and 0x1E96 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("HighLEDThroughputThreshold_Mbps" , 0), + lambda pkt:(0x1E96 >= pkt.__offset and 0x1E97 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("reserved_15" , 0), + lambda pkt:(0x1E97 >= pkt.__offset and 0x1E98 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("EnableUnicastQuieriesToMember" , 0), + lambda pkt:(0x1E98 >= pkt.__offset and 0x1E99 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("DisableMLDGroupIDCheckInMAC" , 0), + lambda pkt:(0x1E99 >= pkt.__offset and 0x1E9A <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("EnableReportsToNonQuerierHosts" , 0), + lambda pkt:(0x1E9A >= pkt.__offset and 0x1E9C <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("DisableExpireGroupMembershipInterval" , 0), + lambda pkt:(0x1E9C >= pkt.__offset and 0x1EA0 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("DisableLEDTestLights" , 0), + lambda pkt:(0x1EA0 >= pkt.__offset and 0x1EA4 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("GPIOMaps", "", GPIOMap, length_from=lambda x: 12), + lambda pkt:(0x1EA4 >= pkt.__offset and 0x1EB0 <= pkt.__offset+pkt.__length)), + ConditionalField(XLongField("reserved_16" , 0), + lambda pkt:(0x1EB0 >= pkt.__offset and 0x1EB8 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("EnableTrafficClass_DSCPOver" , 0), + lambda pkt:(0x1EB8 >= pkt.__offset and 0x1EB9 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("TrafficClass_DSCPMatrices", + "\x00"*64, + 64), + lambda pkt:(0x1EB9 >= pkt.__offset and 0x1EF9 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("GPIOControl" , 0), + lambda pkt:(0x1EF9 >= pkt.__offset and 0x1EFA <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("LEDControl", + "\x00"*32, + 32), + lambda pkt:(0x1EFA >= pkt.__offset and 0x1F1A <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("OverrideMinButtonPressHoldTime" , 0), + lambda pkt:(0x1F1A >= pkt.__offset and 0x1F1E <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("MinButtonPressHoldTime" , 0), + lambda pkt:(0x1F1E >= pkt.__offset and 0x1F22 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_17", + "\x00"*22, + 22), + lambda pkt:(0x1F22 >= pkt.__offset and 0x1F38 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("MemoryProfile" , 0), + lambda pkt:(0x1F38 >= pkt.__offset and 0x1F3C <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("DisableAllLEDFlashOnWarmReboot" , 0), + lambda pkt:(0x1F3C >= pkt.__offset and 0x1F40 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("UplinkLimit_bps" , 0), + lambda pkt:(0x1F40 >= pkt.__offset and 0x1F44 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("DownlinkLimit_bps" , 0), + lambda pkt:(0x1F44 >= pkt.__offset and 0x1F48 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("MDUStaticSNID" , 0), + lambda pkt:(0x1F48 >= pkt.__offset and 0x1F4C <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("MitigateEnabled" , 0), + lambda pkt:(0x1F4C >= pkt.__offset and 0x1F4D <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("CorrelThreshold" , 0), + lambda pkt:(0x1F4D >= pkt.__offset and 0x1F51 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("ScaledTxGain" , 0), + lambda pkt:(0x1F51 >= pkt.__offset and 0x1F55 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ResourceThresholdEnabled" , 0), + lambda pkt:(0x1F55 >= pkt.__offset and 0x1F56 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("ReservedPercentageForCaps", "", ReservedPercentageForCap, length_from=lambda x: 4), + lambda pkt:(0x1F56 >= pkt.__offset and 0x1F5A <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PowerSavingMode" , 0), + lambda pkt:(0x1F5A >= pkt.__offset and 0x1F5B <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PowerLEDDutyCycle" , 0), + lambda pkt:(0x1F5B >= pkt.__offset and 0x1F5C <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("reserved_18" , 0), + lambda pkt:(0x1F5C >= pkt.__offset and 0x1F5E <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("LinkUpDurationBeforeReset_ms" , 0), + lambda pkt:(0x1F5E >= pkt.__offset and 0x1F62 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("PowerLEDPeriod_ms" , 0), + lambda pkt:(0x1F62 >= pkt.__offset and 0x1F66 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("LinkDownDurationBeforeLowPowerMode_ms" , 0), + lambda pkt:(0x1F66 >= pkt.__offset and 0x1F6A <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("reserved_19" , 0), + lambda pkt:(0x1F6A >= pkt.__offset and 0x1F6E <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("AfeGainBusMode" , 0), + lambda pkt:(0x1F6E >= pkt.__offset and 0x1F6F <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("EnableDynamicPsd" , 0), + lambda pkt:(0x1F6F >= pkt.__offset and 0x1F70 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ReservedPercentageForTxStreams" , 0), + lambda pkt:(0x1F70 >= pkt.__offset and 0x1F71 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ReservedPercentageForRxStreams" , 0), + lambda pkt:(0x1F71 >= pkt.__offset and 0x1F72 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_20", + "\x00"*22, + 22), + lambda pkt:(0x1F72 >= pkt.__offset and 0x1F88 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("LegacyNetworkUpgradeEnable" , 0), + lambda pkt:(0x1F88 >= pkt.__offset and 0x1F8C <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("unknown" , 0), + lambda pkt:(0x1F8C >= pkt.__offset and 0x1F90 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("MMETTL_us" , 0), + lambda pkt:(0x1F90 >= pkt.__offset and 0x1F94 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("ConfigBits", "", ConfigBit, length_from=lambda x: 2), + lambda pkt:(0x1F94 >= pkt.__offset and 0x1F96 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("TxToneMapExpiry_ms" , 0), + lambda pkt:(0x1F96 >= pkt.__offset and 0x1F9A <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("RxToneMapExpiry_ms" , 0), + lambda pkt:(0x1F9A >= pkt.__offset and 0x1F9E <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("TimeoutToResound_ms" , 0), + lambda pkt:(0x1F9E >= pkt.__offset and 0x1FA2 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("MissingSackThresholdForUnplugDetection" , 0), + lambda pkt:(0x1FA2 >= pkt.__offset and 0x1FA6 <= pkt.__offset+pkt.__length)), + ConditionalField(LEIntField("UnplugTimeout_ms" , 0), + lambda pkt:(0x1FA6 >= pkt.__offset and 0x1FAA <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("ContentionWindowTableES", "", ContentionWindowTable, length_from=lambda x: 8), + lambda pkt:(0x1FAA >= pkt.__offset and 0x1FB2 <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("BackoffDeferalCountTableES", "", BackoffDeferalCountTable, length_from=lambda x: 4), + lambda pkt:(0x1FB2 >= pkt.__offset and 0x1FB6 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("GoodSoundCountThreshold" , 0), + lambda pkt:(0x1FB6 >= pkt.__offset and 0x1FB7 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("SoundCountThreshold_GoodSoundCountPass" , 0), + lambda pkt:(0x1FB7 >= pkt.__offset and 0x1FB8 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("SoundCountThreshold_GoodSoundCountFail" , 0), + lambda pkt:(0x1FB8 >= pkt.__offset and 0x1FB9 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("reserved_21" , 0), + lambda pkt:(0x1FB9 >= pkt.__offset and 0x1FBB <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ExclusiveTxPbs_percentage" , 0), + lambda pkt:(0x1FBB >= pkt.__offset and 0x1FBC <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ExclusiveRxPbs_percentage" , 0), + lambda pkt:(0x1FBC >= pkt.__offset and 0x1FBD <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("OptimizationBackwardCompatible" , 0), + lambda pkt:(0x1FBD >= pkt.__offset and 0x1FBE <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("reserved_21" , 0), + lambda pkt:(0x1FBE >= pkt.__offset and 0x1FBF <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("MaxPbsPerSymbol" , 0), + lambda pkt:(0x1FBF >= pkt.__offset and 0x1FC0 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("MaxModulation" , 0), + lambda pkt:(0x1FC0 >= pkt.__offset and 0x1FC1 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ContinuousRx" , 0), + lambda pkt:(0x1FC1 >= pkt.__offset and 0x1FC2 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_22", + "\x00"*6, + 6), + lambda pkt:(0x1FC2 >= pkt.__offset and 0x1FC8 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("PBControlStatus" , 0), + lambda pkt:(0x1FC8 >= pkt.__offset and 0x1FC9 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("STAMembershipMaskEnabled" , 0), + lambda pkt:(0x1FC9 >= pkt.__offset and 0x1FCA <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ExitDefaultEnabled" , 0), + lambda pkt:(0x1FCA >= pkt.__offset and 0x1FCB <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("RejectDefaultEnabled" , 0), + lambda pkt:(0x1FCB >= pkt.__offset and 0x1FCC <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ChainingEnabled" , 0), + lambda pkt:(0x1FCC >= pkt.__offset and 0x1FCD <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("VendorSpecificNMK", + "\x00"*16, + 16), + lambda pkt:(0x1FCD >= pkt.__offset and 0x1FDD <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("LocalMACAddressLimit" , 0), + lambda pkt:(0x1FDD >= pkt.__offset and 0x1FDE <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("OverrideBridgeTableAgingTime" , 0), + lambda pkt:(0x1FDE >= pkt.__offset and 0x1FDF <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("LocalBridgeTableAgingTime_min" , 0), + lambda pkt:(0x1FDF >= pkt.__offset and 0x1FE1 <= pkt.__offset+pkt.__length)), + ConditionalField(XShortField("RemoteBridgeTableAgingTime_min" , 0), + lambda pkt:(0x1FE1 >= pkt.__offset and 0x1FE3 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("PhySyncReference" , 0), + lambda pkt:(0x1FE3 >= pkt.__offset and 0x1FE7 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("reserved_23" , 0), + lambda pkt:(0x1FE7 >= pkt.__offset and 0x1FE8 <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("reserved_24" , 0), + lambda pkt:(0x1FE8 >= pkt.__offset and 0x1FEC <= pkt.__offset+pkt.__length)), + ConditionalField(XIntField("reserved_25" , 0), + lambda pkt:(0x1FEC >= pkt.__offset and 0x1FF0 <= pkt.__offset+pkt.__length)), + ConditionalField(StrFixedLenField("reserved_26", + "\x00"*24, + 24), + lambda pkt:(0x1FF0 >= pkt.__offset and 0x2008 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("OverrideDefaultLedEventBehavior" , 0x80), + lambda pkt:(0x2008 >= pkt.__offset and 0x2009 <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("ReportToHostInfo" , 0), + lambda pkt:(0x2009 >= pkt.__offset and 0x200A <= pkt.__offset+pkt.__length)), + ConditionalField(X3BytesField("reserved_27" , 0), + lambda pkt:(0x200A >= pkt.__offset and 0x200D <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("NumBehaviors" , 0), + lambda pkt:(0x200D >= pkt.__offset and 0x200E <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("BehaviorBlockArrayES", "", BehaviorBlockArray, length_from=lambda x: 1200), + lambda pkt:(0x200E >= pkt.__offset and 0x24BE <= pkt.__offset+pkt.__length)), + ConditionalField(XByteField("NumEvents" , 0), + lambda pkt:(0x24BE >= pkt.__offset and 0x24BF <= pkt.__offset+pkt.__length)), + ConditionalField(PacketListField("EventBlockArrayES", "", EventBlockArray, length_from=lambda x: 550), + lambda pkt:(0x24BF >= pkt.__offset and 0x26E5 <= pkt.__offset+pkt.__length)), + ] def __init__(self, packet="", offset = 0x0, length = 0x400): self.__offset = offset self.__length = length - self.fields_desc=[ ConditionalField( XByteField("FirmwareMajorVersion", 0x00), - lambda pkt:(0x0 == self.__offset and 0x1 <= self.__offset+self.__length) ), # The following conditional fiels just check if the current field fits in the data range - ConditionalField( XByteField("PIBMinorVersion", 0x00), - lambda pkt:(0x1 >= self.__offset and 0x2 <= self.__offset+self.__length) ), - ConditionalField( XShortField("reserved_1" , 0x0000), - lambda pkt:(0x2 >= self.__offset and 0x4 <= self.__offset+self.__length) ), - ConditionalField( XShortField("PIBLength" , 0x0000), - lambda pkt:(0x4 >= self.__offset and 0x6 <= self.__offset+self.__length) ), - ConditionalField( XShortField("reserved_2" , 0x0000), - lambda pkt:(0x6 >= self.__offset and 0x8 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("checksumPIB", None), - lambda pkt:(0x8 >= self.__offset and 0xC <= self.__offset+self.__length) ), - ConditionalField( MACField("PIBMACAddr", "00:00:00:00:00:00"), - lambda pkt:(0xC >= self.__offset and 0x12 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("DAK", - "\x00"*16, - 16), - lambda pkt:(0x12 >= self.__offset and 0x22 <= self.__offset+self.__length) ), - ConditionalField( XShortField("reserved_3" , 0x0000), - lambda pkt:(0x22 >= self.__offset and 0x24 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("ManufactorID", - "\x00"*64, - 64), - lambda pkt:(0x24 >= self.__offset and 0x64 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("NMK", - "\x00"*16, - 16), - lambda pkt:(0x64 >= self.__offset and 0x74 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("UserID", - "\x00"*64, - 64), - lambda pkt:(0x74 >= self.__offset and 0xB4 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("AVLN_ID", - "\x00"*64, - 64), - lambda pkt:(0xB4 >= self.__offset and 0xF4 <= self.__offset+self.__length) ), - ConditionalField( XByteField("CCoSelection", 0x00), - lambda pkt:(0xF4 >= self.__offset and 0xF5 <= self.__offset+self.__length) ), - ConditionalField( XByteField("CoExistSelection", 0x00), - lambda pkt:(0xF5 >= self.__offset and 0xF6 <= self.__offset+self.__length) ), - ConditionalField( XByteField("PLFreqSelection", 0x00), - lambda pkt:(0xF6 >= self.__offset and 0xF7 <= self.__offset+self.__length) ), - ConditionalField( XByteField("H3CDowngradeShld", 0x00), - lambda pkt:(0xF7 >= self.__offset and 0xF8 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("PreferredNID", - "\x00"*7, - 7), - lambda pkt:(0xF8 >= self.__offset and 0xFF <= self.__offset+self.__length) ), - ConditionalField( XByteField("AutoFWUpgradeable", 0x00), - lambda pkt:(0xFF >= self.__offset and 0x100 <= self.__offset+self.__length) ), - ConditionalField( XByteField("MDUConfiguration", 0x00), - lambda pkt:(0x100 >= self.__offset and 0x101 <= self.__offset+self.__length) ), - ConditionalField( XByteField("MDURole", 0x00), - lambda pkt:(0x101 >= self.__offset and 0x102 <= self.__offset+self.__length) ), - ConditionalField( XByteField("SnifferEnabled", 0x00), - lambda pkt:(0x102 >= self.__offset and 0x103 <= self.__offset+self.__length) ), - ConditionalField( MACField("SnifferMACAddrRetrn", "00:00:00:00:00:00"), - lambda pkt:(0x103 >= self.__offset and 0x109 <= self.__offset+self.__length) ), - ConditionalField( XByteField("WireTapEnable", 0x00), - lambda pkt:(0x109 >= self.__offset and 0x10A <= self.__offset+self.__length) ), - ConditionalField( XShortField("reserved_4" , 0x0000), - lambda pkt:(0x10A >= self.__offset and 0x10C <= self.__offset+self.__length) ), - ConditionalField( XByteField("StaticNetworkEnabled" , 0x00), - lambda pkt:(0x10C >= self.__offset and 0x10D <= self.__offset+self.__length) ), - ConditionalField( XByteField("LD_TEI" , 0x00), - lambda pkt:(0x10D >= self.__offset and 0x10E <= self.__offset+self.__length) ), - ConditionalField( MACField("CCo_MACAdd", "00:00:00:00:00:00"), - lambda pkt:(0x10E >= self.__offset and 0x114 <= self.__offset+self.__length) ), - ConditionalField( XByteField("SNID", 0x00), - lambda pkt:(0x114 >= self.__offset and 0x115 <= self.__offset+self.__length) ), - ConditionalField( XByteField("NumOfPeerNodes", 0x00), - lambda pkt:(0x115 >= self.__offset and 0x116 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("PeerNodes", "", PeerNode, length_from=lambda x: 56), - lambda pkt:(0x116 >= self.__offset and 0x11C <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_5", - "\x00"*62, - 62), - lambda pkt:(0x146 >= self.__offset and 0x14e <= self.__offset+self.__length) ), - ConditionalField( XByteField("OverideModeDefaults" , 0x00), - lambda pkt:(0x18C >= self.__offset and 0x18D <= self.__offset+self.__length) ), - ConditionalField( XByteField("DisableFlowControl" , 0x00), - lambda pkt:(0x18D >= self.__offset and 0x18E <= self.__offset+self.__length) ), - ConditionalField( XByteField("AdvertisementCapabilities" , 0x00), - lambda pkt:(0x18E >= self.__offset and 0x18F <= self.__offset+self.__length) ), - ConditionalField( XByteField("OverrideMeteringDefaults" , 0x00), - lambda pkt:(0x18F >= self.__offset and 0x190 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("MaxFramesPerSec" , 0), - lambda pkt:(0x190 >= self.__offset and 0x194 <= self.__offset+self.__length) ), - ConditionalField( XByteField("DisableAutoNegotiation" , 0x00), - lambda pkt:(0x194 >= self.__offset and 0x195 <= self.__offset+self.__length) ), - ConditionalField( XByteField("EnetSpeedSetting" , 0x00), - lambda pkt:(0x195 >= self.__offset and 0x196 <= self.__offset+self.__length) ), - ConditionalField( XByteField("EnetDuplexSetting" , 0x00), - lambda pkt:(0x196 >= self.__offset and 0x197 <= self.__offset+self.__length) ), - ConditionalField( XByteField("DisableTxFlowControl" , 0x00), - lambda pkt:(0x197 >= self.__offset and 0x198 <= self.__offset+self.__length) ), - ConditionalField( XByteField("DisableRxFlowControl" , 0x00), - lambda pkt:(0x198 >= self.__offset and 0x199 <= self.__offset+self.__length) ), - ConditionalField( XByteField("PhyAddressSelection" , 0x00), - lambda pkt:(0x199 >= self.__offset and 0x19A <= self.__offset+self.__length) ), - ConditionalField( XByteField("PhyAddressSelection_Data" , 0x00), - lambda pkt:(0x19A >= self.__offset and 0x19B <= self.__offset+self.__length) ), - ConditionalField( XByteField("reserved_6" , 0x00), - lambda pkt:(0x19B >= self.__offset and 0x19C <= self.__offset+self.__length) ), - ConditionalField( XByteField("Force33MHz" , 0x00), - lambda pkt:(0x19C >= self.__offset and 0x19D <= self.__offset+self.__length) ), - ConditionalField( XByteField("LinkStatusOnPowerline" , 0x00), - lambda pkt:(0x19D >= self.__offset and 0x19E <= self.__offset+self.__length) ), - ConditionalField( XByteField("OverrideIdDefaults" , 0x00), - lambda pkt:(0x19E >= self.__offset and 0x19F <= self.__offset+self.__length) ), - ConditionalField( XByteField("OverrideSubIdDefaults" , 0x00), - lambda pkt:(0x19F >= self.__offset and 0x1A0 <= self.__offset+self.__length) ), - ConditionalField( XShortField("PCIDeviceID" , 0x0000), - lambda pkt:(0x1A0 >= self.__offset and 0x1A2 <= self.__offset+self.__length) ), - ConditionalField( XShortField("PCIVendorID" , 0x0000), - lambda pkt:(0x1A2 >= self.__offset and 0x1A4 <= self.__offset+self.__length) ), - ConditionalField( XByteField("reserved_7" , 0x00), - lambda pkt:(0x1A4 >= self.__offset and 0x1A5 <= self.__offset+self.__length) ), - ConditionalField( XByteField("PCIClassCode" , 0x00), - lambda pkt:(0x1A5 >= self.__offset and 0x1A6 <= self.__offset+self.__length) ), - ConditionalField( XByteField("PCIClassCodeSubClass" , 0x00), - lambda pkt:(0x1A6 >= self.__offset and 0x1A7 <= self.__offset+self.__length) ), - ConditionalField( XByteField("PCIRevisionID" , 0x00), - lambda pkt:(0x1A7 >= self.__offset and 0x1A8 <= self.__offset+self.__length) ), - ConditionalField( XShortField("PCISubsystemID" , 0x0000), - lambda pkt:(0x1A8 >= self.__offset and 0x1AA <= self.__offset+self.__length) ), - ConditionalField( XShortField("PCISybsystemVendorID" , 0x0000), - lambda pkt:(0x1AA >= self.__offset and 0x1AC <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_8", - "\x00"*64, - 64), - lambda pkt:(0x1AC >= self.__offset and 0x1EC <= self.__offset+self.__length) ), - ConditionalField( XByteField("OverrideIGMPDefaults" , 0x00), - lambda pkt:(0x1EC >= self.__offset and 0x1ED <= self.__offset+self.__length) ), - ConditionalField( XByteField("ConfigFlags" , 0x00), - lambda pkt:(0x1ED >= self.__offset and 0x1EE <= self.__offset+self.__length) ), - ConditionalField( XByteField("NumCpToSend_PLFrames" , 0x00), - lambda pkt:(0x1EE >= self.__offset and 0x1EF <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_9", - "\x00"*29, - 29), - lambda pkt:(0x1EF >= self.__offset and 0x20C <= self.__offset+self.__length) ), - ConditionalField( XByteField("UniCastPriority" , 0x00), - lambda pkt:(0x20C >= self.__offset and 0x20D <= self.__offset+self.__length) ), - ConditionalField( XByteField("McastPriority" , 0x00), - lambda pkt:(0x20D >= self.__offset and 0x20E <= self.__offset+self.__length) ), - ConditionalField( XByteField("IGMPPriority" , 0x00), - lambda pkt:(0x20E >= self.__offset and 0x20F <= self.__offset+self.__length) ), - ConditionalField( XByteField("AVStreamPriority" , 0x00), - lambda pkt:(0x20F >= self.__offset and 0x210 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("PriorityTTL_0" , 0), - lambda pkt:(0x210 >= self.__offset and 0x214 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("PriorityTTL_1" , 0), - lambda pkt:(0x214 >= self.__offset and 0x218 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("PriorityTTL_2" , 0), - lambda pkt:(0x218 >= self.__offset and 0x21C <= self.__offset+self.__length) ), - ConditionalField( LEIntField("PriorityTTL_3" , 0), - lambda pkt:(0x21C >= self.__offset and 0x220 <= self.__offset+self.__length) ), - ConditionalField( XByteField("EnableVLANOver" , 0x00), - lambda pkt:(0x220 >= self.__offset and 0x221 <= self.__offset+self.__length) ), - ConditionalField( XByteField("EnableTOSOver" , 0x00), - lambda pkt:(0x221 >= self.__offset and 0x222 <= self.__offset+self.__length) ), - ConditionalField( XShortField("reserved_10" , 0x0000), - lambda pkt:(0x222 >= self.__offset and 0x224 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("VLANPrioTOSPrecMatrix" , 0), - lambda pkt:(0x224 >= self.__offset and 0x228 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("NumClassifierPriorityMaps" , 0), - lambda pkt:(0x228 >= self.__offset and 0x22C <= self.__offset+self.__length) ), - ConditionalField( LEIntField("NumAutoConnections" , 0), - lambda pkt:(0x22C >= self.__offset and 0x230 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("ClassifierPriorityMaps", "", ClassifierPriorityMap, length_from=lambda x: 224), - lambda pkt:(0x230 >= self.__offset and 0x244 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("AutoConnections", "", AutoConnection, length_from=lambda x: 1600), - lambda pkt:(0x310 >= self.__offset and 0x36e <= self.__offset+self.__length) ), - ConditionalField( XByteField("NumberOfConfigEntries" , 0x00), - lambda pkt:(0x950 >= self.__offset and 0x951 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("AggregateConfigEntries", "", AggregateConfigEntrie, length_from=lambda x: 16), - lambda pkt:(0x951 >= self.__offset and 0x961 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("RSVD_CustomAggregationParameters", "", RSVD_CustomAggregationParameter, length_from=lambda x: 48), - lambda pkt:(0x961 >= self.__offset and 0x991 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_11", - "\x00"*123, - 123), - lambda pkt:(0x991 >= self.__offset and 0xA0C <= self.__offset+self.__length) ), - ConditionalField( XIntField("ToneMaskType" , 0), - lambda pkt:(0xA0C >= self.__offset and 0xA10 <= self.__offset+self.__length) ), - ConditionalField( XIntField("ToneMaskEnabled" , 0), - lambda pkt:(0xA10 >= self.__offset and 0xA14 <= self.__offset+self.__length) ), - ConditionalField( XIntField("StartTone" , 0), - lambda pkt:(0xA14 >= self.__offset and 0xA18 <= self.__offset+self.__length) ), - ConditionalField( XIntField("EndTone" , 0), - lambda pkt:(0xA18 >= self.__offset and 0xA1C <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_12", - "\x00"*12, - 12), - lambda pkt:(0xA1C >= self.__offset and 0xA28 <= self.__offset+self.__length) ), - ConditionalField( XIntField("PsdIndex" , 0), - lambda pkt:(0xA28 >= self.__offset and 0xA2C <= self.__offset+self.__length) ), - ConditionalField( XIntField("TxPrescalerType" , 0), - lambda pkt:(0xA2C >= self.__offset and 0xA30 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("PrescalerValues", "", PrescalerValue, length_from=lambda x: 3600), - lambda pkt:(0xA30 >= self.__offset and 0xA34 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_13", - "\x00"*1484, - 1484), - lambda pkt:(0x1840 >= self.__offset and 0x1E0C <= self.__offset+self.__length) ), - ConditionalField( XIntField("AllowNEKRotation" , 0), - lambda pkt:(0x1E0C >= self.__offset and 0x1E10 <= self.__offset+self.__length) ), - ConditionalField( XIntField("OverrideLocalNEK" , 0), - lambda pkt:(0x1E10 >= self.__offset and 0x1E14 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("LocalNEKToUse", - "\x00"*16, - 16), - lambda pkt:(0x1E14 >= self.__offset and 0x1E24 <= self.__offset+self.__length) ), - ConditionalField( XIntField("OverrideNEKRotationTimer" , 0), - lambda pkt:(0x1E24 >= self.__offset and 0x1E28 <= self.__offset+self.__length) ), - ConditionalField( XIntField("NEKRotationTime_Min" , 0), - lambda pkt:(0x1E28 >= self.__offset and 0x1E2C <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_14", - "\x00"*96, - 96), - lambda pkt:(0x1E2C >= self.__offset and 0x1E8C <= self.__offset+self.__length) ), - ConditionalField( XIntField("AVLNMembership" , 0), - lambda pkt:(0x1E8C >= self.__offset and 0x1E90 <= self.__offset+self.__length) ), - ConditionalField( XIntField("SimpleConnectTimeout" , 0), - lambda pkt:(0x1E90 >= self.__offset and 0x1E94 <= self.__offset+self.__length) ), - ConditionalField( XByteField("EnableLEDThroughputIndicate" , 0), - lambda pkt:(0x1E94 >= self.__offset and 0x1E95 <= self.__offset+self.__length) ), - ConditionalField( XByteField("MidLEDThroughputThreshold_Mbps" , 0), - lambda pkt:(0x1E95 >= self.__offset and 0x1E96 <= self.__offset+self.__length) ), - ConditionalField( XByteField("HighLEDThroughputThreshold_Mbps" , 0), - lambda pkt:(0x1E96 >= self.__offset and 0x1E97 <= self.__offset+self.__length) ), - ConditionalField( XByteField("reserved_15" , 0), - lambda pkt:(0x1E97 >= self.__offset and 0x1E98 <= self.__offset+self.__length) ), - ConditionalField( XByteField("EnableUnicastQuieriesToMember" , 0), - lambda pkt:(0x1E98 >= self.__offset and 0x1E99 <= self.__offset+self.__length) ), - ConditionalField( XByteField("DisableMLDGroupIDCheckInMAC" , 0), - lambda pkt:(0x1E99 >= self.__offset and 0x1E9A <= self.__offset+self.__length) ), - ConditionalField( XShortField("EnableReportsToNonQuerierHosts" , 0), - lambda pkt:(0x1E9A >= self.__offset and 0x1E9C <= self.__offset+self.__length) ), - ConditionalField( XIntField("DisableExpireGroupMembershipInterval" , 0), - lambda pkt:(0x1E9C >= self.__offset and 0x1EA0 <= self.__offset+self.__length) ), - ConditionalField( XIntField("DisableLEDTestLights" , 0), - lambda pkt:(0x1EA0 >= self.__offset and 0x1EA4 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("GPIOMaps", "", GPIOMap, length_from=lambda x: 12), - lambda pkt:(0x1EA4 >= self.__offset and 0x1EB0 <= self.__offset+self.__length) ), - ConditionalField( XLongField("reserved_16" , 0), - lambda pkt:(0x1EB0 >= self.__offset and 0x1EB8 <= self.__offset+self.__length) ), - ConditionalField( XByteField("EnableTrafficClass_DSCPOver" , 0), - lambda pkt:(0x1EB8 >= self.__offset and 0x1EB9 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("TrafficClass_DSCPMatrices", - "\x00"*64, - 64), - lambda pkt:(0x1EB9 >= self.__offset and 0x1EF9 <= self.__offset+self.__length) ), - ConditionalField( XByteField("GPIOControl" , 0), - lambda pkt:(0x1EF9 >= self.__offset and 0x1EFA <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("LEDControl", - "\x00"*32, - 32), - lambda pkt:(0x1EFA >= self.__offset and 0x1F1A <= self.__offset+self.__length) ), - ConditionalField( XIntField("OverrideMinButtonPressHoldTime" , 0), - lambda pkt:(0x1F1A >= self.__offset and 0x1F1E <= self.__offset+self.__length) ), - ConditionalField( LEIntField("MinButtonPressHoldTime" , 0), - lambda pkt:(0x1F1E >= self.__offset and 0x1F22 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_17", - "\x00"*22, - 22), - lambda pkt:(0x1F22 >= self.__offset and 0x1F38 <= self.__offset+self.__length) ), - ConditionalField( XIntField("MemoryProfile" , 0), - lambda pkt:(0x1F38 >= self.__offset and 0x1F3C <= self.__offset+self.__length) ), - ConditionalField( XIntField("DisableAllLEDFlashOnWarmReboot" , 0), - lambda pkt:(0x1F3C >= self.__offset and 0x1F40 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("UplinkLimit_bps" , 0), - lambda pkt:(0x1F40 >= self.__offset and 0x1F44 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("DownlinkLimit_bps" , 0), - lambda pkt:(0x1F44 >= self.__offset and 0x1F48 <= self.__offset+self.__length) ), - ConditionalField( XIntField("MDUStaticSNID" , 0), - lambda pkt:(0x1F48 >= self.__offset and 0x1F4C <= self.__offset+self.__length) ), - ConditionalField( XByteField("MitigateEnabled" , 0), - lambda pkt:(0x1F4C >= self.__offset and 0x1F4D <= self.__offset+self.__length) ), - ConditionalField( XIntField("CorrelThreshold" , 0), - lambda pkt:(0x1F4D >= self.__offset and 0x1F51 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("ScaledTxGain" , 0), - lambda pkt:(0x1F51 >= self.__offset and 0x1F55 <= self.__offset+self.__length) ), - ConditionalField( XByteField("ResourceThresholdEnabled" , 0), - lambda pkt:(0x1F55 >= self.__offset and 0x1F56 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("ReservedPercentageForCaps", "", ReservedPercentageForCap, length_from=lambda x: 4), - lambda pkt:(0x1F56 >= self.__offset and 0x1F5A <= self.__offset+self.__length) ), - ConditionalField( XByteField("PowerSavingMode" , 0), - lambda pkt:(0x1F5A >= self.__offset and 0x1F5B <= self.__offset+self.__length) ), - ConditionalField( XByteField("PowerLEDDutyCycle" , 0), - lambda pkt:(0x1F5B >= self.__offset and 0x1F5C <= self.__offset+self.__length) ), - ConditionalField( XShortField("reserved_18" , 0), - lambda pkt:(0x1F5C >= self.__offset and 0x1F5E <= self.__offset+self.__length) ), - ConditionalField( LEIntField("LinkUpDurationBeforeReset_ms" , 0), - lambda pkt:(0x1F5E >= self.__offset and 0x1F62 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("PowerLEDPeriod_ms" , 0), - lambda pkt:(0x1F62 >= self.__offset and 0x1F66 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("LinkDownDurationBeforeLowPowerMode_ms" , 0), - lambda pkt:(0x1F66 >= self.__offset and 0x1F6A <= self.__offset+self.__length) ), - ConditionalField( XIntField("reserved_19" , 0), - lambda pkt:(0x1F6A >= self.__offset and 0x1F6E <= self.__offset+self.__length) ), - ConditionalField( XByteField("AfeGainBusMode" , 0), - lambda pkt:(0x1F6E >= self.__offset and 0x1F6F <= self.__offset+self.__length) ), - ConditionalField( XByteField("EnableDynamicPsd" , 0), - lambda pkt:(0x1F6F >= self.__offset and 0x1F70 <= self.__offset+self.__length) ), - ConditionalField( XByteField("ReservedPercentageForTxStreams" , 0), - lambda pkt:(0x1F70 >= self.__offset and 0x1F71 <= self.__offset+self.__length) ), - ConditionalField( XByteField("ReservedPercentageForRxStreams" , 0), - lambda pkt:(0x1F71 >= self.__offset and 0x1F72 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_20", - "\x00"*22, - 22), - lambda pkt:(0x1F72 >= self.__offset and 0x1F88 <= self.__offset+self.__length) ), - ConditionalField( XIntField("LegacyNetworkUpgradeEnable" , 0), - lambda pkt:(0x1F88 >= self.__offset and 0x1F8C <= self.__offset+self.__length) ), - ConditionalField( XIntField("unknown" , 0), - lambda pkt:(0x1F8C >= self.__offset and 0x1F90 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("MMETTL_us" , 0), - lambda pkt:(0x1F90 >= self.__offset and 0x1F94 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("ConfigBits", "", ConfigBit, length_from=lambda x: 2), - lambda pkt:(0x1F94 >= self.__offset and 0x1F96 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("TxToneMapExpiry_ms" , 0), - lambda pkt:(0x1F96 >= self.__offset and 0x1F9A <= self.__offset+self.__length) ), - ConditionalField( LEIntField("RxToneMapExpiry_ms" , 0), - lambda pkt:(0x1F9A >= self.__offset and 0x1F9E <= self.__offset+self.__length) ), - ConditionalField( LEIntField("TimeoutToResound_ms" , 0), - lambda pkt:(0x1F9E >= self.__offset and 0x1FA2 <= self.__offset+self.__length) ), - ConditionalField( XIntField("MissingSackThresholdForUnplugDetection" , 0), - lambda pkt:(0x1FA2 >= self.__offset and 0x1FA6 <= self.__offset+self.__length) ), - ConditionalField( LEIntField("UnplugTimeout_ms" , 0), - lambda pkt:(0x1FA6 >= self.__offset and 0x1FAA <= self.__offset+self.__length) ), - ConditionalField( PacketListField("ContentionWindowTableES", "", ContentionWindowTable, length_from=lambda x: 8), - lambda pkt:(0x1FAA >= self.__offset and 0x1FB2 <= self.__offset+self.__length) ), - ConditionalField( PacketListField("BackoffDeferalCountTableES", "", BackoffDeferalCountTable, length_from=lambda x: 4), - lambda pkt:(0x1FB2 >= self.__offset and 0x1FB6 <= self.__offset+self.__length) ), - ConditionalField( XByteField("GoodSoundCountThreshold" , 0), - lambda pkt:(0x1FB6 >= self.__offset and 0x1FB7 <= self.__offset+self.__length) ), - ConditionalField( XByteField("SoundCountThreshold_GoodSoundCountPass" , 0), - lambda pkt:(0x1FB7 >= self.__offset and 0x1FB8 <= self.__offset+self.__length) ), - ConditionalField( XByteField("SoundCountThreshold_GoodSoundCountFail" , 0), - lambda pkt:(0x1FB8 >= self.__offset and 0x1FB9 <= self.__offset+self.__length) ), - ConditionalField( XShortField("reserved_21" , 0), - lambda pkt:(0x1FB9 >= self.__offset and 0x1FBB <= self.__offset+self.__length) ), - ConditionalField( XByteField("ExclusiveTxPbs_percentage" , 0), - lambda pkt:(0x1FBB >= self.__offset and 0x1FBC <= self.__offset+self.__length) ), - ConditionalField( XByteField("ExclusiveRxPbs_percentage" , 0), - lambda pkt:(0x1FBC >= self.__offset and 0x1FBD <= self.__offset+self.__length) ), - ConditionalField( XByteField("OptimizationBackwardCompatible" , 0), - lambda pkt:(0x1FBD >= self.__offset and 0x1FBE <= self.__offset+self.__length) ), - ConditionalField( XByteField("reserved_21" , 0), - lambda pkt:(0x1FBE >= self.__offset and 0x1FBF <= self.__offset+self.__length) ), - ConditionalField( XByteField("MaxPbsPerSymbol" , 0), - lambda pkt:(0x1FBF >= self.__offset and 0x1FC0 <= self.__offset+self.__length) ), - ConditionalField( XByteField("MaxModulation" , 0), - lambda pkt:(0x1FC0 >= self.__offset and 0x1FC1 <= self.__offset+self.__length) ), - ConditionalField( XByteField("ContinuousRx" , 0), - lambda pkt:(0x1FC1 >= self.__offset and 0x1FC2 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_22", - "\x00"*6, - 6), - lambda pkt:(0x1FC2 >= self.__offset and 0x1FC8 <= self.__offset+self.__length) ), - ConditionalField( XByteField("PBControlStatus" , 0), - lambda pkt:(0x1FC8 >= self.__offset and 0x1FC9 <= self.__offset+self.__length) ), - ConditionalField( XByteField("STAMembershipMaskEnabled" , 0), - lambda pkt:(0x1FC9 >= self.__offset and 0x1FCA <= self.__offset+self.__length) ), - ConditionalField( XByteField("ExitDefaultEnabled" , 0), - lambda pkt:(0x1FCA >= self.__offset and 0x1FCB <= self.__offset+self.__length) ), - ConditionalField( XByteField("RejectDefaultEnabled" , 0), - lambda pkt:(0x1FCB >= self.__offset and 0x1FCC <= self.__offset+self.__length) ), - ConditionalField( XByteField("ChainingEnabled" , 0), - lambda pkt:(0x1FCC >= self.__offset and 0x1FCD <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("VendorSpecificNMK", - "\x00"*16, - 16), - lambda pkt:(0x1FCD >= self.__offset and 0x1FDD <= self.__offset+self.__length) ), - ConditionalField( XByteField("LocalMACAddressLimit" , 0), - lambda pkt:(0x1FDD >= self.__offset and 0x1FDE <= self.__offset+self.__length) ), - ConditionalField( XByteField("OverrideBridgeTableAgingTime" , 0), - lambda pkt:(0x1FDE >= self.__offset and 0x1FDF <= self.__offset+self.__length) ), - ConditionalField( XShortField("LocalBridgeTableAgingTime_min" , 0), - lambda pkt:(0x1FDF >= self.__offset and 0x1FE1 <= self.__offset+self.__length) ), - ConditionalField( XShortField("RemoteBridgeTableAgingTime_min" , 0), - lambda pkt:(0x1FE1 >= self.__offset and 0x1FE3 <= self.__offset+self.__length) ), - ConditionalField( XIntField("PhySyncReference" , 0), - lambda pkt:(0x1FE3 >= self.__offset and 0x1FE7 <= self.__offset+self.__length) ), - ConditionalField( XByteField("reserved_23" , 0), - lambda pkt:(0x1FE7 >= self.__offset and 0x1FE8 <= self.__offset+self.__length) ), - ConditionalField( XIntField("reserved_24" , 0), - lambda pkt:(0x1FE8 >= self.__offset and 0x1FEC <= self.__offset+self.__length) ), - ConditionalField( XIntField("reserved_25" , 0), - lambda pkt:(0x1FEC >= self.__offset and 0x1FF0 <= self.__offset+self.__length) ), - ConditionalField( StrFixedLenField("reserved_26", - "\x00"*24, - 24), - lambda pkt:(0x1FF0 >= self.__offset and 0x2008 <= self.__offset+self.__length) ), - ConditionalField( XByteField("OverrideDefaultLedEventBehavior" , 0x80), - lambda pkt:(0x2008 >= self.__offset and 0x2009 <= self.__offset+self.__length) ), - ConditionalField( XByteField("ReportToHostInfo" , 0), - lambda pkt:(0x2009 >= self.__offset and 0x200A <= self.__offset+self.__length) ), - ConditionalField( X3BytesField("reserved_27" , 0), - lambda pkt:(0x200A >= self.__offset and 0x200D <= self.__offset+self.__length) ), - ConditionalField( XByteField("NumBehaviors" , 0), - lambda pkt:(0x200D >= self.__offset and 0x200E <= self.__offset+self.__length) ), - ConditionalField( PacketListField("BehaviorBlockArrayES", "", BehaviorBlockArray, length_from=lambda x: 1200), - lambda pkt:(0x200E >= self.__offset and 0x24BE <= self.__offset+self.__length) ), - ConditionalField( XByteField("NumEvents" , 0), - lambda pkt:(0x24BE >= self.__offset and 0x24BF <= self.__offset+self.__length) ), - ConditionalField( PacketListField("EventBlockArrayES", "", EventBlockArray, length_from=lambda x: 550), - lambda pkt:(0x24BF >= self.__offset and 0x26E5 <= self.__offset+self.__length) ), - ] - return super(ModulePIB,self).__init__(packet) diff --git a/scapy/contrib/eigrp.py b/scapy/contrib/eigrp.py index 54b8ce8fbe03887ef579dc29d66a348e268b4974..94be657140cc76698568e138e1c66a444595a476 100644 --- a/scapy/contrib/eigrp.py +++ b/scapy/contrib/eigrp.py @@ -52,6 +52,8 @@ class EigrpIPField(StrField, IPField): EIGRP removes zeros from the host portion of the ip address if the netmask is 8, 16 or 24 bits. """ + __slots__ = ["length_from"] + def __init__(self, name, default, length=None, length_from=None): StrField.__init__(self, name, default) self.length_from = length_from @@ -101,25 +103,25 @@ class EigrpIPField(StrField, IPField): def i2len(self, pkt, x): l = self.length_from(pkt) l = self.prefixlen_to_bytelen(l) - return l def getfield(self, pkt, s): l = self.length_from(pkt) l = self.prefixlen_to_bytelen(l) - return s[l:], self.m2i(pkt, s[:l]) def randval(self): return IPField.randval(self) -class EigrpIP6Field(StrField, IP6Field, EigrpIPField): +class EigrpIP6Field(StrField, IP6Field): """ This is a special field type for handling ip addresses of destination networks in internal and external route updates. """ + __slots__ = ["length_from"] + def __init__(self, name, default, length=None, length_from=None): StrField.__init__(self, name, default) self.length_from = length_from @@ -163,11 +165,17 @@ class EigrpIP6Field(StrField, IP6Field, EigrpIPField): return l def i2len(self, pkt, x): - return EigrpIPField.i2len(self, pkt, x) + l = self.length_from(pkt) + l = self.prefixlen_to_bytelen(l) + return l def getfield(self, pkt, s): - return EigrpIPField.getfield(self, pkt, s) + l = self.length_from(pkt) + l = self.prefixlen_to_bytelen(l) + return s[l:], self.m2i(pkt, s[:l]) + def randval(self): + return IP6Field.randval(self) class EIGRPGeneric(Packet): name = "EIGRP Generic TLV" diff --git a/scapy/contrib/ikev2.py b/scapy/contrib/ikev2.py index bdcb4ace824dee99c0757effbdbf47443963ab0e..1b74d9b153673171ed8b71f18f54ee4843503475 100644 --- a/scapy/contrib/ikev2.py +++ b/scapy/contrib/ikev2.py @@ -166,8 +166,8 @@ class IKEv2(IKEv2_class): # rfc4306 class IKEv2_Key_Length_Attribute(IntField): - # We only support the fixed-length Key Length attribute (the only one currently defined) - name="key length" + # We only support the fixed-length Key Length attribute (the only + # one currently defined) def __init__(self, name): IntField.__init__(self, name, "0x800E0000") diff --git a/scapy/contrib/isis.py b/scapy/contrib/isis.py index c5b716beb6978ea0a90e19e5d6aad1c2959cbeef..39fbe90db0277b8f944f7cdd57828e984d073a6e 100644 --- a/scapy/contrib/isis.py +++ b/scapy/contrib/isis.py @@ -107,6 +107,7 @@ def isis_str2lspid(s): class _ISIS_IdFieldBase(Field): + __slots__ = ["to_str", "to_id", "length"] def __init__(self, name, default, length, to_str, to_id): self.to_str = to_str self.to_id = to_id @@ -153,9 +154,11 @@ class _ISIS_RandAreaId(_ISIS_RandId): class ISIS_AreaIdField(Field): + __slots__ = ["length_from"] + def __init__(self, name, default, length_from): Field.__init__(self, name, default) - self.length_from= length_from + self.length_from = length_from def i2m(self, pkt, x): return isis_area2str(x) diff --git a/scapy/contrib/openflow3.py b/scapy/contrib/openflow3.py index ace4dd3d81a34e4ee8702f47a516f73d7d1bd025..0dc31306c823ab5454a00ad1df38b29ab60576fb 100755 --- a/scapy/contrib/openflow3.py +++ b/scapy/contrib/openflow3.py @@ -536,6 +536,8 @@ need_prereq = { 14: [12, 0x1000], class OXMPacketListField(PacketListField): + __slots__ = ["autocomplete", "index"] + def __init__(self, name, default, cls, length_from=None, autocomplete=prereq_autocomplete): PacketListField.__init__(self, name, default, cls, length_from=length_from) self.autocomplete = autocomplete diff --git a/scapy/contrib/ppi_geotag.py b/scapy/contrib/ppi_geotag.py index 106f9224d6e9732de6549db110f0390fded494fb..add1a67513ecec388f20d8cf0a7a11a8d35c2e2b 100644 --- a/scapy/contrib/ppi_geotag.py +++ b/scapy/contrib/ppi_geotag.py @@ -167,6 +167,7 @@ class UTCTimeField(IntField): return "%s (%d)" % (t, x) class LETimeField(UTCTimeField,LEIntField): + __slots__ = ["epoch", "delta", "strf"] def __init__(self, name, default, epoch=time.gmtime(0), strf="%a, %d %b %Y %H:%M:%S +0000"): LEIntField.__init__(self, name, default) self.epoch = epoch diff --git a/scapy/fields.py b/scapy/fields.py index f06241ce5e7d123ec7629799f099e2fb09b7b405..17dae7a4f5a8a76cd749395daac4974887711c3f 100644 --- a/scapy/fields.py +++ b/scapy/fields.py @@ -12,19 +12,21 @@ from config import conf from volatile import * from data import * from utils import * -from base_classes import BasePacket,Gen,Net +from base_classes import BasePacket, Gen, Net, Field_metaclass ############ ## Fields ## ############ -class Field: +class Field(object): """For more informations on how this work, please refer to http://www.secdev.org/projects/scapy/files/scapydoc.pdf chapter ``Adding a New Field''""" - islist=0 - holds_packets=0 + __slots__ = ["name", "fmt", "default", "sz", "owners"] + __metaclass__ = Field_metaclass + islist = 0 + holds_packets = 0 def __init__(self, name, default, fmt="H"): self.name = name if fmt[0] in "@=<>!": @@ -101,8 +103,8 @@ class Field: -class Emph: - fld = "" +class Emph(object): + __slots__ = ["fld"] def __init__(self, fld): self.fld = fld def __getattr__(self, attr): @@ -113,8 +115,8 @@ class Emph: return self.fld == other -class ActionField: - _fld = None +class ActionField(object): + __slots__ = ["_fld", "_action_method", "_privdata"] def __init__(self, fld, action_method, **kargs): self._fld = fld self._action_method = action_method @@ -126,20 +128,20 @@ class ActionField: return getattr(self._fld,attr) -class ConditionalField: - fld = None +class ConditionalField(object): + __slots__ = ["fld", "cond"] def __init__(self, fld, cond): self.fld = fld self.cond = cond def _evalcond(self,pkt): return self.cond(pkt) - + def getfield(self, pkt, s): if self._evalcond(pkt): return self.fld.getfield(pkt,s) else: return s,None - + def addfield(self, pkt, s, val): if self._evalcond(pkt): return self.fld.addfield(pkt,s,val) @@ -147,12 +149,12 @@ class ConditionalField: return s def __getattr__(self, attr): return getattr(self.fld,attr) - -class PadField: + +class PadField(object): """Add bytes after the proxified field so that it ends at the specified alignment from its begining""" - _fld = None + __slots__ = ["_fld", "_align", "_padwith"] def __init__(self, fld, align, padwith=None): self._fld = fld self._align = align @@ -197,6 +199,7 @@ class MACField(Field): class IPField(Field): + slots = [] def __init__(self, name, default): Field.__init__(self, name, default, "4s") def h2i(self, pkt, x): @@ -230,6 +233,7 @@ class IPField(Field): return RandIP() class SourceIPField(IPField): + __slots__ = ["dstname"] def __init__(self, name, dstname): IPField.__init__(self, name, None) self.dstname = dstname @@ -339,6 +343,7 @@ class IEEEDoubleField(Field): class StrField(Field): + __slots__ = ["remain"] def __init__(self, name, default, fmt="H", remain=0): Field.__init__(self,name,default,fmt) self.remain = remain @@ -361,7 +366,8 @@ class StrField(Field): return RandBin(RandNum(0,1200)) class PacketField(StrField): - holds_packets=1 + __slots__ = ["cls"] + holds_packets = 1 def __init__(self, name, default, cls, remain=0): StrField.__init__(self, name, default, remain=remain) self.cls = cls @@ -379,6 +385,7 @@ class PacketField(StrField): return remain,i class PacketLenField(PacketField): + __slots__ = ["length_from"] def __init__(self, name, default, cls, length_from=None): PacketField.__init__(self, name, default, cls) self.length_from = length_from @@ -394,6 +401,7 @@ class PacketLenField(PacketField): class PacketListField(PacketField): + __slots__ = ["count_from", "length_from"] islist = 1 def __init__(self, name, default, cls, count_from=None, length_from=None): if default is None: @@ -457,6 +465,7 @@ class PacketListField(PacketField): class StrFixedLenField(StrField): + __slots__ = ["length_from"] def __init__(self, name, default, length=None, length_from=None): StrField.__init__(self, name, default) self.length_from = length_from @@ -480,6 +489,7 @@ class StrFixedLenField(StrField): return RandBin(l) class StrFixedLenEnumField(StrFixedLenField): + __slots__ = ["enum"] def __init__(self, name, default, length=None, enum=None, length_from=None): StrFixedLenField.__init__(self, name, default, length=length, length_from=length_from) self.enum = enum @@ -509,6 +519,7 @@ class NetBIOSNameField(StrFixedLenField): return "".join(map(lambda x,y: chr((((ord(x)-1)&0xf)<<4)+((ord(y)-1)&0xf)), x[::2],x[1::2])) class StrLenField(StrField): + __slots__ = ["length_from"] def __init__(self, name, default, fld=None, length_from=None): StrField.__init__(self, name, default) self.length_from = length_from @@ -517,16 +528,18 @@ class StrLenField(StrField): return s[l:], self.m2i(pkt,s[:l]) class BoundStrLenField(StrLenField): + __slots__ = ["minlen", "maxlen"] def __init__(self,name, default, minlen= 0, maxlen= 255, fld=None, length_from=None): StrLenField.__init__(self, name, default, fld, length_from) - self.minlen= minlen - self.maxlen= maxlen + self.minlen = minlen + self.maxlen = maxlen def randval(self): return RandBin(RandNum(self.minlen, self.maxlen)) class FieldListField(Field): - islist=1 + __slots__ = ["field", "count_from", "length_from"] + islist = 1 def __init__(self, name, default, field, length_from=None, count_from=None): if default is None: default = [] # Create a new list for each instance @@ -580,11 +593,12 @@ class FieldListField(Field): return s+ret, val class FieldLenField(Field): + __slots__ = ["length_of", "count_of", "adjust"] def __init__(self, name, default, length_of=None, fmt = "H", count_of=None, adjust=lambda pkt,x:x, fld=None): Field.__init__(self, name, default, fmt) - self.length_of=length_of - self.count_of=count_of - self.adjust=adjust + self.length_of = length_of + self.count_of = count_of + self.adjust = adjust if fld is not None: FIELD_LENGTH_MANAGEMENT_DEPRECATION(self.__class__.__name__) self.length_of = fld @@ -612,10 +626,11 @@ class StrNullField(StrField): return RandTermString(RandNum(0,1200),"\x00") class StrStopField(StrField): + __slots__ = ["stop", "additionnal"] def __init__(self, name, default, stop, additionnal=0): Field.__init__(self, name, default) - self.stop=stop - self.additionnal=additionnal + self.stop = stop + self.additionnal = additionnal def getfield(self, pkt, s): l = s.find(self.stop) if l < 0: @@ -639,6 +654,7 @@ class BCDFloatField(Field): return x/256.0 class BitField(Field): + __slots__ = ["rev", "size"] def __init__(self, name, default, size): Field.__init__(self, name, default) self.rev = size < 0 @@ -708,11 +724,12 @@ class BitField(Field): class BitFieldLenField(BitField): + __slots__ = ["length_of", "count_of", "adjust"] def __init__(self, name, default, size, length_of=None, count_of=None, adjust=lambda pkt,x:x): BitField.__init__(self, name, default, size) - self.length_of=length_of - self.count_of=count_of - self.adjust=adjust + self.length_of = length_of + self.count_of = count_of + self.adjust = adjust def i2m(self, pkt, x): return FieldLenField.i2m.im_func(self, pkt, x) @@ -722,7 +739,7 @@ class XBitField(BitField): return lhex(self.i2h(pkt,x)) -class EnumField(Field): +class _EnumField(Field): def __init__(self, name, default, enum, fmt = "H"): i2s = self.i2s = {} s2i = self.s2i = {} @@ -756,6 +773,9 @@ class EnumField(Field): else: return self.i2repr_one(pkt,x) +class EnumField(_EnumField): + __slots__ = ["i2s", "s2i"] + class CharEnumField(EnumField): def __init__(self, name, default, enum, fmt = "1s"): EnumField.__init__(self, name, default, enum, fmt) @@ -767,15 +787,16 @@ class CharEnumField(EnumField): x = self.s2i[x] return x -class BitEnumField(BitField,EnumField): +class BitEnumField(BitField, _EnumField): + __slots__ = EnumField.__slots__ def __init__(self, name, default, size, enum): - EnumField.__init__(self, name, default, enum) + _EnumField.__init__(self, name, default, enum) self.rev = size < 0 self.size = abs(size) def any2i(self, pkt, x): - return EnumField.any2i(self, pkt, x) + return _EnumField.any2i(self, pkt, x) def i2repr(self, pkt, x): - return EnumField.i2repr(self, pkt, x) + return _EnumField.i2repr(self, pkt, x) class ShortEnumField(EnumField): def __init__(self, name, default, enum): @@ -809,7 +830,7 @@ class XShortEnumField(ShortEnumField): return self.i2s[x] return lhex(x) -class MultiEnumField(EnumField): +class _MultiEnumField(_EnumField): def __init__(self, name, default, enum, depends_on, fmt = "H"): self.depends_on = depends_on @@ -837,7 +858,11 @@ class MultiEnumField(EnumField): return self.i2s_multi[v].get(x,x) return x -class BitMultiEnumField(BitField,MultiEnumField): +class MultiEnumField(_MultiEnumField, EnumField): + __slots__ = ["depends_on", "i2s_multi", "s2i_multi", "s2i_all"] + +class BitMultiEnumField(BitField, _MultiEnumField): + __slots__ = EnumField.__slots__ + MultiEnumField.__slots__ def __init__(self, name, default, size, enum, depends_on): MultiEnumField.__init__(self, name, default, enum) self.rev = size < 0 @@ -878,6 +903,7 @@ class LEFieldLenField(FieldLenField): class FlagsField(BitField): + __slots__ = ["multi", "names"] def __init__(self, name, default, size, names): self.multi = type(names) is list if self.multi: @@ -915,6 +941,7 @@ class FlagsField(BitField): class FixedPointField(BitField): + __slots__ = ['frac_bits'] def __init__(self, name, default, size, frac_bits=16): self.frac_bits = frac_bits BitField.__init__(self, name, default, size) @@ -938,13 +965,14 @@ class FixedPointField(BitField): # Base class for IPv4 and IPv6 Prefixes inspired by IPField and IP6Field. # Machine values are encoded in a multiple of wordbytes bytes. class _IPPrefixFieldBase(Field): + __slots__ = ["wordbytes", "maxbytes", "aton", "ntoa", "length_from"] def __init__(self, name, default, wordbytes, maxbytes, aton, ntoa, length_from): - self.wordbytes= wordbytes - self.maxbytes= maxbytes - self.aton= aton - self.ntoa= ntoa + self.wordbytes = wordbytes + self.maxbytes = maxbytes + self.aton = aton + self.ntoa = ntoa Field.__init__(self, name, default, "%is" % self.maxbytes) - self.length_from= length_from + self.length_from = length_from def _numbytes(self, pfxlen): wbits= self.wordbytes * 8 diff --git a/scapy/layers/dhcp6.py b/scapy/layers/dhcp6.py index 9502dc9a4b9f7c8435c5091282431ff4b1403cac..be3c0b0ca5a02d4188ac0b710b6b3f9adfce8b54 100644 --- a/scapy/layers/dhcp6.py +++ b/scapy/layers/dhcp6.py @@ -263,6 +263,7 @@ class DHCP6OptUnknown(_DHCP6OptGuessPayload): # A generic DHCPv6 Option length_from = lambda pkt: pkt.optlen)] class _DUIDField(PacketField): + __slots__ = ["length_from"] def __init__(self, name, default, length_from=None): StrField.__init__(self, name, default) self.length_from = length_from @@ -661,6 +662,7 @@ class DHCP6OptReconfAccept(_DHCP6OptGuessPayload): # RFC sect 22.20 # XXX Label should be at most 63 octets in length : we do not enforce it # Total length of domain should be 255 : we do not enforce it either class DomainNameListField(StrLenField): + __slots__ = ["padded"] islist = 1 padded_unit = 8 diff --git a/scapy/layers/dns.py b/scapy/layers/dns.py index 392a52b764ac5391cefc172e1d05a70183ccbd97..ed85cf181a2baca9e6e0c767c14140f1860af799 100644 --- a/scapy/layers/dns.py +++ b/scapy/layers/dns.py @@ -52,6 +52,7 @@ class DNSStrField(StrField): class DNSRRCountField(ShortField): + __slots__ = ["rr"] def __init__(self, name, default, rr): ShortField.__init__(self, name, default) self.rr = rr @@ -106,7 +107,8 @@ def DNSgetstr(s,p): class DNSRRField(StrField): - holds_packets=1 + __slots__ = ["countfld", "passon"] + holds_packets = 1 def __init__(self, name, countfld, passon=1): StrField.__init__(self, name, None) self.countfld = countfld diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py index f1c21f1772608eef30c01a73ec07a5626682efc5..2c38b10671f3dc2ce6f99f56ade50d5c9431cf9e 100644 --- a/scapy/layers/inet.py +++ b/scapy/layers/inet.py @@ -28,8 +28,9 @@ from scapy.arch import plt, MATPLOTLIB_INLINED, MATPLOTLIB_DEFAULT_PLOT_KARGS ## IP Tools class ## #################### -class IPTools: - """Add more powers to a class that have a "src" attribute.""" +class IPTools(object): + """Add more powers to a class with an "src" attribute.""" + __slots__ = [] def whois(self): os.system("whois %s" % self.src) def ottl(self): @@ -965,6 +966,7 @@ PacketList.timeskew_graph = new.instancemethod(_packetlist_timeskew_graph, None, ### Create a new packet list class TracerouteResult(SndRcvList): + __slots__ = ["graphdef", "graphASres", "padding", "hloc", "nloc"] def __init__(self, res=None, name="Traceroute", stats=None): PacketList.__init__(self, res, name, stats) self.graphdef = None diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py index ba5674c454a3ccb0ab4b43a4feee756da4c3c241..63b6f06d39b8da047d60a061b8fc51c4f70d2a8e 100644 --- a/scapy/layers/inet6.py +++ b/scapy/layers/inet6.py @@ -223,6 +223,7 @@ class IP6Field(Field): return RandIP6() class SourceIP6Field(IP6Field): + __slots__ = ["dstname"] def __init__(self, name, dstname): IP6Field.__init__(self, name, None) self.dstname = dstname @@ -275,6 +276,7 @@ ipv6nhcls = { 0: "IPv6ExtHdrHopByHop", 60: "IPv6ExtHdrDestOpt" } class IP6ListField(StrField): + __slots__ = ["count_from", "length_from"] islist = 1 def __init__(self, name, default, count_from=None, length_from=None): if default is None: @@ -745,6 +747,7 @@ _hbhoptcls = { 0x00: Pad1, ######################## Hop-by-Hop Extension Header ######################## class _HopByHopOptionsField(PacketListField): + __slots__ = ["curpos"] def __init__(self, name, default, cls, curpos, count_from=None, length_from=None): self.curpos = curpos PacketListField.__init__(self, name, default, cls, count_from=count_from, length_from=length_from) @@ -945,7 +948,7 @@ def defragment6(pktlist): q = res[0] nh = q[IPv6ExtHdrFragment].nh q[IPv6ExtHdrFragment].underlayer.nh = nh - q[IPv6ExtHdrFragment].underlayer.payload = None + del q[IPv6ExtHdrFragment].underlayer.payload q /= conf.raw_layer(load=fragmentable) return IPv6(str(q)) @@ -991,12 +994,12 @@ def fragment6(pkt, fragSize): # Keep fragment header fragHeader = pkt[IPv6ExtHdrFragment] - fragHeader.payload = None # detach payload + del fragHeader.payload # detach payload # Unfragmentable Part unfragPartLen = len(s) - fragPartLen - 8 unfragPart = pkt - pkt[IPv6ExtHdrFragment].underlayer.payload = None # detach payload + del pkt[IPv6ExtHdrFragment].underlayer.payload # detach payload # Cut the fragmentable part to fit fragSize. Inner fragments have # a length that is an integer multiple of 8 octets. last Frag MTU @@ -1500,6 +1503,7 @@ class ICMPv6NDOptPrefixInfo(_ICMPv6NDGuessPayload, Packet): # TODO: We should also limit the size of included packet to something # like (initiallen - 40 - 2) class TruncPktLenField(PacketLenField): + __slots__ = ["cur_shift"] def __init__(self, name, default, cls, cur_shift, length_from=None, shift=0): PacketLenField.__init__(self, name, default, cls, length_from=length_from) @@ -1627,6 +1631,7 @@ class ICMPv6NDOptMAP(_ICMPv6NDGuessPayload, Packet): # RFC 4140 class IP6PrefixField(IP6Field): + __slots__ = ["length_from"] def __init__(self, name, default): IP6Field.__init__(self, name, default) self.length_from = lambda pkt: 8*(pkt.len - 1) @@ -2627,6 +2632,7 @@ class MIP6MH_Generic(_MobilityHeader): # Mainly for decoding of unknown msg # TODO: make a generic _OptionsField class _MobilityOptionsField(PacketListField): + __slots__ = ["curpos"] def __init__(self, name, default, cls, curpos, count_from=None, length_from=None): self.curpos = curpos PacketListField.__init__(self, name, default, cls, count_from=count_from, length_from=length_from) @@ -2882,6 +2888,7 @@ class AS_resolver6(AS_resolver_riswhois): return ip,asn,desc class TracerouteResult6(TracerouteResult): + __slots__ = [] def show(self): return self.make_table(lambda (s,r): (s.sprintf("%-42s,IPv6.dst%:{TCP:tcp%TCP.dport%}{UDP:udp%UDP.dport%}{ICMPv6EchoRequest:IER}"), # TODO: ICMPv6 ! s.hlim, diff --git a/scapy/packet.py b/scapy/packet.py index 56267b2262ef1040825260598a6994c2a1f74989..00d47380f05bfb759a2a9b38adb65d4bd55e8bd4 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -33,23 +33,23 @@ class RawVal: class Packet(BasePacket): + __slots__ = [ + "time", "sent_time", "name", "default_fields", + "overloaded_fields", "fields", "fieldtype", "packetfields", + "original", "explicit", "raw_packet_cache", + "raw_packet_cache_fields", "_pkt", "post_transforms", + # then payload and underlayer + "payload", "underlayer", + "name", + # used for sr() + "_answered", + ] __metaclass__ = Packet_metaclass - name=None - + name = None fields_desc = [] - - aliastypes = [] overload_fields = {} - - underlayer = None - - sent_time = None payload_guess = [] - initialized = 0 - show_indent=1 - explicit = 0 - raw_packet_cache = None - raw_packet_cache_fields = None + show_indent = 1 @classmethod def from_hexcap(cls): @@ -67,20 +67,22 @@ class Packet(BasePacket): def __init__(self, _pkt="", post_transform=None, _internal=0, _underlayer=None, **fields): self.time = time.time() - self.sent_time = 0 - if self.name is None: - self.name = self.__class__.__name__ - self.aliastypes = [ self.__class__ ] + self.aliastypes + self.sent_time = None + self.name = (self.__class__.__name__ + if self._name is None else + self._name) self.default_fields = {} self.overloaded_fields = {} - self.fields={} - self.fieldtype={} - self.packetfields=[] - self.__dict__["payload"] = NoPayload() + self.fields = {} + self.fieldtype = {} + self.packetfields = [] + self.payload = NoPayload() self.init_fields() self.underlayer = _underlayer - self.initialized = 1 self.original = _pkt + self.explicit = 0 + self.raw_packet_cache = None + self.raw_packet_cache_fields = None if _pkt: self.dissect(_pkt) if not _internal: @@ -124,19 +126,19 @@ class Packet(BasePacket): self.payload.add_payload(payload) else: if isinstance(payload, Packet): - self.__dict__["payload"] = payload + self.payload = payload payload.add_underlayer(self) for t in self.aliastypes: if payload.overload_fields.has_key(t): self.overloaded_fields = payload.overload_fields[t] break elif type(payload) is str: - self.__dict__["payload"] = conf.raw_layer(load=payload) + self.payload = conf.raw_layer(load=payload) else: raise TypeError("payload must be either 'Packet' or 'str', not [%s]" % repr(payload)) def remove_payload(self): self.payload.remove_underlayer(self) - self.__dict__["payload"] = NoPayload() + self.payload = NoPayload() self.overloaded_fields = {} def add_underlayer(self, underlayer): self.underlayer = underlayer @@ -148,7 +150,6 @@ class Packet(BasePacket): clone.fields = self.copy_fields_dict(self.fields) clone.default_fields = self.copy_fields_dict(self.default_fields) clone.overloaded_fields = self.overloaded_fields.copy() - clone.overload_fields = self.overload_fields.copy() clone.underlayer = self.underlayer clone.explicit = self.explicit clone.raw_packet_cache = self.raw_packet_cache @@ -156,7 +157,7 @@ class Packet(BasePacket): self.raw_packet_cache_fields ) clone.post_transforms = self.post_transforms[:] - clone.__dict__["payload"] = self.payload.copy() + clone.payload = self.payload.copy() clone.payload.add_underlayer(clone) return clone @@ -179,7 +180,7 @@ class Packet(BasePacket): return self.payload.getfield_and_val(attr) def __getattr__(self, attr): - if self.initialized: + if isinstance(self, Packet): fld,v = self.getfield_and_val(attr) if fld is not None: return fld.i2h(self, v) @@ -204,14 +205,14 @@ class Packet(BasePacket): self.payload.setfieldval(attr,val) def __setattr__(self, attr, val): - if self.initialized: + if isinstance(self, Packet): + if attr in self.__all_slots__: + return object.__setattr__(self, attr, val) try: - self.setfieldval(attr,val) + return self.setfieldval(attr,val) except AttributeError: pass - else: - return - self.__dict__[attr] = val + return object.__setattr__(self, attr, val) def delfieldval(self, attr): if self.fields.has_key(attr): @@ -227,17 +228,16 @@ class Packet(BasePacket): self.payload.delfieldval(attr) def __delattr__(self, attr): - if self.initialized: + if isinstance(self, Packet): + if attr == "payload": + return self.remove_payload() + if attr in self.__all_slots__: + return object.__delattr__(self, attr) try: - self.delfieldval(attr) + return self.delfieldval(attr) except AttributeError: pass - else: - return - if self.__dict__.has_key(attr): - del(self.__dict__[attr]) - else: - raise AttributeError(attr) + return object.__delattr__(self, attr) def __repr__(self): s = "" @@ -653,7 +653,6 @@ Creates an EPS file describing a packet. If filename is not provided a temporary pkt.default_fields = self.copy_fields_dict(self.default_fields) pkt.time = self.time pkt.underlayer = self.underlayer - pkt.overload_fields = self.overload_fields.copy() pkt.post_transforms = self.post_transforms pkt.raw_packet_cache = self.raw_packet_cache pkt.raw_packet_cache_fields = self.copy_fields_dict( @@ -1102,13 +1101,6 @@ class NoPayload(Packet): raise AttributeError(attr) def delfieldval(self, attr): raise AttributeError(attr) - def __getattr__(self, attr): - if attr in self.__dict__: - return self.__dict__[attr] - elif attr in self.__class__.__dict__: - return self.__class__.__dict__[attr] - else: - raise AttributeError, attr def hide_defaults(self): pass def __iter__(self): @@ -1247,7 +1239,7 @@ def ls(obj=None): all.update(globals()) objlst = sorted(conf.layers, key=lambda x: x.__name__) for o in objlst: - print "%-10s : %s" %(o.__name__,o.name) + print "%-10s : %s" %(o.__name__, o._name) else: is_pkt = isinstance(obj, Packet) if (isinstance(obj, type) and issubclass(obj, Packet)) or is_pkt: diff --git a/scapy/plist.py b/scapy/plist.py index c741ecb9220d9e2d4b5d12c1d437967bdfdfef91..460afbc401a99c7e58e6e5a382c41e7a054b1255 100644 --- a/scapy/plist.py +++ b/scapy/plist.py @@ -24,7 +24,7 @@ from scapy.arch import plt, MATPLOTLIB_INLINED, MATPLOTLIB_DEFAULT_PLOT_KARGS ############# class PacketList(BasePacketList): - res = [] + __slots__ = ["stats", "res", "listname"] def __init__(self, res=None, name="PacketList", stats=None): """create a packet list from a list of packets res: the list of packets @@ -38,6 +38,8 @@ class PacketList(BasePacketList): res = res.res self.res = res self.listname = name + def __len__(self): + return len(self.res) def _elt2pkt(self, elt): return elt def _elt2sum(self, elt): @@ -45,8 +47,7 @@ class PacketList(BasePacketList): def _elt2show(self, elt): return self._elt2sum(elt) def __repr__(self): -# stats=dict.fromkeys(self.stats,0) ## needs python >= 2.3 :( - stats = dict(map(lambda x: (x,0), self.stats)) + stats = dict((x, 0) for x in self.stats) other = 0 for r in self.res: f = 0 @@ -60,7 +61,7 @@ class PacketList(BasePacketList): s = "" ct = conf.color_theme for p in self.stats: - s += " %s%s%s" % (ct.packetlist_proto(p.name), + s += " %s%s%s" % (ct.packetlist_proto(p._name), ct.punct(":"), ct.packetlist_value(stats[p])) s += " %s%s%s" % (ct.packetlist_proto("Other"), @@ -520,6 +521,7 @@ lfilter: truth function to apply to each packet to decide whether it will be dis class SndRcvList(PacketList): + __slots__ = [] def __init__(self, res=None, name="Results", stats=None): PacketList.__init__(self, res, name, stats) def _elt2pkt(self, elt): diff --git a/test/regression.uts b/test/regression.uts index f6f6ebbc1a39a4c03e3e861149eeb9a3144ff8d6..fb329a78b57fea54ac00c214f83646373bffe155 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -218,15 +218,15 @@ assert(_ == '5\x00\x00\x14\x00\x01\x00\x00 \x00\xac\xe7\x7f\x00\x00\x01\x7f\x00\ ~ field actionfield class TestAction(Packet): + __slots__ = ["_val", "_fld", "_priv1", "_priv2"] name = "TestAction" fields_desc = [ ActionField(ByteField("tst", 3), "my_action", priv1=1, priv2=2) ] - _val = None - _fld = None - _priv1 = None - _priv2 = None + def __init__(self, *args, **kargs): + self._val, self._fld, self._priv1, self._priv2 = None, None, None, None + super(TestAction, self).__init__(*args, **kargs) def my_action(self, val, fld, priv1, priv2): print "Action (%i)!" %val - self._val, self._fld, self._priv1, self._priv2 = val, fld, priv1, priv2 + self._val, self._fld, self._priv1, self._priv2 = val, fld, priv1, priv2 = Triggering action ~ field actionfield