blob: 53e0eddfbefec73ab421790e7baa7e1e47afcb69 [file] [log] [blame]
Flavio Castro05d20bc2015-11-16 15:06:14 -05001"""
Flavio Castro423df652016-05-17 20:14:08 -04002Check README file
Flavio Castro05d20bc2015-11-16 15:06:14 -05003"""
Flavio Castro1c9b1252016-02-04 18:42:58 -05004import Queue
Flavio Castro05d20bc2015-11-16 15:06:14 -05005
Flavio Castro05d20bc2015-11-16 15:06:14 -05006from oftest import config
Flavio Castro67d8bd52016-02-03 14:22:14 -05007import inspect
Flavio Castro167f5bd2015-12-02 19:33:53 -05008import logging
9import oftest.base_tests as base_tests
Flavio Castro05d20bc2015-11-16 15:06:14 -050010import ofp
11from oftest.testutils import *
12from accton_util import *
Pierbbdf3782016-08-22 17:58:26 -070013from utils import *
Flavio Castrod8f8af22015-12-02 18:19:26 -050014
Flavio Castroa7162bb2016-07-25 17:30:30 -070015class PacketInUDP( base_tests.SimpleDataPlane ):
Flavio Castro6d498522015-12-15 14:05:04 -050016 """
Flavio Castro76c5b262016-07-27 19:53:00 -070017 Verify ACL rule for IP_PROTO=2 wont match a UDP packet and a rule for IP_PROTO=17 WILL match a UDP packet.
Flavio Castro6d498522015-12-15 14:05:04 -050018 """
19
Flavio Castroa7162bb2016-07-25 17:30:30 -070020 def runTest( self ):
Flavio Castro8c37e1c2016-07-19 18:26:33 -070021 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -070022 parsed_vlan_pkt = simple_udp_packet( pktlen=104, vlan_vid=0x1001, dl_vlan_enable=True )
23 vlan_pkt = str( parsed_vlan_pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -070024 # create match
Flavio Castroa7162bb2016-07-25 17:30:30 -070025 match = ofp.match( )
26 match.oxm_list.append( ofp.oxm.eth_type( 0x0800 ) )
27 match.oxm_list.append( ofp.oxm.ip_proto( 2 ) )
28 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
29 ofp.instruction.apply_actions( actions=[
30 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
31 buffer_id=ofp.OFP_NO_BUFFER, priority=1 )
32 logging.info( "Inserting packet in flow to controller" )
33 self.controller.message_send( request )
Flavio Castro1c9b1252016-02-04 18:42:58 -050034
Flavio Castroa7162bb2016-07-25 17:30:30 -070035 for of_port in config[ "port_map" ].keys( ):
36 logging.info( "PacketInMiss test, port %d", of_port )
37 self.dataplane.send( of_port, vlan_pkt )
Flavio Castro1c9b1252016-02-04 18:42:58 -050038
Flavio Castroa7162bb2016-07-25 17:30:30 -070039 verify_no_packet_in( self, vlan_pkt, of_port )
40 delete_all_flows( self.controller )
41 do_barrier( self.controller )
Flavio Castro6d498522015-12-15 14:05:04 -050042
Flavio Castroa7162bb2016-07-25 17:30:30 -070043 match = ofp.match( )
44 match.oxm_list.append( ofp.oxm.eth_type( 0x0800 ) )
45 match.oxm_list.append( ofp.oxm.ip_proto( 17 ) )
46 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
47 ofp.instruction.apply_actions( actions=[
48 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
49 buffer_id=ofp.OFP_NO_BUFFER, priority=1 )
50 logging.info( "Inserting packet in flow to controller" )
51 self.controller.message_send( request )
52 do_barrier( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -050053
Flavio Castroa7162bb2016-07-25 17:30:30 -070054 for of_port in config[ "port_map" ].keys( ):
55 logging.info( "PacketInMiss test, port %d", of_port )
56 self.dataplane.send( of_port, vlan_pkt )
Flavio Castro6d498522015-12-15 14:05:04 -050057
Flavio Castroa7162bb2016-07-25 17:30:30 -070058 verify_packet_in( self, vlan_pkt, of_port, ofp.OFPR_ACTION )
Flavio Castro6d498522015-12-15 14:05:04 -050059
Flavio Castroa7162bb2016-07-25 17:30:30 -070060 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -070061 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -070062 delete_all_flows( self.controller )
63 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -050064
Flavio Castroaf2b4502016-02-02 17:41:32 -050065
Flavio Castro67d8bd52016-02-03 14:22:14 -050066@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -070067class ArpNL2( base_tests.SimpleDataPlane ):
68 def runTest( self ):
69 delete_all_flows( self.controller )
70 delete_all_groups( self.controller )
Flavio Castro7fb6ca92015-12-16 15:50:14 -050071
Flavio Castroa7162bb2016-07-25 17:30:30 -070072 ports = sorted( config[ "port_map" ].keys( ) )
73 match = ofp.match( )
74 match.oxm_list.append( ofp.oxm.eth_type( 0x0806 ) )
75 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
76 ofp.instruction.apply_actions( actions=[
77 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
78 buffer_id=ofp.OFP_NO_BUFFER, priority=40000 )
79 self.controller.message_send( request )
Flavio Castro7fb6ca92015-12-16 15:50:14 -050080 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -070081 add_one_l2_interface_group( self.controller, port, 1, False, False )
82 add_one_vlan_table_flow( self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_BOTH )
83 group_id = encode_l2_interface_group_id( 1, port )
84 add_bridge_flow( self.controller, [ 0x00, 0x12, 0x34, 0x56, 0x78, port ], 1, group_id, True )
85 do_barrier( self.controller )
86 parsed_arp_pkt = simple_arp_packet( )
87 arp_pkt = str( parsed_arp_pkt )
Flavio Castro7fb6ca92015-12-16 15:50:14 -050088
89 for out_port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -070090 self.dataplane.send( out_port, arp_pkt )
91 verify_packet_in( self, arp_pkt, out_port, ofp.OFPR_ACTION )
Flavio Castro7fb6ca92015-12-16 15:50:14 -050092 # change dest based on port number
Flavio Castro1c9b1252016-02-04 18:42:58 -050093 mac_dst = '00:12:34:56:78:%02X' % out_port
Flavio Castro7fb6ca92015-12-16 15:50:14 -050094 for in_port in ports:
95 if in_port == out_port:
96 continue
97 # change source based on port number to avoid packet-ins from learning
Flavio Castro1c9b1252016-02-04 18:42:58 -050098 mac_src = '00:12:34:56:78:%02X' % in_port
Flavio Castroa7162bb2016-07-25 17:30:30 -070099 parsed_pkt = simple_tcp_packet( eth_dst=mac_dst, eth_src=mac_src )
100 pkt = str( parsed_pkt )
101 self.dataplane.send( in_port, pkt )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500102
103 for ofport in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700104 if ofport in [ out_port ]:
105 verify_packet( self, pkt, ofport )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500106 else:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700107 verify_no_packet( self, pkt, ofport )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500108
Flavio Castroa7162bb2016-07-25 17:30:30 -0700109 verify_no_other_packets( self )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500110
Flavio Castroa7162bb2016-07-25 17:30:30 -0700111class PacketInArp( base_tests.SimpleDataPlane ):
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500112 """
Flavio Castro76c5b262016-07-27 19:53:00 -0700113 Verify Packet-in message from eth_type 0x806 on ACL table
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500114 """
115
Flavio Castroa7162bb2016-07-25 17:30:30 -0700116 def runTest( self ):
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700117 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700118 parsed_arp_pkt = simple_arp_packet( )
119 arp_pkt = str( parsed_arp_pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700120 # create match
Flavio Castroa7162bb2016-07-25 17:30:30 -0700121 match = ofp.match( )
122 match.oxm_list.append( ofp.oxm.eth_type( 0x0806 ) )
123 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
124 ofp.instruction.apply_actions( actions=[
125 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
126 buffer_id=ofp.OFP_NO_BUFFER, priority=1 )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500127
Flavio Castroa7162bb2016-07-25 17:30:30 -0700128 logging.info( "Inserting packet in flow to controller" )
129 self.controller.message_send( request )
130 do_barrier( self.controller )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500131
Flavio Castroa7162bb2016-07-25 17:30:30 -0700132 for of_port in config[ "port_map" ].keys( ):
133 logging.info( "PacketInMiss test, port %d", of_port )
134 self.dataplane.send( of_port, arp_pkt )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500135
Flavio Castroa7162bb2016-07-25 17:30:30 -0700136 verify_packet_in( self, arp_pkt, of_port, ofp.OFPR_ACTION )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500137
Flavio Castroa7162bb2016-07-25 17:30:30 -0700138 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700139 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700140 delete_all_flows( self.controller )
141 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500142
Flavio Castroa7162bb2016-07-25 17:30:30 -0700143
144class PacketInIPTable( base_tests.SimpleDataPlane ):
Flavio Castro91d1a552016-05-17 16:59:44 -0700145 """
Flavio Castro76c5b262016-07-27 19:53:00 -0700146 Verify Packet-in message from IP table when controller action is used
Flavio Castro91d1a552016-05-17 16:59:44 -0700147 Send a packet to each dataplane port and verify that a packet
148 in message is received from the controller for each
149 #todo verify you stop receiving after adding rule
150 """
151
Flavio Castroa7162bb2016-07-25 17:30:30 -0700152 def runTest( self ):
153 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700154 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700155 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
156 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
157 dip = 0xc0a80001
158 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro91d1a552016-05-17 16:59:44 -0700159
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700160 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700161 # add l2 interface group
162 vlan_id = port
163 add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id, is_tagged=True,
164 send_barrier=False )
165 dst_mac[ 5 ] = vlan_id
166 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=vlan_id,
167 src_mac=intf_src_mac, dst_mac=dst_mac )
168 # add vlan flow table
169 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
170 # add termination flow
171 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
172 # add unicast routing flow
173 dst_ip = dip + (vlan_id << 8)
174 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, l3_msg.group_id,
175 send_ctrl=True )
176 Groups.put( l3_msg.group_id )
Flavio Castro91d1a552016-05-17 16:59:44 -0700177
Flavio Castroa7162bb2016-07-25 17:30:30 -0700178 do_barrier( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -0700179
Flavio Castroa7162bb2016-07-25 17:30:30 -0700180 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700181 for in_port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700182 mac_src = '00:00:00:22:22:%02X' % in_port
183 ip_src = '192.168.%02d.1' % in_port
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700184 for out_port in ports:
185 if in_port == out_port:
186 continue
Flavio Castroa7162bb2016-07-25 17:30:30 -0700187 ip_dst = '192.168.%02d.1' % out_port
188 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
189 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
190 pkt = str( parsed_pkt )
191 self.dataplane.send( in_port, pkt )
192 verify_packet_in( self, pkt, in_port, ofp.OFPR_ACTION )
193 # verify_no_other_packets(self)
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700194 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700195 delete_all_flows( self.controller )
196 delete_groups( self.controller, Groups )
197 delete_all_groups( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -0700198
Flavio Castroa7162bb2016-07-25 17:30:30 -0700199
200class L2FloodQinQ( base_tests.SimpleDataPlane ):
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500201 """
Flavio Castro76c5b262016-07-27 19:53:00 -0700202 Verify Vlan based flooding of QinQ based on its outer vlan
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500203 """
Flavio Castro1c9b1252016-02-04 18:42:58 -0500204
Flavio Castroa7162bb2016-07-25 17:30:30 -0700205 def runTest( self ):
206 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700207 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700208 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700209 vlan_id = 1
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500210
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700211 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700212 L2gid, l2msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
213 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
214 Groups.put( L2gid )
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500215
Flavio Castroa7162bb2016-07-25 17:30:30 -0700216 msg = add_l2_flood_group( self.controller, ports, vlan_id, vlan_id )
217 Groups.put( msg.group_id )
218 add_bridge_flow( self.controller, None, vlan_id, msg.group_id, True )
219 do_barrier( self.controller )
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500220
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700221 # verify flood
222 for ofport in ports:
223 # change dest based on port number
224 mac_src = '00:12:34:56:78:%02X' % ofport
Flavio Castroa7162bb2016-07-25 17:30:30 -0700225 parsed_pkt = simple_tcp_packet_two_vlan( pktlen=108, out_dl_vlan_enable=True,
226 out_vlan_vid=vlan_id, in_dl_vlan_enable=True, in_vlan_vid=10,
227 eth_dst='00:12:34:56:78:9a', eth_src=mac_src )
228 pkt = str( parsed_pkt )
229 self.dataplane.send( ofport, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700230 # self won't rx packet
Flavio Castroa7162bb2016-07-25 17:30:30 -0700231 verify_no_packet( self, pkt, ofport )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700232 # others will rx packet
Flavio Castroa7162bb2016-07-25 17:30:30 -0700233 tmp_ports = list( ports )
234 tmp_ports.remove( ofport )
235 verify_packets( self, pkt, tmp_ports )
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500236
Flavio Castroa7162bb2016-07-25 17:30:30 -0700237 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700238 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700239 delete_all_flows( self.controller )
240 delete_groups( self.controller, Groups )
241 delete_all_groups( self.controller )
242
Flavio Castro1c9b1252016-02-04 18:42:58 -0500243
Flavio Castroce3bfeb2016-02-04 14:06:55 -0500244@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -0700245class L2FloodTagged( base_tests.SimpleDataPlane ):
Flavio Castro184cefe2015-11-19 20:52:49 -0500246 """
247 Test L2 flood to a vlan
248 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
Flavio Castro184cefe2015-11-19 20:52:49 -0500249 """
Flavio Castro1c9b1252016-02-04 18:42:58 -0500250
Flavio Castroa7162bb2016-07-25 17:30:30 -0700251 def runTest( self ):
Flavio Castro1c9b1252016-02-04 18:42:58 -0500252 # Hashes Test Name and uses it as id for installing unique groups
Flavio Castroa7162bb2016-07-25 17:30:30 -0700253 vlan_id = abs( hash( inspect.stack( )[ 0 ][ 3 ] ) ) % (256)
Flavio Castroce3bfeb2016-02-04 14:06:55 -0500254 print vlan_id
Flavio Castroaba28ff2016-02-03 16:47:48 -0500255
Flavio Castroa7162bb2016-07-25 17:30:30 -0700256 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro34352e72015-12-07 20:01:51 -0500257
Flavio Castroa7162bb2016-07-25 17:30:30 -0700258 delete_all_flows( self.controller )
259 delete_all_groups( self.controller )
Flavio Castro184cefe2015-11-19 20:52:49 -0500260
Flavio Castro184cefe2015-11-19 20:52:49 -0500261 # Installing flows to avoid packet-in
262 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700263 add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
264 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
265 msg = add_l2_flood_group( self.controller, ports, vlan_id, vlan_id )
266 add_bridge_flow( self.controller, None, vlan_id, msg.group_id, True )
267 do_barrier( self.controller )
Flavio Castro184cefe2015-11-19 20:52:49 -0500268
Flavio Castro1c9b1252016-02-04 18:42:58 -0500269 # verify flood
Flavio Castro184cefe2015-11-19 20:52:49 -0500270 for ofport in ports:
271 # change dest based on port number
Flavio Castroa7162bb2016-07-25 17:30:30 -0700272 pkt = str(
273 simple_tcp_packet( dl_vlan_enable=True, vlan_vid=vlan_id, eth_dst='00:12:34:56:78:9a' ) )
274 self.dataplane.send( ofport, pkt )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500275 # self won't rx packet
Flavio Castroa7162bb2016-07-25 17:30:30 -0700276 verify_no_packet( self, pkt, ofport )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500277 # others will rx packet
Flavio Castroa7162bb2016-07-25 17:30:30 -0700278 tmp_ports = list( ports )
279 tmp_ports.remove( ofport )
280 verify_packets( self, pkt, tmp_ports )
281 verify_no_other_packets( self )
Flavio Castroaabb5792015-11-18 19:03:50 -0500282
Flavio Castro1c9b1252016-02-04 18:42:58 -0500283
Flavio Castroa7162bb2016-07-25 17:30:30 -0700284class L2UnicastTagged( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700285 """ Verify Bridging works: match(VID, DST_MAC)> fwd(port) """
Flavio Castro1c9b1252016-02-04 18:42:58 -0500286
Flavio Castroa7162bb2016-07-25 17:30:30 -0700287 def runTest( self ):
Flavio Castrob01d0aa2016-07-20 16:14:48 -0700288
Flavio Castroa7162bb2016-07-25 17:30:30 -0700289 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700290 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700291 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700292 vlan_id = 1;
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700293 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700294 L2gid, l2msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
295 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
296 Groups.put( L2gid )
297 add_bridge_flow( self.controller, [ 0x00, 0x12, 0x34, 0x56, 0x78, port ], vlan_id, L2gid,
298 True )
299 do_barrier( self.controller )
Flavio Castro6efe1862015-11-18 16:28:06 -0500300
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700301 for out_port in ports:
302 # change dest based on port number
303 mac_dst = '00:12:34:56:78:%02X' % out_port
304 for in_port in ports:
305 if in_port == out_port:
306 continue
Flavio Castroa7162bb2016-07-25 17:30:30 -0700307 pkt = str( simple_tcp_packet( dl_vlan_enable=True, vlan_vid=vlan_id, eth_dst=mac_dst ) )
308 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700309 for ofport in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700310 if ofport in [ out_port ]:
311 verify_packet( self, pkt, ofport )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700312 else:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700313 verify_no_packet( self, pkt, ofport )
314 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700315 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700316 delete_all_flows( self.controller )
317 delete_groups( self.controller, Groups )
318 delete_all_groups( self.controller )
Flavio Castro6efe1862015-11-18 16:28:06 -0500319
Flavio Castroa7162bb2016-07-25 17:30:30 -0700320
321class Mtu1500( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700322 """V erifies basic mtu limits"""
Flavio Castroa7162bb2016-07-25 17:30:30 -0700323 def runTest( self ):
324 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700325 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700326 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700327 vlan_id = 18
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700328 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700329 L2gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
330 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
331 Groups.put( L2gid )
332 add_bridge_flow( self.controller, [ 0x00, 0x12, 0x34, 0x56, 0x78, port ], vlan_id, L2gid,
333 True )
334 do_barrier( self.controller )
Flavio Castrob6773032015-11-19 22:49:24 -0500335
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700336 for out_port in ports:
337 # change dest based on port number
338 mac_dst = '00:12:34:56:78:%02X' % out_port
339 for in_port in ports:
340 if in_port == out_port:
341 continue
Flavio Castroa7162bb2016-07-25 17:30:30 -0700342 pkt = str( simple_tcp_packet( pktlen=1500, dl_vlan_enable=True, vlan_vid=vlan_id,
343 eth_dst=mac_dst ) )
344 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700345 for ofport in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700346 if ofport in [ out_port ]:
347 verify_packet( self, pkt, ofport )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700348 else:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700349 verify_no_packet( self, pkt, ofport )
350 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700351 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700352 delete_all_flows( self.controller )
353 delete_groups( self.controller, Groups )
354 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500355
Flavio Castroa7162bb2016-07-25 17:30:30 -0700356
357class _32UcastTagged( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700358 """ Verify /32 IP forwarding to L3 Interface"""
Flavio Castro1c9b1252016-02-04 18:42:58 -0500359
Flavio Castroa7162bb2016-07-25 17:30:30 -0700360 def runTest( self ):
361 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700362 try:
363 test_id = 26
Flavio Castroa7162bb2016-07-25 17:30:30 -0700364 if len( config[ "port_map" ] ) < 2:
365 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700366 return
Flavio Castrod8f8af22015-12-02 18:19:26 -0500367
Flavio Castroa7162bb2016-07-25 17:30:30 -0700368 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
369 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700370 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700371 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700372 for port in ports:
373 # add l2 interface group
374 vlan_id = port + test_id
Flavio Castroa7162bb2016-07-25 17:30:30 -0700375 l2gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
376 is_tagged=True, send_barrier=False )
377 dst_mac[ 5 ] = vlan_id
378 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=vlan_id,
379 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700380 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -0700381 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700382 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700383 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700384 # add unicast routing flow
385 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700386 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id )
387 Groups.put( l2gid )
388 Groups.put( l3_msg.group_id )
389 do_barrier( self.controller )
Flavio Castrod8f8af22015-12-02 18:19:26 -0500390
Flavio Castroa7162bb2016-07-25 17:30:30 -0700391 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700392 for in_port in ports:
393 mac_src = '00:00:00:22:32:%02X' % (test_id + in_port)
394 ip_src = '192.168.%02d.1' % (test_id + in_port)
395 for out_port in ports:
396 if in_port == out_port:
397 continue
398 ip_dst = '192.168.%02d.1' % (test_id + out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700399 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
400 vlan_vid=(test_id + in_port), eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64,
401 ip_src=ip_src, ip_dst=ip_dst )
402 pkt = str( parsed_pkt )
403 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700404 # build expected packet
405 mac_dst = '00:00:00:22:22:%02X' % (test_id + out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700406 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
407 vlan_vid=(test_id + out_port), eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
408 ip_src=ip_src, ip_dst=ip_dst )
409 pkt = str( exp_pkt )
410 verify_packet( self, pkt, out_port )
411 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700412 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700413 delete_all_flows( self.controller )
414 delete_groups( self.controller, Groups )
415 delete_all_groups( self.controller )
Flavio Castro05d20bc2015-11-16 15:06:14 -0500416
Flavio Castroa7162bb2016-07-25 17:30:30 -0700417
418class _32VPN( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700419 """ Verify MPLS IP VPN Initiation from /32 rule """
Flavio Castro2262fd42016-02-04 19:03:36 -0500420
Flavio Castroa7162bb2016-07-25 17:30:30 -0700421 def runTest( self ):
422 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700423 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700424 if len( config[ "port_map" ] ) < 2:
425 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700426 return
Flavio Castro2262fd42016-02-04 19:03:36 -0500427
Flavio Castroa7162bb2016-07-25 17:30:30 -0700428 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
429 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700430 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700431 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700432 for port in ports:
433 # add l2 interface group
434 id = port
435 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700436 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, True )
437 dst_mac[ 5 ] = vlan_id
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700438 # add MPLS interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700439 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
440 vlan_id, id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700441 # add MPLS L3 VPN group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700442 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
443 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
444 push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32 )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700445 # ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
Flavio Castroa7162bb2016-07-25 17:30:30 -0700446 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700447 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -0700448 add_one_vlan_table_flow( self.controller, port, vlan_id, vrf=2,
449 flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700450 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700451 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700452 # add routing flow
453 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700454 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, mpls_label_gid, vrf=2 )
455 Groups._put( l2_gid )
456 Groups._put( mpls_gid )
457 Groups._put( mpls_label_gid )
458 do_barrier( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500459
Flavio Castroa7162bb2016-07-25 17:30:30 -0700460 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700461 for in_port in ports:
462 ip_src = '192.168.%02d.1' % (in_port)
463 for out_port in ports:
464 if in_port == out_port:
465 continue
466 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700467 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
468 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
469 pkt = str( parsed_pkt )
470 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700471 # build expect packet
472 mac_dst = '00:00:00:22:22:%02X' % (out_port)
473 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700474 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port), ip_ttl=63,
475 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
476 label=[ label ] )
477 pkt = str( exp_pkt )
478 verify_packet( self, pkt, out_port )
479 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700480 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700481 delete_all_flows( self.controller )
482 delete_groups( self.controller, Groups )
483 delete_all_groups( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500484
Flavio Castroa7162bb2016-07-25 17:30:30 -0700485
486class _32EcmpVpn( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700487 """ Verify MPLS IP VPN Initiation from /32 rule using ECMP """
Flavio Castro2262fd42016-02-04 19:03:36 -0500488
Flavio Castroa7162bb2016-07-25 17:30:30 -0700489 def runTest( self ):
490 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700491 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700492 if len( config[ "port_map" ] ) < 2:
493 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700494 return
Flavio Castro2262fd42016-02-04 19:03:36 -0500495
Flavio Castroa7162bb2016-07-25 17:30:30 -0700496 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
497 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700498 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700499 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700500 for port in ports:
501 # add l2 interface group
502 id = port
503 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700504 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, True )
505 dst_mac[ 5 ] = vlan_id
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700506 # add MPLS interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700507 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
508 vlan_id, id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700509 # add MPLS L3 VPN group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700510 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
511 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
512 push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32 )
513 ecmp_msg = add_l3_ecmp_group( self.controller, vlan_id, [ mpls_label_gid ] )
514 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700515 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -0700516 add_one_vlan_table_flow( self.controller, port, vlan_id, vrf=0,
517 flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700518 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700519 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700520 # add routing flow
521 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700522 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, ecmp_msg.group_id )
523 Groups._put( l2_gid )
524 Groups._put( mpls_gid )
525 Groups._put( mpls_label_gid )
526 Groups._put( ecmp_msg.group_id )
527 do_barrier( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500528
Flavio Castroa7162bb2016-07-25 17:30:30 -0700529 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700530 for in_port in ports:
531 ip_src = '192.168.%02d.1' % (in_port)
532 for out_port in ports:
533 if in_port == out_port:
534 continue
535 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700536 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
537 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
538 pkt = str( parsed_pkt )
539 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700540 # build expect packet
541 mac_dst = '00:00:00:22:22:%02X' % (out_port)
542 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700543 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port), ip_ttl=63,
544 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
545 label=[ label ] )
546 pkt = str( exp_pkt )
547 verify_packet( self, pkt, out_port )
548 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700549 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700550 delete_all_flows( self.controller )
551 delete_groups( self.controller, Groups )
552 delete_all_groups( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500553
Flavio Castroa7162bb2016-07-25 17:30:30 -0700554
555class _32ECMPL3( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700556 """ Verifies /32 IP routing and ECMP """
Flavio Castro2262fd42016-02-04 19:03:36 -0500557
Flavio Castroa7162bb2016-07-25 17:30:30 -0700558 def runTest( self ):
559 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700560 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700561 if len( config[ "port_map" ] ) < 2:
562 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700563 return
Flavio Castro2262fd42016-02-04 19:03:36 -0500564
Flavio Castroa7162bb2016-07-25 17:30:30 -0700565 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
566 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700567 dip = 0xc0a80001
568 # Hashes Test Name and uses it as id for installing unique groups
Flavio Castroa7162bb2016-07-25 17:30:30 -0700569 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700570 for port in ports:
571 vlan_id = port
572 id = port
573 # add l2 interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700574 l2_gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
575 is_tagged=True, send_barrier=False )
576 dst_mac[ 5 ] = vlan_id
577 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=id,
578 src_mac=intf_src_mac, dst_mac=dst_mac )
579 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ l3_msg.group_id ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700580 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -0700581 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700582 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700583 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700584 # add unicast routing flow
585 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700586 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, ecmp_msg.group_id )
587 Groups._put( l2_gid )
588 Groups._put( l3_msg.group_id )
589 Groups._put( ecmp_msg.group_id )
590 do_barrier( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500591
Flavio Castroa7162bb2016-07-25 17:30:30 -0700592 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700593 for in_port in ports:
594 mac_src = '00:00:00:22:22:%02X' % in_port
595 ip_src = '192.168.%02d.1' % in_port
596 for out_port in ports:
597 if in_port == out_port:
598 continue
599 ip_dst = '192.168.%02d.1' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700600 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
601 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
602 pkt = str( parsed_pkt )
603 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700604 # build expected packet
605 mac_dst = '00:00:00:22:22:%02X' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700606 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
607 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
608 pkt = str( exp_pkt )
609 verify_packet( self, pkt, out_port )
610 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700611 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700612 delete_all_flows( self.controller )
613 delete_groups( self.controller, Groups )
614 delete_all_groups( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500615
Flavio Castroa7162bb2016-07-25 17:30:30 -0700616
617class _24VPN( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700618 """ Verify MPLS IP VPN Initiation from /32 rule using ECMP """
Flavio Castro2262fd42016-02-04 19:03:36 -0500619
Flavio Castroa7162bb2016-07-25 17:30:30 -0700620 def runTest( self ):
621 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700622 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700623 if len( config[ "port_map" ] ) < 2:
624 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700625 return
Flavio Castro2262fd42016-02-04 19:03:36 -0500626
Flavio Castroa7162bb2016-07-25 17:30:30 -0700627 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
628 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700629 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700630 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700631 for port in ports:
632 # add l2 interface group
633 id = port
634 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700635 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, True )
636 dst_mac[ 5 ] = vlan_id
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700637 # add MPLS interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700638 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
639 vlan_id, id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700640 # add MPLS L3 VPN group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700641 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
642 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
643 push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32 )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700644 # ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
Flavio Castroa7162bb2016-07-25 17:30:30 -0700645 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700646 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -0700647 add_one_vlan_table_flow( self.controller, port, vlan_id, vrf=0,
648 flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700649 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700650 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700651 # add routing flow
652 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700653 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, mpls_label_gid )
654 Groups._put( l2_gid )
655 Groups._put( mpls_gid )
656 Groups._put( mpls_label_gid )
657 do_barrier( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500658
Flavio Castroa7162bb2016-07-25 17:30:30 -0700659 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700660 for in_port in ports:
661 ip_src = '192.168.%02d.1' % (in_port)
662 for out_port in ports:
663 if in_port == out_port:
664 continue
665 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700666 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
667 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
668 pkt = str( parsed_pkt )
669 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700670 # build expect packet
671 mac_dst = '00:00:00:22:22:%02X' % (out_port)
672 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700673 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port), ip_ttl=63,
674 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
675 label=[ label ] )
676 pkt = str( exp_pkt )
677 verify_packet( self, pkt, out_port )
678 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700679 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700680 delete_all_flows( self.controller )
681 delete_groups( self.controller, Groups )
682 delete_all_groups( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500683
Flavio Castroa7162bb2016-07-25 17:30:30 -0700684
685class _24EcmpVpn( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700686 """ Verify MPLS IP VPN Initiation from /24 rule using ECMP """
Flavio Castro72a45d52015-12-02 16:37:05 -0500687
Flavio Castroa7162bb2016-07-25 17:30:30 -0700688 def runTest( self ):
689 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700690 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700691 if len( config[ "port_map" ] ) < 2:
692 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700693 return
Flavio Castroa7162bb2016-07-25 17:30:30 -0700694 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
695 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700696 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700697 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700698 for port in ports:
699 # add l2 interface group
700 id = port
701 vlan_id = id
Flavio Castroa7162bb2016-07-25 17:30:30 -0700702 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, True )
703 dst_mac[ 5 ] = vlan_id
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700704 # add MPLS interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700705 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
706 vlan_id, id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700707 # add MPLS L3 VPN group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700708 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
709 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
710 push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32 )
711 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ mpls_label_gid ] )
712 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700713 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -0700714 add_one_vlan_table_flow( self.controller, port, vlan_id, vrf=0,
715 flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700716 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700717 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700718 # add routing flow
719 dst_ip = dip + (vlan_id << 8)
720 # add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_label_gid, vrf=2)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700721 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id,
722 vrf=0 )
723 Groups._put( l2_gid )
724 Groups._put( mpls_gid )
725 Groups._put( mpls_label_gid )
726 Groups._put( ecmp_msg.group_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700727
Flavio Castroa7162bb2016-07-25 17:30:30 -0700728 do_barrier( self.controller )
Flavio Castro80730822015-12-11 15:38:47 -0500729
Flavio Castroa7162bb2016-07-25 17:30:30 -0700730 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700731 for in_port in ports:
732 mac_src = '00:00:00:22:22:%02X' % (in_port)
733 ip_src = '192.168.%02d.1' % (in_port)
734 for out_port in ports:
735 if in_port == out_port:
736 continue
737 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700738 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
739 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
740 pkt = str( parsed_pkt )
741 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700742 # build expect packet
743 mac_dst = '00:00:00:22:22:%02X' % out_port
744 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700745 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port), ip_ttl=63,
746 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
747 label=[ label ] )
748 pkt = str( exp_pkt )
749 verify_packet( self, pkt, out_port )
750 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700751 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700752 delete_all_flows( self.controller )
753 delete_groups( self.controller, Groups )
754 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500755
Flavio Castroa7162bb2016-07-25 17:30:30 -0700756
757class FloodGroupMod( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700758 """ Modify referenced group test """
Flavio Castroa7162bb2016-07-25 17:30:30 -0700759
760 def runTest( self ):
761 Groups = Queue.LifoQueue( )
762 try:
763 ports = sorted( config[ "port_map" ].keys( ) )
764 vlan_id = 1
765
766 for port in ports:
767 L2gid, l2msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
768 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
769 Groups.put( L2gid )
770
771 msg = add_l2_flood_group( self.controller, ports, vlan_id, vlan_id )
772 Groups.put( msg.group_id )
773 add_bridge_flow( self.controller, None, vlan_id, msg.group_id, True )
774 do_barrier( self.controller )
775 # verify flood
776 for ofport in ports:
777 # change dest based on port number
778 mac_src = '00:12:34:56:78:%02X' % ofport
779 parsed_pkt = simple_tcp_packet_two_vlan( pktlen=108, out_dl_vlan_enable=True,
780 out_vlan_vid=vlan_id, in_dl_vlan_enable=True, in_vlan_vid=10,
781 eth_dst='00:12:34:56:78:9a', eth_src=mac_src )
782 pkt = str( parsed_pkt )
783 self.dataplane.send( ofport, pkt )
784 # self won't rx packet
785 verify_no_packet( self, pkt, ofport )
786 # others will rx packet
787 tmp_ports = list( ports )
788 tmp_ports.remove( ofport )
789 verify_packets( self, pkt, tmp_ports )
790 verify_no_other_packets( self )
791 msg = mod_l2_flood_group( self.controller, [ ports[ 0 ] ], vlan_id, vlan_id )
792 mac_src = '00:12:34:56:78:%02X' % ports[ 1 ]
793 parsed_pkt = simple_tcp_packet_two_vlan( pktlen=108, out_dl_vlan_enable=True,
794 out_vlan_vid=vlan_id, in_dl_vlan_enable=True, in_vlan_vid=10, eth_dst='00:12:34:56:78:9a',
795 eth_src=mac_src )
796 pkt = str( parsed_pkt )
797 self.dataplane.send( ports[ 1 ], pkt )
798 verify_packets( self, pkt, [ ports[ 0 ] ] )
799 finally:
800 delete_all_flows( self.controller )
801 delete_groups( self.controller, Groups )
802 delete_all_groups( self.controller )
803
804
805class _24ECMPL3( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700806 """ Verifies /24 IP routing using ECMP """
Flavio Castro80730822015-12-11 15:38:47 -0500807
Flavio Castroa7162bb2016-07-25 17:30:30 -0700808 def runTest( self ):
809 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700810 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700811 if len( config[ "port_map" ] ) < 2:
812 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700813 return
Flavio Castro80730822015-12-11 15:38:47 -0500814
Flavio Castroa7162bb2016-07-25 17:30:30 -0700815 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
816 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700817 dip = 0xc0a80001
818 # Hashes Test Name and uses it as id for installing unique groups
Flavio Castroa7162bb2016-07-25 17:30:30 -0700819 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700820 for port in ports:
821 vlan_id = port
822 id = port
823 # add l2 interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700824 l2_gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
825 is_tagged=True, send_barrier=False )
826 dst_mac[ 5 ] = vlan_id
827 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=id,
828 src_mac=intf_src_mac, dst_mac=dst_mac )
829 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ l3_msg.group_id ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700830 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -0700831 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700832 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700833 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700834 # add unicast routing flow
835 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700836 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id )
837 Groups._put( l2_gid )
838 Groups._put( l3_msg.group_id )
839 Groups._put( ecmp_msg.group_id )
840 do_barrier( self.controller )
Flavio Castro72a45d52015-12-02 16:37:05 -0500841
Flavio Castroa7162bb2016-07-25 17:30:30 -0700842 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700843 for in_port in ports:
844 mac_src = '00:00:00:22:22:%02X' % in_port
845 ip_src = '192.168.%02d.1' % in_port
846 for out_port in ports:
847 if in_port == out_port:
848 continue
849 ip_dst = '192.168.%02d.1' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700850 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
851 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
852 pkt = str( parsed_pkt )
853 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700854 # build expected packet
855 mac_dst = '00:00:00:22:22:%02X' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700856 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
857 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
858 pkt = str( exp_pkt )
859 verify_packet( self, pkt, out_port )
860 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700861 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700862 delete_all_flows( self.controller )
863 delete_groups( self.controller, Groups )
864 delete_all_groups( self.controller )
865
Flavio Castro1c9b1252016-02-04 18:42:58 -0500866
Flavio Castroaba28ff2016-02-03 16:47:48 -0500867@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -0700868class MPLSBUG( base_tests.SimpleDataPlane ):
869 def runTest( self ):
870 if len( config[ "port_map" ] ) < 2:
871 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro80730822015-12-11 15:38:47 -0500872 return
Flavio Castroa7162bb2016-07-25 17:30:30 -0700873 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
874 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro1c9b1252016-02-04 18:42:58 -0500875 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700876 Groups = Queue.LifoQueue( )
877 ports = config[ "port_map" ].keys( )
Flavio Castro80730822015-12-11 15:38:47 -0500878 for port in ports:
Flavio Castro1c9b1252016-02-04 18:42:58 -0500879 # add l2 interface group
880 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700881 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
882 dst_mac[ 5 ] = vlan_id
Flavio Castro1c9b1252016-02-04 18:42:58 -0500883 # add L3 Unicast group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700884 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=vlan_id,
885 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500886 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -0700887 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500888 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700889 add_termination_flow( self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24 )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500890 # add mpls flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700891 add_mpls_flow( self.controller, l3_msg.group_id, port )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500892 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -0700893 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500894 # add unicast routing flow
895 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700896 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id )
897 Groups._put( l2_gid )
898 Groups._put( l3_msg.group_id )
899 do_barrier( self.controller )
Flavio Castro80730822015-12-11 15:38:47 -0500900
Flavio Castroa7162bb2016-07-25 17:30:30 -0700901 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro80730822015-12-11 15:38:47 -0500902 for in_port in ports:
Flavio Castro1c9b1252016-02-04 18:42:58 -0500903 mac_src = '00:00:00:22:22:%02X' % in_port
904 ip_src = '192.168.%02d.1' % in_port
Flavio Castro80730822015-12-11 15:38:47 -0500905 for out_port in ports:
906 if in_port == out_port:
Flavio Castro1c9b1252016-02-04 18:42:58 -0500907 continue
908 ip_dst = '192.168.%02d.1' % out_port
Flavio Castro80730822015-12-11 15:38:47 -0500909 switch_mac = "00:00:00:cc:cc:cc"
910 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700911 parsed_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
912 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[ label ] )
913 pkt = str( parsed_pkt )
914 self.dataplane.send( in_port, pkt )
Flavio Castro80730822015-12-11 15:38:47 -0500915
Flavio Castro1c9b1252016-02-04 18:42:58 -0500916 # build expect packet
917 mac_dst = '00:00:00:22:22:%02X' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700918 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
919 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst )
920 pkt = str( exp_pkt )
921 verify_packet( self, pkt, out_port )
922 verify_no_other_packets( self )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500923
Flavio Castroa7162bb2016-07-25 17:30:30 -0700924 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
925 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
926 pkt = str( parsed_pkt )
927 self.dataplane.send( in_port, pkt )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500928 # build expected packet
929 mac_dst = '00:00:00:22:22:%02X' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700930 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
931 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
932 pkt = str( exp_pkt )
933 verify_packet( self, pkt, out_port )
934 verify_no_other_packets( self )
935 delete_all_flows( self.controller )
936 delete_groups( self.controller, Groups )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500937
Flavio Castroa7162bb2016-07-25 17:30:30 -0700938class L3McastToL3( base_tests.SimpleDataPlane ):
Pierbbdf3782016-08-22 17:58:26 -0700939 """
940 Mcast routing, in this test case the traffic comes in tagged.
941 port+1 is used as ingress vlan_id. The packet goes out tagged on
942 different ports. 4094-port is used as egress vlan_id.
943 """
Flavio Castroa7162bb2016-07-25 17:30:30 -0700944 def runTest( self ):
Pier7b031af2016-08-25 15:00:22 -0700945 """
946 port1 (vlan 300)-> All Ports (vlan 300)
947 """
Flavio Castroa7162bb2016-07-25 17:30:30 -0700948 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700949 try:
Pierbbdf3782016-08-22 17:58:26 -0700950 # We can forward on the in_port but egress_vlan has to be different from ingress_vlan
951 if len( config[ "port_map" ] ) < 1:
952 logging.info( "Port count less than 1, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700953 assert (False)
954 return
Pierbbdf3782016-08-22 17:58:26 -0700955 ports = config[ "port_map" ].keys( )
956 dst_ip_str = "224.0.0.1"
957 (
958 port_to_in_vlan,
959 port_to_out_vlan,
960 port_to_src_mac_str,
961 port_to_dst_mac_str,
962 port_to_src_ip_str,
963 port_to_intf_src_mac_str,
964 Groups) = fill_mcast_pipeline_L3toL3(
965 self.controller,
966 logging,
967 ports,
968 is_ingress_tagged = True,
969 is_egress_tagged = True,
970 is_vlan_translated = True,
971 is_max_vlan = False
972 )
Flavio Castro12296312015-12-15 17:48:26 -0500973
Pierbbdf3782016-08-22 17:58:26 -0700974 for in_port in ports:
Flavio Castro12296312015-12-15 17:48:26 -0500975
Pierbbdf3782016-08-22 17:58:26 -0700976 parsed_pkt = simple_udp_packet(
977 pktlen = 100,
978 dl_vlan_enable = True,
979 vlan_vid = port_to_in_vlan[in_port],
980 eth_dst = port_to_dst_mac_str[in_port],
981 eth_src = port_to_src_mac_str[in_port],
982 ip_ttl = 64,
983 ip_src = port_to_src_ip_str[in_port],
984 ip_dst = dst_ip_str
985 )
986 pkt = str( parsed_pkt )
987 self.dataplane.send( in_port, pkt )
Flavio Castro12296312015-12-15 17:48:26 -0500988
Pierbbdf3782016-08-22 17:58:26 -0700989 for out_port in ports:
Flavio Castro12296312015-12-15 17:48:26 -0500990
Pierbbdf3782016-08-22 17:58:26 -0700991 parsed_pkt = simple_udp_packet(
992 pktlen = 100,
993 dl_vlan_enable = True,
994 vlan_vid = port_to_out_vlan[out_port],
995 eth_dst = port_to_dst_mac_str[in_port],
996 eth_src = port_to_intf_src_mac_str[out_port],
997 ip_ttl = 63,
998 ip_src = port_to_src_ip_str[in_port],
999 ip_dst = dst_ip_str
1000 )
1001 pkt = str( parsed_pkt )
1002 verify_packet( self, pkt, out_port )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001003
Pierbbdf3782016-08-22 17:58:26 -07001004 verify_no_other_packets( self )
1005
Pier7b031af2016-08-25 15:00:22 -07001006 parsed_pkt = simple_udp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=vlan_id,
1007 eth_dst=dst_mac_str, eth_src=port1_mac_str, ip_ttl=64, ip_src=src_ip_str,
1008 ip_dst=dst_ip_str )
1009 pkt = str( parsed_pkt )
1010 self.dataplane.send( port1, pkt )
1011 for port in config[ "port_map" ].keys( ):
1012 if port == port2 or port == port1:
1013 verify_no_packet( self, pkt, port )
1014 continue
1015 verify_packet( self, pkt, port )
1016 verify_no_other_packets( self )
1017 finally:
1018 delete_all_flows( self.controller )
1019 delete_groups( self.controller, Groups )
1020 delete_all_groups( self.controller )
1021
1022class L3McastToL2UntagToUntag( base_tests.SimpleDataPlane ):
1023 """
1024 Mcast routing, in this test case the traffic is untagged.
1025 4094 is used as internal vlan_id. The packet goes out
1026 untagged.
1027 """
1028 def runTest( self ):
1029 Groups = Queue.LifoQueue( )
1030 try:
1031 if len( config[ "port_map" ] ) < 2:
1032 logging.info( "Port count less than 2, can't run this case" )
1033 assert (False)
1034 return
1035 ports = config[ "port_map" ].keys( )
1036 dst_ip_str = "224.0.0.1"
1037 (
1038 port_to_in_vlan,
1039 port_to_out_vlan,
1040 port_to_src_mac_str,
1041 port_to_dst_mac_str,
1042 port_to_src_ip_str,
1043 Groups) = fill_mcast_pipeline_L3toL2(
1044 self.controller,
1045 logging,
1046 ports,
1047 is_ingress_tagged = False,
1048 is_egress_tagged = False,
1049 is_vlan_translated = False,
1050 is_max_vlan = True
1051 )
1052
1053 for in_port in ports:
1054
1055 parsed_pkt = simple_udp_packet(
1056 pktlen = 96,
1057 eth_dst = port_to_dst_mac_str[in_port],
1058 eth_src = port_to_src_mac_str[in_port],
1059 ip_ttl = 64,
1060 ip_src = port_to_src_ip_str[in_port],
1061 ip_dst = dst_ip_str
1062 )
1063 pkt = str( parsed_pkt )
1064 self.dataplane.send( in_port, pkt )
1065
1066 for out_port in ports:
1067
1068 parsed_pkt = simple_udp_packet(
1069 pktlen = 96,
1070 eth_dst = port_to_dst_mac_str[in_port],
1071 eth_src = port_to_src_mac_str[in_port],
1072 ip_ttl = 64,
1073 ip_src = port_to_src_ip_str[in_port],
1074 ip_dst = dst_ip_str
1075 )
1076 pkt = str( parsed_pkt )
1077 if out_port == in_port:
1078 verify_no_packet( self, pkt, in_port )
1079 continue
1080 verify_packet( self, pkt, out_port )
1081 verify_no_other_packets( self )
1082 finally:
1083 delete_all_flows( self.controller )
1084 delete_groups( self.controller, Groups )
1085 delete_all_groups( self.controller )
1086
1087class L3McastToL2UntagToTag( base_tests.SimpleDataPlane ):
1088 """
1089 Mcast routing, in this test case the traffic is untagged.
1090 300 is used as vlan_id. The packet goes out
1091 tagged.
1092 """
1093 def runTest( self ):
1094 Groups = Queue.LifoQueue( )
1095 try:
1096 if len( config[ "port_map" ] ) < 2:
1097 logging.info( "Port count less than 2, can't run this case" )
1098 assert (False)
1099 return
1100 ports = config[ "port_map" ].keys( )
1101 dst_ip_str = "224.0.0.1"
1102 (
1103 port_to_in_vlan,
1104 port_to_out_vlan,
1105 port_to_src_mac_str,
1106 port_to_dst_mac_str,
1107 port_to_src_ip_str,
1108 Groups) = fill_mcast_pipeline_L3toL2(
1109 self.controller,
1110 logging,
1111 ports,
1112 is_ingress_tagged = False,
1113 is_egress_tagged = True,
1114 is_vlan_translated = False,
1115 is_max_vlan = False
1116 )
1117
1118 for in_port in ports:
1119
1120 parsed_pkt = simple_udp_packet(
1121 pktlen = 96,
1122 eth_dst = port_to_dst_mac_str[in_port],
1123 eth_src = port_to_src_mac_str[in_port],
1124 ip_ttl = 64,
1125 ip_src = port_to_src_ip_str[in_port],
1126 ip_dst = dst_ip_str
1127 )
1128 pkt = str( parsed_pkt )
1129 self.dataplane.send( in_port, pkt )
1130
1131 for out_port in ports:
1132
1133 parsed_pkt = simple_udp_packet(
1134 pktlen = 100,
1135 dl_vlan_enable = True,
1136 vlan_vid = port_to_out_vlan[in_port],
1137 eth_dst = port_to_dst_mac_str[in_port],
1138 eth_src = port_to_src_mac_str[in_port],
1139 ip_ttl = 64,
1140 ip_src = port_to_src_ip_str[in_port],
1141 ip_dst = dst_ip_str
1142 )
1143 pkt = str( parsed_pkt )
1144 if out_port == in_port:
1145 verify_no_packet( self, pkt, in_port )
1146 continue
1147 verify_packet( self, pkt, out_port )
1148 verify_no_other_packets( self )
1149 finally:
1150 delete_all_flows( self.controller )
1151 delete_groups( self.controller, Groups )
1152 delete_all_groups( self.controller )
1153
1154
1155class L3McastToL2TagToUntag( base_tests.SimpleDataPlane ):
1156 """
1157 Mcast routing, in this test case the traffic is tagged.
1158 300 is used as vlan_id. The packet goes out
1159 untagged.
1160 """
1161 def runTest( self ):
1162 Groups = Queue.LifoQueue( )
1163 try:
1164 if len( config[ "port_map" ] ) < 2:
1165 logging.info( "Port count less than 2, can't run this case" )
1166 assert (False)
1167 return
1168 ports = config[ "port_map" ].keys( )
1169 dst_ip_str = "224.0.0.1"
1170 (
1171 port_to_in_vlan,
1172 port_to_out_vlan,
1173 port_to_src_mac_str,
1174 port_to_dst_mac_str,
1175 port_to_src_ip_str,
1176 Groups) = fill_mcast_pipeline_L3toL2(
1177 self.controller,
1178 logging,
1179 ports,
1180 is_ingress_tagged = True,
1181 is_egress_tagged = False,
1182 is_vlan_translated = False,
1183 is_max_vlan = False
1184 )
1185
1186 for in_port in ports:
1187
1188 parsed_pkt = simple_udp_packet(
1189 pktlen = 100,
1190 dl_vlan_enable = True,
1191 vlan_vid = port_to_in_vlan[in_port],
1192 eth_dst = port_to_dst_mac_str[in_port],
1193 eth_src = port_to_src_mac_str[in_port],
1194 ip_ttl = 64,
1195 ip_src = port_to_src_ip_str[in_port],
1196 ip_dst = dst_ip_str
1197 )
1198 pkt = str( parsed_pkt )
1199 self.dataplane.send( in_port, pkt )
1200
1201 for out_port in ports:
1202
1203 parsed_pkt = simple_udp_packet(
1204 pktlen = 96,
1205 eth_dst = port_to_dst_mac_str[in_port],
1206 eth_src = port_to_src_mac_str[in_port],
1207 ip_ttl = 64,
1208 ip_src = port_to_src_ip_str[in_port],
1209 ip_dst = dst_ip_str
1210 )
1211 pkt = str( parsed_pkt )
1212 if out_port == in_port:
1213 verify_no_packet( self, pkt, in_port )
1214 continue
1215 verify_packet( self, pkt, out_port )
1216 verify_no_other_packets( self )
1217 finally:
1218 delete_all_flows( self.controller )
1219 delete_groups( self.controller, Groups )
1220 delete_all_groups( self.controller )
1221
1222class L3McastToL2TagToTag( base_tests.SimpleDataPlane ):
1223 """
1224 Mcast routing, in this test case the traffic is tagged.
1225 300 is used as vlan_id. The packet goes out tagged.
1226 """
1227 def runTest( self ):
1228 Groups = Queue.LifoQueue( )
1229 try:
1230 if len( config[ "port_map" ] ) < 2:
1231 logging.info( "Port count less than 2, can't run this case" )
1232 assert (False)
1233 return
1234 ports = config[ "port_map" ].keys( )
1235 dst_ip_str = "224.0.0.1"
1236 (
1237 port_to_in_vlan,
1238 port_to_out_vlan,
1239 port_to_src_mac_str,
1240 port_to_dst_mac_str,
1241 port_to_src_ip_str,
1242 Groups) = fill_mcast_pipeline_L3toL2(
1243 self.controller,
1244 logging,
1245 ports,
1246 is_ingress_tagged = True,
1247 is_egress_tagged = True,
1248 is_vlan_translated = False,
1249 is_max_vlan = False
1250 )
1251
1252 for in_port in ports:
1253
1254 parsed_pkt = simple_udp_packet(
1255 pktlen = 100,
1256 dl_vlan_enable = True,
1257 vlan_vid = port_to_in_vlan[in_port],
1258 eth_dst = port_to_dst_mac_str[in_port],
1259 eth_src = port_to_src_mac_str[in_port],
1260 ip_ttl = 64,
1261 ip_src = port_to_src_ip_str[in_port],
1262 ip_dst = dst_ip_str
1263 )
1264 pkt = str( parsed_pkt )
1265 self.dataplane.send( in_port, pkt )
1266
1267 for out_port in ports:
1268
1269 parsed_pkt = simple_udp_packet(
1270 pktlen = 100,
1271 dl_vlan_enable = True,
1272 vlan_vid = port_to_in_vlan[in_port],
1273 eth_dst = port_to_dst_mac_str[in_port],
1274 eth_src = port_to_src_mac_str[in_port],
1275 ip_ttl = 64,
1276 ip_src = port_to_src_ip_str[in_port],
1277 ip_dst = dst_ip_str
1278 )
1279 pkt = str( parsed_pkt )
1280 if out_port == in_port:
1281 verify_no_packet( self, pkt, in_port )
1282 continue
1283 verify_packet( self, pkt, out_port )
1284 verify_no_other_packets( self )
1285 finally:
1286 delete_all_flows( self.controller )
1287 delete_groups( self.controller, Groups )
1288 delete_all_groups( self.controller )
1289
1290class L3McastToL2TagToTagTranslated( base_tests.SimpleDataPlane ):
1291 """
1292 Mcast routing, in this test case the traffic is tagged.
1293 port+1 is used as ingress vlan_id. The packet goes out
1294 tagged. 4094-port is used as egress vlan_id
1295 """
1296 def runTest( self ):
1297 Groups = Queue.LifoQueue( )
1298 try:
1299 if len( config[ "port_map" ] ) < 2:
1300 logging.info( "Port count less than 2, can't run this case" )
1301 assert (False)
1302 return
1303 ports = config[ "port_map" ].keys( )
1304 dst_ip_str = "224.0.0.1"
1305 (
1306 port_to_in_vlan,
1307 port_to_out_vlan,
1308 port_to_src_mac_str,
1309 port_to_dst_mac_str,
1310 port_to_src_ip_str,
1311 Groups) = fill_mcast_pipeline_L3toL2(
1312 self.controller,
1313 logging,
1314 ports,
1315 is_ingress_tagged = True,
1316 is_egress_tagged = True,
1317 is_vlan_translated = True,
1318 is_max_vlan = False
1319 )
1320
1321 for in_port in ports:
1322
1323 parsed_pkt = simple_udp_packet(
1324 pktlen = 100,
1325 dl_vlan_enable = True,
1326 vlan_vid = port_to_in_vlan[in_port],
1327 eth_dst = port_to_dst_mac_str[in_port],
1328 eth_src = port_to_src_mac_str[in_port],
1329 ip_ttl = 64,
1330 ip_src = port_to_src_ip_str[in_port],
1331 ip_dst = dst_ip_str
1332 )
1333 pkt = str( parsed_pkt )
1334 self.dataplane.send( in_port, pkt )
1335
1336 for out_port in ports:
1337
1338 parsed_pkt = simple_udp_packet(
1339 pktlen = 100,
1340 dl_vlan_enable = True,
1341 vlan_vid = port_to_out_vlan[in_port],
1342 eth_dst = port_to_dst_mac_str[in_port],
1343 eth_src = port_to_src_mac_str[in_port],
1344 ip_ttl = 64,
1345 ip_src = port_to_src_ip_str[in_port],
1346 ip_dst = dst_ip_str
1347 )
1348 pkt = str( parsed_pkt )
1349 if out_port == in_port:
1350 verify_no_packet( self, pkt, in_port )
1351 continue
1352 verify_packet( self, pkt, out_port )
1353 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001354 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001355 delete_all_flows( self.controller )
1356 delete_groups( self.controller, Groups )
1357 delete_all_groups( self.controller )
1358
Pierbbdf3782016-08-22 17:58:26 -07001359
Flavio Castroa7162bb2016-07-25 17:30:30 -07001360class _MplsFwd( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -07001361 """ Verify basic MPLS forwarding: Label switch router """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001362
1363 def runTest( self ):
1364 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001365 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001366 if len( config[ "port_map" ] ) < 2:
1367 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001368 return
1369 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07001370 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1371 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001372 # Assigns unique hardcoded test_id to make sure tests don't overlap when writing rules
Flavio Castroa7162bb2016-07-25 17:30:30 -07001373 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001374 for port in ports:
Charles Chan53cac542016-08-22 16:03:26 -07001375 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1376 vlan_id = port + 16
1377 mpls_label = port + 16
1378
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001379 # add l2 interface group
1380 id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001381 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
Charles Chan53cac542016-08-22 16:03:26 -07001382 dst_mac[ 5 ] = port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001383 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
1384 vlan_id, id )
1385 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
1386 subtype=OFDPA_MPLS_GROUP_SUBTYPE_SWAP_LABEL, index=id, ref_gid=mpls_gid,
Charles Chan53cac542016-08-22 16:03:26 -07001387 push_mpls_header=False, set_mpls_label=mpls_label, set_bos=1 )
Pierf3504f82016-08-19 15:32:53 -07001388 ecmp_gid, ecmp_msg = add_mpls_forwarding_group( self.controller,
1389 subtype=OFDPA_MPLS_GROUP_SUBTYPE_ECMP, index=id, ref_gids=[mpls_label_gid] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001390 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -07001391 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001392 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -07001393 add_termination_flow( self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24 )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001394 #add_mpls_flow( self.controller, ecmp_gid, port, goto_table=29 )
Charles Chan53cac542016-08-22 16:03:26 -07001395 add_mpls_flow( self.controller, mpls_label_gid, mpls_label, goto_table=29 )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001396 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001397 Groups._put( l2_gid )
1398 Groups._put( mpls_gid )
1399 Groups._put( mpls_label_gid )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001400 Groups._put( ecmp_gid )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001401 do_barrier( self.controller )
castroflavio30c6cc52016-01-07 15:19:42 -08001402
Flavio Castroa7162bb2016-07-25 17:30:30 -07001403 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001404 for in_port in ports:
1405 ip_src = '192.168.%02d.1' % (in_port)
1406 for out_port in ports:
1407 if in_port == out_port:
1408 continue
Flavio Castro54947942016-02-03 16:05:20 -05001409
Charles Chan53cac542016-08-22 16:03:26 -07001410 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1411 out_mpls_label = out_port + 16
1412 in_vlan_vid = in_port + 16
1413 out_vlan_vid = out_port + 16
1414
1415 ip_dst = '192.168.%02d.1' % (out_port)
1416 label = (out_mpls_label, 0, 1, 32)
1417 parsed_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(in_vlan_vid),
Flavio Castroa7162bb2016-07-25 17:30:30 -07001418 ip_src=ip_src, ip_dst=ip_dst, eth_dst=switch_mac, label=[ label ] )
1419 pkt = str( parsed_pkt )
1420 self.dataplane.send( in_port, pkt )
Flavio Castro54947942016-02-03 16:05:20 -05001421
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001422 # build expect packet
1423 mac_dst = '00:00:00:22:22:%02X' % (out_port)
Charles Chan53cac542016-08-22 16:03:26 -07001424 label = (out_mpls_label, 0, 1, 31)
1425 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_vlan_vid),
Flavio Castroa7162bb2016-07-25 17:30:30 -07001426 ip_src=ip_src, ip_dst=ip_dst, eth_src=switch_mac, eth_dst=mac_dst,
1427 label=[ label ] )
1428 pkt = str( exp_pkt )
1429 verify_packet( self, pkt, out_port )
1430 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001431 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001432 delete_all_flows( self.controller )
1433 delete_groups( self.controller, Groups )
1434 delete_all_groups( self.controller )
Flavio Castrob702a2f2016-04-10 22:01:48 -04001435
Flavio Castroa7162bb2016-07-25 17:30:30 -07001436
1437class _MplsTermination( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -07001438 """ Verify MPLS VPN Termination at penultimate hop """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001439
1440 def runTest( self ):
1441 Groups = Queue.LifoQueue( )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001442 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001443 if len( config[ "port_map" ] ) < 2:
1444 logging.info( "Port count less than 2, can't run this case" )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001445 return
1446 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07001447 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1448 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castrod80fbc32016-07-25 15:54:26 -07001449 # Assigns unique hardcoded test_id to make sure tests don't overlap when writing rules
Flavio Castroa7162bb2016-07-25 17:30:30 -07001450 ports = config[ "port_map" ].keys( )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001451 for port in ports:
Charles Chan53cac542016-08-22 16:03:26 -07001452 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1453 vlan_id = port + 16
1454 mpls_label = port + 16
1455
Flavio Castrod80fbc32016-07-25 15:54:26 -07001456 # add l2 interface group
Charles Chan53cac542016-08-22 16:03:26 -07001457 id, dst_mac[ 5 ] = port, port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001458 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001459 # add L3 Unicast group
Flavio Castroa7162bb2016-07-25 17:30:30 -07001460 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=id,
1461 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001462 # add L3 ecmp group
Flavio Castroa7162bb2016-07-25 17:30:30 -07001463 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ l3_msg.group_id ] )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001464 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -07001465 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001466 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -07001467 add_termination_flow( self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24 )
Charles Chan53cac542016-08-22 16:03:26 -07001468 add_mpls_flow( self.controller, ecmp_msg.group_id, mpls_label )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001469 # add_mpls_flow(self.controller, label=port)
Flavio Castrod80fbc32016-07-25 15:54:26 -07001470 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001471 # add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00,
Flavio Castrod80fbc32016-07-25 15:54:26 -07001472 # ecmp_msg.group_id, 1)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001473 Groups._put( l2_gid )
1474 Groups._put( l3_msg.group_id )
1475 Groups._put( ecmp_msg.group_id )
1476 do_barrier( self.controller )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001477
Flavio Castroa7162bb2016-07-25 17:30:30 -07001478 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001479 for in_port in ports:
1480 ip_src = '192.168.%02d.1' % (in_port)
1481 for out_port in ports:
1482 if in_port == out_port:
1483 continue
Charles Chan53cac542016-08-22 16:03:26 -07001484
1485 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1486 out_mpls_label = out_port + 16
1487 in_vlan_vid = in_port + 16
1488 out_vlan_vid = out_port + 16
1489
Flavio Castrod80fbc32016-07-25 15:54:26 -07001490 ip_dst = '192.168.%02d.1' % (out_port)
Charles Chan53cac542016-08-22 16:03:26 -07001491 label = (out_mpls_label, 0, 1, 32)
1492 parsed_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(in_vlan_vid),
Flavio Castroa7162bb2016-07-25 17:30:30 -07001493 ip_src=ip_src, ip_dst=ip_dst, eth_dst=switch_mac, label=[ label ] )
1494 pkt = str( parsed_pkt )
1495 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001496 # build expect packet
1497 mac_dst = '00:00:00:22:22:%02X' % (out_port)
Charles Chan53cac542016-08-22 16:03:26 -07001498 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(out_vlan_vid),
Flavio Castroa7162bb2016-07-25 17:30:30 -07001499 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst )
1500 pkt = str( exp_pkt )
1501 verify_packet( self, pkt, out_port )
1502 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001503 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001504 delete_all_flows( self.controller )
1505 delete_groups( self.controller, Groups )
1506 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001507
Flavio Castroa7162bb2016-07-25 17:30:30 -07001508
1509class _24UcastTagged( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -07001510 """ Verify /24 IP forwarding to L3 Interface """
Flavio Castro1c9b1252016-02-04 18:42:58 -05001511
Flavio Castroa7162bb2016-07-25 17:30:30 -07001512 def runTest( self ):
1513 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001514 try:
1515 test_id = 26
Flavio Castroa7162bb2016-07-25 17:30:30 -07001516 if len( config[ "port_map" ] ) < 2:
1517 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001518 return
Flavio Castroa7162bb2016-07-25 17:30:30 -07001519 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1520 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001521 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07001522 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001523 for port in ports:
1524 # add l2 interface group
1525 vlan_id = port + test_id
Flavio Castroa7162bb2016-07-25 17:30:30 -07001526 l2gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
1527 is_tagged=True, send_barrier=False )
1528 dst_mac[ 5 ] = vlan_id
1529 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=vlan_id,
1530 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001531 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -07001532 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001533 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -07001534 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001535 # add unicast routing flow
1536 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001537 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, l3_msg.group_id )
1538 Groups.put( l2gid )
1539 Groups.put( l3_msg.group_id )
1540 do_barrier( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001541
Flavio Castroa7162bb2016-07-25 17:30:30 -07001542 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001543 for in_port in ports:
1544 mac_src = '00:00:00:22:22:%02X' % (test_id + in_port)
1545 ip_src = '192.168.%02d.1' % (test_id + in_port)
1546 for out_port in ports:
1547 if in_port == out_port:
1548 continue
1549 ip_dst = '192.168.%02d.1' % (test_id + out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001550 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
1551 vlan_vid=(test_id + in_port), eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64,
1552 ip_src=ip_src, ip_dst=ip_dst )
1553 pkt = str( parsed_pkt )
1554 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001555 # build expected packet
1556 mac_dst = '00:00:00:22:22:%02X' % (test_id + out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001557 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
1558 vlan_vid=(test_id + out_port), eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
1559 ip_src=ip_src, ip_dst=ip_dst )
1560 pkt = str( exp_pkt )
1561 verify_packet( self, pkt, out_port )
1562 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001563 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001564 delete_all_flows( self.controller )
1565 delete_groups( self.controller, Groups )
1566 delete_all_groups( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -07001567
Flavio Castroa7162bb2016-07-25 17:30:30 -07001568
1569class _0Ucast( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -07001570 """ Verify default gateway IP forwarding to L3 Interface ( /0 rule ) """
Flavio Castro91d1a552016-05-17 16:59:44 -07001571
Flavio Castroa7162bb2016-07-25 17:30:30 -07001572 def runTest( self ):
1573 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001574 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001575 if len( config[ "port_map" ] ) < 2:
1576 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001577 return
Flavio Castro91d1a552016-05-17 16:59:44 -07001578
Flavio Castroa7162bb2016-07-25 17:30:30 -07001579 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1580 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001581 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07001582 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001583 for port in ports:
1584 # add l2 interface group
1585 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001586 l2gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id + 1,
1587 is_tagged=True, send_barrier=False )
1588 dst_mac[ 5 ] = vlan_id
1589 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id + 1, id=vlan_id,
1590 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001591 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -07001592 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001593 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -07001594 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001595 # add unicast routing flow
1596 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001597 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id )
1598 Groups.put( l2gid )
1599 Groups.put( l3_msg.group_id )
1600 l3_gid = encode_l3_unicast_group_id( ports[ 0 ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001601 dst_ip = 0x0
Flavio Castroa7162bb2016-07-25 17:30:30 -07001602 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0x0, l3_gid )
1603 do_barrier( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -07001604
Flavio Castroa7162bb2016-07-25 17:30:30 -07001605 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001606 for in_port in ports:
1607 mac_src = '00:00:00:22:22:%02X' % (in_port)
1608 ip_src = '192.168.%02d.1' % (in_port)
1609 for out_port in ports:
1610 if in_port == out_port:
1611 continue
1612 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001613 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
1614 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
1615 pkt = str( parsed_pkt )
1616 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001617 # build expected packet
1618 mac_dst = '00:00:00:22:22:%02X' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001619 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(out_port + 1),
1620 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
1621 pkt = str( exp_pkt )
1622 verify_packet( self, pkt, out_port )
1623 verify_no_other_packets( self )
1624 ip_dst = '1.168.%02d.1' % ports[ 0 ]
1625 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
1626 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
1627 pkt = str( parsed_pkt )
1628 self.dataplane.send( in_port, pkt )
1629 # build expect packet
1630 mac_dst = '00:00:00:22:22:%02X' % ports[ 0 ]
1631 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ] + 1,
1632 ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac )
1633 pkt = str( exp_pkt )
1634 verify_packet( self, pkt, ports[ 0 ] )
1635 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001636 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001637 delete_all_flows( self.controller )
1638 delete_groups( self.controller, Groups )
1639 delete_all_groups( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -07001640
Flavio Castroa7162bb2016-07-25 17:30:30 -07001641
1642class Unfiltered( base_tests.SimpleDataPlane ):
Flavio Castro423df652016-05-17 20:14:08 -04001643 """
Flavio Castro76c5b262016-07-27 19:53:00 -07001644 Attempt to add an unfiltered group: [ATTENTION] this doesn't verify addition
Flavio Castro423df652016-05-17 20:14:08 -04001645 """
Flavio Castro91d1a552016-05-17 16:59:44 -07001646
Flavio Castroa7162bb2016-07-25 17:30:30 -07001647 def runTest( self ):
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001648 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001649 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001650 vlan_id = 1;
1651 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001652 add_l2_unfiltered_group( self.controller, [ port ], False )
1653 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001654 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001655 delete_all_flows( self.controller )
1656 delete_all_groups( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -07001657
Flavio Castroa7162bb2016-07-25 17:30:30 -07001658
1659class L3McastToVPN( base_tests.SimpleDataPlane ):
Flavio Castro423df652016-05-17 20:14:08 -04001660 """
Flavio Castro76c5b262016-07-27 19:53:00 -07001661 Mcast routing and VPN initiation
Flavio Castro423df652016-05-17 20:14:08 -04001662 """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001663
1664 def runTest( self ):
Flavio Castro423df652016-05-17 20:14:08 -04001665 """
1666 port1 (vlan 1)-> port 2 (vlan 2)
1667 """
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001668 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001669 delete_all_flows( self.controller )
1670 delete_all_groups( self.controller )
Flavio Castro423df652016-05-17 20:14:08 -04001671
Flavio Castroa7162bb2016-07-25 17:30:30 -07001672 if len( config[ "port_map" ] ) < 3:
1673 logging.info( "Port count less than 3, can't run this case" )
1674 assert (False)
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001675 return
Flavio Castro423df652016-05-17 20:14:08 -04001676
Flavio Castroa7162bb2016-07-25 17:30:30 -07001677 vlan_id = 1
1678 port2_out_vlan = 2
1679 port3_out_vlan = 3
1680 in_vlan = 1 # macast group vid shall use input vlan diffe from l3 interface use output vlan
1681 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1682 intf_src_mac_str = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
1683 dst_mac = [ 0x01, 0x00, 0x5e, 0x01, 0x01, 0x01 ]
1684 dst_mac_str = ':'.join( [ '%02X' % x for x in dst_mac ] )
1685 port1_mac = [ 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 ]
1686 port1_mac_str = ':'.join( [ '%02X' % x for x in port1_mac ] )
1687 src_ip = 0xc0a80101
1688 src_ip_str = "192.168.1.1"
1689 dst_ip = 0xe0010101
1690 dst_ip_str = "224.1.1.1"
Flavio Castro423df652016-05-17 20:14:08 -04001691
Flavio Castroa7162bb2016-07-25 17:30:30 -07001692 port1 = config[ "port_map" ].keys( )[ 0 ]
1693 port2 = config[ "port_map" ].keys( )[ 1 ]
1694 # port3=config["port_map"].keys()[2]
Flavio Castro423df652016-05-17 20:14:08 -04001695
Flavio Castroa7162bb2016-07-25 17:30:30 -07001696 # add l2 interface group
1697 for port in config[ "port_map" ].keys( ):
1698 add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id, is_tagged=False,
1699 send_barrier=False )
1700 # add vlan flow table
1701 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
1702 vlan_id += 1
Flavio Castro423df652016-05-17 20:14:08 -04001703
Flavio Castroa7162bb2016-07-25 17:30:30 -07001704 # add termination flow
1705 add_termination_flow( self.controller, port1, 0x0800, [ 0x01, 0x00, 0x5e, 0x00, 0x00, 0x00 ],
1706 vlan_id )
Flavio Castro423df652016-05-17 20:14:08 -04001707
Flavio Castroa7162bb2016-07-25 17:30:30 -07001708 # add MPLS interface group
1709 l2_gid = encode_l2_interface_group_id( port2_out_vlan, port2 )
1710 mpls_gid2, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
1711 port2_out_vlan, port2 )
1712 # l2_gid3 = encode_l2_interface_group_id(port3_out_vlan, port3)
1713 # mpls_gid3, mpls_msg = add_mpls_intf_group(self.controller, l2_gid3, dst_mac, intf_src_mac, port3_out_vlan, port3)
1714 # add L3VPN groups
1715 mpls_label_gid2, mpls_label_msg = add_mpls_label_group( self.controller,
1716 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=(0x20000 + port2), ref_gid=mpls_gid2,
1717 push_mpls_header=True, set_mpls_label=port2, set_bos=1, cpy_ttl_outward=True )
1718 # mpls_label_gid3, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001719 # index=(0x10000+port3), ref_gid= mpls_gid3, push_mpls_header=True, set_mpls_label=port3, set_bos=1, cpy_ttl_outward=True)
Flavio Castro423df652016-05-17 20:14:08 -04001720
Flavio Castroa7162bb2016-07-25 17:30:30 -07001721 mcat_group_msg = add_l3_mcast_group( self.controller, in_vlan, 2, [ mpls_label_gid2 ] )
1722 add_mcast4_routing_flow( self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id )
Flavio Castro423df652016-05-17 20:14:08 -04001723
Flavio Castroa7162bb2016-07-25 17:30:30 -07001724 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=1, eth_dst=dst_mac_str,
1725 eth_src=port1_mac_str, ip_ttl=64, ip_src=src_ip_str, ip_dst=dst_ip_str )
1726 pkt = str( parsed_pkt )
1727 self.dataplane.send( port1, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001728 label = (12, 0, 1, 63)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001729 exp_pkt = mpls_packet( pktlen=100, eth_dst=dst_mac_str, eth_src=intf_src_mac_str, ip_ttl=64,
1730 ip_src=src_ip_str, label=[ label ], ip_dst=dst_ip_str )
1731 pkt = str( exp_pkt )
1732 verify_packet( self, pkt, port2 )
1733 # verify_packet(self, pkt, port3)
1734 verify_no_other_packets( self )
1735 delete_all_groups( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001736 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001737 delete_all_flows( self.controller )
1738 delete_all_groups( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001739
Flavio Castro423df652016-05-17 20:14:08 -04001740
Flavio Castroa7162bb2016-07-25 17:30:30 -07001741class PacketInSrcMacMiss( base_tests.SimpleDataPlane ):
Flavio Castro423df652016-05-17 20:14:08 -04001742 """
1743 Test packet in function on a src-mac miss
1744 Send a packet to each dataplane port and verify that a packet
1745 in message is received from the controller for each
1746 #todo verify you stop receiving after adding rule
1747 """
1748
Flavio Castroa7162bb2016-07-25 17:30:30 -07001749 def runTest( self ):
1750 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001751 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001752 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro423df652016-05-17 20:14:08 -04001753
Flavio Castroa7162bb2016-07-25 17:30:30 -07001754 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001755 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001756 L2gid, l2msg = add_one_l2_interface_group( self.controller, port, 1, True, False )
1757 add_one_vlan_table_flow( self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG )
1758 Groups.put( L2gid )
1759 parsed_vlan_pkt = simple_tcp_packet( pktlen=104, vlan_vid=0x1001, dl_vlan_enable=True )
1760 vlan_pkt = str( parsed_vlan_pkt )
1761 for of_port in config[ "port_map" ].keys( ):
1762 logging.info( "PacketInMiss test, port %d", of_port )
1763 self.dataplane.send( of_port, vlan_pkt )
1764 verify_packet_in( self, vlan_pkt, of_port, ofp.OFPR_NO_MATCH )
1765 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001766 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001767 delete_all_flows( self.controller )
1768 delete_all_groups( self.controller )
1769
1770
1771class EcmpGroupMod( base_tests.SimpleDataPlane ):
1772 """
Flavio Castro76c5b262016-07-27 19:53:00 -07001773 Verify referenced group can be modified adding or removing buckets
1774 Attention the hashing behavior may vary according to your porting assigment
1775 Current values are hardcoded for our topology
Flavio Castroa7162bb2016-07-25 17:30:30 -07001776 """
1777
1778 def runTest( self ):
1779 Groups = Queue.LifoQueue( )
1780 try:
1781 if len( config[ "port_map" ] ) < 2:
1782 logging.info( "Port count less than 2, can't run this case" )
1783 return
1784
1785 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1786 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
1787 dip = 0xc0a80001
1788 # Hashes Test Name and uses it as id for installing unique groups
1789 ports = config[ "port_map" ].keys( )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001790 ecmp = [ ]
Flavio Castroa7162bb2016-07-25 17:30:30 -07001791 for port in ports:
1792 vlan_id = port
1793 id = port
1794 # add l2 interface group
1795 l2_gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
1796 is_tagged=True, send_barrier=False )
1797 dst_mac[ 5 ] = vlan_id
1798 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=id,
1799 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001800 ecmp += [ l3_msg.group_id ]
Flavio Castroa7162bb2016-07-25 17:30:30 -07001801 Groups._put( l2_gid )
1802 Groups._put( l3_msg.group_id )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001803 ecmp_msg = add_l3_ecmp_group( self.controller, ports[ 0 ], [ l3_msg.group_id ] )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001804 # add vlan flow table
1805 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
1806 # add termination flow
1807 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
1808 # add unicast routing flow
1809 dst_ip = dip + (vlan_id << 8)
1810 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id )
1811 Groups._put( ecmp_msg.group_id )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001812 mod_l3_ecmp_group( self.controller, ports[ 0 ], ecmp )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001813
1814 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001815 parsed_pkt = exp_pkt = 0
Flavio Castroa7162bb2016-07-25 17:30:30 -07001816 for out_port in ports:
Flavio Castro9debaaa2016-07-26 19:37:50 -07001817 mac_src = '00:00:00:22:22:%02X' % ports[ 0 ]
1818 ip_src = '192.168.%02d.%02d' % (ports[ 0 ], 1)
1819 ip_dst = '192.168.%02d.%02d' % (ports[ 1 ], 1)
1820 tcp = out_port if out_port == 24 else 25
1821 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
1822 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst,
1823 tcp_dport=tcp )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001824 pkt = str( parsed_pkt )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001825 self.dataplane.send( ports[ 0 ], pkt )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001826 # build expected packet
1827 mac_dst = '00:00:00:22:22:%02X' % out_port
1828 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
Flavio Castro9debaaa2016-07-26 19:37:50 -07001829 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst,
1830 tcp_dport=tcp )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001831 pkt = str( exp_pkt )
1832 verify_packet( self, pkt, out_port )
1833 verify_no_other_packets( self )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001834 l3_gid = encode_l3_unicast_group_id( ports[ 0 ] )
1835 mod_l3_ecmp_group( self.controller, ports[ 0 ], [ l3_gid ] )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001836 for port in ports:
Flavio Castro9debaaa2016-07-26 19:37:50 -07001837 mac_src = '00:00:00:22:22:%02X' % ports[ 0 ]
1838 ip_src = '192.168.%02d.%02d' % (ports[ 0 ], 1)
1839 ip_dst = '192.168.%02d.%02d' % (ports[ 1 ], 1)
1840 tcp = port if port == 24 else 25
1841 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
1842 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst,
1843 tcp_dport=tcp )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001844 pkt = str( parsed_pkt )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001845 self.dataplane.send( ports[ 0 ], pkt )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001846 # build expected packet
Flavio Castro9debaaa2016-07-26 19:37:50 -07001847 mac_dst = '00:00:00:22:22:%02X' % ports[ 0 ]
1848 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
1849 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst,
1850 tcp_dport=tcp )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001851 pkt = str( exp_pkt )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001852 verify_packet( self, pkt, ports[ 0 ] )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001853 verify_no_other_packets( self )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001854 mod_l3_ecmp_group( self.controller, ports[ 0 ], [ ] )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001855 for port in ports:
Flavio Castro9debaaa2016-07-26 19:37:50 -07001856 mac_src = '00:00:00:22:22:%02X' % ports[ 0 ]
1857 ip_src = '192.168.%02d.%02d' % (ports[ 0 ], 1)
1858 ip_dst = '192.168.%02d.%02d' % (ports[ 1 ], 1)
1859 tcp = port if port == 24 else 25
1860 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
1861 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst,
1862 tcp_dport=tcp )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001863 pkt = str( parsed_pkt )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001864 self.dataplane.send( ports[ 0 ], pkt )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001865 verify_no_other_packets( self )
1866 finally:
1867 delete_all_flows( self.controller )
1868 delete_groups( self.controller, Groups )
1869 delete_all_groups( self.controller )
Pier8b223022016-08-19 22:47:49 -07001870
1871class Untagged( base_tests.SimpleDataPlane ):
1872 """
1873 Verify VLAN filtering table does not require OFPVID_PRESENT bit to be 0.
1874 This should be fixed in OFDPA 2.0 GA and above, the test fails with
1875 previous versions of the OFDPA.
1876
1877 Two rules are necessary in VLAN table (10):
1878 1) Assignment: match 0x0000/(no mask), set_vlan_vid 0x100A, goto 20
1879 2) Filtering: match 0x100A/0x1FFF, goto 20
1880
1881 In this test case vlan_id = (MAX_INTERNAL_VLAN - port_no).
1882 The remaining part of the test is based on the use of the bridging table
1883 """
1884
1885 MAX_INTERNAL_VLAN = 4094
1886
1887 def runTest( self ):
1888 groups = Queue.LifoQueue( )
1889 try:
1890 if len( config[ "port_map" ] ) < 2:
1891 logging.info( "Port count less than 2, can't run this case" )
1892 return
1893
1894 ports = sorted( config[ "port_map" ].keys( ) )
1895 for port in ports:
1896 vlan_id = Untagged.MAX_INTERNAL_VLAN - port
1897 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
1898 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_UNTAG )
1899 for other_port in ports:
1900 if other_port == port:
1901 continue
1902 L2gid, l2msg = add_one_l2_interface_group( self.controller, other_port, vlan_id, False, False )
1903 groups.put( L2gid )
1904 add_bridge_flow( self.controller, [ 0x00, 0x12, 0x34, 0x56, 0x78, other_port ], vlan_id, L2gid, True )
1905
1906 do_barrier( self.controller )
1907
1908 for out_port in ports:
1909 # change dest based on port number
1910 mac_dst = '00:12:34:56:78:%02X' % out_port
1911 for in_port in ports:
1912 if in_port == out_port:
1913 continue
1914 pkt = str( simple_tcp_packet( eth_dst=mac_dst ) )
1915 self.dataplane.send( in_port, pkt )
1916 for ofport in ports:
1917 if ofport in [ out_port ]:
1918 verify_packet( self, pkt, ofport )
1919 else:
1920 verify_no_packet( self, pkt, ofport )
1921 verify_no_other_packets( self )
1922 finally:
1923 delete_all_flows( self.controller )
Pierf49f79b2016-08-25 15:12:04 -07001924 delete_groups( self.controller, groups )
Pier8b223022016-08-19 22:47:49 -07001925 delete_all_groups( self.controller )