blob: 9e3fea65979b80b141e12e486328e4caea664acb [file] [log] [blame]
ShreyaPandita6fbff252012-11-13 16:56:48 -05001""" Some common function definitions used by Conformance tests -- OF-SWITCH 1.0.0 Testcases """
ShreyaPandita60e45542012-09-27 15:11:16 -04002
3import sys
4import copy
5import random
6
7import oftest.controller as controller
8import oftest.cstruct as ofp
9import oftest.message as message
10import oftest.dataplane as dataplane
11import oftest.action as action
12import oftest.parse as parse
13import logging
14import types
ShreyaPandita66de26f2012-10-26 14:44:24 -040015
Rich Laneb90a1c42012-10-05 09:16:05 -070016import oftest.base_tests as base_tests
Rich Laneda3b5ad2012-10-03 09:05:32 -070017from oftest.testutils import *
ShreyaPandita60e45542012-09-27 15:11:16 -040018from time import sleep
19
20#################### Functions for various types of flow_mod ##########################################################################################
21
ShreyaPanditaed209962012-11-04 02:16:48 -050022def exact_match(self,of_ports,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -040023# Generate ExactMatch flow .
24
ShreyaPandita4ebbac32012-11-02 13:40:44 -040025 #Create a simple tcp packet and generate exact flow match from it.
26 pkt_exactflow = simple_tcp_packet()
27 match = parse.packet_to_flow_match(pkt_exactflow)
28 self.assertTrue(match is not None, "Could not generate flow match from pkt")
29 match.in_port = of_ports[0]
30 #match.nw_src = 1
31 match.wildcards=0
32 msg = message.flow_mod()
33 msg.out_port = ofp.OFPP_NONE
34 msg.command = ofp.OFPFC_ADD
35 msg.buffer_id = 0xffffffff
36 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -050037 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -040038 msg.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -040039
ShreyaPandita4ebbac32012-11-02 13:40:44 -040040 act = action.action_output()
41 act.port = of_ports[1]
42 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita60e45542012-09-27 15:11:16 -040043
ShreyaPandita4ebbac32012-11-02 13:40:44 -040044 rv = self.controller.message_send(msg)
45 self.assertTrue(rv != -1, "Error installing flow mod")
46 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -040047
ShreyaPandita4ebbac32012-11-02 13:40:44 -040048 return (pkt_exactflow,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -040049
ShreyaPanditaed209962012-11-04 02:16:48 -050050def exact_match_with_prio(self,of_ports,priority=None):
ShreyaPandita4ebbac32012-11-02 13:40:44 -040051 # Generate ExactMatch with action output to port 2
ShreyaPandita66de26f2012-10-26 14:44:24 -040052
ShreyaPandita4ebbac32012-11-02 13:40:44 -040053 #Create a simple tcp packet and generate exact flow match from it.
54 pkt_exactflow = simple_tcp_packet()
55 match = parse.packet_to_flow_match(pkt_exactflow)
56 self.assertTrue(match is not None, "Could not generate flow match from pkt")
57 match.in_port = of_ports[0]
58 #match.nw_src = 1
59 match.wildcards=0
60 msg = message.flow_mod()
61 msg.out_port = ofp.OFPP_NONE
62 msg.command = ofp.OFPFC_ADD
63 msg.buffer_id = 0xffffffff
64 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -050065 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -040066 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -040067
ShreyaPandita4ebbac32012-11-02 13:40:44 -040068 act = action.action_output()
69 act.port = of_ports[2]
70 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -040071
ShreyaPandita4ebbac32012-11-02 13:40:44 -040072 rv = self.controller.message_send(msg)
73 self.assertTrue(rv != -1, "Error installing flow mod")
74 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -040075
ShreyaPandita4ebbac32012-11-02 13:40:44 -040076 return (pkt_exactflow,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -040077
ShreyaPandita60e45542012-09-27 15:11:16 -040078
ShreyaPanditaed209962012-11-04 02:16:48 -050079def match_all_except_source_address(self,of_ports,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -040080# Generate Match_All_Except_Source_Address flow
81
ShreyaPandita4ebbac32012-11-02 13:40:44 -040082 #Create a simple tcp packet and generate match all except src address flow.
83 pkt_wildcardsrc= simple_tcp_packet()
84 match1 = parse.packet_to_flow_match(pkt_wildcardsrc)
85 self.assertTrue(match1 is not None, "Could not generate flow match from pkt")
86 match1.in_port = of_ports[0]
87 #match1.nw_src = 1
88 match1.wildcards = ofp.OFPFW_DL_SRC
89 msg1 = message.flow_mod()
90 msg1.out_port = ofp.OFPP_NONE
91 msg1.command = ofp.OFPFC_ADD
92 msg1.buffer_id = 0xffffffff
93 msg1.match = match1
ShreyaPanditaed209962012-11-04 02:16:48 -050094 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -040095 msg1.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -040096
ShreyaPandita4ebbac32012-11-02 13:40:44 -040097 act1 = action.action_output()
98 act1.port = of_ports[1]
99 self.assertTrue(msg1.actions.add(act1), "could not add action")
ShreyaPandita60e45542012-09-27 15:11:16 -0400100
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400101 rv = self.controller.message_send(msg1)
102 self.assertTrue(rv != -1, "Error installing flow mod")
103 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400104
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400105 return (pkt_wildcardsrc,match1)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400106
ShreyaPandita6fbff252012-11-13 16:56:48 -0500107def match_ethernet_src_address(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400108 #Generate Match_Ethernet_SrC_Address flow
109
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400110 #Create a simple tcp packet and generate match on ethernet src address flow
ShreyaPandita6fbff252012-11-13 16:56:48 -0500111 pkt_MatchSrc = simple_eth_packet(dl_src='00:01:01:01:01:01')
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400112 match = parse.packet_to_flow_match(pkt_MatchSrc)
113 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400114
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400115 match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_SRC
ShreyaPandita60e45542012-09-27 15:11:16 -0400116
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400117 msg = message.flow_mod()
118 msg.out_port = ofp.OFPP_NONE
119 msg.command = ofp.OFPFC_ADD
120 msg.buffer_id = 0xffffffff
121 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500122 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400123 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400124
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400125 act = action.action_output()
126 act.port = of_ports[1]
127 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400128
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400129 rv = self.controller.message_send(msg)
130 self.assertTrue(rv != -1, "Error installing flow mod")
131 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400132
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400133 return (pkt_MatchSrc,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400134
ShreyaPanditaed209962012-11-04 02:16:48 -0500135def match_ethernet_dst_address(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400136 #Generate Match_Ethernet_Dst_Address flow
137
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400138 #Create a simple tcp packet and generate match on ethernet dst address flow
ShreyaPandita6fbff252012-11-13 16:56:48 -0500139 pkt_matchdst = simple_eth_packet(dl_dst='00:01:01:01:01:01')
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400140 match = parse.packet_to_flow_match(pkt_matchdst)
141 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400142
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400143 match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_DST
144 msg = message.flow_mod()
145 msg.out_port = ofp.OFPP_NONE
146 msg.command = ofp.OFPFC_ADD
147 msg.buffer_id = 0xffffffff
148 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500149 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400150 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400151
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400152 act = action.action_output()
153 act.port = of_ports[1]
154 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400155
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400156 rv = self.controller.message_send(msg)
157 self.assertTrue(rv != -1, "Error installing flow mod")
158 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400159
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400160 return (pkt_matchdst,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400161
ShreyaPanditaed209962012-11-04 02:16:48 -0500162def wildcard_all(self,of_ports,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400163# Generate a Wildcard_All Flow
164
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400165 #Create a simple tcp packet and generate wildcard all flow match from it.
166 pkt_wildcard = simple_tcp_packet()
167 match2 = parse.packet_to_flow_match(pkt_wildcard)
168 self.assertTrue(match2 is not None, "Could not generate flow match from pkt")
169 match2.wildcards=ofp.OFPFW_ALL
170 match2.in_port = of_ports[0]
ShreyaPandita60e45542012-09-27 15:11:16 -0400171
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400172 msg2 = message.flow_mod()
173 msg2.out_port = ofp.OFPP_NONE
174 msg2.command = ofp.OFPFC_ADD
175 msg2.buffer_id = 0xffffffff
176 msg2.match = match2
177 act2 = action.action_output()
178 act2.port = of_ports[1]
179 self.assertTrue(msg2.actions.add(act2), "could not add action")
ShreyaPanditaed209962012-11-04 02:16:48 -0500180 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400181 msg2.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -0400182
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400183 rv = self.controller.message_send(msg2)
184 self.assertTrue(rv != -1, "Error installing flow mod")
185 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400186
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400187 return (pkt_wildcard,match2)
ShreyaPandita60e45542012-09-27 15:11:16 -0400188
ShreyaPanditaed209962012-11-04 02:16:48 -0500189def wildcard_all_except_ingress(self,of_ports,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400190# Generate Wildcard_All_Except_Ingress_port flow
191
192
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400193 #Create a simple tcp packet and generate wildcard all except ingress_port flow.
194 pkt_matchingress = simple_tcp_packet()
195 match3 = parse.packet_to_flow_match(pkt_matchingress)
196 self.assertTrue(match3 is not None, "Could not generate flow match from pkt")
197 match3.wildcards = ofp.OFPFW_ALL-ofp.OFPFW_IN_PORT
198 match3.in_port = of_ports[0]
ShreyaPandita60e45542012-09-27 15:11:16 -0400199
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400200 msg3 = message.flow_mod()
201 msg3.command = ofp.OFPFC_ADD
202 msg3.match = match3
203 msg3.out_port = of_ports[2] # ignored by flow add,flow modify
204 msg3.cookie = random.randint(0,9007199254740992)
205 msg3.buffer_id = 0xffffffff
206 msg3.idle_timeout = 0
207 msg3.hard_timeout = 0
208 msg3.buffer_id = 0xffffffff
ShreyaPandita60e45542012-09-27 15:11:16 -0400209
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400210 act3 = action.action_output()
211 act3.port = of_ports[1]
212 self.assertTrue(msg3.actions.add(act3), "could not add action")
ShreyaPandita60e45542012-09-27 15:11:16 -0400213
ShreyaPanditaed209962012-11-04 02:16:48 -0500214 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400215 msg3.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -0400216
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400217 rv = self.controller.message_send(msg3)
218 self.assertTrue(rv != -1, "Error installing flow mod")
219 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400220
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400221 return (pkt_matchingress,match3)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400222
ShreyaPanditaed209962012-11-04 02:16:48 -0500223def wildcard_all_except_ingress1(self,of_ports,priority=None):
ShreyaPanditada75f752012-10-26 16:26:35 -0400224# Generate Wildcard_All_Except_Ingress_port flow with action output to port egress_port 2
225
226
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400227 #Create a simple tcp packet and generate wildcard all except ingress_port flow.
228 pkt_matchingress = simple_tcp_packet()
229 match3 = parse.packet_to_flow_match(pkt_matchingress)
230 self.assertTrue(match3 is not None, "Could not generate flow match from pkt")
231 match3.wildcards = ofp.OFPFW_ALL-ofp.OFPFW_IN_PORT
232 match3.in_port = of_ports[0]
ShreyaPanditada75f752012-10-26 16:26:35 -0400233
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400234 msg3 = message.flow_mod()
235 msg3.command = ofp.OFPFC_ADD
236 msg3.match = match3
237 msg3.out_port = of_ports[2] # ignored by flow add,flow modify
238 msg3.cookie = random.randint(0,9007199254740992)
239 msg3.buffer_id = 0xffffffff
240 msg3.idle_timeout = 0
241 msg3.hard_timeout = 0
242 msg3.buffer_id = 0xffffffff
ShreyaPanditada75f752012-10-26 16:26:35 -0400243
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400244 act3 = action.action_output()
245 act3.port = of_ports[2]
246 self.assertTrue(msg3.actions.add(act3), "could not add action")
ShreyaPanditaed209962012-11-04 02:16:48 -0500247 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400248 msg3.priority = priority
ShreyaPanditada75f752012-10-26 16:26:35 -0400249
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400250 rv = self.controller.message_send(msg3)
251 self.assertTrue(rv != -1, "Error installing flow mod")
252 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPanditada75f752012-10-26 16:26:35 -0400253
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400254 return (pkt_matchingress,match3)
ShreyaPanditada75f752012-10-26 16:26:35 -0400255
256
ShreyaPanditaed209962012-11-04 02:16:48 -0500257def match_vlan_id(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400258 #Generate Match_Vlan_Id
259
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400260 #Create a simple tcp packet and generate match on ethernet dst address flow
261 pkt_matchvlanid = simple_tcp_packet(dl_vlan_enable=True,dl_vlan=1)
262 match = parse.packet_to_flow_match(pkt_matchvlanid)
263 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400264
ShreyaPandita6fbff252012-11-13 16:56:48 -0500265 match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_DL_VLAN
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400266 msg = message.flow_mod()
267 msg.out_port = ofp.OFPP_NONE
268 msg.command = ofp.OFPFC_ADD
269 msg.buffer_id = 0xffffffff
270 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500271 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400272 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400273
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400274 act = action.action_output()
275 act.port = of_ports[1]
276 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400277
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400278 rv = self.controller.message_send(msg)
279 self.assertTrue(rv != -1, "Error installing flow mod")
280 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400281
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400282 return (pkt_matchvlanid,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400283
ShreyaPanditaed209962012-11-04 02:16:48 -0500284def match_vlan_pcp(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400285 #Generate Match_Vlan_Id
286
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400287 #Create a simple tcp packet and generate match on ethernet dst address flow
288 pkt_matchvlanpcp = simple_tcp_packet(dl_vlan_enable=True,dl_vlan=1,dl_vlan_pcp=10)
289 match = parse.packet_to_flow_match(pkt_matchvlanpcp)
290 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400291
ShreyaPandita6fbff252012-11-13 16:56:48 -0500292 match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE^ofp.OFPFW_DL_VLAN^ofp.OFPFW_DL_VLAN_PCP
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400293 msg = message.flow_mod()
294 msg.out_port = ofp.OFPP_NONE
295 msg.command = ofp.OFPFC_ADD
296 msg.buffer_id = 0xffffffff
297 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500298 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400299 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400300
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400301 act = action.action_output()
302 act.port = of_ports[1]
303 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400304
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400305 rv = self.controller.message_send(msg)
306 self.assertTrue(rv != -1, "Error installing flow mod")
307 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400308
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400309 return (pkt_matchvlanpcp,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400310
311
ShreyaPanditaed209962012-11-04 02:16:48 -0500312def match_mul_l2(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400313 #Generate Match_Mul_L2 flow
314
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400315 #Create a simple eth packet and generate match on ethernet protocol flow
316 pkt_mulL2 = simple_eth_packet(dl_type=0x88cc,dl_src='00:01:01:01:01:01',dl_dst='00:01:01:01:01:02')
317 match = parse.packet_to_flow_match(pkt_mulL2)
318 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400319
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400320 match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_DL_DST ^ofp.OFPFW_DL_SRC
321 msg = message.flow_mod()
322 msg.out_port = ofp.OFPP_NONE
323 msg.command = ofp.OFPFC_ADD
324 msg.buffer_id = 0xffffffff
325 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500326 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400327 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400328
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400329 act = action.action_output()
330 act.port = of_ports[1]
331 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400332
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400333 rv = self.controller.message_send(msg)
334 self.assertTrue(rv != -1, "Error installing flow mod")
335 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400336
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400337 return (pkt_mulL2,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400338
339
ShreyaPandita6fbff252012-11-13 16:56:48 -0500340def match_mul_l4(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400341 #Generate Match_Mul_L4 flow
342
343 #Create a simple tcp packet and generate match on tcp protocol flow
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400344 pkt_mulL4 = simple_tcp_packet(tcp_sport=111,tcp_dport=112)
345 match = parse.packet_to_flow_match(pkt_mulL4)
346 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita6fbff252012-11-13 16:56:48 -0500347 match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_NW_PROTO^ofp.OFPFW_TP_SRC ^ofp.OFPFW_TP_DST
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400348 msg = message.flow_mod()
349 msg.out_port = ofp.OFPP_NONE
350 msg.command = ofp.OFPFC_ADD
351 msg.buffer_id = 0xffffffff
352 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500353 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400354 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400355
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400356 act = action.action_output()
357 act.port = of_ports[1]
358 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400359
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400360 rv = self.controller.message_send(msg)
361 self.assertTrue(rv != -1, "Error installing flow mod")
362 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400363
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400364 return (pkt_mulL4,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400365
ShreyaPanditaed209962012-11-04 02:16:48 -0500366def match_ip_tos(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400367 #Generate a Match on IP Type of service flow
368
369 #Create a simple tcp packet and generate match on Type of service
ShreyaPandita6fbff252012-11-13 16:56:48 -0500370 pkt_iptos = simple_tcp_packet(ip_tos=30)
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400371 match = parse.packet_to_flow_match(pkt_iptos)
372 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400373
ShreyaPandita6fbff252012-11-13 16:56:48 -0500374 match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE^ofp.OFPFW_NW_PROTO ^ofp.OFPFW_NW_TOS
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400375 msg = message.flow_mod()
376 msg.out_port = ofp.OFPP_NONE
377 msg.command = ofp.OFPFC_ADD
378 msg.buffer_id = 0xffffffff
379 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500380 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400381 msg.priority = priority
382 act = action.action_output()
383 act.port = of_ports[1]
384 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400385
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400386 rv = self.controller.message_send(msg)
387 self.assertTrue(rv != -1, "Error installing flow mod")
388 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400389
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400390 return (pkt_iptos,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400391
ShreyaPandita6fbff252012-11-13 16:56:48 -0500392def match_ip_protocol(self,of_ports,priority=None):
393 #Generate a Match on IP Protocol
394
395 #Create a simple tcp packet and generate match on Type of service
396 pkt_iptos = simple_tcp_packet()
397 match = parse.packet_to_flow_match(pkt_iptos)
398 self.assertTrue(match is not None, "Could not generate flow match from pkt")
399
400 match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE^ofp.OFPFW_NW_PROTO
401 msg = message.flow_mod()
402 msg.out_port = ofp.OFPP_NONE
403 msg.command = ofp.OFPFC_ADD
404 msg.buffer_id = 0xffffffff
405 msg.match = match
406 if priority != None :
407 msg.priority = priority
408 act = action.action_output()
409 act.port = of_ports[1]
410 self.assertTrue(msg.actions.add(act), "could not add action")
411
412 rv = self.controller.message_send(msg)
413 self.assertTrue(rv != -1, "Error installing flow mod")
414 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
415
416 return (pkt_iptos,match)
417
418
ShreyaPanditaed209962012-11-04 02:16:48 -0500419def match_tcp_src(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400420 #Generate Match_Tcp_Src
421
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400422 #Create a simple tcp packet and generate match on tcp source port flow
423 pkt_matchtSrc = simple_tcp_packet(tcp_sport=111)
424 match = parse.packet_to_flow_match(pkt_matchtSrc)
425 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400426
ShreyaPandita6fbff252012-11-13 16:56:48 -0500427 match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_NW_PROTO ^ofp.OFPFW_TP_SRC
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400428 msg = message.flow_mod()
429 msg.out_port = ofp.OFPP_NONE
430 msg.command = ofp.OFPFC_ADD
431 msg.buffer_id = 0xffffffff
432 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500433 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400434 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400435
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400436 act = action.action_output()
437 act.port = of_ports[1]
438 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400439
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400440 rv = self.controller.message_send(msg)
441 self.assertTrue(rv != -1, "Error installing flow mod")
442 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400443
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400444 return (pkt_matchtSrc,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400445
ShreyaPanditaed209962012-11-04 02:16:48 -0500446def match_tcp_dst(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400447 #Generate Match_Tcp_Dst
448
449 #Create a simple tcp packet and generate match on tcp destination port flow
ShreyaPandita6fbff252012-11-13 16:56:48 -0500450 pkt_matchdst = simple_tcp_packet(tcp_dport=112)
451 match = parse.packet_to_flow_match(pkt_matchdst)
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400452 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400453
ShreyaPandita6fbff252012-11-13 16:56:48 -0500454 match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE^ofp.OFPFW_NW_PROTO^ofp.OFPFW_TP_DST
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400455 msg = message.flow_mod()
456 msg.out_port = ofp.OFPP_NONE
457 msg.command = ofp.OFPFC_ADD
458 msg.buffer_id = 0xffffffff
459 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500460 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400461 msg.priority = priority
462 act = action.action_output()
463 act.port = of_ports[1]
464 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400465
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400466 rv = self.controller.message_send(msg)
467 self.assertTrue(rv != -1, "Error installing flow mod")
468 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400469
ShreyaPandita6fbff252012-11-13 16:56:48 -0500470 return (pkt_matchdst,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400471
ShreyaPanditaed209962012-11-04 02:16:48 -0500472def match_ethernet_type(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400473 #Generate a Match_Ethernet_Type flow
474
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400475 #Create a simple tcp packet and generate match on ethernet type flow
476 pkt_matchtype = simple_eth_packet(dl_type=0x88cc)
477 match = parse.packet_to_flow_match(pkt_matchtype)
478 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400479
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400480 match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE
481 msg = message.flow_mod()
482 msg.out_port = ofp.OFPP_NONE
483 msg.command = ofp.OFPFC_ADD
484 msg.buffer_id = 0xffffffff
485 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500486 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400487 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400488
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400489 act = action.action_output()
490 act.port = of_ports[1]
491 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400492
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400493 rv = self.controller.message_send(msg)
494 self.assertTrue(rv != -1, "Error installing flow mod")
495 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400496 return (pkt_matchtype,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400497
498
ShreyaPandita60e45542012-09-27 15:11:16 -0400499
ShreyaPandita6fbff252012-11-13 16:56:48 -0500500
ShreyaPanditaed209962012-11-04 02:16:48 -0500501def strict_modify_flow_action(self,egress_port,match,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400502# Strict Modify the flow Action
503
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400504 #Create a flow_mod message , command MODIFY_STRICT
505 msg5 = message.flow_mod()
506 msg5.match = match
507 msg5.cookie = random.randint(0,9007199254740992)
508 msg5.command = ofp.OFPFC_MODIFY_STRICT
509 msg5.buffer_id = 0xffffffff
510 act5 = action.action_output()
511 act5.port = egress_port
512 self.assertTrue(msg5.actions.add(act5), "could not add action")
ShreyaPandita60e45542012-09-27 15:11:16 -0400513
ShreyaPanditaed209962012-11-04 02:16:48 -0500514 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400515 msg5.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -0400516
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400517 # Send the flow with action A'
518 rv = self.controller.message_send (msg5)
519 self.assertTrue(rv != -1, "Error installing flow mod")
520 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400521
ShreyaPanditaed209962012-11-04 02:16:48 -0500522def modify_flow_action(self,of_ports,match,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400523# Modify the flow action
524
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400525 #Create a flow_mod message , command MODIFY
526 msg8 = message.flow_mod()
527 msg8.match = match
528 msg8.cookie = random.randint(0,9007199254740992)
529 msg8.command = ofp.OFPFC_MODIFY
530 #out_port will be ignored for flow adds and flow modify (here for test-case Add_Modify_With_Outport)
531 msg8.out_port = of_ports[3]
532 msg8.buffer_id = 0xffffffff
533 act8 = action.action_output()
534 act8.port = of_ports[2]
535 self.assertTrue(msg8.actions.add(act8), "could not add action")
ShreyaPandita60e45542012-09-27 15:11:16 -0400536
ShreyaPanditaed209962012-11-04 02:16:48 -0500537 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400538 msg8.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -0400539
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400540 # Send the flow with action A'
541 rv = self.controller.message_send (msg8)
542 self.assertTrue(rv != -1, "Error installing flow mod")
543 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400544
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400545def enqueue(self,ingress_port,egress_port,egress_queue_id):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400546#Generate a flow with enqueue action i.e output to a queue configured on a egress_port
547
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400548 pkt = simple_tcp_packet()
549 match = packet_to_flow_match(self, pkt)
550 match.wildcards &= ~ofp.OFPFW_IN_PORT
551 self.assertTrue(match is not None,
552 "Could not generate flow match from pkt")
553
554 match.in_port = ingress_port
555 request = message.flow_mod()
556 request.match = match
557 request.buffer_id = 0xffffffff
558 act = action.action_enqueue()
559 act.port = egress_port
560 act.queue_id = egress_queue_id
561 self.assertTrue(request.actions.add(act), "Could not add action")
562
563 logging.info("Inserting flow")
564 rv = self.controller.message_send(request)
565 self.assertTrue(rv != -1, "Error installing flow mod")
566 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
567 return (pkt,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400568
569
ShreyaPandita60e45542012-09-27 15:11:16 -0400570########################### Verify Stats Functions ###########################################################################################
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400571def get_flowstats(self,match):
572 # Generate flow_stats request
573
574 stat_req = message.flow_stats_request()
575 stat_req.match = match
576 stat_req.table_id = 0xff
577 stat_req.out_port = ofp.OFPP_NONE
578
579 logging.info("Sending stats request")
580 response, pkt = self.controller.transact(stat_req,
581 timeout=5)
582 self.assertTrue(response is not None,"No response to stats request")
ShreyaPandita60e45542012-09-27 15:11:16 -0400583
ShreyaPandita66de26f2012-10-26 14:44:24 -0400584
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400585def get_portstats(self,port_num):
586
587# Return all the port counters in the form a tuple
588 port_stats_req = message.port_stats_request()
589 port_stats_req.port_no = port_num
590 response,pkt = self.controller.transact(port_stats_req)
591 self.assertTrue(response is not None,"No response received for port stats request")
592 rx_pkts=0
593 tx_pkts=0
594 rx_byts=0
595 tx_byts=0
596 rx_drp =0
597 tx_drp = 0
598 rx_err=0
599 tx_err =0
600 rx_fr_err=0
601 rx_ovr_err=0
602 rx_crc_err=0
603 collisions = 0
604 tx_err=0
605
606
607 for obj in response.stats:
608 rx_pkts += obj.rx_packets
609 tx_pkts += obj.tx_packets
610 rx_byts += obj.rx_bytes
611 tx_byts += obj.tx_bytes
612 rx_drp += obj.rx_dropped
613 tx_drp += obj.tx_dropped
614 rx_err += obj.rx_errors
615 rx_fr_err += obj.rx_frame_err
616 rx_ovr_err += obj.rx_over_err
617 rx_crc_err += obj.rx_crc_err
618 collisions+= obj.collisions
619 tx_err += obj.tx_errors
620
621 return (rx_pkts,tx_pkts,rx_byts,tx_byts,rx_drp,tx_drp,rx_err,tx_err,rx_fr_err,rx_ovr_err,rx_crc_err,collisions,tx_err)
622
623def get_queuestats(self,port_num,queue_id):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400624#Generate Queue Stats request
625
626 request = message.queue_stats_request()
627 request.port_no = port_num
628 request.queue_id = queue_id
629 (queue_stats, p) = self.controller.transact(request)
630 self.assertNotEqual(queue_stats, None, "Queue stats request failed")
631
632 return (queue_stats,p)
633
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400634def get_tablestats(self):
635# Send Table_Stats request (retrieve current table counters )
636
637 stat_req = message.table_stats_request()
638 response, pkt = self.controller.transact(stat_req,
639 timeout=5)
640 self.assertTrue(response is not None,
641 "No response to stats request")
642 current_lookedup = 0
643 current_matched = 0
644 current_active = 0
645
646 for obj in response.stats:
647 current_lookedup += obj.lookup_count
648 current_matched += obj.matched_count
649 current_active += obj.active_count
650
651 return (current_lookedup,current_matched,current_active)
652
653
654
ShreyaPanditaed209962012-11-04 02:16:48 -0500655def verify_tablestats(self,expect_lookup=None,expect_match=None,expect_active=None):
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400656
657 stat_req = message.table_stats_request()
ShreyaPanditaed209962012-11-04 02:16:48 -0500658
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400659 for i in range(0,60):
ShreyaPandita60e45542012-09-27 15:11:16 -0400660
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400661 logging.info("Sending stats request")
662 # TODO: move REPLY_MORE handling to controller.transact?
ShreyaPandita66de26f2012-10-26 14:44:24 -0400663 response, pkt = self.controller.transact(stat_req,
664 timeout=5)
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400665 self.assertTrue(response is not None,"No response to stats request")
ShreyaPandita60e45542012-09-27 15:11:16 -0400666
ShreyaPanditaed209962012-11-04 02:16:48 -0500667 lookedup = 0
668 matched = 0
669 active = 0
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500670
671 sleep(1)
ShreyaPanditaed209962012-11-04 02:16:48 -0500672
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400673 for item in response.stats:
ShreyaPanditaed209962012-11-04 02:16:48 -0500674
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400675 lookedup += item.lookup_count
676 matched += item.matched_count
677 active += item.active_count
678
679 logging.info("Packets Looked up " + str(lookedup) + " packets")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400680 logging.info("Packets matched " + str(matched) + "packets")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400681 logging.info("Active flow entries" + str(active) + "flows")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400682
ShreyaPanditaed209962012-11-04 02:16:48 -0500683 if expect_lookup != None and expect_lookup != lookedup:continue
684 if expect_match != None and expect_match != matched:continue
685 if expect_active != None and expect_active != active:continue
686 break
687
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500688
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400689
ShreyaPanditaed209962012-11-04 02:16:48 -0500690 if expect_lookup != None :
691 self.assertEqual(expect_lookup,item.lookup_count,"lookup counter is not incremented properly")
692 if expect_match != None :
693 self.assertEqual(expect_match,item.matched_count, "matched counter is not incremented properly")
694 if expect_active != None :
695 self.assertEqual(expect_active,item.active_count,"active counter is not incremented properly")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400696
697
ShreyaPanditaed209962012-11-04 02:16:48 -0500698def verify_flowstats(self,match,byte_count=None,packet_count=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400699 # Verify flow counters : byte_count and packet_count
ShreyaPandita60e45542012-09-27 15:11:16 -0400700
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400701 stat_req = message.flow_stats_request()
702 stat_req.match = match
703 stat_req.table_id = 0xff
704 stat_req.out_port = ofp.OFPP_NONE
ShreyaPanditaed209962012-11-04 02:16:48 -0500705
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400706 for i in range(0,60):
707 logging.info("Sending stats request")
708 # TODO: move REPLY_MORE handling to controller.transact?
ShreyaPandita66de26f2012-10-26 14:44:24 -0400709 response, pkt = self.controller.transact(stat_req,
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400710 timeout=5)
711 self.assertTrue(response is not None,"No response to stats request")
712
ShreyaPanditaed209962012-11-04 02:16:48 -0500713 packet_counter = 0
714 byte_counter = 0
715
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500716 sleep(1)
717
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400718 for item in response.stats:
719 packet_counter += item.packet_count
720 byte_counter += item.byte_count
721
722 logging.info("Recieved" + str(item.packet_count) + " packets")
ShreyaPanditaed209962012-11-04 02:16:48 -0500723
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400724 logging.info("Received " + str(item.byte_count) + "bytes")
ShreyaPanditaed209962012-11-04 02:16:48 -0500725
726 if packet_count != None and packet_count != packet_counter: continue
727 if byte_count != None and byte_count != byte_counter: continue
728 break
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400729
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500730
ShreyaPanditaed209962012-11-04 02:16:48 -0500731
732 if packet_count != None :
733 self.assertEqual(packet_count,item.packet_count,"packet_count counter is not incremented correctly")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400734
ShreyaPanditaed209962012-11-04 02:16:48 -0500735 if byte_count != None :
736 self.assertEqual(byte_count,item.byte_count,"byte_count counter is not incremented correctly")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400737
738
ShreyaPanditaed209962012-11-04 02:16:48 -0500739def verify_portstats(self, port,tx_packets=None,rx_packets=None,rx_byte=None,tx_byte=None):
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400740
741
742 stat_req = message.port_stats_request()
743 stat_req.port_no = port
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400744
745 for i in range(0,60):
746 logging.info("Sending stats request")
747 response, pkt = self.controller.transact(stat_req,
748 timeout=5)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400749 self.assertTrue(response is not None,
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400750 "No response to stats request")
751 self.assertTrue(len(response.stats) == 1,
752 "Did not receive port stats reply")
ShreyaPanditaed209962012-11-04 02:16:48 -0500753
754 sentp = recvp = 0
755 sentb = recvb = 0
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500756
757 sleep(1)
ShreyaPanditaed209962012-11-04 02:16:48 -0500758
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400759 for item in response.stats:
760 sentp += item.tx_packets
761 recvp += item.rx_packets
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400762 recvb += item.rx_bytes
ShreyaPanditaed209962012-11-04 02:16:48 -0500763 sentb += item.tx_bytes
764
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400765
766 logging.info("Sent " + str(sentp) + " packets")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400767 logging.info("Received " + str(recvp) + " packets")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400768 logging.info("Received " + str(recvb) + "bytes")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400769 logging.info("Sent" + str(sentb) + "bytes")
ShreyaPanditaed209962012-11-04 02:16:48 -0500770
771 if tx_packets != None and tx_packets != sentp: continue
772 if rx_packets != None and rx_packets != recvp: continue
773 if rx_byte != None and rx_byte != recvb: continue
774 if tx_byte != None and tx_byte != sentb: continue
775
776 break
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400777
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500778
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400779
ShreyaPanditaed209962012-11-04 02:16:48 -0500780 if (tx_packets != None):
781 self.assertEqual(tx_packets,item.tx_packets,"rx_packets counter is not incremented correctly")
782 if (rx_packets != None):
783 self.assertEqual(rx_packets,item.rx_packets,"tx_packets counter is not incremented correctly")
784 if (rx_byte != None):
785 self.assertEqual(rx_byte,item.rx_bytes,"rx_bytes counter is not incremented correctly")
786 if (tx_byte != None):
787 self.assertEqual(tx_byte,item.tx_bytes,"tx_bytes counter is not incremented correctly")
ShreyaPandita60e45542012-09-27 15:11:16 -0400788
ShreyaPandita60e45542012-09-27 15:11:16 -0400789
ShreyaPanditaed209962012-11-04 02:16:48 -0500790def verify_queuestats(self,port_num,queue_id,expect_packet=None,expect_byte=None):
791
792 # Verify queue counters : tx_packets and tx_bytes
793
794 request = message.queue_stats_request()
795 request.port_no = port_num
796 request.queue_id = queue_id
797
798 for i in range(0,60):
799
800 logging.info("Sending stats request")
801
802 (queue_stats, p) = self.controller.transact(request)
803 self.assertNotEqual(queue_stats, None, "Queue stats request failed")
804 packet_counter = 0
805 byte_counter = 0
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500806
807 sleep(1)
ShreyaPanditaed209962012-11-04 02:16:48 -0500808
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500809 for item in queue_stats.stats:
ShreyaPanditaed209962012-11-04 02:16:48 -0500810 packet_counter += item.tx_packets
811 byte_counter += item.tx_bytes
812
813 logging.info("Transmitted" + str(packet_counter) + " packets")
814 logging.info("Transmitted" + str(byte_counter) + "bytes")
815
816 if expect_packet != None and packet_counter != expect_packet: continue
817 if expect_byte != None and byte_counter != expect_byte: continue
818 break
819
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500820
ShreyaPanditaed209962012-11-04 02:16:48 -0500821
822 if expect_packet != None :
823 self.assertEqual(packet_counter,expect_packet,"tx_packets counter is not incremented correctly")
824
825 if expect_byte != None :
826 self.assertEqual(byte_counter,expect_byte,"tx_bytes counter is not incremented correctly")
827
828
ShreyaPandita60e45542012-09-27 15:11:16 -0400829############################## Various delete commands #############################################################################################
830
ShreyaPanditaed209962012-11-04 02:16:48 -0500831def strict_delete(self,match,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400832# Issue Strict Delete
833
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400834 #Create flow_mod message, command DELETE_STRICT
835 msg4 = message.flow_mod()
836 msg4.out_port = ofp.OFPP_NONE
837 msg4.command = ofp.OFPFC_DELETE_STRICT
838 msg4.buffer_id = 0xffffffff
839 msg4.match = match
ShreyaPandita60e45542012-09-27 15:11:16 -0400840
ShreyaPanditaed209962012-11-04 02:16:48 -0500841 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400842 msg4.priority = priority
843 rv = self.controller.message_send(msg4)
844 self.assertTrue(rv!= -1, "Error installing flow mod")
845 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400846
847
848
ShreyaPanditaed209962012-11-04 02:16:48 -0500849def nonstrict_delete(self,match,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400850# Issue Non_Strict Delete
851
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400852 #Create flow_mod message, command DELETE
853 msg6 = message.flow_mod()
854 msg6.out_port = ofp.OFPP_NONE
855 msg6.command = ofp.OFPFC_DELETE
856 msg6.buffer_id = 0xffffffff
857 msg6.match = match
ShreyaPandita60e45542012-09-27 15:11:16 -0400858
ShreyaPanditaed209962012-11-04 02:16:48 -0500859 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400860 msg6.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -0400861
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400862 rv = self.controller.message_send(msg6)
863 self.assertTrue(rv != -1, "Error installing flow mod")
864 self.assertEqual(do_barrier(self.controller),0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400865
866
867###########################################################################################################################################################
868
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400869def send_packet(obj, pkt, ingress_port, egress_port):
ShreyaPandita60e45542012-09-27 15:11:16 -0400870#Send Packets on a specified ingress_port and verify if its recieved on correct egress_port.
871
872 obj.dataplane.send(ingress_port, str(pkt))
873 exp_pkt_arg = pkt
874 exp_port = egress_port
875
876 (rcv_port, rcv_pkt, pkt_time) = obj.dataplane.poll(timeout=2,
877 port_number=exp_port,
878 exp_pkt=exp_pkt_arg)
879 obj.assertTrue(rcv_pkt is not None,
880 "Packet not received on port " + str(egress_port))
881 obj.assertEqual(rcv_port, egress_port,
882 "Packet received on port " + str(rcv_port) +
883 ", expected port " + str(egress_port))
884 obj.assertEqual(str(pkt), str(rcv_pkt),
885 'Response packet does not match send packet')
886
887
ShreyaPandita572e64b2012-09-28 14:41:06 -0400888def sw_supported_actions(parent,use_cache=False):
ShreyaPandita60e45542012-09-27 15:11:16 -0400889#Returns the switch's supported actions
890
891 cache_supported_actions = None
892 if cache_supported_actions is None or not use_cache:
893 request = message.features_request()
894 (reply, pkt) = parent.controller.transact(request)
895 parent.assertTrue(reply is not None, "Did not get response to ftr req")
896 cache_supported_actions = reply.actions
897 return cache_supported_actions
898
ShreyaPandita66de26f2012-10-26 14:44:24 -0400899##############################################################################################################################################################
900