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                
Example #2
0
class NSH(Packet):
    """Network Service Header.
       NSH MD-type 1 if there is no ContextHeaders"""
    name = "NSH"

    fields_desc = [
        BitField('Ver', 0, 2),
        BitField('OAM', 0, 1),
        BitField('Un1', 0, 1),
        BitField('TTL', 0, 6),
        BitField('Len', None, 6),
        BitField('Un4', 1, 4),
        BitField('MDType', 1, 4),
        ByteField("NextProto", 0x65),
        ByteField("NextProto_2", 0x58),
        X3BytesField('NSP', 2),
        ByteField('NSI', 255)
    ]
Example #3
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),
    ]
Example #4
0
class NSH(Packet):
    """Network Service Header.
       NSH MD-type 1 if there is no ContextHeaders"""
    name = "NSH"

    fields_desc = [
        BitField('Ver', 0, 2),
        BitField('OAM', 0, 1),
        BitField('Un1', 0, 1),
        BitField('TTL', 0, 6),
        BitField('Len', None, 6),
        BitField('Un2', 0, 4),
        BitField('MDType', 1, 4),
        ShortEnumField('NextProto', 3, {
            1: 'IPv4',
            2: 'IPv6',
            3: 'Ethernet',
            4: 'NSH',
            5: 'MPLS'
        }),
        X3BytesField('NSP', 1),
        ByteField('NSI', 255)
    ]
Example #5
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),
    ]
Example #6
0
class StatsReplyBody_v1_0(Packet):
    """
    OpenFlow Stats Reply Body
    """

    name = 'StatsReplyBody_v1_0'

    fields_desc = [
        ShortEnumField('Type', None, ofp_v1_0_stats_requestreply_type),
        ShortField('Flags', None),

        # Description of this OpenFlow switch
        ConditionalField(
            StrFixedLenField('ManufacturerDescription', None, 256),
            lambda pkt: pkt.Type == 0),
        ConditionalField(StrFixedLenField('HardwareDescription', None, 256),
                         lambda pkt: pkt.Type == 0),
        ConditionalField(StrFixedLenField('SoftwareDescription', None, 256),
                         lambda pkt: pkt.Type == 0),
        ConditionalField(IntField('SerialNumberDescription', None),
                         lambda pkt: pkt.Type == 0),  ## ??

        # Individual flow statistical information /
        # Aggregate flow statistical information
        ConditionalField(ShortField('Length', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(ByteField('TableID', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(XByteField('Reserved', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(
            _PacketField('<FlowMatchDescriptor>', None,
                         FlowMatchDescriptorField_v1_0, 40),
            lambda pkt: pkt.Type == 1),
        ConditionalField(IntField('LifetimeDuration', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(ShortField('Priority', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(ShortField('SoftLifetime', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(ShortField('HardLifetime', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(ShortField('Reserved', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(LongField('NumberOfPacketsTransferred', None),
                         lambda pkt: pkt.Type in [1, 2]),
        ConditionalField(LongField('NumberOfOctetsTransferred', None),
                         lambda pkt: pkt.Type in [1, 2]),
        ConditionalField(
            _PacketField('<ActionDescriptors>', None,
                         ActionDescriptorField_v1_0),  ## ???? bytes
            lambda pkt: pkt.Type == 1),
        ConditionalField(IntField('NumberOfFlows', None),
                         lambda pkt: pkt.Type == 2),
        ConditionalField(IntField('Reserved', None),
                         lambda pkt: pkt.Type == 2),

        # Flow table statistical information
        ConditionalField(ByteField('Table_ID', None),
                         lambda pkt: pkt.Type == 1),
        ConditionalField(X3BytesField('Reserved', None),
                         lambda pkt: pkt.Type == 3),
        ConditionalField(StrFixedLenField('TableDescriptionString', None, 16),
                         lambda pkt: pkt.Type == 3),
        ConditionalField(IntField('<FlowWildcard>', None),
                         lambda pkt: pkt.Type == 3),
        ConditionalField(IntField('MaximumNumberOfFlowsSupported', None),
                         lambda pkt: pkt.Type == 3),
        ConditionalField(IntField('NumberOfFlowsInstalled', None),
                         lambda pkt: pkt.Type == 3),
        ConditionalField(IntField('NumberOfPacketsLookedUp', None),
                         lambda pkt: pkt.Type == 3),
        ConditionalField(IntField('NumberOfPacketsMatched', None),
                         lambda pkt: pkt.Type == 3),

        # Port statistical information
        ConditionalField(LongField('NumberOfPakctesReceived', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfPakctesTransmitted', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfOctetsReceived', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfOctetsTransmitted', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfPacketsDroppedInReception', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(
            LongField('NumberOfPacketsDroppedInTransmittion', None),
            lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfErrorsInReception', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfErrorsInTransmittion', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfAlignmentErrors', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfOverrunErrors', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfCRCErrors', None),
                         lambda pkt: pkt.Type == 4),
        ConditionalField(LongField('NumberOfCollisionErrors', None),
                         lambda pkt: pkt.Type == 4),
    ]
Example #7
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),
    ]