blob: 8957e443027819451f72fa5d7ea0be64c2515a86 [file] [log] [blame]
Flavio Castro05d20bc2015-11-16 15:06:14 -05001"""
Flavio Castroc36621e2015-12-08 12:57:07 -05002The following tests are being done here
Flavio Castro3aec8902015-11-20 10:51:38 -050031) PacketInSrcMacMiss
castroflavio9e715f32015-12-08 14:04:12 -050042) VlanSupport
53) L2FloodQinQ
64) L2FloodTagged
75) L2Flood Tagged Unknown Src
86) L2 Unicast Tagged
97) MTU 1500
108) MTU 4100
119) MTU 4500
1210) L3UnicastTagged
1311) L3VPNMPLS
1412) MPLS Termination
Flavio Castro05d20bc2015-11-16 15:06:14 -050015"""
16
Flavio Castro05d20bc2015-11-16 15:06:14 -050017from oftest import config
Flavio Castro67d8bd52016-02-03 14:22:14 -050018import inspect
Flavio Castro167f5bd2015-12-02 19:33:53 -050019import logging
20import oftest.base_tests as base_tests
Flavio Castro05d20bc2015-11-16 15:06:14 -050021import ofp
22from oftest.testutils import *
23from accton_util import *
Flavio Castrod8f8af22015-12-02 18:19:26 -050024
Flavio Castro67d8bd52016-02-03 14:22:14 -050025@disabled
Flavio Castroaabb5792015-11-18 19:03:50 -050026class PacketInSrcMacMiss(base_tests.SimpleDataPlane):
27 """
28 Test packet in function on a src-mac miss
29 Send a packet to each dataplane port and verify that a packet
30 in message is received from the controller for each
31 #todo verify you stop receiving after adding rule
32 """
33
Flavio Castro6efe1862015-11-18 16:28:06 -050034 def runTest(self):
35 delete_all_flows(self.controller)
36 delete_all_groups(self.controller)
37
Flavio Castro34352e72015-12-07 20:01:51 -050038 ports = sorted(config["port_map"].keys())
39 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -050040 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -050041 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
42
Flavio Castroaabb5792015-11-18 19:03:50 -050043 parsed_vlan_pkt = simple_tcp_packet(pktlen=104,
44 vlan_vid=0x1001, dl_vlan_enable=True)
45 vlan_pkt = str(parsed_vlan_pkt)
Flavio Castro6efe1862015-11-18 16:28:06 -050046
Flavio Castroaabb5792015-11-18 19:03:50 -050047 for of_port in config["port_map"].keys():
48 logging.info("PacketInMiss test, port %d", of_port)
49 self.dataplane.send(of_port, vlan_pkt)
50
51 verify_packet_in(self, vlan_pkt, of_port, ofp.OFPR_NO_MATCH)
52
53 verify_no_other_packets(self)
54
Flavio Castro7fb6ca92015-12-16 15:50:14 -050055class PacketInUDP(base_tests.SimpleDataPlane):
Flavio Castro6d498522015-12-15 14:05:04 -050056 """
57 Test packet in function for a table-miss flow
58 Send a packet to each dataplane port and verify that a packet
59 in message is received from the controller for each
60
61 NOTE: Verify This case the oft option shall not use --switch-ip
62 """
63
64 def runTest(self):
65 delete_all_flows(self.controller)
66 delete_all_groups(self.controller)
67
68 parsed_vlan_pkt = simple_udp_packet(pktlen=104,
69 vlan_vid=0x1001, dl_vlan_enable=True)
70 vlan_pkt = str(parsed_vlan_pkt)
Flavio Castro6d498522015-12-15 14:05:04 -050071 # create match
72 match = ofp.match()
73 match.oxm_list.append(ofp.oxm.eth_type(0x0800))
castroflavio4a09c962016-01-05 13:13:41 -080074 match.oxm_list.append(ofp.oxm.ip_proto(17))
Flavio Castro6d498522015-12-15 14:05:04 -050075 request = ofp.message.flow_add(
76 table_id=60,
77 cookie=42,
78 match=match,
79 instructions=[
80 ofp.instruction.apply_actions(
81 actions=[
82 ofp.action.output(
83 port=ofp.OFPP_CONTROLLER,
Flavio Castro89933f22016-02-03 15:53:16 -050084 max_len=ofp.OFPCML_NO_BUFFER)]), ],
Flavio Castro6d498522015-12-15 14:05:04 -050085 buffer_id=ofp.OFP_NO_BUFFER,
86 priority=1)
87
88 logging.info("Inserting packet in flow to controller")
89 self.controller.message_send(request)
90 do_barrier(self.controller)
91
92 for of_port in config["port_map"].keys():
93 logging.info("PacketInMiss test, port %d", of_port)
94 self.dataplane.send(of_port, vlan_pkt)
95
96 verify_packet_in(self, vlan_pkt, of_port, ofp.OFPR_ACTION)
97
98 verify_no_other_packets(self)
Flavio Castro67d8bd52016-02-03 14:22:14 -050099@disabled
Flavio Castroaf2b4502016-02-02 17:41:32 -0500100class PacketInIPTable(base_tests.SimpleDataPlane):
101 """
102 Test packet in function on IPTABLE
103 Send a packet to each dataplane port and verify that a packet
104 in message is received from the controller for each
105 #todo verify you stop receiving after adding rule
106 """
107
108 def runTest(self):
109 delete_all_flows(self.controller)
110 delete_all_groups(self.controller)
111
112 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
113 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
114 dip=0xc0a80001
115 ports = sorted(config["port_map"].keys())
116 for port in ports:
117 #add l2 interface group
118 vlan_id=port
119 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
120 dst_mac[5]=vlan_id
121 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
122 #add vlan flow table
123 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
124 #add termination flow
125 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
126 #add unicast routing flow
127 dst_ip = dip + (vlan_id<<8)
128 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xfffffff0, l3_msg.group_id, send_ctrl=True)
129
130 do_barrier(self.controller)
131
132 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
133 for in_port in ports:
134 mac_src='00:00:00:22:22:%02X' % in_port
135 ip_src='192.168.%02d.1' % in_port
136 for out_port in ports:
137 if in_port == out_port:
138 continue
139 ip_dst='192.168.%02d.1' % out_port
140 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
141 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
142 ip_dst=ip_dst)
143 pkt=str(parsed_pkt)
144 self.dataplane.send(in_port, pkt)
145 verify_packet_in(self, pkt, in_port, ofp.OFPR_ACTION)
146 #verify_no_other_packets(self)
147
Flavio Castro67d8bd52016-02-03 14:22:14 -0500148@disabled
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500149class ArpNL2(base_tests.SimpleDataPlane):
150 def runTest(self):
151 delete_all_flows(self.controller)
152 delete_all_groups(self.controller)
153
154 ports = sorted(config["port_map"].keys())
155 match = ofp.match()
156 match.oxm_list.append(ofp.oxm.eth_type(0x0806))
157 request = ofp.message.flow_add(
158 table_id=60,
159 cookie=42,
160 match=match,
161 instructions=[
162 ofp.instruction.apply_actions(
163 actions=[
164 ofp.action.output(
165 port=ofp.OFPP_CONTROLLER,
166 max_len=ofp.OFPCML_NO_BUFFER)]),
167 ],
168 buffer_id=ofp.OFP_NO_BUFFER,
169 priority=40000)
170 self.controller.message_send(request)
171 for port in ports:
Flavio Castro932014b2016-01-05 18:29:15 -0500172 add_one_l2_interface_group(self.controller, port, 1, False, False)
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500173 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
174 group_id = encode_l2_interface_group_id(1, port)
175 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
176 do_barrier(self.controller)
177 parsed_arp_pkt = simple_arp_packet()
178 arp_pkt = str(parsed_arp_pkt)
179
180 for out_port in ports:
181 self.dataplane.send(out_port, arp_pkt)
182 verify_packet_in(self, arp_pkt, out_port, ofp.OFPR_ACTION)
183 # change dest based on port number
184 mac_dst= '00:12:34:56:78:%02X' % out_port
185 for in_port in ports:
186 if in_port == out_port:
187 continue
188 # change source based on port number to avoid packet-ins from learning
189 mac_src= '00:12:34:56:78:%02X' % in_port
190 parsed_pkt = simple_tcp_packet(eth_dst=mac_dst, eth_src=mac_src)
191 pkt = str(parsed_pkt)
192 self.dataplane.send(in_port, pkt)
193
194 for ofport in ports:
195 if ofport in [out_port]:
196 verify_packet(self, pkt, ofport)
197 else:
198 verify_no_packet(self, pkt, ofport)
199
200 verify_no_other_packets(self)
201
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500202class PacketInArp(base_tests.SimpleDataPlane):
203 """
204 Test packet in function for a table-miss flow
205 Send a packet to each dataplane port and verify that a packet
206 in message is received from the controller for each
207
208 NOTE: Verify This case the oft option shall not use --switch-ip
209 """
210
211 def runTest(self):
212 delete_all_flows(self.controller)
213 delete_all_groups(self.controller)
214
215 parsed_arp_pkt = simple_arp_packet()
216 arp_pkt = str(parsed_arp_pkt)
217 ports = sorted(config["port_map"].keys())
218 #for port in ports:
219 # add_one_l2_interface_group(self.controller, port, 1, True, False)
220 # add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
221
222 # create match
223 match = ofp.match()
224 match.oxm_list.append(ofp.oxm.eth_type(0x0806))
225 request = ofp.message.flow_add(
226 table_id=60,
227 cookie=42,
228 match=match,
229 instructions=[
230 ofp.instruction.apply_actions(
231 actions=[
232 ofp.action.output(
233 port=ofp.OFPP_CONTROLLER,
234 max_len=ofp.OFPCML_NO_BUFFER)]),
235 ],
236 buffer_id=ofp.OFP_NO_BUFFER,
237 priority=1)
238
239 logging.info("Inserting packet in flow to controller")
240 self.controller.message_send(request)
241 do_barrier(self.controller)
242
243 for of_port in config["port_map"].keys():
244 logging.info("PacketInMiss test, port %d", of_port)
245 self.dataplane.send(of_port, arp_pkt)
246
247 verify_packet_in(self, arp_pkt, of_port, ofp.OFPR_ACTION)
248
249 verify_no_other_packets(self)
250
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500251class L2FloodQinQ(base_tests.SimpleDataPlane):
252 """
Flavio Castroc36621e2015-12-08 12:57:07 -0500253 Test L2 flood of double tagged vlan packets (802.1Q)
254 Sends a double tagged packet and verifies flooding behavior according to outer vlan
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500255 """
256 def runTest(self):
257 ports = sorted(config["port_map"].keys())
258
259 delete_all_flows(self.controller)
260 delete_all_groups(self.controller)
261
262 # Installing flows to avoid packet-in
263 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500264 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500265 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
266
267 group_id = encode_l2_interface_group_id(1, port)
268 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
269 msg=add_l2_flood_group(self.controller, ports, 1, 1)
270 add_bridge_flow(self.controller, None, 1, msg.group_id, True)
271 do_barrier(self.controller)
272
273 #verify flood
274 for ofport in ports:
275 # change dest based on port number
276 mac_src= '00:12:34:56:78:%02X' % ofport
277 parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True, out_vlan_vid=1,
278 in_dl_vlan_enable=True, in_vlan_vid=10, eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
279 pkt = str(parsed_pkt)
280 self.dataplane.send(ofport, pkt)
281 #self won't rx packet
282 verify_no_packet(self, pkt, ofport)
283 #others will rx packet
284 tmp_ports=list(ports)
285 tmp_ports.remove(ofport)
286 verify_packets(self, pkt, tmp_ports)
287
288 verify_no_other_packets(self)
289
Flavio Castro184cefe2015-11-19 20:52:49 -0500290class L2FloodTagged(base_tests.SimpleDataPlane):
291 """
292 Test L2 flood to a vlan
293 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
294 #todo take in account unknown src
295 """
296 def runTest(self):
297 ports = sorted(config["port_map"].keys())
Flavio Castro34352e72015-12-07 20:01:51 -0500298
Flavio Castro184cefe2015-11-19 20:52:49 -0500299 delete_all_flows(self.controller)
300 delete_all_groups(self.controller)
301
Flavio Castro184cefe2015-11-19 20:52:49 -0500302 # Installing flows to avoid packet-in
303 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500304 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500305 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
306
Flavio Castro184cefe2015-11-19 20:52:49 -0500307 group_id = encode_l2_interface_group_id(1, port)
308 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
Flavio Castro34352e72015-12-07 20:01:51 -0500309 msg=add_l2_flood_group(self.controller, ports, 1, 1)
310 add_bridge_flow(self.controller, None, 1, msg.group_id, True)
Flavio Castro184cefe2015-11-19 20:52:49 -0500311 do_barrier(self.controller)
312
313 #verify flood
314 for ofport in ports:
315 # change dest based on port number
316 mac_src= '00:12:34:56:78:%02X' % ofport
317 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
318 pkt = str(parsed_pkt)
319 self.dataplane.send(ofport, pkt)
320 #self won't rx packet
321 verify_no_packet(self, pkt, ofport)
322 #others will rx packet
323 tmp_ports=list(ports)
324 tmp_ports.remove(ofport)
325 verify_packets(self, pkt, tmp_ports)
326
327 verify_no_other_packets(self)
Flavio Castro67d8bd52016-02-03 14:22:14 -0500328@disabled
Flavio Castroaabb5792015-11-18 19:03:50 -0500329class L2FloodTaggedUnknownSrc(base_tests.SimpleDataPlane):
330 """
331 Test L2 flood to a vlan
332 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
333 #todo take in account unknown src
334 """
335 def runTest(self):
Flavio Castroaabb5792015-11-18 19:03:50 -0500336 delete_all_flows(self.controller)
337 delete_all_groups(self.controller)
338
Flavio Castro34352e72015-12-07 20:01:51 -0500339 ports = sorted(config["port_map"].keys())
340 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500341 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500342 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castroaabb5792015-11-18 19:03:50 -0500343
344 msg=add_l2_flood_group(self.controller, ports, 1, 1)
345 add_bridge_flow(self.controller, None, 1, msg.group_id, True)
346
347 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst='00:12:34:56:78:9a')
348 pkt = str(parsed_pkt)
349 #verify flood
350 for ofport in ports:
351 self.dataplane.send(ofport, pkt)
352 #self won't rx packet
353 verify_no_packet(self, pkt, ofport)
354 #others will rx packet
355 tmp_ports=list(ports)
356 tmp_ports.remove(ofport)
357 verify_packets(self, pkt, tmp_ports)
358
359 verify_no_other_packets(self)
360
Flavio Castroaabb5792015-11-18 19:03:50 -0500361class L2UnicastTagged(base_tests.SimpleDataPlane):
362 """
363 Test output function for an exact-match flow
364
365 For each port A, adds a flow directing matching packets to that port.
366 Then, for all other ports B != A, verifies that sending a matching packet
367 to B results in an output to A.
368 """
369 def runTest(self):
370 ports = sorted(config["port_map"].keys())
371
372 delete_all_flows(self.controller)
373 delete_all_groups(self.controller)
374
Flavio Castroaabb5792015-11-18 19:03:50 -0500375 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500376 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500377 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castroaabb5792015-11-18 19:03:50 -0500378 group_id = encode_l2_interface_group_id(1, port)
379 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
Flavio Castro6efe1862015-11-18 16:28:06 -0500380 do_barrier(self.controller)
381
Flavio Castroaabb5792015-11-18 19:03:50 -0500382 for out_port in ports:
383 # change dest based on port number
384 mac_dst= '00:12:34:56:78:%02X' % out_port
385 for in_port in ports:
386 if in_port == out_port:
387 continue
388 # change source based on port number to avoid packet-ins from learning
389 mac_src= '00:12:34:56:78:%02X' % in_port
390 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
391 pkt = str(parsed_pkt)
392 self.dataplane.send(in_port, pkt)
393
394 for ofport in ports:
395 if ofport in [out_port]:
396 verify_packet(self, pkt, ofport)
397 else:
398 verify_no_packet(self, pkt, ofport)
399
400 verify_no_other_packets(self)
Flavio Castro6efe1862015-11-18 16:28:06 -0500401
Flavio Castrob6773032015-11-19 22:49:24 -0500402class Mtu1500(base_tests.SimpleDataPlane):
403
404 def runTest(self):
405 ports = sorted(config["port_map"].keys())
406
407 delete_all_flows(self.controller)
408 delete_all_groups(self.controller)
409
Flavio Castro34352e72015-12-07 20:01:51 -0500410 # set up tag groups for each port
Flavio Castrod4c44d12015-12-08 14:44:18 -0500411 add_l2_interface_group(self.controller, ports, 1, True, 1)
Flavio Castrob6773032015-11-19 22:49:24 -0500412
Flavio Castro34352e72015-12-07 20:01:51 -0500413 add_vlan_table_flow(self.controller, ports)
Flavio Castrob6773032015-11-19 22:49:24 -0500414
415 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500416 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500417 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castrob6773032015-11-19 22:49:24 -0500418 group_id = encode_l2_interface_group_id(1, port)
419 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
420 do_barrier(self.controller)
421
422 for out_port in ports:
423 # change dest based on port number
424 mac_dst= '00:12:34:56:78:%02X' % out_port
425 for in_port in ports:
426 if in_port == out_port:
427 continue
428 # change source based on port number to avoid packet-ins from learning
429 mac_src= '00:12:34:56:78:%02X' % in_port
430 parsed_pkt = simple_tcp_packet(pktlen=1500,dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
431 pkt = str(parsed_pkt)
432 self.dataplane.send(in_port, pkt)
433
434 for ofport in ports:
435 if ofport in [out_port]:
436 verify_packet(self, pkt, ofport)
437 else:
438 verify_no_packet(self, pkt, ofport)
439
440 verify_no_other_packets(self)
441
Flavio Castro67d8bd52016-02-03 14:22:14 -0500442@disabled
Flavio Castrob6773032015-11-19 22:49:24 -0500443class Mtu4000(base_tests.SimpleDataPlane):
444 """
445 Test output function for an exact-match flow
446 For each port A, adds a flow directing matching packets to that port.
447 Then, for all other ports B != A, verifies that sending a matching packet
448 to B results in an output to A.
449 """
450 def runTest(self):
451 ports = sorted(config["port_map"].keys())
452
453 delete_all_flows(self.controller)
454 delete_all_groups(self.controller)
455
456 add_vlan_table_flow(self.controller, config["port_map"].keys())
457
458 # set up tag groups for each port
Flavio Castrod4c44d12015-12-08 14:44:18 -0500459 add_l2_interface_group(self.controller, config["port_map"].keys(), 1, True, 1)
Flavio Castrob6773032015-11-19 22:49:24 -0500460
461 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500462 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500463 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castrob6773032015-11-19 22:49:24 -0500464 group_id = encode_l2_interface_group_id(1, port)
465 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
466 do_barrier(self.controller)
467
468 for out_port in ports:
469 # change dest based on port number
470 mac_dst= '00:12:34:56:78:%02X' % out_port
471 for in_port in ports:
472 if in_port == out_port:
473 continue
474 # change source based on port number to avoid packet-ins from learning
475 mac_src= '00:12:34:56:78:%02X' % in_port
476 parsed_pkt = simple_tcp_packet(pktlen=4000,dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
477 pkt = str(parsed_pkt)
478 self.dataplane.send(in_port, pkt)
479
480 for ofport in ports:
481 if ofport in [out_port]:
482 verify_packet(self, pkt, ofport)
483 else:
484 verify_no_packet(self, pkt, ofport)
485
486 verify_no_other_packets(self)
Flavio Castroaabb5792015-11-18 19:03:50 -0500487
488class L3UcastTagged(base_tests.SimpleDataPlane):
Flavio Castro05d20bc2015-11-16 15:06:14 -0500489 """
Flavio Castro35e64392015-12-02 16:53:14 -0500490 Port1(vid=in_port, src=00:00:00:22:22:in_port, 192.168.outport.1) ,
491 Port2(vid=outport, dst=00:00:00:22:22:outport, 192.168.outport.1)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500492 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500493 def runTest(self):
Flavio Castro05d20bc2015-11-16 15:06:14 -0500494 delete_all_flows(self.controller)
495 delete_all_groups(self.controller)
496
497 if len(config["port_map"]) <2:
498 logging.info("Port count less than 2, can't run this case")
499 return
Flavio Castrod8f8af22015-12-02 18:19:26 -0500500
Flavio Castro05d20bc2015-11-16 15:06:14 -0500501 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
502 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
503 dip=0xc0a80001
Flavio Castroa8233862015-12-02 14:41:11 -0500504 ports = config["port_map"].keys()
505 for port in ports:
Flavio Castro05d20bc2015-11-16 15:06:14 -0500506 #add l2 interface group
Flavio Castroa8233862015-12-02 14:41:11 -0500507 vlan_id=port
castroflaviodd171472015-12-08 13:55:58 -0500508 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500509 dst_mac[5]=vlan_id
510 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
511 #add vlan flow table
Flavio Castro34352e72015-12-07 20:01:51 -0500512 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500513 #add termination flow
Flavio Castrod8f8af22015-12-02 18:19:26 -0500514 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500515 #add unicast routing flow
Flavio Castrod8f8af22015-12-02 18:19:26 -0500516 dst_ip = dip + (vlan_id<<8)
Flavio Castroaf2b4502016-02-02 17:41:32 -0500517 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id)
Flavio Castro6efe1862015-11-18 16:28:06 -0500518 #add entries in the Bridging table to avoid packet-in from mac learning
519 group_id = encode_l2_interface_group_id(vlan_id, port)
520 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500521
522 do_barrier(self.controller)
523
Flavio Castro05d20bc2015-11-16 15:06:14 -0500524 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
Flavio Castroa8233862015-12-02 14:41:11 -0500525 for in_port in ports:
526 mac_src='00:00:00:22:22:%02X' % in_port
527 ip_src='192.168.%02d.1' % in_port
528 for out_port in ports:
529 if in_port == out_port:
530 continue
531 ip_dst='192.168.%02d.1' % out_port
532 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
533 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
Flavio Castrod8f8af22015-12-02 18:19:26 -0500534 ip_dst=ip_dst)
Flavio Castroa8233862015-12-02 14:41:11 -0500535 pkt=str(parsed_pkt)
536 self.dataplane.send(in_port, pkt)
Flavio Castro72a45d52015-12-02 16:37:05 -0500537 #build expected packet
Flavio Castroa8233862015-12-02 14:41:11 -0500538 mac_dst='00:00:00:22:22:%02X' % out_port
Flavio Castrod8f8af22015-12-02 18:19:26 -0500539 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
Flavio Castroa8233862015-12-02 14:41:11 -0500540 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
541 ip_src=ip_src, ip_dst=ip_dst)
542 pkt=str(exp_pkt)
543 verify_packet(self, pkt, out_port)
544 verify_no_other_packets(self)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500545
Flavio Castrod8f8af22015-12-02 18:19:26 -0500546class L3VPNMPLS(base_tests.SimpleDataPlane):
547 """
548 Insert IP packet
549 Receive MPLS packet
550 """
Flavio Castro72a45d52015-12-02 16:37:05 -0500551 def runTest(self):
552 delete_all_flows(self.controller)
553 delete_all_groups(self.controller)
554
555 if len(config["port_map"]) <2:
556 logging.info("Port count less than 2, can't run this case")
557 return
558
559 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
560 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
561 dip=0xc0a80001
Flavio Castro17327782016-02-03 15:20:15 -0500562 #Hashes Test Name and uses it as id for installing unique groups
563 class_id=abs(hash(inspect.stack()[0][3])) % (256)
Flavio Castro72a45d52015-12-02 16:37:05 -0500564 ports = config["port_map"].keys()
565 for port in ports:
566 #add l2 interface group
Flavio Castro17327782016-02-03 15:20:15 -0500567 id=port+class_id<<8
Flavio Castro72a45d52015-12-02 16:37:05 -0500568 vlan_id=port
castroflaviodd171472015-12-08 13:55:58 -0500569 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
Flavio Castro72a45d52015-12-02 16:37:05 -0500570 dst_mac[5]=vlan_id
Flavio Castro35e64392015-12-02 16:53:14 -0500571 #add MPLS interface group
Flavio Castro17327782016-02-03 15:20:15 -0500572 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, id)
Flavio Castro35e64392015-12-02 16:53:14 -0500573 #add MPLS L3 VPN group
Flavio Castrod8f8af22015-12-02 18:19:26 -0500574 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
Flavio Castro17327782016-02-03 15:20:15 -0500575 index=id, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
576 ecmp_msg=add_l3_ecmp_group(self.controller, id, [mpls_label_gid])
Flavio Castro80730822015-12-11 15:38:47 -0500577 do_barrier(self.controller)
Flavio Castro72a45d52015-12-02 16:37:05 -0500578 #add vlan flow table
Flavio Castro17327782016-02-03 15:20:15 -0500579 add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=0, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castro72a45d52015-12-02 16:37:05 -0500580 #add termination flow
581 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro35e64392015-12-02 16:53:14 -0500582 #add routing flow
Flavio Castroaf2b4502016-02-02 17:41:32 -0500583 dst_ip = dip + (vlan_id<<8)
Flavio Castro5edf3132016-01-27 15:45:08 -0500584 #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_label_gid, vrf=2)
Flavio Castro17327782016-02-03 15:20:15 -0500585 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id, vrf=0)
Flavio Castro80730822015-12-11 15:38:47 -0500586
587 do_barrier(self.controller)
588
589 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
590 for in_port in ports:
591 mac_src='00:00:00:22:22:%02X' % in_port
592 ip_src='192.168.%02d.1' % in_port
593 for out_port in ports:
594 if in_port == out_port:
595 continue
596 ip_dst='192.168.%02d.1' % out_port
597 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
598 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
599 ip_dst=ip_dst)
600 pkt=str(parsed_pkt)
601 self.dataplane.send(in_port, pkt)
602 #build expect packet
603 mac_dst='00:00:00:22:22:%02X' % out_port
604 label = (out_port, 0, 1, 32)
605 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=out_port, ip_ttl=63, ip_src=ip_src,
606 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
607 pkt=str(exp_pkt)
608 verify_packet(self, pkt, out_port)
609 verify_no_other_packets(self)
castroflavioee294842016-01-06 15:54:28 -0800610
Flavio Castro80730822015-12-11 15:38:47 -0500611
Flavio Castro67d8bd52016-02-03 14:22:14 -0500612class _32VPN(base_tests.SimpleDataPlane):
Flavio Castro80730822015-12-11 15:38:47 -0500613 """
614 Insert IP packet
615 Receive MPLS packet
616 """
617 def runTest(self):
618 delete_all_flows(self.controller)
619 delete_all_groups(self.controller)
620
621 if len(config["port_map"]) <2:
622 logging.info("Port count less than 2, can't run this case")
623 return
624
625 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
626 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
627 dip=0xc0a80001
Flavio Castro67d8bd52016-02-03 14:22:14 -0500628 #Hashes Test Name and uses it as id for installing unique groups
Flavio Castro443c95e2016-02-03 15:05:28 -0500629 class_id=abs(hash(inspect.stack()[0][3])) % (256)
Flavio Castro80730822015-12-11 15:38:47 -0500630 ports = config["port_map"].keys()
631 for port in ports:
632 #add l2 interface group
Flavio Castro443c95e2016-02-03 15:05:28 -0500633 id=port+class_id<<8
Flavio Castro80730822015-12-11 15:38:47 -0500634 vlan_id=port
635 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
636 dst_mac[5]=vlan_id
637 #add MPLS interface group
Flavio Castro67d8bd52016-02-03 14:22:14 -0500638 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, id)
Flavio Castro80730822015-12-11 15:38:47 -0500639 #add MPLS L3 VPN group
640 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
Flavio Castro67d8bd52016-02-03 14:22:14 -0500641 index=id, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
Flavio Castro80730822015-12-11 15:38:47 -0500642 #ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
643 do_barrier(self.controller)
644 #add vlan flow table
Flavio Castro67d8bd52016-02-03 14:22:14 -0500645 add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=0, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castro80730822015-12-11 15:38:47 -0500646 #add termination flow
647 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
648 #add routing flow
649 dst_ip = dip + (vlan_id<<8)
Flavio Castro67d8bd52016-02-03 14:22:14 -0500650 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, mpls_label_gid)
Flavio Castro72a45d52015-12-02 16:37:05 -0500651
652 do_barrier(self.controller)
653
654 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
655 for in_port in ports:
Flavio Castro72a45d52015-12-02 16:37:05 -0500656 ip_src='192.168.%02d.1' % in_port
657 for out_port in ports:
658 if in_port == out_port:
659 continue
660 ip_dst='192.168.%02d.1' % out_port
661 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
Flavio Castro67d8bd52016-02-03 14:22:14 -0500662 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src,
Flavio Castro72a45d52015-12-02 16:37:05 -0500663 ip_dst=ip_dst)
664 pkt=str(parsed_pkt)
665 self.dataplane.send(in_port, pkt)
666 #build expect packet
667 mac_dst='00:00:00:22:22:%02X' % out_port
668 label = (out_port, 0, 1, 32)
Flavio Castro34352e72015-12-07 20:01:51 -0500669 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=out_port, ip_ttl=63, ip_src=ip_src,
Flavio Castro72a45d52015-12-02 16:37:05 -0500670 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
671 pkt=str(exp_pkt)
672 verify_packet(self, pkt, out_port)
673 verify_no_other_packets(self)
Flavio Castro67d8bd52016-02-03 14:22:14 -0500674@disabled
675class UniqueMplsTermination(base_tests.SimpleDataPlane):
Flavio Castro34352e72015-12-07 20:01:51 -0500676 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500677 Insert IP packet
678 Receive MPLS packet
Flavio Castro34352e72015-12-07 20:01:51 -0500679 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500680 def runTest(self):
681 delete_all_flows(self.controller)
682 delete_all_groups(self.controller)
683
684 if len(config["port_map"]) <2:
685 logging.info("Port count less than 2, can't run this case")
686 return
687
688 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
689 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500690 mcast_mac = [0x01, 0x00, 0x5e, 0x00, 0x00, 0x01]
691
Flavio Castrod8f8af22015-12-02 18:19:26 -0500692 dip=0xc0a80001
693 index=1
694 ports = config["port_map"].keys()
695 for port in ports:
696 #add l2 interface group
697 vlan_id=port
castroflaviodd171472015-12-08 13:55:58 -0500698 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500699 dst_mac[5]=vlan_id
700 #add L3 Unicast group
Flavio Castro932014b2016-01-05 18:29:15 -0500701 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500702 #add L3 ecmp group
703 ecmp_msg = add_l3_ecmp_group(self.controller, port, [l3_msg.group_id])
Flavio Castrod8f8af22015-12-02 18:19:26 -0500704 #add vlan flow table
Flavio Castro80730822015-12-11 15:38:47 -0500705 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500706 #add termination flow
Flavio Castro167f5bd2015-12-02 19:33:53 -0500707 add_termination_flow(self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500708 #add routing flow
709 dst_ip = dip + (vlan_id<<8)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500710 add_mpls_flow(self.controller, ecmp_msg.group_id, port)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500711 #add entries in the Bridging table to avoid packet-in from mac learning
712 group_id = encode_l2_interface_group_id(vlan_id, port)
713 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
714
715 do_barrier(self.controller)
716
717 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
718 for in_port in ports:
719 mac_src='00:00:00:22:22:%02X' % in_port
720 ip_src='192.168.%02d.1' % in_port
721 for out_port in ports:
722 if in_port == out_port:
723 continue
724 ip_dst='192.168.%02d.1' % out_port
Flavio Castro167f5bd2015-12-02 19:33:53 -0500725
726 label = (out_port, 0, 1, 32)
727 parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
728 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[label])
Flavio Castrod8f8af22015-12-02 18:19:26 -0500729 pkt=str(parsed_pkt)
730 self.dataplane.send(in_port, pkt)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500731
Flavio Castrod8f8af22015-12-02 18:19:26 -0500732 #build expect packet
733 mac_dst='00:00:00:22:22:%02X' % out_port
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500734 mcast='01:00:5e:00:00:01'
Flavio Castro167f5bd2015-12-02 19:33:53 -0500735 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
Flavio Castro932014b2016-01-05 18:29:15 -0500736 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500737 pkt=str(exp_pkt)
738 verify_packet(self, pkt, out_port)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500739 verify_no_other_packets(self)
740
Flavio Castro80730822015-12-11 15:38:47 -0500741class MPLSBUG(base_tests.SimpleDataPlane):
742
743 def runTest(self):
744 delete_all_flows(self.controller)
745 delete_all_groups(self.controller)
746
747 if len(config["port_map"]) <2:
748 logging.info("Port count less than 2, can't run this case")
749 return
750
751 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
752 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
753 dip=0xc0a80001
754 index=1
755 ports = config["port_map"].keys()
756 for port in ports:
757 #add l2 interface group
758 vlan_id=port
759 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
760 dst_mac[5]=vlan_id
761 #add L3 Unicast group
762 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
763 #add vlan flow table
764 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
765 #add termination flow
766 add_termination_flow(self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24)
767 #add mpls flow
768 add_mpls_flow(self.controller, l3_msg.group_id, port)
769 #add termination flow
770 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
771 #add unicast routing flow
772 dst_ip = dip + (vlan_id<<8)
Flavio Castroaf2b4502016-02-02 17:41:32 -0500773 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id)
Flavio Castro80730822015-12-11 15:38:47 -0500774
775 #add entries in the Bridging table to avoid packet-in from mac learning
776 group_id = encode_l2_interface_group_id(vlan_id, port)
777 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
778
779 do_barrier(self.controller)
780
781 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
782 for in_port in ports:
783 mac_src='00:00:00:22:22:%02X' % in_port
784 ip_src='192.168.%02d.1' % in_port
785 for out_port in ports:
786 if in_port == out_port:
787 continue
788 ip_dst='192.168.%02d.1' % out_port
789 switch_mac = "00:00:00:cc:cc:cc"
790 label = (out_port, 0, 1, 32)
791 parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
792 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[label])
793 pkt=str(parsed_pkt)
794 self.dataplane.send(in_port, pkt)
795
796 #build expect packet
797 mac_dst='00:00:00:22:22:%02X' % out_port
798 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
799 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst)
800 pkt=str(exp_pkt)
801 verify_packet(self, pkt, out_port)
802 verify_no_other_packets(self)
803
804 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
805 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
806 ip_dst=ip_dst)
807 pkt=str(parsed_pkt)
808 self.dataplane.send(in_port, pkt)
809 #build expected packet
810 mac_dst='00:00:00:22:22:%02X' % out_port
811 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
812 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
813 ip_src=ip_src, ip_dst=ip_dst)
814 pkt=str(exp_pkt)
815 verify_packet(self, pkt, out_port)
816 verify_no_other_packets(self)
817
Flavio Castro12296312015-12-15 17:48:26 -0500818class L3McastToL2(base_tests.SimpleDataPlane):
castroflaviocc403a92015-12-15 14:04:19 -0500819 """
Flavio Castro12296312015-12-15 17:48:26 -0500820 Mcast routing to L2
castroflaviocc403a92015-12-15 14:04:19 -0500821 """
822 def runTest(self):
823 """
824 port1 (vlan 300)-> All Ports (vlan 300)
825 """
Flavio Castro932014b2016-01-05 18:29:15 -0500826 #delete_all_flows(self.controller)
827 #delete_all_groups(self.controller)
castroflaviocc403a92015-12-15 14:04:19 -0500828
castroflavio4a09c962016-01-05 13:13:41 -0800829 if len(config["port_map"]) <3:
830 logging.info("Port count less than 3, can't run this case")
831 assert(False)
castroflaviocc403a92015-12-15 14:04:19 -0500832 return
833
834 vlan_id =300
835 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
836 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
837 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
838 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
839 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
840 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
841 src_ip=0xc0a80101
842 src_ip_str="192.168.1.1"
843 dst_ip=0xe0010101
844 dst_ip_str="224.1.1.1"
845
846 port1=config["port_map"].keys()[0]
847 port2=config["port_map"].keys()[1]
848
849 switch_mac = [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00]
850
851
852 #add l2 interface group
853 l2_intf_group_list=[]
854 for port in config["port_map"].keys():
Flavio Castro89933f22016-02-03 15:53:16 -0500855 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
castroflaviocc403a92015-12-15 14:04:19 -0500856 if port == port2:
857 continue
Flavio Castro12296312015-12-15 17:48:26 -0500858 l2_intf_gid, msg=add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
castroflaviocc403a92015-12-15 14:04:19 -0500859 l2_intf_group_list.append(l2_intf_gid)
castroflaviocc403a92015-12-15 14:04:19 -0500860
861 #add termination flow
862 add_termination_flow(self.controller, port1, 0x0800, switch_mac, vlan_id)
863
864 #add l3 interface group
865 mcat_group_msg=add_l3_mcast_group(self.controller, vlan_id, 2, l2_intf_group_list)
866 add_mcast4_routing_flow(self.controller, vlan_id, src_ip, 0, dst_ip, mcat_group_msg.group_id)
867
Flavio Castro932014b2016-01-05 18:29:15 -0500868 parsed_pkt = simple_udp_packet(pktlen=100,
Flavio Castro89933f22016-02-03 15:53:16 -0500869 dl_vlan_enable=True,
870 vlan_vid=vlan_id,
castroflaviocc403a92015-12-15 14:04:19 -0500871 eth_dst=dst_mac_str,
872 eth_src=port1_mac_str,
873 ip_ttl=64,
874 ip_src=src_ip_str,
875 ip_dst=dst_ip_str)
876 pkt=str(parsed_pkt)
877 self.dataplane.send(port1, pkt)
878 for port in config["port_map"].keys():
Flavio Castro12296312015-12-15 17:48:26 -0500879 if port == port2 or port == port1:
castroflaviocc403a92015-12-15 14:04:19 -0500880 verify_no_packet(self, pkt, port)
Flavio Castro12296312015-12-15 17:48:26 -0500881 continue
castroflaviocc403a92015-12-15 14:04:19 -0500882 verify_packet(self, pkt, port)
883 verify_no_other_packets(self)
884
Flavio Castro12296312015-12-15 17:48:26 -0500885class L3McastToL3(base_tests.SimpleDataPlane):
886 """
887 Mcast routing
888 """
889 def runTest(self):
890 """
891 port1 (vlan 1)-> port 2 (vlan 2)
892 """
893 delete_all_flows(self.controller)
894 delete_all_groups(self.controller)
895
896 if len(config["port_map"]) <3:
castroflavio4a09c962016-01-05 13:13:41 -0800897 logging.info("Port count less than 3, can't run this case")
898 assert(False)
Flavio Castro12296312015-12-15 17:48:26 -0500899 return
900
901 vlan_id =1
902 port2_out_vlan=2
903 port3_out_vlan=3
904 in_vlan=1 #macast group vid shall use input vlan diffe from l3 interface use output vlan
905 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
906 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
907 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
908 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
909 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
910 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
911 src_ip=0xc0a80101
912 src_ip_str="192.168.1.1"
913 dst_ip=0xe0010101
914 dst_ip_str="224.1.1.1"
915
916 port1=config["port_map"].keys()[0]
917 port2=config["port_map"].keys()[1]
918 port3=config["port_map"].keys()[2]
919
920 #add l2 interface group
921 for port in config["port_map"].keys():
922 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=False, send_barrier=False)
923 #add vlan flow table
924 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
925 vlan_id +=1
926
927 #add termination flow
928 add_termination_flow(self.controller, port1, 0x0800, [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00], vlan_id)
929
930 #add l3 interface group
931 port2_ucast_msg=add_l3_interface_group(self.controller, port2, port2_out_vlan, 2, intf_src_mac)
932 port3_ucast_msg=add_l3_interface_group(self.controller, port3, port3_out_vlan, 3, intf_src_mac)
933 mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan, 2, [port2_ucast_msg.group_id, port3_ucast_msg.group_id])
934 add_mcast4_routing_flow(self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id)
935
936 parsed_pkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=1,
937 eth_dst=dst_mac_str,
938 eth_src=port1_mac_str,
939 ip_ttl=64,
940 ip_src=src_ip_str,
941 ip_dst=dst_ip_str)
942 pkt=str(parsed_pkt)
943 self.dataplane.send(port1, pkt)
944 parsed_pkt = simple_udp_packet(pktlen=96,
945 eth_dst=dst_mac_str,
946 eth_src=intf_src_mac_str,
947 ip_ttl=63,
948 ip_src=src_ip_str,
949 ip_dst=dst_ip_str)
950 pkt=str(parsed_pkt)
951 verify_packet(self, pkt, port2)
952 verify_packet(self, pkt, port3)
953 verify_no_other_packets(self)
Flavio Castro89933f22016-02-03 15:53:16 -0500954@disabled
Flavio Castro12296312015-12-15 17:48:26 -0500955class L3McastToVPN(base_tests.SimpleDataPlane):
956 """
957 Mcast routing
958 """
959 def runTest(self):
960 """
961 port1 (vlan 1)-> port 2 (vlan 2)
962 """
963 #delete_all_flows(self.controller)
964 #delete_all_groups(self.controller)
965
966 if len(config["port_map"]) <3:
castroflavio4a09c962016-01-05 13:13:41 -0800967 logging.info("Port count less than 3, can't run this case")
968 assert(False)
Flavio Castro12296312015-12-15 17:48:26 -0500969 return
970
971 vlan_id =1
972 port2_out_vlan=2
973 port3_out_vlan=3
974 in_vlan=1 #macast group vid shall use input vlan diffe from l3 interface use output vlan
975 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
976 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
977 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
978 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
979 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
980 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
981 src_ip=0xc0a80101
982 src_ip_str="192.168.1.1"
983 dst_ip=0xe0010101
984 dst_ip_str="224.1.1.1"
985
986 port1=config["port_map"].keys()[0]
987 port2=config["port_map"].keys()[1]
988 port3=config["port_map"].keys()[2]
989
990 #add l2 interface group
991 for port in config["port_map"].keys():
992 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=False, send_barrier=False)
993 #add vlan flow table
994 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
995 vlan_id +=1
996
997 #add termination flow
998 add_termination_flow(self.controller, port1, 0x0800, [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00], vlan_id)
999
1000 #add MPLS interface group
1001 l2_gid = encode_l2_interface_group_id(port2_out_vlan, port2)
1002 mpls_gid2, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, port2_out_vlan, port2)
1003 l2_gid3 = encode_l2_interface_group_id(port3_out_vlan, port3)
1004 mpls_gid3, mpls_msg = add_mpls_intf_group(self.controller, l2_gid3, dst_mac, intf_src_mac, port3_out_vlan, port3)
1005 #add L3VPN groups
1006 mpls_label_gid2, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
1007 index=(0x20000+port2), ref_gid= mpls_gid2, push_mpls_header=True, set_mpls_label=port2, set_bos=1, cpy_ttl_outward=True)
1008 mpls_label_gid3, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
1009 index=(0x10000+port3), ref_gid= mpls_gid3, push_mpls_header=True, set_mpls_label=port3, set_bos=1, cpy_ttl_outward=True)
1010
Flavio Castro12296312015-12-15 17:48:26 -05001011 mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan, 2, [0x92020022 , 0x92010023])
1012 add_mcast4_routing_flow(self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id)
1013
1014 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=1,
1015 eth_dst=dst_mac_str,
1016 eth_src=port1_mac_str,
1017 ip_ttl=64,
1018 ip_src=src_ip_str,
1019 ip_dst=dst_ip_str)
1020 pkt=str(parsed_pkt)
1021 self.dataplane.send(port1, pkt)
1022 label = (in_vlan, 0, 1, 63)
1023 parsed_pkt = mpls_packet(pktlen=100,
1024 eth_dst=dst_mac_str,
1025 eth_src=intf_src_mac_str,
1026 ip_ttl=63,
1027 ip_src=src_ip_str, label= [label],
1028 ip_dst=dst_ip_str)
1029 pkt=str(parsed_pkt)
1030 verify_packet(self, pkt, port2)
1031 verify_packet(self, pkt, port3)
1032 verify_no_other_packets(self)
Flavio Castro67d8bd52016-02-03 14:22:14 -05001033@disabled
castroflavio30c6cc52016-01-07 15:19:42 -08001034class LPM(base_tests.SimpleDataPlane):
1035 """
1036 Insert IP packet
1037 Receive MPLS packet
1038 """
1039 def runTest(self):
1040 delete_all_flows(self.controller)
1041 delete_all_groups(self.controller)
1042
1043 if len(config["port_map"]) <2:
1044 logging.info("Port count less than 2, can't run this case")
1045 return
1046
1047 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
1048 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
1049 dip=0xc0a80001
1050 index=1
1051 ports = config["port_map"].keys()
1052 for port in ports:
1053 #add l2 interface group
1054 vlan_id=port
1055 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
1056 dst_mac[5]=vlan_id
1057 #add MPLS interface group
1058 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, port)
1059 #add MPLS L3 VPN group
1060 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
1061 index=port, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
Flavio Castro5edf3132016-01-27 15:45:08 -05001062 ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
castroflavio30c6cc52016-01-07 15:19:42 -08001063 do_barrier(self.controller)
1064 #add vlan flow table
Flavio Castroaf2b4502016-02-02 17:41:32 -05001065 add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=0, flag=VLAN_TABLE_FLAG_ONLY_TAG)
castroflavio30c6cc52016-01-07 15:19:42 -08001066 #add termination flow
1067 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
1068 #add routing flow
1069 dst_ip = dip + (vlan_id<<8)
Flavio Castro5edf3132016-01-27 15:45:08 -05001070 #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, mpls_label_gid, vrf=2)
Flavio Castroaf2b4502016-02-02 17:41:32 -05001071 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id)
castroflavio30c6cc52016-01-07 15:19:42 -08001072 #add entries in the Bridging table to avoid packet-in from mac learning
1073 group_id = encode_l2_interface_group_id(vlan_id, port)
1074 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
1075 port = ports[0]
1076 #add l2 interface group
1077 vlan_id=port
1078 l2_gid = encode_l2_interface_group_id(vlan_id, port)
1079 dst_mac[5]=vlan_id
1080 #add MPLS interface group
1081 mpls_gid = encode_mpls_interface_group_id(0, port)
1082 #add MPLS L3 VPN group
1083 mpls_label_gid = encode_mpls_label_group_id(OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=port)
Flavio Castro5edf3132016-01-27 15:45:08 -05001084 ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
castroflavio30c6cc52016-01-07 15:19:42 -08001085 do_barrier(self.controller)
1086 #add routing flow
1087 dst_ip = 0x0
Flavio Castro5edf3132016-01-27 15:45:08 -05001088 #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0x0, mpls_label_gid, vrf=2)
Flavio Castroaf2b4502016-02-02 17:41:32 -05001089 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0x0, ecmp_msg.group_id)
castroflavio30c6cc52016-01-07 15:19:42 -08001090
1091 do_barrier(self.controller)
1092
1093 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
1094 for in_port in ports:
1095 mac_src='00:00:00:22:22:%02X' % in_port
1096 ip_src='192.168.%02d.1' % in_port
1097 for out_port in ports:
1098 if in_port == out_port:
1099 continue
1100 ip_dst='192.168.%02d.1' % out_port
1101 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
1102 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
1103 ip_dst=ip_dst)
1104 pkt=str(parsed_pkt)
1105 self.dataplane.send(in_port, pkt)
1106 #build expect packet
1107 mac_dst='00:00:00:22:22:%02X' % out_port
1108 label = (out_port, 0, 1, 32)
1109 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=out_port, ip_ttl=63, ip_src=ip_src,
1110 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
1111 pkt=str(exp_pkt)
1112 verify_packet(self, pkt, out_port)
1113 verify_no_other_packets(self)
Flavio Castroaf2b4502016-02-02 17:41:32 -05001114 ip_dst='1.168.%02d.1' % ports[0]
castroflavio30c6cc52016-01-07 15:19:42 -08001115 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
1116 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst)
1117 pkt=str(parsed_pkt)
1118 self.dataplane.send(in_port, pkt)
1119 #build expect packet
Flavio Castroaf2b4502016-02-02 17:41:32 -05001120 mac_dst='00:00:00:22:22:%02X' % ports[0]
1121 label = (ports[0], 0, 1, 32)
1122 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=ports[0], ip_ttl=63, ip_src=ip_src,
castroflavio30c6cc52016-01-07 15:19:42 -08001123 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
1124 pkt=str(exp_pkt)
Flavio Castroaf2b4502016-02-02 17:41:32 -05001125 verify_packet(self, pkt, ports[0])
castroflavio30c6cc52016-01-07 15:19:42 -08001126 verify_no_other_packets(self)