blob: 44184b35ab114cd1a81ba7b4b66390ac519e1f06 [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 Castroaabb5792015-11-18 19:03:50 -050024class PacketInSrcMacMiss(base_tests.SimpleDataPlane):
25 """
26 Test packet in function on a src-mac miss
27 Send a packet to each dataplane port and verify that a packet
28 in message is received from the controller for each
29 #todo verify you stop receiving after adding rule
30 """
31
Flavio Castro6efe1862015-11-18 16:28:06 -050032 def runTest(self):
33 delete_all_flows(self.controller)
34 delete_all_groups(self.controller)
35
Flavio Castro34352e72015-12-07 20:01:51 -050036 ports = sorted(config["port_map"].keys())
37 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -050038 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -050039 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
40
Flavio Castroaabb5792015-11-18 19:03:50 -050041 parsed_vlan_pkt = simple_tcp_packet(pktlen=104,
42 vlan_vid=0x1001, dl_vlan_enable=True)
43 vlan_pkt = str(parsed_vlan_pkt)
Flavio Castro6efe1862015-11-18 16:28:06 -050044
Flavio Castroaabb5792015-11-18 19:03:50 -050045 for of_port in config["port_map"].keys():
46 logging.info("PacketInMiss test, port %d", of_port)
47 self.dataplane.send(of_port, vlan_pkt)
48
49 verify_packet_in(self, vlan_pkt, of_port, ofp.OFPR_NO_MATCH)
50
51 verify_no_other_packets(self)
52
Flavio Castro7fb6ca92015-12-16 15:50:14 -050053class PacketInUDP(base_tests.SimpleDataPlane):
Flavio Castro6d498522015-12-15 14:05:04 -050054 """
55 Test packet in function for a table-miss flow
56 Send a packet to each dataplane port and verify that a packet
57 in message is received from the controller for each
58
59 NOTE: Verify This case the oft option shall not use --switch-ip
60 """
61
62 def runTest(self):
63 delete_all_flows(self.controller)
64 delete_all_groups(self.controller)
65
66 parsed_vlan_pkt = simple_udp_packet(pktlen=104,
67 vlan_vid=0x1001, dl_vlan_enable=True)
68 vlan_pkt = str(parsed_vlan_pkt)
Flavio Castro6d498522015-12-15 14:05:04 -050069 # create match
70 match = ofp.match()
71 match.oxm_list.append(ofp.oxm.eth_type(0x0800))
castroflavio4a09c962016-01-05 13:13:41 -080072 match.oxm_list.append(ofp.oxm.ip_proto(17))
Flavio Castro6d498522015-12-15 14:05:04 -050073 request = ofp.message.flow_add(
74 table_id=60,
75 cookie=42,
76 match=match,
77 instructions=[
78 ofp.instruction.apply_actions(
79 actions=[
80 ofp.action.output(
81 port=ofp.OFPP_CONTROLLER,
82 max_len=ofp.OFPCML_NO_BUFFER)]),
83 ],
84 buffer_id=ofp.OFP_NO_BUFFER,
85 priority=1)
86
87 logging.info("Inserting packet in flow to controller")
88 self.controller.message_send(request)
89 do_barrier(self.controller)
90
91 for of_port in config["port_map"].keys():
92 logging.info("PacketInMiss test, port %d", of_port)
93 self.dataplane.send(of_port, vlan_pkt)
94
95 verify_packet_in(self, vlan_pkt, of_port, ofp.OFPR_ACTION)
96
97 verify_no_other_packets(self)
98
Flavio Castro7fb6ca92015-12-16 15:50:14 -050099class ArpNL2(base_tests.SimpleDataPlane):
100 def runTest(self):
101 delete_all_flows(self.controller)
102 delete_all_groups(self.controller)
103
104 ports = sorted(config["port_map"].keys())
105 match = ofp.match()
106 match.oxm_list.append(ofp.oxm.eth_type(0x0806))
107 request = ofp.message.flow_add(
108 table_id=60,
109 cookie=42,
110 match=match,
111 instructions=[
112 ofp.instruction.apply_actions(
113 actions=[
114 ofp.action.output(
115 port=ofp.OFPP_CONTROLLER,
116 max_len=ofp.OFPCML_NO_BUFFER)]),
117 ],
118 buffer_id=ofp.OFP_NO_BUFFER,
119 priority=40000)
120 self.controller.message_send(request)
121 for port in ports:
122 add_one_l2_interface_group(self.controller, port, 1, True, False)
123 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
124 group_id = encode_l2_interface_group_id(1, port)
125 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
126 do_barrier(self.controller)
127 parsed_arp_pkt = simple_arp_packet()
128 arp_pkt = str(parsed_arp_pkt)
129
130 for out_port in ports:
131 self.dataplane.send(out_port, arp_pkt)
132 verify_packet_in(self, arp_pkt, out_port, ofp.OFPR_ACTION)
133 # change dest based on port number
134 mac_dst= '00:12:34:56:78:%02X' % out_port
135 for in_port in ports:
136 if in_port == out_port:
137 continue
138 # change source based on port number to avoid packet-ins from learning
139 mac_src= '00:12:34:56:78:%02X' % in_port
140 parsed_pkt = simple_tcp_packet(eth_dst=mac_dst, eth_src=mac_src)
141 pkt = str(parsed_pkt)
142 self.dataplane.send(in_port, pkt)
143
144 for ofport in ports:
145 if ofport in [out_port]:
146 verify_packet(self, pkt, ofport)
147 else:
148 verify_no_packet(self, pkt, ofport)
149
150 verify_no_other_packets(self)
151
152
153
154class PacketInArp(base_tests.SimpleDataPlane):
155 """
156 Test packet in function for a table-miss flow
157 Send a packet to each dataplane port and verify that a packet
158 in message is received from the controller for each
159
160 NOTE: Verify This case the oft option shall not use --switch-ip
161 """
162
163 def runTest(self):
164 delete_all_flows(self.controller)
165 delete_all_groups(self.controller)
166
167 parsed_arp_pkt = simple_arp_packet()
168 arp_pkt = str(parsed_arp_pkt)
169 ports = sorted(config["port_map"].keys())
170 #for port in ports:
171 # add_one_l2_interface_group(self.controller, port, 1, True, False)
172 # add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
173
174 # create match
175 match = ofp.match()
176 match.oxm_list.append(ofp.oxm.eth_type(0x0806))
177 request = ofp.message.flow_add(
178 table_id=60,
179 cookie=42,
180 match=match,
181 instructions=[
182 ofp.instruction.apply_actions(
183 actions=[
184 ofp.action.output(
185 port=ofp.OFPP_CONTROLLER,
186 max_len=ofp.OFPCML_NO_BUFFER)]),
187 ],
188 buffer_id=ofp.OFP_NO_BUFFER,
189 priority=1)
190
191 logging.info("Inserting packet in flow to controller")
192 self.controller.message_send(request)
193 do_barrier(self.controller)
194
195 for of_port in config["port_map"].keys():
196 logging.info("PacketInMiss test, port %d", of_port)
197 self.dataplane.send(of_port, arp_pkt)
198
199 verify_packet_in(self, arp_pkt, of_port, ofp.OFPR_ACTION)
200
201 verify_no_other_packets(self)
202
203
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500204class L2FloodQinQ(base_tests.SimpleDataPlane):
205 """
Flavio Castroc36621e2015-12-08 12:57:07 -0500206 Test L2 flood of double tagged vlan packets (802.1Q)
207 Sends a double tagged packet and verifies flooding behavior according to outer vlan
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500208 """
209 def runTest(self):
210 ports = sorted(config["port_map"].keys())
211
212 delete_all_flows(self.controller)
213 delete_all_groups(self.controller)
214
215 # Installing flows to avoid packet-in
216 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500217 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500218 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
219
220 group_id = encode_l2_interface_group_id(1, port)
221 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
222 msg=add_l2_flood_group(self.controller, ports, 1, 1)
223 add_bridge_flow(self.controller, None, 1, msg.group_id, True)
224 do_barrier(self.controller)
225
226 #verify flood
227 for ofport in ports:
228 # change dest based on port number
229 mac_src= '00:12:34:56:78:%02X' % ofport
230 parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True, out_vlan_vid=1,
231 in_dl_vlan_enable=True, in_vlan_vid=10, eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
232 pkt = str(parsed_pkt)
233 self.dataplane.send(ofport, pkt)
234 #self won't rx packet
235 verify_no_packet(self, pkt, ofport)
236 #others will rx packet
237 tmp_ports=list(ports)
238 tmp_ports.remove(ofport)
239 verify_packets(self, pkt, tmp_ports)
240
241 verify_no_other_packets(self)
242
243
Flavio Castro184cefe2015-11-19 20:52:49 -0500244class L2FloodTagged(base_tests.SimpleDataPlane):
245 """
246 Test L2 flood to a vlan
247 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
248 #todo take in account unknown src
249 """
250 def runTest(self):
251 ports = sorted(config["port_map"].keys())
Flavio Castro34352e72015-12-07 20:01:51 -0500252
Flavio Castro184cefe2015-11-19 20:52:49 -0500253 delete_all_flows(self.controller)
254 delete_all_groups(self.controller)
255
Flavio Castro184cefe2015-11-19 20:52:49 -0500256 # Installing flows to avoid packet-in
257 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500258 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500259 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
260
Flavio Castro184cefe2015-11-19 20:52:49 -0500261 group_id = encode_l2_interface_group_id(1, port)
262 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
Flavio Castro34352e72015-12-07 20:01:51 -0500263 msg=add_l2_flood_group(self.controller, ports, 1, 1)
264 add_bridge_flow(self.controller, None, 1, msg.group_id, True)
Flavio Castro184cefe2015-11-19 20:52:49 -0500265 do_barrier(self.controller)
266
267 #verify flood
268 for ofport in ports:
269 # change dest based on port number
270 mac_src= '00:12:34:56:78:%02X' % ofport
271 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
272 pkt = str(parsed_pkt)
273 self.dataplane.send(ofport, pkt)
274 #self won't rx packet
275 verify_no_packet(self, pkt, ofport)
276 #others will rx packet
277 tmp_ports=list(ports)
278 tmp_ports.remove(ofport)
279 verify_packets(self, pkt, tmp_ports)
280
281 verify_no_other_packets(self)
282
Flavio Castroaabb5792015-11-18 19:03:50 -0500283class L2FloodTaggedUnknownSrc(base_tests.SimpleDataPlane):
284 """
285 Test L2 flood to a vlan
286 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
287 #todo take in account unknown src
288 """
289 def runTest(self):
Flavio Castroaabb5792015-11-18 19:03:50 -0500290 delete_all_flows(self.controller)
291 delete_all_groups(self.controller)
292
Flavio Castro34352e72015-12-07 20:01:51 -0500293 ports = sorted(config["port_map"].keys())
294 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500295 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500296 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castroaabb5792015-11-18 19:03:50 -0500297
298 msg=add_l2_flood_group(self.controller, ports, 1, 1)
299 add_bridge_flow(self.controller, None, 1, msg.group_id, True)
300
301 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst='00:12:34:56:78:9a')
302 pkt = str(parsed_pkt)
303 #verify flood
304 for ofport in ports:
305 self.dataplane.send(ofport, pkt)
306 #self won't rx packet
307 verify_no_packet(self, pkt, ofport)
308 #others will rx packet
309 tmp_ports=list(ports)
310 tmp_ports.remove(ofport)
311 verify_packets(self, pkt, tmp_ports)
312
313 verify_no_other_packets(self)
314
Flavio Castroaabb5792015-11-18 19:03:50 -0500315class L2UnicastTagged(base_tests.SimpleDataPlane):
316 """
317 Test output function for an exact-match flow
318
319 For each port A, adds a flow directing matching packets to that port.
320 Then, for all other ports B != A, verifies that sending a matching packet
321 to B results in an output to A.
322 """
323 def runTest(self):
324 ports = sorted(config["port_map"].keys())
325
326 delete_all_flows(self.controller)
327 delete_all_groups(self.controller)
328
Flavio Castroaabb5792015-11-18 19:03:50 -0500329 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500330 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500331 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castroaabb5792015-11-18 19:03:50 -0500332 group_id = encode_l2_interface_group_id(1, port)
333 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
Flavio Castro6efe1862015-11-18 16:28:06 -0500334 do_barrier(self.controller)
335
Flavio Castroaabb5792015-11-18 19:03:50 -0500336 for out_port in ports:
337 # change dest based on port number
338 mac_dst= '00:12:34:56:78:%02X' % out_port
339 for in_port in ports:
340 if in_port == out_port:
341 continue
342 # change source based on port number to avoid packet-ins from learning
343 mac_src= '00:12:34:56:78:%02X' % in_port
344 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
345 pkt = str(parsed_pkt)
346 self.dataplane.send(in_port, pkt)
347
348 for ofport in ports:
349 if ofport in [out_port]:
350 verify_packet(self, pkt, ofport)
351 else:
352 verify_no_packet(self, pkt, ofport)
353
354 verify_no_other_packets(self)
Flavio Castro6efe1862015-11-18 16:28:06 -0500355
Flavio Castrob6773032015-11-19 22:49:24 -0500356class Mtu1500(base_tests.SimpleDataPlane):
357
358 def runTest(self):
359 ports = sorted(config["port_map"].keys())
360
361 delete_all_flows(self.controller)
362 delete_all_groups(self.controller)
363
Flavio Castro34352e72015-12-07 20:01:51 -0500364 # set up tag groups for each port
Flavio Castrod4c44d12015-12-08 14:44:18 -0500365 add_l2_interface_group(self.controller, ports, 1, True, 1)
Flavio Castrob6773032015-11-19 22:49:24 -0500366
Flavio Castro34352e72015-12-07 20:01:51 -0500367 add_vlan_table_flow(self.controller, ports)
Flavio Castrob6773032015-11-19 22:49:24 -0500368
369 for port in ports:
castroflaviodd171472015-12-08 13:55:58 -0500370 add_one_l2_interface_group(self.controller, port, 1, True, False)
Flavio Castro34352e72015-12-07 20:01:51 -0500371 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castrob6773032015-11-19 22:49:24 -0500372 group_id = encode_l2_interface_group_id(1, port)
373 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
374 do_barrier(self.controller)
375
376 for out_port in ports:
377 # change dest based on port number
378 mac_dst= '00:12:34:56:78:%02X' % out_port
379 for in_port in ports:
380 if in_port == out_port:
381 continue
382 # change source based on port number to avoid packet-ins from learning
383 mac_src= '00:12:34:56:78:%02X' % in_port
384 parsed_pkt = simple_tcp_packet(pktlen=1500,dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
385 pkt = str(parsed_pkt)
386 self.dataplane.send(in_port, pkt)
387
388 for ofport in ports:
389 if ofport in [out_port]:
390 verify_packet(self, pkt, ofport)
391 else:
392 verify_no_packet(self, pkt, ofport)
393
394 verify_no_other_packets(self)
395
396
397class Mtu4000(base_tests.SimpleDataPlane):
398 """
399 Test output function for an exact-match flow
400 For each port A, adds a flow directing matching packets to that port.
401 Then, for all other ports B != A, verifies that sending a matching packet
402 to B results in an output to A.
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
410 add_vlan_table_flow(self.controller, config["port_map"].keys())
411
412 # set up tag groups for each port
Flavio Castrod4c44d12015-12-08 14:44:18 -0500413 add_l2_interface_group(self.controller, config["port_map"].keys(), 1, True, 1)
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=4000,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)
Flavio Castroaabb5792015-11-18 19:03:50 -0500441
442class L3UcastTagged(base_tests.SimpleDataPlane):
Flavio Castro05d20bc2015-11-16 15:06:14 -0500443 """
Flavio Castro35e64392015-12-02 16:53:14 -0500444 Port1(vid=in_port, src=00:00:00:22:22:in_port, 192.168.outport.1) ,
445 Port2(vid=outport, dst=00:00:00:22:22:outport, 192.168.outport.1)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500446 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500447 def runTest(self):
Flavio Castro05d20bc2015-11-16 15:06:14 -0500448 delete_all_flows(self.controller)
449 delete_all_groups(self.controller)
450
451 if len(config["port_map"]) <2:
452 logging.info("Port count less than 2, can't run this case")
453 return
Flavio Castrod8f8af22015-12-02 18:19:26 -0500454
Flavio Castro05d20bc2015-11-16 15:06:14 -0500455 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
456 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
457 dip=0xc0a80001
Flavio Castroa8233862015-12-02 14:41:11 -0500458 ports = config["port_map"].keys()
459 for port in ports:
Flavio Castro05d20bc2015-11-16 15:06:14 -0500460 #add l2 interface group
Flavio Castroa8233862015-12-02 14:41:11 -0500461 vlan_id=port
castroflaviodd171472015-12-08 13:55:58 -0500462 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 -0500463 dst_mac[5]=vlan_id
464 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
465 #add vlan flow table
Flavio Castro34352e72015-12-07 20:01:51 -0500466 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500467 #add termination flow
Flavio Castrod8f8af22015-12-02 18:19:26 -0500468 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500469 #add unicast routing flow
Flavio Castrod8f8af22015-12-02 18:19:26 -0500470 dst_ip = dip + (vlan_id<<8)
Flavio Castro6efe1862015-11-18 16:28:06 -0500471 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, l3_msg.group_id)
Flavio Castro6efe1862015-11-18 16:28:06 -0500472 #add entries in the Bridging table to avoid packet-in from mac learning
473 group_id = encode_l2_interface_group_id(vlan_id, port)
474 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500475
476 do_barrier(self.controller)
477
Flavio Castro05d20bc2015-11-16 15:06:14 -0500478 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
Flavio Castroa8233862015-12-02 14:41:11 -0500479 for in_port in ports:
480 mac_src='00:00:00:22:22:%02X' % in_port
481 ip_src='192.168.%02d.1' % in_port
482 for out_port in ports:
483 if in_port == out_port:
484 continue
485 ip_dst='192.168.%02d.1' % out_port
486 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
487 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
Flavio Castrod8f8af22015-12-02 18:19:26 -0500488 ip_dst=ip_dst)
Flavio Castroa8233862015-12-02 14:41:11 -0500489 pkt=str(parsed_pkt)
490 self.dataplane.send(in_port, pkt)
Flavio Castro72a45d52015-12-02 16:37:05 -0500491 #build expected packet
Flavio Castroa8233862015-12-02 14:41:11 -0500492 mac_dst='00:00:00:22:22:%02X' % out_port
Flavio Castrod8f8af22015-12-02 18:19:26 -0500493 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
Flavio Castroa8233862015-12-02 14:41:11 -0500494 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
495 ip_src=ip_src, ip_dst=ip_dst)
496 pkt=str(exp_pkt)
497 verify_packet(self, pkt, out_port)
498 verify_no_other_packets(self)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500499
Flavio Castrod8f8af22015-12-02 18:19:26 -0500500class L3VPNMPLS(base_tests.SimpleDataPlane):
501 """
502 Insert IP packet
503 Receive MPLS packet
504 """
Flavio Castro72a45d52015-12-02 16:37:05 -0500505 def runTest(self):
506 delete_all_flows(self.controller)
507 delete_all_groups(self.controller)
508
509 if len(config["port_map"]) <2:
510 logging.info("Port count less than 2, can't run this case")
511 return
512
513 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
514 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
515 dip=0xc0a80001
516 index=1
517 ports = config["port_map"].keys()
518 for port in ports:
519 #add l2 interface group
520 vlan_id=port
castroflaviodd171472015-12-08 13:55:58 -0500521 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
Flavio Castro72a45d52015-12-02 16:37:05 -0500522 dst_mac[5]=vlan_id
Flavio Castro35e64392015-12-02 16:53:14 -0500523 #add MPLS interface group
Flavio Castro72a45d52015-12-02 16:37:05 -0500524 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 -0500525 #add MPLS L3 VPN group
Flavio Castrod8f8af22015-12-02 18:19:26 -0500526 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 -0500527 index=port, 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 -0500528 #ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
529 do_barrier(self.controller)
Flavio Castro72a45d52015-12-02 16:37:05 -0500530 #add vlan flow table
Flavio Castro80730822015-12-11 15:38:47 -0500531 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 -0500532 #add termination flow
533 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro35e64392015-12-02 16:53:14 -0500534 #add routing flow
Flavio Castro72a45d52015-12-02 16:37:05 -0500535 dst_ip = dip + (vlan_id<<8)
Flavio Castro80730822015-12-11 15:38:47 -0500536 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, mpls_label_gid, vrf=2)
537 #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id, vrf=2)
538 #add entries in the Bridging table to avoid packet-in from mac learning
539 group_id = encode_l2_interface_group_id(vlan_id, port)
540 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
541
542 do_barrier(self.controller)
543
544 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
545 for in_port in ports:
546 mac_src='00:00:00:22:22:%02X' % in_port
547 ip_src='192.168.%02d.1' % in_port
548 for out_port in ports:
549 if in_port == out_port:
550 continue
551 ip_dst='192.168.%02d.1' % out_port
552 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
553 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
554 ip_dst=ip_dst)
555 pkt=str(parsed_pkt)
556 self.dataplane.send(in_port, pkt)
557 #build expect packet
558 mac_dst='00:00:00:22:22:%02X' % out_port
559 label = (out_port, 0, 1, 32)
560 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=out_port, ip_ttl=63, ip_src=ip_src,
561 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
562 pkt=str(exp_pkt)
563 verify_packet(self, pkt, out_port)
564 verify_no_other_packets(self)
565
566class L3VPN_32(base_tests.SimpleDataPlane):
567 """
568 Insert IP packet
569 Receive MPLS packet
570 """
571 def runTest(self):
572 delete_all_flows(self.controller)
573 delete_all_groups(self.controller)
574
575 if len(config["port_map"]) <2:
576 logging.info("Port count less than 2, can't run this case")
577 return
578
579 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
580 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
581 dip=0xc0a80001
582 index=1
583 ports = config["port_map"].keys()
584 for port in ports:
585 #add l2 interface group
586 vlan_id=port
587 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
588 dst_mac[5]=vlan_id
589 #add MPLS interface group
590 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, port)
591 #add MPLS L3 VPN group
592 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
593 index=port, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
594 #ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
595 do_barrier(self.controller)
596 #add vlan flow table
597 add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=2, flag=VLAN_TABLE_FLAG_ONLY_TAG)
598 #add termination flow
599 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
600 #add routing flow
601 dst_ip = dip + (vlan_id<<8)
602 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_gid, vrf=2)
603 #ecmp_msg.group_id, vrf=2)
Flavio Castro72a45d52015-12-02 16:37:05 -0500604 #add entries in the Bridging table to avoid packet-in from mac learning
605 group_id = encode_l2_interface_group_id(vlan_id, port)
606 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
607
608 do_barrier(self.controller)
609
610 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
611 for in_port in ports:
612 mac_src='00:00:00:22:22:%02X' % in_port
613 ip_src='192.168.%02d.1' % in_port
614 for out_port in ports:
615 if in_port == out_port:
616 continue
617 ip_dst='192.168.%02d.1' % out_port
618 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
619 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
620 ip_dst=ip_dst)
621 pkt=str(parsed_pkt)
622 self.dataplane.send(in_port, pkt)
623 #build expect packet
624 mac_dst='00:00:00:22:22:%02X' % out_port
625 label = (out_port, 0, 1, 32)
Flavio Castro34352e72015-12-07 20:01:51 -0500626 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 -0500627 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
628 pkt=str(exp_pkt)
629 verify_packet(self, pkt, out_port)
630 verify_no_other_packets(self)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500631
632class MplsTermination(base_tests.SimpleDataPlane):
Flavio Castro34352e72015-12-07 20:01:51 -0500633 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500634 Insert IP packet
635 Receive MPLS packet
Flavio Castro34352e72015-12-07 20:01:51 -0500636 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500637 def runTest(self):
638 delete_all_flows(self.controller)
639 delete_all_groups(self.controller)
640
641 if len(config["port_map"]) <2:
642 logging.info("Port count less than 2, can't run this case")
643 return
644
645 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
646 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500647 mcast_mac = [0x01, 0x00, 0x5e, 0x00, 0x00, 0x01]
648
Flavio Castrod8f8af22015-12-02 18:19:26 -0500649 dip=0xc0a80001
650 index=1
651 ports = config["port_map"].keys()
652 for port in ports:
653 #add l2 interface group
654 vlan_id=port
castroflaviodd171472015-12-08 13:55:58 -0500655 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500656 dst_mac[5]=vlan_id
657 #add L3 Unicast group
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500658 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=mcast_mac)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500659 #add L3 ecmp group
660 ecmp_msg = add_l3_ecmp_group(self.controller, port, [l3_msg.group_id])
Flavio Castrod8f8af22015-12-02 18:19:26 -0500661 #add vlan flow table
Flavio Castro80730822015-12-11 15:38:47 -0500662 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500663 #add termination flow
Flavio Castro167f5bd2015-12-02 19:33:53 -0500664 add_termination_flow(self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500665 #add routing flow
666 dst_ip = dip + (vlan_id<<8)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500667 add_mpls_flow(self.controller, ecmp_msg.group_id, port)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500668 #add entries in the Bridging table to avoid packet-in from mac learning
669 group_id = encode_l2_interface_group_id(vlan_id, port)
670 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
671
672 do_barrier(self.controller)
673
674 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
675 for in_port in ports:
676 mac_src='00:00:00:22:22:%02X' % in_port
677 ip_src='192.168.%02d.1' % in_port
678 for out_port in ports:
679 if in_port == out_port:
680 continue
681 ip_dst='192.168.%02d.1' % out_port
Flavio Castro167f5bd2015-12-02 19:33:53 -0500682
683 label = (out_port, 0, 1, 32)
684 parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
685 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[label])
Flavio Castrod8f8af22015-12-02 18:19:26 -0500686 pkt=str(parsed_pkt)
687 self.dataplane.send(in_port, pkt)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500688
Flavio Castrod8f8af22015-12-02 18:19:26 -0500689 #build expect packet
690 mac_dst='00:00:00:22:22:%02X' % out_port
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500691 mcast='01:00:5e:00:00:01'
Flavio Castro167f5bd2015-12-02 19:33:53 -0500692 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500693 eth_dst=mcast, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500694 pkt=str(exp_pkt)
695 verify_packet(self, pkt, out_port)
Flavio Castro167f5bd2015-12-02 19:33:53 -0500696 verify_no_other_packets(self)
697
Flavio Castro80730822015-12-11 15:38:47 -0500698class MPLSBUG(base_tests.SimpleDataPlane):
699
700 def runTest(self):
701 delete_all_flows(self.controller)
702 delete_all_groups(self.controller)
703
704 if len(config["port_map"]) <2:
705 logging.info("Port count less than 2, can't run this case")
706 return
707
708 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
709 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
710 dip=0xc0a80001
711 index=1
712 ports = config["port_map"].keys()
713 for port in ports:
714 #add l2 interface group
715 vlan_id=port
716 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
717 dst_mac[5]=vlan_id
718 #add L3 Unicast group
719 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
720 #add vlan flow table
721 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
722 #add termination flow
723 add_termination_flow(self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24)
724 #add mpls flow
725 add_mpls_flow(self.controller, l3_msg.group_id, port)
726 #add termination flow
727 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
728 #add unicast routing flow
729 dst_ip = dip + (vlan_id<<8)
730 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, l3_msg.group_id)
731
732 #add entries in the Bridging table to avoid packet-in from mac learning
733 group_id = encode_l2_interface_group_id(vlan_id, port)
734 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
735
736 do_barrier(self.controller)
737
738 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
739 for in_port in ports:
740 mac_src='00:00:00:22:22:%02X' % in_port
741 ip_src='192.168.%02d.1' % in_port
742 for out_port in ports:
743 if in_port == out_port:
744 continue
745 ip_dst='192.168.%02d.1' % out_port
746 switch_mac = "00:00:00:cc:cc:cc"
747 label = (out_port, 0, 1, 32)
748 parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
749 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[label])
750 pkt=str(parsed_pkt)
751 self.dataplane.send(in_port, pkt)
752
753 #build expect packet
754 mac_dst='00:00:00:22:22:%02X' % out_port
755 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
756 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst)
757 pkt=str(exp_pkt)
758 verify_packet(self, pkt, out_port)
759 verify_no_other_packets(self)
760
761 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
762 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
763 ip_dst=ip_dst)
764 pkt=str(parsed_pkt)
765 self.dataplane.send(in_port, pkt)
766 #build expected packet
767 mac_dst='00:00:00:22:22:%02X' % out_port
768 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
769 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
770 ip_src=ip_src, ip_dst=ip_dst)
771 pkt=str(exp_pkt)
772 verify_packet(self, pkt, out_port)
773 verify_no_other_packets(self)
774
Flavio Castro12296312015-12-15 17:48:26 -0500775class L3McastToL2(base_tests.SimpleDataPlane):
castroflaviocc403a92015-12-15 14:04:19 -0500776 """
Flavio Castro12296312015-12-15 17:48:26 -0500777 Mcast routing to L2
castroflaviocc403a92015-12-15 14:04:19 -0500778 """
779 def runTest(self):
780 """
781 port1 (vlan 300)-> All Ports (vlan 300)
782 """
783 delete_all_flows(self.controller)
784 delete_all_groups(self.controller)
785
castroflavio4a09c962016-01-05 13:13:41 -0800786 if len(config["port_map"]) <3:
787 logging.info("Port count less than 3, can't run this case")
788 assert(False)
castroflaviocc403a92015-12-15 14:04:19 -0500789 return
790
791 vlan_id =300
792 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
793 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
794 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
795 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
796 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
797 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
798 src_ip=0xc0a80101
799 src_ip_str="192.168.1.1"
800 dst_ip=0xe0010101
801 dst_ip_str="224.1.1.1"
802
803 port1=config["port_map"].keys()[0]
804 port2=config["port_map"].keys()[1]
805
806 switch_mac = [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00]
807
808
809 #add l2 interface group
810 l2_intf_group_list=[]
811 for port in config["port_map"].keys():
812 if port == port2:
813 continue
Flavio Castro12296312015-12-15 17:48:26 -0500814 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 -0500815 l2_intf_group_list.append(l2_intf_gid)
816 #add vlan flow table
817 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
818
819 #add termination flow
820 add_termination_flow(self.controller, port1, 0x0800, switch_mac, vlan_id)
821
822 #add l3 interface group
823 mcat_group_msg=add_l3_mcast_group(self.controller, vlan_id, 2, l2_intf_group_list)
824 add_mcast4_routing_flow(self.controller, vlan_id, src_ip, 0, dst_ip, mcat_group_msg.group_id)
825
826 parsed_pkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=300,
827 eth_dst=dst_mac_str,
828 eth_src=port1_mac_str,
829 ip_ttl=64,
830 ip_src=src_ip_str,
831 ip_dst=dst_ip_str)
832 pkt=str(parsed_pkt)
833 self.dataplane.send(port1, pkt)
834 for port in config["port_map"].keys():
Flavio Castro12296312015-12-15 17:48:26 -0500835 if port == port2 or port == port1:
castroflaviocc403a92015-12-15 14:04:19 -0500836 verify_no_packet(self, pkt, port)
Flavio Castro12296312015-12-15 17:48:26 -0500837 continue
castroflaviocc403a92015-12-15 14:04:19 -0500838 verify_packet(self, pkt, port)
839 verify_no_other_packets(self)
840
Flavio Castro12296312015-12-15 17:48:26 -0500841class L3McastToL3(base_tests.SimpleDataPlane):
842 """
843 Mcast routing
844 """
845 def runTest(self):
846 """
847 port1 (vlan 1)-> port 2 (vlan 2)
848 """
849 delete_all_flows(self.controller)
850 delete_all_groups(self.controller)
851
852 if len(config["port_map"]) <3:
castroflavio4a09c962016-01-05 13:13:41 -0800853 logging.info("Port count less than 3, can't run this case")
854 assert(False)
Flavio Castro12296312015-12-15 17:48:26 -0500855 return
856
857 vlan_id =1
858 port2_out_vlan=2
859 port3_out_vlan=3
860 in_vlan=1 #macast group vid shall use input vlan diffe from l3 interface use output vlan
861 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
862 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
863 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
864 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
865 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
866 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
867 src_ip=0xc0a80101
868 src_ip_str="192.168.1.1"
869 dst_ip=0xe0010101
870 dst_ip_str="224.1.1.1"
871
872 port1=config["port_map"].keys()[0]
873 port2=config["port_map"].keys()[1]
874 port3=config["port_map"].keys()[2]
875
876 #add l2 interface group
877 for port in config["port_map"].keys():
878 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=False, send_barrier=False)
879 #add vlan flow table
880 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
881 vlan_id +=1
882
883 #add termination flow
884 add_termination_flow(self.controller, port1, 0x0800, [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00], vlan_id)
885
886 #add l3 interface group
887 port2_ucast_msg=add_l3_interface_group(self.controller, port2, port2_out_vlan, 2, intf_src_mac)
888 port3_ucast_msg=add_l3_interface_group(self.controller, port3, port3_out_vlan, 3, intf_src_mac)
889 mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan, 2, [port2_ucast_msg.group_id, port3_ucast_msg.group_id])
890 add_mcast4_routing_flow(self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id)
891
892 parsed_pkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=1,
893 eth_dst=dst_mac_str,
894 eth_src=port1_mac_str,
895 ip_ttl=64,
896 ip_src=src_ip_str,
897 ip_dst=dst_ip_str)
898 pkt=str(parsed_pkt)
899 self.dataplane.send(port1, pkt)
900 parsed_pkt = simple_udp_packet(pktlen=96,
901 eth_dst=dst_mac_str,
902 eth_src=intf_src_mac_str,
903 ip_ttl=63,
904 ip_src=src_ip_str,
905 ip_dst=dst_ip_str)
906 pkt=str(parsed_pkt)
907 verify_packet(self, pkt, port2)
908 verify_packet(self, pkt, port3)
909 verify_no_other_packets(self)
910
911class L3McastToVPN(base_tests.SimpleDataPlane):
912 """
913 Mcast routing
914 """
915 def runTest(self):
916 """
917 port1 (vlan 1)-> port 2 (vlan 2)
918 """
919 #delete_all_flows(self.controller)
920 #delete_all_groups(self.controller)
921
922 if len(config["port_map"]) <3:
castroflavio4a09c962016-01-05 13:13:41 -0800923 logging.info("Port count less than 3, can't run this case")
924 assert(False)
Flavio Castro12296312015-12-15 17:48:26 -0500925 return
926
927 vlan_id =1
928 port2_out_vlan=2
929 port3_out_vlan=3
930 in_vlan=1 #macast group vid shall use input vlan diffe from l3 interface use output vlan
931 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
932 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
933 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
934 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
935 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
936 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
937 src_ip=0xc0a80101
938 src_ip_str="192.168.1.1"
939 dst_ip=0xe0010101
940 dst_ip_str="224.1.1.1"
941
942 port1=config["port_map"].keys()[0]
943 port2=config["port_map"].keys()[1]
944 port3=config["port_map"].keys()[2]
945
946 #add l2 interface group
947 for port in config["port_map"].keys():
948 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=False, send_barrier=False)
949 #add vlan flow table
950 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
951 vlan_id +=1
952
953 #add termination flow
954 add_termination_flow(self.controller, port1, 0x0800, [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00], vlan_id)
955
956 #add MPLS interface group
957 l2_gid = encode_l2_interface_group_id(port2_out_vlan, port2)
958 mpls_gid2, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, port2_out_vlan, port2)
959 l2_gid3 = encode_l2_interface_group_id(port3_out_vlan, port3)
960 mpls_gid3, mpls_msg = add_mpls_intf_group(self.controller, l2_gid3, dst_mac, intf_src_mac, port3_out_vlan, port3)
961 #add L3VPN groups
962 mpls_label_gid2, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
963 index=(0x20000+port2), ref_gid= mpls_gid2, push_mpls_header=True, set_mpls_label=port2, set_bos=1, cpy_ttl_outward=True)
964 mpls_label_gid3, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
965 index=(0x10000+port3), ref_gid= mpls_gid3, push_mpls_header=True, set_mpls_label=port3, set_bos=1, cpy_ttl_outward=True)
966
967
968
969 mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan, 2, [0x92020022 , 0x92010023])
970 add_mcast4_routing_flow(self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id)
971
972 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=1,
973 eth_dst=dst_mac_str,
974 eth_src=port1_mac_str,
975 ip_ttl=64,
976 ip_src=src_ip_str,
977 ip_dst=dst_ip_str)
978 pkt=str(parsed_pkt)
979 self.dataplane.send(port1, pkt)
980 label = (in_vlan, 0, 1, 63)
981 parsed_pkt = mpls_packet(pktlen=100,
982 eth_dst=dst_mac_str,
983 eth_src=intf_src_mac_str,
984 ip_ttl=63,
985 ip_src=src_ip_str, label= [label],
986 ip_dst=dst_ip_str)
987 pkt=str(parsed_pkt)
988 verify_packet(self, pkt, port2)
989 verify_packet(self, pkt, port3)
990 verify_no_other_packets(self)