blob: 98d0ac88e682290c4a1543ddd8a043071ed1ec09 [file] [log] [blame]
Flavio Castro05d20bc2015-11-16 15:06:14 -05001"""
Flavio Castroc36621e2015-12-08 12:57:07 -05002The following tests are being done here
Flavio Castro3aec8902015-11-20 10:51:38 -050031) PacketInSrcMacMiss
castroflavio9e715f32015-12-08 14:04:12 -050042) VlanSupport
53) L2FloodQinQ
64) L2FloodTagged
75) L2Flood Tagged Unknown Src
86) L2 Unicast Tagged
97) MTU 1500
108) MTU 4100
119) MTU 4500
1210) L3UnicastTagged
1311) L3VPNMPLS
1412) MPLS Termination
Flavio Castro05d20bc2015-11-16 15:06:14 -050015"""
16
Flavio Castro05d20bc2015-11-16 15:06:14 -050017from oftest import config
Flavio Castro67d8bd52016-02-03 14:22:14 -050018import inspect
Flavio Castro167f5bd2015-12-02 19:33:53 -050019import logging
20import oftest.base_tests as base_tests
Flavio Castro05d20bc2015-11-16 15:06:14 -050021import ofp
22from oftest.testutils import *
23from accton_util import *
Flavio Castrod8f8af22015-12-02 18:19:26 -050024
Flavio Castro7fb6ca92015-12-16 15:50:14 -050025class PacketInUDP(base_tests.SimpleDataPlane):
Flavio Castro6d498522015-12-15 14:05:04 -050026 """
27 Test packet in function for a table-miss flow
28 Send a packet to each dataplane port and verify that a packet
29 in message is received from the controller for each
30
31 NOTE: Verify This case the oft option shall not use --switch-ip
32 """
33
34 def runTest(self):
35 delete_all_flows(self.controller)
36 delete_all_groups(self.controller)
37
38 parsed_vlan_pkt = simple_udp_packet(pktlen=104,
39 vlan_vid=0x1001, dl_vlan_enable=True)
40 vlan_pkt = str(parsed_vlan_pkt)
Flavio Castro6d498522015-12-15 14:05:04 -050041 # create match
42 match = ofp.match()
43 match.oxm_list.append(ofp.oxm.eth_type(0x0800))
castroflavio4a09c962016-01-05 13:13:41 -080044 match.oxm_list.append(ofp.oxm.ip_proto(17))
Flavio Castro6d498522015-12-15 14:05:04 -050045 request = ofp.message.flow_add(
46 table_id=60,
47 cookie=42,
48 match=match,
49 instructions=[
50 ofp.instruction.apply_actions(
51 actions=[
52 ofp.action.output(
53 port=ofp.OFPP_CONTROLLER,
Flavio Castro89933f22016-02-03 15:53:16 -050054 max_len=ofp.OFPCML_NO_BUFFER)]), ],
Flavio Castro6d498522015-12-15 14:05:04 -050055 buffer_id=ofp.OFP_NO_BUFFER,
56 priority=1)
57
58 logging.info("Inserting packet in flow to controller")
59 self.controller.message_send(request)
60 do_barrier(self.controller)
61
62 for of_port in config["port_map"].keys():
63 logging.info("PacketInMiss test, port %d", of_port)
64 self.dataplane.send(of_port, vlan_pkt)
65
66 verify_packet_in(self, vlan_pkt, of_port, ofp.OFPR_ACTION)
67
68 verify_no_other_packets(self)
Flavio Castroaf2b4502016-02-02 17:41:32 -050069
Flavio Castroaf2b4502016-02-02 17:41:32 -050070
Flavio Castro67d8bd52016-02-03 14:22:14 -050071@disabled
Flavio Castro7fb6ca92015-12-16 15:50:14 -050072class ArpNL2(base_tests.SimpleDataPlane):
73 def runTest(self):
74 delete_all_flows(self.controller)
75 delete_all_groups(self.controller)
76
77 ports = sorted(config["port_map"].keys())
78 match = ofp.match()
79 match.oxm_list.append(ofp.oxm.eth_type(0x0806))
80 request = ofp.message.flow_add(
81 table_id=60,
82 cookie=42,
83 match=match,
84 instructions=[
85 ofp.instruction.apply_actions(
86 actions=[
87 ofp.action.output(
88 port=ofp.OFPP_CONTROLLER,
89 max_len=ofp.OFPCML_NO_BUFFER)]),
90 ],
91 buffer_id=ofp.OFP_NO_BUFFER,
92 priority=40000)
93 self.controller.message_send(request)
94 for port in ports:
Flavio Castro932014b2016-01-05 18:29:15 -050095 add_one_l2_interface_group(self.controller, port, 1, False, False)
Flavio Castro7fb6ca92015-12-16 15:50:14 -050096 add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
97 group_id = encode_l2_interface_group_id(1, port)
98 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
99 do_barrier(self.controller)
100 parsed_arp_pkt = simple_arp_packet()
101 arp_pkt = str(parsed_arp_pkt)
102
103 for out_port in ports:
104 self.dataplane.send(out_port, arp_pkt)
105 verify_packet_in(self, arp_pkt, out_port, ofp.OFPR_ACTION)
106 # change dest based on port number
107 mac_dst= '00:12:34:56:78:%02X' % out_port
108 for in_port in ports:
109 if in_port == out_port:
110 continue
111 # change source based on port number to avoid packet-ins from learning
112 mac_src= '00:12:34:56:78:%02X' % in_port
113 parsed_pkt = simple_tcp_packet(eth_dst=mac_dst, eth_src=mac_src)
114 pkt = str(parsed_pkt)
115 self.dataplane.send(in_port, pkt)
116
117 for ofport in ports:
118 if ofport in [out_port]:
119 verify_packet(self, pkt, ofport)
120 else:
121 verify_no_packet(self, pkt, ofport)
122
123 verify_no_other_packets(self)
124
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500125class PacketInArp(base_tests.SimpleDataPlane):
126 """
127 Test packet in function for a table-miss flow
128 Send a packet to each dataplane port and verify that a packet
129 in message is received from the controller for each
130
131 NOTE: Verify This case the oft option shall not use --switch-ip
132 """
133
134 def runTest(self):
135 delete_all_flows(self.controller)
136 delete_all_groups(self.controller)
137
138 parsed_arp_pkt = simple_arp_packet()
139 arp_pkt = str(parsed_arp_pkt)
140 ports = sorted(config["port_map"].keys())
141 #for port in ports:
142 # add_one_l2_interface_group(self.controller, port, 1, True, False)
143 # add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
144
145 # create match
146 match = ofp.match()
147 match.oxm_list.append(ofp.oxm.eth_type(0x0806))
148 request = ofp.message.flow_add(
149 table_id=60,
150 cookie=42,
151 match=match,
152 instructions=[
153 ofp.instruction.apply_actions(
154 actions=[
155 ofp.action.output(
156 port=ofp.OFPP_CONTROLLER,
157 max_len=ofp.OFPCML_NO_BUFFER)]),
158 ],
159 buffer_id=ofp.OFP_NO_BUFFER,
160 priority=1)
161
162 logging.info("Inserting packet in flow to controller")
163 self.controller.message_send(request)
164 do_barrier(self.controller)
165
166 for of_port in config["port_map"].keys():
167 logging.info("PacketInMiss test, port %d", of_port)
168 self.dataplane.send(of_port, arp_pkt)
169
170 verify_packet_in(self, arp_pkt, of_port, ofp.OFPR_ACTION)
171
172 verify_no_other_packets(self)
173
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500174class L2FloodQinQ(base_tests.SimpleDataPlane):
175 """
Flavio Castroc36621e2015-12-08 12:57:07 -0500176 Test L2 flood of double tagged vlan packets (802.1Q)
177 Sends a double tagged packet and verifies flooding behavior according to outer vlan
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500178 """
179 def runTest(self):
180 ports = sorted(config["port_map"].keys())
Flavio Castro8628adb2016-02-03 17:30:57 -0500181 #Hashes Test Name and uses it as id for installing unique groups
182 vlan_id=abs(hash(inspect.stack()[0][3])) % (256)
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500183 delete_all_flows(self.controller)
184 delete_all_groups(self.controller)
185
186 # Installing flows to avoid packet-in
187 for port in ports:
Flavio Castro8628adb2016-02-03 17:30:57 -0500188 add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
189 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500190
Flavio Castroce3bfeb2016-02-04 14:06:55 -0500191 msg=add_l2_flood_group(self.controller, ports, vlan_id, vlan_id)
Flavio Castro8628adb2016-02-03 17:30:57 -0500192 add_bridge_flow(self.controller, None, vlan_id, msg.group_id, True)
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500193 do_barrier(self.controller)
194
195 #verify flood
196 for ofport in ports:
197 # change dest based on port number
198 mac_src= '00:12:34:56:78:%02X' % ofport
Flavio Castro8628adb2016-02-03 17:30:57 -0500199 parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True, out_vlan_vid=vlan_id,
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500200 in_dl_vlan_enable=True, in_vlan_vid=10, eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
201 pkt = str(parsed_pkt)
202 self.dataplane.send(ofport, pkt)
203 #self won't rx packet
204 verify_no_packet(self, pkt, ofport)
205 #others will rx packet
206 tmp_ports=list(ports)
207 tmp_ports.remove(ofport)
208 verify_packets(self, pkt, tmp_ports)
209
210 verify_no_other_packets(self)
211
Flavio Castroce3bfeb2016-02-04 14:06:55 -0500212@disabled
Flavio Castro184cefe2015-11-19 20:52:49 -0500213class L2FloodTagged(base_tests.SimpleDataPlane):
214 """
215 Test L2 flood to a vlan
216 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
Flavio Castro184cefe2015-11-19 20:52:49 -0500217 """
218 def runTest(self):
Flavio Castroaba28ff2016-02-03 16:47:48 -0500219 #Hashes Test Name and uses it as id for installing unique groups
220 vlan_id=abs(hash(inspect.stack()[0][3])) % (256)
Flavio Castroce3bfeb2016-02-04 14:06:55 -0500221 print vlan_id
Flavio Castroaba28ff2016-02-03 16:47:48 -0500222
Flavio Castro184cefe2015-11-19 20:52:49 -0500223 ports = sorted(config["port_map"].keys())
Flavio Castro34352e72015-12-07 20:01:51 -0500224
Flavio Castro184cefe2015-11-19 20:52:49 -0500225 delete_all_flows(self.controller)
226 delete_all_groups(self.controller)
227
Flavio Castro184cefe2015-11-19 20:52:49 -0500228 # Installing flows to avoid packet-in
229 for port in ports:
Flavio Castroaba28ff2016-02-03 16:47:48 -0500230 add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
231 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castroce3bfeb2016-02-04 14:06:55 -0500232 msg=add_l2_flood_group(self.controller, ports, vlan_id, vlan_id)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500233 add_bridge_flow(self.controller, None, vlan_id, msg.group_id, True)
Flavio Castro184cefe2015-11-19 20:52:49 -0500234 do_barrier(self.controller)
235
236 #verify flood
237 for ofport in ports:
238 # change dest based on port number
Flavio Castroaba28ff2016-02-03 16:47:48 -0500239 pkt = str( simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vlan_id, eth_dst='00:12:34:56:78:9a') )
Flavio Castro184cefe2015-11-19 20:52:49 -0500240 self.dataplane.send(ofport, pkt)
241 #self won't rx packet
242 verify_no_packet(self, pkt, ofport)
243 #others will rx packet
244 tmp_ports=list(ports)
245 tmp_ports.remove(ofport)
246 verify_packets(self, pkt, tmp_ports)
Flavio Castro184cefe2015-11-19 20:52:49 -0500247 verify_no_other_packets(self)
Flavio Castroaabb5792015-11-18 19:03:50 -0500248
Flavio Castroaabb5792015-11-18 19:03:50 -0500249class L2UnicastTagged(base_tests.SimpleDataPlane):
250 """
251 Test output function for an exact-match flow
252
253 For each port A, adds a flow directing matching packets to that port.
254 Then, for all other ports B != A, verifies that sending a matching packet
255 to B results in an output to A.
256 """
257 def runTest(self):
258 ports = sorted(config["port_map"].keys())
Flavio Castroaba28ff2016-02-03 16:47:48 -0500259 #Hashes Test Name and uses it as id for installing unique groups
260 vlan_id=abs(hash(inspect.stack()[0][3])) % (256)
Flavio Castroaabb5792015-11-18 19:03:50 -0500261 delete_all_flows(self.controller)
262 delete_all_groups(self.controller)
263
Flavio Castroaabb5792015-11-18 19:03:50 -0500264 for port in ports:
Flavio Castroaba28ff2016-02-03 16:47:48 -0500265 add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
266 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
267 group_id = encode_l2_interface_group_id(vlan_id, port)
268 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], vlan_id, group_id, True)
Flavio Castro6efe1862015-11-18 16:28:06 -0500269 do_barrier(self.controller)
270
Flavio Castroaabb5792015-11-18 19:03:50 -0500271 for out_port in ports:
272 # change dest based on port number
273 mac_dst= '00:12:34:56:78:%02X' % out_port
274 for in_port in ports:
275 if in_port == out_port:
276 continue
Flavio Castroaba28ff2016-02-03 16:47:48 -0500277 pkt = str( simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vlan_id, eth_dst=mac_dst))
Flavio Castroaabb5792015-11-18 19:03:50 -0500278 self.dataplane.send(in_port, pkt)
Flavio Castroaabb5792015-11-18 19:03:50 -0500279 for ofport in ports:
280 if ofport in [out_port]:
281 verify_packet(self, pkt, ofport)
282 else:
283 verify_no_packet(self, pkt, ofport)
Flavio Castroaabb5792015-11-18 19:03:50 -0500284 verify_no_other_packets(self)
Flavio Castro6efe1862015-11-18 16:28:06 -0500285
Flavio Castrob6773032015-11-19 22:49:24 -0500286class Mtu1500(base_tests.SimpleDataPlane):
287
288 def runTest(self):
289 ports = sorted(config["port_map"].keys())
Flavio Castroaba28ff2016-02-03 16:47:48 -0500290 #Hashes Test Name and uses it as id for installing unique groups
291 vlan_id=abs(hash(inspect.stack()[0][3])) % (256)
Flavio Castrob6773032015-11-19 22:49:24 -0500292 delete_all_flows(self.controller)
293 delete_all_groups(self.controller)
294
Flavio Castrob6773032015-11-19 22:49:24 -0500295 for port in ports:
Flavio Castroaba28ff2016-02-03 16:47:48 -0500296 add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
297 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
298 group_id = encode_l2_interface_group_id(vlan_id, port)
299 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], vlan_id, group_id, True)
Flavio Castrob6773032015-11-19 22:49:24 -0500300 do_barrier(self.controller)
301
302 for out_port in ports:
303 # change dest based on port number
304 mac_dst= '00:12:34:56:78:%02X' % out_port
305 for in_port in ports:
306 if in_port == out_port:
307 continue
Flavio Castroaba28ff2016-02-03 16:47:48 -0500308 pkt = str(simple_tcp_packet(pktlen=1500,dl_vlan_enable=True, vlan_vid=vlan_id, eth_dst=mac_dst))
Flavio Castrob6773032015-11-19 22:49:24 -0500309 self.dataplane.send(in_port, pkt)
Flavio Castrob6773032015-11-19 22:49:24 -0500310 for ofport in ports:
311 if ofport in [out_port]:
312 verify_packet(self, pkt, ofport)
313 else:
314 verify_no_packet(self, pkt, ofport)
Flavio Castrob6773032015-11-19 22:49:24 -0500315 verify_no_other_packets(self)
316
Flavio Castroaabb5792015-11-18 19:03:50 -0500317class L3UcastTagged(base_tests.SimpleDataPlane):
Flavio Castro05d20bc2015-11-16 15:06:14 -0500318 """
Flavio Castro35e64392015-12-02 16:53:14 -0500319 Port1(vid=in_port, src=00:00:00:22:22:in_port, 192.168.outport.1) ,
320 Port2(vid=outport, dst=00:00:00:22:22:outport, 192.168.outport.1)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500321 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500322 def runTest(self):
Flavio Castro05d20bc2015-11-16 15:06:14 -0500323 delete_all_flows(self.controller)
324 delete_all_groups(self.controller)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500325 #Hashes Test Name and uses it as id for installing unique groups
326 class_id=abs(hash(inspect.stack()[0][3])) % (256)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500327 if len(config["port_map"]) <2:
328 logging.info("Port count less than 2, can't run this case")
329 return
Flavio Castrod8f8af22015-12-02 18:19:26 -0500330
Flavio Castro05d20bc2015-11-16 15:06:14 -0500331 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
332 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
333 dip=0xc0a80001
Flavio Castroa8233862015-12-02 14:41:11 -0500334 ports = config["port_map"].keys()
335 for port in ports:
Flavio Castro05d20bc2015-11-16 15:06:14 -0500336 #add l2 interface group
Flavio Castroaba28ff2016-02-03 16:47:48 -0500337 vlan_id=port+class_id
castroflaviodd171472015-12-08 13:55:58 -0500338 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 -0500339 dst_mac[5]=vlan_id
340 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
341 #add vlan flow table
Flavio Castro34352e72015-12-07 20:01:51 -0500342 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500343 #add termination flow
Flavio Castrod8f8af22015-12-02 18:19:26 -0500344 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500345 #add unicast routing flow
Flavio Castrod8f8af22015-12-02 18:19:26 -0500346 dst_ip = dip + (vlan_id<<8)
Flavio Castroaf2b4502016-02-02 17:41:32 -0500347 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id)
Flavio Castro6efe1862015-11-18 16:28:06 -0500348 #add entries in the Bridging table to avoid packet-in from mac learning
349 group_id = encode_l2_interface_group_id(vlan_id, port)
350 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500351
352 do_barrier(self.controller)
353
Flavio Castro05d20bc2015-11-16 15:06:14 -0500354 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
Flavio Castroa8233862015-12-02 14:41:11 -0500355 for in_port in ports:
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500356 mac_src='00:00:00:22:22:%02X' % (class_id+in_port)
357 ip_src='192.168.%02d.1' % (class_id+in_port)
Flavio Castroa8233862015-12-02 14:41:11 -0500358 for out_port in ports:
359 if in_port == out_port:
360 continue
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500361 ip_dst='192.168.%02d.1' % (class_id+out_port)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500362 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=(class_id+in_port),
Flavio Castroa8233862015-12-02 14:41:11 -0500363 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
Flavio Castrod8f8af22015-12-02 18:19:26 -0500364 ip_dst=ip_dst)
Flavio Castroa8233862015-12-02 14:41:11 -0500365 pkt=str(parsed_pkt)
366 self.dataplane.send(in_port, pkt)
Flavio Castro72a45d52015-12-02 16:37:05 -0500367 #build expected packet
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500368 mac_dst='00:00:00:22:22:%02X' % (class_id+out_port)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500369 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=(class_id+out_port),
Flavio Castroa8233862015-12-02 14:41:11 -0500370 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
371 ip_src=ip_src, ip_dst=ip_dst)
372 pkt=str(exp_pkt)
373 verify_packet(self, pkt, out_port)
374 verify_no_other_packets(self)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500375
Flavio Castrod8f8af22015-12-02 18:19:26 -0500376class L3VPNMPLS(base_tests.SimpleDataPlane):
377 """
378 Insert IP packet
379 Receive MPLS packet
380 """
Flavio Castro72a45d52015-12-02 16:37:05 -0500381 def runTest(self):
382 delete_all_flows(self.controller)
383 delete_all_groups(self.controller)
384
385 if len(config["port_map"]) <2:
386 logging.info("Port count less than 2, can't run this case")
387 return
388
389 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
390 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
391 dip=0xc0a80001
Flavio Castro17327782016-02-03 15:20:15 -0500392 #Hashes Test Name and uses it as id for installing unique groups
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500393 class_id=abs(hash(inspect.stack()[0][3])) % (200)
Flavio Castro72a45d52015-12-02 16:37:05 -0500394 ports = config["port_map"].keys()
395 for port in ports:
396 #add l2 interface group
Flavio Castro17327782016-02-03 15:20:15 -0500397 id=port+class_id<<8
Flavio Castroaba28ff2016-02-03 16:47:48 -0500398 vlan_id=port+class_id
castroflaviodd171472015-12-08 13:55:58 -0500399 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
Flavio Castro72a45d52015-12-02 16:37:05 -0500400 dst_mac[5]=vlan_id
Flavio Castro35e64392015-12-02 16:53:14 -0500401 #add MPLS interface group
Flavio Castro17327782016-02-03 15:20:15 -0500402 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, id)
Flavio Castro35e64392015-12-02 16:53:14 -0500403 #add MPLS L3 VPN group
Flavio Castrod8f8af22015-12-02 18:19:26 -0500404 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
Flavio Castro17327782016-02-03 15:20:15 -0500405 index=id, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
406 ecmp_msg=add_l3_ecmp_group(self.controller, id, [mpls_label_gid])
Flavio Castro80730822015-12-11 15:38:47 -0500407 do_barrier(self.controller)
Flavio Castro72a45d52015-12-02 16:37:05 -0500408 #add vlan flow table
Flavio Castro17327782016-02-03 15:20:15 -0500409 add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=0, flag=VLAN_TABLE_FLAG_ONLY_TAG)
Flavio Castro72a45d52015-12-02 16:37:05 -0500410 #add termination flow
411 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro35e64392015-12-02 16:53:14 -0500412 #add routing flow
Flavio Castroaf2b4502016-02-02 17:41:32 -0500413 dst_ip = dip + (vlan_id<<8)
Flavio Castro5edf3132016-01-27 15:45:08 -0500414 #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_label_gid, vrf=2)
Flavio Castro17327782016-02-03 15:20:15 -0500415 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id, vrf=0)
Flavio Castro80730822015-12-11 15:38:47 -0500416
417 do_barrier(self.controller)
418
419 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
420 for in_port in ports:
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500421 mac_src='00:00:00:22:22:%02X' % (class_id+in_port)
Flavio Castrob1ac1a82016-02-03 17:31:59 -0500422 ip_src='192.168.%02d.1' % (class_id+in_port)
Flavio Castro80730822015-12-11 15:38:47 -0500423 for out_port in ports:
424 if in_port == out_port:
425 continue
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500426 ip_dst='192.168.%02d.1' % (class_id+out_port)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500427 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=(class_id+in_port),
Flavio Castro80730822015-12-11 15:38:47 -0500428 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
429 ip_dst=ip_dst)
430 pkt=str(parsed_pkt)
431 self.dataplane.send(in_port, pkt)
432 #build expect packet
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500433 mac_dst='00:00:00:22:22:%02X' % (class_id+out_port)
Flavio Castro80730822015-12-11 15:38:47 -0500434 label = (out_port, 0, 1, 32)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500435 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port+class_id), ip_ttl=63, ip_src=ip_src,
Flavio Castro80730822015-12-11 15:38:47 -0500436 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
437 pkt=str(exp_pkt)
438 verify_packet(self, pkt, out_port)
439 verify_no_other_packets(self)
castroflavioee294842016-01-06 15:54:28 -0800440
Flavio Castro67d8bd52016-02-03 14:22:14 -0500441class _32VPN(base_tests.SimpleDataPlane):
Flavio Castro80730822015-12-11 15:38:47 -0500442 """
443 Insert IP packet
444 Receive MPLS packet
445 """
446 def runTest(self):
447 delete_all_flows(self.controller)
448 delete_all_groups(self.controller)
449
450 if len(config["port_map"]) <2:
451 logging.info("Port count less than 2, can't run this case")
452 return
453
454 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
455 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
456 dip=0xc0a80001
Flavio Castro67d8bd52016-02-03 14:22:14 -0500457 #Hashes Test Name and uses it as id for installing unique groups
Flavio Castro443c95e2016-02-03 15:05:28 -0500458 class_id=abs(hash(inspect.stack()[0][3])) % (256)
Flavio Castro80730822015-12-11 15:38:47 -0500459 ports = config["port_map"].keys()
460 for port in ports:
461 #add l2 interface group
Flavio Castro443c95e2016-02-03 15:05:28 -0500462 id=port+class_id<<8
Flavio Castroaba28ff2016-02-03 16:47:48 -0500463 vlan_id=port+class_id
Flavio Castro80730822015-12-11 15:38:47 -0500464 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
465 dst_mac[5]=vlan_id
466 #add MPLS interface group
Flavio Castro67d8bd52016-02-03 14:22:14 -0500467 mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, id)
Flavio Castro80730822015-12-11 15:38:47 -0500468 #add MPLS L3 VPN group
469 mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
Flavio Castro67d8bd52016-02-03 14:22:14 -0500470 index=id, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
Flavio Castro80730822015-12-11 15:38:47 -0500471 #ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
472 do_barrier(self.controller)
473 #add vlan flow table
Flavio Castro67d8bd52016-02-03 14:22:14 -0500474 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 -0500475 #add termination flow
476 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
477 #add routing flow
478 dst_ip = dip + (vlan_id<<8)
Flavio Castro67d8bd52016-02-03 14:22:14 -0500479 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, mpls_label_gid)
Flavio Castro72a45d52015-12-02 16:37:05 -0500480
481 do_barrier(self.controller)
482
483 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
484 for in_port in ports:
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500485 ip_src='192.168.%02d.1' % (class_id+in_port)
Flavio Castro72a45d52015-12-02 16:37:05 -0500486 for out_port in ports:
487 if in_port == out_port:
488 continue
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500489 ip_dst='192.168.%02d.1' % (class_id+out_port)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500490 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=(class_id+in_port),
Flavio Castro67d8bd52016-02-03 14:22:14 -0500491 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src,
Flavio Castro72a45d52015-12-02 16:37:05 -0500492 ip_dst=ip_dst)
493 pkt=str(parsed_pkt)
494 self.dataplane.send(in_port, pkt)
495 #build expect packet
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500496 mac_dst='00:00:00:22:22:%02X' % (class_id+out_port)
Flavio Castro72a45d52015-12-02 16:37:05 -0500497 label = (out_port, 0, 1, 32)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500498 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=(class_id+out_port), ip_ttl=63, ip_src=ip_src,
Flavio Castro72a45d52015-12-02 16:37:05 -0500499 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
500 pkt=str(exp_pkt)
501 verify_packet(self, pkt, out_port)
502 verify_no_other_packets(self)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500503@disabled
Flavio Castro80730822015-12-11 15:38:47 -0500504class MPLSBUG(base_tests.SimpleDataPlane):
505
506 def runTest(self):
507 delete_all_flows(self.controller)
508 delete_all_groups(self.controller)
509
510 if len(config["port_map"]) <2:
511 logging.info("Port count less than 2, can't run this case")
512 return
513
514 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
515 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
516 dip=0xc0a80001
517 index=1
518 ports = config["port_map"].keys()
519 for port in ports:
520 #add l2 interface group
521 vlan_id=port
522 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
523 dst_mac[5]=vlan_id
524 #add L3 Unicast group
525 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
526 #add vlan flow table
527 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
528 #add termination flow
529 add_termination_flow(self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24)
530 #add mpls flow
531 add_mpls_flow(self.controller, l3_msg.group_id, port)
532 #add termination flow
533 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
534 #add unicast routing flow
535 dst_ip = dip + (vlan_id<<8)
Flavio Castroaf2b4502016-02-02 17:41:32 -0500536 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id)
Flavio Castro80730822015-12-11 15:38:47 -0500537
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 switch_mac = "00:00:00:cc:cc:cc"
553 label = (out_port, 0, 1, 32)
554 parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
555 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[label])
556 pkt=str(parsed_pkt)
557 self.dataplane.send(in_port, pkt)
558
559 #build expect packet
560 mac_dst='00:00:00:22:22:%02X' % out_port
561 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
562 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst)
563 pkt=str(exp_pkt)
564 verify_packet(self, pkt, out_port)
565 verify_no_other_packets(self)
566
567 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
568 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
569 ip_dst=ip_dst)
570 pkt=str(parsed_pkt)
571 self.dataplane.send(in_port, pkt)
572 #build expected packet
573 mac_dst='00:00:00:22:22:%02X' % out_port
574 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
575 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
576 ip_src=ip_src, ip_dst=ip_dst)
577 pkt=str(exp_pkt)
578 verify_packet(self, pkt, out_port)
579 verify_no_other_packets(self)
580
Flavio Castro12296312015-12-15 17:48:26 -0500581class L3McastToL2(base_tests.SimpleDataPlane):
castroflaviocc403a92015-12-15 14:04:19 -0500582 """
Flavio Castro12296312015-12-15 17:48:26 -0500583 Mcast routing to L2
castroflaviocc403a92015-12-15 14:04:19 -0500584 """
585 def runTest(self):
586 """
587 port1 (vlan 300)-> All Ports (vlan 300)
588 """
Flavio Castro932014b2016-01-05 18:29:15 -0500589 #delete_all_flows(self.controller)
590 #delete_all_groups(self.controller)
castroflaviocc403a92015-12-15 14:04:19 -0500591
castroflavio4a09c962016-01-05 13:13:41 -0800592 if len(config["port_map"]) <3:
593 logging.info("Port count less than 3, can't run this case")
594 assert(False)
castroflaviocc403a92015-12-15 14:04:19 -0500595 return
596
597 vlan_id =300
598 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
599 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
600 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
601 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
602 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
603 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
604 src_ip=0xc0a80101
605 src_ip_str="192.168.1.1"
606 dst_ip=0xe0010101
607 dst_ip_str="224.1.1.1"
608
609 port1=config["port_map"].keys()[0]
610 port2=config["port_map"].keys()[1]
611
612 switch_mac = [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00]
613
614
615 #add l2 interface group
616 l2_intf_group_list=[]
617 for port in config["port_map"].keys():
Flavio Castro89933f22016-02-03 15:53:16 -0500618 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
castroflaviocc403a92015-12-15 14:04:19 -0500619 if port == port2:
620 continue
Flavio Castro12296312015-12-15 17:48:26 -0500621 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 -0500622 l2_intf_group_list.append(l2_intf_gid)
castroflaviocc403a92015-12-15 14:04:19 -0500623
624 #add termination flow
625 add_termination_flow(self.controller, port1, 0x0800, switch_mac, vlan_id)
626
627 #add l3 interface group
628 mcat_group_msg=add_l3_mcast_group(self.controller, vlan_id, 2, l2_intf_group_list)
629 add_mcast4_routing_flow(self.controller, vlan_id, src_ip, 0, dst_ip, mcat_group_msg.group_id)
630
Flavio Castro932014b2016-01-05 18:29:15 -0500631 parsed_pkt = simple_udp_packet(pktlen=100,
Flavio Castro89933f22016-02-03 15:53:16 -0500632 dl_vlan_enable=True,
633 vlan_vid=vlan_id,
castroflaviocc403a92015-12-15 14:04:19 -0500634 eth_dst=dst_mac_str,
635 eth_src=port1_mac_str,
636 ip_ttl=64,
637 ip_src=src_ip_str,
638 ip_dst=dst_ip_str)
639 pkt=str(parsed_pkt)
640 self.dataplane.send(port1, pkt)
641 for port in config["port_map"].keys():
Flavio Castro12296312015-12-15 17:48:26 -0500642 if port == port2 or port == port1:
castroflaviocc403a92015-12-15 14:04:19 -0500643 verify_no_packet(self, pkt, port)
Flavio Castro12296312015-12-15 17:48:26 -0500644 continue
castroflaviocc403a92015-12-15 14:04:19 -0500645 verify_packet(self, pkt, port)
646 verify_no_other_packets(self)
647
Flavio Castro12296312015-12-15 17:48:26 -0500648class L3McastToL3(base_tests.SimpleDataPlane):
649 """
650 Mcast routing
651 """
652 def runTest(self):
653 """
654 port1 (vlan 1)-> port 2 (vlan 2)
655 """
656 delete_all_flows(self.controller)
657 delete_all_groups(self.controller)
658
659 if len(config["port_map"]) <3:
castroflavio4a09c962016-01-05 13:13:41 -0800660 logging.info("Port count less than 3, can't run this case")
661 assert(False)
Flavio Castro12296312015-12-15 17:48:26 -0500662 return
663
664 vlan_id =1
665 port2_out_vlan=2
666 port3_out_vlan=3
667 in_vlan=1 #macast group vid shall use input vlan diffe from l3 interface use output vlan
668 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
669 intf_src_mac_str=':'.join(['%02X' % x for x in intf_src_mac])
670 dst_mac=[0x01, 0x00, 0x5e, 0x01, 0x01, 0x01]
671 dst_mac_str=':'.join(['%02X' % x for x in dst_mac])
672 port1_mac=[0x00, 0x11, 0x11, 0x11, 0x11, 0x11]
673 port1_mac_str=':'.join(['%02X' % x for x in port1_mac])
674 src_ip=0xc0a80101
675 src_ip_str="192.168.1.1"
676 dst_ip=0xe0010101
677 dst_ip_str="224.1.1.1"
678
679 port1=config["port_map"].keys()[0]
680 port2=config["port_map"].keys()[1]
681 port3=config["port_map"].keys()[2]
682
683 #add l2 interface group
684 for port in config["port_map"].keys():
685 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=False, send_barrier=False)
686 #add vlan flow table
687 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
688 vlan_id +=1
689
690 #add termination flow
691 add_termination_flow(self.controller, port1, 0x0800, [0x01, 0x00, 0x5e, 0x00, 0x00, 0x00], vlan_id)
692
693 #add l3 interface group
694 port2_ucast_msg=add_l3_interface_group(self.controller, port2, port2_out_vlan, 2, intf_src_mac)
695 port3_ucast_msg=add_l3_interface_group(self.controller, port3, port3_out_vlan, 3, intf_src_mac)
696 mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan, 2, [port2_ucast_msg.group_id, port3_ucast_msg.group_id])
697 add_mcast4_routing_flow(self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id)
698
699 parsed_pkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=1,
700 eth_dst=dst_mac_str,
701 eth_src=port1_mac_str,
702 ip_ttl=64,
703 ip_src=src_ip_str,
704 ip_dst=dst_ip_str)
705 pkt=str(parsed_pkt)
706 self.dataplane.send(port1, pkt)
707 parsed_pkt = simple_udp_packet(pktlen=96,
708 eth_dst=dst_mac_str,
709 eth_src=intf_src_mac_str,
710 ip_ttl=63,
711 ip_src=src_ip_str,
712 ip_dst=dst_ip_str)
713 pkt=str(parsed_pkt)
714 verify_packet(self, pkt, port2)
715 verify_packet(self, pkt, port3)
716 verify_no_other_packets(self)
Flavio Castro54947942016-02-03 16:05:20 -0500717
718
719
Flavio Castrof54be492016-02-03 16:26:22 -0500720class _MplsTermination(base_tests.SimpleDataPlane):
Flavio Castro12296312015-12-15 17:48:26 -0500721 """
Flavio Castro54947942016-02-03 16:05:20 -0500722 Insert IP packet
723 Receive MPLS packet
castroflavio30c6cc52016-01-07 15:19:42 -0800724 """
725 def runTest(self):
726 delete_all_flows(self.controller)
727 delete_all_groups(self.controller)
728
729 if len(config["port_map"]) <2:
730 logging.info("Port count less than 2, can't run this case")
731 return
732
733 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
734 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
Flavio Castro54947942016-02-03 16:05:20 -0500735 #Hashes Test Name and uses it as id for installing unique groups
736 class_id=abs(hash(inspect.stack()[0][3])) % (256)
castroflavio30c6cc52016-01-07 15:19:42 -0800737 ports = config["port_map"].keys()
738 for port in ports:
739 #add l2 interface group
Flavio Castro54947942016-02-03 16:05:20 -0500740 id = port + class_id<<8
Flavio Castroaba28ff2016-02-03 16:47:48 -0500741 vlan_id=port+class_id
Flavio Castro54947942016-02-03 16:05:20 -0500742 l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, False)
castroflavio30c6cc52016-01-07 15:19:42 -0800743 dst_mac[5]=vlan_id
Flavio Castro54947942016-02-03 16:05:20 -0500744 #add L3 Unicast group
745 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=id, src_mac=intf_src_mac, dst_mac=dst_mac)
746 #add L3 ecmp group
747 ecmp_msg = add_l3_ecmp_group(self.controller, id, [l3_msg.group_id])
castroflavio30c6cc52016-01-07 15:19:42 -0800748 #add vlan flow table
Flavio Castro54947942016-02-03 16:05:20 -0500749 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
castroflavio30c6cc52016-01-07 15:19:42 -0800750 #add termination flow
Flavio Castro54947942016-02-03 16:05:20 -0500751 add_termination_flow(self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24)
752 add_mpls_flow(self.controller, ecmp_msg.group_id, port)
castroflavio30c6cc52016-01-07 15:19:42 -0800753
754 do_barrier(self.controller)
755
756 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
757 for in_port in ports:
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500758 ip_src='192.168.%02d.1' % (class_id+in_port)
castroflavio30c6cc52016-01-07 15:19:42 -0800759 for out_port in ports:
760 if in_port == out_port:
Flavio Castro54947942016-02-03 16:05:20 -0500761 continue
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500762 ip_dst='192.168.%02d.1' % (class_id+out_port)
Flavio Castro54947942016-02-03 16:05:20 -0500763
764 label = (out_port, 0, 1, 32)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500765 parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=(in_port+class_id), ip_src=ip_src,
Flavio Castro54947942016-02-03 16:05:20 -0500766 ip_dst=ip_dst, eth_dst=switch_mac, label=[label])
castroflavio30c6cc52016-01-07 15:19:42 -0800767 pkt=str(parsed_pkt)
768 self.dataplane.send(in_port, pkt)
Flavio Castro54947942016-02-03 16:05:20 -0500769
castroflavio30c6cc52016-01-07 15:19:42 -0800770 #build expect packet
Flavio Castro5cc3ef02016-02-03 17:03:31 -0500771 mac_dst='00:00:00:22:22:%02X' % (class_id+out_port)
Flavio Castroaba28ff2016-02-03 16:47:48 -0500772 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=(class_id+out_port),
Flavio Castro54947942016-02-03 16:05:20 -0500773 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst)
castroflavio30c6cc52016-01-07 15:19:42 -0800774 pkt=str(exp_pkt)
775 verify_packet(self, pkt, out_port)
776 verify_no_other_packets(self)
Flavio Castrod0619992016-02-04 15:10:28 -0500777
778class _32ECMPL3(base_tests.SimpleDataPlane):
779 """
780 Port1(vid=in_port, src=00:00:00:22:22:in_port, 192.168.outport.1) ,
781 Port2(vid=outport, dst=00:00:00:22:22:outport, 192.168.outport.1)
782 """
783 def runTest(self):
784 delete_all_flows(self.controller)
785 delete_all_groups(self.controller)
786
787 if len(config["port_map"]) <2:
788 logging.info("Port count less than 2, can't run this case")
789 return
790
791 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
792 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
793 dip=0xc0a80001
794 #Hashes Test Name and uses it as id for installing unique groups
795 class_id=abs(hash(inspect.stack()[0][3])) % (256)
796 ports = config["port_map"].keys()
797 for port in ports:
798 vlan_id=port
799 id=port+class_id<<8
800 #add l2 interface group
801 add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
802 dst_mac[5]=vlan_id
803 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=id, src_mac=intf_src_mac, dst_mac=dst_mac)
804 ecmp_msg=add_l3_ecmp_group(self.controller, id, [l3_msg.group_id])
805 #add vlan flow table
806 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
807 #add termination flow
808 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
809 #add unicast routing flow
810 dst_ip = dip + (vlan_id<<8)
811 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffffff, ecmp_msg.group_id)
812
813 do_barrier(self.controller)
814
815 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
816 for in_port in ports:
817 mac_src='00:00:00:22:22:%02X' % in_port
818 ip_src='192.168.%02d.1' % in_port
819 for out_port in ports:
820 if in_port == out_port:
821 continue
822 ip_dst='192.168.%02d.1' % out_port
823 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
824 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
825 ip_dst=ip_dst)
826 pkt=str(parsed_pkt)
827 self.dataplane.send(in_port, pkt)
828 #build expected packet
829 mac_dst='00:00:00:22:22:%02X' % out_port
830 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
831 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
832 ip_src=ip_src, ip_dst=ip_dst)
833 pkt=str(exp_pkt)
834 verify_packet(self, pkt, out_port)
835 verify_no_other_packets(self)
836