blob: 608ae6f30771bbc7dfa66f64ac019ef5982b5f7c [file] [log] [blame]
Flavio Castro05d20bc2015-11-16 15:06:14 -05001"""
2Flow Test
Flavio Castro3aec8902015-11-20 10:51:38 -050031) PacketInSrcMacMiss
42) L2FloodTagged
53) L2Flood Tagged Unknown Src
64) L2 Unicast Tagged
75) L3 Unicast Tagged
86) MTU 1500
97) MTU 4100
108) MTU 4500
Flavio Castro05d20bc2015-11-16 15:06:14 -050011"""
12
Flavio Castro05d20bc2015-11-16 15:06:14 -050013from oftest import config
Flavio Castro05d20bc2015-11-16 15:06:14 -050014import ofp
15from oftest.testutils import *
Flavio Castrod8f8af22015-12-02 18:19:26 -050016from accton.accton_util import add_mpls_flow
Flavio Castro05d20bc2015-11-16 15:06:14 -050017from accton_util import *
Flavio Castrod8f8af22015-12-02 18:19:26 -050018import src.python.oftest.testutils
19from src.python.oftest.testutils import do_barrier
20from src.python.oftest.testutils import delete_all_flows
21from src.python.oftest.testutils import delete_all_groups
22from src.python.oftest.testutils import simple_tcp_packet
23from src.python.oftest.testutils import verify_packet_in
24from src.python.oftest.testutils import verify_no_other_packets
25from src.python.oftest.testutils import verify_no_packet
26from src.python.oftest.testutils import verify_packets
27from src.python.oftest.testutils import verify_packet
28from src.python.oftest.testutils import mpls_packet
29
Flavio Castro05d20bc2015-11-16 15:06:14 -050030
Flavio Castroaabb5792015-11-18 19:03:50 -050031class PacketInSrcMacMiss(base_tests.SimpleDataPlane):
32 """
33 Test packet in function on a src-mac miss
34 Send a packet to each dataplane port and verify that a packet
35 in message is received from the controller for each
36 #todo verify you stop receiving after adding rule
37 """
38
Flavio Castro6efe1862015-11-18 16:28:06 -050039 def runTest(self):
40 delete_all_flows(self.controller)
41 delete_all_groups(self.controller)
42
Flavio Castroaabb5792015-11-18 19:03:50 -050043 parsed_vlan_pkt = simple_tcp_packet(pktlen=104,
44 vlan_vid=0x1001, dl_vlan_enable=True)
45 vlan_pkt = str(parsed_vlan_pkt)
Flavio Castro6efe1862015-11-18 16:28:06 -050046
Flavio Castroaabb5792015-11-18 19:03:50 -050047 add_vlan_table_flow(self.controller, config["port_map"].keys(), 1)
Flavio Castro6efe1862015-11-18 16:28:06 -050048
Flavio Castroaabb5792015-11-18 19:03:50 -050049 # group table
50 # set up untag groups for each port
51 add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1, True, 1)
52
53 for of_port in config["port_map"].keys():
54 logging.info("PacketInMiss test, port %d", of_port)
55 self.dataplane.send(of_port, vlan_pkt)
56
57 verify_packet_in(self, vlan_pkt, of_port, ofp.OFPR_NO_MATCH)
58
59 verify_no_other_packets(self)
60
Flavio Castro184cefe2015-11-19 20:52:49 -050061class L2FloodTagged(base_tests.SimpleDataPlane):
62 """
63 Test L2 flood to a vlan
64 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
65 #todo take in account unknown src
66 """
67 def runTest(self):
68 ports = sorted(config["port_map"].keys())
69 delete_all_flows(self.controller)
70 delete_all_groups(self.controller)
71
72 add_vlan_table_flow(self.controller, ports, 1)
73
74 # set up tagged groups for each port
75 add_l2_interface_grouop(self.controller, ports, 1, True, 1)
76
77 msg=add_l2_flood_group(self.controller, ports, 1, 1)
78 add_bridge_flow(self.controller, None, 1, msg.group_id, True)
79 # Installing flows to avoid packet-in
80 for port in ports:
81 group_id = encode_l2_interface_group_id(1, port)
82 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
83 do_barrier(self.controller)
84
85 #verify flood
86 for ofport in ports:
87 # change dest based on port number
88 mac_src= '00:12:34:56:78:%02X' % ofport
89 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
90 pkt = str(parsed_pkt)
91 self.dataplane.send(ofport, pkt)
92 #self won't rx packet
93 verify_no_packet(self, pkt, ofport)
94 #others will rx packet
95 tmp_ports=list(ports)
96 tmp_ports.remove(ofport)
97 verify_packets(self, pkt, tmp_ports)
98
99 verify_no_other_packets(self)
100
Flavio Castroaabb5792015-11-18 19:03:50 -0500101class L2FloodTaggedUnknownSrc(base_tests.SimpleDataPlane):
102 """
103 Test L2 flood to a vlan
104 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
105 #todo take in account unknown src
106 """
107 def runTest(self):
108 ports = sorted(config["port_map"].keys())
109 delete_all_flows(self.controller)
110 delete_all_groups(self.controller)
111
112 add_vlan_table_flow(self.controller, ports, 1)
113
114 # set up tagged groups for each port
115 add_l2_interface_grouop(self.controller, ports, 1, True, 1)
116
117 msg=add_l2_flood_group(self.controller, ports, 1, 1)
118 add_bridge_flow(self.controller, None, 1, msg.group_id, True)
119
120 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst='00:12:34:56:78:9a')
121 pkt = str(parsed_pkt)
122 #verify flood
123 for ofport in ports:
124 self.dataplane.send(ofport, pkt)
125 #self won't rx packet
126 verify_no_packet(self, pkt, ofport)
127 #others will rx packet
128 tmp_ports=list(ports)
129 tmp_ports.remove(ofport)
130 verify_packets(self, pkt, tmp_ports)
131
132 verify_no_other_packets(self)
133
Flavio Castroaabb5792015-11-18 19:03:50 -0500134class L2UnicastTagged(base_tests.SimpleDataPlane):
135 """
136 Test output function for an exact-match flow
137
138 For each port A, adds a flow directing matching packets to that port.
139 Then, for all other ports B != A, verifies that sending a matching packet
140 to B results in an output to A.
141 """
142 def runTest(self):
143 ports = sorted(config["port_map"].keys())
144
145 delete_all_flows(self.controller)
146 delete_all_groups(self.controller)
147
148 add_vlan_table_flow(self.controller, config["port_map"].keys())
149
150 # set up tag groups for each port
151 add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1, True, 1)
152
153 for port in ports:
154 group_id = encode_l2_interface_group_id(1, port)
155 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
Flavio Castro6efe1862015-11-18 16:28:06 -0500156 do_barrier(self.controller)
157
Flavio Castroaabb5792015-11-18 19:03:50 -0500158 for out_port in ports:
159 # change dest based on port number
160 mac_dst= '00:12:34:56:78:%02X' % out_port
161 for in_port in ports:
162 if in_port == out_port:
163 continue
164 # change source based on port number to avoid packet-ins from learning
165 mac_src= '00:12:34:56:78:%02X' % in_port
166 parsed_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
167 pkt = str(parsed_pkt)
168 self.dataplane.send(in_port, pkt)
169
170 for ofport in ports:
171 if ofport in [out_port]:
172 verify_packet(self, pkt, ofport)
173 else:
174 verify_no_packet(self, pkt, ofport)
175
176 verify_no_other_packets(self)
Flavio Castro6efe1862015-11-18 16:28:06 -0500177
178
Flavio Castrob6773032015-11-19 22:49:24 -0500179class Mtu4500(base_tests.SimpleDataPlane):
180
181 def runTest(self):
182 ports = sorted(config["port_map"].keys())
183
184 delete_all_flows(self.controller)
185 delete_all_groups(self.controller)
186
187 add_vlan_table_flow(self.controller, config["port_map"].keys())
188
189 # set up tag groups for each port
190 add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1, True, 1)
191
192 for port in ports:
193 group_id = encode_l2_interface_group_id(1, port)
194 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
195 do_barrier(self.controller)
196
197 for out_port in ports:
198 # change dest based on port number
199 mac_dst= '00:12:34:56:78:%02X' % out_port
200 for in_port in ports:
201 if in_port == out_port:
202 continue
203 # change source based on port number to avoid packet-ins from learning
204 mac_src= '00:12:34:56:78:%02X' % in_port
205 parsed_pkt = simple_tcp_packet(pktlen=4500,dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
206 pkt = str(parsed_pkt)
207 self.dataplane.send(in_port, pkt)
208
209 for ofport in ports:
210 if ofport in [out_port]:
211 verify_packet(self, pkt, ofport)
212 else:
213 verify_no_packet(self, pkt, ofport)
214
215 verify_no_other_packets(self)
216
217
218class Mtu1500(base_tests.SimpleDataPlane):
219
220 def runTest(self):
221 ports = sorted(config["port_map"].keys())
222
223 delete_all_flows(self.controller)
224 delete_all_groups(self.controller)
225
226 add_vlan_table_flow(self.controller, config["port_map"].keys())
227
228 # set up tag groups for each port
229 add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1, True, 1)
230
231 for port in ports:
232 group_id = encode_l2_interface_group_id(1, port)
233 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
234 do_barrier(self.controller)
235
236 for out_port in ports:
237 # change dest based on port number
238 mac_dst= '00:12:34:56:78:%02X' % out_port
239 for in_port in ports:
240 if in_port == out_port:
241 continue
242 # change source based on port number to avoid packet-ins from learning
243 mac_src= '00:12:34:56:78:%02X' % in_port
244 parsed_pkt = simple_tcp_packet(pktlen=1500,dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
245 pkt = str(parsed_pkt)
246 self.dataplane.send(in_port, pkt)
247
248 for ofport in ports:
249 if ofport in [out_port]:
250 verify_packet(self, pkt, ofport)
251 else:
252 verify_no_packet(self, pkt, ofport)
253
254 verify_no_other_packets(self)
255
256
257class Mtu4000(base_tests.SimpleDataPlane):
258 """
259 Test output function for an exact-match flow
260 For each port A, adds a flow directing matching packets to that port.
261 Then, for all other ports B != A, verifies that sending a matching packet
262 to B results in an output to A.
263 """
264 def runTest(self):
265 ports = sorted(config["port_map"].keys())
266
267 delete_all_flows(self.controller)
268 delete_all_groups(self.controller)
269
270 add_vlan_table_flow(self.controller, config["port_map"].keys())
271
272 # set up tag groups for each port
273 add_l2_interface_grouop(self.controller, config["port_map"].keys(), 1, True, 1)
274
275 for port in ports:
276 group_id = encode_l2_interface_group_id(1, port)
277 add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
278 do_barrier(self.controller)
279
280 for out_port in ports:
281 # change dest based on port number
282 mac_dst= '00:12:34:56:78:%02X' % out_port
283 for in_port in ports:
284 if in_port == out_port:
285 continue
286 # change source based on port number to avoid packet-ins from learning
287 mac_src= '00:12:34:56:78:%02X' % in_port
288 parsed_pkt = simple_tcp_packet(pktlen=4000,dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
289 pkt = str(parsed_pkt)
290 self.dataplane.send(in_port, pkt)
291
292 for ofport in ports:
293 if ofport in [out_port]:
294 verify_packet(self, pkt, ofport)
295 else:
296 verify_no_packet(self, pkt, ofport)
297
298 verify_no_other_packets(self)
Flavio Castroaabb5792015-11-18 19:03:50 -0500299
300class L3UcastTagged(base_tests.SimpleDataPlane):
Flavio Castro05d20bc2015-11-16 15:06:14 -0500301 """
Flavio Castro35e64392015-12-02 16:53:14 -0500302 Port1(vid=in_port, src=00:00:00:22:22:in_port, 192.168.outport.1) ,
303 Port2(vid=outport, dst=00:00:00:22:22:outport, 192.168.outport.1)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500304 """
Flavio Castrod8f8af22015-12-02 18:19:26 -0500305 def runTest(self):
Flavio Castro05d20bc2015-11-16 15:06:14 -0500306 delete_all_flows(self.controller)
307 delete_all_groups(self.controller)
308
309 if len(config["port_map"]) <2:
310 logging.info("Port count less than 2, can't run this case")
311 return
Flavio Castrod8f8af22015-12-02 18:19:26 -0500312
Flavio Castro05d20bc2015-11-16 15:06:14 -0500313 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
314 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
315 dip=0xc0a80001
Flavio Castroa8233862015-12-02 14:41:11 -0500316 ports = config["port_map"].keys()
317 for port in ports:
Flavio Castro05d20bc2015-11-16 15:06:14 -0500318 #add l2 interface group
Flavio Castroa8233862015-12-02 14:41:11 -0500319 vlan_id=port
Flavio Castro05d20bc2015-11-16 15:06:14 -0500320 add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
321 dst_mac[5]=vlan_id
322 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
323 #add vlan flow table
324 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
325 #add termination flow
Flavio Castrod8f8af22015-12-02 18:19:26 -0500326 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500327 #add unicast routing flow
Flavio Castrod8f8af22015-12-02 18:19:26 -0500328 dst_ip = dip + (vlan_id<<8)
Flavio Castro6efe1862015-11-18 16:28:06 -0500329 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, l3_msg.group_id)
Flavio Castro6efe1862015-11-18 16:28:06 -0500330 #add entries in the Bridging table to avoid packet-in from mac learning
331 group_id = encode_l2_interface_group_id(vlan_id, port)
332 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500333
334 do_barrier(self.controller)
335
Flavio Castro05d20bc2015-11-16 15:06:14 -0500336 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
Flavio Castroa8233862015-12-02 14:41:11 -0500337 for in_port in ports:
338 mac_src='00:00:00:22:22:%02X' % in_port
339 ip_src='192.168.%02d.1' % in_port
340 for out_port in ports:
341 if in_port == out_port:
342 continue
343 ip_dst='192.168.%02d.1' % out_port
344 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
345 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
Flavio Castrod8f8af22015-12-02 18:19:26 -0500346 ip_dst=ip_dst)
Flavio Castroa8233862015-12-02 14:41:11 -0500347 pkt=str(parsed_pkt)
348 self.dataplane.send(in_port, pkt)
Flavio Castro72a45d52015-12-02 16:37:05 -0500349 #build expected packet
Flavio Castroa8233862015-12-02 14:41:11 -0500350 mac_dst='00:00:00:22:22:%02X' % out_port
Flavio Castrod8f8af22015-12-02 18:19:26 -0500351 exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
Flavio Castroa8233862015-12-02 14:41:11 -0500352 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
353 ip_src=ip_src, ip_dst=ip_dst)
354 pkt=str(exp_pkt)
355 verify_packet(self, pkt, out_port)
356 verify_no_other_packets(self)
Flavio Castro05d20bc2015-11-16 15:06:14 -0500357
Flavio Castrod8f8af22015-12-02 18:19:26 -0500358class L3VPNMPLS(base_tests.SimpleDataPlane):
359 """
360 Insert IP packet
361 Receive MPLS packet
362 """
Flavio Castro72a45d52015-12-02 16:37:05 -0500363 def runTest(self):
364 delete_all_flows(self.controller)
365 delete_all_groups(self.controller)
366
367 if len(config["port_map"]) <2:
368 logging.info("Port count less than 2, can't run this case")
369 return
370
371 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
372 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
373 dip=0xc0a80001
374 index=1
375 ports = config["port_map"].keys()
376 for port in ports:
377 #add l2 interface group
378 vlan_id=port
379 l2_gid, l2_msg = add_one_l2_interface_grouop(self.controller, port, vlan_id, True, False)
380 dst_mac[5]=vlan_id
Flavio Castro35e64392015-12-02 16:53:14 -0500381 #add MPLS interface group
Flavio Castro72a45d52015-12-02 16:37:05 -0500382 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 -0500383 #add MPLS L3 VPN group
Flavio Castrod8f8af22015-12-02 18:19:26 -0500384 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 -0500385 index=port, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
386 #add vlan flow table
387 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
388 #add termination flow
389 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
Flavio Castro35e64392015-12-02 16:53:14 -0500390 #add routing flow
Flavio Castro72a45d52015-12-02 16:37:05 -0500391 dst_ip = dip + (vlan_id<<8)
392 add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_label_gid)
Flavio Castro72a45d52015-12-02 16:37:05 -0500393 #add entries in the Bridging table to avoid packet-in from mac learning
394 group_id = encode_l2_interface_group_id(vlan_id, port)
395 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
396
397 do_barrier(self.controller)
398
399 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
400 for in_port in ports:
401 mac_src='00:00:00:22:22:%02X' % in_port
402 ip_src='192.168.%02d.1' % in_port
403 for out_port in ports:
404 if in_port == out_port:
405 continue
406 ip_dst='192.168.%02d.1' % out_port
407 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
408 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
409 ip_dst=ip_dst)
410 pkt=str(parsed_pkt)
411 self.dataplane.send(in_port, pkt)
412 #build expect packet
413 mac_dst='00:00:00:22:22:%02X' % out_port
414 label = (out_port, 0, 1, 32)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500415 exp_pkt = mpls_packet(dl_vlan_enable=True, vlan_vid=out_port, ip_ttl=64, ip_src=ip_src,
Flavio Castro72a45d52015-12-02 16:37:05 -0500416 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
417 pkt=str(exp_pkt)
418 verify_packet(self, pkt, out_port)
419 verify_no_other_packets(self)
Flavio Castrod8f8af22015-12-02 18:19:26 -0500420
421class MplsTermination(base_tests.SimpleDataPlane):
422 '''
423 Insert IP packet
424 Receive MPLS packet
425 '''
426 def runTest(self):
427 delete_all_flows(self.controller)
428 delete_all_groups(self.controller)
429
430 if len(config["port_map"]) <2:
431 logging.info("Port count less than 2, can't run this case")
432 return
433
434 intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
435 dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
436 dip=0xc0a80001
437 index=1
438 ports = config["port_map"].keys()
439 for port in ports:
440 #add l2 interface group
441 vlan_id=port
442 l2_gid, l2_msg = add_one_l2_interface_grouop(self.controller, port, vlan_id, True, False)
443 dst_mac[5]=vlan_id
444 #add L3 Unicast group
445 l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
446 #add vlan flow table
447 add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH)
448 #add termination flow
449 add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
450 #add routing flow
451 dst_ip = dip + (vlan_id<<8)
452 add_mpls_flow(self.controller, l3_msg.group_id, port)
453 #add entries in the Bridging table to avoid packet-in from mac learning
454 group_id = encode_l2_interface_group_id(vlan_id, port)
455 add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
456
457 do_barrier(self.controller)
458
459 switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
460 for in_port in ports:
461 mac_src='00:00:00:22:22:%02X' % in_port
462 ip_src='192.168.%02d.1' % in_port
463 for out_port in ports:
464 if in_port == out_port:
465 continue
466 ip_dst='192.168.%02d.1' % out_port
467 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
468 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
469 ip_dst=ip_dst)
470 pkt=str(parsed_pkt)
471 self.dataplane.send(in_port, pkt)
472 #build expect packet
473 mac_dst='00:00:00:22:22:%02X' % out_port
474 label = (out_port, 0, 1, 32)
475 exp_pkt = mpls_packet(dl_vlan_enable=True, vlan_vid=out_port, ip_ttl=64, ip_src=ip_src,
476 ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
477 pkt=str(exp_pkt)
478 verify_packet(self, pkt, out_port)
479 verify_no_other_packets(self)