Skip to content
jgrunert edited this page Oct 31, 2015 · 12 revisions

Information

ModuleTypeID (hex) 0x0000
ModuleTypeID (decimal) 0
Distribution support multiple, independent instances
Dependencies -

 

Description

The SwitchAdapter wraps each OpenFlow capable switch as a ZMF Module instance. An OpenFlow switch connects to a SwitchAdapter instance as it would normally connect to a controller.

  • From the perspective of the OpenFlow switch the SwitchAdapter is its controller.
  • From the perspective of any other module inside the ZMF the SwitchAdapter represents an actual OpenFlow switch.

The SwitchAdapter basically only acts as a relay. For any more advanced functionality involving Switches, consult SwitchRegistryModule.

 

Configuration

Note: as the instanceId of a SwitchAdapter is equal to the SwitchId, the creation of a serverSocket and the OpenFlow handshake is conducted BEFORE the SwitchAdapter module is started. therefore, the SwitchAdapter runnable actually acts as a Launcher, which will start a SwitchAdapter for each incoming connection. For this to work, the runner has to be started with two additional parameters - OpenFlow version ("1.0" or "1.3) and OpenFlow port (e.g. 6633).

The configuration file for this module must define the following variables:

Config Type Description
ZSDN_SWITCH_ADAPTER_PACKET_IN_MULTICAST_GROUPS Integer SwitchAdapters will evenly distribute their packetIns to each multicast group(see [SwitchAdapter#MulticastGroups]. This allows for load balancing (each PacketIn consumer module can subscribe to one or more multicast-groups). There can be [1,256] multicast groups.
ZSDN_SWITCH_ADAPTER_FLUSH_STREAM_AFTER_EVERY_MESSAGE A if true, the socket to the switches is flushed after every message. may decrease performance but may decrease latency and avoid stuck messages (not enough to auto-flush, remains in buffer indefinitely)
ZSDN_SWITCH_ADAPTER_EXPERIMENTAL_FAST_TOPIC_GENERATION A if true, the, Switch will use a faster, but untested topic generation method. Should be set false by default.

 

Services Provided (REQUEST/REPLY)

HandleOpenflowMessages

This enables batch processing of openFlow actions. All openFlow messages contained in the request will be sequentially executed as if they were received by the publish/subscribe api. This allows guaranteed and uninfluenced in-order delivery of the contained messages.

|.Request-MessageType|SwitchAdapter#MessageTypes| --- | --- |.Request-Payload|ZSDN_Core-Modules#Container +

message HandleOpenflowMessagesRequest {}
| |.Reply-MessageType|SwitchAdapter#MessageTypes| |.Reply-Payload|ZSDN_Core-Modules#Container +
message HandleOpenflowMessagesReply {
repeated bytes open_flow_message = 1;
}
|

Publishes Events (FROM)

OpenFlow from Switch

Any OpenFlow message the SwitchAdapter receives from the actual switch (with the Exception of HELLO, ECHO_REQUEST, ECHO_REPLY, ROLE_REPLY and ROLE_STATUS) is published using this MessageType.

IMPORTANT: The OpenFlow frame is published as-is, do not use protobuffers to parse Messages sent to this MessageType.

|.From-MessageType|SwitchAdapter#MessageTypes| --- | --- |.From-Payload| raw OpenFlow frame|

 

Listens to Events (TO)

OpenFlow to Switch

The SwitchAdapter will forward any messages received for this MessageType (with the Exception of HELLO, ECHO_REPLY, ROLE_REQUEST) to the underlying switch. Every SwitchAdapter instance is subscribed to this MessageType using its own switchID (DPID) as value for SWITCH_INSTANCE.

IMPORTANT: The payload has to be a raw OpenFlow frame - do not use protobuf to serialize Messages sent to this MessageType.

|.To-MessageType|SwitchAdapter#MessageTypes| --- | --- |.To-Payload| raw OpenFlow frame|

 

MulticastGroups

In order to be able to distribute packetIns in a round-robin fashion to multiple recipients, the SwitchAdapter adds a multicast-byte to all packetIn messages. The config ZSDN_SWITCH_ADAPTER_PACKET_IN_MULTICAST_GROUPS influences how many multicast groups there are. Due to the nature of hierarchical topics, the introduction of this byte forces Modules that want subtopics of packetIn to subscribe once for each multicast-group - if they want to receive all messages. Otherwise (as intended for load balancing) modules subscribe only to one specific multicast group.

The SwitchAdapter will evenly publish all packetIns to the multicast groups.

MessageTypes

The Identifiers for OpenFlow, Ethertype and Protocol, are the same as the IDs in the corresponing headers. Through using that, we can just read the Headers and append the ID for the ZMF messages. Custom types are available for further OpenFlow, Ethertype or Protocol extensions.

{{collapse(View all MessageTypes...)

TO = 0x01
	SWITCH_ADAPTER = 0x0000
		SWITCH_INSTANCE = 0x????????????????
			OPENFLOW = 0x00 #only types sent from controller
				HELLO = 0x00 #for the sake of completeness, will not be sent to switch
				ERROR = 0x01
				ECHO_REQUEST = 0x02 #for the sake of completeness, will not be sent to switch
				ECHO_REPLY = 0x03 #for the sake of completeness, will not be sent to switch
				OF_1_0_VENDOR_OF_1_3_EXPERIMENTER = 0x04
				FEATURES_REQUEST = 0x05
				FEATURES_REPLY = 0x06
				GET_CONFIG_REQUEST = 0x07
				GET_CONFIG_REPLY = 0x08
				SET_CONFIG = 0x09
				PACKET_IN = 0x0A
				FLOW_REMOVED = 0x0B
				PORT_STATUS = 0x0C
				PACKET_OUT = 0x0D
				FLOW_MOD = 0x0E
				OF_1_0_PORT_MOD_OF_1_3_GROUP_MOD = 0x0F
				OF_1_0_STATS_REQUEST_OF_1_3_PORT_MOD = 0x10
				OF_1_0_STATS_REPLY_OF_1_3_TABLE_MOD = 0x11
				OF_1_0_BARRIER_REQUEST_OF_1_3_MULTIPART_REQUEST = 0x12
				OF_1_0_BARRIER_REPLY_OF_1_3_MULTIPART_REPLY = 0x13
				OF_1_0_QUEUE_GET_CONFIG_REQUEST_OF_1_3_BARRIER_REQUEST = 0x14
				OF_1_0_QUEUE_GET_CONFIG_REPLY_OF_1_3_BARRIER_REPLY = 0x15
				OF_1_3_QUEUE_GET_CONFIG_REQUEST = 0x16 
				OF_1_3_QUEUE_GET_CONFIG_REPLY = 0x17
				ROLE_RQUEST = 0x18
				ROLE_REPLY = 0x19
				GET_ASYNC_REQUEST = 0x1A
				GET_ASYNC_REPLY = 0x1B
				SET_ASYNC = 0x1C
				METER_MOD = 0x1D
				CUSTOM_OPENFLOWTYPE = 0x??




FROM = 0x02
	SWITCH_ADAPTER = 0x0000
		OPENFLOW = 0x00 #only types sent from switch
			HELLO = 0x00 #for the sake of completeness, will not be sent to switch
			ERROR = 0x01
			ECHO_REQUEST = 0x02 #for the sake of completeness, will not be sent to switch
			ECHO_REPLY = 0x03 #for the sake of completeness, will not be sent to switch
			OF_1_0_VENDOR_OF_1_3_EXPERIMENTER = 0x04
			FEATURES_REQUEST = 0x05
			FEATURES_REPLY = 0x06
			GET_CONFIG_REQUEST = 0x07
			GET_CONFIG_REPLY = 0x08
			SET_CONFIG = 0x09
			PACKET_IN = 0x0A
				MULTICAST_GROUP = 0x?? default=0x00
					IPv4 = 0x0800
						HOPOPT = 0x00
						ICMP = 0x01
						IGMP	= 0x02
						GGP = 0x03
						IP_in_IP = 0x04
						ST = 0x05
						TCP = 0x06
						CBT = 0x07
						EGP = 0x08
						IGP = 0x09
						BBN_RCC_MON = 0x0A
						NVP_II = 0x0B
						PUP = 0x0C
						ARGUS = 0x0D
						EMCON = 0x0E
						XNET = 0x0F
						CHAOS = 0x10
						UDP = 0x11
							SWITCH_INSTANCE = 0x????????????????
						MUX = 0x12
						DCN_MEAS = 0x13
						HMP = 0x14
						PRM = 0x15
						XNS_IDP = 0x16
						TRUNK_1 = 0x17
						TRUNK_2 = 0x18
						LEAF_1 = 0x19
						LEAF_2 = 0x1A
						RDP = 0x1B
						IRTP = 0x1C
						ISO_TP4 = 0x1D
						NETBLT = 0x1E
						MFE_NSP = 0x1F
						MERIT_INP = 0x20
						DCCP = 0x21
						_3PC = 0x22
						IDPR = 0x23
						XTP = 0x24
						DDP = 0x25
						IDPR_CMTP = 0x26
						TPPP = 0x27
						IL = 0x28
						IPv6_Encap = 0x29
						SDRP = 0x2A
						IPv6_Route = 0x2B
						IPv6_Frag = 0x2C
						IDRP = 0x2D
						RSVP = 0x2E
						GRE = 0x2F
						MHRP = 0x30
						BNA = 0x31
						ESP = 0x32
						AH = 0x33
						I_NLSP = 0x34
						SWIPE = 0x35
						NARP = 0x36
						MOBILE = 0x37
						TLSP = 0x38
						SKIP = 0x39
						IPv6_ICMP = 0x3A
						IPv6_NoNxt = 0x3B
						IPv6_Opts = 0x3C
						Any_Host_Internal_Protocol =	0x3D # no keyword
						CFTP = 0x3E
						Any_Local_Network = 0x3F # no keyword
						SAT_EXPAK = 0x40
						KRYPTOLAN = 0x41
						RVD = 0x42
						IPPC = 0x43
						Any_Distributed_File_System = 0x44 # no keyword
						SAT_MON = 0x45
						VISA = 0x46
						IPCU = 0x47
						CPNX = 0x48
						CPHB = 0x49
						WSN = 0x4A
						PVP = 0x4B
						BR_SAT_MON = 0x4C
						SUN_ND = 0x4D
						WB_MON = 0x4E
						WB_EXPAK = 0x4F
						ISO_IP = 0x50
						VMTP = 0x51
						SECURE_VMTP = 0x52
						VINES = 0x53
						TTP = 0x54
						IPTM = 0x54
						NSFNET_IGP = 0x55
						DGP = 0x56
						TCF = 0x57
						EIGRP = 0x58
						OSPF = 0x59
						Sprite_RPC = 0x5A
						LARP = 0x5B
						MTP = 0x5C
						AX_25 = 0x5D
						IPIP = 0x5E
						MICP = 0x5F
						SCC_SP = 0x60
						ETHERIP = 0x61
						ENCAP = 0x62
						Any_Private_Encryption_Scheme = 0x63 # no keyword
						GMTP = 0x64
						IFMP = 0x65
						PNNI = 0x66
						PIM = 0x67
						ARIS = 0x68
						SCPS = 0x69
						QNX = 0x6A
						A_N = 0x6B
						IPComp = 0x6C
						SNP = 0x6D
						Compaq_Peer = 0x6E
						IPX_in_IP = 0x6F
						VRRP = 0x70
						PGM = 0x71
						Any_0_Hop_Protocol = 0x72 # no keyword
						L2TP = 0x73
						DDX = 0x74
						IATP = 0x75
						STP = 0x76
						SRP = 0x77
						UTI = 0x78
						SMP = 0x79
						SM = 0x7A
						PTP = 0x7B
						IS_IS_Over_IPv4 = 0x7C
						FIRE = 0x7D
						CRTP = 0x7E
						CRUDP = 0x7F
						SSCOPMCE = 0x80
						IPLT = 0x81
						SPS = 0x82
						PIPE = 0x83
						SCTP = 0x84
						FC = 0x85
						RSVP_E2E_IGNORE = 0x86
						Mobility_Header = 0x87
						UDPLite = 0x88
						MPLS_in_IP = 0x89
						manet = 0x8A
						HIP = 0x8B
						Shim6 = 0x8C
						WESP = 0x8D
						ROHC = 0x8E
						Use_For_Experimentation_And_Testing_0xFD = 0xFD # no keyword
						Use_For_Experimentation_And_Testing_0xFE = 0xFE # no keyword
						Reserved = 0xFF # no keyword
						CUSTOM = 0x??
					ARP = 0x0806
					Wake_on_LAN = 0x0842
					Audio_Video_Transport_Protocol_as_defined_in_IEEE_Std_1722_2011 = 0x22F0
					IETF_TRILL_Protocol = 0x22F3
					DECnet_Phase_IV = 0x6003
					Reverse_Address_Resolution_Protocol = 0x8035
					AppleTalk_Ethertalk = 0x809B
					AppleTalk_Address_Resolution_Protocol_AARP = 0x80F3
					VLAN_tagged_frame_IEEE_802_1Q_Shortest_Path_Bridging_IEEE_802_1aq = 0x8100
					IPX_1 = 0x8137
					IPX_2 = 0x8138
					QNX_Qnet = 0x8204
					IPv6 = 0x86DD
						HOPOPT = 0x00
						ICMP = 0x01
						IGMP	= 0x02
						GGP = 0x03
						IP_in_IP = 0x04
						ST = 0x05
						TCP = 0x06
						CBT = 0x07
						EGP = 0x08
						IGP = 0x09
						BBN_RCC_MON = 0x0A
						NVP_II = 0x0B
						PUP = 0x0C
						ARGUS = 0x0D
						EMCON = 0x0E
						XNET = 0x0F
						CHAOS = 0x10
						UDP = 0x11
						MUX = 0x12
						DCN_MEAS = 0x13
						HMP = 0x14
						PRM = 0x15
						XNS_IDP = 0x16
						TRUNK_1 = 0x17
						TRUNK_2 = 0x18
						LEAF_1 = 0x19
						LEAF_2 = 0x1A
						RDP = 0x1B
						IRTP = 0x1C
						ISO_TP4 = 0x1D
						NETBLT = 0x1E
						MFE_NSP = 0x1F
						MERIT_INP = 0x20
						DCCP = 0x21
						_3PC = 0x22
						IDPR = 0x23
						XTP = 0x24
						DDP = 0x25
						IDPR_CMTP = 0x26
						TPPP = 0x27
						IL = 0x28
						IPv6_Encap = 0x29
						SDRP = 0x2A
						IPv6_Route = 0x2B
						IPv6_Frag = 0x2C
						IDRP = 0x2D
						RSVP = 0x2E
						GRE = 0x2F
						MHRP = 0x30
						BNA = 0x31
						ESP = 0x32
						AH = 0x33
						I_NLSP = 0x34
						SWIPE = 0x35
						NARP = 0x36
						MOBILE = 0x37
						TLSP = 0x38
						SKIP = 0x39
						IPv6_ICMP = 0x3A
						IPv6_NoNxt = 0x3B
						IPv6_Opts = 0x3C
						Any_Host_Internal_Protocol =	0x3D # no keyword
						CFTP = 0x3E
						Any_Local_Network = 0x3F # no keyword
						SAT_EXPAK = 0x40
						KRYPTOLAN = 0x41
						RVD = 0x42
						IPPC = 0x43
						Any_Distributed_File_System = 0x44 # no keyword
						SAT_MON = 0x45
						VISA = 0x46
						IPCU = 0x47
						CPNX = 0x48
						CPHB = 0x49
						WSN = 0x4A
						PVP = 0x4B
						BR_SAT_MON = 0x4C
						SUN_ND = 0x4D
						WB_MON = 0x4E
						WB_EXPAK = 0x4F
						ISO_IP = 0x50
						VMTP = 0x51
						SECURE_VMTP = 0x52
						VINES = 0x53
						TTP = 0x54
						IPTM = 0x54
						NSFNET_IGP = 0x55
						DGP = 0x56
						TCF = 0x57
						EIGRP = 0x58
						OSPF = 0x59
						Sprite_RPC = 0x5A
						LARP = 0x5B
						MTP = 0x5C
						AX_25 = 0x5D
						IPIP = 0x5E
						MICP = 0x5F
						SCC_SP = 0x60
						ETHERIP = 0x61
						ENCAP = 0x62
						Any_Private_Encryption_Scheme = 0x63 # no keyword
						GMTP = 0x64
						IFMP = 0x65
						PNNI = 0x66
						PIM = 0x67
						ARIS = 0x68
						SCPS = 0x69
						QNX = 0x6A
						A_N = 0x6B
						IPComp = 0x6C
						SNP = 0x6D
						Compaq_Peer = 0x6E
						IPX_in_IP = 0x6F
						VRRP = 0x70
						PGM = 0x71
						Any_0_Hop_Protocol = 0x72 # no keyword
						L2TP = 0x73
						DDX = 0x74
						IATP = 0x75
						STP = 0x76
						SRP = 0x77
						UTI = 0x78
						SMP = 0x79
						SM = 0x7A
						PTP = 0x7B
						IS_IS_Over_IPv4 = 0x7C
						FIRE = 0x7D
						CRTP = 0x7E
						CRUDP = 0x7F
						SSCOPMCE = 0x80
						IPLT = 0x81
						SPS = 0x82
						PIPE = 0x83
						SCTP = 0x84
						FC = 0x85
						RSVP_E2E_IGNORE = 0x86
						Mobility_Header = 0x87
						UDPLite = 0x88
						MPLS_in_IP = 0x89
						manet = 0x8A
						HIP = 0x8B
						Shim6 = 0x8C
						WESP = 0x8D
						ROHC = 0x8E
						Use_For_Experimentation_And_Testing_0xFD = 0xFD # no keyword
						Use_For_Experimentation_And_Testing_0xFE = 0xFE # no keyword
						Reserved = 0xFF # no keyword
						CUSTOM = 0x??
					Ethernet_flow_control = 0x8808
					Slow_Protocols_IEEE_802_3 = 0x8809
					CobraNet = 0x8819
					MPLS_unicast = 0x8847
					MPLS_multicast = 0x8848
					PPPoE_Discovery_Stage = 0x8863
					PPPoE_Session_Stage = 0x8864
					Jumbo_Frames = 0x8870
					HomePlug_1_0_MME = 0x887B
					EAP_over_LAN_IEEE_802_1X = 0x888E
					PROFINET_Protocol = 0x8892
					HyperSCSI_SCSI_over_Ethernet = 0x889A
					ATA_over_Ethernet = 0x88A2
					EtherCAT_Protocol = 0x88A4
					Provider_Bridging_IEEE_802_1ad_Shortest_Path_Bridging_IEEE_802_laq = 0x88A8
					Ethernet_Powerlink = 0x88AB
					LLDP = 0x88CC
					SERCOS_III = 0x88CD
					HomePlug_AV_MME = 0x88E1
					Media_Redundancy_Protocol_IEC62439_2 = 0x88E3
					MAC_security_IEEE_802_1AE = 0x88E5
					PTP_over_Ethernet_IEEE_1588 = 0x88F7
					IEEE_802_1ag_Connectivity_Fault_Management_CFM_Protocol_ITU_T_Recommendation_Y_1731_OAM = 0x8902
					FCoE = 0x8906
					FCoE_Initialization_Protocol = 0x8914
					RoCE = 0x8915
					HSR = 0x892F
					Ethernet_Configuration_Testing_Protocol = 0x9000
					LLT = 0xCAFE
					CUSTOM_PROTOCOL = 0x????
			FLOW_REMOVED = 0x0B
			PORT_STATUS = 0x0C
			PACKET_OUT = 0x0D
			FLOW_MOD = 0x0E
			OF_1_0_PORT_MOD_OF_1_3_GROUP_MOD = 0x0F
			OF_1_0_STATS_REQUEST_OF_1_3_PORT_MOD = 0x10
			OF_1_0_STATS_REPLY_OF_1_3_TABLE_MOD = 0x11
			OF_1_0_BARRIER_REQUEST_OF_1_3_MULTIPART_REQUEST = 0x12
			OF_1_0_BARRIER_REPLY_OF_1_3_MULTIPART_REPLY = 0x13
			OF_1_0_QUEUE_GET_CONFIG_REQUEST_OF_1_3_BARRIER_REQUEST = 0x14
			OF_1_0_QUEUE_GET_CONFIG_REPLY_OF_1_3_BARRIER_REPLY = 0x15
			OF_1_3_QUEUE_GET_CONFIG_REQUEST = 0x16 
			OF_1_3_QUEUE_GET_CONFIG_REPLY = 0x17
			ROLE_RQUEST = 0x18
			ROLE_REPLY = 0x19
			GET_ASYNC_REQUEST = 0x1A
			GET_ASYNC_REPLY = 0x1B
			SET_ASYNC = 0x1C
			METER_MOD = 0x1D
			CUSTOM_OPENFLOWTYPE = 0x??


REQUEST = 0x03
	SWITCH_ADAPTER = 0x0000
		OPENFLOW = 0x00
			HANDLE_OPENFLOW_MESSAGE = 0x00

REPLY = 0x04
	SWITCH_ADAPTER = 0x0000
		OPENFLOW = 0x00
			HANDLE_OPENFLOW_MESSAGE = 0x00


}}

 

Implementation Details

In order to be able to run multiple SwitchAdapters on the same machine (using the same OpenFlow port), the executable of the SwitchAdapter has a single TCP ServerSocket and will start one actual SwitchAdapter for each incomming connection from an OpenFlow switch - if the OpenFlow Handshake succeeded. If the basic hello handshake succeeded, a feature request is sent to the switch. After a sucessful handshake and receiving of the feature reply message, a SwitchAdapter instance will be started, using a the switches ID as instanceId of the SwitchAdapter module - which allows other modules to publish to this SwitchAdapter instance.

  • A SwitchAdapter will respond to ECHO_REQUESTs of the Switch, and thus avoid a connection timeout.
  • A SwitchAdapters will termintate itself, when the connection to the switch ends(EOF).

 

Clone this wiki locally