Esempio n. 1
0
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                
Esempio n. 3
0
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),
    ]
Esempio n. 5
0
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),
    ]
Esempio n. 6
0
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
Esempio n. 7
0
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
Esempio n. 8
0
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)]
Esempio n. 9
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),
                   ]
Esempio n. 10
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)
    ]
Esempio n. 11
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)
    ]
Esempio n. 12
0
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),
    ]
Esempio n. 13
0
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),
    ]
Esempio n. 14
0
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),
    ]
Esempio n. 15
0
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),
    ]