blob: 6bb6a8a6357d66aebd292415f5203bb528011f69 [file] [log] [blame]
ShreyaPandita9306c772012-09-28 12:21:40 -04001
2"""These tests fall under Conformance Test-Suite (OF-SWITCH-1.0.0 TestCases).
3 Refer Documentation -- Detailed testing methodology
4 <Some of test-cases are directly taken from oftest> """
5
6"Test Suite 6 ---> Actions "
7
8
9import logging
10
11import unittest
12import random
Rich Laneb90a1c42012-10-05 09:16:05 -070013import time
ShreyaPandita9306c772012-09-28 12:21:40 -040014
Rich Lane477f4812012-10-04 22:49:00 -070015from oftest import config
ShreyaPandita9306c772012-09-28 12:21:40 -040016import oftest.controller as controller
Rich Laned7b0ffa2013-03-08 15:53:42 -080017import ofp
ShreyaPandita9306c772012-09-28 12:21:40 -040018import oftest.dataplane as dataplane
ShreyaPandita9306c772012-09-28 12:21:40 -040019import oftest.parse as parse
Rich Laneb90a1c42012-10-05 09:16:05 -070020import oftest.base_tests as base_tests
ShreyaPandita9306c772012-09-28 12:21:40 -040021
Rich Laneda3b5ad2012-10-03 09:05:32 -070022from oftest.testutils import *
ShreyaPandita9306c772012-09-28 12:21:40 -040023from time import sleep
24from FuncUtils import *
25
Rich Laneb90a1c42012-10-05 09:16:05 -070026class NoAction(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -040027
28 """NoActionDrop : no action added to flow , drops the packet."""
29
30 def runTest(self):
31
Rich Lane9a003812012-10-04 17:17:59 -070032 logging.info("Running No_Action test")
ShreyaPandita9306c772012-09-28 12:21:40 -040033
Rich Lane477f4812012-10-04 22:49:00 -070034 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -040035 of_ports.sort()
36 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
37
38 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -080039 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -040040
Rich Lane9a003812012-10-04 17:17:59 -070041 logging.info("Install a flow without action")
42 logging.info("Send packets matching that flow")
43 logging.info("Expecting switch to drop all packets")
ShreyaPandita9306c772012-09-28 12:21:40 -040044
45 # Insert a flow wildcard all without any action
46 pkt = simple_tcp_packet()
47 match = parse.packet_to_flow_match(pkt)
48 self.assertTrue(match is not None, "Could not generate flow match from pkt")
49 match.wildcards=ofp.OFPFW_ALL
50 match.in_port = of_ports[0]
51
Rich Lane28fa9272013-03-08 16:00:25 -080052 msg = ofp.message.flow_mod()
ShreyaPandita9306c772012-09-28 12:21:40 -040053 msg.out_port = ofp.OFPP_NONE
54 msg.command = ofp.OFPFC_ADD
55 msg.buffer_id = 0xffffffff
56 msg.match = match
Rich Lane5c3151c2013-01-03 17:15:41 -080057 self.controller.message_send(msg)
Rich Lane3a261d52013-01-03 17:45:08 -080058 do_barrier(self.controller)
ShreyaPanditab46f8522012-09-28 15:12:15 -040059
ShreyaPandita9306c772012-09-28 12:21:40 -040060 #Sending N packets matching the flow inserted
61 for pkt_cnt in range(5):
62 self.dataplane.send(of_ports[0],str(pkt))
63
64 #Verify packets not recieved on any of the dataplane ports
ShreyaPandita7b9ec982012-09-28 14:43:08 -040065 (rcv_port, rcv_pkt, pkt_time) = self.dataplane.poll(timeout=1,exp_pkt=pkt)
66 self.assertTrue(rcv_pkt is None,
ShreyaPanditad4a42c62012-09-28 15:35:27 -040067 "Packet received on port " + str(rcv_port))
ShreyaPandita9306c772012-09-28 12:21:40 -040068
69 #Verify packets not sent on control plane either
70 (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN, timeout=1)
71 self.assertTrue(response is None,
72 'Packets not received on control plane')
73
74
Rich Laneb90a1c42012-10-05 09:16:05 -070075class Announcement(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -040076
77 """Announcement : Get all supported actions by the switch.
78 Send OFPT_FEATURES_REQUEST to get features supported by sw."""
79
80 def runTest(self):
81
Rich Lane9a003812012-10-04 17:17:59 -070082 logging.info("Running Announcement test")
ShreyaPandita9306c772012-09-28 12:21:40 -040083
Rich Lane9a003812012-10-04 17:17:59 -070084 logging.info("Sending Features_Request")
85 logging.info("Expecting Features Reply with supported actions")
ShreyaPandita9306c772012-09-28 12:21:40 -040086
87 # Sending Features_Request
Rich Lane28fa9272013-03-08 16:00:25 -080088 request = ofp.message.features_request()
ShreyaPandita9306c772012-09-28 12:21:40 -040089 (reply, pkt) = self.controller.transact(request)
90 self.assertTrue(reply is not None, "Failed to get any reply")
Rich Laneb73808c2013-03-11 15:22:23 -070091 self.assertEqual(reply.type, ofp.OFPT_FEATURES_REPLY,'Response is not Features_reply')
ShreyaPandita9306c772012-09-28 12:21:40 -040092
93 supported_actions =[]
94 if(reply.actions &1<<ofp.OFPAT_OUTPUT):
95 supported_actions.append('OFPAT_OUTPUT')
96 if(reply.actions &1<<ofp.OFPAT_SET_VLAN_VID):
97 supported_actions.append('OFPAT_SET_VLAN_VID')
98 if(reply.actions &1<<ofp.OFPAT_SET_VLAN_PCP):
99 supported_actions.append('OFPAT_SET_VLAN_PCP')
100 if(reply.actions &1<<ofp.OFPAT_STRIP_VLAN):
101 supported_actions.append('OFPAT_STRIP_VLAN')
102 if(reply.actions &1<<ofp.OFPAT_SET_DL_SRC):
103 supported_actions.append('OFPAT_SET_DL_SRC')
104 if(reply.actions &1<<ofp.OFPAT_SET_DL_DST):
105 supported_actions.append('OFPAT_SET_NW_SRC')
106 if(reply.actions &1<<ofp.OFPAT_SET_NW_DST):
107 supported_actions.append('OFPAT_SET_NW_DST')
108 if(reply.actions &1<<ofp.OFPAT_SET_NW_TOS):
109 supported_actions.append('OFPAT_SET_NW_TOS')
110 if(reply.actions &1<<ofp.OFPAT_SET_TP_SRC):
111 supported_actions.append('OFPAT_SET_TP_SRC')
112 if(reply.actions &1<<ofp.OFPAT_SET_TP_DST):
113 supported_actions.append('OFPAT_SET_TP_DST')
114 if(reply.actions &1<<ofp.OFPAT_VENDOR):
115 supported_actions.append('OFPAT_VENDOR')
116 if(reply.actions &1<<ofp.OFPAT_ENQUEUE):
117 supported_actions.append('OFPAT_ENQUEUE')
118
Rich Lane9a003812012-10-04 17:17:59 -0700119 logging.info(supported_actions)
ShreyaPandita9306c772012-09-28 12:21:40 -0400120
121
Rich Laneb90a1c42012-10-05 09:16:05 -0700122class ForwardAll(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400123
124 """ForwardAll : Packet is sent to all dataplane ports
125 except ingress port when output action.port = OFPP_ALL"""
126
127 def runTest(self):
128
Rich Lane9a003812012-10-04 17:17:59 -0700129 logging.info("Running Forward_All test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400130
Rich Lane477f4812012-10-04 22:49:00 -0700131 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400132 of_ports.sort()
133 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
134
135 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800136 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400137
Rich Lane9a003812012-10-04 17:17:59 -0700138 logging.info("Insert a flow with output action port OFPP_ALL")
139 logging.info("Send packet matching the flow")
140 logging.info("Expecting packet on all dataplane ports except ingress_port")
ShreyaPandita9306c772012-09-28 12:21:40 -0400141
142 #Create a packet
143 pkt = simple_tcp_packet()
144 match = parse.packet_to_flow_match(pkt)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800145 act = ofp.action.output()
ShreyaPandita9306c772012-09-28 12:21:40 -0400146
147 #Delete all flows
Rich Lane32bf9482013-01-03 17:26:30 -0800148 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400149 ingress_port=of_ports[0]
150 match.in_port = ingress_port
151
152 #Create a flow mod with action.port = OFPP_ALL
Rich Lane28fa9272013-03-08 16:00:25 -0800153 request = ofp.message.flow_mod()
ShreyaPandita9306c772012-09-28 12:21:40 -0400154 request.match = match
155 request.match.wildcards = ofp.OFPFW_ALL&~ofp.OFPFW_IN_PORT
156 act.port = ofp.OFPP_ALL
Rich Lanec495d9e2013-03-08 17:43:36 -0800157 request.actions.append(act)
ShreyaPandita9306c772012-09-28 12:21:40 -0400158
Rich Lane9a003812012-10-04 17:17:59 -0700159 logging.info("Inserting flow")
Rich Lane5c3151c2013-01-03 17:15:41 -0800160 self.controller.message_send(request)
Rich Lane3a261d52013-01-03 17:45:08 -0800161 do_barrier(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400162
163 #Send Packet matching the flow
Rich Lane9a003812012-10-04 17:17:59 -0700164 logging.info("Sending packet to dp port " + str(ingress_port))
ShreyaPandita9306c772012-09-28 12:21:40 -0400165 self.dataplane.send(ingress_port, str(pkt))
166
167 #Verifying packets recieved on expected dataplane ports
168 yes_ports = set(of_ports).difference([ingress_port])
169 receive_pkt_check(self.dataplane, pkt, yes_ports, [ingress_port],
Rich Lane2014f9b2012-10-05 15:29:40 -0700170 self)
ShreyaPandita9306c772012-09-28 12:21:40 -0400171
172
Rich Laneb90a1c42012-10-05 09:16:05 -0700173class ForwardController(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400174
175 """ForwardController : Packet is sent to controller
176 output.port = OFPP_CONTROLLER"""
177
178 def runTest(self):
179
Rich Lane9a003812012-10-04 17:17:59 -0700180 logging.info("Running Forward_Controller test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400181
Rich Lane477f4812012-10-04 22:49:00 -0700182 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400183 of_ports.sort()
184 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
185
186 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800187 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400188
Rich Lane9a003812012-10-04 17:17:59 -0700189 logging.info("Insert a flow with output action port OFPP_CONTROLLER")
190 logging.info("Send packet matching the flow")
191 logging.info("Expecting packet on the control plane")
ShreyaPandita9306c772012-09-28 12:21:40 -0400192
193 #Create packet
194 pkt = simple_tcp_packet()
195 match = parse.packet_to_flow_match(pkt)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800196 act = ofp.action.output()
ShreyaPandita9306c772012-09-28 12:21:40 -0400197
198 for ingress_port in of_ports:
199 #Delete all flows
Rich Lane32bf9482013-01-03 17:26:30 -0800200 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400201
202 match.in_port = ingress_port
203
204 #Create a flow mod message
Rich Lane28fa9272013-03-08 16:00:25 -0800205 request = ofp.message.flow_mod()
ShreyaPandita9306c772012-09-28 12:21:40 -0400206 request.match = match
207 act.port = ofp.OFPP_CONTROLLER
Rich Lanec495d9e2013-03-08 17:43:36 -0800208 request.actions.append(act)
ShreyaPandita9306c772012-09-28 12:21:40 -0400209
Rich Lane9a003812012-10-04 17:17:59 -0700210 logging.info("Inserting flow")
Rich Lane5c3151c2013-01-03 17:15:41 -0800211 self.controller.message_send(request)
Rich Lane3a261d52013-01-03 17:45:08 -0800212 do_barrier(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400213
214 #Send packet matching the flow
Rich Lane9a003812012-10-04 17:17:59 -0700215 logging.info("Sending packet to dp port " + str(ingress_port))
ShreyaPandita9306c772012-09-28 12:21:40 -0400216 self.dataplane.send(ingress_port, str(pkt))
217
218 #Verifying packet recieved on the control plane port
219 (response, raw) = self.controller.poll(ofp.OFPT_PACKET_IN, timeout=10)
220 self.assertTrue(response is not None,
221 'Packet in message not received by controller')
222
223
224
Rich Laneb90a1c42012-10-05 09:16:05 -0700225class ForwardLocal(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400226
227 """ForwardLocal : Packet is sent to OFPP_LOCAL port .
228 TBD : To verify packet recieved in the local networking stack of switch"""
229
230 def runTest(self):
231
Rich Lane9a003812012-10-04 17:17:59 -0700232 logging.info("Running Forward_Local test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400233
Rich Lane477f4812012-10-04 22:49:00 -0700234 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400235 of_ports.sort()
236 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
237
238 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800239 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400240
Rich Lane9a003812012-10-04 17:17:59 -0700241 logging.info("Insert a flow with output action port OFPP_LOCAL")
242 logging.info("Send packet matching the flow")
243 logging.info("Expecting packet in the local networking stack of switch")
ShreyaPandita9306c772012-09-28 12:21:40 -0400244
245 #Clear switch state
246 pkt = simple_tcp_packet()
247 match = parse.packet_to_flow_match(pkt)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800248 act = ofp.action.output()
ShreyaPandita9306c772012-09-28 12:21:40 -0400249
250 for ingress_port in of_ports:
251 #Delete the flows
Rich Lane32bf9482013-01-03 17:26:30 -0800252 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400253
254 match.in_port = ingress_port
255 #Create flow mod message
Rich Lane28fa9272013-03-08 16:00:25 -0800256 request = ofp.message.flow_mod()
ShreyaPandita9306c772012-09-28 12:21:40 -0400257 request.match = match
258 act.port = ofp.OFPP_LOCAL
Rich Lanec495d9e2013-03-08 17:43:36 -0800259 request.actions.append(act)
ShreyaPandita9306c772012-09-28 12:21:40 -0400260
Rich Lane9a003812012-10-04 17:17:59 -0700261 logging.info("Inserting flow")
Rich Lane5c3151c2013-01-03 17:15:41 -0800262 self.controller.message_send(request)
Rich Lane3a261d52013-01-03 17:45:08 -0800263 do_barrier(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400264
265 #Send packet matching the flow
Rich Lane9a003812012-10-04 17:17:59 -0700266 logging.info("Sending packet to dp port " + str(ingress_port))
ShreyaPandita9306c772012-09-28 12:21:40 -0400267 self.dataplane.send(ingress_port, str(pkt))
268
269 #TBD: Verification of packets being recieved.
270
271
Rich Laneb90a1c42012-10-05 09:16:05 -0700272class ForwardFlood(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400273
274 """Forward:Flood : Packet is sent to all dataplane ports
275 except ingress port when output action.port = OFPP_FLOOD
276 TBD : Verification---Incase of STP being implemented, flood the packet along the minimum spanning tree,
277 not including the incoming interface. """
278
279 def runTest(self):
280
Rich Lane9a003812012-10-04 17:17:59 -0700281 logging.info("Running Forward_Flood test")
Rich Lane477f4812012-10-04 22:49:00 -0700282 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400283 of_ports.sort()
284 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
285
286 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800287 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400288
Rich Lane9a003812012-10-04 17:17:59 -0700289 logging.info("Insert a flow with output action port OFPP_FORWARD")
290 logging.info("Send packet matching the flow")
291 logging.info("Expecting packet on all the ports except the input port")
ShreyaPandita9306c772012-09-28 12:21:40 -0400292
293 #Create a packet
294 pkt = simple_tcp_packet()
295 match = parse.packet_to_flow_match(pkt)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800296 act = ofp.action.output()
ShreyaPandita9306c772012-09-28 12:21:40 -0400297
298 #Delete all flows
Rich Lane32bf9482013-01-03 17:26:30 -0800299 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400300 ingress_port=of_ports[0]
301 match.in_port = ingress_port
302
303 #Create a flow mod with action.port = OFPP_ALL
Rich Lane28fa9272013-03-08 16:00:25 -0800304 request = ofp.message.flow_mod()
ShreyaPandita9306c772012-09-28 12:21:40 -0400305 request.match = match
306 request.match.wildcards = ofp.OFPFW_ALL&~ofp.OFPFW_IN_PORT
307 act.port = ofp.OFPP_FLOOD
Rich Lanec495d9e2013-03-08 17:43:36 -0800308 request.actions.append(act)
ShreyaPandita9306c772012-09-28 12:21:40 -0400309
Rich Lane9a003812012-10-04 17:17:59 -0700310 logging.info("Inserting flow")
Rich Lane5c3151c2013-01-03 17:15:41 -0800311 self.controller.message_send(request)
Rich Lane3a261d52013-01-03 17:45:08 -0800312 do_barrier(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400313
314 #Send Packet matching the flow
Rich Lane9a003812012-10-04 17:17:59 -0700315 logging.info("Sending packet to dp port " + str(ingress_port))
ShreyaPandita9306c772012-09-28 12:21:40 -0400316 self.dataplane.send(ingress_port, str(pkt))
317
318 #Verifying packets recieved on expected dataplane ports
319 yes_ports = set(of_ports).difference([ingress_port])
320 receive_pkt_check(self.dataplane, pkt, yes_ports, [ingress_port],
Rich Lane2014f9b2012-10-05 15:29:40 -0700321 self)
ShreyaPandita9306c772012-09-28 12:21:40 -0400322
Rich Laneb90a1c42012-10-05 09:16:05 -0700323class ForwardInport(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400324
325 """ ForwardInPort : Packet sent to virtual port IN_PORT
326 If the output.port = OFPP.INPORT then the packet is sent to the input port itself"""
327
328 def runTest(self):
329
Rich Lane9a003812012-10-04 17:17:59 -0700330 logging.info("Running Forward_Inport test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400331
Rich Lane477f4812012-10-04 22:49:00 -0700332 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400333 of_ports.sort()
334 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
335
336 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800337 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400338
Rich Lane9a003812012-10-04 17:17:59 -0700339 logging.info("Insert a flow with output action port OFPP_INPORT")
340 logging.info("Send packet matching the flow")
341 logging.info("Expecting packet on the input port")
ShreyaPandita9306c772012-09-28 12:21:40 -0400342
343 #Create a packet
344 pkt = simple_tcp_packet()
345 match = parse.packet_to_flow_match(pkt)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800346 act = ofp.action.output()
ShreyaPandita9306c772012-09-28 12:21:40 -0400347
348 #Delete the flows
Rich Lane32bf9482013-01-03 17:26:30 -0800349 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400350 ingress_port=of_ports[0]
351 match.in_port = ingress_port
352
353 # Create a flow mod message
Rich Lane28fa9272013-03-08 16:00:25 -0800354 request = ofp.message.flow_mod()
ShreyaPandita9306c772012-09-28 12:21:40 -0400355 request.match = match
356 act.port = ofp.OFPP_IN_PORT
357
Rich Lanec495d9e2013-03-08 17:43:36 -0800358 request.actions.append(act)
Rich Lane9a003812012-10-04 17:17:59 -0700359 logging.info("Inserting flow")
Rich Lane5c3151c2013-01-03 17:15:41 -0800360 self.controller.message_send(request)
Rich Lane3a261d52013-01-03 17:45:08 -0800361 do_barrier(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400362
363 #Send packet matching the flow
Rich Lane9a003812012-10-04 17:17:59 -0700364 logging.info("Sending packet to dp port " + str(ingress_port))
ShreyaPandita9306c772012-09-28 12:21:40 -0400365 self.dataplane.send(ingress_port, str(pkt))
366 yes_ports = [ingress_port]
367
368 #Verfying packet recieved on expected dataplane ports
369 receive_pkt_check(self.dataplane, pkt, yes_ports,set(of_ports).difference([ingress_port]),
Rich Lane2014f9b2012-10-05 15:29:40 -0700370 self)
ShreyaPandita9306c772012-09-28 12:21:40 -0400371
Rich Laneb90a1c42012-10-05 09:16:05 -0700372class ForwardTable(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400373
374 """ForwardTable : Perform actions in flow table. Only for packet-out messages.
375 If the output action.port in the packetout message = OFP.TABLE , then
376 the packet implements the action specified in the matching flow of the FLOW-TABLE"""
377
378 def runTest(self):
379
Rich Lane9a003812012-10-04 17:17:59 -0700380 logging.info("Running Forward_Table test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400381
Rich Lane477f4812012-10-04 22:49:00 -0700382 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400383 of_ports.sort()
384 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
385
386 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800387 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400388
Rich Lane9a003812012-10-04 17:17:59 -0700389 logging.info("Insert a flow F with output action port set to some egress_port")
390 logging.info("Send packet out message (matching flow F) with action.port = OFP.TABLE")
391 logging.info("Expecting packet on the egress_port")
ShreyaPandita9306c772012-09-28 12:21:40 -0400392
393 #Insert a all wildcarded flow
ShreyaPandita8dab4662012-11-02 13:40:14 -0400394 (pkt,match) = wildcard_all(self,of_ports)
ShreyaPandita9306c772012-09-28 12:21:40 -0400395
396 #Create a packet out message
Rich Lane28fa9272013-03-08 16:00:25 -0800397 pkt_out =ofp.message.packet_out();
ShreyaPandita9306c772012-09-28 12:21:40 -0400398 pkt_out.data = str(pkt)
399 pkt_out.in_port = of_ports[0]
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800400 act = ofp.action.output()
ShreyaPandita9306c772012-09-28 12:21:40 -0400401 act.port = ofp.OFPP_TABLE
Rich Lanec495d9e2013-03-08 17:43:36 -0800402 pkt_out.actions.append(act)
Rich Lane5c3151c2013-01-03 17:15:41 -0800403 self.controller.message_send(pkt_out)
ShreyaPandita9306c772012-09-28 12:21:40 -0400404
405 #Verifying packet out message recieved on the expected dataplane port.
406 (of_port, pkt, pkt_time) = self.dataplane.poll(port_number=of_ports[1],
407 exp_pkt=pkt,timeout=3)
408 self.assertTrue(pkt is not None, 'Packet not received')
409
410
Rich Laneb90a1c42012-10-05 09:16:05 -0700411class AddVlanTag(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400412
413 """AddVlanTag : Adds VLAN Tag to untagged packet."""
414
415 def runTest(self):
416
Rich Lane9a003812012-10-04 17:17:59 -0700417 logging.info("Running Add_vlan_tag test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400418
Rich Lane477f4812012-10-04 22:49:00 -0700419 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400420 of_ports.sort()
421 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
422
423 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800424 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400425
Rich Lane9a003812012-10-04 17:17:59 -0700426 logging.info("Verify if switch supports the action -- set vlan id, if not skip the test")
427 logging.info("Insert a flow with set vid action")
428 logging.info("Send packet matching the flow , verify recieved packet has vid set")
ShreyaPandita9306c772012-09-28 12:21:40 -0400429
430 #Verify set_vlan_id is a supported action
431 sup_acts = sw_supported_actions(self)
432 if not(sup_acts & 1<<ofp.OFPAT_SET_VLAN_VID):
433 skip_message_emit(self, "Add VLAN tag test skipped")
434 return
435
436 #Create packet to be sent and an expected packet with vid set
437 new_vid = 2
438 len_wo_vid = 100
439 len_w_vid = 104
440 pkt = simple_tcp_packet(pktlen=len_wo_vid)
441 exp_pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True,
Rich Laned0478ff2013-03-11 12:46:58 -0700442 vlan_vid=new_vid,vlan_pcp=0)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800443 vid_act = ofp.action.set_vlan_vid()
ShreyaPandita9306c772012-09-28 12:21:40 -0400444 vid_act.vlan_vid = new_vid
445
446 #Insert flow with action -- set vid , Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700447 flow_match_test(self, config["port_map"], pkt=pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400448 exp_pkt=exp_pkt, action_list=[vid_act])
449
Rich Laneb90a1c42012-10-05 09:16:05 -0700450class ModifyVlanTag(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400451
452 """ModifyVlanTag : Modifies VLAN Tag to tagged packet."""
453
454 def runTest(self):
455
Rich Lane9a003812012-10-04 17:17:59 -0700456 logging.info("Running Modify_Vlan_Tag test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400457
Rich Lane477f4812012-10-04 22:49:00 -0700458 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400459 of_ports.sort()
460 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
461
462 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800463 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400464
Rich Lane9a003812012-10-04 17:17:59 -0700465 logging.info("Verify if switch supports the action -- modify vlan id, if not skip the test")
466 logging.info("Insert a flow with action --set vid ")
467 logging.info("Send tagged packet matching the flow , verify recieved packet has vid rewritten")
ShreyaPandita9306c772012-09-28 12:21:40 -0400468
469 #Verify set_vlan_id is a supported action
470 sup_acts = sw_supported_actions(self)
471 if not (sup_acts & 1 << ofp.OFPAT_SET_VLAN_VID):
472 skip_message_emit(self, "Modify VLAN tag test skipped")
473 return
474
475 #Create a tagged packet with old_vid to be sent, and expected packet with new_vid
476 old_vid = 2
477 new_vid = 3
Rich Laned0478ff2013-03-11 12:46:58 -0700478 pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=old_vid)
479 exp_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=new_vid)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800480 vid_act = ofp.action.set_vlan_vid()
ShreyaPandita9306c772012-09-28 12:21:40 -0400481 vid_act.vlan_vid = new_vid
482
483 #Insert flow with action -- set vid , Send packet matching the flow.Verify recieved packet is expected packet.
Rich Lane477f4812012-10-04 22:49:00 -0700484 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400485 action_list=[vid_act])
486
Rich Laneb90a1c42012-10-05 09:16:05 -0700487class VlanPrio1(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400488
489 """AddVlanPrioUntaggedPkt : Add VLAN priority to untagged packet."""
490
491 def runTest(self):
492
Rich Lane9a003812012-10-04 17:17:59 -0700493 logging.info("Running vlan_Prio_1 test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400494
Rich Lane477f4812012-10-04 22:49:00 -0700495 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400496 of_ports.sort()
497 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
498
499 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800500 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400501
Rich Lane9a003812012-10-04 17:17:59 -0700502 logging.info("Verify if switch supports the action -- set vlan priority, if not skip the test")
503 logging.info("Insert a flow with action -- set vlan priority ")
504 logging.info("Send untagged packet matching the flow , verify recieved packet has specified VLAN priority and has vid set tO 0 ")
ShreyaPandita9306c772012-09-28 12:21:40 -0400505
506 #Verify set_vlan_priority is a supported action
507 sup_acts = sw_supported_actions(self)
508 if not (sup_acts & 1 << ofp.OFPAT_SET_VLAN_PCP):
509 skip_message_emit(self, "Set VLAN priority test skipped")
510 return
511
512 #Create a untagged packet to be sent and an expected packet with vid = 0 , vlan_priority set.
513 vlan_id = 0
Rich Lane123928c2012-10-04 21:28:53 -0700514 vlan_pcp = 1
Dan Talayco3bfc8222013-02-13 18:18:57 -0800515 pktlen = 64 if config["minsize"] < 64 else config["minsize"]
516 pkt = simple_tcp_packet(pktlen=pktlen)
Rich Laned0478ff2013-03-11 12:46:58 -0700517 exp_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vlan_id,vlan_pcp=vlan_pcp, pktlen=pktlen + 4)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800518 act = ofp.action.set_vlan_pcp()
Rich Lane123928c2012-10-04 21:28:53 -0700519 act.vlan_pcp = vlan_pcp
ShreyaPandita9306c772012-09-28 12:21:40 -0400520
521 #Insert flow with action -- set vLAN priority, Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700522 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400523 action_list=[act])
524
525
Rich Laneb90a1c42012-10-05 09:16:05 -0700526class VlanPrio2(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400527
528 """ModifyVlanPrio : Modify VLAN priority to tagged packet."""
529
530 def runTest(self):
531
Rich Lane9a003812012-10-04 17:17:59 -0700532 logging.info("Running Vlan_Prio_2 test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400533
Rich Lane477f4812012-10-04 22:49:00 -0700534 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400535 of_ports.sort()
536 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
537
538 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800539 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400540
Rich Lane9a003812012-10-04 17:17:59 -0700541 logging.info("Verify if switch supports the action -- set vlan priority, if not skip the test")
542 logging.info("Insert a flow with action -- set vlan priority ")
543 logging.info("Send tagged packet matching the flow, verify recieved packet has vlan priority rewritten")
ShreyaPandita9306c772012-09-28 12:21:40 -0400544
545 #Verify set_vlan_priority is a supported action
546 sup_acts = sw_supported_actions(self,"true")
547 if not (sup_acts & 1 << ofp.OFPAT_SET_VLAN_PCP):
548 skip_message_emit(self, "modify_vlan_prio test skipped")
549 return
550
551 #Create a tagged packet , and an expected packet with vlan_priority set to specified value
552 vid = 123
553 old_vlan_pcp = 2
554 new_vlan_pcp = 3
Rich Laned0478ff2013-03-11 12:46:58 -0700555 pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vid, vlan_pcp=old_vlan_pcp)
556 exp_pkt = simple_tcp_packet(dl_vlan_enable=True, vlan_vid=vid, vlan_pcp=new_vlan_pcp)
Rich Lane9d3cc6b2013-03-08 16:33:08 -0800557 vid_act = ofp.action.set_vlan_pcp()
ShreyaPandita9306c772012-09-28 12:21:40 -0400558 vid_act.vlan_pcp = new_vlan_pcp
559
560 #Insert flow with action -- set vLAN priority, Send tagged packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700561 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400562 action_list=[vid_act])
563
564
Rich Laneb90a1c42012-10-05 09:16:05 -0700565class ModifyL2Src(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400566
567 """ModifyL2Src :Modify the source MAC address"""
568
569 def runTest(self):
570
Rich Lane9a003812012-10-04 17:17:59 -0700571 logging.info("Running Modify_L2_Src test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400572
Rich Lane477f4812012-10-04 22:49:00 -0700573 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400574 of_ports.sort()
575 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
576
577 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800578 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400579
Rich Lane9a003812012-10-04 17:17:59 -0700580 logging.info("Verify if switch supports the action -- modify_l2_src, if not skip the test")
581 logging.info("Insert a flow with action -- set etherent src address")
582 logging.info("Send packet matching the flow, verify recieved packet src address rewritten ")
ShreyaPandita9306c772012-09-28 12:21:40 -0400583
584 #Verify set_dl_src is a supported action
585 sup_acts = sw_supported_actions(self,use_cache="true")
586 if not (sup_acts & 1 << ofp.OFPAT_SET_DL_SRC):
587 skip_message_emit(self, "modify_l2_src test skipped")
588 return
589
Rich Laned0478ff2013-03-11 12:46:58 -0700590 #Create packet to be sent and expected packet with eth_src set to specified value
591 (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_src'],
ShreyaPandita9306c772012-09-28 12:21:40 -0400592 check_test_params=True)
593
594 #Insert flow with action -- set src address, Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700595 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400596 action_list=acts, max_test=2)
597
598
Rich Laneb90a1c42012-10-05 09:16:05 -0700599class ModifyL2Dst(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400600
601 """ModifyL2SDSt :Modify the dest MAC address"""
602
603 def runTest(self):
604
Rich Lane9a003812012-10-04 17:17:59 -0700605 logging.info("Running Modify_L2_Dst test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400606
Rich Lane477f4812012-10-04 22:49:00 -0700607 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400608 of_ports.sort()
609 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
610
611 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800612 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400613
Rich Lane9a003812012-10-04 17:17:59 -0700614 logging.info("Verify if switch supports the action -- modify_l2_dst, if not skip the test")
615 logging.info("Insert a flow with action -- set etherent dst address ")
616 logging.info("Send packet matching the flow, verify recieved packet dst address rewritten ")
ShreyaPandita9306c772012-09-28 12:21:40 -0400617
618 #Verify set_dl_dst is a supported action
619 sup_acts = sw_supported_actions(self)
620 if not (sup_acts & 1 << ofp.OFPAT_SET_DL_DST):
621 skip_message_emit(self, "modify_l2_dst test skipped")
622 return
623
Rich Laned0478ff2013-03-11 12:46:58 -0700624 #Create packet to be sent and expected packet with eth_src set to specified value
625 (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['eth_dst'],
ShreyaPandita9306c772012-09-28 12:21:40 -0400626 check_test_params=True)
627
628 #Insert flow with action -- set dst address, Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700629 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400630 action_list=acts, max_test=2)
631
Rich Laneb90a1c42012-10-05 09:16:05 -0700632class ModifyL3Src(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400633
634 """ModifyL3Src : Modify the source IP address of an IP packet """
635
636 def runTest(self):
637
Rich Lane9a003812012-10-04 17:17:59 -0700638 logging.info("Running Modify_L3_Src test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400639
Rich Lane477f4812012-10-04 22:49:00 -0700640 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400641 of_ports.sort()
642 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
643
644 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800645 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400646
Rich Lane9a003812012-10-04 17:17:59 -0700647 logging.info("Verify if switch supports the action -- modify_l3_src, if not skip the test")
648 logging.info("Insert a flow with action -- set network src address ")
649 logging.info("Send packet matching the flow, verify recieved packet network src address rewritten ")
ShreyaPandita9306c772012-09-28 12:21:40 -0400650
651 #Verify set_nw_src is a supported action
652 sup_acts = sw_supported_actions(self)
653 if not (sup_acts & 1 << ofp.OFPAT_SET_NW_SRC):
654 skip_message_emit(self, "modify_l3_src test")
655 return
656
Rich Laned0478ff2013-03-11 12:46:58 -0700657 #Create packet to be sent and expected packet with ipv4_src set to specified value
ShreyaPandita9306c772012-09-28 12:21:40 -0400658 (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['ip_src'],
659 check_test_params=True)
660
661 #Insert flow with action -- set nw src address, Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700662 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400663 action_list=acts, max_test=2)
664
Rich Laneb90a1c42012-10-05 09:16:05 -0700665class ModifyL3Dst(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400666
667 """ModifyL3Dst :Modify the dest IP address of an IP packet"""
668
669 def runTest(self):
670
Rich Lane9a003812012-10-04 17:17:59 -0700671 logging.info("Running Modify_L3_Dst test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400672
Rich Lane477f4812012-10-04 22:49:00 -0700673 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400674 of_ports.sort()
675 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
676
677 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800678 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400679
Rich Lane9a003812012-10-04 17:17:59 -0700680 logging.info("Verify if switch supports the action -- modify_l3_dst, if not skip the test")
681 logging.info("Insert a flow with action -- set network dst address ")
682 logging.info("Send packet matching the flow, verify recieved packet network dst address rewritten ")
ShreyaPandita9306c772012-09-28 12:21:40 -0400683
684 #Verify set_nw_dst is a supported action
685 sup_acts = sw_supported_actions(self,use_cache="true")
686 if not (sup_acts & 1 << ofp.OFPAT_SET_NW_DST):
687 skip_message_emit(self, "modify_l3_dst test skipped")
688 return
689
Rich Laned0478ff2013-03-11 12:46:58 -0700690 #Create packet to be sent and expected packet with ipv4_dst set to specified value
ShreyaPandita9306c772012-09-28 12:21:40 -0400691 (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['ip_dst'],
692 check_test_params=True)
693
694 #Insert flow with action -- set nw dst address, Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700695 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400696 action_list=acts, max_test=2)
697
698
Rich Laneb90a1c42012-10-05 09:16:05 -0700699class ModifyL4Src(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400700
701 """ModifyL4Src : Modify the source TCP port of a TCP packet"""
702
703 def runTest(self):
704
Rich Lane9a003812012-10-04 17:17:59 -0700705 logging.info("Running Modify_L4_Src test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400706
Rich Lane477f4812012-10-04 22:49:00 -0700707 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400708 of_ports.sort()
709 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
710
711 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800712 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400713
Rich Lane9a003812012-10-04 17:17:59 -0700714 logging.info("Verify if switch supports the action -- modify_l4_src, if not skip the test")
715 logging.info("Insert a flow with action -- set src tcp port")
716 logging.info("Send packet matching the flow, verify recieved packet src tcp port is rewritten ")
ShreyaPandita9306c772012-09-28 12:21:40 -0400717
718 #Verify set_tp_src is a supported action
719 sup_acts = sw_supported_actions(self,use_cache="true")
720 if not (sup_acts & 1 << ofp.OFPAT_SET_TP_SRC):
721 skip_message_emit(self, "modify_l4_src test skipped")
722 return
723
724 #Create packet to be sent and expected packet with tcp_src set to specified value
725 (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['tcp_sport'],
726 check_test_params=True)
727
728 #Insert flow with action -- set tcp src port, Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700729 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400730 action_list=acts, max_test=2)
731
Rich Laneb90a1c42012-10-05 09:16:05 -0700732class ModifyL4Dst(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400733
734 """ ModifyL4Dst: Modify the dest TCP port of a TCP packet """
735
736 def runTest(self):
737
Rich Lane9a003812012-10-04 17:17:59 -0700738 logging.info("Running Modify_L4_Dst test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400739
Rich Lane477f4812012-10-04 22:49:00 -0700740 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400741 of_ports.sort()
742 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
743
744 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800745 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400746
Rich Lane9a003812012-10-04 17:17:59 -0700747 logging.info("Verify if switch supports the action -- modify_l4_dst, if not skip the test")
748 logging.info("Insert a flow with action -- set dst tcp port")
749 logging.info("Send packet matching the flow, verify recieved packet dst tcp port is rewritten ")
ShreyaPandita9306c772012-09-28 12:21:40 -0400750
751 #Verify set_tp_dst is a supported action
752 sup_acts = sw_supported_actions(self,use_cache="true")
753 if not (sup_acts & 1 << ofp.OFPAT_SET_TP_DST):
754 skip_message_emit(self, "ModifyL4Dst test")
755 return
756
757 #Create packet to be sent and expected packet with tcp_dst set to specified value
758 (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['tcp_dport'],
759 check_test_params=True)
760
761 #Insert flow with action -- set tcp dst port, Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700762 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400763 action_list=acts, max_test=2)
764
Rich Laneb90a1c42012-10-05 09:16:05 -0700765class ModifyTos(base_tests.SimpleDataPlane):
ShreyaPandita9306c772012-09-28 12:21:40 -0400766
767 """ModifyTOS :Modify the IP type of service of an IP packet"""
768
769 def runTest(self):
770
Rich Lane9a003812012-10-04 17:17:59 -0700771 logging.info("Running Modify_Tos test")
ShreyaPandita9306c772012-09-28 12:21:40 -0400772
Rich Lane477f4812012-10-04 22:49:00 -0700773 of_ports = config["port_map"].keys()
ShreyaPandita9306c772012-09-28 12:21:40 -0400774 of_ports.sort()
775 self.assertTrue(len(of_ports) > 1, "Not enough ports for test")
776
777 #Clear switch state
Rich Lane32bf9482013-01-03 17:26:30 -0800778 delete_all_flows(self.controller)
ShreyaPandita9306c772012-09-28 12:21:40 -0400779
Rich Lane9a003812012-10-04 17:17:59 -0700780 logging.info("Verify if switch supports the action -- modify_tos, if not skip the test")
781 logging.info("Insert a flow with action -- set type of service ")
782 logging.info("Send packet matching the flow, verify recieved packet has TOS rewritten ")
ShreyaPandita9306c772012-09-28 12:21:40 -0400783
784 #Verify set_tos is a supported action
785 sup_acts = sw_supported_actions(self,use_cache="true")
786 if not (sup_acts & 1 << ofp.OFPAT_SET_NW_TOS):
787 skip_message_emit(self, "ModifyTOS test")
788 return
789
790 #Create packet to be sent and expected packet with TOS set to specified value
791 (pkt, exp_pkt, acts) = pkt_action_setup(self, mod_fields=['ip_tos'],
792 check_test_params=True)
793
794 #Insert flow with action -- set TOS, Send packet matching the flow, Verify recieved packet is expected packet
Rich Lane477f4812012-10-04 22:49:00 -0700795 flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt,
ShreyaPandita9306c772012-09-28 12:21:40 -0400796 action_list=acts, max_test=2, egr_count=-1)