class ExtendedBroadcastData(Packet): fields_desc = [ XByteField('extended', 0x80), XShortField('device_number', 0), ByteEnumField('device_type', 0, ENUM_DEVICE_TYPE), # ByteField('transmission_type', 0), BitEnumField( 'channel_type', 0, 2, { 0: 'RESERVED', 1: 'INDEPENDENT', 2: 'SHARED 1-BYTE ADDR', 3: 'SHARED 2-BYTE ADDR', }, ), BitEnumField('global_data', 0, 1, { 0: 'NOT USED', 1: 'USED' }), BitField('undefined', 0, 1), BitField('ext_serial_number', 0, 4), ]
class UDP(Packet): name = "UDP" fields_desc = [ ShortEnumField("sport", 53, UDP_SERVICES), #standard UDP ShortEnumField("dport", 53, UDP_SERVICES), ShortField("len", None), XShortField("chksum", None), XByteField("ack",0), #Acknowlegment number - 8bit X3BytesField("pkg",1)] #pakcage number -24 bit
class CoLoR_Data(Packet): name = 'CoLoR_Data' fields_desc = [ BitField("Version", 7, 4, tot_size=1), BitField("Package", 3, 4, end_tot_size=1), ByteField("TTL", 64), LEShortField("pkg_length", None), XShortField("checksum", None), ByteField("header_length", None), ByteField("PID_pt", None), FieldLenField("PID_num", None, fmt="B", count_of="PIDs", adjust=lambda pkt, x: x - (pkt.Flags.R == True)), FlagsField("Flags", 0, 8, "rSCQMRBF"), ConditionalField(ShortField("Minimal_PID_CP", None), lambda pkt: pkt.Flags.M), StrFixedLenField("N_sid", "", 16), StrFixedLenField("L_sid", "", 20), StrFixedLenField("nid_cus", "", 16), ConditionalField( StrFixedLenField("nid_pro", "", 16), lambda pkt: pkt.Flags.B == False and pkt.Flags.R == True), ConditionalField( FieldLenField("QoS_len", None, fmt="B", length_of="QoS_requirements"), lambda pkt: pkt.Flags.Q == True), ConditionalField( StrLenField("QoS_requirements", "", length_from=lambda pkt: pkt.QoS_len), lambda pkt: pkt.Flags.Q == True), ConditionalField(IntField("HMAC", None), lambda pkt: pkt.Flags.C == True), ConditionalField(IntField("Seg_ID", None), lambda pkt: pkt.Flags.S == True), FieldListField("PIDs", [""], StrFixedLenField("", "", 4), count_from=lambda pkt: pkt.PID_num + (pkt.Flags.R == True)) ] def post_build(self, pkt, pay): if self.header_length is None: self.header_length = len(pkt) pkt = pkt[:6] + int2Bytes(self.header_length, 1) + pkt[7:] if self.pkg_length is None: self.pkg_length = len(pkt) + len(pay) pkt = pkt[:2] + int2BytesLE(self.pkg_length, 2) + pkt[4:] if self.checksum is None: self.checksum = CalcChecksum(pkt) pkt = pkt[:4] + int2Bytes(self.checksum, 2) + pkt[6:] # print(self.pkg_length, self.header_length, self.checksum) return pkt + pay
class UdpInt(Packet): name = "UDP_INT" fields_desc = [ ShortEnumField("sport", trans_sec.consts.UDP_INT_SRC_PORT, UDP_SERVICES), ShortEnumField("dport", trans_sec.consts.UDP_INT_DST_PORT, UDP_SERVICES), ShortField("len", None), XShortField("chksum", None), ]
class P4kway(Packet): name = "p4kway" fields_desc = [ StrFixedLenField("P", "P", length=1), StrFixedLenField("Four", "4", length=1), XByteField("version", 0x01), StrFixedLenField("type", "F", length=1), BitField("k", 0, 8), XShortField("v", 0), BitField("cache", 0, 8), ]
class CoLoR_Ann(Packet): name = "CoLoR_Ann" fields_desc = [ BitField("Version", 7, 4, tot_size=1), BitField("Package", 1, 4, end_tot_size=1), ByteField("TTL", 64), LEShortField("pkg_length", None), XShortField("checksum", None), FlagsField("Flags", 0, 8, "rrrrrPKF"), BitField("unit_num", None, 4, tot_size=1), BitField("PX_num", None, 4, end_tot_size=1), PacketListField("Announce_unit_list", None, Ann_unit, count_from=lambda pkt: pkt.unit_num), ConditionalField( FieldLenField("Public_key_len", None, fmt="H", length_of="Public_key"), lambda pkt: pkt.Flags.K == True), ConditionalField( StrLenField("Public_key", "", length_from=lambda pkt: pkt.Public_key_len), lambda pkt: pkt.Flags.K == True), ConditionalField( FieldLenField("AS_PATH_len", None, fmt="B", count_of="AID_list"), lambda pkt: pkt.Flags.P == True), ConditionalField( FieldListField("AID_list", None, StrFixedLenField("", "", 1), count_from=lambda pkt: pkt.AS_PATH_len), lambda pkt: pkt.Flags.P == True), FieldListField("PX_list", None, StrFixedLenField("", "", 2), count_from=lambda pkt: pkt.PX_num) ] def post_build(self, pkt, pay): if self.pkg_length is None: self.pkg_length = len(pkt) pkt = pkt[:2] + int2BytesLE(self.pkg_length, 2) + pkt[4:] if self.checksum is None: self.checksum = CalcChecksum(pkt) pkt = pkt[:4] + int2Bytes(self.checksum, 2) + pkt[6:] if self.unit_num is None and self.PX_num is None: self.unit_num = len(self.Announce_unit_list) self.PX_num = len(self.PX_list) pkt = pkt[:7] + int2Bytes(self.unit_num << 4 | self.PX_num, 1) + pkt[8:] return pkt + pay
class CoLoR_Get(Packet): name = "CoLoR_Get" fields_desc = [ BitField("Version", 7, 4, tot_size=1), BitField("Package", 2, 4, end_tot_size=1), ByteField("TTL", 64), LEShortField("pkg_length", None), XShortField("checksum", None), ShortField("MTU", None), FieldLenField("PID_num", None, fmt="B", count_of="PIDs"), FlagsField("Flags", 8, 8, "rrrASQKF"), ShortField("Minimal_PID_CP", None), StrFixedLenField("N_sid", "", 16), StrFixedLenField("L_sid", "", 20), StrFixedLenField("nid", "", 16), ConditionalField( FieldLenField("Public_key_len", None, fmt="H", length_of="Public_key"), lambda pkt: pkt.Flags.K == True), ConditionalField( StrLenField("Public_key", "", length_from=lambda pkt: pkt.Public_key_len), lambda pkt: pkt.Flags.K == True), ConditionalField( FieldLenField("QoS_len", None, fmt="B", length_of="QoS_requirements"), lambda pkt: pkt.Flags.Q == True), ConditionalField( StrLenField("QoS_requirements", "", length_from=lambda pkt: pkt.QoS_len), lambda pkt: pkt.Flags.Q == True), ConditionalField(IntField("Seg_ID", None), lambda pkt: pkt.Flags.S == True), FieldListField("PIDs", None, StrFixedLenField("", "", 4), count_from=lambda pkt: pkt.PID_num) ] def post_build(self, pkt, pay): if self.pkg_length is None: self.pkg_length = len(pkt) pkt = pkt[:2] + int2BytesLE(self.pkg_length, 2) + pkt[4:] if self.checksum is None: self.checksum = CalcChecksum(pkt) pkt = pkt[:4] + int2Bytes(self.checksum, 2) + pkt[6:] return pkt + pay
class DDoSD(Packet): name = "DDoSD Header" fields_desc = [IntField('pkt_num',0), IntField('src_ent',0), IntField('src_ewma',0), IntField('src_ewmmd',0), IntField('dst_ent',0), IntField('dst_ewma',0), IntField('dst_ewmmd',0), ByteField('alarm',0), ByteField('defcon',0), XShortField('ethertype',0)]
class FlashAirUpdateHeader(Packet): name = "FlashAir Update Header" fields_desc = [StrFixedLenEnumField("card", "FLASHAIR", 8, UPDATE_HEADER_TYPES), # 'name' is not a valid Scapy field name StrFixedLenField("type", "MAIN2", 8), StrFixedLenField("unk0", "\x01\x02\x03\x04", 4), XShortField("unk1", 0), XIntField("unk2", 0), XByteField("checksum", 0), XByteField("unk3", 0), LEIntField("length", 0), ]
class VersionInfo(Tag): name = 'Tag - VersionInfo' fields_desc = [ LenField('len', None), XByteField('tag', 0x0a), ByteField('type', None), XShortField('unknown', None), ByteField('id', None), FieldLenField('name_len', None, fmt='B', length_of='name'), StrLenField('name', None, length_from=lambda pkt: pkt.name_len), FieldLenField('ver_len', None, fmt='B', length_of='version'), StrLenField('version', None, length_from=lambda pkt: pkt.ver_len) ]
class VersionInfo(Tag): name = 'Tag - VersionInfo' fields_desc = [ LenField("len", None), XByteField("tag", 0x0a), ByteField("type", None), XShortField("unknown", None), ByteField("id", None), FieldLenField("name_len", None, fmt='B', length_of='name'), StrLenField("name", None, length_from=lambda pkt:pkt.name_len), FieldLenField("ver_len", None, fmt='B', length_of='version'), StrLenField("version", None, length_from=lambda pkt:pkt.ver_len) ]
class FlowMatchDescriptorField_v1_0(Packet): """ OpenFlow Flow Match Descriptor Field """ name = 'FlowMatchDescriptorField_v1_0' fields_desc = [ IntField('<FlowWildcard>', None), ShortField('Ingresss<PortNumber>', None), SourceMACField(MACField('EthernetSourceAddress', None)), DestMACField(MACField('EthernetDestinationAddress', None)), XShortField('<VD+802.1QVID>', None), XByteField('PCP', None), XByteField('Reserved', None), ShortField('EthernetType/Length', None), ByteField('IPv4Protocol', None), X3BytesField('_Reserved', None), SourceIPField('IPv4SourceAddress', None), IPField('IPv4DestinationAddress', None), ShortField('SourcePort', None), ShortField('DestinationPort', None), ]
class OpenFlowBody_v1_3(Packet): """ OpenFlow Packet v1.3 """ name = 'OpenFlowBody_v1_3' fields_desc = [ # Header ByteEnumField('Type', None, ofp_v1_3_message_type), ShortField('Length', None), IntField('ID', None), # Error message body ConditionalField(ShortField('ErrorType', None), lambda pkt: pkt.Type == 1), ConditionalField(ShortField('ErrorCode', None), lambda pkt: pkt.Type == 1), # Echo Request / Echo Reply message body ConditionalField(StrField('Data', None), lambda pkt: pkt.Type in [1, 2, 3]), # Vendor message body #ConditionalField(IntField('VendorID', None), lambda pkt: pkt.Type == 4), # type ???? # Experimenter ConditionalField(XIntField('ExperimenterID', None), lambda pkt: pkt.Type == 4), ConditionalField(IntField('ExperimenterType', None), lambda pkt: pkt.Type == 4), # Features Reply message body ConditionalField(XLongField('DatapathID', None), lambda pkt: pkt.Type == 6), ConditionalField(IntField('MaxBuffers', None), lambda pkt: pkt.Type == 6), ConditionalField(ByteField('MaxTables', None), lambda pkt: pkt.Type == 6), ConditionalField(ByteField('AuxiliaryID', None), lambda pkt: pkt.Type == 6), ConditionalField(XByteField('FeaturesReplyPad', None), lambda pkt: pkt.Type == 6), ConditionalField(XIntField('Capabilities', None), lambda pkt: pkt.Type == 6), ConditionalField(IntField('FeaturesReplyReserved', None), lambda pkt: pkt.Type == 6), # Set Config message body ConditionalField(XShortField('SwitchConfigurationFlags', None), lambda pkt: pkt.Type == 9), ConditionalField(ShortField('MissSendLength', None), lambda pkt: pkt.Type == 9), # Packet Input Notification message body ConditionalField( IntField('PacketInputNotificationPacketBufferID', None), lambda pkt: pkt.Type == 10), ConditionalField(ShortField('EthernetFrameLength', None), lambda pkt: pkt.Type == 10), ConditionalField(ByteField('PacketInputNotificationReason', None), lambda pkt: pkt.Type == 10), ConditionalField(ByteField('PacketInputNotificationTableID', None), lambda pkt: pkt.Type == 10), ConditionalField(XLongField('PacketInputNotificationCookie', None), lambda pkt: pkt.Type == 10), # Flow Removed Notification message body ConditionalField(XLongField('FlowRemovedNotificationCookie', None), lambda pkt: pkt.Type == 11), ConditionalField(ShortField('FlowRemovedNotificationPriority', None), lambda pkt: pkt.Type == 11), ConditionalField(ByteField('FlowRemovedNotificationReason', None), lambda pkt: pkt.Type == 11), ConditionalField(ByteField('FlowRemovedNotificationTableID', None), lambda pkt: pkt.Type == 11), ConditionalField(IntField('Duration_sec', None), lambda pkt: pkt.Type == 11), ConditionalField(IntField('Duration_nsec', None), lambda pkt: pkt.Type == 11), ConditionalField( ShortField('FlowRemovedNotificationIdleTimeout', None), lambda pkt: pkt.Type == 11), ConditionalField(ShortField('HardTimeout', None), lambda pkt: pkt.Type == 11), ConditionalField(LongField('NumberOfPacketsTransferred', None), lambda pkt: pkt.Type == 11), ConditionalField(LongField('NumberOfOctetsTransferred', None), lambda pkt: pkt.Type == 11), # Port Status Notification message body ConditionalField(ByteField('PortStatusNotificationReason', None), lambda pkt: pkt.Type == 12), ConditionalField(XByteField('PortStatusNotificationPad', None), lambda pkt: pkt.Type == 12), ConditionalField( _PacketField('PortStatusNotification<PortDescriptors>', None, PortDescriptorField_v1_3, 39), lambda pkt: pkt.Type == 12), # Packet Output message body ConditionalField(IntField('PacketOutputPacketBufferID', None), lambda pkt: pkt.Type == 13), ConditionalField(IntField('PacketOutputIngress<PortNumber>', None), lambda pkt: pkt.Type == 13), ConditionalField(ShortField('LengthOfActionDescriptors', None), lambda pkt: pkt.Type == 13), ConditionalField(XByteField('PacketOutputPad', None), lambda pkt: pkt.Type == 13), ConditionalField( _PacketField('PacketOutput<ActionDescriptors>', None, ActionDescriptorField_v1_3, 5), lambda pkt: pkt.Type == 13), # Flow Modification message body ConditionalField(LongField('FlowModificationCookie', None), lambda pkt: pkt.Type == 14), ConditionalField(XLongField('FlowModificationCookieMask', None), lambda pkt: pkt.Type == 14), ConditionalField(ByteField('FlowModificationTableID', None), lambda pkt: pkt.Type == 14), ConditionalField(ByteField('FlowModificationCommand', None), lambda pkt: pkt.Type == 14), ConditionalField(ShortField('FlowModificationIdleTimeout', None), lambda pkt: pkt.Type == 14), ConditionalField(ShortField('FlowModificationHardTimeout', None), lambda pkt: pkt.Type == 14), ConditionalField(ShortField('FlowModificationPriority', None), lambda pkt: pkt.Type == 14), ConditionalField(IntField('FlowModificationPacketBufferID', None), lambda pkt: pkt.Type == 14), ConditionalField(IntField('FlowModificationOutputPort', None), lambda pkt: pkt.Type == 14), ConditionalField(IntField('FlowModificationOutputGroup', None), lambda pkt: pkt.Type == 14), ConditionalField(XShortField('FlowModificationFlags', None), lambda pkt: pkt.Type == 14), ConditionalField(XByteField('FlowModificationPad', None), lambda pkt: pkt.Type == 14), # Group Modification message body ConditionalField(ShortField('GroupModificationCommand', None), lambda pkt: pkt.Type == 15), ConditionalField(ByteField('GroupModificationType', None), lambda pkt: pkt.Type == 15), ConditionalField(ByteField('GroupModificationPad', None), lambda pkt: pkt.Type == 15), ConditionalField(IntField('GroupModificationGroupID', None), lambda pkt: pkt.Type == 15), ConditionalField( _PacketField('GroupModificationBucket', None, OpenFlowBucket_v1_3, 18), lambda pkt: pkt.Type == 15), # Port Modification message body ConditionalField(ShortField('PortModification<PortNumber>', None), lambda pkt: pkt.Type == 16), ConditionalField(XByteField('PortModificationPad', None), lambda pkt: pkt.Type == 16), ConditionalField(MACField('PortModificationEthernetAddress', None), lambda pkt: pkt.Type == 16), ConditionalField(XByteField('PortModificationPad2', None), lambda pkt: pkt.Type == 16), ConditionalField(XIntField('<PortConfigurationFlags>', None), lambda pkt: pkt.Type == 16), ConditionalField(XIntField('<PortConfigurationFlags>Mask', None), lambda pkt: pkt.Type == 16), ConditionalField(XIntField('<PortConfigurationFlags>Advertise', None), lambda pkt: pkt.Type == 16), ConditionalField(XByteField('PortModificationPad3', None), lambda pkt: pkt.Type == 16), # Table Modification message body ConditionalField(ByteField('TableModificationTableID', None), lambda pkt: pkt.Type == 17), ConditionalField(XByteField('TableModificationPad', None), lambda pkt: pkt.Type == 17), ConditionalField(XIntField('TableModificationConfiguration', None), lambda pkt: pkt.Type == 17), # Multipart Request / Multipart Reply message body ConditionalField(ShortField('MultipartType', None), lambda pkt: pkt.Type in [18, 19]), ConditionalField(XShortField('MultipartFlags', None), lambda pkt: pkt.Type in [18, 19]), ConditionalField(XByteField('MultipartPad', None), lambda pkt: pkt.Type in [18, 19]), ConditionalField(ByteField('MultipartBody', None), lambda pkt: pkt.Type in [18, 19]), # Barrier Reply message body ConditionalField(IntField('BarrierReplyID', None), lambda pkt: pkt.Type == 21), # Queue Get Config Request / Queue Get Config Reply message body ConditionalField(IntField('QueueGetConfigRequestPort', None), lambda pkt: pkt.Type in [22, 23]), ConditionalField(ByteField('QueueGetConfigRequestPad', None), lambda pkt: pkt.Type in [22, 23]), ConditionalField( _PacketField('OpenFlowPacketQueue', None, OpenFlowPacketQueue_v1_3, 16), lambda pkt: pkt.Type == 23), # Role Request / Role Reply message body ConditionalField(IntField('RoleRequestRole', None), lambda pkt: pkt.Type in [24, 25]), ConditionalField(ByteField('RoleRequestPad', None), lambda pkt: pkt.Type in [24, 25]), ConditionalField(LongField('RoleRequestGenerationID', None), lambda pkt: pkt.Type in [24, 25]), # Get Async Reply / Set Async messages body ConditionalField(XIntField('GetAsyncReplyPacketInMask', None), lambda pkt: pkt.Type in [27, 28]), ConditionalField(XIntField('GetAsyncReplyPortStatusMask', None), lambda pkt: pkt.Type in [27, 28]), ConditionalField(XIntField('GetAsyncReplyFlowRemovedMask', None), lambda pkt: pkt.Type in [27, 28]), # Meter Modification message body ConditionalField(ShortField('MeterModificationCommand', None), lambda pkt: pkt.Type == 29), ConditionalField(XShortField('MeterModificationFlags', None), lambda pkt: pkt.Type == 29), ConditionalField(IntField('MeterModificationMeterID', None), lambda pkt: pkt.Type == 29), ConditionalField( _PacketField('MeterModificationMeterBand', None, OpenFlowMeterBand_v1_3, 12), lambda pkt: pkt.Type == 29), StrField('Payload', None), ]
class OpenFlowBody_v1_0(Packet): """ OpenFlow Packet v1.0 """ name = 'OpenFlowBody_v1_0' fields_desc = [ # Header ByteEnumField('Type', None, ofp_v1_0_message_type), ShortField('Length', None), IntField('ID', None), # Error message body ConditionalField(ShortField('ErrorType', None), lambda pkt: pkt.Type == 1), ConditionalField(ShortField('ErrorCode', None), lambda pkt: pkt.Type == 1), # Echo Request / Echo Reply message body ConditionalField(StrField('Data', None), lambda pkt: pkt.Type in [2, 3]), # Vendor message body ConditionalField(IntField('VendorID', None), lambda pkt: pkt.Type == 4), # Features Reply message body ConditionalField(XLongField('DatapathID', None), lambda pkt: pkt.Type == 6), ConditionalField(IntField('AvailableNumberOfPacketsCanBeHeld', None), lambda pkt: pkt.Type == 6), ConditionalField(ByteField('NumberOfFlowTabs', None), lambda pkt: pkt.Type == 6), ConditionalField(X3BytesField('FeaturesReplyReserved', None), lambda pkt: pkt.Type == 6), ConditionalField(XIntField('<SwitchCapabilityFlags>', None), lambda pkt: pkt.Type == 6), ConditionalField(XIntField('ActionCapabilityFlags', None), lambda pkt: pkt.Type == 6), ConditionalField( _PacketField('FeaturesReply<PortDescriptors>', None, PortDescriptorField_v1_0, 48), lambda pkt: pkt.Type == 6), # Get Config Reply / Set Config message body ConditionalField(XShortField('SwitchConfigurationFlags', None), lambda pkt: pkt.Type in [8, 9]), ConditionalField(ShortField('MissSendLength', None), lambda pkt: pkt.Type in [8, 9]), # Packet Input Notification message body ConditionalField( IntField('PacketInputNotificationPacketBufferID', None), lambda pkt: pkt.Type == 10), ConditionalField(ShortField('EthernetFrameLength', None), lambda pkt: pkt.Type == 10), ConditionalField( ShortField('PacketInputNotificationIngresss<PortNumber>', None), lambda pkt: pkt.Type == 10), ConditionalField(ByteField('PacketInputNotificationReason', None), lambda pkt: pkt.Type == 10), ConditionalField(XByteField('PacketInputNotificationReserved', None), lambda pkt: pkt.Type == 10), ConditionalField( StrLenField('EthenretFrame', None, length_from=lambda pkt: pkt.EthernetFrameLength), lambda pkt: pkt.Type == 10), # Flow Removed Notification message body ConditionalField( _PacketField('FlowRemovedNotification<FlowMatchDescriptor>', None, FlowMatchDescriptorField_v1_0, 40), lambda pkt: pkt.Type == 11), ConditionalField(ShortField('FlowRemovedNotificationPriority', None), lambda pkt: pkt.Type == 11), ConditionalField(ByteField('FlowRemovedNotificationReason', None), lambda pkt: pkt.Type == 11), ConditionalField(XByteField('FlowRemovedNotificationReserved', None), lambda pkt: pkt.Type == 11), ConditionalField(IntField('LifetimeDuration', None), lambda pkt: pkt.Type == 11), ConditionalField( ShortField('FlowRemovedNotificationSoftLifetime', None), lambda pkt: pkt.Type == 11), ConditionalField( StrFixedLenField('FlowRemovedNotification_Reserved', None, 48), lambda pkt: pkt.Type == 11), ConditionalField(LongField('NumberOfPacketsTransferred', None), lambda pkt: pkt.Type == 11), ConditionalField(LongField('NumberOfOctetsTransferred', None), lambda pkt: pkt.Type == 11), # Port Status Notification message body ConditionalField(ByteField('PortStatusNotificationReason', None), lambda pkt: pkt.Type == 12), ConditionalField( StrFixedLenField('PortStatusNotificationReserved', None, 64), lambda pkt: pkt.Type == 12), ConditionalField( _PacketField('PortStatusNotification<PortDescriptors>', None, PortDescriptorField_v1_0, 48), lambda pkt: pkt.Type == 12), # Packet Output message body ConditionalField(IntField('PacketOutputPacketBufferID', None), lambda pkt: pkt.Type == 13), ConditionalField(ShortField('PacketOutputIngress<PortNumber>', None), lambda pkt: pkt.Type == 13), ConditionalField(ShortField('LengthOfActionDescriptors', None), lambda pkt: pkt.Type == 13), ConditionalField( _PacketField('PacketOutput<ActionDescriptors>', None, ActionDescriptorField_v1_0), ## ???? bytes ## lambda pkt: pkt.Type == 13), ConditionalField(StrField('<PacketData>', None), lambda pkt: pkt.Type == 13), # Flow Modification message body ConditionalField( _PacketField('FlowModification<FlowMatchDescriptor>', None, FlowMatchDescriptorField_v1_0, 40), lambda pkt: pkt.Type == 14), ConditionalField(ShortField('Command', None), lambda pkt: pkt.Type == 14), ConditionalField(ShortField('FlowModificationSoftLifetime', None), lambda pkt: pkt.Type == 14), ConditionalField(ShortField('HardLifetime', None), lambda pkt: pkt.Type == 14), ConditionalField(ShortField('FlowModificationPriority', None), lambda pkt: pkt.Type == 14), ConditionalField(IntField('FlowModificationPacketBufferID', None), lambda pkt: pkt.Type == 14), ConditionalField( ShortField('FlowModificationEgress<PortNumber>', None), lambda pkt: pkt.Type == 14), ConditionalField(XShortField('FlowModificationCU', None), lambda pkt: pkt.Type == 14), ConditionalField(XIntField('FlowModificationReserved', None), lambda pkt: pkt.Type == 14), ConditionalField( _PacketField('FlowModification<ActionDescriptors>', None, ActionDescriptorField_v1_0), ## ???? bytes lambda pkt: pkt.Type == 14), # Port Modification message body ConditionalField(ShortField('PortModification<PortNumber>', None), lambda pkt: pkt.Type == 15), ConditionalField(MACField('Ethernet Address', None), lambda pkt: pkt.Type == 15), ConditionalField(XIntField('<PortConfigurationFlags>', None), lambda pkt: pkt.Type == 15), ConditionalField(XIntField('<PortConfigurationFlags>Mask', None), lambda pkt: pkt.Type == 15), ConditionalField(XIntField('<PortFeatureFlags>', None), lambda pkt: pkt.Type == 15), # Stats Request message body ConditionalField( _PacketField('StatsRequest', None, StatsRequestBody_v1_0, 48), lambda pkt: pkt.Type == 16), # Stats Reply message body ConditionalField( _PacketField('StatsReply', None, StatsReplyBody_v1_0), ## ???? bytes lambda pkt: pkt.Type == 17), StrField('Payload', None), ]
class ActionDescriptorField_v1_0(Packet): """ OpenFlow Action Descriptor Field """ name = 'ActionDescriptorField_v1_0' fields_desc = [ ByteEnumField('Type', None, ofp_v1_0_action_descriptor_type), ShortField('Length', None), # Output Action Descriptor ConditionalField(ShortField('Egress<PortNumber>', None), lambda pkt: pkt.Type == 0), ConditionalField(ShortField('MaxLength', None), lambda pkt: pkt.Type == 0), # VLAN VID Action Descriptor ConditionalField(XShortField('CU+802.1QVID', None), lambda pkt: pkt.Type == 1), ConditionalField(XShortField('VLANVIDReserved', None), lambda pkt: pkt.Type == 1), # VLAN PCP Action Descriptor ConditionalField(XByteField('CU+PCP', None), lambda pkt: pkt.Type == 2), ConditionalField(X3BytesField('VLANPCPReserved', None), lambda pkt: pkt.Type == 2), # Strip VLAN tag Action Descriptor ConditionalField(XIntField('StripVLANTagReserved', None), lambda pkt: pkt.Type == 3), # Ethernet Address Action Descriptor (Ethernet source address) / # Ethernet Address Action Descriptor (Ethernet destination address) ConditionalField( SourceMACField(MACField('EthernetSourceAddress', None)), lambda pkt: pkt.Type == 4), ConditionalField( DestMACField(MACField('EthernetDestinationAddress', None)), lambda pkt: pkt.Type == 5), ConditionalField(StrFixedLenField('EthernetAddressReserved', None, 48), lambda pkt: pkt.Type in [4, 5]), # IPv4 Address Action Descriptor (IPv4 source address) / # IPv4 Address Action Descriptor (IPv4 destination address) ConditionalField(SourceIPField('IPv4SourceAddress', None), lambda pkt: pkt.Type == 6), ConditionalField(IPField('IPv4DestinationAddress', None), lambda pkt: pkt.Type == 7), # IPv4 DSCP Action Descriptor ConditionalField(ByteField('IPv4DSCP+CU', None), lambda pkt: pkt.Type == 8), ConditionalField(X3BytesField('IPv4DSCPReserved', None), lambda pkt: pkt.Type == 8), # TCP/UDP Port Action Descriptor (TCP/UDP source port) / # TCP/UDP Port Action Descriptor (TCP/UDP destination port) ConditionalField(ShortField('SourcePort', None), lambda pkt: pkt.Type == 9), ConditionalField(ShortField('DestinationPort', None), lambda pkt: pkt.Type == 10), ConditionalField(ShortField('TCP/UDPReserved', None), lambda pkt: pkt.Type in [9, 10]), # Vendor Action Descriptor ConditionalField(IntField('VendorID', None), lambda pkt: pkt.Type == 65535), ]