blob: 1c26766898486d6b67157fa63a18cfa80ed08531 [file] [log] [blame]
macauley97557232015-07-16 17:28:07 +08001import logging
2
3from oftest import config
4import oftest.base_tests as base_tests
5import ofp
6import time
7from oftest.testutils import *
8
macauleyfddc4662015-07-27 17:40:30 +08009from ncclient import manager
10import ncclient
11
macauley97557232015-07-16 17:28:07 +080012OFDPA_GROUP_TYPE_SHIFT=28
13OFDPA_VLAN_ID_SHIFT =16
macauleyfddc4662015-07-27 17:40:30 +080014OFDPA_TUNNEL_ID_SHIFT =12
15OFDPA_TUNNEL_SUBTYPE_SHIFT=10
macauley97557232015-07-16 17:28:07 +080016
17#VLAN_TABLE_FLAGS
18VLAN_TABLE_FLAG_ONLY_UNTAG=1
19VLAN_TABLE_FLAG_ONLY_TAG =2
20VLAN_TABLE_FLAG_ONLY_BOTH =3
21
macauleye8b140e2015-08-03 13:35:45 +080022PORT_FLOW_TABLE=0
23VLAN_FLOW_TABLE=10
24TERMINATION_FLOW_TABLE=20
25UCAST_ROUTING_FLOW_TABLE=30
26MCAST_ROUTING_FLOW_TABLE=40
27BRIDGE_FLOW_TABLE=50
28ACL_FLOW_TABLE=60
29
30def convertIP4toStr(ip_addr):
31 a=(ip_addr&0xff000000)>>24
32 b=(ip_addr&0x00ff0000)>>16
33 c=(ip_addr&0x0000ff00)>>8
34 d=(ip_addr&0x000000ff)
35 return str(a)+"."+str(b)+"."+str(c)+"."+str(d)
36
37def convertMACtoStr(mac):
38 if not isinstance(mac, list):
39 assert(0)
40
41 return ':'.join(['%02X' % x for x in mac])
42
macauley7f89d962015-08-06 18:13:48 +080043def getSwitchCpuMACFromDPID(dpid):
44 str_datapath_id_f= "{:016x}".format(dpid)
45 str_datapath_id=':'.join([str_datapath_id_f[i:i+2] for i in range(0, len(str_datapath_id_f), 2)])
46 switch_cpu_mac_str=str_datapath_id[6:]
47 switch_cpu_mac = switch_cpu_mac_str.split(":")
48 switch_cpu_mac=[int(switch_cpu_mac[i],16) for i in range(0, len(switch_cpu_mac))]
49
50 return switch_cpu_mac_str, switch_cpu_mac
macauley_cheng67da9262015-08-31 15:18:41 +080051
52def DumpGroup(stats, verify_group_stats, always_show=True):
53 if(len(stats) > len(verify_group_stats)):
54 min_len = len(verify_group_stats)
55 print "Stats Len is not the same, stats>verify_group_stats"
56 if(len(stats)< len(verify_group_stats)):
57 min_len = len(stats)
58 print "Stats Len is not the same, stats<verify_group_stats"
59 else:
60 min_len = len(stats)
macauleye8b140e2015-08-03 13:35:45 +080061
macauley_cheng67da9262015-08-31 15:18:41 +080062 print "\r\n"
63 for i in range(min_len):
64 gs = stats[i]
65 gv = verify_group_stats[i]
66 print "FromSwtich:(GID=%lx, TYPE=%lx)\r\nVerify :(GID=%lx, TYPE=%lx)"%(gs.group_id, gs.group_type, gv.group_id, gv.group_type)
67 if(len(gs.buckets) != len(gv.buckets)):
68 print "buckets len is not the same gs %lx, gv %lx",(len(gs.buckets), len(gv.buckets))
69
70 for j in range(len(gs.buckets)):
71 b1=gs.buckets[j]
72 b2=gv.buckets[j]
73 if(len(b1.actions) != len(b2.actions)):
74 print "action len is not the same"
75
76 for k in range(len(b1.actions)):
77 a1=b1.actions[k]
78 a2=b2.actions[k]
79 if(always_show == True):
80 print "a1:"+a1.show()
81 print "a2:"+a2.show()
82
83def AssertGroup(self, stats, verify_group_stats):
84 self.assertTrue(len(stats) ==len(verify_group_stats), "stats len is not the same")
85
86 for i in range(len(stats)):
87 gs = stats[i]
88 gv = verify_group_stats[i]
89 self.assertTrue(len(gs.buckets) == len(gv.buckets), "buckets len is not the same")
90
91 for j in range(len(gs.buckets)):
92 b1=gs.buckets[j]
93 b2=gv.buckets[j]
94 self.assertTrue(len(b1.actions) == len(b2.actions), "action len is not the same")
95
96 for k in range(len(b1.actions)):
97 a1=b1.actions[k]
98 a2=b2.actions[k]
99 self.assertEquals(a1, a2, "action is not the same")
100
macauley97557232015-07-16 17:28:07 +0800101def encode_l2_interface_group_id(vlan, id):
102 return id + (vlan << OFDPA_VLAN_ID_SHIFT)
103
104def encode_l2_rewrite_group_id(id):
105 return id + (1 << OFDPA_GROUP_TYPE_SHIFT)
106
107def encode_l3_unicast_group_id(id):
108 return id + (2 << OFDPA_GROUP_TYPE_SHIFT)
109
110def encode_l2_mcast_group_id(vlan, id):
111 return id + (vlan << OFDPA_VLAN_ID_SHIFT) + (3 << OFDPA_GROUP_TYPE_SHIFT)
112
113def encode_l2_flood_group_id(vlan, id):
114 return id + (vlan << OFDPA_VLAN_ID_SHIFT) + (4 << OFDPA_GROUP_TYPE_SHIFT)
115
116def encode_l3_interface_group_id(id):
117 return id + (5 << OFDPA_GROUP_TYPE_SHIFT)
118
119def encode_l3_mcast_group_id(vlan, id):
120 return id + (vlan << OFDPA_VLAN_ID_SHIFT)+(6 << OFDPA_GROUP_TYPE_SHIFT)
121
122def encode_l3_ecmp_group_id(id):
123 return id + (7 << OFDPA_GROUP_TYPE_SHIFT)
124
macauleyfddc4662015-07-27 17:40:30 +0800125def encode_l2_overlay_group_id(tunnel_id, subtype, index):
126 tunnel_id=tunnel_id&0xffff #16 bits
127 subtype = subtype&3 #2 bits
128 index = index & 0x3f #10 bits
129 return index + (tunnel_id << OFDPA_TUNNEL_ID_SHIFT)+ (subtype<<OFDPA_TUNNEL_SUBTYPE_SHIFT)+(8 << OFDPA_GROUP_TYPE_SHIFT)
macauley97557232015-07-16 17:28:07 +0800130
macauley97557232015-07-16 17:28:07 +0800131def add_l2_interface_grouop(ctrl, ports, vlan_id=1, is_tagged=False, send_barrier=False):
132 # group table
133 # set up untag groups for each port
macauley41904ed2015-07-16 17:38:35 +0800134 group_id_list=[]
macauley15909e72015-07-17 15:58:57 +0800135 msgs=[]
macauley97557232015-07-16 17:28:07 +0800136 for of_port in ports:
137 # do stuff
138 group_id = encode_l2_interface_group_id(vlan_id, of_port)
macauley41904ed2015-07-16 17:38:35 +0800139 group_id_list.append(group_id)
macauley97557232015-07-16 17:28:07 +0800140 if is_tagged:
141 actions = [
142 ofp.action.output(of_port),
143 ]
144 else:
145 actions = [
146 ofp.action.pop_vlan(),
147 ofp.action.output(of_port),
148 ]
149
150 buckets = [
151 ofp.bucket(actions=actions),
152 ]
153
154 request = ofp.message.group_add(group_type=ofp.OFPGT_INDIRECT,
155 group_id=group_id,
156 buckets=buckets
157 )
158 ctrl.message_send(request)
macauley15909e72015-07-17 15:58:57 +0800159 msgs.append(request)
macauley97557232015-07-16 17:28:07 +0800160
161 if send_barrier:
162 do_barrier(ctrl)
macauley41904ed2015-07-16 17:38:35 +0800163
macauley15909e72015-07-17 15:58:57 +0800164 return group_id_list, msgs
macauley97557232015-07-16 17:28:07 +0800165
macauley0f91a3e2015-07-17 18:09:59 +0800166def add_one_l2_interface_grouop(ctrl, port, vlan_id=1, is_tagged=False, send_barrier=False):
167 # group table
168 # set up untag groups for each port
169 group_id = encode_l2_interface_group_id(vlan_id, port)
170
171 if is_tagged:
172 actions = [
173 ofp.action.output(port),
174 ]
175 else:
176 actions = [
177 ofp.action.pop_vlan(),
178 ofp.action.output(port),
179 ]
180
181 buckets = [
182 ofp.bucket(actions=actions),
183 ]
184
185 request = ofp.message.group_add(group_type=ofp.OFPGT_INDIRECT,
186 group_id=group_id,
187 buckets=buckets
188 )
189 ctrl.message_send(request)
190
191 if send_barrier:
192 do_barrier(ctrl)
193
194 return group_id, request
195
macauley97557232015-07-16 17:28:07 +0800196def add_l2_mcast_group(ctrl, ports, vlanid, mcast_grp_index):
197 buckets=[]
198 for of_port in ports:
199 group_id = encode_l2_interface_group_id(vlanid, of_port)
200 action=[ofp.action.group(group_id)]
201 buckets.append(ofp.bucket(actions=action))
202
203 group_id =encode_l2_mcast_group_id(vlanid, mcast_grp_index)
204 request = ofp.message.group_add(group_type=ofp.OFPGT_ALL,
205 group_id=group_id,
206 buckets=buckets
207 )
208 ctrl.message_send(request)
macauley15909e72015-07-17 15:58:57 +0800209 return request
macauley97557232015-07-16 17:28:07 +0800210
macauley15909e72015-07-17 15:58:57 +0800211def add_l2_flood_group(ctrl, ports, vlanid, id):
212 buckets=[]
213 for of_port in ports:
214 group_id = encode_l2_interface_group_id(vlanid, of_port)
215 action=[ofp.action.group(group_id)]
216 buckets.append(ofp.bucket(actions=action))
macauley97557232015-07-16 17:28:07 +0800217
macauley15909e72015-07-17 15:58:57 +0800218 group_id =encode_l2_flood_group_id(vlanid, id)
219 request = ofp.message.group_add(group_type=ofp.OFPGT_ALL,
220 group_id=group_id,
221 buckets=buckets
222 )
223 ctrl.message_send(request)
224 return request
225
226def add_l2_rewrite_group(ctrl, port, vlanid, id, src_mac, dst_mac):
227 group_id = encode_l2_interface_group_id(vlanid, port)
228
229 action=[]
230 if src_mac is not None:
231 action.append(ofp.action.set_field(ofp.oxm.eth_src(src_mac)))
232
233 if dst_mac is not None:
234 action.append(ofp.action.set_field(ofp.oxm.eth_dst(dst_mac)))
235
macauley_cheng93f3fa52015-09-02 17:57:31 +0800236 action.append(ofp.action.set_field(ofp.oxm.vlan_vid(vlanid)))
237
macauley15909e72015-07-17 15:58:57 +0800238 action.append(ofp.action.group(group_id))
239
240 buckets = [ofp.bucket(actions=action)]
241
242 group_id =encode_l2_rewrite_group_id(id)
243 request = ofp.message.group_add(group_type=ofp.OFPGT_INDIRECT,
244 group_id=group_id,
245 buckets=buckets
246 )
247 ctrl.message_send(request)
248 return request
249
250def add_l3_unicast_group(ctrl, port, vlanid, id, src_mac, dst_mac):
251 group_id = encode_l2_interface_group_id(vlanid, port)
252
253 action=[]
254 if src_mac is not None:
255 action.append(ofp.action.set_field(ofp.oxm.eth_src(src_mac)))
256
257 if dst_mac is not None:
258 action.append(ofp.action.set_field(ofp.oxm.eth_dst(dst_mac)))
259
260 action.append(ofp.action.set_field(ofp.oxm.vlan_vid(vlanid)))
261
262 action.append(ofp.action.group(group_id))
263
264 buckets = [ofp.bucket(actions=action)]
265
266 group_id =encode_l3_unicast_group_id(id)
267 request = ofp.message.group_add(group_type=ofp.OFPGT_INDIRECT,
268 group_id=group_id,
269 buckets=buckets
270 )
271 ctrl.message_send(request)
272 return request
273
274def add_l3_interface_group(ctrl, port, vlanid, id, src_mac):
275 group_id = encode_l2_interface_group_id(vlanid, port)
276
277 action=[]
278 action.append(ofp.action.set_field(ofp.oxm.eth_src(src_mac)))
279 action.append(ofp.action.set_field(ofp.oxm.vlan_vid(vlanid)))
280 action.append(ofp.action.group(group_id))
281
282 buckets = [ofp.bucket(actions=action)]
283
284 group_id =encode_l3_interface_group_id(id)
285 request = ofp.message.group_add(group_type=ofp.OFPGT_INDIRECT,
286 group_id=group_id,
287 buckets=buckets
288 )
289 ctrl.message_send(request)
290 return request
291
292def add_l3_ecmp_group(ctrl, id, l3_ucast_groups):
293 buckets=[]
294 for group in l3_ucast_groups:
295 buckets.append(ofp.bucket(actions=[ofp.action.group(group)]))
296
297 group_id =encode_l3_ecmp_group_id(id)
298 request = ofp.message.group_add(group_type=ofp.OFPGT_SELECT,
299 group_id=group_id,
300 buckets=buckets
301 )
302 ctrl.message_send(request)
303 return request
304
305def add_l3_mcast_group(ctrl, vid, mcast_group_id, groups_on_buckets):
306 buckets=[]
307 for group in groups_on_buckets:
308 buckets.append(ofp.bucket(actions=[ofp.action.group(group)]))
309
310 group_id =encode_l3_mcast_group_id(vid, mcast_group_id)
311 request = ofp.message.group_add(group_type=ofp.OFPGT_ALL,
312 group_id=group_id,
313 buckets=buckets
314 )
315 ctrl.message_send(request)
316 return request
macauleyfddc4662015-07-27 17:40:30 +0800317
318def add_l2_overlay_flood_over_unicast_tunnel_group(ctrl, tunnel_id, ports, index):
319 buckets=[]
320 for port in ports:
321 buckets.append(ofp.bucket(actions=[ofp.action.output(port)]))
322
323 group_id=encode_l2_overlay_group_id(tunnel_id, 0, index)
324 request = ofp.message.group_add(group_type=ofp.OFPGT_ALL,
325 group_id=group_id,
326 buckets=buckets
327 )
328 ctrl.message_send(request)
329 return request
330
331def add_l2_overlay_flood_over_mcast_tunnel_group(ctrl, tunnel_id, ports, index):
332 buckets=[]
333 for port in ports:
334 buckets.append(ofp.bucket(actions=[ofp.action.output(port)]))
335
336 group_id=encode_l2_overlay_group_id(tunnel_id, 1, index)
337 request = ofp.message.group_add(group_type=ofp.OFPGT_ALL,
338 group_id=group_id,
339 buckets=buckets
340 )
341 ctrl.message_send(request)
342 return request
343
344def add_l2_overlay_mcast_over_unicast_tunnel_group(ctrl, tunnel_id, ports, index):
345 buckets=[]
346 for port in ports:
347 buckets.append(ofp.bucket(actions=[ofp.action.output(port)]))
348
349 group_id=encode_l2_overlay_group_id(tunnel_id, 2, index)
350 request = ofp.message.group_add(group_type=ofp.OFPGT_ALL,
351 group_id=group_id,
352 buckets=buckets
353 )
354 ctrl.message_send(request)
355 return request
356
357def add_l2_overlay_mcast_over_mcast_tunnel_group(ctrl, tunnel_id, ports, index):
358 buckets=[]
359 for port in ports:
360 buckets.append(ofp.bucket(actions=[ofp.action.output(port)]))
361
362 group_id=encode_l2_overlay_group_id(tunnel_id, 3, index)
363 request = ofp.message.group_add(group_type=ofp.OFPGT_ALL,
364 group_id=group_id,
365 buckets=buckets
366 )
367 ctrl.message_send(request)
368 return request
369
370def add_port_table_flow(ctrl, is_overlay=True):
371 match = ofp.match()
372
373 if is_overlay == True:
374 match.oxm_list.append(ofp.oxm.in_port(0x10000))
macauleydbff3272015-07-30 14:07:16 +0800375 NEXT_TABLE=50
macauleyfddc4662015-07-27 17:40:30 +0800376 else:
377 match.oxm_list.append(ofp.oxm.in_port(0))
macauleydbff3272015-07-30 14:07:16 +0800378 NEXT_TABLE=10
macauleyfddc4662015-07-27 17:40:30 +0800379
380 request = ofp.message.flow_add(
381 table_id=0,
382 cookie=42,
383 match=match,
384 instructions=[
macauleydbff3272015-07-30 14:07:16 +0800385 ofp.instruction.goto_table(NEXT_TABLE)
macauleyfddc4662015-07-27 17:40:30 +0800386 ],
387 priority=0)
388 logging.info("Add port table, match port %lx" % 0x10000)
389 ctrl.message_send(request)
macauleydbff3272015-07-30 14:07:16 +0800390
391
macauleyfddc4662015-07-27 17:40:30 +0800392
macauley97557232015-07-16 17:28:07 +0800393def add_vlan_table_flow(ctrl, ports, vlan_id=1, flag=VLAN_TABLE_FLAG_ONLY_BOTH, send_barrier=False):
394 # table 10: vlan
395 # goto to table 20
macauley15909e72015-07-17 15:58:57 +0800396 msgs=[]
macauley97557232015-07-16 17:28:07 +0800397 for of_port in ports:
398 if (flag == VLAN_TABLE_FLAG_ONLY_TAG) or (flag == VLAN_TABLE_FLAG_ONLY_BOTH):
399 match = ofp.match()
400 match.oxm_list.append(ofp.oxm.in_port(of_port))
401 match.oxm_list.append(ofp.oxm.vlan_vid(0x1000+vlan_id))
402 request = ofp.message.flow_add(
403 table_id=10,
404 cookie=42,
405 match=match,
406 instructions=[
407 ofp.instruction.goto_table(20)
408 ],
409 priority=0)
410 logging.info("Add vlan %d tagged packets on port %d and go to table 20" %( vlan_id, of_port))
411 ctrl.message_send(request)
412
413 if (flag == VLAN_TABLE_FLAG_ONLY_UNTAG) or (flag == VLAN_TABLE_FLAG_ONLY_BOTH):
414 match = ofp.match()
415 match.oxm_list.append(ofp.oxm.in_port(of_port))
macauley_cheng6b311612015-09-04 11:32:27 +0800416 match.oxm_list.append(ofp.oxm.vlan_vid_masked(0, 0xfff))
macauley97557232015-07-16 17:28:07 +0800417 request = ofp.message.flow_add(
418 table_id=10,
419 cookie=42,
420 match=match,
421 instructions=[
422 ofp.instruction.apply_actions(
423 actions=[
424 ofp.action.set_field(ofp.oxm.vlan_vid(0x1000+vlan_id))
425 ]
426 ),
427 ofp.instruction.goto_table(20)
428 ],
429 priority=0)
430 logging.info("Add vlan %d untagged packets on port %d and go to table 20" % (vlan_id, of_port))
431 ctrl.message_send(request)
macauley15909e72015-07-17 15:58:57 +0800432 msgs.append(request)
macauley97557232015-07-16 17:28:07 +0800433
434 if send_barrier:
435 do_barrier(ctrl)
436
macauley15909e72015-07-17 15:58:57 +0800437 return msgs
macauley0f91a3e2015-07-17 18:09:59 +0800438
macauley_cheng6b311612015-09-04 11:32:27 +0800439def add_vlan_table_flow_pvid(ctrl, in_port, match_vid=None, pvid=1, send_barrier=False):
440 """it will tag pack as untagged packet wether it has tagg or not"""
441 match = ofp.match()
442 match.oxm_list.append(ofp.oxm.in_port(in_port))
443 actions=[]
444 if match_vid == None:
445 match.oxm_list.append(ofp.oxm.vlan_vid(0))
446 actions.append(ofp.action.set_field(ofp.oxm.vlan_vid(0x1000+pvid)))
447 goto_table=20
448 else:
449 match.oxm_list.append(ofp.oxm.vlan_vid_masked(0x1000+match_vid, 0x1fff))
450 actions.append(ofp.action.push_vlan(0x8100))
451 actions.append(ofp.action.set_field(ofp.oxm.vlan_vid(0x1000+pvid)))
452 goto_table=20
453
454 request = ofp.message.flow_add(
455 table_id=10,
456 cookie=42,
457 match=match,
458 instructions=[
459 ofp.instruction.apply_actions(actions=actions)
460 ,ofp.instruction.goto_table(goto_table)
461 ],
462 priority=0)
463 logging.info("Add PVID %d on port %d and go to table %ld" %( pvid, in_port, goto_table))
464 ctrl.message_send(request)
465
466 if send_barrier:
467 do_barrier(ctrl)
468
469def add_vlan_table_flow_allow_all_vlan(ctrl, in_port, send_barrier=False):
470 """it st flow allow all vlan tag on this port"""
471 match = ofp.match()
472 match.oxm_list.append(ofp.oxm.in_port(in_port))
473 match.oxm_list.append(ofp.oxm.vlan_vid_masked(0x1000, 0x1000))
474 request = ofp.message.flow_add(
475 table_id=10,
476 cookie=42,
477 match=match,
478 instructions=[
479 ofp.instruction.goto_table(20)
480 ],
481 priority=0)
482 logging.info("Add allow all vlan on port %d " %(in_port))
483 ctrl.message_send(request)
484
485
macauley53d90fe2015-08-04 17:34:22 +0800486def add_one_vlan_table_flow(ctrl, of_port, vlan_id=1, vrf=0, flag=VLAN_TABLE_FLAG_ONLY_BOTH, send_barrier=False):
macauley0f91a3e2015-07-17 18:09:59 +0800487 # table 10: vlan
488 # goto to table 20
489 if (flag == VLAN_TABLE_FLAG_ONLY_TAG) or (flag == VLAN_TABLE_FLAG_ONLY_BOTH):
490 match = ofp.match()
491 match.oxm_list.append(ofp.oxm.in_port(of_port))
492 match.oxm_list.append(ofp.oxm.vlan_vid(0x1000+vlan_id))
macauley7f89d962015-08-06 18:13:48 +0800493
494 actions=[]
495 if vrf!=0:
496 actions.append(ofp.action.set_field(ofp.oxm.exp2ByteValue(exp_type=1, value=vrf)))
497
498 actions.append(ofp.action.set_field(ofp.oxm.vlan_vid(value=vlan_id)))
499
macauley0f91a3e2015-07-17 18:09:59 +0800500 request = ofp.message.flow_add(
501 table_id=10,
502 cookie=42,
503 match=match,
504 instructions=[
macauley53d90fe2015-08-04 17:34:22 +0800505 ofp.instruction.apply_actions(
macauley7f89d962015-08-06 18:13:48 +0800506 actions=actions
macauley53d90fe2015-08-04 17:34:22 +0800507 ),
508 ofp.instruction.goto_table(20)
macauley0f91a3e2015-07-17 18:09:59 +0800509 ],
510 priority=0)
511 logging.info("Add vlan %d tagged packets on port %d and go to table 20" %( vlan_id, of_port))
512 ctrl.message_send(request)
513
514 if (flag == VLAN_TABLE_FLAG_ONLY_UNTAG) or (flag == VLAN_TABLE_FLAG_ONLY_BOTH):
515 match = ofp.match()
516 match.oxm_list.append(ofp.oxm.in_port(of_port))
517 match.oxm_list.append(ofp.oxm.vlan_vid(0))
macauley53d90fe2015-08-04 17:34:22 +0800518
macauley7f89d962015-08-06 18:13:48 +0800519 actions=[]
520 if vrf!=0:
521 actions.append(ofp.action.set_field(ofp.oxm.exp2ByteValue(exp_type=1, value=vrf)))
522
523 actions.append(ofp.action.set_field(ofp.oxm.vlan_vid(0x1000+vlan_id)))
524
macauley0f91a3e2015-07-17 18:09:59 +0800525 request = ofp.message.flow_add(
526 table_id=10,
527 cookie=42,
528 match=match,
529 instructions=[
530 ofp.instruction.apply_actions(
macauley7f89d962015-08-06 18:13:48 +0800531 actions=actions
macauley0f91a3e2015-07-17 18:09:59 +0800532 ),
533 ofp.instruction.goto_table(20)
534 ],
535 priority=0)
536 logging.info("Add vlan %d untagged packets on port %d and go to table 20" % (vlan_id, of_port))
537 ctrl.message_send(request)
538
539 if send_barrier:
540 do_barrier(ctrl)
541
542 return request
macauley15909e72015-07-17 15:58:57 +0800543
macauley97557232015-07-16 17:28:07 +0800544def add_bridge_flow(ctrl, dst_mac, vlanid, group_id, send_barrier=False):
545 match = ofp.match()
macauleyfddc4662015-07-27 17:40:30 +0800546 if dst_mac!=None:
547 match.oxm_list.append(ofp.oxm.eth_dst(dst_mac))
548
macauley97557232015-07-16 17:28:07 +0800549 match.oxm_list.append(ofp.oxm.vlan_vid(0x1000+vlanid))
macauleyfddc4662015-07-27 17:40:30 +0800550
macauley97557232015-07-16 17:28:07 +0800551 request = ofp.message.flow_add(
552 table_id=50,
553 cookie=42,
554 match=match,
555 instructions=[
556 ofp.instruction.write_actions(
557 actions=[
558 ofp.action.group(group_id)]),
559 ofp.instruction.goto_table(60)
560 ],
561 buffer_id=ofp.OFP_NO_BUFFER,
562 priority=1000)
563
564 logging.info("Inserting Brdige flow vlan %d, mac %s", vlanid, dst_mac)
565 ctrl.message_send(request)
566
567 if send_barrier:
macauley15909e72015-07-17 15:58:57 +0800568 do_barrier(ctrl)
569
macauley0f91a3e2015-07-17 18:09:59 +0800570 return request
macauleyfddc4662015-07-27 17:40:30 +0800571
572def add_overlay_bridge_flow(ctrl, dst_mac, vnid, group_id, is_group=True, send_barrier=False):
573 match = ofp.match()
574 if dst_mac!=None:
575 match.oxm_list.append(ofp.oxm.eth_dst(dst_mac))
576
577 match.oxm_list.append(ofp.oxm.tunnel_id(vnid))
578 if is_group == True:
579 actions=[ofp.action.group(group_id)]
580 else:
581 actions=[ofp.action.output(group_id)]
582
583 request = ofp.message.flow_add(
584 table_id=50,
585 cookie=42,
586 match=match,
587 instructions=[
588 ofp.instruction.write_actions(
589 actions=actions),
590 ofp.instruction.goto_table(60)
591 ],
592 buffer_id=ofp.OFP_NO_BUFFER,
593 priority=1000)
594
595 logging.info("Inserting Brdige flow vnid %d, mac %s", vnid, dst_mac)
596 ctrl.message_send(request)
597
598 if send_barrier:
599 do_barrier(ctrl)
600
601 return request
macauley0f91a3e2015-07-17 18:09:59 +0800602
603def add_termination_flow(ctrl, in_port, eth_type, dst_mac, vlanid, send_barrier=False):
604 match = ofp.match()
macauley0f91a3e2015-07-17 18:09:59 +0800605 match.oxm_list.append(ofp.oxm.eth_type(eth_type))
macauleyfddc4662015-07-27 17:40:30 +0800606 if dst_mac[0]&0x01 == 0x01:
607 match.oxm_list.append(ofp.oxm.eth_dst_masked(dst_mac, [0xff, 0xff, 0xff, 0x80, 0x00, 0x00]))
608 goto_table=40
609 else:
macauley53d90fe2015-08-04 17:34:22 +0800610 if in_port!=0:
611 match.oxm_list.append(ofp.oxm.in_port(in_port))
macauleyfddc4662015-07-27 17:40:30 +0800612 match.oxm_list.append(ofp.oxm.eth_dst(dst_mac))
613 match.oxm_list.append(ofp.oxm.vlan_vid(0x1000+vlanid))
614 goto_table=30
macauley0f91a3e2015-07-17 18:09:59 +0800615
616 request = ofp.message.flow_add(
617 table_id=20,
618 cookie=42,
619 match=match,
620 instructions=[
621 ofp.instruction.goto_table(goto_table)
622 ],
623 buffer_id=ofp.OFP_NO_BUFFER,
624 priority=1)
625
626 logging.info("Inserting termination flow inport %d, eth_type %lx, vlan %d, mac %s", in_port, eth_type, vlanid, dst_mac)
627 ctrl.message_send(request)
628
629 if send_barrier:
630 do_barrier(ctrl)
631
632 return request
633
macauley53d90fe2015-08-04 17:34:22 +0800634def add_unicast_routing_flow(ctrl, eth_type, dst_ip, mask, action_group_id, vrf=0, send_barrier=False):
macauley0f91a3e2015-07-17 18:09:59 +0800635 match = ofp.match()
636 match.oxm_list.append(ofp.oxm.eth_type(eth_type))
macauley53d90fe2015-08-04 17:34:22 +0800637 if vrf != 0:
638 match.oxm_list.append(ofp.oxm.exp2ByteValue(ofp.oxm.OFDPA_EXP_TYPE_VRF, vrf))
639
macauleyf8b1acd2015-07-23 15:13:13 +0800640 if mask!=0:
641 match.oxm_list.append(ofp.oxm.ipv4_dst_masked(dst_ip, mask))
642 else:
643 match.oxm_list.append(ofp.oxm.ipv4_dst(dst_ip))
macauley0f91a3e2015-07-17 18:09:59 +0800644
macauley53d90fe2015-08-04 17:34:22 +0800645
macauley0f91a3e2015-07-17 18:09:59 +0800646 request = ofp.message.flow_add(
647 table_id=30,
648 cookie=42,
649 match=match,
650 instructions=[
651 ofp.instruction.write_actions(
652 actions=[ofp.action.group(action_group_id)]),
653 ofp.instruction.goto_table(60)
654 ],
655 buffer_id=ofp.OFP_NO_BUFFER,
656 priority=1)
657
658 logging.info("Inserting unicast routing flow eth_type %lx, dip %ld",eth_type, dst_ip)
659 ctrl.message_send(request)
660
661 if send_barrier:
662 do_barrier(ctrl)
663
macauleyfddc4662015-07-27 17:40:30 +0800664 return request
665
666def add_mcast4_routing_flow(ctrl, vlan_id, src_ip, src_ip_mask, dst_ip, action_group_id, send_barrier=False):
667 match = ofp.match()
668 match.oxm_list.append(ofp.oxm.eth_type(0x0800))
669 match.oxm_list.append(ofp.oxm.vlan_vid(vlan_id))
670 if src_ip_mask!=0:
671 match.oxm_list.append(ofp.oxm.ipv4_src_masked(src_ip, src_ip_mask))
672 else:
673 match.oxm_list.append(ofp.oxm.ipv4_src(src_ip))
674
675 match.oxm_list.append(ofp.oxm.ipv4_dst(dst_ip))
676
677 request = ofp.message.flow_add(
678 table_id=40,
679 cookie=42,
680 match=match,
681 instructions=[
682 ofp.instruction.write_actions(
683 actions=[ofp.action.group(action_group_id)]),
684 ofp.instruction.goto_table(60)
685 ],
686 buffer_id=ofp.OFP_NO_BUFFER,
687 priority=1)
688
689 logging.info("Inserting mcast routing flow eth_type %lx, dip %lx, sip %lx, sip_mask %lx",0x0800, dst_ip, src_ip, src_ip_mask)
690 ctrl.message_send(request)
691
692 if send_barrier:
693 do_barrier(ctrl)
694
695 return request
696
697def get_vtap_lport_config_xml(dp_id, lport, phy_port, vlan, vnid, operation='merge'):
698 """
699 Command Example:
700 of-agent vtap 10001 ethernet 1/1 vid 1
701 of-agent vtp 10001 vni 10
702 """
703 if vlan != 0:
704 config_vtap_xml="""
705 <config>
706 <capable-switch xmlns="urn:onf:of111:config:yang" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
707 <id>capable-switch-1</id>
708 <resources>
709 <port xc:operation="OPERATION">
710 <resource-id >LPORT</resource-id>
711 <features>
712 <current>
713 <rate>10Gb</rate>
714 <medium>fiber</medium>
715 <pause>symmetric</pause>
716 </current>
717 <advertised>
718 <rate>10Gb</rate>
719 <rate>100Gb</rate>
720 <medium>fiber</medium>
721 <pause>symmetric</pause>
722 </advertised>
723 <supported>
724 <rate>10Gb</rate>
725 <rate>100Gb</rate>
726 <medium>fiber</medium>
727 <pause>symmetric</pause>
728 </supported>
729 <advertised-peer>
730 <rate>10Gb</rate>
731 <rate>100Gb</rate>
732 <medium>fiber</medium>
733 <pause>symmetric</pause>
734 </advertised-peer>
735 </features>
736 <ofdpa10:vtap xmlns:ofdpa10="urn:bcm:ofdpa10:accton01" xc:operation="OPERATION">
737 <ofdpa10:phy-port>PHY_PORT</ofdpa10:phy-port>
738 <ofdpa10:vid>VLAN_ID</ofdpa10:vid>
739 <ofdpa10:vni>VNID</ofdpa10:vni>
740 </ofdpa10:vtap>
741 </port>
742 </resources>
743 <logical-switches>
744 <switch>
745 <id>DATAPATH_ID</id>
746 <datapath-id>DATAPATH_ID</datapath-id>
747 <resources>
748 <port xc:operation="OPERATION">LPORT</port>
749 </resources>
750 </switch>
751 </logical-switches>
752 </capable-switch>
753 </config>
754 """
755 else:
756 config_vtap_xml="""
757 <config>
758 <capable-switch xmlns="urn:onf:of111:config:yang" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
759 <id>capable-switch-1</id>
760 <resources>
761 <port xc:operation="OPERATION">
762 <resource-id >LPORT</resource-id>
763 <features>
764 <current>
765 <rate>10Gb</rate>
766 <medium>fiber</medium>
767 <pause>symmetric</pause>
768 </current>
769 <advertised>
770 <rate>10Gb</rate>
771 <rate>100Gb</rate>
772 <medium>fiber</medium>
773 <pause>symmetric</pause>
774 </advertised>
775 <supported>
776 <rate>10Gb</rate>
777 <rate>100Gb</rate>
778 <medium>fiber</medium>
779 <pause>symmetric</pause>
780 </supported>
781 <advertised-peer>
782 <rate>10Gb</rate>
783 <rate>100Gb</rate>
784 <medium>fiber</medium>
785 <pause>symmetric</pause>
786 </advertised-peer>
787 </features>
788 <ofdpa10:vtap xmlns:ofdpa10="urn:bcm:ofdpa10:accton01" xc:operation="OPERATION">
789 <ofdpa10:phy-port>PHY_PORT</ofdpa10:phy-port>
790 <ofdpa10:vni>VNID</ofdpa10:vni>
791 </ofdpa10:vtap>
792 </port>
793 </resources>
794 <logical-switches>
795 <switch>
796 <id>DATAPATH_ID</id>
797 <datapath-id>DATAPATH_ID</datapath-id>
798 <resources>
799 <port xc:operation="OPERATION">LPORT</port>
800 </resources>
801 </switch>
802 </logical-switches>
803 </capable-switch>
804 </config>
805 """
806 str_datapath_id_f= "{:016x}".format(dp_id)
807 str_datapath_id=':'.join([str_datapath_id_f[i:i+2] for i in range(0, len(str_datapath_id_f), 2)])
808 config_vtap_xml=config_vtap_xml.replace("DATAPATH_ID", str_datapath_id)
macauley25999cf2015-08-07 17:03:24 +0800809 config_vtap_xml=config_vtap_xml.replace("LPORT", str(int(lport)))
macauleyfddc4662015-07-27 17:40:30 +0800810 config_vtap_xml=config_vtap_xml.replace("PHY_PORT", str(phy_port))
811 config_vtap_xml=config_vtap_xml.replace("VLAN_ID", str(vlan))
812 config_vtap_xml=config_vtap_xml.replace("VNID", str(vnid))
813 config_vtap_xml=config_vtap_xml.replace("OPERATION", str(operation))
814 return config_vtap_xml
815
816def get_vtep_lport_config_xml(dp_id, lport, src_ip, dst_ip, next_hop_id, vnid, udp_src_port=6633, ttl=25, operation='merge'):
817 """
818 Command Example:
819 of-agent vtep 10002 source user-input-src-ip destination user-input-dst-ip udp-source-port 6633 nexthop 2 ttl 25
820 of-agent vtp 10001 vni 10
821 """
822
823 config_vtep_xml="""
824 <config>
825 <capable-switch xmlns="urn:onf:of111:config:yang" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
826 <id>capable-switch-1</id>
827 <resources>
828 <port xc:operation="OPERATION">
829 <resource-id>LPORT</resource-id>
830 <features>
831 <current>
832 <rate>10Gb</rate>
833 <medium>fiber</medium>
834 <pause>symmetric</pause>
835 </current>
836 <advertised>
837 <rate>10Gb</rate>
838 <rate>100Gb</rate>
839 <medium>fiber</medium>
840 <pause>symmetric</pause>
841 </advertised>
842 <supported>
843 <rate>10Gb</rate>
844 <rate>100Gb</rate>
845 <medium>fiber</medium>
846 <pause>symmetric</pause>
847 </supported>
848 <advertised-peer>
849 <rate>10Gb</rate>
850 <rate>100Gb</rate>
851 <medium>fiber</medium>
852 <pause>symmetric</pause>
853 </advertised-peer>
854 </features>
855 <ofdpa10:vtep xmlns:ofdpa10="urn:bcm:ofdpa10:accton01">
856 <ofdpa10:src-ip>SRC_IP</ofdpa10:src-ip>
857 <ofdpa10:dest-ip>DST_IP</ofdpa10:dest-ip>
858 <ofdpa10:udp-src-port>UDP_SRC_PORT</ofdpa10:udp-src-port>
macauley25999cf2015-08-07 17:03:24 +0800859 <ofdpa10:vni xc:operation="OPERATION">
860 <ofdpa10:id>VNID</ofdpa10:id>
861 </ofdpa10:vni>
macauleyfddc4662015-07-27 17:40:30 +0800862 <ofdpa10:nexthop-id>NEXT_HOP_ID</ofdpa10:nexthop-id>
863 <ofdpa10:ttl>TTL</ofdpa10:ttl>
864 </ofdpa10:vtep>
865 </port>
866 </resources>
867 <logical-switches>
868 <switch>
869 <id>DATAPATH_ID</id>
870 <datapath-id>DATAPATH_ID</datapath-id>
871 <resources>
872 <port xc:operation="OPERATION">LPORT</port>
873 </resources>
874 </switch>
875 </logical-switches>
876 </capable-switch>
877 </config>
878 """
879 str_datapath_id_f= "{:016x}".format(dp_id)
880 str_datapath_id=':'.join([str_datapath_id_f[i:i+2] for i in range(0, len(str_datapath_id_f), 2)])
881 config_vtep_xml=config_vtep_xml.replace("DATAPATH_ID", str_datapath_id)
macauley25999cf2015-08-07 17:03:24 +0800882 config_vtep_xml=config_vtep_xml.replace("LPORT", str(int(lport)))
macauleyfddc4662015-07-27 17:40:30 +0800883 config_vtep_xml=config_vtep_xml.replace("SRC_IP", str(src_ip))
884 config_vtep_xml=config_vtep_xml.replace("DST_IP", str(dst_ip))
885 config_vtep_xml=config_vtep_xml.replace("UDP_SRC_PORT", str(udp_src_port))
886 config_vtep_xml=config_vtep_xml.replace("NEXT_HOP_ID", str(next_hop_id))
887 config_vtep_xml=config_vtep_xml.replace("TTL", str(ttl))
888 config_vtep_xml=config_vtep_xml.replace("VNID", str(vnid))
889 config_vtep_xml=config_vtep_xml.replace("OPERATION", str(operation))
890
891 return config_vtep_xml
892
893def get_next_hop_config_xml(next_hop_id, dst_mac, phy_port, vlan, operation='merge'):
894 #of-agent nexthop 2 destination user-input-dst-mac ethernet 1/2 vid 2
895 config_nexthop_xml="""
896 <config>
897 <of11-config:capable-switch xmlns:of11-config="urn:onf:of111:config:yang" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
898 <ofdpa10:next-hop xmlns:ofdpa10="urn:bcm:ofdpa10:accton01" xc:operation="OPERATION">
899 <ofdpa10:id>NEXT_HOP_ID</ofdpa10:id>
900 <ofdpa10:dest-mac>DST_MAC</ofdpa10:dest-mac>
901 <ofdpa10:phy-port>PHY_PORT</ofdpa10:phy-port>
902 <ofdpa10:vid>VLAN_ID</ofdpa10:vid>
903 </ofdpa10:next-hop>
904 </of11-config:capable-switch>
905 </config>
906 """
907 config_nexthop_xml=config_nexthop_xml.replace("VLAN_ID", str(vlan))
908 config_nexthop_xml=config_nexthop_xml.replace("PHY_PORT", str(phy_port))
909 config_nexthop_xml=config_nexthop_xml.replace("NEXT_HOP_ID", str(next_hop_id))
910 config_nexthop_xml=config_nexthop_xml.replace("DST_MAC", str(dst_mac))
911 config_nexthop_xml=config_nexthop_xml.replace("OPERATION", str(operation))
912 return config_nexthop_xml
913
914def get_vni_config_xml(vni_id, mcast_ipv4, next_hop_id, operation='merge'):
915 #of-agent vni 10 multicast 224.1.1.1 nexthop 20
916 if mcast_ipv4!=None:
917 config_vni_xml="""
918 <config>
919 <of11-config:capable-switch xmlns:of11-config="urn:onf:of111:config:yang" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
920 <ofdpa10:vni xmlns:ofdpa10="urn:bcm:ofdpa10:accton01" xc:operation="OPERATION">
921 <ofdpa10:id>VNID</ofdpa10:id>
922 <ofdpa10:vni-multicast-group>MCAST_IP</ofdpa10:vni-multicast-group>
923 <ofdpa10:multicast-group-nexthop-id>NEXT_HOP_ID</ofdpa10:multicast-group-nexthop-id>
924 </ofdpa10:vni>
925 </of11-config:capable-switch>
926 </config>
927 """
928 config_vni_xml=config_vni_xml.replace("NEXT_HOP_ID", str(next_hop_id))
929 config_vni_xml=config_vni_xml.replace("MCAST_IP", str(mcast_ipv4))
930 else:
931 config_vni_xml="""
932 <config>
933 <of11-config:capable-switch xmlns:of11-config="urn:onf:of111:config:yang" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0">
934 <ofdpa10:vni xmlns:ofdpa10="urn:bcm:ofdpa10:accton01" xc:operation="OPERATION">
935 <ofdpa10:id>VNID</ofdpa10:id>
936 </ofdpa10:vni>
937 </of11-config:capable-switch>
938 </config>
939 """
940
941 config_vni_xml=config_vni_xml.replace("VNID", str(vni_id))
942 config_vni_xml=config_vni_xml.replace("OPERATION", str(operation))
943 return config_vni_xml
944
945def get_featureReplay(self):
946 req = ofp.message.features_request()
947 res, raw = self.controller.transact(req)
948 self.assertIsNotNone(res, "Did not receive a response from the DUT.")
949 self.assertEqual(res.type, ofp.OFPT_FEATURES_REPLY,
950 ("Unexpected packet type %d received in response to "
951 "OFPT_FEATURES_REQUEST") % res.type)
952 return res
953
954def send_edit_config(switch_ip, xml, target='runing'):
955 NETCONF_ACCOUNT="netconfuser"
956 NETCONF_PASSWD="netconfuser"
957 with manager.connect_ssh(host=switch_ip, port=830, username=NETCONF_ACCOUNT, password=NETCONF_PASSWD, hostkey_verify=False ) as m:
958 try:
959 m.edit_config(target='running',
960 config=xml,
961 default_operation='merge',
962 error_option='stop-on-error')
963
964 except Exception as e:
965 logging.info("Fail to set xml %s", xml)
966 return False
967
968 #return m.get_config(source='running').data_xml
969 return True
970
971def send_delete_config(switch_ip, xml, target='runing'):
972 NETCONF_ACCOUNT="netconfuser"
973 NETCONF_PASSWD="netconfuser"
974 with manager.connect_ssh(host=switch_ip, port=830, username=NETCONF_ACCOUNT, password=NETCONF_PASSWD, hostkey_verify=False ) as m:
975 try:
976 m.edit_config(target='running',
977 config=xml,
978 default_operation='delete',
979 error_option='stop-on-error')
980
981 except Exception as e:
982 logging.info("Fail to set xml %s", xml)
983 return False
984
985 #return m.get_config(source='running').data_xml
986 return True
987
988def get_edit_config(switch_ip, target='runing'):
989 NETCONF_ACCOUNT="netconfuser"
990 NETCONF_PASSWD="netconfuser"
991 with manager.connect_ssh(host=switch_ip, port=830, username=NETCONF_ACCOUNT, password=NETCONF_PASSWD, hostkey_verify=False ) as m:
macauley6f6ceb22015-08-07 09:37:12 +0800992 return m.get_config(source='running').data_xml
macauleydbff3272015-07-30 14:07:16 +0800993
macauley_cheng67da9262015-08-31 15:18:41 +0800994
995"""
996MPLS
997"""
998
999OFDPA_MPLS_SUBTYPE_SHIFT=24
1000OFDPA_MPLS_GROUP_SUBTYPE_L2_VPN_LABEL=1
1001OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL=2
1002OFDPA_MPLS_GROUP_SUBTYPE_TUNNEL_LABEL1=3
1003OFDPA_MPLS_GROUP_SUBTYPE_TUNNEL_LABEL2=4
1004OFDPA_MPLS_GROUP_SUBTYPE_SWAP_LABEL=5
1005OFDPA_MPLS_GROUP_SUBTYPE_FAST_FAILOVER_GROUP=6
1006OFDPA_MPLS_GROUP_SUBTYPE_ECMP=8
1007OFDPA_MPLS_GROUP_SUBTYPE_L2_TAG=10
1008
1009def encode_mpls_interface_group_id(subtype, index):
1010 index=index&0x00ffffff
1011 assert(subtype==0)
1012 return index + (9 << OFDPA_GROUP_TYPE_SHIFT)+(subtype<<OFDPA_MPLS_SUBTYPE_SHIFT)
1013
1014def encode_mpls_label_group_id(subtype, index):
1015 index=index&0x00ffffff
1016 assert(subtype <=5 or subtype==0)
1017 #1: l2 vpn label
1018 #2: l3 vpn label
1019 #3: mpls tunnel label 1
1020 #4: mpls tunnel lable 2
1021 #5: mpls swap label
1022 return index + (9 << OFDPA_GROUP_TYPE_SHIFT)+(subtype<<OFDPA_MPLS_SUBTYPE_SHIFT)
1023
1024def encode_mpls_forwarding_group_id(subtype, index):
1025 index=index&0x00ffffff
1026 assert(subtype==6 or subtype==8 or subtype==10)
1027 return index + (10 << OFDPA_GROUP_TYPE_SHIFT)+(subtype<<OFDPA_MPLS_SUBTYPE_SHIFT)
1028
1029
1030def add_mpls_intf_group(ctrl, ref_gid, dst_mac, src_mac, vid, index, subtype=0):
1031 action=[]
1032 action.append(ofp.action.set_field(ofp.oxm.eth_src(src_mac)))
1033 action.append(ofp.action.set_field(ofp.oxm.eth_dst(dst_mac)))
1034 action.append(ofp.action.set_field(ofp.oxm.vlan_vid(vid)))
1035 action.append(ofp.action.group(ref_gid))
1036
1037 buckets = [ofp.bucket(actions=action)]
1038
1039 mpls_group_id =encode_mpls_interface_group_id(subtype, index)
1040 request = ofp.message.group_add(group_type=ofp.OFPGT_INDIRECT,
1041 group_id=mpls_group_id,
1042 buckets=buckets
1043 )
1044 ctrl.message_send(request)
1045 return mpls_group_id, request
1046
1047def add_mpls_label_group(ctrl, subtype, index, ref_gid,
1048 lmep_id=-1,
1049 qos_index=-1,
1050 push_l2_header=False,
1051 push_vlan=False,
1052 push_mpls_header=False,
1053 push_cw=False,
1054 set_mpls_label=None,
1055 set_bos=None,
1056 set_tc=None,
1057 set_tc_from_table=False,
1058 cpy_tc_outward=False,
1059 set_ttl=None,
1060 cpy_ttl_outward=False,
1061 oam_lm_tx_count=False,
1062 set_pri_from_table=False
1063 ):
1064 """
1065 @ref_gid: only can be mpls intf group or mpls tunnel label 1/2 group
1066 """
1067 action=[]
1068
1069 if push_vlan== True:
1070 action.append(ofp.action.push_vlan(0x8100))
1071 if push_mpls_header== True:
1072 action.append(ofp.action.push_mpls(0x8847))
1073 if set_mpls_label != None:
1074 action.append(ofp.action.set_field(ofp.oxm.mpls_label(set_mpls_label)))
1075 if set_bos != None:
1076 action.append(ofp.action.set_field(ofp.oxm.mpls_bos(set_bos)))
1077 if set_tc != None:
1078 assert(set_tc_from_table==False)
1079 action.append(ofp.action.set_field(ofp.oxm.mpls_tc(set_tc)))
1080 if set_ttl != None:
1081 action.append(ofp.action.set_mpls_ttl(set_ttl))
1082 if cpy_ttl_outward == True:
1083 action.append(ofp.action.copy_ttl_out())
1084 """
1085 ofdpa experimenter
1086 """
1087 if push_l2_header== True:
1088 action.append(ofp.action.ofdpa_push_l2_header())
1089 if set_tc_from_table== True:
1090 assert(qos_index>=0)
1091 assert(set_tc == None)
1092 action.append(ofp.action.ofdpa_set_tc_from_table(qos_index))
1093 if cpy_tc_outward == True:
1094 action.append(ofp.action.ofdpa_copy_tc_out())
1095 if oam_lm_tx_count == True:
1096 assert(qos_index>=0 and lmep_id>=0)
1097 action.append(ofp.action.ofdpa_oam_lm_tx_count(lmep_id, qos_index))
1098 if set_pri_from_table == True:
1099 assert(qos_index>=0)
1100 action.append(ofp.action.ofdpa_set_qos_from_table(qos_index))
1101 if push_cw == True:
1102 action.append(ofp.action.ofdpa_push_cw())
1103
1104 action.append(ofp.action.group(ref_gid))
1105 buckets = [ofp.bucket(actions=action)]
1106
1107 mpls_group_id = encode_mpls_label_group_id(subtype, index)
1108 request = ofp.message.group_add(group_type=ofp.OFPGT_INDIRECT,
1109 group_id=mpls_group_id,
1110 buckets=buckets
1111 )
1112 ctrl.message_send(request)
1113
1114 return mpls_group_id, request
1115
1116def add_mpls_forwarding_group(ctrl, subtype, index, ref_gids,
1117 watch_port=None,
macauley_chengd17ce512015-08-31 17:45:51 +08001118 watch_group=ofp.OFPP_ANY,
macauley_cheng67da9262015-08-31 15:18:41 +08001119 push_vlan=None,
macauley_chengd17ce512015-08-31 17:45:51 +08001120 pop_vlan=None,
macauley_cheng67da9262015-08-31 15:18:41 +08001121 set_vid=None):
1122 assert(subtype == OFDPA_MPLS_GROUP_SUBTYPE_FAST_FAILOVER_GROUP
1123 or subtype == OFDPA_MPLS_GROUP_SUBTYPE_ECMP
1124 or subtype == OFDPA_MPLS_GROUP_SUBTYPE_L2_TAG)
macauley_chengd17ce512015-08-31 17:45:51 +08001125
macauley_cheng67da9262015-08-31 15:18:41 +08001126 buckets=[]
1127 if subtype == OFDPA_MPLS_GROUP_SUBTYPE_FAST_FAILOVER_GROUP:
macauley_chengd17ce512015-08-31 17:45:51 +08001128 group_type = ofp.OFPGT_FF
macauley_cheng67da9262015-08-31 15:18:41 +08001129 for gid in ref_gids:
macauley_chengd17ce512015-08-31 17:45:51 +08001130 action=[]
1131 action.append(ofp.action.group(gid))
1132 buckets.append(ofp.bucket(watch_port=watch_port, watch_group=watch_group,actions=action))
1133
macauley_cheng67da9262015-08-31 15:18:41 +08001134 elif subtype == OFDPA_MPLS_GROUP_SUBTYPE_ECMP:
1135 group_type = ofp.OFPGT_SELECT
1136 for gid in ref_gids:
macauley_chengd17ce512015-08-31 17:45:51 +08001137 action=[]
macauley_cheng67da9262015-08-31 15:18:41 +08001138 action.append(ofp.action.group(gid))
1139 buckets.append(ofp.bucket(actions=action))
macauley_chengd17ce512015-08-31 17:45:51 +08001140
macauley_cheng67da9262015-08-31 15:18:41 +08001141 elif subtype == OFDPA_MPLS_GROUP_SUBTYPE_L2_TAG:
1142 group_type = ofp.OFPGT_INDIRECT
macauley_chengd17ce512015-08-31 17:45:51 +08001143 action=[]
macauley_cheng67da9262015-08-31 15:18:41 +08001144 if set_vid!=None:
1145 action.append(ofp.action.set_field(ofp.oxm.vlan_vid(set_vid)))
1146 if push_vlan!=None:
1147 action.append(ofp.action.push_vlan(push_vlan))
1148 if pop_vlan!=None:
macauley_chengd17ce512015-08-31 17:45:51 +08001149 action.append(ofp.action.pop_vlan())
macauley_cheng67da9262015-08-31 15:18:41 +08001150 action.append(ofp.action.group(ref_gids[0]))
1151 buckets.append(ofp.bucket(actions=action))
macauley_chengd17ce512015-08-31 17:45:51 +08001152
1153 mpls_group_id = encode_mpls_forwarding_group_id(subtype, index)
macauley_cheng67da9262015-08-31 15:18:41 +08001154 request = ofp.message.group_add(group_type=group_type,
macauley_cheng67da9262015-08-31 15:18:41 +08001155 group_id=mpls_group_id,
1156 buckets=buckets
1157 )
1158 ctrl.message_send(request)
1159 return mpls_group_id, request
macauley_chengd17ce512015-08-31 17:45:51 +08001160
1161
macauley_cheng67da9262015-08-31 15:18:41 +08001162"""
1163dislay
1164"""
macauleydbff3272015-07-30 14:07:16 +08001165def print_current_table_flow_stat(ctrl, table_id=0xff):
1166 stat_req=ofp.message.flow_stats_request()
1167 response, pkt = ctrl.transact(stat_req)
1168 if response == None:
1169 print "no response"
1170 return None
1171 print len(response.entries)
1172 for obj in response.entries:
1173 print "match ", obj.match
1174 print "cookie", obj.cookie
1175 print "priority", obj.priority
1176 print "idle_timeout", obj.idle_timeout
1177 print "hard_timeout", obj.hard_timeout
1178 #obj.actions
1179 print "packet count: %lx"%obj.packet_count