blob: f70fb7ebb5a2c27654fdcaa4b91463ccfea44742 [file] [log] [blame]
ShreyaPandita055102a2012-11-28 11:43:45 -05001""" Defined Some common functions 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):
ShreyaPandita055102a2012-11-28 11:43:45 -0500285 #Generate Match_Vlan_Priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400286
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400287 #Create a simple tcp packet and generate match on ethernet dst address flow
Rich Laneba9eee82012-12-07 22:44:24 -0800288 pkt_matchvlanpcp = simple_tcp_packet(dl_vlan_enable=True,dl_vlan=1,dl_vlan_pcp=5)
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400289 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
Rich Laneb5c73792012-12-03 17:12:32 -0800370 pkt_iptos = simple_tcp_packet(ip_tos=28)
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
ShreyaPandita055102a2012-11-28 11:43:45 -0500472
ShreyaPanditaed209962012-11-04 02:16:48 -0500473def match_ethernet_type(self,of_ports,priority=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400474 #Generate a Match_Ethernet_Type flow
475
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400476 #Create a simple tcp packet and generate match on ethernet type flow
477 pkt_matchtype = simple_eth_packet(dl_type=0x88cc)
478 match = parse.packet_to_flow_match(pkt_matchtype)
479 self.assertTrue(match is not None, "Could not generate flow match from pkt")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400480
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400481 match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE
482 msg = message.flow_mod()
483 msg.out_port = ofp.OFPP_NONE
484 msg.command = ofp.OFPFC_ADD
485 msg.buffer_id = 0xffffffff
486 msg.match = match
ShreyaPanditaed209962012-11-04 02:16:48 -0500487 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400488 msg.priority = priority
ShreyaPandita66de26f2012-10-26 14:44:24 -0400489
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400490 act = action.action_output()
491 act.port = of_ports[1]
492 self.assertTrue(msg.actions.add(act), "could not add action")
ShreyaPandita66de26f2012-10-26 14:44:24 -0400493
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400494 rv = self.controller.message_send(msg)
495 self.assertTrue(rv != -1, "Error installing flow mod")
496 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400497 return (pkt_matchtype,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400498
499
ShreyaPandita60e45542012-09-27 15:11:16 -0400500
ShreyaPandita6fbff252012-11-13 16:56:48 -0500501
ShreyaPanditaed209962012-11-04 02:16:48 -0500502def strict_modify_flow_action(self,egress_port,match,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400503# Strict Modify the flow Action
504
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400505 #Create a flow_mod message , command MODIFY_STRICT
506 msg5 = message.flow_mod()
507 msg5.match = match
508 msg5.cookie = random.randint(0,9007199254740992)
509 msg5.command = ofp.OFPFC_MODIFY_STRICT
510 msg5.buffer_id = 0xffffffff
511 act5 = action.action_output()
512 act5.port = egress_port
513 self.assertTrue(msg5.actions.add(act5), "could not add action")
ShreyaPandita60e45542012-09-27 15:11:16 -0400514
ShreyaPanditaed209962012-11-04 02:16:48 -0500515 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400516 msg5.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -0400517
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400518 # Send the flow with action A'
519 rv = self.controller.message_send (msg5)
520 self.assertTrue(rv != -1, "Error installing flow mod")
521 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400522
ShreyaPanditaed209962012-11-04 02:16:48 -0500523def modify_flow_action(self,of_ports,match,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400524# Modify the flow action
525
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400526 #Create a flow_mod message , command MODIFY
527 msg8 = message.flow_mod()
528 msg8.match = match
529 msg8.cookie = random.randint(0,9007199254740992)
530 msg8.command = ofp.OFPFC_MODIFY
531 #out_port will be ignored for flow adds and flow modify (here for test-case Add_Modify_With_Outport)
532 msg8.out_port = of_ports[3]
533 msg8.buffer_id = 0xffffffff
534 act8 = action.action_output()
535 act8.port = of_ports[2]
536 self.assertTrue(msg8.actions.add(act8), "could not add action")
ShreyaPandita60e45542012-09-27 15:11:16 -0400537
ShreyaPanditaed209962012-11-04 02:16:48 -0500538 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400539 msg8.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -0400540
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400541 # Send the flow with action A'
542 rv = self.controller.message_send (msg8)
543 self.assertTrue(rv != -1, "Error installing flow mod")
544 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400545
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400546def enqueue(self,ingress_port,egress_port,egress_queue_id):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400547#Generate a flow with enqueue action i.e output to a queue configured on a egress_port
548
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400549 pkt = simple_tcp_packet()
550 match = packet_to_flow_match(self, pkt)
551 match.wildcards &= ~ofp.OFPFW_IN_PORT
552 self.assertTrue(match is not None,
553 "Could not generate flow match from pkt")
554
555 match.in_port = ingress_port
556 request = message.flow_mod()
557 request.match = match
558 request.buffer_id = 0xffffffff
559 act = action.action_enqueue()
560 act.port = egress_port
561 act.queue_id = egress_queue_id
562 self.assertTrue(request.actions.add(act), "Could not add action")
563
564 logging.info("Inserting flow")
565 rv = self.controller.message_send(request)
566 self.assertTrue(rv != -1, "Error installing flow mod")
567 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
568 return (pkt,match)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400569
570
ShreyaPandita60e45542012-09-27 15:11:16 -0400571########################### Verify Stats Functions ###########################################################################################
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400572def get_flowstats(self,match):
573 # Generate flow_stats request
574
575 stat_req = message.flow_stats_request()
576 stat_req.match = match
577 stat_req.table_id = 0xff
578 stat_req.out_port = ofp.OFPP_NONE
579
580 logging.info("Sending stats request")
581 response, pkt = self.controller.transact(stat_req,
582 timeout=5)
583 self.assertTrue(response is not None,"No response to stats request")
ShreyaPandita60e45542012-09-27 15:11:16 -0400584
ShreyaPandita66de26f2012-10-26 14:44:24 -0400585
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400586def get_portstats(self,port_num):
587
588# Return all the port counters in the form a tuple
589 port_stats_req = message.port_stats_request()
590 port_stats_req.port_no = port_num
591 response,pkt = self.controller.transact(port_stats_req)
592 self.assertTrue(response is not None,"No response received for port stats request")
593 rx_pkts=0
594 tx_pkts=0
595 rx_byts=0
596 tx_byts=0
597 rx_drp =0
598 tx_drp = 0
599 rx_err=0
600 tx_err =0
601 rx_fr_err=0
602 rx_ovr_err=0
603 rx_crc_err=0
604 collisions = 0
605 tx_err=0
606
607
608 for obj in response.stats:
609 rx_pkts += obj.rx_packets
610 tx_pkts += obj.tx_packets
611 rx_byts += obj.rx_bytes
612 tx_byts += obj.tx_bytes
613 rx_drp += obj.rx_dropped
614 tx_drp += obj.tx_dropped
615 rx_err += obj.rx_errors
616 rx_fr_err += obj.rx_frame_err
617 rx_ovr_err += obj.rx_over_err
618 rx_crc_err += obj.rx_crc_err
619 collisions+= obj.collisions
620 tx_err += obj.tx_errors
621
622 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)
623
624def get_queuestats(self,port_num,queue_id):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400625#Generate Queue Stats request
626
627 request = message.queue_stats_request()
628 request.port_no = port_num
629 request.queue_id = queue_id
630 (queue_stats, p) = self.controller.transact(request)
631 self.assertNotEqual(queue_stats, None, "Queue stats request failed")
632
633 return (queue_stats,p)
634
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400635def get_tablestats(self):
636# Send Table_Stats request (retrieve current table counters )
637
638 stat_req = message.table_stats_request()
639 response, pkt = self.controller.transact(stat_req,
640 timeout=5)
641 self.assertTrue(response is not None,
642 "No response to stats request")
643 current_lookedup = 0
644 current_matched = 0
645 current_active = 0
646
647 for obj in response.stats:
648 current_lookedup += obj.lookup_count
649 current_matched += obj.matched_count
650 current_active += obj.active_count
651
652 return (current_lookedup,current_matched,current_active)
653
654
655
ShreyaPanditaed209962012-11-04 02:16:48 -0500656def verify_tablestats(self,expect_lookup=None,expect_match=None,expect_active=None):
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400657
658 stat_req = message.table_stats_request()
ShreyaPanditaed209962012-11-04 02:16:48 -0500659
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400660 for i in range(0,60):
ShreyaPandita60e45542012-09-27 15:11:16 -0400661
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400662 logging.info("Sending stats request")
663 # TODO: move REPLY_MORE handling to controller.transact?
ShreyaPandita66de26f2012-10-26 14:44:24 -0400664 response, pkt = self.controller.transact(stat_req,
665 timeout=5)
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400666 self.assertTrue(response is not None,"No response to stats request")
ShreyaPandita60e45542012-09-27 15:11:16 -0400667
ShreyaPanditaed209962012-11-04 02:16:48 -0500668 lookedup = 0
669 matched = 0
670 active = 0
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500671
672 sleep(1)
ShreyaPanditaed209962012-11-04 02:16:48 -0500673
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400674 for item in response.stats:
ShreyaPanditaed209962012-11-04 02:16:48 -0500675
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400676 lookedup += item.lookup_count
677 matched += item.matched_count
678 active += item.active_count
679
680 logging.info("Packets Looked up " + str(lookedup) + " packets")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400681 logging.info("Packets matched " + str(matched) + "packets")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400682 logging.info("Active flow entries" + str(active) + "flows")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400683
ShreyaPanditaed209962012-11-04 02:16:48 -0500684 if expect_lookup != None and expect_lookup != lookedup:continue
685 if expect_match != None and expect_match != matched:continue
686 if expect_active != None and expect_active != active:continue
687 break
688
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500689
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400690
ShreyaPanditaed209962012-11-04 02:16:48 -0500691 if expect_lookup != None :
692 self.assertEqual(expect_lookup,item.lookup_count,"lookup counter is not incremented properly")
693 if expect_match != None :
694 self.assertEqual(expect_match,item.matched_count, "matched counter is not incremented properly")
695 if expect_active != None :
696 self.assertEqual(expect_active,item.active_count,"active counter is not incremented properly")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400697
698
ShreyaPanditaed209962012-11-04 02:16:48 -0500699def verify_flowstats(self,match,byte_count=None,packet_count=None):
ShreyaPandita66de26f2012-10-26 14:44:24 -0400700 # Verify flow counters : byte_count and packet_count
ShreyaPandita60e45542012-09-27 15:11:16 -0400701
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400702 stat_req = message.flow_stats_request()
703 stat_req.match = match
704 stat_req.table_id = 0xff
705 stat_req.out_port = ofp.OFPP_NONE
ShreyaPanditaed209962012-11-04 02:16:48 -0500706
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400707 for i in range(0,60):
708 logging.info("Sending stats request")
709 # TODO: move REPLY_MORE handling to controller.transact?
ShreyaPandita66de26f2012-10-26 14:44:24 -0400710 response, pkt = self.controller.transact(stat_req,
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400711 timeout=5)
712 self.assertTrue(response is not None,"No response to stats request")
713
ShreyaPanditaed209962012-11-04 02:16:48 -0500714 packet_counter = 0
715 byte_counter = 0
716
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500717 sleep(1)
718
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400719 for item in response.stats:
720 packet_counter += item.packet_count
721 byte_counter += item.byte_count
722
723 logging.info("Recieved" + str(item.packet_count) + " packets")
ShreyaPanditaed209962012-11-04 02:16:48 -0500724
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400725 logging.info("Received " + str(item.byte_count) + "bytes")
ShreyaPanditaed209962012-11-04 02:16:48 -0500726
727 if packet_count != None and packet_count != packet_counter: continue
728 if byte_count != None and byte_count != byte_counter: continue
729 break
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400730
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500731
ShreyaPanditaed209962012-11-04 02:16:48 -0500732
733 if packet_count != None :
734 self.assertEqual(packet_count,item.packet_count,"packet_count counter is not incremented correctly")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400735
ShreyaPanditaed209962012-11-04 02:16:48 -0500736 if byte_count != None :
737 self.assertEqual(byte_count,item.byte_count,"byte_count counter is not incremented correctly")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400738
739
ShreyaPanditaed209962012-11-04 02:16:48 -0500740def verify_portstats(self, port,tx_packets=None,rx_packets=None,rx_byte=None,tx_byte=None):
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400741
742
743 stat_req = message.port_stats_request()
744 stat_req.port_no = port
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400745
746 for i in range(0,60):
747 logging.info("Sending stats request")
748 response, pkt = self.controller.transact(stat_req,
749 timeout=5)
ShreyaPandita66de26f2012-10-26 14:44:24 -0400750 self.assertTrue(response is not None,
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400751 "No response to stats request")
752 self.assertTrue(len(response.stats) == 1,
753 "Did not receive port stats reply")
ShreyaPanditaed209962012-11-04 02:16:48 -0500754
755 sentp = recvp = 0
756 sentb = recvb = 0
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500757
758 sleep(1)
ShreyaPanditaed209962012-11-04 02:16:48 -0500759
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400760 for item in response.stats:
761 sentp += item.tx_packets
762 recvp += item.rx_packets
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400763 recvb += item.rx_bytes
ShreyaPanditaed209962012-11-04 02:16:48 -0500764 sentb += item.tx_bytes
765
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400766
767 logging.info("Sent " + str(sentp) + " packets")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400768 logging.info("Received " + str(recvp) + " packets")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400769 logging.info("Received " + str(recvb) + "bytes")
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400770 logging.info("Sent" + str(sentb) + "bytes")
ShreyaPanditaed209962012-11-04 02:16:48 -0500771
772 if tx_packets != None and tx_packets != sentp: continue
773 if rx_packets != None and rx_packets != recvp: continue
774 if rx_byte != None and rx_byte != recvb: continue
775 if tx_byte != None and tx_byte != sentb: continue
776
777 break
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400778
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500779
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400780
ShreyaPanditaed209962012-11-04 02:16:48 -0500781 if (tx_packets != None):
782 self.assertEqual(tx_packets,item.tx_packets,"rx_packets counter is not incremented correctly")
783 if (rx_packets != None):
784 self.assertEqual(rx_packets,item.rx_packets,"tx_packets counter is not incremented correctly")
785 if (rx_byte != None):
786 self.assertEqual(rx_byte,item.rx_bytes,"rx_bytes counter is not incremented correctly")
787 if (tx_byte != None):
788 self.assertEqual(tx_byte,item.tx_bytes,"tx_bytes counter is not incremented correctly")
ShreyaPandita60e45542012-09-27 15:11:16 -0400789
ShreyaPandita60e45542012-09-27 15:11:16 -0400790
ShreyaPanditaed209962012-11-04 02:16:48 -0500791def verify_queuestats(self,port_num,queue_id,expect_packet=None,expect_byte=None):
792
793 # Verify queue counters : tx_packets and tx_bytes
794
795 request = message.queue_stats_request()
796 request.port_no = port_num
797 request.queue_id = queue_id
798
799 for i in range(0,60):
800
801 logging.info("Sending stats request")
802
803 (queue_stats, p) = self.controller.transact(request)
804 self.assertNotEqual(queue_stats, None, "Queue stats request failed")
805 packet_counter = 0
806 byte_counter = 0
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500807
808 sleep(1)
ShreyaPanditaed209962012-11-04 02:16:48 -0500809
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500810 for item in queue_stats.stats:
ShreyaPanditaed209962012-11-04 02:16:48 -0500811 packet_counter += item.tx_packets
812 byte_counter += item.tx_bytes
813
814 logging.info("Transmitted" + str(packet_counter) + " packets")
815 logging.info("Transmitted" + str(byte_counter) + "bytes")
816
817 if expect_packet != None and packet_counter != expect_packet: continue
818 if expect_byte != None and byte_counter != expect_byte: continue
819 break
820
ShreyaPanditaa6dfbfc2012-11-05 17:45:22 -0500821
ShreyaPanditaed209962012-11-04 02:16:48 -0500822
823 if expect_packet != None :
824 self.assertEqual(packet_counter,expect_packet,"tx_packets counter is not incremented correctly")
825
826 if expect_byte != None :
827 self.assertEqual(byte_counter,expect_byte,"tx_bytes counter is not incremented correctly")
828
829
ShreyaPandita60e45542012-09-27 15:11:16 -0400830############################## Various delete commands #############################################################################################
831
ShreyaPanditaed209962012-11-04 02:16:48 -0500832def strict_delete(self,match,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400833# Issue Strict Delete
834
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400835 #Create flow_mod message, command DELETE_STRICT
836 msg4 = message.flow_mod()
837 msg4.out_port = ofp.OFPP_NONE
838 msg4.command = ofp.OFPFC_DELETE_STRICT
839 msg4.buffer_id = 0xffffffff
840 msg4.match = match
ShreyaPandita60e45542012-09-27 15:11:16 -0400841
ShreyaPanditaed209962012-11-04 02:16:48 -0500842 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400843 msg4.priority = priority
844 rv = self.controller.message_send(msg4)
845 self.assertTrue(rv!= -1, "Error installing flow mod")
846 self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400847
848
849
ShreyaPanditaed209962012-11-04 02:16:48 -0500850def nonstrict_delete(self,match,priority=None):
ShreyaPandita60e45542012-09-27 15:11:16 -0400851# Issue Non_Strict Delete
852
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400853 #Create flow_mod message, command DELETE
854 msg6 = message.flow_mod()
855 msg6.out_port = ofp.OFPP_NONE
856 msg6.command = ofp.OFPFC_DELETE
857 msg6.buffer_id = 0xffffffff
858 msg6.match = match
ShreyaPandita60e45542012-09-27 15:11:16 -0400859
ShreyaPanditaed209962012-11-04 02:16:48 -0500860 if priority != None :
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400861 msg6.priority = priority
ShreyaPandita60e45542012-09-27 15:11:16 -0400862
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400863 rv = self.controller.message_send(msg6)
864 self.assertTrue(rv != -1, "Error installing flow mod")
865 self.assertEqual(do_barrier(self.controller),0, "Barrier failed")
ShreyaPandita60e45542012-09-27 15:11:16 -0400866
867
868###########################################################################################################################################################
869
ShreyaPandita4ebbac32012-11-02 13:40:44 -0400870def send_packet(obj, pkt, ingress_port, egress_port):
ShreyaPandita60e45542012-09-27 15:11:16 -0400871#Send Packets on a specified ingress_port and verify if its recieved on correct egress_port.
872
873 obj.dataplane.send(ingress_port, str(pkt))
874 exp_pkt_arg = pkt
875 exp_port = egress_port
876
877 (rcv_port, rcv_pkt, pkt_time) = obj.dataplane.poll(timeout=2,
878 port_number=exp_port,
879 exp_pkt=exp_pkt_arg)
880 obj.assertTrue(rcv_pkt is not None,
881 "Packet not received on port " + str(egress_port))
882 obj.assertEqual(rcv_port, egress_port,
883 "Packet received on port " + str(rcv_port) +
884 ", expected port " + str(egress_port))
885 obj.assertEqual(str(pkt), str(rcv_pkt),
886 'Response packet does not match send packet')
887
888
ShreyaPandita572e64b2012-09-28 14:41:06 -0400889def sw_supported_actions(parent,use_cache=False):
ShreyaPandita60e45542012-09-27 15:11:16 -0400890#Returns the switch's supported actions
891
892 cache_supported_actions = None
893 if cache_supported_actions is None or not use_cache:
894 request = message.features_request()
895 (reply, pkt) = parent.controller.transact(request)
896 parent.assertTrue(reply is not None, "Did not get response to ftr req")
897 cache_supported_actions = reply.actions
898 return cache_supported_actions
899
ShreyaPandita66de26f2012-10-26 14:44:24 -0400900##############################################################################################################################################################
901