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 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) ]
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 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) ]
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 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), ]
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), ]