blob: 199b429836a85f2b9cfab82b94840822dde39ef8 [file] [log] [blame]
Matteo Scandoloa229eca2017-08-08 13:05:28 -07001
2# Copyright 2017-present Open Networking Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
Flavio Castro05d20bc2015-11-16 15:06:14 -050017"""
Flavio Castro423df652016-05-17 20:14:08 -040018Check README file
Flavio Castro05d20bc2015-11-16 15:06:14 -050019"""
Flavio Castro1c9b1252016-02-04 18:42:58 -050020import Queue
Flavio Castro05d20bc2015-11-16 15:06:14 -050021
Flavio Castro05d20bc2015-11-16 15:06:14 -050022from oftest import config
Flavio Castro67d8bd52016-02-03 14:22:14 -050023import inspect
Flavio Castro167f5bd2015-12-02 19:33:53 -050024import logging
25import oftest.base_tests as base_tests
Flavio Castro05d20bc2015-11-16 15:06:14 -050026import ofp
Saurav Das34992182017-04-14 15:59:48 -070027import time
Andrea Campanella0ea96322018-04-19 19:11:49 +020028from oftest.oft12.testutils import delete_all_flows_one_table
Flavio Castro05d20bc2015-11-16 15:06:14 -050029from oftest.testutils import *
30from accton_util import *
Pierbbdf3782016-08-22 17:58:26 -070031from utils import *
Flavio Castrod8f8af22015-12-02 18:19:26 -050032
Flavio Castroa7162bb2016-07-25 17:30:30 -070033class PacketInUDP( base_tests.SimpleDataPlane ):
Flavio Castro6d498522015-12-15 14:05:04 -050034 """
Flavio Castro76c5b262016-07-27 19:53:00 -070035 Verify ACL rule for IP_PROTO=2 wont match a UDP packet and a rule for IP_PROTO=17 WILL match a UDP packet.
Flavio Castro6d498522015-12-15 14:05:04 -050036 """
37
Flavio Castroa7162bb2016-07-25 17:30:30 -070038 def runTest( self ):
Flavio Castro8c37e1c2016-07-19 18:26:33 -070039 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -070040 parsed_vlan_pkt = simple_udp_packet( pktlen=104, vlan_vid=0x1001, dl_vlan_enable=True )
41 vlan_pkt = str( parsed_vlan_pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -070042 # create match
Flavio Castroa7162bb2016-07-25 17:30:30 -070043 match = ofp.match( )
44 match.oxm_list.append( ofp.oxm.eth_type( 0x0800 ) )
45 match.oxm_list.append( ofp.oxm.ip_proto( 2 ) )
46 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
47 ofp.instruction.apply_actions( actions=[
48 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
49 buffer_id=ofp.OFP_NO_BUFFER, priority=1 )
50 logging.info( "Inserting packet in flow to controller" )
51 self.controller.message_send( request )
Flavio Castro1c9b1252016-02-04 18:42:58 -050052
Flavio Castroa7162bb2016-07-25 17:30:30 -070053 for of_port in config[ "port_map" ].keys( ):
54 logging.info( "PacketInMiss test, port %d", of_port )
55 self.dataplane.send( of_port, vlan_pkt )
Flavio Castro1c9b1252016-02-04 18:42:58 -050056
Flavio Castroa7162bb2016-07-25 17:30:30 -070057 verify_no_packet_in( self, vlan_pkt, of_port )
58 delete_all_flows( self.controller )
59 do_barrier( self.controller )
Flavio Castro6d498522015-12-15 14:05:04 -050060
Flavio Castroa7162bb2016-07-25 17:30:30 -070061 match = ofp.match( )
62 match.oxm_list.append( ofp.oxm.eth_type( 0x0800 ) )
63 match.oxm_list.append( ofp.oxm.ip_proto( 17 ) )
64 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
65 ofp.instruction.apply_actions( actions=[
66 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
67 buffer_id=ofp.OFP_NO_BUFFER, priority=1 )
68 logging.info( "Inserting packet in flow to controller" )
69 self.controller.message_send( request )
70 do_barrier( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -050071
Flavio Castroa7162bb2016-07-25 17:30:30 -070072 for of_port in config[ "port_map" ].keys( ):
73 logging.info( "PacketInMiss test, port %d", of_port )
74 self.dataplane.send( of_port, vlan_pkt )
Flavio Castro6d498522015-12-15 14:05:04 -050075
Flavio Castroa7162bb2016-07-25 17:30:30 -070076 verify_packet_in( self, vlan_pkt, of_port, ofp.OFPR_ACTION )
Flavio Castro6d498522015-12-15 14:05:04 -050077
Flavio Castroa7162bb2016-07-25 17:30:30 -070078 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -070079 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -070080 delete_all_flows( self.controller )
81 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -050082
Flavio Castroaf2b4502016-02-02 17:41:32 -050083
Flavio Castro67d8bd52016-02-03 14:22:14 -050084@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -070085class ArpNL2( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -070086 """
87 Needs a description, disabled for now. Also needs try/finally
88 """
Flavio Castroa7162bb2016-07-25 17:30:30 -070089 def runTest( self ):
90 delete_all_flows( self.controller )
91 delete_all_groups( self.controller )
Flavio Castro7fb6ca92015-12-16 15:50:14 -050092
Flavio Castroa7162bb2016-07-25 17:30:30 -070093 ports = sorted( config[ "port_map" ].keys( ) )
94 match = ofp.match( )
95 match.oxm_list.append( ofp.oxm.eth_type( 0x0806 ) )
96 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
97 ofp.instruction.apply_actions( actions=[
98 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
99 buffer_id=ofp.OFP_NO_BUFFER, priority=40000 )
100 self.controller.message_send( request )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500101 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700102 add_one_l2_interface_group( self.controller, port, 1, False, False )
103 add_one_vlan_table_flow( self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_BOTH )
104 group_id = encode_l2_interface_group_id( 1, port )
105 add_bridge_flow( self.controller, [ 0x00, 0x12, 0x34, 0x56, 0x78, port ], 1, group_id, True )
106 do_barrier( self.controller )
107 parsed_arp_pkt = simple_arp_packet( )
108 arp_pkt = str( parsed_arp_pkt )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500109
110 for out_port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700111 self.dataplane.send( out_port, arp_pkt )
112 verify_packet_in( self, arp_pkt, out_port, ofp.OFPR_ACTION )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500113 # change dest based on port number
Flavio Castro1c9b1252016-02-04 18:42:58 -0500114 mac_dst = '00:12:34:56:78:%02X' % out_port
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500115 for in_port in ports:
116 if in_port == out_port:
117 continue
118 # change source based on port number to avoid packet-ins from learning
Flavio Castro1c9b1252016-02-04 18:42:58 -0500119 mac_src = '00:12:34:56:78:%02X' % in_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700120 parsed_pkt = simple_tcp_packet( eth_dst=mac_dst, eth_src=mac_src )
121 pkt = str( parsed_pkt )
122 self.dataplane.send( in_port, pkt )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500123
124 for ofport in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700125 if ofport in [ out_port ]:
126 verify_packet( self, pkt, ofport )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500127 else:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700128 verify_no_packet( self, pkt, ofport )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500129
Flavio Castroa7162bb2016-07-25 17:30:30 -0700130 verify_no_other_packets( self )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500131
Flavio Castroa7162bb2016-07-25 17:30:30 -0700132class PacketInArp( base_tests.SimpleDataPlane ):
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500133 """
Flavio Castro76c5b262016-07-27 19:53:00 -0700134 Verify Packet-in message from eth_type 0x806 on ACL table
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500135 """
136
Flavio Castroa7162bb2016-07-25 17:30:30 -0700137 def runTest( self ):
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700138 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700139 parsed_arp_pkt = simple_arp_packet( )
140 arp_pkt = str( parsed_arp_pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700141 # create match
Flavio Castroa7162bb2016-07-25 17:30:30 -0700142 match = ofp.match( )
143 match.oxm_list.append( ofp.oxm.eth_type( 0x0806 ) )
144 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
145 ofp.instruction.apply_actions( actions=[
146 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
147 buffer_id=ofp.OFP_NO_BUFFER, priority=1 )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500148
Saurav Das34992182017-04-14 15:59:48 -0700149 logging.info( "Inserting arp flow " )
Flavio Castroa7162bb2016-07-25 17:30:30 -0700150 self.controller.message_send( request )
151 do_barrier( self.controller )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500152
Flavio Castroa7162bb2016-07-25 17:30:30 -0700153 for of_port in config[ "port_map" ].keys( ):
Saurav Das34992182017-04-14 15:59:48 -0700154 logging.info( "PacketInArp test, sending arp packet to port %d", of_port )
Flavio Castroa7162bb2016-07-25 17:30:30 -0700155 self.dataplane.send( of_port, arp_pkt )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500156
Flavio Castroa7162bb2016-07-25 17:30:30 -0700157 verify_packet_in( self, arp_pkt, of_port, ofp.OFPR_ACTION )
Flavio Castro7fb6ca92015-12-16 15:50:14 -0500158
Flavio Castroa7162bb2016-07-25 17:30:30 -0700159 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700160 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700161 delete_all_flows( self.controller )
162 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500163
Saurav Das34992182017-04-14 15:59:48 -0700164@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -0700165class PacketInIPTable( base_tests.SimpleDataPlane ):
Flavio Castro91d1a552016-05-17 16:59:44 -0700166 """
Pier265ad5f2017-02-28 17:46:28 +0100167 Verify Packet-in message from IP table when controller action is used
Flavio Castro91d1a552016-05-17 16:59:44 -0700168 Send a packet to each dataplane port and verify that a packet
169 in message is received from the controller for each
170 #todo verify you stop receiving after adding rule
171 """
172
Flavio Castroa7162bb2016-07-25 17:30:30 -0700173 def runTest( self ):
174 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700175 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700176 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
177 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
178 dip = 0xc0a80001
179 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro91d1a552016-05-17 16:59:44 -0700180
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700181 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700182 # add l2 interface group
183 vlan_id = port
184 add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id, is_tagged=True,
185 send_barrier=False )
186 dst_mac[ 5 ] = vlan_id
187 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=vlan_id,
188 src_mac=intf_src_mac, dst_mac=dst_mac )
189 # add vlan flow table
TonyChouaf5505c2017-08-24 09:11:19 +0800190 add_one_vlan_table_flow( self.controller, port, vlan_id=vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castroa7162bb2016-07-25 17:30:30 -0700191 # add termination flow
192 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
193 # add unicast routing flow
194 dst_ip = dip + (vlan_id << 8)
195 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, l3_msg.group_id,
196 send_ctrl=True )
197 Groups.put( l3_msg.group_id )
Flavio Castro91d1a552016-05-17 16:59:44 -0700198
Flavio Castroa7162bb2016-07-25 17:30:30 -0700199 do_barrier( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -0700200
Flavio Castroa7162bb2016-07-25 17:30:30 -0700201 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700202 for in_port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700203 mac_src = '00:00:00:22:22:%02X' % in_port
204 ip_src = '192.168.%02d.1' % in_port
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700205 for out_port in ports:
206 if in_port == out_port:
207 continue
Flavio Castroa7162bb2016-07-25 17:30:30 -0700208 ip_dst = '192.168.%02d.1' % out_port
209 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
210 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
211 pkt = str( parsed_pkt )
212 self.dataplane.send( in_port, pkt )
213 verify_packet_in( self, pkt, in_port, ofp.OFPR_ACTION )
214 # verify_no_other_packets(self)
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700215 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700216 delete_all_flows( self.controller )
217 delete_groups( self.controller, Groups )
218 delete_all_groups( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -0700219
Flavio Castroa7162bb2016-07-25 17:30:30 -0700220
221class L2FloodQinQ( base_tests.SimpleDataPlane ):
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500222 """
Flavio Castro76c5b262016-07-27 19:53:00 -0700223 Verify Vlan based flooding of QinQ based on its outer vlan
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500224 """
Flavio Castro1c9b1252016-02-04 18:42:58 -0500225
Flavio Castroa7162bb2016-07-25 17:30:30 -0700226 def runTest( self ):
227 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700228 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700229 ports = sorted( config[ "port_map" ].keys( ) )
Saurav Dase94ba572017-04-28 17:47:21 -0700230 vlan_id = 100
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500231
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700232 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700233 L2gid, l2msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
Saurav Das15c2c262017-05-06 18:12:38 -0700234 add_one_vlan_table_flow( self.controller, port, vlan_id=vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castroa7162bb2016-07-25 17:30:30 -0700235 Groups.put( L2gid )
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500236
Flavio Castroa7162bb2016-07-25 17:30:30 -0700237 msg = add_l2_flood_group( self.controller, ports, vlan_id, vlan_id )
238 Groups.put( msg.group_id )
239 add_bridge_flow( self.controller, None, vlan_id, msg.group_id, True )
240 do_barrier( self.controller )
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500241
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700242 # verify flood
243 for ofport in ports:
244 # change dest based on port number
245 mac_src = '00:12:34:56:78:%02X' % ofport
Flavio Castroa7162bb2016-07-25 17:30:30 -0700246 parsed_pkt = simple_tcp_packet_two_vlan( pktlen=108, out_dl_vlan_enable=True,
247 out_vlan_vid=vlan_id, in_dl_vlan_enable=True, in_vlan_vid=10,
248 eth_dst='00:12:34:56:78:9a', eth_src=mac_src )
249 pkt = str( parsed_pkt )
250 self.dataplane.send( ofport, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700251 # self won't rx packet
Flavio Castroa7162bb2016-07-25 17:30:30 -0700252 verify_no_packet( self, pkt, ofport )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700253 # others will rx packet
Flavio Castroa7162bb2016-07-25 17:30:30 -0700254 tmp_ports = list( ports )
255 tmp_ports.remove( ofport )
256 verify_packets( self, pkt, tmp_ports )
Flavio Castro1b5c21d2015-12-08 12:41:56 -0500257
Flavio Castroa7162bb2016-07-25 17:30:30 -0700258 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700259 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700260 delete_all_flows( self.controller )
261 delete_groups( self.controller, Groups )
262 delete_all_groups( self.controller )
263
Flavio Castro1c9b1252016-02-04 18:42:58 -0500264
Saurav Dase94ba572017-04-28 17:47:21 -0700265
Flavio Castroce3bfeb2016-02-04 14:06:55 -0500266@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -0700267class L2FloodTagged( base_tests.SimpleDataPlane ):
Flavio Castro184cefe2015-11-19 20:52:49 -0500268 """
Saurav Das34992182017-04-14 15:59:48 -0700269 currently disabled; fix with try/finally
Flavio Castro184cefe2015-11-19 20:52:49 -0500270 Test L2 flood to a vlan
271 Send a packet with unknown dst_mac and check if the packet is flooded to all ports except inport
Flavio Castro184cefe2015-11-19 20:52:49 -0500272 """
Flavio Castro1c9b1252016-02-04 18:42:58 -0500273
Flavio Castroa7162bb2016-07-25 17:30:30 -0700274 def runTest( self ):
Flavio Castro1c9b1252016-02-04 18:42:58 -0500275 # Hashes Test Name and uses it as id for installing unique groups
Flavio Castroa7162bb2016-07-25 17:30:30 -0700276 vlan_id = abs( hash( inspect.stack( )[ 0 ][ 3 ] ) ) % (256)
Flavio Castroce3bfeb2016-02-04 14:06:55 -0500277 print vlan_id
Flavio Castroaba28ff2016-02-03 16:47:48 -0500278
Flavio Castroa7162bb2016-07-25 17:30:30 -0700279 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro34352e72015-12-07 20:01:51 -0500280
Flavio Castroa7162bb2016-07-25 17:30:30 -0700281 delete_all_flows( self.controller )
282 delete_all_groups( self.controller )
Flavio Castro184cefe2015-11-19 20:52:49 -0500283
Flavio Castro184cefe2015-11-19 20:52:49 -0500284 # Installing flows to avoid packet-in
285 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700286 add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
287 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
288 msg = add_l2_flood_group( self.controller, ports, vlan_id, vlan_id )
289 add_bridge_flow( self.controller, None, vlan_id, msg.group_id, True )
290 do_barrier( self.controller )
Flavio Castro184cefe2015-11-19 20:52:49 -0500291
Flavio Castro1c9b1252016-02-04 18:42:58 -0500292 # verify flood
Flavio Castro184cefe2015-11-19 20:52:49 -0500293 for ofport in ports:
294 # change dest based on port number
Flavio Castroa7162bb2016-07-25 17:30:30 -0700295 pkt = str(
296 simple_tcp_packet( dl_vlan_enable=True, vlan_vid=vlan_id, eth_dst='00:12:34:56:78:9a' ) )
297 self.dataplane.send( ofport, pkt )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500298 # self won't rx packet
Flavio Castroa7162bb2016-07-25 17:30:30 -0700299 verify_no_packet( self, pkt, ofport )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500300 # others will rx packet
Flavio Castroa7162bb2016-07-25 17:30:30 -0700301 tmp_ports = list( ports )
302 tmp_ports.remove( ofport )
303 verify_packets( self, pkt, tmp_ports )
304 verify_no_other_packets( self )
Flavio Castroaabb5792015-11-18 19:03:50 -0500305
Flavio Castro1c9b1252016-02-04 18:42:58 -0500306
Flavio Castroa7162bb2016-07-25 17:30:30 -0700307class L2UnicastTagged( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -0700308 """ Verify Bridging works: match(VID, DST_MAC)> fwd(port) """
Flavio Castro1c9b1252016-02-04 18:42:58 -0500309
Flavio Castroa7162bb2016-07-25 17:30:30 -0700310 def runTest( self ):
Flavio Castrob01d0aa2016-07-20 16:14:48 -0700311
Flavio Castroa7162bb2016-07-25 17:30:30 -0700312 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700313 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700314 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700315 vlan_id = 1;
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700316 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700317 L2gid, l2msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
318 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
319 Groups.put( L2gid )
320 add_bridge_flow( self.controller, [ 0x00, 0x12, 0x34, 0x56, 0x78, port ], vlan_id, L2gid,
321 True )
322 do_barrier( self.controller )
Flavio Castro6efe1862015-11-18 16:28:06 -0500323
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700324 for out_port in ports:
325 # change dest based on port number
326 mac_dst = '00:12:34:56:78:%02X' % out_port
327 for in_port in ports:
328 if in_port == out_port:
329 continue
Flavio Castroa7162bb2016-07-25 17:30:30 -0700330 pkt = str( simple_tcp_packet( dl_vlan_enable=True, vlan_vid=vlan_id, eth_dst=mac_dst ) )
331 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700332 for ofport in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700333 if ofport in [ out_port ]:
334 verify_packet( self, pkt, ofport )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700335 else:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700336 verify_no_packet( self, pkt, ofport )
337 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700338 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700339 delete_all_flows( self.controller )
340 delete_groups( self.controller, Groups )
341 delete_all_groups( self.controller )
Flavio Castro6efe1862015-11-18 16:28:06 -0500342
Flavio Castroa7162bb2016-07-25 17:30:30 -0700343
Saurav Das59fae5e2017-12-07 12:02:02 -0800344class Bridging( base_tests.SimpleDataPlane ):
345 """
346 Verify bridging works including flooding with different vlans
347 ports[0] has vlan 31 untagged
348 ports[1] has vlan 31 untagged (native) and vlan 41 tagged
349 ARP request should be flooded
350 ARP reply should be forwarded by bridging rule
351 Both arp messages should also be copied to controller
352 """
353
354 def runTest( self ):
355 Groupd = Queue.LifoQueue()
356 try:
357 if len( config[ "port_map" ] ) < 2:
358 logging.info( "Port count less than 2, can't run this case" )
359 return
360 ports = sorted( config[ "port_map" ].keys() )
361 vlan_p0_untagged = 31
362 vlan_p1_tagged = 31
363 vlan_p1_native = 41
364
365 #l2 interface groups and table 10 flows
366 L2p0gid, l2msg0 = add_one_l2_interface_group( self.controller, ports[0], vlan_p0_untagged,
367 is_tagged=False, send_barrier=False )
368 add_one_vlan_table_flow( self.controller, ports[0], vlan_id=vlan_p0_untagged, flag=VLAN_TABLE_FLAG_ONLY_BOTH,
369 send_barrier=True)
370 L2p1gid, l2msg1 = add_one_l2_interface_group( self.controller, ports[1], vlan_p1_tagged,
371 is_tagged=True, send_barrier=False )
372 add_one_vlan_table_flow( self.controller, ports[1], vlan_id=vlan_p1_tagged, flag=VLAN_TABLE_FLAG_ONLY_TAG,
373 send_barrier=True)
374 L2p1gid2, l2msg3 = add_one_l2_interface_group( self.controller, ports[1], vlan_p1_native,
375 is_tagged=False, send_barrier=False )
376 add_one_vlan_table_flow( self.controller, ports[1], vlan_id=vlan_p1_native, flag=VLAN_TABLE_FLAG_ONLY_BOTH,
377 send_barrier=True)
378 #flooding groups
379 Floodmsg31 = add_l2_flood_group( self.controller, ports, vlan_p0_untagged, id=0 )
380 Floodmsg41 = add_l2_flood_group( self.controller, [ ports[1] ], vlan_p1_native, id=0 )
381
382 #add bridging flows for flooding groups
383 add_bridge_flow( self.controller, dst_mac=None, vlanid=vlan_p0_untagged, group_id=Floodmsg31.group_id )
384 add_bridge_flow( self.controller, dst_mac=None, vlanid=vlan_p1_native, group_id=Floodmsg41.group_id )
385 do_barrier( self.controller )
386
387 # add bridging flows for dstMac+vlan
388 add_bridge_flow( self.controller, [ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 ], vlan_p0_untagged, L2p0gid, True )
389 add_bridge_flow( self.controller, [ 0x00, 0x66, 0x77, 0x88, 0x99, 0xaa ], vlan_p1_tagged, L2p1gid, True )
390 add_bridge_flow( self.controller, [ 0x00, 0x66, 0x77, 0x88, 0x99, 0xaa ], vlan_p1_native, L2p1gid2, True )
391
392 # add terminationMac flow
393 router_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
394 if config["switch_type"] == "qmx":
395 add_termination_flow( self.controller, 0, 0x0800, router_mac, vlan_p0_untagged )
396 add_termination_flow( self.controller, 0, 0x0800, router_mac, vlan_p1_native )
397 else:
398 add_termination_flow( self.controller, ports[0], 0x0800, router_mac, vlan_p0_untagged )
399 add_termination_flow( self.controller, ports[1], 0x0800, router_mac, vlan_p1_tagged )
400 add_termination_flow( self.controller, ports[1], 0x0800, router_mac, vlan_p1_native )
401
402 # add acl rule for arp
403 match = ofp.match( )
404 match.oxm_list.append( ofp.oxm.eth_type( 0x0806 ) )
405 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
406 ofp.instruction.apply_actions( actions=[
407 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ), ],
408 buffer_id=ofp.OFP_NO_BUFFER, priority=1 )
409 self.controller.message_send( request )
410 do_barrier( self.controller )
411
412 #acl rule for gateway ip
413 match = ofp.match( )
414 match.oxm_list.append( ofp.oxm.eth_type( 0x0800 ) )
415 match.oxm_list.append( ofp.oxm.ipv4_dst( 0xc0a80003 ) )
416 request = ofp.message.flow_add( table_id=60, cookie=42, match=match, instructions=[
417 ofp.instruction.apply_actions( actions=[
418 ofp.action.output( port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER ) ] ),
419 ofp.instruction.clear_actions() ],
420 buffer_id=ofp.OFP_NO_BUFFER, priority=1 )
421 self.controller.message_send( request )
422 do_barrier( self.controller )
423
424 # send ARP request
425 parsed_arp_pkt = simple_arp_packet(pktlen=80,
426 eth_dst='ff:ff:ff:ff:ff:ff',
427 eth_src='00:66:77:88:99:aa',
428 vlan_vid=vlan_p1_tagged,
429 vlan_pcp=0,
430 arp_op=1,
431 ip_snd='192.168.0.2',
432 ip_tgt='192.168.0.1',
433 hw_snd='00:66:77:88:99:aa',
434 hw_tgt='00:00:00:00:00:00')
435 arp_pkt_to_send = str( parsed_arp_pkt )
436 logging.info( "sending arp request to port %d", ports[1] )
437 self.dataplane.send( ports[1], arp_pkt_to_send )
438 verify_packet_in( self, arp_pkt_to_send, ports[1], ofp.OFPR_ACTION )
439 parsed_arp_pkt_untagged = simple_arp_packet(pktlen=76,
440 eth_dst='ff:ff:ff:ff:ff:ff',
441 eth_src='00:66:77:88:99:aa',
442 vlan_vid=0,
443 vlan_pcp=0,
444 arp_op=1,
445 ip_snd='192.168.0.2',
446 ip_tgt='192.168.0.1',
447 hw_snd='00:66:77:88:99:aa',
448 hw_tgt='00:00:00:00:00:00')
449 arp_pkt_dest = str( parsed_arp_pkt_untagged )
450 verify_packet( self, arp_pkt_dest, ports[0] )
451 #verify_no_other_packets( self )
452
453 # send ARP reply
454 parsed_arp_pkt = simple_arp_packet(pktlen=76,
455 eth_dst='00:66:77:88:99:aa',
456 eth_src='00:11:22:33:44:55',
457 vlan_vid=0,
458 vlan_pcp=0,
459 arp_op=2,
460 ip_snd='192.168.0.1',
461 ip_tgt='192.168.0.2',
462 hw_snd='00:11:22:33:44:55',
463 hw_tgt='00:66:77:88:99:aa')
464 arp_pkt_to_send = str( parsed_arp_pkt )
465 logging.info( "sending arp reply to port %d", ports[0] )
466 self.dataplane.send( ports[0], arp_pkt_to_send )
467 verify_packet_in( self, arp_pkt_to_send, ports[0], ofp.OFPR_ACTION )
468 parsed_arp_pkt_tagged = simple_arp_packet(pktlen=80,
469 eth_dst='00:66:77:88:99:aa',
470 eth_src='00:11:22:33:44:55',
471 vlan_vid=vlan_p1_tagged,
472 vlan_pcp=0,
473 arp_op=2,
474 ip_snd='192.168.0.1',
475 ip_tgt='192.168.0.2',
476 hw_snd='00:11:22:33:44:55',
477 hw_tgt='00:66:77:88:99:aa')
478 arp_pkt_dest = str( parsed_arp_pkt_tagged )
479 verify_packet( self, arp_pkt_dest, ports[1] )
480
481 finally:
482 delete_all_flows( self.controller )
483 delete_all_groups( self.controller )
484 print("done")
485
486
487
Flavio Castroa7162bb2016-07-25 17:30:30 -0700488class Mtu1500( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -0700489 """
490 Verifies basic mtu limits
491 """
492
Flavio Castroa7162bb2016-07-25 17:30:30 -0700493 def runTest( self ):
494 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700495 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700496 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700497 vlan_id = 18
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700498 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700499 L2gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
Pier265ad5f2017-02-28 17:46:28 +0100500 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castroa7162bb2016-07-25 17:30:30 -0700501 Groups.put( L2gid )
502 add_bridge_flow( self.controller, [ 0x00, 0x12, 0x34, 0x56, 0x78, port ], vlan_id, L2gid,
503 True )
504 do_barrier( self.controller )
Flavio Castrob6773032015-11-19 22:49:24 -0500505
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700506 for out_port in ports:
507 # change dest based on port number
508 mac_dst = '00:12:34:56:78:%02X' % out_port
509 for in_port in ports:
510 if in_port == out_port:
511 continue
Flavio Castroa7162bb2016-07-25 17:30:30 -0700512 pkt = str( simple_tcp_packet( pktlen=1500, dl_vlan_enable=True, vlan_vid=vlan_id,
513 eth_dst=mac_dst ) )
514 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700515 for ofport in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700516 if ofport in [ out_port ]:
517 verify_packet( self, pkt, ofport )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700518 else:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700519 verify_no_packet( self, pkt, ofport )
520 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700521 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700522 delete_all_flows( self.controller )
523 delete_groups( self.controller, Groups )
524 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -0500525
Flavio Castroa7162bb2016-07-25 17:30:30 -0700526
527class _32UcastTagged( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -0700528 """ Verify /32 IP forwarding to L3 Unicast-> L2Interface"""
Flavio Castro1c9b1252016-02-04 18:42:58 -0500529
Flavio Castroa7162bb2016-07-25 17:30:30 -0700530 def runTest( self ):
531 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700532 try:
533 test_id = 26
Flavio Castroa7162bb2016-07-25 17:30:30 -0700534 if len( config[ "port_map" ] ) < 2:
535 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700536 return
Flavio Castroa7162bb2016-07-25 17:30:30 -0700537 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
538 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700539 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700540 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700541 for port in ports:
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700542 vlan_id = port + test_id
Saurav Dase94ba572017-04-28 17:47:21 -0700543 # add l2 interface group and l3 unicast group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700544 l2gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
545 is_tagged=True, send_barrier=False )
546 dst_mac[ 5 ] = vlan_id
547 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=vlan_id,
548 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700549 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +0100550 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700551 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -0700552 if config["switch_type"] == "qmx":
553 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
554 else:
555 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700556 # add unicast routing flow
557 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700558 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id )
559 Groups.put( l2gid )
560 Groups.put( l3_msg.group_id )
561 do_barrier( self.controller )
Flavio Castrod8f8af22015-12-02 18:19:26 -0500562
Flavio Castroa7162bb2016-07-25 17:30:30 -0700563 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700564 for in_port in ports:
565 mac_src = '00:00:00:22:32:%02X' % (test_id + in_port)
566 ip_src = '192.168.%02d.1' % (test_id + in_port)
567 for out_port in ports:
568 if in_port == out_port:
569 continue
570 ip_dst = '192.168.%02d.1' % (test_id + out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700571 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
572 vlan_vid=(test_id + in_port), eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64,
573 ip_src=ip_src, ip_dst=ip_dst )
574 pkt = str( parsed_pkt )
575 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700576 # build expected packet
577 mac_dst = '00:00:00:22:22:%02X' % (test_id + out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700578 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
579 vlan_vid=(test_id + out_port), eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
580 ip_src=ip_src, ip_dst=ip_dst )
581 pkt = str( exp_pkt )
582 verify_packet( self, pkt, out_port )
583 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700584 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700585 delete_all_flows( self.controller )
586 delete_groups( self.controller, Groups )
587 delete_all_groups( self.controller )
Flavio Castro05d20bc2015-11-16 15:06:14 -0500588
Saurav Das34992182017-04-14 15:59:48 -0700589@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -0700590class _32VPN( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -0700591 """
592 Verify /32 routing rule -> MPLS_VPN_Label -> MPLSInterface -> L2Interface
593 No ECMP group used
594 """
Flavio Castro2262fd42016-02-04 19:03:36 -0500595
Flavio Castroa7162bb2016-07-25 17:30:30 -0700596 def runTest( self ):
597 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700598 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700599 if len( config[ "port_map" ] ) < 2:
600 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700601 return
Flavio Castro2262fd42016-02-04 19:03:36 -0500602
Flavio Castroa7162bb2016-07-25 17:30:30 -0700603 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
604 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700605 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700606 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700607 for port in ports:
608 # add l2 interface group
609 id = port
610 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700611 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, True )
612 dst_mac[ 5 ] = vlan_id
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700613 # add MPLS interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700614 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
615 vlan_id, id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700616 # add MPLS L3 VPN group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700617 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
618 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
619 push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32 )
Flavio Castroa7162bb2016-07-25 17:30:30 -0700620 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700621 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +0100622 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, vrf=2,
Flavio Castroa7162bb2016-07-25 17:30:30 -0700623 flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700624 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -0700625 if config["switch_type"] == "qmx":
626 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
627 else:
628 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700629 # add routing flow
630 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700631 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, mpls_label_gid, vrf=2 )
632 Groups._put( l2_gid )
633 Groups._put( mpls_gid )
634 Groups._put( mpls_label_gid )
635 do_barrier( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500636
Flavio Castroa7162bb2016-07-25 17:30:30 -0700637 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700638 for in_port in ports:
639 ip_src = '192.168.%02d.1' % (in_port)
640 for out_port in ports:
641 if in_port == out_port:
642 continue
643 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700644 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
645 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
646 pkt = str( parsed_pkt )
647 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700648 # build expect packet
649 mac_dst = '00:00:00:22:22:%02X' % (out_port)
650 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700651 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port), ip_ttl=63,
652 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
653 label=[ label ] )
654 pkt = str( exp_pkt )
655 verify_packet( self, pkt, out_port )
656 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700657 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700658 delete_all_flows( self.controller )
659 delete_groups( self.controller, Groups )
660 delete_all_groups( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500661
Saurav Das34992182017-04-14 15:59:48 -0700662@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -0700663class _32EcmpVpn( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -0700664 """
665 Verify /32 routing rule -> L3 ECMP -> MPLS_VPN_Label -> MPLSInterface -> L2Interface
666 """
Flavio Castro2262fd42016-02-04 19:03:36 -0500667
Flavio Castroa7162bb2016-07-25 17:30:30 -0700668 def runTest( self ):
669 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700670 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700671 if len( config[ "port_map" ] ) < 2:
672 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700673 return
Flavio Castro2262fd42016-02-04 19:03:36 -0500674
Flavio Castroa7162bb2016-07-25 17:30:30 -0700675 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
676 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700677 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700678 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700679 for port in ports:
680 # add l2 interface group
681 id = port
682 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700683 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, True )
684 dst_mac[ 5 ] = vlan_id
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700685 # add MPLS interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700686 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
687 vlan_id, id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700688 # add MPLS L3 VPN group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700689 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
690 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
691 push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32 )
692 ecmp_msg = add_l3_ecmp_group( self.controller, vlan_id, [ mpls_label_gid ] )
693 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700694 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +0100695 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, vrf=0,
Flavio Castroa7162bb2016-07-25 17:30:30 -0700696 flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700697 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -0700698 if config["switch_type"] == "qmx":
699 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
700 else:
701 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700702 # add routing flow
703 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700704 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, ecmp_msg.group_id )
705 Groups._put( l2_gid )
706 Groups._put( mpls_gid )
707 Groups._put( mpls_label_gid )
708 Groups._put( ecmp_msg.group_id )
709 do_barrier( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500710
Flavio Castroa7162bb2016-07-25 17:30:30 -0700711 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700712 for in_port in ports:
713 ip_src = '192.168.%02d.1' % (in_port)
714 for out_port in ports:
715 if in_port == out_port:
716 continue
717 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700718 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
719 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
720 pkt = str( parsed_pkt )
721 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700722 # build expect packet
723 mac_dst = '00:00:00:22:22:%02X' % (out_port)
724 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700725 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port), ip_ttl=63,
726 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
727 label=[ label ] )
728 pkt = str( exp_pkt )
729 verify_packet( self, pkt, out_port )
730 verify_no_other_packets( self )
Saurav Das34992182017-04-14 15:59:48 -0700731
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700732 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700733 delete_all_flows( self.controller )
734 delete_groups( self.controller, Groups )
735 delete_all_groups( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500736
Flavio Castroa7162bb2016-07-25 17:30:30 -0700737
Saurav Das34992182017-04-14 15:59:48 -0700738@disabled
739class One_32EcmpVpn( base_tests.SimpleDataPlane ):
740 """
741 Verify /32 routing rule -> L3 ECMP -> MPLS_VPN_Label -> MPLSInterface -> L2Interface
742 in only one direction
743 """
744
745 def runTest( self ):
746 Groups = Queue.LifoQueue( )
747 try:
748 if len( config[ "port_map" ] ) < 2:
749 logging.info( "Port count less than 2, can't run this case" )
750 return
751
752 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
753 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
754 dip = 0xc0a80001
755 ports = config[ "port_map" ].keys( )
756 # add l2 interface group
757 id = ports[1]
Saurav Das1ab6a142017-04-25 14:42:25 -0700758 in_offset = 19
759 out_offset = 20
760 vlan_id = ports[1] + out_offset
Saurav Das34992182017-04-14 15:59:48 -0700761 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, ports[1], vlan_id, True, True )
Saurav Das1ab6a142017-04-25 14:42:25 -0700762 dst_mac[ 5 ] = ports[1]
Saurav Das34992182017-04-14 15:59:48 -0700763 # add MPLS interface group
764 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
765 vlan_id, id )
766 # add MPLS L3 VPN group
767 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
768 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
Saurav Das1ab6a142017-04-25 14:42:25 -0700769 push_mpls_header=True, set_mpls_label=ports[1] + out_offset, set_bos=1, set_ttl=32 )
Saurav Das34992182017-04-14 15:59:48 -0700770 # add ECMP group
771 ecmp_msg = add_l3_ecmp_group( self.controller, vlan_id, [ mpls_label_gid ] )
772 do_barrier( self.controller )
773 # add vlan flow table
Saurav Das1ab6a142017-04-25 14:42:25 -0700774 add_one_vlan_table_flow( self.controller, ports[0], 1, vlan_id=ports[0] + in_offset, vrf=0,
Saurav Das34992182017-04-14 15:59:48 -0700775 flag=VLAN_TABLE_FLAG_ONLY_TAG )
776 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -0700777 if config["switch_type"] == "qmx":
778 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlanid=ports[0] + in_offset )
779 else:
780 add_termination_flow( self.controller, ports[0], 0x0800, intf_src_mac, vlanid=ports[0] + in_offset )
Saurav Das34992182017-04-14 15:59:48 -0700781 # add routing flow
782 dst_ip = dip + (vlan_id << 8)
783 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, ecmp_msg.group_id, send_barrier=True )
784 Groups._put( l2_gid )
785 Groups._put( mpls_gid )
786 Groups._put( mpls_label_gid )
787 Groups._put( ecmp_msg.group_id )
788
789
790 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
791 in_port = ports[0]
792 out_port = ports[1]
793 ip_src = '192.168.%02d.1' % (in_port)
Saurav Das1ab6a142017-04-25 14:42:25 -0700794 ip_dst = '192.168.%02d.1' % (out_port+out_offset)
795 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port + in_offset),
Saurav Das34992182017-04-14 15:59:48 -0700796 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
797 pkt = str( parsed_pkt )
798 self.dataplane.send( in_port, pkt )
799 # build expect packet
800 mac_dst = '00:00:00:22:22:%02X' % (out_port)
Saurav Das1ab6a142017-04-25 14:42:25 -0700801 label = (out_port+out_offset, 0, 1, 32)
802 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port + out_offset), ip_ttl=63,
Saurav Das34992182017-04-14 15:59:48 -0700803 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
Saurav Das1ab6a142017-04-25 14:42:25 -0700804 label=[ label ] )
Saurav Das34992182017-04-14 15:59:48 -0700805 pkt = str( exp_pkt )
806 verify_packet( self, pkt, out_port )
807 #verify_no_other_packets( self )
808
809 finally:
810 delete_all_flows( self.controller )
811 delete_group(self.controller, ecmp_msg.group_id)
812 delete_group(self.controller, mpls_label_gid)
813 delete_group(self.controller, mpls_gid)
814 delete_group(self.controller, l2_gid)
815
816
Flavio Castroa7162bb2016-07-25 17:30:30 -0700817class _32ECMPL3( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -0700818 """
819 Verifies /32 IP routing and ECMP with no label push
820 IP -> L3ECMP -> L3Unicast -> L2Interface
821 """
Flavio Castro2262fd42016-02-04 19:03:36 -0500822
Flavio Castroa7162bb2016-07-25 17:30:30 -0700823 def runTest( self ):
824 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700825 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700826 if len( config[ "port_map" ] ) < 2:
827 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700828 return
Flavio Castro2262fd42016-02-04 19:03:36 -0500829
Flavio Castroa7162bb2016-07-25 17:30:30 -0700830 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
831 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700832 dip = 0xc0a80001
833 # Hashes Test Name and uses it as id for installing unique groups
Flavio Castroa7162bb2016-07-25 17:30:30 -0700834 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700835 for port in ports:
836 vlan_id = port
837 id = port
838 # add l2 interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700839 l2_gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
840 is_tagged=True, send_barrier=False )
841 dst_mac[ 5 ] = vlan_id
842 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=id,
843 src_mac=intf_src_mac, dst_mac=dst_mac )
844 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ l3_msg.group_id ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700845 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +0100846 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700847 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -0700848 if config["switch_type"] == "qmx":
849 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
850 else:
851 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700852 # add unicast routing flow
853 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700854 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, ecmp_msg.group_id )
855 Groups._put( l2_gid )
856 Groups._put( l3_msg.group_id )
857 Groups._put( ecmp_msg.group_id )
858 do_barrier( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500859
Flavio Castroa7162bb2016-07-25 17:30:30 -0700860 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700861 for in_port in ports:
862 mac_src = '00:00:00:22:22:%02X' % in_port
863 ip_src = '192.168.%02d.1' % in_port
864 for out_port in ports:
865 if in_port == out_port:
866 continue
867 ip_dst = '192.168.%02d.1' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700868 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
869 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
870 pkt = str( parsed_pkt )
871 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700872 # build expected packet
873 mac_dst = '00:00:00:22:22:%02X' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700874 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
875 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
876 pkt = str( exp_pkt )
877 verify_packet( self, pkt, out_port )
878 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700879 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700880 delete_all_flows( self.controller )
881 delete_groups( self.controller, Groups )
882 delete_all_groups( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500883
Saurav Das34992182017-04-14 15:59:48 -0700884@disabled
885class One_32ECMPL3( base_tests.SimpleDataPlane ):
886 """
887 Verifies /32 IP routing and ECMP with no label push
888 IP -> L3ECMP -> L3Unicast -> L2Interface
889 in only one direction
890 """
Flavio Castroa7162bb2016-07-25 17:30:30 -0700891
Saurav Das34992182017-04-14 15:59:48 -0700892 def runTest( self ):
893 Groups = Queue.LifoQueue( )
894 try:
895 if len( config[ "port_map" ] ) < 2:
896 logging.info( "Port count less than 2, can't run this case" )
897 return
898
899 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
900 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
901 dip = 0xc0a80001
902 # Hashes Test Name and uses it as id for installing unique groups
903 ports = config[ "port_map" ].keys( )
904 inport = ports[0]
905 outport = ports[1]
Saurav Das1ab6a142017-04-25 14:42:25 -0700906 in_offset = 19
907 out_offset = 20
908 vlan_id = outport + out_offset
Saurav Das34992182017-04-14 15:59:48 -0700909 id = outport
910 # add l2 interface group, l3 unicast and ecmp group for outport
911 l2_gid, msg = add_one_l2_interface_group( self.controller, outport, vlan_id=vlan_id,
912 is_tagged=True, send_barrier=False )
Saurav Das1ab6a142017-04-25 14:42:25 -0700913 dst_mac[ 5 ] = outport
Saurav Das34992182017-04-14 15:59:48 -0700914 l3_msg = add_l3_unicast_group( self.controller, outport, vlanid=vlan_id, id=id,
915 src_mac=intf_src_mac, dst_mac=dst_mac )
916 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ l3_msg.group_id ] )
917 # add vlan flow table
Saurav Das1ab6a142017-04-25 14:42:25 -0700918 add_one_vlan_table_flow( self.controller, of_port=inport, vlan_id=inport+in_offset, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Saurav Das34992182017-04-14 15:59:48 -0700919 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -0700920 if config["switch_type"] == "qmx":
921 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlanid=inport+in_offset )
922 else:
923 add_termination_flow( self.controller, in_port=inport, eth_type=0x0800, dst_mac=intf_src_mac, vlanid=inport+in_offset )
Saurav Das34992182017-04-14 15:59:48 -0700924 # add unicast routing flow
925 dst_ip = dip + (vlan_id << 8)
926 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, ecmp_msg.group_id, send_barrier=True )
927 Groups._put( l2_gid )
928 Groups._put( l3_msg.group_id )
929 Groups._put( ecmp_msg.group_id )
930
931 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
932 mac_src = '00:00:00:22:22:%02X' % inport
933 ip_src = '192.168.%02d.1' % inport
Saurav Das1ab6a142017-04-25 14:42:25 -0700934 ip_dst = '192.168.%02d.1' % (outport+out_offset)
935 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=inport+in_offset,
Saurav Das34992182017-04-14 15:59:48 -0700936 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
937 pkt = str( parsed_pkt )
938 self.dataplane.send( inport, pkt )
939 # build expected packet
940 mac_dst = '00:00:00:22:22:%02X' % outport
Saurav Das1ab6a142017-04-25 14:42:25 -0700941 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=outport+out_offset,
Saurav Das34992182017-04-14 15:59:48 -0700942 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
943 pkt = str( exp_pkt )
944 verify_packet( self, pkt, outport )
945 verify_no_other_packets( self )
946 finally:
947 delete_all_flows( self.controller )
948 delete_groups( self.controller, Groups )
949 delete_all_groups( self.controller )
950
951
952
953
954@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -0700955class _24VPN( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -0700956 """ Verify MPLS IP VPN Initiation from /32 rule without using ECMP """
Flavio Castro2262fd42016-02-04 19:03:36 -0500957
Flavio Castroa7162bb2016-07-25 17:30:30 -0700958 def runTest( self ):
959 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700960 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -0700961 if len( config[ "port_map" ] ) < 2:
962 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700963 return
Flavio Castro2262fd42016-02-04 19:03:36 -0500964
Flavio Castroa7162bb2016-07-25 17:30:30 -0700965 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
966 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700967 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -0700968 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700969 for port in ports:
970 # add l2 interface group
971 id = port
972 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -0700973 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, True )
974 dst_mac[ 5 ] = vlan_id
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700975 # add MPLS interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700976 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
977 vlan_id, id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700978 # add MPLS L3 VPN group
Flavio Castroa7162bb2016-07-25 17:30:30 -0700979 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
980 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
981 push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32 )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700982 # ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
Flavio Castroa7162bb2016-07-25 17:30:30 -0700983 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700984 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +0100985 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, vrf=0,
Flavio Castroa7162bb2016-07-25 17:30:30 -0700986 flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700987 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -0700988 if config["switch_type"] == "qmx":
989 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
990 else:
991 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -0700992 # add routing flow
993 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -0700994 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, mpls_label_gid )
995 Groups._put( l2_gid )
996 Groups._put( mpls_gid )
997 Groups._put( mpls_label_gid )
998 do_barrier( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -0500999
Flavio Castroa7162bb2016-07-25 17:30:30 -07001000 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001001 for in_port in ports:
1002 ip_src = '192.168.%02d.1' % (in_port)
1003 for out_port in ports:
1004 if in_port == out_port:
1005 continue
1006 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001007 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
1008 eth_dst=switch_mac, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
1009 pkt = str( parsed_pkt )
1010 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001011 # build expect packet
1012 mac_dst = '00:00:00:22:22:%02X' % (out_port)
1013 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001014 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port), ip_ttl=63,
1015 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
1016 label=[ label ] )
1017 pkt = str( exp_pkt )
1018 verify_packet( self, pkt, out_port )
1019 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001020 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001021 delete_all_flows( self.controller )
1022 delete_groups( self.controller, Groups )
1023 delete_all_groups( self.controller )
Flavio Castro2262fd42016-02-04 19:03:36 -05001024
Saurav Das34992182017-04-14 15:59:48 -07001025@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -07001026class _24EcmpVpn( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -07001027 """ Verify MPLS IP VPN Initiation from /24 rule using ECMP """
Flavio Castro72a45d52015-12-02 16:37:05 -05001028
Flavio Castroa7162bb2016-07-25 17:30:30 -07001029 def runTest( self ):
1030 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001031 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001032 if len( config[ "port_map" ] ) < 2:
1033 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001034 return
Flavio Castroa7162bb2016-07-25 17:30:30 -07001035 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1036 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001037 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07001038 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001039 for port in ports:
1040 # add l2 interface group
1041 id = port
1042 vlan_id = id
Flavio Castroa7162bb2016-07-25 17:30:30 -07001043 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, True )
1044 dst_mac[ 5 ] = vlan_id
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001045 # add MPLS interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -07001046 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
1047 vlan_id, id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001048 # add MPLS L3 VPN group
Flavio Castroa7162bb2016-07-25 17:30:30 -07001049 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
1050 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
1051 push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32 )
1052 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ mpls_label_gid ] )
1053 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001054 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +01001055 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, vrf=0,
Flavio Castroa7162bb2016-07-25 17:30:30 -07001056 flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001057 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -07001058 if config["switch_type"] == "qmx":
1059 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
1060 else:
1061 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001062 # add routing flow
1063 dst_ip = dip + (vlan_id << 8)
1064 # add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_label_gid, vrf=2)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001065 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id,
1066 vrf=0 )
1067 Groups._put( l2_gid )
1068 Groups._put( mpls_gid )
1069 Groups._put( mpls_label_gid )
1070 Groups._put( ecmp_msg.group_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001071
Flavio Castroa7162bb2016-07-25 17:30:30 -07001072 do_barrier( self.controller )
Flavio Castro80730822015-12-11 15:38:47 -05001073
Flavio Castroa7162bb2016-07-25 17:30:30 -07001074 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001075 for in_port in ports:
1076 mac_src = '00:00:00:22:22:%02X' % (in_port)
1077 ip_src = '192.168.%02d.1' % (in_port)
1078 for out_port in ports:
1079 if in_port == out_port:
1080 continue
1081 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001082 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
1083 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
1084 pkt = str( parsed_pkt )
1085 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001086 # build expect packet
1087 mac_dst = '00:00:00:22:22:%02X' % out_port
1088 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001089 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_port), ip_ttl=63,
1090 ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac,
1091 label=[ label ] )
1092 pkt = str( exp_pkt )
1093 verify_packet( self, pkt, out_port )
1094 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001095 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001096 delete_all_flows( self.controller )
1097 delete_groups( self.controller, Groups )
1098 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001099
Flavio Castroa7162bb2016-07-25 17:30:30 -07001100
1101class FloodGroupMod( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -07001102 """ Modify a referenced flood group """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001103
1104 def runTest( self ):
1105 Groups = Queue.LifoQueue( )
1106 try:
1107 ports = sorted( config[ "port_map" ].keys( ) )
1108 vlan_id = 1
1109
1110 for port in ports:
1111 L2gid, l2msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
1112 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
1113 Groups.put( L2gid )
1114
1115 msg = add_l2_flood_group( self.controller, ports, vlan_id, vlan_id )
1116 Groups.put( msg.group_id )
1117 add_bridge_flow( self.controller, None, vlan_id, msg.group_id, True )
1118 do_barrier( self.controller )
1119 # verify flood
1120 for ofport in ports:
1121 # change dest based on port number
1122 mac_src = '00:12:34:56:78:%02X' % ofport
1123 parsed_pkt = simple_tcp_packet_two_vlan( pktlen=108, out_dl_vlan_enable=True,
1124 out_vlan_vid=vlan_id, in_dl_vlan_enable=True, in_vlan_vid=10,
1125 eth_dst='00:12:34:56:78:9a', eth_src=mac_src )
1126 pkt = str( parsed_pkt )
1127 self.dataplane.send( ofport, pkt )
1128 # self won't rx packet
1129 verify_no_packet( self, pkt, ofport )
1130 # others will rx packet
1131 tmp_ports = list( ports )
1132 tmp_ports.remove( ofport )
1133 verify_packets( self, pkt, tmp_ports )
1134 verify_no_other_packets( self )
1135 msg = mod_l2_flood_group( self.controller, [ ports[ 0 ] ], vlan_id, vlan_id )
1136 mac_src = '00:12:34:56:78:%02X' % ports[ 1 ]
1137 parsed_pkt = simple_tcp_packet_two_vlan( pktlen=108, out_dl_vlan_enable=True,
1138 out_vlan_vid=vlan_id, in_dl_vlan_enable=True, in_vlan_vid=10, eth_dst='00:12:34:56:78:9a',
1139 eth_src=mac_src )
1140 pkt = str( parsed_pkt )
1141 self.dataplane.send( ports[ 1 ], pkt )
1142 verify_packets( self, pkt, [ ports[ 0 ] ] )
1143 finally:
1144 delete_all_flows( self.controller )
1145 delete_groups( self.controller, Groups )
1146 delete_all_groups( self.controller )
1147
1148
1149class _24ECMPL3( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -07001150 """ Verifies /24 IP routing using ECMP -> L3U -> L2I """
Flavio Castro80730822015-12-11 15:38:47 -05001151
Flavio Castroa7162bb2016-07-25 17:30:30 -07001152 def runTest( self ):
1153 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001154 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001155 if len( config[ "port_map" ] ) < 2:
1156 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001157 return
Flavio Castro80730822015-12-11 15:38:47 -05001158
Flavio Castroa7162bb2016-07-25 17:30:30 -07001159 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1160 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001161 dip = 0xc0a80001
1162 # Hashes Test Name and uses it as id for installing unique groups
Flavio Castroa7162bb2016-07-25 17:30:30 -07001163 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001164 for port in ports:
1165 vlan_id = port
1166 id = port
1167 # add l2 interface group
Flavio Castroa7162bb2016-07-25 17:30:30 -07001168 l2_gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
1169 is_tagged=True, send_barrier=False )
1170 dst_mac[ 5 ] = vlan_id
1171 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=id,
1172 src_mac=intf_src_mac, dst_mac=dst_mac )
1173 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ l3_msg.group_id ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001174 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +01001175 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001176 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -07001177 if config["switch_type"] == "qmx":
1178 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
1179 else:
1180 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001181 # add unicast routing flow
1182 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001183 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id )
1184 Groups._put( l2_gid )
1185 Groups._put( l3_msg.group_id )
1186 Groups._put( ecmp_msg.group_id )
1187 do_barrier( self.controller )
Flavio Castro72a45d52015-12-02 16:37:05 -05001188
Flavio Castroa7162bb2016-07-25 17:30:30 -07001189 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001190 for in_port in ports:
1191 mac_src = '00:00:00:22:22:%02X' % in_port
1192 ip_src = '192.168.%02d.1' % in_port
1193 for out_port in ports:
1194 if in_port == out_port:
1195 continue
1196 ip_dst = '192.168.%02d.1' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001197 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
1198 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
1199 pkt = str( parsed_pkt )
1200 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001201 # build expected packet
1202 mac_dst = '00:00:00:22:22:%02X' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001203 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
1204 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
1205 pkt = str( exp_pkt )
1206 verify_packet( self, pkt, out_port )
1207 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001208 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001209 delete_all_flows( self.controller )
1210 delete_groups( self.controller, Groups )
1211 delete_all_groups( self.controller )
1212
Flavio Castro1c9b1252016-02-04 18:42:58 -05001213
Flavio Castroaba28ff2016-02-03 16:47:48 -05001214@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -07001215class MPLSBUG( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -07001216 """
1217 Needs a description or needs to be removed
1218 """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001219 def runTest( self ):
1220 if len( config[ "port_map" ] ) < 2:
1221 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro80730822015-12-11 15:38:47 -05001222 return
Flavio Castroa7162bb2016-07-25 17:30:30 -07001223 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1224 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro1c9b1252016-02-04 18:42:58 -05001225 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07001226 Groups = Queue.LifoQueue( )
1227 ports = config[ "port_map" ].keys( )
Flavio Castro80730822015-12-11 15:38:47 -05001228 for port in ports:
Flavio Castro1c9b1252016-02-04 18:42:58 -05001229 # add l2 interface group
1230 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001231 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
1232 dst_mac[ 5 ] = vlan_id
Flavio Castro1c9b1252016-02-04 18:42:58 -05001233 # add L3 Unicast group
Flavio Castroa7162bb2016-07-25 17:30:30 -07001234 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=vlan_id,
1235 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001236 # add vlan flow table
Flavio Castroa7162bb2016-07-25 17:30:30 -07001237 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_BOTH )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001238 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -07001239 if config["switch_type"] == "qmx":
1240 add_termination_flow( self.controller, 0, 0x08847, intf_src_mac, vlan_id, goto_table=24 )
1241 else:
1242 add_termination_flow( self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24 )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001243 # add mpls flow
Flavio Castroa7162bb2016-07-25 17:30:30 -07001244 add_mpls_flow( self.controller, l3_msg.group_id, port )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001245 # add termination flow
Flavio Castroa7162bb2016-07-25 17:30:30 -07001246 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001247 # add unicast routing flow
1248 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001249 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id )
1250 Groups._put( l2_gid )
1251 Groups._put( l3_msg.group_id )
1252 do_barrier( self.controller )
Flavio Castro80730822015-12-11 15:38:47 -05001253
Flavio Castroa7162bb2016-07-25 17:30:30 -07001254 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro80730822015-12-11 15:38:47 -05001255 for in_port in ports:
Flavio Castro1c9b1252016-02-04 18:42:58 -05001256 mac_src = '00:00:00:22:22:%02X' % in_port
1257 ip_src = '192.168.%02d.1' % in_port
Flavio Castro80730822015-12-11 15:38:47 -05001258 for out_port in ports:
1259 if in_port == out_port:
Flavio Castro1c9b1252016-02-04 18:42:58 -05001260 continue
1261 ip_dst = '192.168.%02d.1' % out_port
Flavio Castro80730822015-12-11 15:38:47 -05001262 switch_mac = "00:00:00:cc:cc:cc"
1263 label = (out_port, 0, 1, 32)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001264 parsed_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=in_port, ip_src=ip_src,
1265 ip_dst=ip_dst, eth_dst=switch_mac, eth_src=mac_src, label=[ label ] )
1266 pkt = str( parsed_pkt )
1267 self.dataplane.send( in_port, pkt )
Flavio Castro80730822015-12-11 15:38:47 -05001268
Flavio Castro1c9b1252016-02-04 18:42:58 -05001269 # build expect packet
1270 mac_dst = '00:00:00:22:22:%02X' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001271 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
1272 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst )
1273 pkt = str( exp_pkt )
1274 verify_packet( self, pkt, out_port )
1275 verify_no_other_packets( self )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001276
Flavio Castroa7162bb2016-07-25 17:30:30 -07001277 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
1278 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
1279 pkt = str( parsed_pkt )
1280 self.dataplane.send( in_port, pkt )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001281 # build expected packet
1282 mac_dst = '00:00:00:22:22:%02X' % out_port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001283 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
1284 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
1285 pkt = str( exp_pkt )
1286 verify_packet( self, pkt, out_port )
1287 verify_no_other_packets( self )
1288 delete_all_flows( self.controller )
1289 delete_groups( self.controller, Groups )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001290
Flavio Castroa7162bb2016-07-25 17:30:30 -07001291class L3McastToL3( base_tests.SimpleDataPlane ):
Pierbbdf3782016-08-22 17:58:26 -07001292 """
1293 Mcast routing, in this test case the traffic comes in tagged.
1294 port+1 is used as ingress vlan_id. The packet goes out tagged on
1295 different ports. 4094-port is used as egress vlan_id.
1296 """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001297 def runTest( self ):
Pier7b031af2016-08-25 15:00:22 -07001298 """
1299 port1 (vlan 300)-> All Ports (vlan 300)
1300 """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001301 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001302 try:
Pierbbdf3782016-08-22 17:58:26 -07001303 # We can forward on the in_port but egress_vlan has to be different from ingress_vlan
1304 if len( config[ "port_map" ] ) < 1:
1305 logging.info( "Port count less than 1, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001306 assert (False)
1307 return
Pierbbdf3782016-08-22 17:58:26 -07001308 ports = config[ "port_map" ].keys( )
1309 dst_ip_str = "224.0.0.1"
1310 (
1311 port_to_in_vlan,
1312 port_to_out_vlan,
1313 port_to_src_mac_str,
1314 port_to_dst_mac_str,
Andrea Campanella0ea96322018-04-19 19:11:49 +02001315 port_to_src_ip,
Pierbbdf3782016-08-22 17:58:26 -07001316 port_to_src_ip_str,
1317 port_to_intf_src_mac_str,
1318 Groups) = fill_mcast_pipeline_L3toL3(
1319 self.controller,
1320 logging,
1321 ports,
1322 is_ingress_tagged = True,
1323 is_egress_tagged = True,
1324 is_vlan_translated = True,
1325 is_max_vlan = False
1326 )
Flavio Castro12296312015-12-15 17:48:26 -05001327
Pierbbdf3782016-08-22 17:58:26 -07001328 for in_port in ports:
Flavio Castro12296312015-12-15 17:48:26 -05001329
Pierbbdf3782016-08-22 17:58:26 -07001330 parsed_pkt = simple_udp_packet(
1331 pktlen = 100,
1332 dl_vlan_enable = True,
1333 vlan_vid = port_to_in_vlan[in_port],
1334 eth_dst = port_to_dst_mac_str[in_port],
1335 eth_src = port_to_src_mac_str[in_port],
1336 ip_ttl = 64,
1337 ip_src = port_to_src_ip_str[in_port],
1338 ip_dst = dst_ip_str
1339 )
1340 pkt = str( parsed_pkt )
1341 self.dataplane.send( in_port, pkt )
Flavio Castro12296312015-12-15 17:48:26 -05001342
Pierbbdf3782016-08-22 17:58:26 -07001343 for out_port in ports:
Flavio Castro12296312015-12-15 17:48:26 -05001344
Pierbbdf3782016-08-22 17:58:26 -07001345 parsed_pkt = simple_udp_packet(
1346 pktlen = 100,
1347 dl_vlan_enable = True,
1348 vlan_vid = port_to_out_vlan[out_port],
1349 eth_dst = port_to_dst_mac_str[in_port],
1350 eth_src = port_to_intf_src_mac_str[out_port],
1351 ip_ttl = 63,
1352 ip_src = port_to_src_ip_str[in_port],
1353 ip_dst = dst_ip_str
1354 )
1355 pkt = str( parsed_pkt )
1356 verify_packet( self, pkt, out_port )
Flavio Castro1c9b1252016-02-04 18:42:58 -05001357
Pierbbdf3782016-08-22 17:58:26 -07001358 verify_no_other_packets( self )
1359
Pier7b031af2016-08-25 15:00:22 -07001360 finally:
1361 delete_all_flows( self.controller )
1362 delete_groups( self.controller, Groups )
1363 delete_all_groups( self.controller )
1364
1365class L3McastToL2UntagToUntag( base_tests.SimpleDataPlane ):
1366 """
1367 Mcast routing, in this test case the traffic is untagged.
1368 4094 is used as internal vlan_id. The packet goes out
1369 untagged.
1370 """
1371 def runTest( self ):
1372 Groups = Queue.LifoQueue( )
1373 try:
1374 if len( config[ "port_map" ] ) < 2:
1375 logging.info( "Port count less than 2, can't run this case" )
1376 assert (False)
1377 return
1378 ports = config[ "port_map" ].keys( )
1379 dst_ip_str = "224.0.0.1"
1380 (
1381 port_to_in_vlan,
1382 port_to_out_vlan,
1383 port_to_src_mac_str,
1384 port_to_dst_mac_str,
Andrea Campanella0ea96322018-04-19 19:11:49 +02001385 port_to_src_ip,
Pier7b031af2016-08-25 15:00:22 -07001386 port_to_src_ip_str,
1387 Groups) = fill_mcast_pipeline_L3toL2(
1388 self.controller,
1389 logging,
1390 ports,
1391 is_ingress_tagged = False,
1392 is_egress_tagged = False,
1393 is_vlan_translated = False,
1394 is_max_vlan = True
1395 )
1396
1397 for in_port in ports:
1398
1399 parsed_pkt = simple_udp_packet(
1400 pktlen = 96,
1401 eth_dst = port_to_dst_mac_str[in_port],
1402 eth_src = port_to_src_mac_str[in_port],
1403 ip_ttl = 64,
1404 ip_src = port_to_src_ip_str[in_port],
1405 ip_dst = dst_ip_str
1406 )
1407 pkt = str( parsed_pkt )
1408 self.dataplane.send( in_port, pkt )
1409
1410 for out_port in ports:
1411
1412 parsed_pkt = simple_udp_packet(
1413 pktlen = 96,
1414 eth_dst = port_to_dst_mac_str[in_port],
1415 eth_src = port_to_src_mac_str[in_port],
1416 ip_ttl = 64,
1417 ip_src = port_to_src_ip_str[in_port],
1418 ip_dst = dst_ip_str
1419 )
1420 pkt = str( parsed_pkt )
1421 if out_port == in_port:
1422 verify_no_packet( self, pkt, in_port )
1423 continue
1424 verify_packet( self, pkt, out_port )
1425 verify_no_other_packets( self )
1426 finally:
1427 delete_all_flows( self.controller )
1428 delete_groups( self.controller, Groups )
1429 delete_all_groups( self.controller )
1430
1431class L3McastToL2UntagToTag( base_tests.SimpleDataPlane ):
1432 """
1433 Mcast routing, in this test case the traffic is untagged.
1434 300 is used as vlan_id. The packet goes out
1435 tagged.
1436 """
1437 def runTest( self ):
1438 Groups = Queue.LifoQueue( )
1439 try:
1440 if len( config[ "port_map" ] ) < 2:
1441 logging.info( "Port count less than 2, can't run this case" )
1442 assert (False)
1443 return
1444 ports = config[ "port_map" ].keys( )
1445 dst_ip_str = "224.0.0.1"
1446 (
1447 port_to_in_vlan,
1448 port_to_out_vlan,
1449 port_to_src_mac_str,
1450 port_to_dst_mac_str,
Andrea Campanella0ea96322018-04-19 19:11:49 +02001451 port_to_src_ip,
Pier7b031af2016-08-25 15:00:22 -07001452 port_to_src_ip_str,
1453 Groups) = fill_mcast_pipeline_L3toL2(
1454 self.controller,
1455 logging,
1456 ports,
1457 is_ingress_tagged = False,
1458 is_egress_tagged = True,
1459 is_vlan_translated = False,
1460 is_max_vlan = False
1461 )
1462
1463 for in_port in ports:
1464
1465 parsed_pkt = simple_udp_packet(
1466 pktlen = 96,
1467 eth_dst = port_to_dst_mac_str[in_port],
1468 eth_src = port_to_src_mac_str[in_port],
1469 ip_ttl = 64,
1470 ip_src = port_to_src_ip_str[in_port],
1471 ip_dst = dst_ip_str
1472 )
1473 pkt = str( parsed_pkt )
1474 self.dataplane.send( in_port, pkt )
1475
1476 for out_port in ports:
1477
1478 parsed_pkt = simple_udp_packet(
1479 pktlen = 100,
1480 dl_vlan_enable = True,
1481 vlan_vid = port_to_out_vlan[in_port],
1482 eth_dst = port_to_dst_mac_str[in_port],
1483 eth_src = port_to_src_mac_str[in_port],
1484 ip_ttl = 64,
1485 ip_src = port_to_src_ip_str[in_port],
1486 ip_dst = dst_ip_str
1487 )
1488 pkt = str( parsed_pkt )
1489 if out_port == in_port:
1490 verify_no_packet( self, pkt, in_port )
1491 continue
1492 verify_packet( self, pkt, out_port )
1493 verify_no_other_packets( self )
1494 finally:
1495 delete_all_flows( self.controller )
1496 delete_groups( self.controller, Groups )
1497 delete_all_groups( self.controller )
1498
1499
1500class L3McastToL2TagToUntag( base_tests.SimpleDataPlane ):
1501 """
1502 Mcast routing, in this test case the traffic is tagged.
1503 300 is used as vlan_id. The packet goes out
1504 untagged.
1505 """
1506 def runTest( self ):
1507 Groups = Queue.LifoQueue( )
1508 try:
1509 if len( config[ "port_map" ] ) < 2:
1510 logging.info( "Port count less than 2, can't run this case" )
1511 assert (False)
1512 return
1513 ports = config[ "port_map" ].keys( )
1514 dst_ip_str = "224.0.0.1"
1515 (
1516 port_to_in_vlan,
1517 port_to_out_vlan,
1518 port_to_src_mac_str,
1519 port_to_dst_mac_str,
Andrea Campanella0ea96322018-04-19 19:11:49 +02001520 port_to_src_ip,
Pier7b031af2016-08-25 15:00:22 -07001521 port_to_src_ip_str,
1522 Groups) = fill_mcast_pipeline_L3toL2(
1523 self.controller,
1524 logging,
1525 ports,
1526 is_ingress_tagged = True,
1527 is_egress_tagged = False,
1528 is_vlan_translated = False,
1529 is_max_vlan = False
1530 )
1531
1532 for in_port in ports:
1533
1534 parsed_pkt = simple_udp_packet(
1535 pktlen = 100,
1536 dl_vlan_enable = True,
1537 vlan_vid = port_to_in_vlan[in_port],
1538 eth_dst = port_to_dst_mac_str[in_port],
1539 eth_src = port_to_src_mac_str[in_port],
1540 ip_ttl = 64,
1541 ip_src = port_to_src_ip_str[in_port],
1542 ip_dst = dst_ip_str
1543 )
1544 pkt = str( parsed_pkt )
1545 self.dataplane.send( in_port, pkt )
1546
1547 for out_port in ports:
1548
1549 parsed_pkt = simple_udp_packet(
1550 pktlen = 96,
1551 eth_dst = port_to_dst_mac_str[in_port],
1552 eth_src = port_to_src_mac_str[in_port],
1553 ip_ttl = 64,
1554 ip_src = port_to_src_ip_str[in_port],
1555 ip_dst = dst_ip_str
1556 )
1557 pkt = str( parsed_pkt )
1558 if out_port == in_port:
1559 verify_no_packet( self, pkt, in_port )
1560 continue
1561 verify_packet( self, pkt, out_port )
1562 verify_no_other_packets( self )
1563 finally:
1564 delete_all_flows( self.controller )
1565 delete_groups( self.controller, Groups )
1566 delete_all_groups( self.controller )
1567
1568class L3McastToL2TagToTag( base_tests.SimpleDataPlane ):
1569 """
1570 Mcast routing, in this test case the traffic is tagged.
1571 300 is used as vlan_id. The packet goes out tagged.
1572 """
1573 def runTest( self ):
1574 Groups = Queue.LifoQueue( )
1575 try:
1576 if len( config[ "port_map" ] ) < 2:
1577 logging.info( "Port count less than 2, can't run this case" )
1578 assert (False)
1579 return
1580 ports = config[ "port_map" ].keys( )
1581 dst_ip_str = "224.0.0.1"
1582 (
1583 port_to_in_vlan,
1584 port_to_out_vlan,
1585 port_to_src_mac_str,
1586 port_to_dst_mac_str,
Andrea Campanella0ea96322018-04-19 19:11:49 +02001587 port_to_src_ip,
Pier7b031af2016-08-25 15:00:22 -07001588 port_to_src_ip_str,
1589 Groups) = fill_mcast_pipeline_L3toL2(
1590 self.controller,
1591 logging,
1592 ports,
1593 is_ingress_tagged = True,
1594 is_egress_tagged = True,
1595 is_vlan_translated = False,
1596 is_max_vlan = False
1597 )
1598
1599 for in_port in ports:
1600
1601 parsed_pkt = simple_udp_packet(
1602 pktlen = 100,
1603 dl_vlan_enable = True,
1604 vlan_vid = port_to_in_vlan[in_port],
1605 eth_dst = port_to_dst_mac_str[in_port],
1606 eth_src = port_to_src_mac_str[in_port],
1607 ip_ttl = 64,
1608 ip_src = port_to_src_ip_str[in_port],
1609 ip_dst = dst_ip_str
1610 )
1611 pkt = str( parsed_pkt )
1612 self.dataplane.send( in_port, pkt )
1613
1614 for out_port in ports:
1615
1616 parsed_pkt = simple_udp_packet(
1617 pktlen = 100,
1618 dl_vlan_enable = True,
1619 vlan_vid = port_to_in_vlan[in_port],
1620 eth_dst = port_to_dst_mac_str[in_port],
1621 eth_src = port_to_src_mac_str[in_port],
1622 ip_ttl = 64,
1623 ip_src = port_to_src_ip_str[in_port],
1624 ip_dst = dst_ip_str
1625 )
1626 pkt = str( parsed_pkt )
1627 if out_port == in_port:
1628 verify_no_packet( self, pkt, in_port )
1629 continue
1630 verify_packet( self, pkt, out_port )
1631 verify_no_other_packets( self )
1632 finally:
1633 delete_all_flows( self.controller )
1634 delete_groups( self.controller, Groups )
1635 delete_all_groups( self.controller )
1636
1637class L3McastToL2TagToTagTranslated( base_tests.SimpleDataPlane ):
1638 """
1639 Mcast routing, in this test case the traffic is tagged.
1640 port+1 is used as ingress vlan_id. The packet goes out
1641 tagged. 4094-port is used as egress vlan_id
1642 """
1643 def runTest( self ):
1644 Groups = Queue.LifoQueue( )
1645 try:
1646 if len( config[ "port_map" ] ) < 2:
1647 logging.info( "Port count less than 2, can't run this case" )
1648 assert (False)
1649 return
1650 ports = config[ "port_map" ].keys( )
1651 dst_ip_str = "224.0.0.1"
1652 (
1653 port_to_in_vlan,
1654 port_to_out_vlan,
1655 port_to_src_mac_str,
1656 port_to_dst_mac_str,
Andrea Campanella0ea96322018-04-19 19:11:49 +02001657 port_to_src_ip,
Pier7b031af2016-08-25 15:00:22 -07001658 port_to_src_ip_str,
1659 Groups) = fill_mcast_pipeline_L3toL2(
1660 self.controller,
1661 logging,
1662 ports,
1663 is_ingress_tagged = True,
1664 is_egress_tagged = True,
1665 is_vlan_translated = True,
1666 is_max_vlan = False
1667 )
1668
1669 for in_port in ports:
1670
1671 parsed_pkt = simple_udp_packet(
1672 pktlen = 100,
1673 dl_vlan_enable = True,
1674 vlan_vid = port_to_in_vlan[in_port],
1675 eth_dst = port_to_dst_mac_str[in_port],
1676 eth_src = port_to_src_mac_str[in_port],
1677 ip_ttl = 64,
1678 ip_src = port_to_src_ip_str[in_port],
1679 ip_dst = dst_ip_str
1680 )
1681 pkt = str( parsed_pkt )
1682 self.dataplane.send( in_port, pkt )
1683
1684 for out_port in ports:
1685
1686 parsed_pkt = simple_udp_packet(
1687 pktlen = 100,
1688 dl_vlan_enable = True,
1689 vlan_vid = port_to_out_vlan[in_port],
1690 eth_dst = port_to_dst_mac_str[in_port],
1691 eth_src = port_to_src_mac_str[in_port],
1692 ip_ttl = 64,
1693 ip_src = port_to_src_ip_str[in_port],
1694 ip_dst = dst_ip_str
1695 )
1696 pkt = str( parsed_pkt )
1697 if out_port == in_port:
1698 verify_no_packet( self, pkt, in_port )
1699 continue
1700 verify_packet( self, pkt, out_port )
1701 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001702 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001703 delete_all_flows( self.controller )
1704 delete_groups( self.controller, Groups )
1705 delete_all_groups( self.controller )
1706
Andrea Campanella0ea96322018-04-19 19:11:49 +02001707class L3McastTrafficThenDrop( base_tests.SimpleDataPlane ):
1708 """
1709 Mcast routing, in this test case the traffic is untagged.
1710 4094 is used as internal vlan_id. We first install aa full pipeline,
1711 test that it forwards properly then remove all rules on table 40 and
1712 mcast groups and ensure traffic is dropped. Blackhole of mcast traffic
1713 if no tree is programmed on the switch.
1714 """
1715 def runTest( self ):
1716 Groups = Queue.LifoQueue( )
1717 try:
1718 if len( config[ "port_map" ] ) < 2:
1719 logging.info( "Port count less than 2, can't run this case" )
1720 assert (False)
1721 return
1722 ports = config[ "port_map" ].keys( )
1723 dst_ip_str = "224.0.0.1"
1724 (
1725 port_to_in_vlan,
1726 port_to_out_vlan,
1727 port_to_src_mac_str,
1728 port_to_dst_mac_str,
1729 port_to_src_ip,
1730 port_to_src_ip_str,
1731 Groups) = fill_mcast_pipeline_L3toL2(
1732 self.controller,
1733 logging,
1734 ports,
1735 is_ingress_tagged = False,
1736 is_egress_tagged = False,
1737 is_vlan_translated = False,
1738 is_max_vlan = True
1739 )
1740
1741 for in_port in ports:
1742
1743 parsed_pkt = simple_udp_packet(
1744 pktlen = 96,
1745 eth_dst = port_to_dst_mac_str[in_port],
1746 eth_src = port_to_src_mac_str[in_port],
1747 ip_ttl = 64,
1748 ip_src = port_to_src_ip_str[in_port],
1749 ip_dst = dst_ip_str
1750 )
1751 pkt = str( parsed_pkt )
1752 self.dataplane.send( in_port, pkt )
1753
1754 for out_port in ports:
1755
1756 parsed_pkt = simple_udp_packet(
1757 pktlen = 96,
1758 eth_dst = port_to_dst_mac_str[in_port],
1759 eth_src = port_to_src_mac_str[in_port],
1760 ip_ttl = 64,
1761 ip_src = port_to_src_ip_str[in_port],
1762 ip_dst = dst_ip_str
1763 )
1764 pkt = str( parsed_pkt )
1765 if out_port == in_port:
1766 verify_no_packet( self, pkt, in_port )
1767 continue
1768 verify_packet( self, pkt, out_port )
1769 verify_no_other_packets( self )
1770
1771 delete_all_flows_one_table(ctrl=self.controller, logger=logging, table_id=40);
1772 delete_all_groups(self.controller)
1773
1774 for in_port in ports:
1775
1776 parsed_pkt = simple_udp_packet(
1777 pktlen = 96,
1778 eth_dst = port_to_dst_mac_str[in_port],
1779 eth_src = port_to_src_mac_str[in_port],
1780 ip_ttl = 64,
1781 ip_src = port_to_src_ip_str[in_port],
1782 ip_dst = dst_ip_str
1783 )
1784 pkt = str( parsed_pkt )
1785 self.dataplane.send( in_port, pkt )
1786
1787 for out_port in ports:
1788
1789 parsed_pkt = simple_udp_packet(
1790 pktlen = 96,
1791 eth_dst = port_to_dst_mac_str[in_port],
1792 eth_src = port_to_src_mac_str[in_port],
1793 ip_ttl = 64,
1794 ip_src = port_to_src_ip_str[in_port],
1795 ip_dst = dst_ip_str
1796 )
1797 pkt = str( parsed_pkt )
1798 if out_port == in_port:
1799 verify_no_packet( self, pkt, in_port )
1800 continue
1801 verify_no_packet( self, pkt, out_port )
1802 verify_no_other_packets( self )
1803 finally:
1804 delete_all_flows( self.controller )
1805 delete_groups( self.controller, Groups )
1806 delete_all_groups( self.controller )
1807
Saurav Das34992182017-04-14 15:59:48 -07001808@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -07001809class _MplsFwd( base_tests.SimpleDataPlane ):
Saurav Das34992182017-04-14 15:59:48 -07001810 """ Verify basic MPLS forwarding: Label switch router """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001811
1812 def runTest( self ):
1813 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001814 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001815 if len( config[ "port_map" ] ) < 2:
1816 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001817 return
1818 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07001819 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1820 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001821 # Assigns unique hardcoded test_id to make sure tests don't overlap when writing rules
Flavio Castroa7162bb2016-07-25 17:30:30 -07001822 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001823 for port in ports:
Charles Chan53cac542016-08-22 16:03:26 -07001824 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1825 vlan_id = port + 16
1826 mpls_label = port + 16
1827
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001828 # add l2 interface group
1829 id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001830 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
Charles Chan53cac542016-08-22 16:03:26 -07001831 dst_mac[ 5 ] = port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001832 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
1833 vlan_id, id )
1834 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
1835 subtype=OFDPA_MPLS_GROUP_SUBTYPE_SWAP_LABEL, index=id, ref_gid=mpls_gid,
Charles Chan53cac542016-08-22 16:03:26 -07001836 push_mpls_header=False, set_mpls_label=mpls_label, set_bos=1 )
Saurav Das34992182017-04-14 15:59:48 -07001837 #ecmp_gid, ecmp_msg = add_mpls_forwarding_group( self.controller,
1838 # subtype=OFDPA_MPLS_GROUP_SUBTYPE_ECMP, index=id, ref_gids=[mpls_label_gid] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001839 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +01001840 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001841 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -07001842 if config["switch_type"] == "qmx":
1843 add_termination_flow( self.controller, 0, 0x8847, intf_src_mac, vlan_id, goto_table=24 )
1844 else:
1845 add_termination_flow( self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24 )
Flavio Castro9debaaa2016-07-26 19:37:50 -07001846 #add_mpls_flow( self.controller, ecmp_gid, port, goto_table=29 )
Alex Yashchuk9f449462017-12-09 18:27:19 +02001847 if config["switch_type"] != 'xpliant':
1848 add_mpls_flow( self.controller, mpls_label_gid, mpls_label, goto_table=29 )
1849 else:
1850 xpliant_add_mpls_flow( self.controller, mpls_label_gid, mpls_label, goto_table=29 )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001851 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001852 Groups._put( l2_gid )
1853 Groups._put( mpls_gid )
1854 Groups._put( mpls_label_gid )
Saurav Das34992182017-04-14 15:59:48 -07001855 #Groups._put( ecmp_gid )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001856 do_barrier( self.controller )
castroflavio30c6cc52016-01-07 15:19:42 -08001857
Flavio Castroa7162bb2016-07-25 17:30:30 -07001858 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001859 for in_port in ports:
1860 ip_src = '192.168.%02d.1' % (in_port)
1861 for out_port in ports:
1862 if in_port == out_port:
1863 continue
Flavio Castro54947942016-02-03 16:05:20 -05001864
Charles Chan53cac542016-08-22 16:03:26 -07001865 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1866 out_mpls_label = out_port + 16
1867 in_vlan_vid = in_port + 16
1868 out_vlan_vid = out_port + 16
1869
1870 ip_dst = '192.168.%02d.1' % (out_port)
1871 label = (out_mpls_label, 0, 1, 32)
1872 parsed_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(in_vlan_vid),
Flavio Castroa7162bb2016-07-25 17:30:30 -07001873 ip_src=ip_src, ip_dst=ip_dst, eth_dst=switch_mac, label=[ label ] )
1874 pkt = str( parsed_pkt )
1875 self.dataplane.send( in_port, pkt )
Flavio Castro54947942016-02-03 16:05:20 -05001876
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001877 # build expect packet
1878 mac_dst = '00:00:00:22:22:%02X' % (out_port)
Charles Chan53cac542016-08-22 16:03:26 -07001879 label = (out_mpls_label, 0, 1, 31)
1880 exp_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(out_vlan_vid),
Flavio Castroa7162bb2016-07-25 17:30:30 -07001881 ip_src=ip_src, ip_dst=ip_dst, eth_src=switch_mac, eth_dst=mac_dst,
1882 label=[ label ] )
1883 pkt = str( exp_pkt )
1884 verify_packet( self, pkt, out_port )
1885 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001886 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001887 delete_all_flows( self.controller )
1888 delete_groups( self.controller, Groups )
1889 delete_all_groups( self.controller )
Flavio Castrob702a2f2016-04-10 22:01:48 -04001890
Saurav Das34992182017-04-14 15:59:48 -07001891@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -07001892class _MplsTermination( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -07001893 """ Verify MPLS VPN Termination at penultimate hop """
Flavio Castroa7162bb2016-07-25 17:30:30 -07001894
1895 def runTest( self ):
1896 Groups = Queue.LifoQueue( )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001897 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001898 if len( config[ "port_map" ] ) < 2:
1899 logging.info( "Port count less than 2, can't run this case" )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001900 return
1901 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07001902 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1903 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castrod80fbc32016-07-25 15:54:26 -07001904 # Assigns unique hardcoded test_id to make sure tests don't overlap when writing rules
Flavio Castroa7162bb2016-07-25 17:30:30 -07001905 ports = config[ "port_map" ].keys( )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001906 for port in ports:
Charles Chan53cac542016-08-22 16:03:26 -07001907 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1908 vlan_id = port + 16
1909 mpls_label = port + 16
1910
Flavio Castrod80fbc32016-07-25 15:54:26 -07001911 # add l2 interface group
Charles Chan53cac542016-08-22 16:03:26 -07001912 id, dst_mac[ 5 ] = port, port
Flavio Castroa7162bb2016-07-25 17:30:30 -07001913 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, port, vlan_id, True, False )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001914 # add L3 Unicast group
Flavio Castroa7162bb2016-07-25 17:30:30 -07001915 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=id,
1916 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001917 # add L3 ecmp group
Flavio Castroa7162bb2016-07-25 17:30:30 -07001918 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ l3_msg.group_id ] )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001919 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +01001920 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001921 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -07001922 if config["switch_type"] == "qmx":
1923 add_termination_flow( self.controller, 0, 0x8847, intf_src_mac, vlan_id, goto_table=24 )
1924 else:
1925 add_termination_flow( self.controller, port, 0x8847, intf_src_mac, vlan_id, goto_table=24 )
Alex Yashchuk9f449462017-12-09 18:27:19 +02001926
1927 if config["switch_type"] != 'xpliant':
1928 add_mpls_flow( self.controller, ecmp_msg.group_id, mpls_label )
1929 else:
1930 xpliant_add_mpls_flow( self.controller, ecmp_msg.group_id, mpls_label )
1931
Flavio Castroa7162bb2016-07-25 17:30:30 -07001932 # add_mpls_flow(self.controller, label=port)
Flavio Castrod80fbc32016-07-25 15:54:26 -07001933 dst_ip = dip + (vlan_id << 8)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001934 # add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00,
Flavio Castrod80fbc32016-07-25 15:54:26 -07001935 # ecmp_msg.group_id, 1)
Flavio Castroa7162bb2016-07-25 17:30:30 -07001936 Groups._put( l2_gid )
1937 Groups._put( l3_msg.group_id )
1938 Groups._put( ecmp_msg.group_id )
1939 do_barrier( self.controller )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001940
Flavio Castroa7162bb2016-07-25 17:30:30 -07001941 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castrod80fbc32016-07-25 15:54:26 -07001942 for in_port in ports:
1943 ip_src = '192.168.%02d.1' % (in_port)
1944 for out_port in ports:
1945 if in_port == out_port:
1946 continue
Charles Chan53cac542016-08-22 16:03:26 -07001947
1948 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1949 out_mpls_label = out_port + 16
1950 in_vlan_vid = in_port + 16
1951 out_vlan_vid = out_port + 16
1952
Flavio Castrod80fbc32016-07-25 15:54:26 -07001953 ip_dst = '192.168.%02d.1' % (out_port)
Charles Chan53cac542016-08-22 16:03:26 -07001954 label = (out_mpls_label, 0, 1, 32)
1955 parsed_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(in_vlan_vid),
Flavio Castroa7162bb2016-07-25 17:30:30 -07001956 ip_src=ip_src, ip_dst=ip_dst, eth_dst=switch_mac, label=[ label ] )
1957 pkt = str( parsed_pkt )
1958 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001959 # build expect packet
1960 mac_dst = '00:00:00:22:22:%02X' % (out_port)
Alex Yashchuk9f449462017-12-09 18:27:19 +02001961 if config["switch_type"] != 'xpliant':
1962 ip_ttl=31
1963 else:
1964 ip_ttl=64
Charles Chan53cac542016-08-22 16:03:26 -07001965 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(out_vlan_vid),
Alex Yashchuk9f449462017-12-09 18:27:19 +02001966 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=ip_ttl, ip_src=ip_src, ip_dst=ip_dst )
Flavio Castroa7162bb2016-07-25 17:30:30 -07001967 pkt = str( exp_pkt )
1968 verify_packet( self, pkt, out_port )
1969 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07001970 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07001971 delete_all_flows( self.controller )
1972 delete_groups( self.controller, Groups )
1973 delete_all_groups( self.controller )
Saurav Das15c2c262017-05-06 18:12:38 -07001974
Saurav Das34992182017-04-14 15:59:48 -07001975
1976@disabled
1977class One_MplsTermination( base_tests.SimpleDataPlane ):
1978 """
1979 Verify MPLS VPN Termination at penultimate hop in only one direction
1980 """
1981
1982 def runTest( self ):
1983 Groups = Queue.LifoQueue( )
1984 try:
1985 if len( config[ "port_map" ] ) < 2:
1986 logging.info( "Port count less than 2, can't run this case" )
1987 return
1988 dip = 0xc0a80001
1989 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
1990 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
1991 # Assigns unique hardcoded test_id to make sure tests don't overlap when writing rules
1992 ports = config[ "port_map" ].keys( )
1993 inport = ports[0]
1994 outport = ports[1]
1995
1996 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
1997 invlan_id = inport + 16
1998 outvlan_id = outport + 16
1999 mpls_label = outport + 16
2000
2001 # add l2 interface group
2002 id, dst_mac[ 5 ] = inport, outport
2003 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, outport, outvlan_id, True, False )
2004 # add L3 Unicast group
2005 l3_msg = add_l3_unicast_group( self.controller, outport, vlanid=outvlan_id, id=id,
2006 src_mac=intf_src_mac, dst_mac=dst_mac )
2007 # add L3 ecmp group
2008 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ l3_msg.group_id ] )
2009 # add vlan flow table
2010 add_one_vlan_table_flow( self.controller, inport, 1, invlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
2011 # add tmac flow
Saurav Dase94ba572017-04-28 17:47:21 -07002012 if config["switch_type"] == "qmx":
2013 add_termination_flow( self.controller, 0, 0x8847, intf_src_mac, invlan_id, goto_table=24 )
2014 else:
2015 add_termination_flow( self.controller, inport, 0x8847, intf_src_mac, invlan_id, goto_table=24 )
Saurav Das34992182017-04-14 15:59:48 -07002016 # add mpls termination flow
2017 add_mpls_flow( self.controller, ecmp_msg.group_id, mpls_label, send_barrier=True )
2018 Groups._put( l2_gid )
2019 Groups._put( l3_msg.group_id )
2020 Groups._put( ecmp_msg.group_id )
2021
2022 time.sleep(0.1)
2023 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
2024 ip_src = '192.168.%02d.1' % (inport)
2025 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
2026 out_mpls_label = outport + 16
2027 in_vlan_vid = inport + 16
2028 out_vlan_vid = outport + 16
2029
2030 ip_dst = '192.168.%02d.1' % (outport)
2031 label = (out_mpls_label, 0, 1, 32)
2032 parsed_pkt = mpls_packet( pktlen=104, dl_vlan_enable=True, vlan_vid=(in_vlan_vid),
2033 ip_src=ip_src, ip_dst=ip_dst, eth_dst=switch_mac, label=[ label ] )
2034 pkt = str( parsed_pkt )
2035 self.dataplane.send( inport, pkt )
2036 # build expect packet
2037 mac_dst = '00:00:00:22:22:%02X' % (outport)
2038 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(out_vlan_vid),
2039 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=31, ip_src=ip_src, ip_dst=ip_dst )
2040 pkt = str( exp_pkt )
2041 verify_packet( self, pkt, outport )
2042 verify_no_other_packets( self )
2043 finally:
2044 delete_all_flows( self.controller )
2045 delete_groups( self.controller, Groups )
2046 delete_all_groups( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -05002047
Flavio Castroa7162bb2016-07-25 17:30:30 -07002048
2049class _24UcastTagged( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -07002050 """ Verify /24 IP forwarding to L3 Interface """
Flavio Castro1c9b1252016-02-04 18:42:58 -05002051
Flavio Castroa7162bb2016-07-25 17:30:30 -07002052 def runTest( self ):
2053 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002054 try:
2055 test_id = 26
Flavio Castroa7162bb2016-07-25 17:30:30 -07002056 if len( config[ "port_map" ] ) < 2:
2057 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002058 return
Flavio Castroa7162bb2016-07-25 17:30:30 -07002059 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
2060 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002061 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07002062 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002063 for port in ports:
2064 # add l2 interface group
2065 vlan_id = port + test_id
Flavio Castroa7162bb2016-07-25 17:30:30 -07002066 l2gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
2067 is_tagged=True, send_barrier=False )
2068 dst_mac[ 5 ] = vlan_id
2069 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=vlan_id,
2070 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002071 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +01002072 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002073 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -07002074 if config["switch_type"] == "qmx":
2075 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
2076 else:
2077 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002078 # add unicast routing flow
2079 dst_ip = dip + (vlan_id << 8)
Andrea Campanellabfb42b32018-04-26 10:57:23 +02002080 # def add_unicast_routing_flow(ctrl, eth_type, dst_ip, mask, action_group_id, vrf=0, send_ctrl=False, send_barrier=False, priority = 1):
Flavio Castroa7162bb2016-07-25 17:30:30 -07002081 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, l3_msg.group_id )
2082 Groups.put( l2gid )
2083 Groups.put( l3_msg.group_id )
2084 do_barrier( self.controller )
Flavio Castro1c9b1252016-02-04 18:42:58 -05002085
Flavio Castroa7162bb2016-07-25 17:30:30 -07002086 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002087 for in_port in ports:
2088 mac_src = '00:00:00:22:22:%02X' % (test_id + in_port)
2089 ip_src = '192.168.%02d.1' % (test_id + in_port)
2090 for out_port in ports:
2091 if in_port == out_port:
2092 continue
2093 ip_dst = '192.168.%02d.1' % (test_id + out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07002094 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
2095 vlan_vid=(test_id + in_port), eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64,
2096 ip_src=ip_src, ip_dst=ip_dst )
2097 pkt = str( parsed_pkt )
2098 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002099 # build expected packet
2100 mac_dst = '00:00:00:22:22:%02X' % (test_id + out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07002101 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
2102 vlan_vid=(test_id + out_port), eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
2103 ip_src=ip_src, ip_dst=ip_dst )
2104 pkt = str( exp_pkt )
2105 verify_packet( self, pkt, out_port )
2106 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002107 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002108 delete_all_flows( self.controller )
2109 delete_groups( self.controller, Groups )
2110 delete_all_groups( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -07002111
Andrea Campanellabfb42b32018-04-26 10:57:23 +02002112class _24UcastRouteBlackHole( base_tests.SimpleDataPlane ):
2113 """ Verify black-holing of unicast routes, feature present only from OFDPA Premium 1.1.3.0"""
2114
2115 def runTest( self ):
2116 Groups = Queue.LifoQueue( )
2117 try:
2118 test_id = 27
2119 if len( config[ "port_map" ] ) < 2:
2120 logging.info( "Port count less than 2, can't run this case" )
2121 return
2122 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
2123 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
2124 dip = 0xc0a80001
2125 ports = config[ "port_map" ].keys( )
2126 for port in ports:
2127 # add l2 interface group
2128 vlan_id = port + test_id
2129 # add vlan flow table
2130 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
2131 # add termination flow
2132 if config["switch_type"] == "qmx":
2133 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
2134 else:
2135 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
2136 # add unicast routing flow
2137 #dst ip = 10.0.0.0/8
2138 dst_ip = 0x0a000000
2139 add_unicast_blackhole_flow(self.controller, 0x0800, dst_ip, 0xffffff00 )
2140 do_barrier( self.controller )
2141
2142 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
2143 for in_port in ports:
2144 mac_src = '00:00:00:22:22:%02X' % (test_id + in_port)
2145 ip_src = '192.168.%02d.1' % (test_id + in_port)
2146 for out_port in ports:
2147 if in_port == out_port:
2148 continue
2149 ip_dst = '192.168.%02d.1' % (test_id + out_port)
2150 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
2151 vlan_vid=(test_id + in_port), eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64,
2152 ip_src=ip_src, ip_dst=ip_dst )
2153 pkt = str( parsed_pkt )
2154 self.dataplane.send( in_port, pkt )
2155 # build expected packet
2156 mac_dst = '00:00:00:22:22:%02X' % (test_id + out_port)
2157 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True,
2158 vlan_vid=(test_id + out_port), eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63,
2159 ip_src=ip_src, ip_dst=ip_dst )
2160 pkt = str( exp_pkt )
2161 verify_no_packet( self, pkt, out_port )
2162 verify_no_other_packets( self )
2163 finally:
2164 delete_all_flows( self.controller )
2165 delete_groups( self.controller, Groups )
2166 delete_all_groups( self.controller )
2167
Flavio Castroa7162bb2016-07-25 17:30:30 -07002168
2169class _0Ucast( base_tests.SimpleDataPlane ):
Flavio Castro76c5b262016-07-27 19:53:00 -07002170 """ Verify default gateway IP forwarding to L3 Interface ( /0 rule ) """
Flavio Castro91d1a552016-05-17 16:59:44 -07002171
Flavio Castroa7162bb2016-07-25 17:30:30 -07002172 def runTest( self ):
2173 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002174 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002175 if len( config[ "port_map" ] ) < 2:
2176 logging.info( "Port count less than 2, can't run this case" )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002177 return
Flavio Castro91d1a552016-05-17 16:59:44 -07002178
Flavio Castroa7162bb2016-07-25 17:30:30 -07002179 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
2180 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002181 dip = 0xc0a80001
Flavio Castroa7162bb2016-07-25 17:30:30 -07002182 ports = config[ "port_map" ].keys( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002183 for port in ports:
2184 # add l2 interface group
2185 vlan_id = port
Flavio Castroa7162bb2016-07-25 17:30:30 -07002186 l2gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id + 1,
2187 is_tagged=True, send_barrier=False )
2188 dst_mac[ 5 ] = vlan_id
2189 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id + 1, id=vlan_id,
2190 src_mac=intf_src_mac, dst_mac=dst_mac )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002191 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +01002192 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002193 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -07002194 if config["switch_type"] == "qmx":
2195 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
2196 else:
2197 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002198 # add unicast routing flow
2199 dst_ip = dip + (vlan_id << 8)
Alex Yashchuk9f449462017-12-09 18:27:19 +02002200 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffffff, l3_msg.group_id, priority=2 )
Flavio Castroa7162bb2016-07-25 17:30:30 -07002201 Groups.put( l2gid )
2202 Groups.put( l3_msg.group_id )
2203 l3_gid = encode_l3_unicast_group_id( ports[ 0 ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002204 dst_ip = 0x0
Flavio Castroa7162bb2016-07-25 17:30:30 -07002205 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0x0, l3_gid )
2206 do_barrier( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -07002207
Flavio Castroa7162bb2016-07-25 17:30:30 -07002208 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002209 for in_port in ports:
2210 mac_src = '00:00:00:22:22:%02X' % (in_port)
2211 ip_src = '192.168.%02d.1' % (in_port)
2212 for out_port in ports:
2213 if in_port == out_port:
2214 continue
2215 ip_dst = '192.168.%02d.1' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07002216 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(in_port),
2217 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
2218 pkt = str( parsed_pkt )
2219 self.dataplane.send( in_port, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002220 # build expected packet
2221 mac_dst = '00:00:00:22:22:%02X' % (out_port)
Flavio Castroa7162bb2016-07-25 17:30:30 -07002222 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=(out_port + 1),
2223 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
2224 pkt = str( exp_pkt )
2225 verify_packet( self, pkt, out_port )
2226 verify_no_other_packets( self )
2227 ip_dst = '1.168.%02d.1' % ports[ 0 ]
2228 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
2229 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
2230 pkt = str( parsed_pkt )
2231 self.dataplane.send( in_port, pkt )
2232 # build expect packet
2233 mac_dst = '00:00:00:22:22:%02X' % ports[ 0 ]
2234 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ] + 1,
2235 ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac )
2236 pkt = str( exp_pkt )
2237 verify_packet( self, pkt, ports[ 0 ] )
2238 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002239 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002240 delete_all_flows( self.controller )
2241 delete_groups( self.controller, Groups )
2242 delete_all_groups( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -07002243
Flavio Castroa7162bb2016-07-25 17:30:30 -07002244
2245class Unfiltered( base_tests.SimpleDataPlane ):
Flavio Castro423df652016-05-17 20:14:08 -04002246 """
Flavio Castro76c5b262016-07-27 19:53:00 -07002247 Attempt to add an unfiltered group: [ATTENTION] this doesn't verify addition
Flavio Castro423df652016-05-17 20:14:08 -04002248 """
Flavio Castro91d1a552016-05-17 16:59:44 -07002249
Flavio Castroa7162bb2016-07-25 17:30:30 -07002250 def runTest( self ):
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002251 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002252 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002253 vlan_id = 1;
2254 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002255 add_l2_unfiltered_group( self.controller, [ port ], False )
2256 do_barrier( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002257 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002258 delete_all_flows( self.controller )
2259 delete_all_groups( self.controller )
Flavio Castro91d1a552016-05-17 16:59:44 -07002260
Saurav Das34992182017-04-14 15:59:48 -07002261@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -07002262class L3McastToVPN( base_tests.SimpleDataPlane ):
Flavio Castro423df652016-05-17 20:14:08 -04002263 """
Flavio Castro76c5b262016-07-27 19:53:00 -07002264 Mcast routing and VPN initiation
Flavio Castro423df652016-05-17 20:14:08 -04002265 """
Flavio Castroa7162bb2016-07-25 17:30:30 -07002266
2267 def runTest( self ):
Flavio Castro423df652016-05-17 20:14:08 -04002268 """
2269 port1 (vlan 1)-> port 2 (vlan 2)
2270 """
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002271 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002272 delete_all_flows( self.controller )
2273 delete_all_groups( self.controller )
Flavio Castro423df652016-05-17 20:14:08 -04002274
Flavio Castroa7162bb2016-07-25 17:30:30 -07002275 if len( config[ "port_map" ] ) < 3:
2276 logging.info( "Port count less than 3, can't run this case" )
2277 assert (False)
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002278 return
Flavio Castro423df652016-05-17 20:14:08 -04002279
Flavio Castroa7162bb2016-07-25 17:30:30 -07002280 vlan_id = 1
2281 port2_out_vlan = 2
2282 port3_out_vlan = 3
2283 in_vlan = 1 # macast group vid shall use input vlan diffe from l3 interface use output vlan
2284 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
2285 intf_src_mac_str = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
2286 dst_mac = [ 0x01, 0x00, 0x5e, 0x01, 0x01, 0x01 ]
2287 dst_mac_str = ':'.join( [ '%02X' % x for x in dst_mac ] )
2288 port1_mac = [ 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 ]
2289 port1_mac_str = ':'.join( [ '%02X' % x for x in port1_mac ] )
2290 src_ip = 0xc0a80101
2291 src_ip_str = "192.168.1.1"
2292 dst_ip = 0xe0010101
2293 dst_ip_str = "224.1.1.1"
Flavio Castro423df652016-05-17 20:14:08 -04002294
Flavio Castroa7162bb2016-07-25 17:30:30 -07002295 port1 = config[ "port_map" ].keys( )[ 0 ]
2296 port2 = config[ "port_map" ].keys( )[ 1 ]
2297 # port3=config["port_map"].keys()[2]
Flavio Castro423df652016-05-17 20:14:08 -04002298
Flavio Castroa7162bb2016-07-25 17:30:30 -07002299 # add l2 interface group
2300 for port in config[ "port_map" ].keys( ):
2301 add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id, is_tagged=False,
2302 send_barrier=False )
2303 # add vlan flow table
2304 add_one_vlan_table_flow( self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
2305 vlan_id += 1
Flavio Castro423df652016-05-17 20:14:08 -04002306
Flavio Castroa7162bb2016-07-25 17:30:30 -07002307 # add termination flow
2308 add_termination_flow( self.controller, port1, 0x0800, [ 0x01, 0x00, 0x5e, 0x00, 0x00, 0x00 ],
2309 vlan_id )
Flavio Castro423df652016-05-17 20:14:08 -04002310
Flavio Castroa7162bb2016-07-25 17:30:30 -07002311 # add MPLS interface group
2312 l2_gid = encode_l2_interface_group_id( port2_out_vlan, port2 )
2313 mpls_gid2, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dst_mac, intf_src_mac,
2314 port2_out_vlan, port2 )
2315 # l2_gid3 = encode_l2_interface_group_id(port3_out_vlan, port3)
2316 # mpls_gid3, mpls_msg = add_mpls_intf_group(self.controller, l2_gid3, dst_mac, intf_src_mac, port3_out_vlan, port3)
2317 # add L3VPN groups
2318 mpls_label_gid2, mpls_label_msg = add_mpls_label_group( self.controller,
2319 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=(0x20000 + port2), ref_gid=mpls_gid2,
2320 push_mpls_header=True, set_mpls_label=port2, set_bos=1, cpy_ttl_outward=True )
2321 # mpls_label_gid3, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002322 # index=(0x10000+port3), ref_gid= mpls_gid3, push_mpls_header=True, set_mpls_label=port3, set_bos=1, cpy_ttl_outward=True)
Flavio Castro423df652016-05-17 20:14:08 -04002323
Flavio Castroa7162bb2016-07-25 17:30:30 -07002324 mcat_group_msg = add_l3_mcast_group( self.controller, in_vlan, 2, [ mpls_label_gid2 ] )
2325 add_mcast4_routing_flow( self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id )
Flavio Castro423df652016-05-17 20:14:08 -04002326
Flavio Castroa7162bb2016-07-25 17:30:30 -07002327 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=1, eth_dst=dst_mac_str,
2328 eth_src=port1_mac_str, ip_ttl=64, ip_src=src_ip_str, ip_dst=dst_ip_str )
2329 pkt = str( parsed_pkt )
2330 self.dataplane.send( port1, pkt )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002331 label = (12, 0, 1, 63)
Flavio Castroa7162bb2016-07-25 17:30:30 -07002332 exp_pkt = mpls_packet( pktlen=100, eth_dst=dst_mac_str, eth_src=intf_src_mac_str, ip_ttl=64,
2333 ip_src=src_ip_str, label=[ label ], ip_dst=dst_ip_str )
2334 pkt = str( exp_pkt )
2335 verify_packet( self, pkt, port2 )
2336 # verify_packet(self, pkt, port3)
2337 verify_no_other_packets( self )
2338 delete_all_groups( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002339 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002340 delete_all_flows( self.controller )
2341 delete_all_groups( self.controller )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002342
Saurav Das34992182017-04-14 15:59:48 -07002343@disabled
Flavio Castroa7162bb2016-07-25 17:30:30 -07002344class PacketInSrcMacMiss( base_tests.SimpleDataPlane ):
Flavio Castro423df652016-05-17 20:14:08 -04002345 """
2346 Test packet in function on a src-mac miss
2347 Send a packet to each dataplane port and verify that a packet
2348 in message is received from the controller for each
2349 #todo verify you stop receiving after adding rule
2350 """
2351
Flavio Castroa7162bb2016-07-25 17:30:30 -07002352 def runTest( self ):
2353 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002354 try:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002355 ports = sorted( config[ "port_map" ].keys( ) )
Flavio Castro423df652016-05-17 20:14:08 -04002356
Flavio Castroa7162bb2016-07-25 17:30:30 -07002357 Groups = Queue.LifoQueue( )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002358 for port in ports:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002359 L2gid, l2msg = add_one_l2_interface_group( self.controller, port, 1, True, False )
2360 add_one_vlan_table_flow( self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG )
2361 Groups.put( L2gid )
2362 parsed_vlan_pkt = simple_tcp_packet( pktlen=104, vlan_vid=0x1001, dl_vlan_enable=True )
2363 vlan_pkt = str( parsed_vlan_pkt )
2364 for of_port in config[ "port_map" ].keys( ):
2365 logging.info( "PacketInMiss test, port %d", of_port )
2366 self.dataplane.send( of_port, vlan_pkt )
2367 verify_packet_in( self, vlan_pkt, of_port, ofp.OFPR_NO_MATCH )
2368 verify_no_other_packets( self )
Flavio Castro8c37e1c2016-07-19 18:26:33 -07002369 finally:
Flavio Castroa7162bb2016-07-25 17:30:30 -07002370 delete_all_flows( self.controller )
2371 delete_all_groups( self.controller )
2372
2373
2374class EcmpGroupMod( base_tests.SimpleDataPlane ):
2375 """
Saurav Das34992182017-04-14 15:59:48 -07002376 Verify referenced group can be modified by adding or removing buckets
Flavio Castroa7162bb2016-07-25 17:30:30 -07002377 """
2378
2379 def runTest( self ):
2380 Groups = Queue.LifoQueue( )
2381 try:
2382 if len( config[ "port_map" ] ) < 2:
2383 logging.info( "Port count less than 2, can't run this case" )
2384 return
2385
2386 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
2387 dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
2388 dip = 0xc0a80001
2389 # Hashes Test Name and uses it as id for installing unique groups
2390 ports = config[ "port_map" ].keys( )
Flavio Castro9debaaa2016-07-26 19:37:50 -07002391 ecmp = [ ]
Saurav Das34992182017-04-14 15:59:48 -07002392 dst_ips = []
2393 # add flows for all ports but include only the egress switchport (connected to ports[1])
2394 # in the ecmp group
Flavio Castroa7162bb2016-07-25 17:30:30 -07002395 for port in ports:
2396 vlan_id = port
2397 id = port
2398 # add l2 interface group
2399 l2_gid, msg = add_one_l2_interface_group( self.controller, port, vlan_id=vlan_id,
2400 is_tagged=True, send_barrier=False )
2401 dst_mac[ 5 ] = vlan_id
2402 l3_msg = add_l3_unicast_group( self.controller, port, vlanid=vlan_id, id=id,
2403 src_mac=intf_src_mac, dst_mac=dst_mac )
Saurav Das34992182017-04-14 15:59:48 -07002404 if port == ports[1]:
2405 ecmp += [ l3_msg.group_id ]
Flavio Castroa7162bb2016-07-25 17:30:30 -07002406 Groups._put( l2_gid )
2407 Groups._put( l3_msg.group_id )
Flavio Castro9debaaa2016-07-26 19:37:50 -07002408 ecmp_msg = add_l3_ecmp_group( self.controller, ports[ 0 ], [ l3_msg.group_id ] )
Flavio Castroa7162bb2016-07-25 17:30:30 -07002409 # add vlan flow table
Pier265ad5f2017-02-28 17:46:28 +01002410 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
Flavio Castroa7162bb2016-07-25 17:30:30 -07002411 # add termination flow
Saurav Dase94ba572017-04-28 17:47:21 -07002412 if config["switch_type"] == "qmx":
2413 add_termination_flow( self.controller, 0, 0x0800, intf_src_mac, vlan_id )
2414 else:
2415 add_termination_flow( self.controller, port, 0x0800, intf_src_mac, vlan_id )
Flavio Castroa7162bb2016-07-25 17:30:30 -07002416 # add unicast routing flow
2417 dst_ip = dip + (vlan_id << 8)
Saurav Das34992182017-04-14 15:59:48 -07002418 dst_ips += [dst_ip]
Flavio Castroa7162bb2016-07-25 17:30:30 -07002419 Groups._put( ecmp_msg.group_id )
Flavio Castro9debaaa2016-07-26 19:37:50 -07002420 mod_l3_ecmp_group( self.controller, ports[ 0 ], ecmp )
Saurav Das34992182017-04-14 15:59:48 -07002421 for dst_ip in dst_ips:
2422 add_unicast_routing_flow( self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id )
2423 time.sleep(0.1)
2424 # first part of the test: send packet from ingress switchport and expect it at egress switchport
Flavio Castroa7162bb2016-07-25 17:30:30 -07002425 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
Flavio Castro9debaaa2016-07-26 19:37:50 -07002426 parsed_pkt = exp_pkt = 0
Saurav Das34992182017-04-14 15:59:48 -07002427 in_port = ports[0]
2428 out_port = ports[1]
2429 logging.info("\nSending packet to port: " + str(in_port) + ", expected egress on port: " + str(out_port))
2430 mac_src = '00:00:00:22:22:%02X' % ports[ 0 ]
2431 ip_src = '192.168.%02d.%02d' % (ports[ 0 ], 1)
2432 ip_dst = '192.168.%02d.%02d' % (ports[ 1 ], 1)
2433 tcp = out_port if out_port == 24 else 25
2434 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
2435 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
2436 ip_dst=ip_dst, tcp_dport=tcp )
2437 pkt = str( parsed_pkt )
2438 self.dataplane.send( ports[ 0 ], pkt )
2439 # build expected packet at egress switchport
2440 mac_dst = '00:00:00:22:22:%02X' % out_port
2441 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
2442 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src,
2443 ip_dst=ip_dst, tcp_dport=tcp )
2444 pkt = str( exp_pkt )
2445 verify_packet( self, pkt, out_port )
2446 verify_no_other_packets( self )
2447
2448 # second part of the test - edit the ecmp group to remove the orginal egress switchport
2449 # and instead add the ingress switchport. Send packet from ingress switchport, and expect
2450 # it back on the ingress switchport
Flavio Castro9debaaa2016-07-26 19:37:50 -07002451 l3_gid = encode_l3_unicast_group_id( ports[ 0 ] )
2452 mod_l3_ecmp_group( self.controller, ports[ 0 ], [ l3_gid ] )
Saurav Das34992182017-04-14 15:59:48 -07002453 time.sleep(0.1)
2454 logging.info("Sending packet to port: " + str(ports[0]) + ", expected egress on port: " + str(ports[0]))
2455 mac_src = '00:00:00:22:22:%02X' % ports[ 0 ]
2456 ip_src = '192.168.%02d.%02d' % (ports[ 0 ], 1)
2457 ip_dst = '192.168.%02d.%02d' % (ports[ 1 ], 1)
2458 tcp = port if port == 24 else 25
2459 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
2460 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
2461 ip_dst=ip_dst,tcp_dport=tcp )
2462 pkt = str( parsed_pkt )
2463 self.dataplane.send( ports[ 0 ], pkt )
2464 # build expected packet
2465 mac_dst = '00:00:00:22:22:%02X' % ports[ 0 ]
2466 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
2467 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src,
2468 ip_dst=ip_dst,tcp_dport=tcp )
Alex Yashchuk9f449462017-12-09 18:27:19 +02002469 # Expects packet on the input port
2470 if config["switch_type"] != 'xpliant':
2471 pkt = str( exp_pkt )
2472 verify_packet( self, pkt, ports[ 0 ] )
2473 verify_no_other_packets( self )
Saurav Das34992182017-04-14 15:59:48 -07002474
2475 # third part of the test - edit the group to completely remove bucket. Packet sent
2476 # should be dropped by the switch
Flavio Castro9debaaa2016-07-26 19:37:50 -07002477 mod_l3_ecmp_group( self.controller, ports[ 0 ], [ ] )
Saurav Das34992182017-04-14 15:59:48 -07002478 time.sleep(0.1)
2479 logging.info("Sending packet to port: " + str(ports[0]) + ", expected drop")
2480 mac_src = '00:00:00:22:22:%02X' % ports[ 0 ]
2481 ip_src = '192.168.%02d.%02d' % (ports[ 0 ], 1)
2482 ip_dst = '192.168.%02d.%02d' % (ports[ 1 ], 1)
2483 tcp = port if port == 24 else 25
2484 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
2485 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
2486 ip_dst=ip_dst,tcp_dport=tcp )
2487 pkt = str( parsed_pkt )
2488 self.dataplane.send( ports[ 0 ], pkt )
2489 verify_no_other_packets( self )
2490
2491 # final part of the test - edit the empty group to add back the bucket for the
2492 # original egress port, and verify packet is received on egress switch port
2493 l3_gid = encode_l3_unicast_group_id( ports[ 1 ] )
2494 mod_l3_ecmp_group( self.controller, ports[ 0 ], [ l3_gid ] )
Alex Yashchuk9f449462017-12-09 18:27:19 +02002495 do_barrier(self.controller)
Saurav Das34992182017-04-14 15:59:48 -07002496 in_port = ports[0]
2497 out_port = ports[1]
2498 logging.info("Sending packet to port: " + str(in_port) + ", expected egress on port: " + str(out_port))
2499 mac_src = '00:00:00:22:22:%02X' % ports[ 0 ]
2500 ip_src = '192.168.%02d.%02d' % (ports[ 0 ], 1)
2501 ip_dst = '192.168.%02d.%02d' % (ports[ 1 ], 1)
2502 tcp = out_port if out_port == 24 else 25
2503 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=ports[ 0 ],
2504 eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
2505 ip_dst=ip_dst, tcp_dport=tcp )
2506 pkt = str( parsed_pkt )
2507 self.dataplane.send( ports[ 0 ], pkt )
2508 # build expected packet at egress switchport
2509 mac_dst = '00:00:00:22:22:%02X' % out_port
2510 exp_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=out_port,
2511 eth_dst=mac_dst, eth_src=switch_mac, ip_ttl=63, ip_src=ip_src,
2512 ip_dst=ip_dst, tcp_dport=tcp )
2513 pkt = str( exp_pkt )
2514 verify_packet( self, pkt, out_port )
2515 verify_no_other_packets( self )
2516
Flavio Castroa7162bb2016-07-25 17:30:30 -07002517 finally:
2518 delete_all_flows( self.controller )
2519 delete_groups( self.controller, Groups )
2520 delete_all_groups( self.controller )
Pier8b223022016-08-19 22:47:49 -07002521
Saurav Das34992182017-04-14 15:59:48 -07002522
Pier8b223022016-08-19 22:47:49 -07002523class Untagged( base_tests.SimpleDataPlane ):
2524 """
2525 Verify VLAN filtering table does not require OFPVID_PRESENT bit to be 0.
2526 This should be fixed in OFDPA 2.0 GA and above, the test fails with
2527 previous versions of the OFDPA.
2528
2529 Two rules are necessary in VLAN table (10):
2530 1) Assignment: match 0x0000/(no mask), set_vlan_vid 0x100A, goto 20
2531 2) Filtering: match 0x100A/0x1FFF, goto 20
2532
2533 In this test case vlan_id = (MAX_INTERNAL_VLAN - port_no).
2534 The remaining part of the test is based on the use of the bridging table
2535 """
2536
2537 MAX_INTERNAL_VLAN = 4094
2538
2539 def runTest( self ):
2540 groups = Queue.LifoQueue( )
2541 try:
2542 if len( config[ "port_map" ] ) < 2:
2543 logging.info( "Port count less than 2, can't run this case" )
2544 return
2545
2546 ports = sorted( config[ "port_map" ].keys( ) )
2547 for port in ports:
2548 vlan_id = Untagged.MAX_INTERNAL_VLAN - port
Pier265ad5f2017-02-28 17:46:28 +01002549 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG )
2550 add_one_vlan_table_flow( self.controller, port, 1, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_UNTAG )
Pier8b223022016-08-19 22:47:49 -07002551 for other_port in ports:
2552 if other_port == port:
2553 continue
2554 L2gid, l2msg = add_one_l2_interface_group( self.controller, other_port, vlan_id, False, False )
2555 groups.put( L2gid )
2556 add_bridge_flow( self.controller, [ 0x00, 0x12, 0x34, 0x56, 0x78, other_port ], vlan_id, L2gid, True )
2557
2558 do_barrier( self.controller )
2559
2560 for out_port in ports:
2561 # change dest based on port number
2562 mac_dst = '00:12:34:56:78:%02X' % out_port
2563 for in_port in ports:
2564 if in_port == out_port:
2565 continue
2566 pkt = str( simple_tcp_packet( eth_dst=mac_dst ) )
2567 self.dataplane.send( in_port, pkt )
2568 for ofport in ports:
2569 if ofport in [ out_port ]:
2570 verify_packet( self, pkt, ofport )
2571 else:
2572 verify_no_packet( self, pkt, ofport )
2573 verify_no_other_packets( self )
2574 finally:
2575 delete_all_flows( self.controller )
Pierf49f79b2016-08-25 15:12:04 -07002576 delete_groups( self.controller, groups )
Pier8b223022016-08-19 22:47:49 -07002577 delete_all_groups( self.controller )
Andreas Pantelopoulos6c76b942018-01-22 10:03:02 -08002578
2579class MPLSSwapTest( base_tests.SimpleDataPlane ):
2580 """
2581 MPLS switching with the same label used.
2582 Used for interconnecting spines between different fabrics where
2583 the label should not be popped, but swapepd with the same label.
2584 """
2585
2586 def runTest( self ):
2587 try:
2588 delete_all_flows( self.controller )
2589 delete_all_groups( self.controller )
2590
2591 if len( config[ "port_map" ] ) < 2:
2592 logging.info( "Port count less than 3, can't run this case" )
2593 assert (False)
2594 return
2595
2596 input_src_mac = [ 0x00, 0x00, 0x5e, 0x01, 0x01, 0x01 ]
2597 input_src_mac_str = ':'.join( [ '%02X' % x for x in input_src_mac ] )
2598
2599 input_dst_mac = [ 0x00, 0x00, 0x5e, 0x01, 0x01, 0x02 ]
2600 input_dst_mac_str = ':'.join( [ '%02X' % x for x in input_dst_mac ] )
2601
2602 output_dst_mac = [ 0x00, 0x00, 0x5e, 0x01, 0x01, 0x03 ]
2603 output_dst_mac_str = ':'.join( [ '%02X' % x for x in output_dst_mac ] )
2604
2605 mpls_label = 1000
2606
2607 src_ip = 0xc0a80101
2608 src_ip_str = "192.168.1.1"
2609 dst_ip = 0xe0010101
2610 dst_ip_str = "224.1.1.1"
2611
2612 src_port = config[ "port_map" ].keys( )[ 0 ]
2613 dst_port = config[ "port_map" ].keys( )[ 1 ]
2614
2615 out_vlan = 4094
2616
2617 add_one_l2_interface_group( self.controller, dst_port, vlan_id=out_vlan, is_tagged=False,
2618 send_barrier=True )
2619
2620 # add vlan flow table
2621 add_one_vlan_table_flow( self.controller, src_port, out_vlan_id=out_vlan, vlan_id=out_vlan, flag=VLAN_TABLE_FLAG_ONLY_TAG )
2622 add_one_vlan_table_flow( self.controller, src_port, out_vlan_id=out_vlan, vlan_id=out_vlan, flag=VLAN_TABLE_FLAG_ONLY_UNTAG )
2623
2624 # add termination flow
2625
2626 if config["switch_type"] == "qmx":
2627 logging.debug("MPLSSwitching : Adding flow for qmx, without input port")
2628 add_termination_flow( self.controller, 0, eth_type=0x08847, dst_mac=input_dst_mac, vlanid=out_vlan, goto_table=23)
2629 else:
2630 add_termination_flow( self.controller, in_port=src_port,
2631 eth_type=0x8847, dst_mac=input_dst_mac, vlanid=out_vlan, goto_table=23)
2632
2633 # add groups that will be used now
2634 l2_gid = encode_l2_interface_group_id( out_vlan, dst_port)
2635 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid,
2636 output_dst_mac, input_dst_mac,
2637 out_vlan, dst_port, send_barrier=True)
2638 index = 60
2639 mpls_swap_gid, mpls_swap_msg = add_mpls_swap_label_group( self.controller, mpls_gid,
2640 5, index, mpls_label)
2641
2642 # add flow to mpls table
2643 add_mpls_flow_swap( self.controller, mpls_swap_gid, mpls_label, 0x8847, 1, send_barrier=True)
2644
2645 # we generate the packet which carries a single label
2646 label = (mpls_label, 0, 1, 63)
2647 parsed_pkt = mpls_packet(
2648 pktlen=104,
2649 label=[label],
2650 eth_src=input_src_mac_str,
2651 eth_dst=input_dst_mac_str,
2652 )
2653 pkt = str( parsed_pkt )
Andreas Pantelopoulosaaa02622018-04-04 15:13:03 -07002654
Andreas Pantelopoulos6c76b942018-01-22 10:03:02 -08002655 self.dataplane.send( src_port, pkt )
2656
2657 label = (mpls_label, 0, 1, 62)
2658 parsed_pkt = mpls_packet(
2659 pktlen=104,
2660 label=[label],
2661 eth_src=input_dst_mac_str,
2662 eth_dst=output_dst_mac_str,
2663 )
2664 pkt = str( parsed_pkt )
2665
2666 verify_packet( self, pkt, dst_port )
2667 verify_no_packet( self, pkt, src_port )
2668 verify_no_other_packets( self )
2669
2670 delete_all_flows( self.controller )
2671 delete_all_groups( self.controller )
2672
2673 finally:
2674 delete_all_flows( self.controller )
2675 delete_all_groups( self.controller )
2676
Andreas Pantelopoulosf83e0212018-03-18 20:44:05 -07002677class DoubleToUntagged( base_tests.SimpleDataPlane ):
2678 """
2679 Verify MPLS IP VPN Initiation from /24 rule using ECMP
2680 where we receive double tagged packets and output untagged
2681 packets.
2682
2683 Each double tagged packet represents a subscriber where Outer tag is pon
2684 and inner tag is the subrscriber tag.
2685 """
2686
2687 def runTest( self ):
2688 Groups = Queue.LifoQueue( )
2689 try:
2690 if len( config[ "port_map" ] ) < 2:
2691 logging.info( "Port count less than 2, can't run this case" )
2692 return
2693
2694 input_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
2695 input_src_mac_str = ':'.join( [ '%02X' % x for x in input_src_mac ] )
2696
2697 input_dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
2698 input_dst_mac_str = ':'.join( [ '%02X' % x for x in input_dst_mac ] )
2699
2700 output_dst_mac = [ 0x00, 0x00, 0x00, 0x33, 0x33, 0x00 ]
2701 output_dst_mac_str = ':'.join( [ '%02X' % x for x in output_dst_mac ] )
2702
2703 dip = 0xc0a80001
2704 ports = config[ "port_map" ].keys( )
2705
2706 inner_vlan = 66
2707 outer_vlan = 77
2708 id = 10
2709 mpls_label = 152
2710
2711 port = ports[0]
2712 out_port = ports[1]
2713
2714 # add l2 interface group
2715 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, out_port, inner_vlan, False, True )
2716
2717 # add MPLS interface group
2718 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, output_dst_mac, input_dst_mac,
2719 inner_vlan, id )
2720
2721 # add MPLS L3 VPN group
2722 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
2723 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
2724 push_mpls_header=True, set_mpls_label=mpls_label, set_bos=1, set_ttl=32 )
2725 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ mpls_label_gid ] )
2726
2727 do_barrier( self.controller )
2728
2729 # add vlan flow table
2730 add_one_vlan_table_flow( self.controller, port, 1, outer_vlan, vrf=0,
2731 flag=VLAN_TABLE_FLAG_ONLY_STACKED )
2732
2733 add_one_vlan_1_table_flow( self.controller, port, outer_vlan_id=outer_vlan, inner_vlan_id=inner_vlan,
2734 flag=VLAN_TABLE_FLAG_ONLY_UNTAG )
2735
2736 # add termination flow
2737 if config["switch_type"] == "qmx":
2738 add_termination_flow( self.controller, 0, 0x0800, input_dst_mac, inner_vlan )
2739 else:
2740 add_termination_flow( self.controller, port, 0x0800, input_dst_mac, inner_vlan )
2741
2742 # add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_label_gid, vrf=2)
2743 add_unicast_routing_flow( self.controller, 0x0800, dip, 0xffffff00, ecmp_msg.group_id,
2744 vrf=0 )
2745 Groups._put( l2_gid )
2746 Groups._put( mpls_gid )
2747 Groups._put( mpls_label_gid )
2748 Groups._put( ecmp_msg.group_id )
2749
2750 do_barrier( self.controller )
2751
2752 ip_src = '192.168.5.5'
2753 ip_dst = '192.168.0.5'
2754 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=inner_vlan, outer_vlan=outer_vlan,
2755 eth_dst=input_dst_mac_str, eth_src=input_src_mac_str, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
2756 pkt = str( parsed_pkt )
2757
2758 # print("Expected %s" % format_packet(pkt))
2759
2760 self.dataplane.send( port, pkt )
2761
2762 # build expect packet
2763 label = (mpls_label, 0, 1, 32)
2764 exp_pkt = mpls_packet( pktlen=96, dl_vlan_enable=False, ip_ttl=63,
2765 ip_src=ip_src, ip_dst=ip_dst, eth_dst=output_dst_mac_str, eth_src=input_dst_mac_str,
2766 label=[ label ] )
2767 pkt = str( exp_pkt )
2768 verify_packet( self, pkt, out_port )
2769 verify_no_other_packets( self )
2770
2771 finally:
2772 delete_all_flows( self.controller )
2773 delete_groups( self.controller, Groups )
2774 delete_all_groups( self.controller )
2775
2776class DoubleToUntaggedMultipleSubscribers( base_tests.SimpleDataPlane ):
2777 """
2778 Verify MPLS IP VPN Initiation from /24 rule using ECMP
2779 where we receive double tagged packets and output untagged
2780 packets.
2781
2782 Each double tagged packet represents a subscriber where Outer tag is pon
2783 and inner tag is the subrscriber tag.
2784 """
2785
2786 def runTest( self ):
2787 Groups = Queue.LifoQueue( )
2788 try:
2789 if len( config[ "port_map" ] ) < 2:
2790 logging.info( "Port count less than 2, can't run this case" )
2791 return
2792
2793 # each entry represents a subscriber [id, ip in hex, inner_vlan, outer_vlan, ip in dot form]
2794 subscriber_info = [ [10, 0xc0a80001, 10, 100, "192.168.0.1"],
2795 [20, 0xc0a80002, 10, 101, "192.168.0.2"],
2796 [30, 0xc0a80003, 11, 100, "192.168.0.3"],
2797 [40, 0xc0a80004, 11, 101, "192.168.0.4"]]
2798
2799 print("")
2800
2801 for sub_info in subscriber_info:
2802
2803 print("Initializing rules for subscriber with id {0}".format(sub_info[0]))
2804
2805 input_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, sub_info[0] ]
2806 input_src_mac_str = ':'.join( [ '%02X' % x for x in input_src_mac ] )
2807
2808 input_dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
2809 input_dst_mac_str = ':'.join( [ '%02X' % x for x in input_dst_mac ] )
2810
2811 output_dst_mac = [ 0x00, 0x00, 0x00, 0x33, 0x33, 0x00 ]
2812 output_dst_mac_str = ':'.join( [ '%02X' % x for x in output_dst_mac ] )
2813
2814 dip = sub_info[1]
2815 ports = config[ "port_map" ].keys( )
2816
2817 inner_vlan = sub_info[2]
2818 outer_vlan = sub_info[3]
2819 id = 10
2820 mpls_label = 152
2821
2822 port = ports[0]
2823 out_port = ports[1]
2824
2825 # add l2 interface group
2826 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, out_port, inner_vlan, False, True )
2827
2828 # add MPLS interface group
2829 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, output_dst_mac, input_dst_mac,
2830 inner_vlan, id )
2831
2832 # add MPLS L3 VPN group
2833 mpls_label_gid, mpls_label_msg = add_mpls_label_group( self.controller,
2834 subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL, index=id, ref_gid=mpls_gid,
2835 push_mpls_header=True, set_mpls_label=mpls_label, set_bos=1, set_ttl=32 )
2836 ecmp_msg = add_l3_ecmp_group( self.controller, id, [ mpls_label_gid ] )
2837
2838 do_barrier( self.controller )
2839
2840 # add vlan flow table
2841 add_one_vlan_table_flow( self.controller, port, 1, outer_vlan, vrf=0,
2842 flag=VLAN_TABLE_FLAG_ONLY_STACKED )
2843
2844 add_one_vlan_1_table_flow( self.controller, port, outer_vlan_id=outer_vlan, inner_vlan_id=inner_vlan,
2845 flag=VLAN_TABLE_FLAG_ONLY_UNTAG )
2846
2847 # add termination flow
2848 if config["switch_type"] == "qmx":
2849 add_termination_flow( self.controller, 0, 0x0800, input_dst_mac, inner_vlan )
2850 else:
2851 add_termination_flow( self.controller, port, 0x0800, input_dst_mac, inner_vlan )
2852
2853 # add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0, mpls_label_gid, vrf=2)
2854 add_unicast_routing_flow( self.controller, 0x0800, dip, 0xffffff00, ecmp_msg.group_id,
2855 vrf=0 )
2856 Groups._put( l2_gid )
2857 Groups._put( mpls_gid )
2858 Groups._put( mpls_label_gid )
2859 Groups._put( ecmp_msg.group_id )
2860
2861 do_barrier( self.controller )
2862
2863 for sub_info in subscriber_info:
2864
2865 print("Sending packet for subscriber with id {0}".format(sub_info[0]))
2866
2867 input_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, sub_info[0] ]
2868 input_src_mac_str = ':'.join( [ '%02X' % x for x in input_src_mac ] )
2869
2870 input_dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
2871 input_dst_mac_str = ':'.join( [ '%02X' % x for x in input_dst_mac ] )
2872
2873 output_dst_mac = [ 0x00, 0x00, 0x00, 0x33, 0x33, 0x00 ]
2874 output_dst_mac_str = ':'.join( [ '%02X' % x for x in output_dst_mac ] )
2875
2876 dip = sub_info[1]
2877 ports = config[ "port_map" ].keys( )
2878
2879 inner_vlan = sub_info[2]
2880 outer_vlan = sub_info[3]
2881 id = 10
2882 mpls_label = 152
2883
2884 port = ports[0]
2885 out_port = ports[1]
2886
2887 ip_src = sub_info[4]
2888 ip_dst = '192.168.0.{}'.format(sub_info[0])
2889 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=True, vlan_vid=inner_vlan, outer_vlan=outer_vlan,
2890 eth_dst=input_dst_mac_str, eth_src=input_src_mac_str, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
2891 pkt = str( parsed_pkt )
2892
2893 # print("Sent %s" % format_packet(pkt))
2894
2895 self.dataplane.send( port, pkt )
2896
2897 # build expect packet
2898 label = (mpls_label, 0, 1, 32)
2899 exp_pkt = mpls_packet( pktlen=96, dl_vlan_enable=False, ip_ttl=63,
2900 ip_src=ip_src, ip_dst=ip_dst, eth_dst=output_dst_mac_str, eth_src=input_dst_mac_str,
2901 label=[ label ] )
2902 pkt = str( exp_pkt )
2903 verify_packet( self, pkt, out_port )
2904 verify_no_other_packets( self )
2905
2906 finally:
2907 delete_all_flows( self.controller )
2908 delete_groups( self.controller, Groups )
2909 delete_all_groups( self.controller )
2910
2911
2912class UntaggedToDouble ( base_tests.SimpleDataPlane ):
2913 """
2914 Verify google senario where we need to go from
2915 an untagged packet to a double tagged packet.
2916
2917 This is used for a single subscriber.
2918 """
2919
2920 def runTest( self ):
2921 Groups = Queue.LifoQueue( )
2922 try:
2923 if len( config[ "port_map" ] ) < 2:
2924 logging.info( "Port count less than 2, can't run this case" )
2925 return
2926
2927 input_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
2928 input_src_mac_str = ':'.join( [ '%02X' % x for x in input_src_mac ] )
2929
2930 input_dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
2931 input_dst_mac_str = ':'.join( [ '%02X' % x for x in input_dst_mac ] )
2932
2933 output_dst_mac = [ 0x00, 0x00, 0x00, 0x33, 0x33, 0x00 ]
2934 output_dst_mac_str = ':'.join( [ '%02X' % x for x in output_dst_mac ] )
2935
2936 dip = 0xc0a80001
2937 ports = config[ "port_map" ].keys( )
2938
2939 inner_vlan = 66
2940 outer_vlan = 77
2941 id = 10
2942 mpls_label = 152
2943
2944 port = ports[0]
2945 out_port = ports[1]
2946
2947 # add l2 unfiltered interface group
2948 l2_gid, l2_msg = add_one_l2_unfiltered_group( self.controller, out_port, True)
2949
2950 l3_msg = add_l3_unicast_group( self.controller, out_port, vlanid=4094, id=id,
2951 src_mac=input_dst_mac, dst_mac=output_dst_mac, gid=l2_gid)
2952
2953 do_barrier( self.controller )
2954
2955 # add vlan flow table
2956 add_one_vlan_table_flow( self.controller, port, 1, 4094,
2957 flag=VLAN_TABLE_FLAG_ONLY_BOTH )
2958
2959 # add termination flow
2960 if config["switch_type"] == "qmx":
2961 add_termination_flow( self.controller, 0, 0x0800, input_dst_mac, 4094 )
2962 else:
2963 add_termination_flow( self.controller, port, 0x0800, input_dst_mac, 4094 )
2964
2965 add_unicast_routing_flow( self.controller, 0x0800, dip, 0xffffffff, l3_msg.group_id,
2966 vrf=0 )
2967
2968 add_one_egress_vlan_table_flow( self.controller, out_port, 4094 , inner_vlan, outer_vlan)
2969
2970 Groups._put( l2_gid )
2971 Groups._put( l3_msg.group_id )
2972
2973 do_barrier( self.controller )
2974
2975 ip_src = '192.168.5.5'
2976 ip_dst = '192.168.0.1'
2977 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=False,
2978 eth_dst=input_dst_mac_str, eth_src=input_src_mac_str, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
2979 pkt = str( parsed_pkt )
2980
2981 # print("Input Packet %s" % format_packet(pkt))
2982
2983 self.dataplane.send( port, pkt )
2984
2985 # build expect packet
2986 exp_pkt = simple_tcp_packet( pktlen=108, dl_vlan_enable=True, vlan_vid=inner_vlan, outer_vlan=outer_vlan,
2987 eth_dst=output_dst_mac_str, eth_src=input_dst_mac_str, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
2988 pkt = str( exp_pkt )
2989
2990 # print("Expected Packet %s" % format_packet(pkt))
2991
2992 verify_packet( self, pkt, out_port )
2993 verify_no_other_packets( self )
2994 finally:
2995 delete_all_flows( self.controller )
2996 delete_groups( self.controller, Groups )
2997 delete_all_groups( self.controller )
2998
2999class UntaggedToDoubleMultipleSubscribers ( base_tests.SimpleDataPlane ):
3000 """
3001 Verify google senario where we need to go from
3002 an untagged packet to a double tagged packet.
3003
3004 This is used for multiple subscribers.
3005
3006 However, this solution does not scale, since we assign an internal vlan to each subscriber
3007 used in L3 Unicast Group in order to differentiate between them in the Egress Vlan Table.
3008 """
3009
3010 def runTest( self ):
3011 Groups = Queue.LifoQueue( )
3012 try:
3013 if len( config[ "port_map" ] ) < 2:
3014 logging.info( "Port count less than 2, can't run this case" )
3015 return
3016
3017 # each entry represents a subscriber [id, ip in hex, inner_vlan, outer_vlan, ip in dot form, internal vlan]
3018 subscriber_info = [[1, 0xc0a80001, 10, 100, "192.168.0.1", 4000],
3019 [2, 0xc0a80002, 10, 101, "192.168.0.2", 4001],
3020 [3, 0xc0a80003, 11, 100, "192.168.0.3", 4002],
3021 [4, 0xc0a80004, 11, 101, "192.168.0.4", 4003]]
3022
3023 print("")
3024
3025 for sub_info in subscriber_info:
3026
3027 print("Initializing rules for subscriber with id {0}".format(sub_info[0]))
3028
3029 input_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, sub_info[0] ]
3030 input_src_mac_str = ':'.join( [ '%02X' % x for x in input_src_mac ] )
3031
3032 input_dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
3033 input_dst_mac_str = ':'.join( [ '%02X' % x for x in input_dst_mac ] )
3034
3035 output_dst_mac = [ 0x00, 0x00, 0x00, 0x33, 0x33, 0x00 ]
3036 output_dst_mac_str = ':'.join( [ '%02X' % x for x in output_dst_mac ] )
3037
3038 dip = sub_info[1]
3039 ports = config[ "port_map" ].keys( )
3040
3041 inner_vlan = sub_info[2]
3042 outer_vlan = sub_info[3]
3043 internal_vlan = sub_info[5]
3044 id = sub_info[0] + 10
3045
3046 port = ports[0]
3047 out_port = ports[1]
3048
3049 # add l2 unfiltered interface group
3050 l2_gid, l2_msg = add_one_l2_unfiltered_group( self.controller, out_port, True)
3051
3052 l3_msg = add_l3_unicast_group( self.controller, out_port, vlanid=internal_vlan, id=id,
3053 src_mac=input_dst_mac, dst_mac=output_dst_mac, gid=l2_gid)
3054
3055 do_barrier( self.controller )
3056
3057 # add vlan flow table
3058 add_one_vlan_table_flow( self.controller, port, 1, 4094,
3059 flag=VLAN_TABLE_FLAG_ONLY_BOTH )
3060
3061 # add termination flow
3062 if config["switch_type"] == "qmx":
3063 add_termination_flow( self.controller, 0, 0x0800, input_dst_mac, 4094 )
3064 else:
3065 add_termination_flow( self.controller, port, 0x0800, input_dst_mac, 4094 )
3066
3067 add_unicast_routing_flow( self.controller, 0x0800, dip, 0xffffffff, l3_msg.group_id,
3068 vrf=0 )
3069
3070 add_one_egress_vlan_table_flow( self.controller, out_port, internal_vlan, inner_vlan, outer_vlan)
3071
3072 Groups._put( l2_gid )
3073 Groups._put( l3_msg.group_id )
3074 do_barrier( self.controller )
3075
3076 for sub_info in subscriber_info:
3077
3078 print("Sending packet for subscriber with id {0}".format(sub_info[0]))
3079
3080 input_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, sub_info[0] ]
3081 input_src_mac_str = ':'.join( [ '%02X' % x for x in input_src_mac ] )
3082
3083 input_dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
3084 input_dst_mac_str = ':'.join( [ '%02X' % x for x in input_dst_mac ] )
3085
3086 output_dst_mac = [ 0x00, 0x00, 0x00, 0x33, 0x33, 0x00 ]
3087 output_dst_mac_str = ':'.join( [ '%02X' % x for x in output_dst_mac ] )
3088
3089 dip = sub_info[1]
3090 ports = config[ "port_map" ].keys( )
3091
3092 inner_vlan = sub_info[2]
3093 outer_vlan = sub_info[3]
3094 internal_vlan = sub_info[5]
3095
3096 id = sub_info[0] + 10
3097 ip_src = '192.168.5.5'
3098 ip_dst = '192.168.0.{}'.format(sub_info[0])
3099 parsed_pkt = simple_tcp_packet( pktlen=100, dl_vlan_enable=False,
3100 eth_dst=input_dst_mac_str, eth_src=input_src_mac_str, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst )
3101 pkt = str( parsed_pkt )
3102
3103 # print("Input Packet %s" % format_packet(pkt))
3104
3105 self.dataplane.send( port, pkt )
3106
3107 # build expect packet
3108 exp_pkt = simple_tcp_packet( pktlen=108, dl_vlan_enable=True, vlan_vid=inner_vlan, outer_vlan=outer_vlan,
3109 eth_dst=output_dst_mac_str, eth_src=input_dst_mac_str, ip_ttl=63, ip_src=ip_src, ip_dst=ip_dst )
3110 pkt = str( exp_pkt )
3111
3112 # print("Expected Packet %s" % format_packet(pkt))
3113
3114 verify_packet( self, pkt, out_port )
3115 verify_no_other_packets( self )
3116 finally:
3117 delete_all_flows( self.controller )
3118 delete_groups( self.controller, Groups )
3119 delete_all_groups( self.controller )
Andreas Pantelopoulos6c76b942018-01-22 10:03:02 -08003120
Jonghwan Hyunff0dfd52018-03-20 15:04:35 -07003121class UntaggedToDoubleChangeEthertype ( base_tests.SimpleDataPlane ):
3122
3123 def runTest( self ):
3124 Groups = Queue.LifoQueue()
Andreas Pantelopoulosaaa02622018-04-04 15:13:03 -07003125
Jonghwan Hyunff0dfd52018-03-20 15:04:35 -07003126 try:
3127 if len( config[ "port_map" ] ) < 2:
Andreas Pantelopoulosaaa02622018-04-04 15:13:03 -07003128 logging.info( "port count less than 2, can't run this case" )
Jonghwan Hyunff0dfd52018-03-20 15:04:35 -07003129 return
3130
3131 input_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
3132 input_src_mac_str = ':'.join( [ '%02X' % x for x in input_src_mac ] )
3133
3134 input_dst_mac = [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ]
3135 input_dst_mac_str = ':'.join( [ '%02X' % x for x in input_dst_mac ] )
3136
3137 output_dst_mac = [ 0x00, 0x00, 0x00, 0x33, 0x33, 0x00 ]
3138 output_dst_mac_str = ':'.join( [ '%02X' % x for x in output_dst_mac ] )
3139
3140 dip = 0xc0a80001
3141 ports = config[ "port_map" ].keys( )
3142
3143 inner_vlan = 66
3144 outer_vlan = 77
3145 id = 10
3146
3147 port = ports[0]
3148 out_port = ports[1]
3149
3150 # add l2 unfiltered interface group
3151 l2_gid, l2_msg = add_one_l2_unfiltered_group( self.controller, out_port, True)
3152
3153 l3_msg = add_l3_unicast_group( self.controller, out_port, vlanid=4094, id=id,
3154 src_mac=input_dst_mac, dst_mac=output_dst_mac, gid=l2_gid)
3155
3156 do_barrier( self.controller )
3157
3158 # add vlan flow table
3159 add_one_vlan_table_flow( self.controller, port, 1, 4094,
3160 flag=VLAN_TABLE_FLAG_ONLY_BOTH )
3161
3162 # add termination flow
3163 if config["switch_type"] == "qmx":
3164 add_termination_flow( self.controller, 0, 0x0800, input_dst_mac, 4094 )
3165 else:
3166 add_termination_flow( self.controller, port, 0x0800, input_dst_mac, 4094 )
3167
3168 add_unicast_routing_flow( self.controller, 0x0800, dip, 0xffffffff, l3_msg.group_id,
3169 vrf=0 )
3170
3171 add_one_egress_vlan_table_flow( self.controller, out_port, 4094 , inner_vlan, outer_vlan)
3172
3173 Groups._put( l2_gid )
3174 Groups._put( l3_msg.group_id )
3175
3176 # add vlan flow table
3177 add_one_egress_vlan_tpid_table_flow( self.controller, out_port, outer_vlan+0x1000 )
3178 do_barrier( self.controller )
3179
3180 ip_src = '192.168.5.5'
3181 ip_dst = '192.168.0.1'
3182 parsed_pkt = simple_tcp_packet( pktlen=100,
3183 dl_vlan_enable=False,
3184 eth_dst=input_dst_mac_str,
3185 eth_src=input_src_mac_str,
3186 ip_ttl=64,
3187 ip_src=ip_src,
3188 ip_dst=ip_dst )
3189 pkt = str( parsed_pkt )
3190
3191 print("Input Packet %s" % format_packet(pkt))
3192
3193 self.dataplane.send( port, pkt )
3194
3195 # build expect packet
3196 exp_pkt = simple_tcp_packet_two_vlan( pktlen=108,
3197 out_dl_vlan_enable=True,
3198 out_vlan_vid=outer_vlan,
3199 out_vlan_tpid=0x88a8,
3200 in_dl_vlan_enable=True,
3201 in_vlan_vid=inner_vlan,
3202 eth_dst=output_dst_mac_str,
3203 eth_src=input_dst_mac_str,
3204 ip_ttl=63,
3205 ip_src=ip_src,
3206 ip_dst=ip_dst )
3207 pkt = str( exp_pkt )
3208
3209 print("Expected Packet %s" % format_packet(pkt))
3210
3211 verify_packet( self, pkt, out_port )
3212 verify_no_other_packets( self )
3213 finally:
3214 delete_all_flows( self.controller )
3215 delete_groups( self.controller, Groups )
Andreas Pantelopoulosaaa02622018-04-04 15:13:03 -07003216 delete_all_groups( self.controller )
3217
3218class _MplsFwdInterfaceProblem_PW( base_tests.SimpleDataPlane ):
3219 """
3220 Reproduces the pseudowire bug with the wrongly set destination mac address.
3221 """
3222 def runTest( self ):
3223 Groups = Queue.LifoQueue( )
3224 try:
3225 if len( config[ "port_map" ] ) < 1:
3226 logging.info( "Port count less than 1, can't run this case" )
3227 assert (False)
3228 return
3229
3230 macs_to_test = [( [ 0x00, 0x00, 0x00, 0x11, 0x11, 0x00 ], [ 0x00, 0x00, 0x00, 0x22, 0x22, 0x00 ], '00:00:00:11:11:00', '00:00:00:22:22:00'),
3231 ( [ 0x00, 0x00, 0x00, 0x11, 0x22, 0x00 ], [ 0x00, 0x00, 0x00, 0x33, 0x33, 0x00 ], '00:00:00:11:22:00', '00:00:00:33:33:00'),
3232 ( [ 0x00, 0x00, 0x00, 0x11, 0x33, 0x00 ], [ 0x00, 0x00, 0x00, 0x44, 0x44, 0x00 ], '00:00:00:11:33:00', '00:00:00:44:44:00'),
3233 ( [ 0x00, 0x00, 0x00, 0x11, 0x44, 0x00 ], [ 0x00, 0x00, 0x00, 0x55, 0x55, 0x00 ], '00:00:00:11:44:00', '00:00:00:55:55:00'),
3234 ( [ 0x00, 0x00, 0x00, 0x11, 0x55, 0x00 ], [ 0x00, 0x00, 0x00, 0x66, 0x66, 0x00 ], '00:00:00:11:55:00', '00:00:00:66:66:00')]
3235
3236 for dummy_dst_mac, dst_mac, mac_dst_dummy, mac_dst in macs_to_test:
3237
3238 dip = 0xc0a80001
3239 intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc ]
3240
3241 out_port = 12
3242 port = 24
3243 # Shift MPLS label and VLAN ID by 16 to avoid reserved values
3244 vlan_id = port + 16
3245 mpls_label = port + 16
3246
3247 in_port = 24
3248 ip_src = '192.168.%02d.1' % (in_port)
3249
3250 # create dummy groups
3251 id = port
3252 l2_gid, l2_msg = add_one_l2_interface_group( self.controller, out_port, vlan_id, False, False)
3253 mpls_gid, mpls_msg = add_mpls_intf_group( self.controller, l2_gid, dummy_dst_mac, intf_src_mac,
3254 vlan_id, id, send_barrier=True)
3255 do_barrier( self.controller )
3256
3257 # PW Case.
3258 raw_input("Press anything to move on with pseudowire rules, after that you should see the updated groups in the switch.")
3259 logging.info("Installing entries for pseudowire!")
3260 switch_mac = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
3261 mpls_label = 100
3262 mpls_label_SR2 = 100 + 10
3263 mpls_label_PW = 100 + 15
3264
3265 print("Install MPLS intf group for dst mac {0}", dst_mac)
3266 # add MPLS interface group
3267 mpls_intf_gid, mpls_intf_msg = add_mpls_intf_group(
3268 ctrl=self.controller,
3269 ref_gid=l2_gid,
3270 dst_mac=dst_mac,
3271 src_mac=intf_src_mac,
3272 vid=vlan_id,
3273 index=id,
3274 add=False,
3275 send_barrier=True
3276 )
3277
3278 # add MPLS flow with BoS=0
3279 add_mpls_flow_pw(
3280 ctrl=self.controller,
3281 action_group_id=mpls_intf_gid,
3282 label=mpls_label_SR2,
3283 ethertype=0x8847,
3284 tunnel_index=1,
3285 bos=0
3286 )
3287
3288 # add Termination flow
3289 add_termination_flow(
3290 ctrl=self.controller,
3291 in_port=in_port,
3292 eth_type=0x8847,
3293 dst_mac=intf_src_mac,
3294 vlanid=vlan_id,
3295 goto_table=23
3296 )
3297
3298 # add VLAN flows
3299 add_one_vlan_table_flow(
3300 ctrl=self.controller,
3301 of_port=in_port,
3302 vlan_id=vlan_id,
3303 flag=VLAN_TABLE_FLAG_ONLY_TAG,
3304 )
3305 add_one_vlan_table_flow(
3306 ctrl=self.controller,
3307 of_port=in_port,
3308 vlan_id=vlan_id,
3309 flag=VLAN_TABLE_FLAG_ONLY_UNTAG
3310 )
3311 # Packet generation with sleep
3312 time.sleep(2)
3313 label_SR2 = (mpls_label_SR2, 0, 0, 32)
3314 label_2 = (mpls_label_PW, 0, 1, 32)
3315
3316 # set to false to test if routing traffic
3317 # comes through
3318 raw_input("Press enter to send the packet, inspect the groups in the switch!")
3319 print("Sending packet with dst mac {0} and labels {1}".format(switch_mac, [label_SR2, label_2]))
3320 parsed_pkt = mpls_packet(
3321 pktlen=104,
3322 ip_ttl=63,
3323 label=[label_SR2, label_2],
3324 encapsulated_ethernet = True,
3325 eth_dst=switch_mac
3326 )
3327
3328 pkt = str( parsed_pkt )
3329 self.dataplane.send( in_port, pkt )
3330
3331 expected_label = (mpls_label_PW, 0, 1, 31)
3332 print("Expecting packet with dst mac {0} and labels {1}".format(mac_dst, [label_2]))
3333 parsed_pkt = mpls_packet(
3334 pktlen=100,
3335 ip_ttl=63,
3336 eth_dst=mac_dst,
3337 eth_src=switch_mac,
3338 label=[ expected_label ],
3339 encapsulated_ethernet = True
3340 )
3341
3342 pkt = str( parsed_pkt )
3343 verify_packet( self, pkt, out_port )
3344 verify_no_packet( self, pkt, in_port )
3345
3346 delete_all_flows( self.controller )
3347 delete_groups( self.controller, Groups )
3348 delete_all_groups( self.controller )
3349
3350 finally:
3351 delete_all_flows( self.controller )
3352 delete_groups( self.controller, Groups )
3353 delete_all_groups( self.controller )
3354
3355