ptf/sainexthop.py (973 lines of code) (raw):
# Copyright 2021-present Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Thrift SAI interface RIF tests
"""
from sai_thrift.sai_headers import *
from ptf.mask import *
from ptf.packet import *
from ptf.testutils import *
from ptf.thriftutils import *
from sai_base_test import *
class L3NexthopTestHelper(PlatformSaiHelper):
"""
Basic L3 nexthop tests.
Configuration
+----------+-----------+
| port0 | port0_rif |
+----------+-----------+
| port1 | port1_rif |
+----------+-----------+
"""
def setUp(self):
super(L3NexthopTestHelper, self).setUp()
self.create_routing_interfaces(ports=[0, 1])
def tearDown(self):
self.destroy_routing_interfaces()
super(L3NexthopTestHelper, self).tearDown()
class removeNexthopTest(L3NexthopTestHelper):
"""
Test verifies correct nexthop removal.
"""
def setUp(self):
super(removeNexthopTest, self).setUp()
def runTest(self):
print("RemoveNexthopTest")
neighbor_entry = sai_thrift_neighbor_entry_t(
rif_id=self.port0_rif, ip_address=sai_ipaddress('10.10.10.10'))
sai_thrift_create_neighbor_entry(self.client, neighbor_entry,
dst_mac_address='00:99:99:99:99:99')
nhop = sai_thrift_create_next_hop(self.client,
ip=sai_ipaddress('10.10.10.10'),
router_interface_id=self.port0_rif,
type=SAI_NEXT_HOP_TYPE_IP)
route1 = sai_thrift_route_entry_t(
vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.2/32'))
sai_thrift_create_route_entry(self.client, route1, next_hop_id=nhop)
route2 = sai_thrift_route_entry_t(
vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.3/32'))
sai_thrift_create_route_entry(self.client, route2, next_hop_id=nhop)
route3 = sai_thrift_route_entry_t(
vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.4/32'))
sai_thrift_create_route_entry(self.client, route3, next_hop_id=nhop)
try:
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ip_dst='10.10.10.2',
ip_src='192.168.0.1',
ip_id=105,
ip_ttl=64)
exp_pkt = simple_tcp_packet(
eth_dst='00:99:99:99:99:99',
eth_src=ROUTER_MAC,
ip_dst='10.10.10.2',
ip_src='192.168.0.1',
ip_id=105,
ip_ttl=63)
print("Sending packet on port %d, forward" % self.dev_port1)
send_packet(self, self.dev_port1, pkt)
verify_packet(self, exp_pkt, self.dev_port0)
sai_thrift_remove_next_hop(self.client, nhop)
pre_stats = query_counter(
self, sai_thrift_get_queue_stats, self.cpu_queue0)
print("Sending packet on port %d, forward" % self.dev_port1)
send_packet(self, self.dev_port1, pkt)
time.sleep(4)
post_stats = query_counter(
self, sai_thrift_get_queue_stats, self.cpu_queue0)
self.assertEqual(
post_stats["SAI_QUEUE_STAT_PACKETS"] -
pre_stats["SAI_QUEUE_STAT_PACKETS"],
1)
finally:
sai_thrift_remove_route_entry(self.client, route3)
sai_thrift_remove_route_entry(self.client, route2)
sai_thrift_remove_route_entry(self.client, route1)
sai_thrift_remove_next_hop(self.client, nhop)
sai_thrift_remove_neighbor_entry(self.client, neighbor_entry)
def tearDown(self):
super(removeNexthopTest, self).tearDown()
class cpuNexthopTest(L3NexthopTestHelper):
'''
Test verifies nexthop to CPU.
'''
def setUp(self):
super(cpuNexthopTest, self).setUp()
def runTest(self):
print("cpuNexthopTest")
print("Creating hostif trap for IP2ME")
trap_group = sai_thrift_create_hostif_trap_group(
self.client, admin_state=True, queue=4)
trap = sai_thrift_create_hostif_trap(
self.client, trap_group=trap_group,
trap_type=SAI_HOSTIF_TRAP_TYPE_IP2ME,
packet_action=SAI_PACKET_ACTION_TRAP,
trap_priority=1)
attr = sai_thrift_get_switch_attribute(self.client, cpu_port=True)
cpu_port = attr['cpu_port']
host_ipv4 = sai_thrift_route_entry_t(
vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32'))
sai_thrift_create_route_entry(self.client, host_ipv4,
next_hop_id=cpu_port)
lpm_ipv4 = sai_thrift_route_entry_t(
vr_id=self.default_vrf, destination=sai_ipprefix('20.20.20.0/24'))
sai_thrift_create_route_entry(self.client, lpm_ipv4,
next_hop_id=cpu_port)
ipv6 = '1234:5678:9abc:def0:1122:3344:5566:7788/128'
host_ipv6 = sai_thrift_route_entry_t(
vr_id=self.default_vrf,
destination=sai_ipprefix(ipv6))
sai_thrift_create_route_entry(self.client, host_ipv6,
next_hop_id=cpu_port)
lpm_ipv6 = sai_thrift_route_entry_t(
vr_id=self.default_vrf, destination=sai_ipprefix('4000::0/65'))
sai_thrift_create_route_entry(self.client, lpm_ipv6,
next_hop_id=cpu_port)
pkt1 = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ip_dst='10.10.10.1',
ip_src='192.168.0.1',
ip_id=105,
ip_ttl=64)
pkt2 = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ip_dst='20.20.20.1',
ip_src='192.168.0.1',
ip_id=105,
ip_ttl=64)
pkt3 = simple_tcpv6_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ipv6_dst='1234:5678:9abc:def0:1122:3344:5566:7788',
ipv6_src='2000::1',
ipv6_hlim=64)
pkt4 = simple_tcpv6_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ipv6_dst='4000::1',
ipv6_src='2000::1',
ipv6_hlim=64)
try:
pre_stats = query_counter(
self, sai_thrift_get_queue_stats, self.cpu_queue4)
print("Sending packet on port %d, forward to CPU, host ipv4" %
self.dev_port0)
send_packet(self, self.dev_port0, pkt1)
print("Sending packet on port %d, forward to CPU, lpm ipv4" %
self.dev_port0)
send_packet(self, self.dev_port0, pkt2)
print("Sending packet on port %d, forward to CPU, host ipv6" %
self.dev_port0)
send_packet(self, self.dev_port0, pkt3)
print("Sending packet on port %d, forward to CPU, lpm ipv6" %
self.dev_port0)
send_packet(self, self.dev_port0, pkt4)
time.sleep(4)
post_stats = query_counter(
self, sai_thrift_get_queue_stats, self.cpu_queue4)
self.assertEqual(
post_stats["SAI_QUEUE_STAT_PACKETS"] -
pre_stats["SAI_QUEUE_STAT_PACKETS"],
4)
finally:
sai_thrift_remove_route_entry(self.client, host_ipv6)
sai_thrift_remove_route_entry(self.client, lpm_ipv6)
sai_thrift_remove_route_entry(self.client, host_ipv4)
sai_thrift_remove_route_entry(self.client, lpm_ipv4)
sai_thrift_remove_hostif_trap(self.client, trap)
sai_thrift_remove_hostif_trap_group(self.client, trap_group)
def tearDown(self):
super(cpuNexthopTest, self).tearDown()
class NhopTunnelEncapDecapTestHelper(PlatformSaiHelper):
'''
Nexthop tunnel encapsulation and decapsulation tests.
'''
def setUp(self):
super(NhopTunnelEncapDecapTestHelper, self).setUp()
# underlay config
self.uvrf = sai_thrift_create_virtual_router(self.client)
self.vm_ip4 = '100.100.1.1'
self.vm_ip6 = '1234:5678:9abc:def0:4422:1133:5577:9951'
self.customer_ip4 = '100.100.0.1'
self.customer_ip6 = '1234:5678:9abc:def0:4422:1133:5577:0011'
self.my_lb_ip = '10.10.10.10'
self.tunnel_ip = '10.10.10.1'
self.tunnel_ip_mask = '10.10.10.1/32'
self.inner_dmac = '00:33:33:33:33:33'
self.underlay_neighbor_mac = '00:11:11:11:11:11'
self.default_rmac = '00:BA:7E:F0:00:00'
# overlay config
self.ovrf = sai_thrift_create_virtual_router(self.client)
self.tunnel_type = SAI_TUNNEL_TYPE_IPINIP
self.term_type = SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2P
self.ttl_mode = SAI_TUNNEL_TTL_MODE_PIPE_MODEL
self.urif_lb = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_LOOPBACK,
virtual_router_id=self.uvrf)
# create underlay loopback rif for tunnel
self.orif_lb = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_LOOPBACK,
virtual_router_id=self.ovrf)
# create route to tunnel ip 10.10.10.1
self.urif = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT,
virtual_router_id=self.uvrf, port_id=self.port25)
self.uneighbor = sai_thrift_neighbor_entry_t(
rif_id=self.urif, ip_address=sai_ipaddress(self.tunnel_ip))
sai_thrift_create_neighbor_entry(
self.client, self.uneighbor,
dst_mac_address=self.underlay_neighbor_mac)
self.unhop = sai_thrift_create_next_hop(
self.client, ip=sai_ipaddress(self.tunnel_ip),
router_interface_id=self.urif, type=SAI_NEXT_HOP_TYPE_IP)
self.tunnel_entry1 = sai_thrift_route_entry_t(
vr_id=self.uvrf, destination=sai_ipprefix(self.tunnel_ip_mask))
sai_thrift_create_route_entry(self.client, self.tunnel_entry1,
next_hop_id=self.unhop)
# create tunnel
self.tunnel = sai_thrift_create_tunnel(
self.client, type=self.tunnel_type,
encap_src_ip=sai_ipaddress(self.my_lb_ip),
encap_ttl_mode=self.ttl_mode,
decap_ttl_mode=self.ttl_mode,
underlay_interface=self.urif_lb, overlay_interface=self.orif_lb)
# create tunnel termination entry
self.tunnel_term = sai_thrift_create_tunnel_term_table_entry(
self.client, tunnel_type=self.tunnel_type, type=self.term_type,
vr_id=self.uvrf, action_tunnel_id=self.tunnel,
src_ip=sai_ipaddress(self.tunnel_ip),
dst_ip=sai_ipaddress(self.my_lb_ip))
# create tunnel nhop for VM 100.100.1.1
self.tunnel_nexthop = sai_thrift_create_next_hop(
self.client, type=SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP,
tunnel_id=self.tunnel, tunnel_mac=self.inner_dmac,
ip=sai_ipaddress(self.tunnel_ip))
# add route to tunnel_nexthop
self.customer_route1 = sai_thrift_route_entry_t(
vr_id=self.ovrf, destination=sai_ipprefix(self.vm_ip4+'/32'))
sai_thrift_create_route_entry(self.client, self.customer_route1,
next_hop_id=self.tunnel_nexthop)
self.customer_route2 = sai_thrift_route_entry_t(
vr_id=self.ovrf, destination=sai_ipprefix(self.vm_ip6+'/128'))
sai_thrift_create_route_entry(self.client, self.customer_route2,
next_hop_id=self.tunnel_nexthop)
def tearDown(self):
sai_thrift_remove_route_entry(self.client, self.customer_route2)
sai_thrift_remove_route_entry(self.client, self.customer_route1)
sai_thrift_remove_next_hop(self.client, self.tunnel_nexthop)
sai_thrift_remove_tunnel_term_table_entry(self.client,
self.tunnel_term)
sai_thrift_remove_tunnel(self.client, self.tunnel)
sai_thrift_remove_route_entry(self.client, self.tunnel_entry1)
sai_thrift_remove_next_hop(self.client, self.unhop)
sai_thrift_remove_neighbor_entry(self.client, self.uneighbor)
sai_thrift_remove_router_interface(self.client, self.urif)
sai_thrift_remove_router_interface(self.client, self.orif_lb)
sai_thrift_remove_router_interface(self.client, self.urif_lb)
sai_thrift_remove_virtual_router(self.client, self.ovrf)
sai_thrift_remove_virtual_router(self.client, self.uvrf)
super(NhopTunnelEncapDecapTestHelper, self).tearDown()
class l3InterfaceTunnelTest(NhopTunnelEncapDecapTestHelper):
'''
Test verifies l3 interface tunnel nexthop.
'''
def setUp(self):
super(l3InterfaceTunnelTest, self).setUp()
def runTest(self):
print("l3InterfaceTunnelTest")
try:
orif = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT,
port_id=self.port24, virtual_router_id=self.ovrf)
oneighbor4 = sai_thrift_neighbor_entry_t(
rif_id=orif, ip_address=sai_ipaddress(self.customer_ip4))
sai_thrift_create_neighbor_entry(
self.client, oneighbor4, dst_mac_address='00:22:22:22:22:33')
onhop4 = sai_thrift_create_next_hop(
self.client, ip=sai_ipaddress(self.customer_ip4),
router_interface_id=orif, type=SAI_NEXT_HOP_TYPE_IP)
customer_route3 = sai_thrift_route_entry_t(
vr_id=self.ovrf,
destination=sai_ipprefix(self.customer_ip4+'/32'))
sai_thrift_create_route_entry(self.client, customer_route3,
next_hop_id=onhop4)
print("Verifying IP 4in4 (encap)")
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:33',
ip_dst=self.vm_ip4,
ip_src=self.customer_ip4,
ip_id=108,
ip_ttl=64)
pkt2 = simple_tcp_packet(
eth_dst=self.inner_dmac,
eth_src=self.default_rmac,
ip_dst=self.vm_ip4,
ip_src=self.customer_ip4,
ip_id=108,
ip_ttl=63)
ipip_pkt = simple_ipv4ip_packet(
eth_dst=self.underlay_neighbor_mac,
eth_src=ROUTER_MAC,
ip_id=0,
ip_src='10.10.10.10',
ip_dst='10.10.10.1',
ip_ttl=64,
inner_frame=pkt2['IP'])
send_packet(self, self.dev_port24, pkt)
verify_packet(self, ipip_pkt, self.dev_port25)
print("Verifying IP 4in4 (decap)")
pkt1 = simple_tcp_packet(
eth_src=ROUTER_MAC,
eth_dst=self.inner_dmac,
ip_dst=self.customer_ip4,
ip_src=self.vm_ip4,
ip_id=108,
ip_ttl=64)
pkt2 = simple_tcp_packet(
eth_src=ROUTER_MAC,
eth_dst='00:22:22:22:22:33',
ip_dst=self.customer_ip4,
ip_src=self.vm_ip4,
ip_id=108,
ip_ttl=63)
ipip_pkt = simple_ipv4ip_packet(
eth_dst=ROUTER_MAC,
eth_src=self.underlay_neighbor_mac,
ip_id=0,
ip_src='10.10.10.1',
ip_dst='10.10.10.10',
ip_ttl=64,
inner_frame=pkt1['IP'])
send_packet(self, self.dev_port25, ipip_pkt)
verify_packet(self, pkt2, self.dev_port24)
finally:
sai_thrift_remove_route_entry(self.client, customer_route3)
sai_thrift_remove_next_hop(self.client, onhop4)
sai_thrift_remove_neighbor_entry(self.client, oneighbor4)
sai_thrift_remove_router_interface(self.client, orif)
def tearDown(self):
super(l3InterfaceTunnelTest, self).tearDown()
class subPortTunnelTest(NhopTunnelEncapDecapTestHelper):
'''
Test verifies subport tunnel nexthop.
'''
def setUp(self):
super(subPortTunnelTest, self).setUp()
def runTest(self):
print("subPortTunnelTest")
try:
osubport = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT,
virtual_router_id=self.ovrf, port_id=self.port24,
admin_v4_state=True, outer_vlan_id=500)
oneighbor = sai_thrift_neighbor_entry_t(
rif_id=osubport, ip_address=sai_ipaddress(self.customer_ip4))
sai_thrift_create_neighbor_entry(
self.client, oneighbor, dst_mac_address="00:22:22:22:22:33")
onhop = sai_thrift_create_next_hop(
self.client, ip=sai_ipaddress(self.customer_ip4),
router_interface_id=osubport, type=SAI_NEXT_HOP_TYPE_IP)
customer_route3 = sai_thrift_route_entry_t(
vr_id=self.ovrf,
destination=sai_ipprefix(self.customer_ip4+'/32'))
sai_thrift_create_route_entry(self.client, customer_route3,
next_hop_id=onhop)
print("Verifying IP 4in4 (encap)")
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:33',
ip_dst=self.vm_ip4,
ip_src=self.customer_ip4,
dl_vlan_enable=True,
vlan_vid=500,
ip_id=108,
ip_ttl=64)
pkt2 = simple_tcp_packet(
eth_dst=self.inner_dmac,
eth_src=self.default_rmac,
ip_dst=self.vm_ip4,
ip_src=self.customer_ip4,
dl_vlan_enable=True,
vlan_vid=500,
ip_id=108,
ip_ttl=63)
ipip_pkt = simple_ipv4ip_packet(
eth_dst=self.underlay_neighbor_mac,
eth_src=ROUTER_MAC,
ip_id=0,
ip_src='10.10.10.10',
ip_dst='10.10.10.1',
ip_ttl=64,
inner_frame=pkt2['IP'])
send_packet(self, self.dev_port24, pkt)
verify_packet(self, ipip_pkt, self.dev_port25)
print("Verifying IP 4in4 (decap)")
pkt1 = simple_tcp_packet(
eth_src=ROUTER_MAC,
eth_dst=self.inner_dmac,
ip_dst=self.customer_ip4,
ip_src=self.vm_ip4,
dl_vlan_enable=True,
vlan_vid=500,
ip_id=108,
ip_ttl=64)
pkt2 = simple_tcp_packet(
eth_src=ROUTER_MAC,
eth_dst='00:22:22:22:22:33',
ip_dst=self.customer_ip4,
ip_src=self.vm_ip4,
dl_vlan_enable=True,
vlan_vid=500,
ip_id=108,
ip_ttl=63)
ipip_pkt = simple_ipv4ip_packet(
eth_dst=ROUTER_MAC,
eth_src=self.underlay_neighbor_mac,
ip_id=0,
ip_src='10.10.10.1',
ip_dst='10.10.10.10',
ip_ttl=64,
inner_frame=pkt1['IP'])
send_packet(self, self.dev_port25, ipip_pkt)
verify_packet(self, pkt2, self.dev_port24)
finally:
sai_thrift_remove_route_entry(self.client, customer_route3)
sai_thrift_remove_next_hop(self.client, onhop)
sai_thrift_remove_neighbor_entry(self.client, oneighbor)
sai_thrift_remove_router_interface(self.client, osubport)
def tearDown(self):
super(subPortTunnelTest, self).tearDown()
class sviTunnelTest(NhopTunnelEncapDecapTestHelper):
'''
Test verifies SVI tunnel nexthop.
'''
def setUp(self):
super(sviTunnelTest, self).setUp()
def runTest(self):
print("sviTunnelTest")
try:
port24_bp = sai_thrift_create_bridge_port(
self.client, bridge_id=self.default_1q_bridge,
port_id=self.port24, type=SAI_BRIDGE_PORT_TYPE_PORT)
port26_bp = sai_thrift_create_bridge_port(
self.client, bridge_id=self.default_1q_bridge,
port_id=self.port26, type=SAI_BRIDGE_PORT_TYPE_PORT)
# vlan100 with members port24 and port26
vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100)
vlan_member100 = sai_thrift_create_vlan_member(
self.client, vlan_id=vlan100, bridge_port_id=port24_bp,
vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED)
vlan_member101 = sai_thrift_create_vlan_member(
self.client, vlan_id=vlan100, bridge_port_id=port26_bp,
vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED)
sai_thrift_set_port_attribute(self.client, self.port24,
port_vlan_id=100)
sai_thrift_set_port_attribute(self.client, self.port26,
port_vlan_id=100)
# create vlan100_rif
osvi = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN,
virtual_router_id=self.ovrf, vlan_id=vlan100)
oneighbor = sai_thrift_neighbor_entry_t(
rif_id=osvi, ip_address=sai_ipaddress(self.customer_ip4))
sai_thrift_create_neighbor_entry(
self.client, oneighbor, dst_mac_address="00:22:22:22:22:33")
onhop = sai_thrift_create_next_hop(
self.client, ip=sai_ipaddress(self.customer_ip4),
router_interface_id=osvi, type=SAI_NEXT_HOP_TYPE_IP)
customer_route3 = sai_thrift_route_entry_t(
vr_id=self.ovrf,
destination=sai_ipprefix(self.customer_ip4+'/32'))
sai_thrift_create_route_entry(self.client, customer_route3,
next_hop_id=onhop)
test_fdb = sai_thrift_fdb_entry_t(
switch_id=self.switch_id,
mac_address="00:22:22:22:22:33",
bv_id=vlan100)
sai_thrift_create_fdb_entry(self.client,
test_fdb,
type=SAI_FDB_ENTRY_TYPE_STATIC,
bridge_port_id=port24_bp)
print("Verifying IP 4in4 (encap)")
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:33',
ip_dst=self.vm_ip4,
ip_src=self.customer_ip4,
ip_id=108,
ip_ttl=64)
pkt2 = simple_tcp_packet(
eth_dst=self.inner_dmac,
eth_src=self.default_rmac,
ip_dst=self.vm_ip4,
ip_src=self.customer_ip4,
ip_id=108,
ip_ttl=63)
ipip_pkt = simple_ipv4ip_packet(
eth_dst=self.underlay_neighbor_mac,
eth_src=ROUTER_MAC,
ip_id=0,
ip_src='10.10.10.10',
ip_dst='10.10.10.1',
ip_ttl=64,
inner_frame=pkt2['IP'])
send_packet(self, self.dev_port24, pkt)
verify_packet(self, ipip_pkt, self.dev_port25)
print("Verifying IP 4in4 (decap)")
pkt1 = simple_tcp_packet(
eth_src=ROUTER_MAC,
eth_dst=self.inner_dmac,
ip_dst=self.customer_ip4,
ip_src=self.vm_ip4,
ip_id=108,
ip_ttl=64)
pkt2 = simple_tcp_packet(
eth_src=ROUTER_MAC,
eth_dst='00:22:22:22:22:33',
ip_dst=self.customer_ip4,
ip_src=self.vm_ip4,
ip_id=108,
ip_ttl=63)
ipip_pkt = simple_ipv4ip_packet(
eth_dst=ROUTER_MAC,
eth_src=self.underlay_neighbor_mac,
ip_id=0,
ip_src='10.10.10.1',
ip_dst='10.10.10.10',
ip_ttl=64,
inner_frame=pkt1['IP'])
send_packet(self, self.dev_port25, ipip_pkt)
verify_packet(self, pkt2, self.dev_port24)
finally:
sai_thrift_remove_fdb_entry(self.client, test_fdb)
sai_thrift_remove_route_entry(self.client, customer_route3)
sai_thrift_remove_next_hop(self.client, onhop)
sai_thrift_remove_neighbor_entry(self.client, oneighbor)
sai_thrift_remove_router_interface(self.client, osvi)
sai_thrift_set_port_attribute(self.client, self.port24,
port_vlan_id=0)
sai_thrift_set_port_attribute(self.client, self.port26,
port_vlan_id=0)
sai_thrift_remove_vlan_member(self.client, vlan_member100)
sai_thrift_remove_vlan_member(self.client, vlan_member101)
sai_thrift_remove_vlan(self.client, vlan100)
sai_thrift_remove_bridge_port(self.client, port24_bp)
sai_thrift_remove_bridge_port(self.client, port26_bp)
def tearDown(self):
super(sviTunnelTest, self).tearDown()
class NhopTunnelVNITestHelper(PlatformSaiHelper):
'''
Nexthop tunnel VNI tests.
'''
def setUp(self):
super(NhopTunnelVNITestHelper, self).setUp()
# underlay config
self.uvrf = sai_thrift_create_virtual_router(self.client)
self.vm_ip = '100.100.1.1'
self.vm_ip2 = '100.100.2.1'
self.customer_ip = '100.100.3.1'
self.vni = 2000
self.my_lb_ip = '10.10.10.10'
self.tunnel_ip = '10.10.10.1'
self.tunnel_ip2 = '10.10.10.3'
self.tunnel_ip3 = '10.10.10.4'
self.inner_dmac = '00:33:33:33:33:33'
self.inner_dmac2 = '00:33:33:33:33:44'
self.inner_dmac3 = '00:33:33:33:33:55'
self.inner_dmac4 = '00:33:33:33:33:66'
self.underlay_neighbor_mac = '00:11:11:11:11:11'
self.underlay_neighbor_mac2 = '00:11:11:11:11:22'
self.underlay_neighbor_mac3 = '00:11:11:11:11:33'
self.default_rmac = '00:BA:7E:F0:00:00' # from bf_switch_device_add
# overlay config
self.ovrf = sai_thrift_create_virtual_router(self.client)
self.tunnel_type = SAI_TUNNEL_TYPE_VXLAN
self.term_type = SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2MP
self.ttl_mode = SAI_TUNNEL_TTL_MODE_PIPE_MODEL
# create underlay loopback rif for tunnel
self.urif_lb = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_LOOPBACK,
virtual_router_id=self.uvrf)
self.orif = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT,
virtual_router_id=self.ovrf,
port_id=self.port24)
# Encap configuration follows
# create Encap/Decap mappers
self.encap_tunnel_map = sai_thrift_create_tunnel_map(
self.client, type=SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI)
self.decap_tunnel_map = sai_thrift_create_tunnel_map(
self.client, type=SAI_TUNNEL_MAP_TYPE_VNI_TO_VIRTUAL_ROUTER_ID)
# create Encap/Decap mapper entries for ovrf
self.encap_tunnel_map_entry = sai_thrift_create_tunnel_map_entry(
self.client,
tunnel_map_type=SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI,
tunnel_map=self.encap_tunnel_map, virtual_router_id_key=self.ovrf,
virtual_router_id_value=self.ovrf, vni_id_key=self.vni,
vni_id_value=self.vni)
self.decap_tunnel_map_entry = sai_thrift_create_tunnel_map_entry(
self.client,
tunnel_map_type=SAI_TUNNEL_MAP_TYPE_VNI_TO_VIRTUAL_ROUTER_ID,
tunnel_map=self.decap_tunnel_map, virtual_router_id_key=self.ovrf,
virtual_router_id_value=self.ovrf, vni_id_key=self.vni,
vni_id_value=self.vni)
encap_mappers_list = [self.encap_tunnel_map]
decap_mappers_list = [self.decap_tunnel_map]
self.encap_mappers_objlist = sai_thrift_object_list_t(
count=1, idlist=encap_mappers_list)
self.decap_mappers_objlist = sai_thrift_object_list_t(
count=1, idlist=decap_mappers_list)
self.tunnel = sai_thrift_create_tunnel(
self.client, type=self.tunnel_type,
encap_src_ip=sai_ipaddress(self.my_lb_ip),
decap_mappers=self.decap_mappers_objlist,
encap_mappers=self.encap_mappers_objlist,
encap_ttl_mode=self.ttl_mode,
decap_ttl_mode=self.ttl_mode,
underlay_interface=self.urif_lb)
def tearDown(self):
sai_thrift_remove_tunnel(self.client, self.tunnel)
sai_thrift_remove_tunnel_map_entry(self.client,
self.decap_tunnel_map_entry)
sai_thrift_remove_tunnel_map_entry(self.client,
self.encap_tunnel_map_entry)
sai_thrift_remove_tunnel_map(self.client, self.decap_tunnel_map)
sai_thrift_remove_tunnel_map(self.client, self.encap_tunnel_map)
sai_thrift_remove_router_interface(self.client, self.orif)
sai_thrift_remove_router_interface(self.client, self.urif_lb)
sai_thrift_remove_virtual_router(self.client, self.ovrf)
sai_thrift_remove_virtual_router(self.client, self.uvrf)
super(NhopTunnelVNITestHelper, self).tearDown()
class tunnelVniTest(NhopTunnelVNITestHelper):
'''
Test verifies correct tunnel VNI behavior.
'''
def setUp(self):
super(tunnelVniTest, self).setUp()
def runTest(self):
print("tunnelVniTest")
vni2 = 5000
service_vm_ip = "200.200.200.2"
service_vtep_ip = "30.30.30.3"
service_vni = 3000
service_vni2 = 4000
try:
urif1 = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT,
port_id=self.port25, virtual_router_id=self.uvrf)
uneighbor1 = sai_thrift_neighbor_entry_t(
rif_id=urif1, ip_address=sai_ipaddress(self.tunnel_ip))
sai_thrift_create_neighbor_entry(
self.client, uneighbor1,
dst_mac_address=self.underlay_neighbor_mac)
unhop1 = sai_thrift_create_next_hop(
self.client, ip=sai_ipaddress('10.10.10.1'),
router_interface_id=urif1, type=SAI_NEXT_HOP_TYPE_IP)
tunnel_route1 = sai_thrift_route_entry_t(
vr_id=self.uvrf, destination=sai_ipprefix('10.10.10.1/32'))
sai_thrift_create_route_entry(self.client, tunnel_route1,
next_hop_id=unhop1)
urif2 = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT,
port_id=self.port26, virtual_router_id=self.uvrf)
uneighbor2 = sai_thrift_neighbor_entry_t(
rif_id=urif2, ip_address=sai_ipaddress(service_vtep_ip))
sai_thrift_create_neighbor_entry(
self.client, uneighbor2,
dst_mac_address=self.underlay_neighbor_mac2)
unhop2 = sai_thrift_create_next_hop(
self.client, ip=sai_ipaddress('30.30.30.3'),
router_interface_id=urif2, type=SAI_NEXT_HOP_TYPE_IP)
tunnel_route2 = sai_thrift_route_entry_t(
vr_id=self.uvrf, destination=sai_ipprefix('30.30.30.3/32'))
sai_thrift_create_route_entry(self.client, tunnel_route2,
next_hop_id=unhop2)
tunnel_nexthop1 = sai_thrift_create_next_hop(
self.client, type=SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP,
tunnel_id=self.tunnel, ip=sai_ipaddress(self.tunnel_ip),
tunnel_vni=self.vni, tunnel_mac=self.inner_dmac)
tunnel_nexthop2 = sai_thrift_create_next_hop(
self.client, type=SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP,
tunnel_id=self.tunnel, ip=sai_ipaddress(self.tunnel_ip),
tunnel_vni=vni2, tunnel_mac=self.inner_dmac)
self.assertNotEqual(
tunnel_nexthop2, 0,
"Failed to create nexthop to same dest ip with different vni")
tunnel_nexthop3 = sai_thrift_create_next_hop(
self.client, type=SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP,
tunnel_id=self.tunnel, ip=sai_ipaddress(service_vtep_ip),
tunnel_vni=service_vni, tunnel_mac=self.inner_dmac3)
customer_route1 = sai_thrift_route_entry_t(
vr_id=self.ovrf, destination=sai_ipprefix(self.vm_ip+'/32'))
sai_thrift_create_route_entry(self.client, customer_route1,
next_hop_id=tunnel_nexthop1)
customer_route2 = sai_thrift_route_entry_t(
vr_id=self.ovrf, destination=sai_ipprefix(self.vm_ip2+'/32'))
sai_thrift_create_route_entry(self.client, customer_route2,
next_hop_id=tunnel_nexthop2)
customer_route3 = sai_thrift_route_entry_t(
vr_id=self.ovrf, destination=sai_ipprefix(service_vm_ip+'/32'))
sai_thrift_create_route_entry(self.client, customer_route3,
next_hop_id=tunnel_nexthop3)
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ip_dst=self.vm_ip,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=64)
inner_pkt = simple_tcp_packet(
eth_dst=self.inner_dmac,
eth_src=ROUTER_MAC,
ip_dst=self.vm_ip,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=63)
vxlan_pkt = Mask(simple_vxlan_packet(
eth_src=ROUTER_MAC,
eth_dst=self.underlay_neighbor_mac,
ip_id=0,
ip_src=self.my_lb_ip,
ip_dst=self.tunnel_ip,
ip_ttl=64,
ip_flags=0x2,
with_udp_chksum=False,
vxlan_vni=self.vni,
inner_frame=inner_pkt))
vxlan_pkt.set_do_not_care_scapy(UDP, 'sport')
print("Sending packet on port %d to vni %d" %
(self.dev_port24, self.vni))
send_packet(self, self.dev_port24, pkt)
verify_packet(self, vxlan_pkt, self.dev_port25)
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ip_dst=self.vm_ip2,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=64)
inner_pkt = simple_tcp_packet(
eth_dst=self.inner_dmac,
eth_src=ROUTER_MAC,
ip_dst=self.vm_ip2,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=63)
vxlan_pkt = Mask(simple_vxlan_packet(
eth_src=ROUTER_MAC,
eth_dst=self.underlay_neighbor_mac,
ip_id=0,
ip_src=self.my_lb_ip,
ip_dst=self.tunnel_ip,
ip_ttl=64,
ip_flags=0x2,
with_udp_chksum=False,
vxlan_vni=vni2,
inner_frame=inner_pkt))
vxlan_pkt.set_do_not_care_scapy(UDP, 'sport')
print("Sending packet on port %d to vni %d" %
(self.dev_port24, vni2))
send_packet(self, self.dev_port24, pkt)
verify_packet(self, vxlan_pkt, self.dev_port25)
print("Updating nexthop tunnel mac {} -> {}".format(
self.inner_dmac3,
self.inner_dmac4))
sai_thrift_set_next_hop_attribute(
self.client, tunnel_nexthop3, tunnel_mac=self.inner_dmac4)
print(sai_thrift_get_next_hop_attribute(
self.client, tunnel_nexthop3, tunnel_mac=True))
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ip_dst=service_vm_ip,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=64)
inner_pkt = simple_tcp_packet(
eth_dst=self.inner_dmac4,
eth_src=ROUTER_MAC,
ip_dst=service_vm_ip,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=63)
vxlan_pkt = Mask(simple_vxlan_packet(
eth_src=ROUTER_MAC,
eth_dst=self.underlay_neighbor_mac2,
ip_id=0,
ip_src=self.my_lb_ip,
ip_dst=service_vtep_ip,
ip_ttl=64,
ip_flags=0x2,
with_udp_chksum=False,
vxlan_vni=service_vni,
inner_frame=inner_pkt))
vxlan_pkt.set_do_not_care_scapy(UDP, 'sport')
print("Sending packet on port %d to vni %d" %
(self.dev_port24, service_vni))
send_packet(self, self.dev_port24, pkt)
verify_packet(self, vxlan_pkt, self.dev_port26)
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ip_dst=service_vm_ip,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=64)
inner_pkt = simple_tcp_packet(
eth_dst=self.inner_dmac4,
eth_src=ROUTER_MAC,
ip_dst=service_vm_ip,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=63)
vxlan_pkt = Mask(simple_vxlan_packet(
eth_src=ROUTER_MAC,
eth_dst=self.underlay_neighbor_mac2,
ip_id=0,
ip_src=self.my_lb_ip,
ip_dst=service_vtep_ip,
ip_ttl=64,
ip_flags=0x2,
with_udp_chksum=False,
vxlan_vni=service_vni2,
inner_frame=inner_pkt))
print("Updating nexthop tunnel vni {} -> {}".format(service_vni,
service_vni2))
sai_thrift_set_next_hop_attribute(self.client, tunnel_nexthop3,
tunnel_vni=4000)
print(sai_thrift_get_next_hop_attribute(self.client,
tunnel_nexthop3,
tunnel_vni=True))
vxlan_pkt.set_do_not_care_scapy(UDP, 'sport')
print("Sending packet on port %d to vni %d" %
(self.dev_port24, service_vni2))
send_packet(self, self.dev_port24, pkt)
verify_packet(self, vxlan_pkt, self.dev_port26)
finally:
if 'customer_route3' in locals() and customer_route3:
sai_thrift_remove_route_entry(self.client, customer_route3)
if 'customer_route2' in locals() and customer_route2:
sai_thrift_remove_route_entry(self.client, customer_route2)
if 'customer_route1' in locals() and customer_route1:
sai_thrift_remove_route_entry(self.client, customer_route1)
if 'tunnel_nexthop3' in locals() and tunnel_nexthop3:
sai_thrift_remove_next_hop(self.client, tunnel_nexthop3)
if 'tunnel_nexthop2' in locals() and tunnel_nexthop2:
sai_thrift_remove_next_hop(self.client, tunnel_nexthop2)
if 'tunnel_nexthop1' in locals() and tunnel_nexthop1:
sai_thrift_remove_next_hop(self.client, tunnel_nexthop1)
sai_thrift_remove_route_entry(self.client, tunnel_route2)
sai_thrift_remove_route_entry(self.client, tunnel_route1)
sai_thrift_remove_next_hop(self.client, unhop2)
sai_thrift_remove_next_hop(self.client, unhop1)
sai_thrift_remove_neighbor_entry(self.client, uneighbor2)
sai_thrift_remove_neighbor_entry(self.client, uneighbor1)
sai_thrift_remove_router_interface(self.client, urif2)
sai_thrift_remove_router_interface(self.client, urif1)
def tearDown(self):
super(tunnelVniTest, self).tearDown()
class tunnelVrfTest(NhopTunnelVNITestHelper):
'''
Test verifies correct tunnel behavior with multiple nexthops
in different VRFs.
'''
def setUp(self):
super(tunnelVrfTest, self).setUp()
def runTest(self):
print("tunnelVniTest")
uvrf2 = sai_thrift_create_virtual_router(self.client)
# overlay config
ovrf2 = sai_thrift_create_virtual_router(self.client)
# create underlay loopback rif for tunnel
urif_lb2 = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_LOOPBACK,
virtual_router_id=uvrf2)
orif2 = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT,
virtual_router_id=ovrf2,
port_id=self.port27)
# Encap configuration follows
tunnel2 = sai_thrift_create_tunnel(
self.client, type=self.tunnel_type,
encap_src_ip=sai_ipaddress(self.my_lb_ip),
decap_mappers=self.decap_mappers_objlist,
encap_mappers=self.encap_mappers_objlist,
encap_ttl_mode=self.ttl_mode,
decap_ttl_mode=self.ttl_mode,
underlay_interface=urif_lb2)
try:
urif1 = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT,
port_id=self.port25, virtual_router_id=self.uvrf)
uneighbor1 = sai_thrift_neighbor_entry_t(
rif_id=urif1, ip_address=sai_ipaddress(self.tunnel_ip))
sai_thrift_create_neighbor_entry(
self.client, uneighbor1,
dst_mac_address=self.underlay_neighbor_mac)
unhop1 = sai_thrift_create_next_hop(
self.client, ip=sai_ipaddress('10.10.10.1'),
router_interface_id=urif1, type=SAI_NEXT_HOP_TYPE_IP)
tunnel_route1 = sai_thrift_route_entry_t(
vr_id=self.uvrf, destination=sai_ipprefix('10.10.10.1/32'))
sai_thrift_create_route_entry(self.client, tunnel_route1,
next_hop_id=unhop1)
urif2 = sai_thrift_create_router_interface(
self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT,
port_id=self.port26, virtual_router_id=uvrf2)
uneighbor2 = sai_thrift_neighbor_entry_t(
rif_id=urif2, ip_address=sai_ipaddress(self.tunnel_ip))
sai_thrift_create_neighbor_entry(
self.client, uneighbor2,
dst_mac_address=self.underlay_neighbor_mac)
unhop2 = sai_thrift_create_next_hop(
self.client, ip=sai_ipaddress('10.10.10.1'),
router_interface_id=urif2, type=SAI_NEXT_HOP_TYPE_IP)
tunnel_route2 = sai_thrift_route_entry_t(
vr_id=uvrf2, destination=sai_ipprefix('10.10.10.1/32'))
sai_thrift_create_route_entry(self.client, tunnel_route2,
next_hop_id=unhop2)
tunnel_nexthop1 = sai_thrift_create_next_hop(
self.client, type=SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP,
tunnel_id=self.tunnel, ip=sai_ipaddress(self.tunnel_ip),
tunnel_vni=self.vni, tunnel_mac=self.inner_dmac)
tunnel_nexthop2 = sai_thrift_create_next_hop(
self.client, type=SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP,
tunnel_id=tunnel2, ip=sai_ipaddress(self.tunnel_ip),
tunnel_vni=self.vni, tunnel_mac=self.inner_dmac)
self.assertNotEqual(
tunnel_nexthop2, 0,
"Failed to create nexthop to same dest ip in different vrf")
customer_route1 = sai_thrift_route_entry_t(
vr_id=self.ovrf, destination=sai_ipprefix(self.vm_ip+'/32'))
sai_thrift_create_route_entry(self.client, customer_route1,
next_hop_id=tunnel_nexthop1)
customer_route2 = sai_thrift_route_entry_t(
vr_id=ovrf2, destination=sai_ipprefix(self.vm_ip+'/32'))
sai_thrift_create_route_entry(self.client, customer_route2,
next_hop_id=tunnel_nexthop2)
pkt = simple_tcp_packet(
eth_dst=ROUTER_MAC,
eth_src='00:22:22:22:22:22',
ip_dst=self.vm_ip,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=64)
inner_pkt = simple_tcp_packet(
eth_dst=self.inner_dmac,
eth_src=ROUTER_MAC,
ip_dst=self.vm_ip,
ip_src=self.customer_ip,
ip_id=108,
ip_ttl=63)
vxlan_pkt = Mask(simple_vxlan_packet(
eth_src=ROUTER_MAC,
eth_dst=self.underlay_neighbor_mac,
ip_id=0,
ip_src=self.my_lb_ip,
ip_dst=self.tunnel_ip,
ip_ttl=64,
ip_flags=0x2,
with_udp_chksum=False,
vxlan_vni=self.vni,
inner_frame=inner_pkt))
vxlan_pkt.set_do_not_care_scapy(UDP, 'sport')
print("Sending packet on port %d to vni %d" %
(self.dev_port24, self.vni))
send_packet(self, self.dev_port24, pkt)
verify_packet(self, vxlan_pkt, self.dev_port25)
print("Sending packet on port %d to vni %d" %
(self.dev_port27, self.vni))
send_packet(self, self.dev_port27, pkt)
verify_packet(self, vxlan_pkt, self.dev_port26)
finally:
if 'customer_route2' in locals() and customer_route2:
sai_thrift_remove_route_entry(self.client, customer_route2)
if 'customer_route1' in locals() and customer_route1:
sai_thrift_remove_route_entry(self.client, customer_route1)
if 'tunnel_nexthop2' in locals() and tunnel_nexthop2:
sai_thrift_remove_next_hop(self.client, tunnel_nexthop2)
if 'tunnel_nexthop1' in locals() and tunnel_nexthop1:
sai_thrift_remove_next_hop(self.client, tunnel_nexthop1)
sai_thrift_remove_route_entry(self.client, tunnel_route2)
sai_thrift_remove_route_entry(self.client, tunnel_route1)
sai_thrift_remove_next_hop(self.client, unhop2)
sai_thrift_remove_next_hop(self.client, unhop1)
sai_thrift_remove_neighbor_entry(self.client, uneighbor2)
sai_thrift_remove_neighbor_entry(self.client, uneighbor1)
sai_thrift_remove_router_interface(self.client, urif2)
sai_thrift_remove_router_interface(self.client, urif1)
sai_thrift_remove_tunnel(self.client, tunnel2)
sai_thrift_remove_router_interface(self.client, orif2)
sai_thrift_remove_router_interface(self.client, urif_lb2)
sai_thrift_remove_virtual_router(self.client, ovrf2)
sai_thrift_remove_virtual_router(self.client, uvrf2)
def tearDown(self):
super(tunnelVrfTest, self).tearDown()