blob: 6cc8bba506902ad6527c943e64fbc77866b61a93 [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 Castro167f5bd2015-12-02 19:33:53 -050018import logging
19import oftest.base_tests as base_tests
Flavio Castro05d20bc2015-11-16 15:06:14 -050020import ofp
21from oftest.testutils import *
22from accton_util import *
Flavio Castrod8f8af22015-12-02 18:19:26 -050023
Flavio Castrof2ff2d32016-02-03 14:22:14 -050024@disabled
Flavio Castroaabb5792015-11-18 19:03:50 -050025class PacketInSrcMacMiss(base_tests.SimpleDataPlane):
26 """
27 Test packet in function on a src-mac miss
28 Send a packet to each dataplane port and verify that a packet
29 in message is received from the controller for each
30 #todo verify you stop receiving after adding rule
31 """
32
Flavio Castro6efe1862015-11-18 16:28:06 -050033 def runTest(self):
34 delete_all_flows(self.controller)
35 delete_all_groups(self.controller)
36
Flavio Castro34352e72015-12-07 20:01:51 -050037 ports = sorted(config["port_map"].keys())
38 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -050039 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -050040 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
41
Flavio Castroaabb5792015-11-18 19:03:50 -050042 parsed_vlan_pkt = simple_tcp_packet(pktlen=104,
43 vlan_vid=0x1001, dl_vlan_enable=True)
44 vlan_pkt = str(parsed_vlan_pkt)
Flavio Castro6efe1862015-11-18 16:28:06 -050045
Flavio Castroaabb5792015-11-18 19:03:50 -050046 for of_port in config["port_map"].keys():
47 logging.info("PacketInMiss test, port %d", of_port)
48 self.dataplane.send(of_port, vlan_pkt)
49
50 verify_packet_in(self, vlan_pkt, of_port, ofp.OFPR_NO_MATCH)
51
52 verify_no_other_packets(self)
53
Flavio Castro7fb6ca92015-12-16 15:50:14 -050054class PacketInUDP(base_tests.SimpleDataPlane):
Flavio Castro6d498522015-12-15 14:05:04 -050055 """
56 Test packet in function for a table-miss flow
57 Send a packet to each dataplane port and verify that a packet
58 in message is received from the controller for each
59
60 NOTE: Verify This case the oft option shall not use --switch-ip
61 """
62
63 def runTest(self):
64 delete_all_flows(self.controller)
65 delete_all_groups(self.controller)
66
67 parsed_vlan_pkt = simple_udp_packet(pktlen=104,
68 vlan_vid=0x1001, dl_vlan_enable=True)
69 vlan_pkt = str(parsed_vlan_pkt)
Flavio Castro6d498522015-12-15 14:05:04 -050070 # create match
71 match = ofp.match()
72 match.oxm_list.append(ofp.oxm.eth_type(0x0800))
castroflavio4a09c962016-01-05 13:13:41 -080073 match.oxm_list.append(ofp.oxm.ip_proto(17))
Flavio Castro6d498522015-12-15 14:05:04 -050074 request = ofp.message.flow_add(
75 table_id=60,
76 cookie=42,
77 match=match,
78 instructions=[
79 ofp.instruction.apply_actions(
80 actions=[
81 ofp.action.output(
82 port=ofp.OFPP_CONTROLLER,
83 max_len=ofp.OFPCML_NO_BUFFER)]),
84 ],
85 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 Castrof2ff2d32016-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 Castrof2ff2d32016-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 Castrof2ff2d32016-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 Castrof2ff2d32016-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
562 index=1
563 ports = config["port_map"].keys()
564 for port in ports:
565 #add l2 interface group
566 vlan_id=port
castroflaviodd171472015-12-08 13:55:58 -0500567 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
Flavio Castro72a45d52015-12-02 16:37:05 -0500568 dst_mac[5]=vlan_id
Flavio Castro35e64392015-12-02 16:53:14 -0500569 #add MPLS interface group
Flavio Castro72a45d52015-12-02 16:37:05 -0500570 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, port)
Flavio Castro35e64392015-12-02 16:53:14 -0500571 #add MPLS L3 VPN group
Flavio Castrod8f8af22015-12-02 18:19:26 -0500572 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
Flavio Castro72a45d52015-12-02 16:37:05 -0500573 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 -0500574 ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
Flavio Castro80730822015-12-11 15:38:47 -0500575 do_barrier(self.controller)
Flavio Castro72a45d52015-12-02 16:37:05 -0500576 #add vlan flow table
Flavio Castro80730822015-12-11 15:38:47 -0500577 add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=2, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castro72a45d52015-12-02 16:37:05 -0500578 #add termination flow
579 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro35e64392015-12-02 16:53:14 -0500580 #add routing flow
Flavio Castroaf2b4502016-02-02 17:41:32 -0500581 dst_ip = dip + (vlan_id<<8)
Flavio Castro5edf3132016-01-27 15:45:08 -0500582 #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_label_gid, vrf=2)
583 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id, vrf=2)
Flavio Castro80730822015-12-11 15:38:47 -0500584 #add entries in the Bridging table to avoid packet-in from mac learning
585 group_id = encode_l2_interface_group_id(vlan_id, port)
586 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
587
588 do_barrier(self.controller)
589
590 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
591 for in_port in ports:
592 mac_src='00:00:00:22:22:%02X' % in_port
593 ip_src='192.168.%02d.1' % in_port
594 for out_port in ports:
595 if in_port == out_port:
596 continue
597 ip_dst='192.168.%02d.1' % out_port
598 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
599 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
600 ip_dst=ip_dst)
601 pkt=str(parsed_pkt)
602 self.dataplane.send(in_port, pkt)
603 #build expect packet
604 mac_dst='00:00:00:22:22:%02X' % out_port
605 label = (out_port, 0, 1, 32)
606 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=out_port, ip_ttl=63, ip_src=ip_src,
607 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
608 pkt=str(exp_pkt)
609 verify_packet(self, pkt, out_port)
610 verify_no_other_packets(self)
castroflavioee294842016-01-06 15:54:28 -0800611
Flavio Castro80730822015-12-11 15:38:47 -0500612
Flavio Castrof2ff2d32016-02-03 14:22:14 -0500613class _32VPN(base_tests.SimpleDataPlane):
Flavio Castro80730822015-12-11 15:38:47 -0500614 """
615 Insert IP packet
616 Receive MPLS packet
617 """
618 def runTest(self):
619 delete_all_flows(self.controller)
620 delete_all_groups(self.controller)
621
622 if len(config["port_map"]) <2:
623 logging.info("Port count less than 2, can't run this case")
624 return
625
626 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
627 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
628 dip=0xc0a80001
629 index=1
630 ports = config["port_map"].keys()
631 for port in ports:
632 #add l2 interface group
633 vlan_id=port
634 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
635 dst_mac[5]=vlan_id
636 #add MPLS interface group
637 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, port)
638 #add MPLS L3 VPN group
639 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
640 index=port, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
641 #ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
642 do_barrier(self.controller)
643 #add vlan flow table
Flavio Castrof2ff2d32016-02-03 14:22:14 -0500644 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 -0500645 #add termination flow
646 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
647 #add routing flow
648 dst_ip = dip + (vlan_id<<8)
Flavio Castrof2ff2d32016-02-03 14:22:14 -0500649 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, mpls_label_gid)
Flavio Castro72a45d52015-12-02 16:37:05 -0500650 #add entries in the Bridging table to avoid packet-in from mac learning
651 group_id = encode_l2_interface_group_id(vlan_id, port)
652 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
653
654 do_barrier(self.controller)
655
656 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
657 for in_port in ports:
658 mac_src='00:00:00:22:22:%02X' % in_port
659 ip_src='192.168.%02d.1' % in_port
660 for out_port in ports:
661 if in_port == out_port:
662 continue
663 ip_dst='192.168.%02d.1' % out_port
664 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
665 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
666 ip_dst=ip_dst)
667 pkt=str(parsed_pkt)
668 self.dataplane.send(in_port, pkt)
669 #build expect packet
670 mac_dst='00:00:00:22:22:%02X' % out_port
671 label = (out_port, 0, 1, 32)
Flavio Castro34352e72015-12-07 20:01:51 -0500672 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 -0500673 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
674 pkt=str(exp_pkt)
675 verify_packet(self, pkt, out_port)
676 verify_no_other_packets(self)
Flavio Castrof2ff2d32016-02-03 14:22:14 -0500677@disabled
678class UniqueMplsTermination(base_tests.SimpleDataPlane):
Flavio Castro34352e72015-12-07 20:01:51 -0500679 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500680 Insert IP packet
681 Receive MPLS packet
Flavio Castro34352e72015-12-07 20:01:51 -0500682 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500683 def runTest(self):
684 delete_all_flows(self.controller)
685 delete_all_groups(self.controller)
686
687 if len(config["port_map"]) <2:
688 logging.info("Port count less than 2, can't run this case")
689 return
690
691 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
692 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500693 mcast_mac = [0x01, 0x00, 0x5e, 0x00, 0x00, 0x01]
694
Flavio Castrod8f8af22015-12-02 18:19:26 -0500695 dip=0xc0a80001
696 index=1
697 ports = config["port_map"].keys()
698 for port in ports:
699 #add l2 interface group
700 vlan_id=port
castroflaviodd171472015-12-08 13:55:58 -0500701 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500702 dst_mac[5]=vlan_id
703 #add L3 Unicast group
Flavio Castro932014b2016-01-05 18:29:15 -0500704 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 -0500705 #add L3 ecmp group
706 ecmp_msg = add_l3_ecmp_group(self.controller, port, [l3_msg.group_id])
Flavio Castrod8f8af22015-12-02 18:19:26 -0500707 #add vlan flow table
Flavio Castro80730822015-12-11 15:38:47 -0500708 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500709 #add termination flow
Flavio Castro167f5bd2015-12-02 19:33:53 -0500710 add_termination_flow(self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500711 #add routing flow
712 dst_ip = dip + (vlan_id<<8)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500713 add_mpls_flow(self.controller, ecmp_msg.group_id, port)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500714 #add entries in the Bridging table to avoid packet-in from mac learning
715 group_id = encode_l2_interface_group_id(vlan_id, port)
716 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
717
718 do_barrier(self.controller)
719
720 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
721 for in_port in ports:
722 mac_src='00:00:00:22:22:%02X' % in_port
723 ip_src='192.168.%02d.1' % in_port
724 for out_port in ports:
725 if in_port == out_port:
726 continue
727 ip_dst='192.168.%02d.1' % out_port
Flavio Castro167f5bd2015-12-02 19:33:53 -0500728
729 label = (out_port, 0, 1, 32)
730 parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
731 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[label])
Flavio Castrod8f8af22015-12-02 18:19:26 -0500732 pkt=str(parsed_pkt)
733 self.dataplane.send(in_port, pkt)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500734
Flavio Castrod8f8af22015-12-02 18:19:26 -0500735 #build expect packet
736 mac_dst='00:00:00:22:22:%02X' % out_port
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500737 mcast='01:00:5e:00:00:01'
Flavio Castro167f5bd2015-12-02 19:33:53 -0500738 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
Flavio Castro932014b2016-01-05 18:29:15 -0500739 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 -0500740 pkt=str(exp_pkt)
741 verify_packet(self, pkt, out_port)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500742 verify_no_other_packets(self)
743
Flavio Castro80730822015-12-11 15:38:47 -0500744class MPLSBUG(base_tests.SimpleDataPlane):
745
746 def runTest(self):
747 delete_all_flows(self.controller)
748 delete_all_groups(self.controller)
749
750 if len(config["port_map"]) <2:
751 logging.info("Port count less than 2, can't run this case")
752 return
753
754 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
755 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
756 dip=0xc0a80001
757 index=1
758 ports = config["port_map"].keys()
759 for port in ports:
760 #add l2 interface group
761 vlan_id=port
762 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
763 dst_mac[5]=vlan_id
764 #add L3 Unicast group
765 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
766 #add vlan flow table
767 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
768 #add termination flow
769 add_termination_flow(self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24)
770 #add mpls flow
771 add_mpls_flow(self.controller, l3_msg.group_id, port)
772 #add termination flow
773 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
774 #add unicast routing flow
775 dst_ip = dip + (vlan_id<<8)
Flavio Castroaf2b4502016-02-02 17:41:32 -0500776 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id)
Flavio Castro80730822015-12-11 15:38:47 -0500777
778 #add entries in the Bridging table to avoid packet-in from mac learning
779 group_id = encode_l2_interface_group_id(vlan_id, port)
780 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
781
782 do_barrier(self.controller)
783
784 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
785 for in_port in ports:
786 mac_src='00:00:00:22:22:%02X' % in_port
787 ip_src='192.168.%02d.1' % in_port
788 for out_port in ports:
789 if in_port == out_port:
790 continue
791 ip_dst='192.168.%02d.1' % out_port
792 switch_mac = "00:00:00:cc:cc:cc"
793 label = (out_port, 0, 1, 32)
794 parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
795 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[label])
796 pkt=str(parsed_pkt)
797 self.dataplane.send(in_port, pkt)
798
799 #build expect packet
800 mac_dst='00:00:00:22:22:%02X' % out_port
801 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
802 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst)
803 pkt=str(exp_pkt)
804 verify_packet(self, pkt, out_port)
805 verify_no_other_packets(self)
806
807 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
808 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
809 ip_dst=ip_dst)
810 pkt=str(parsed_pkt)
811 self.dataplane.send(in_port, pkt)
812 #build expected packet
813 mac_dst='00:00:00:22:22:%02X' % out_port
814 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
815 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
816 ip_src=ip_src, ip_dst=ip_dst)
817 pkt=str(exp_pkt)
818 verify_packet(self, pkt, out_port)
819 verify_no_other_packets(self)
820
Flavio Castro12296312015-12-15 17:48:26 -0500821class L3McastToL2(base_tests.SimpleDataPlane):
castroflaviocc403a92015-12-15 14:04:19 -0500822 """
Flavio Castro12296312015-12-15 17:48:26 -0500823 Mcast routing to L2
castroflaviocc403a92015-12-15 14:04:19 -0500824 """
825 def runTest(self):
826 """
827 port1 (vlan 300)-> All Ports (vlan 300)
828 """
Flavio Castro932014b2016-01-05 18:29:15 -0500829 #delete_all_flows(self.controller)
830 #delete_all_groups(self.controller)
castroflaviocc403a92015-12-15 14:04:19 -0500831
castroflavio4a09c962016-01-05 13:13:41 -0800832 if len(config["port_map"]) <3:
833 logging.info("Port count less than 3, can't run this case")
834 assert(False)
castroflaviocc403a92015-12-15 14:04:19 -0500835 return
836
837 vlan_id =300
838 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
839 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
840 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
841 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
842 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
843 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
844 src_ip=0xc0a80101
845 src_ip_str="192.168.1.1"
846 dst_ip=0xe0010101
847 dst_ip_str="224.1.1.1"
848
849 port1=config["port_map"].keys()[0]
850 port2=config["port_map"].keys()[1]
851
852 switch_mac = [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00]
853
854
855 #add l2 interface group
856 l2_intf_group_list=[]
857 for port in config["port_map"].keys():
Flavio Castro932014b2016-01-05 18:29:15 -0500858 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=4)
castroflaviocc403a92015-12-15 14:04:19 -0500859 if port == port2:
860 continue
Flavio Castro12296312015-12-15 17:48:26 -0500861 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 -0500862 l2_intf_group_list.append(l2_intf_gid)
castroflaviocc403a92015-12-15 14:04:19 -0500863
864 #add termination flow
865 add_termination_flow(self.controller, port1, 0x0800, switch_mac, vlan_id)
866
867 #add l3 interface group
868 mcat_group_msg=add_l3_mcast_group(self.controller, vlan_id, 2, l2_intf_group_list)
869 add_mcast4_routing_flow(self.controller, vlan_id, src_ip, 0, dst_ip, mcat_group_msg.group_id)
870
Flavio Castro932014b2016-01-05 18:29:15 -0500871 parsed_pkt = simple_udp_packet(pktlen=100,
872 dl_vlan_enable=True,
castroflaviocc403a92015-12-15 14:04:19 -0500873 eth_dst=dst_mac_str,
874 eth_src=port1_mac_str,
875 ip_ttl=64,
876 ip_src=src_ip_str,
877 ip_dst=dst_ip_str)
878 pkt=str(parsed_pkt)
879 self.dataplane.send(port1, pkt)
880 for port in config["port_map"].keys():
Flavio Castro12296312015-12-15 17:48:26 -0500881 if port == port2 or port == port1:
castroflaviocc403a92015-12-15 14:04:19 -0500882 verify_no_packet(self, pkt, port)
Flavio Castro12296312015-12-15 17:48:26 -0500883 continue
castroflaviocc403a92015-12-15 14:04:19 -0500884 verify_packet(self, pkt, port)
885 verify_no_other_packets(self)
886
Flavio Castro12296312015-12-15 17:48:26 -0500887class L3McastToL3(base_tests.SimpleDataPlane):
888 """
889 Mcast routing
890 """
891 def runTest(self):
892 """
893 port1 (vlan 1)-> port 2 (vlan 2)
894 """
895 delete_all_flows(self.controller)
896 delete_all_groups(self.controller)
897
898 if len(config["port_map"]) <3:
castroflavio4a09c962016-01-05 13:13:41 -0800899 logging.info("Port count less than 3, can't run this case")
900 assert(False)
Flavio Castro12296312015-12-15 17:48:26 -0500901 return
902
903 vlan_id =1
904 port2_out_vlan=2
905 port3_out_vlan=3
906 in_vlan=1 #macast group vid shall use input vlan diffe from l3 interface use output vlan
907 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
908 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
909 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
910 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
911 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
912 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
913 src_ip=0xc0a80101
914 src_ip_str="192.168.1.1"
915 dst_ip=0xe0010101
916 dst_ip_str="224.1.1.1"
917
918 port1=config["port_map"].keys()[0]
919 port2=config["port_map"].keys()[1]
920 port3=config["port_map"].keys()[2]
921
922 #add l2 interface group
923 for port in config["port_map"].keys():
924 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=False, send_barrier=False)
925 #add vlan flow table
926 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
927 vlan_id +=1
928
929 #add termination flow
930 add_termination_flow(self.controller, port1, 0x0800, [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00], vlan_id)
931
932 #add l3 interface group
933 port2_ucast_msg=add_l3_interface_group(self.controller, port2, port2_out_vlan, 2, intf_src_mac)
934 port3_ucast_msg=add_l3_interface_group(self.controller, port3, port3_out_vlan, 3, intf_src_mac)
935 mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan, 2, [port2_ucast_msg.group_id, port3_ucast_msg.group_id])
936 add_mcast4_routing_flow(self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id)
937
938 parsed_pkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=1,
939 eth_dst=dst_mac_str,
940 eth_src=port1_mac_str,
941 ip_ttl=64,
942 ip_src=src_ip_str,
943 ip_dst=dst_ip_str)
944 pkt=str(parsed_pkt)
945 self.dataplane.send(port1, pkt)
946 parsed_pkt = simple_udp_packet(pktlen=96,
947 eth_dst=dst_mac_str,
948 eth_src=intf_src_mac_str,
949 ip_ttl=63,
950 ip_src=src_ip_str,
951 ip_dst=dst_ip_str)
952 pkt=str(parsed_pkt)
953 verify_packet(self, pkt, port2)
954 verify_packet(self, pkt, port3)
955 verify_no_other_packets(self)
956
957class L3McastToVPN(base_tests.SimpleDataPlane):
958 """
959 Mcast routing
960 """
961 def runTest(self):
962 """
963 port1 (vlan 1)-> port 2 (vlan 2)
964 """
965 #delete_all_flows(self.controller)
966 #delete_all_groups(self.controller)
967
968 if len(config["port_map"]) <3:
castroflavio4a09c962016-01-05 13:13:41 -0800969 logging.info("Port count less than 3, can't run this case")
970 assert(False)
Flavio Castro12296312015-12-15 17:48:26 -0500971 return
972
973 vlan_id =1
974 port2_out_vlan=2
975 port3_out_vlan=3
976 in_vlan=1 #macast group vid shall use input vlan diffe from l3 interface use output vlan
977 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
978 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
979 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
980 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
981 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
982 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
983 src_ip=0xc0a80101
984 src_ip_str="192.168.1.1"
985 dst_ip=0xe0010101
986 dst_ip_str="224.1.1.1"
987
988 port1=config["port_map"].keys()[0]
989 port2=config["port_map"].keys()[1]
990 port3=config["port_map"].keys()[2]
991
992 #add l2 interface group
993 for port in config["port_map"].keys():
994 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=False, send_barrier=False)
995 #add vlan flow table
996 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
997 vlan_id +=1
998
999 #add termination flow
1000 add_termination_flow(self.controller, port1, 0x0800, [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00], vlan_id)
1001
1002 #add MPLS interface group
1003 l2_gid = encode_l2_interface_group_id(port2_out_vlan, port2)
1004 mpls_gid2, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, port2_out_vlan, port2)
1005 l2_gid3 = encode_l2_interface_group_id(port3_out_vlan, port3)
1006 mpls_gid3, mpls_msg = add_mpls_intf_group(self.controller, l2_gid3, dst_mac, intf_src_mac, port3_out_vlan, port3)
1007 #add L3VPN groups
1008 mpls_label_gid2, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
1009 index=(0x20000+port2), ref_gid= mpls_gid2, push_mpls_header=True, set_mpls_label=port2, set_bos=1, cpy_ttl_outward=True)
1010 mpls_label_gid3, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
1011 index=(0x10000+port3), ref_gid= mpls_gid3, push_mpls_header=True, set_mpls_label=port3, set_bos=1, cpy_ttl_outward=True)
1012
Flavio Castro12296312015-12-15 17:48:26 -05001013 mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan, 2, [0x92020022 , 0x92010023])
1014 add_mcast4_routing_flow(self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id)
1015
1016 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=1,
1017 eth_dst=dst_mac_str,
1018 eth_src=port1_mac_str,
1019 ip_ttl=64,
1020 ip_src=src_ip_str,
1021 ip_dst=dst_ip_str)
1022 pkt=str(parsed_pkt)
1023 self.dataplane.send(port1, pkt)
1024 label = (in_vlan, 0, 1, 63)
1025 parsed_pkt = mpls_packet(pktlen=100,
1026 eth_dst=dst_mac_str,
1027 eth_src=intf_src_mac_str,
1028 ip_ttl=63,
1029 ip_src=src_ip_str, label= [label],
1030 ip_dst=dst_ip_str)
1031 pkt=str(parsed_pkt)
1032 verify_packet(self, pkt, port2)
1033 verify_packet(self, pkt, port3)
1034 verify_no_other_packets(self)
Flavio Castrof2ff2d32016-02-03 14:22:14 -05001035@disabled
castroflavio30c6cc52016-01-07 15:19:42 -08001036class LPM(base_tests.SimpleDataPlane):
1037 """
1038 Insert IP packet
1039 Receive MPLS packet
1040 """
1041 def runTest(self):
1042 delete_all_flows(self.controller)
1043 delete_all_groups(self.controller)
1044
1045 if len(config["port_map"]) <2:
1046 logging.info("Port count less than 2, can't run this case")
1047 return
1048
1049 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
1050 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
1051 dip=0xc0a80001
1052 index=1
1053 ports = config["port_map"].keys()
1054 for port in ports:
1055 #add l2 interface group
1056 vlan_id=port
1057 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
1058 dst_mac[5]=vlan_id
1059 #add MPLS interface group
1060 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, port)
1061 #add MPLS L3 VPN group
1062 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
1063 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 -05001064 ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
castroflavio30c6cc52016-01-07 15:19:42 -08001065 do_barrier(self.controller)
1066 #add vlan flow table
Flavio Castroaf2b4502016-02-02 17:41:32 -05001067 add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=0, flag=VLAN_TABLE_FLAG_ONLY_TAG)
castroflavio30c6cc52016-01-07 15:19:42 -08001068 #add termination flow
1069 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
1070 #add routing flow
1071 dst_ip = dip + (vlan_id<<8)
Flavio Castro5edf3132016-01-27 15:45:08 -05001072 #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, mpls_label_gid, vrf=2)
Flavio Castroaf2b4502016-02-02 17:41:32 -05001073 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id)
castroflavio30c6cc52016-01-07 15:19:42 -08001074 #add entries in the Bridging table to avoid packet-in from mac learning
1075 group_id = encode_l2_interface_group_id(vlan_id, port)
1076 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
1077 port = ports[0]
1078 #add l2 interface group
1079 vlan_id=port
1080 l2_gid = encode_l2_interface_group_id(vlan_id, port)
1081 dst_mac[5]=vlan_id
1082 #add MPLS interface group
1083 mpls_gid = encode_mpls_interface_group_id(0, port)
1084 #add MPLS L3 VPN group
1085 mpls_label_gid = encode_mpls_label_group_id(OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=port)
Flavio Castro5edf3132016-01-27 15:45:08 -05001086 ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
castroflavio30c6cc52016-01-07 15:19:42 -08001087 do_barrier(self.controller)
1088 #add routing flow
1089 dst_ip = 0x0
Flavio Castro5edf3132016-01-27 15:45:08 -05001090 #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0x0, mpls_label_gid, vrf=2)
Flavio Castroaf2b4502016-02-02 17:41:32 -05001091 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0x0, ecmp_msg.group_id)
castroflavio30c6cc52016-01-07 15:19:42 -08001092
1093 do_barrier(self.controller)
1094
1095 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
1096 for in_port in ports:
1097 mac_src='00:00:00:22:22:%02X' % in_port
1098 ip_src='192.168.%02d.1' % in_port
1099 for out_port in ports:
1100 if in_port == out_port:
1101 continue
1102 ip_dst='192.168.%02d.1' % out_port
1103 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
1104 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
1105 ip_dst=ip_dst)
1106 pkt=str(parsed_pkt)
1107 self.dataplane.send(in_port, pkt)
1108 #build expect packet
1109 mac_dst='00:00:00:22:22:%02X' % out_port
1110 label = (out_port, 0, 1, 32)
1111 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=out_port, ip_ttl=63, ip_src=ip_src,
1112 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
1113 pkt=str(exp_pkt)
1114 verify_packet(self, pkt, out_port)
1115 verify_no_other_packets(self)
Flavio Castroaf2b4502016-02-02 17:41:32 -05001116 ip_dst='1.168.%02d.1' % ports[0]
castroflavio30c6cc52016-01-07 15:19:42 -08001117 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
1118 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst)
1119 pkt=str(parsed_pkt)
1120 self.dataplane.send(in_port, pkt)
1121 #build expect packet
Flavio Castroaf2b4502016-02-02 17:41:32 -05001122 mac_dst='00:00:00:22:22:%02X' % ports[0]
1123 label = (ports[0], 0, 1, 32)
1124 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 -08001125 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
1126 pkt=str(exp_pkt)
Flavio Castroaf2b4502016-02-02 17:41:32 -05001127 verify_packet(self, pkt, ports[0])
castroflavio30c6cc52016-01-07 15:19:42 -08001128 verify_no_other_packets(self)