diff options
author | Neale Ranns <nranns@cisco.com> | 2019-04-18 10:23:56 +0000 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2019-12-04 22:45:11 +0000 |
commit | 5f8f6173328f8d77feea5fd100e150c3094c11f0 (patch) | |
tree | 16849c6e7619b227a93ce9846f344da2cc96ef2d /test | |
parent | 79619c10142e15754e2f0b2ba26c20d415e7c36f (diff) |
gre: Multi-point interfaces
Type: feature
Change-Id: I0129ad6ace44a50a8a3b26db8e445cd06b2b49e8
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/test_gre.py | 80 | ||||
-rw-r--r-- | test/vpp_gre_interface.py | 26 | ||||
-rw-r--r-- | test/vpp_nhrp.py | 51 | ||||
-rw-r--r-- | test/vpp_papi_provider.py | 10 |
4 files changed, 152 insertions, 15 deletions
diff --git a/test/test_gre.py b/test/test_gre.py index 6828ac6f919..d3d12cc26bb 100644 --- a/test/test_gre.py +++ b/test/test_gre.py @@ -12,6 +12,7 @@ from scapy.volatile import RandMAC, RandIP from framework import VppTestCase, VppTestRunner from vpp_sub_interface import L2_VTR_OP, VppDot1QSubint from vpp_gre_interface import VppGreInterface +from vpp_nhrp import VppNhrp from vpp_ip import DpoProto from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpTable, FibPathProto from util import ppp, ppc @@ -79,7 +80,7 @@ class TestGRE(VppTestCase): super(TestGRE, self).setUp() # create 3 pg interfaces - set one in a non-default table. - self.create_pg_interfaces(range(3)) + self.create_pg_interfaces(range(5)) self.tbl = VppIpTable(self, 1) self.tbl.add_vpp_config() @@ -94,6 +95,10 @@ class TestGRE(VppTestCase): self.pg1.resolve_arp() self.pg2.config_ip6() self.pg2.resolve_ndp() + self.pg3.config_ip4() + self.pg3.resolve_arp() + self.pg4.config_ip4() + self.pg4.resolve_arp() def tearDown(self): for i in self.pg_interfaces: @@ -701,7 +706,7 @@ class TestGRE(VppTestCase): # gre_if = VppGreInterface(self, self.pg1.local_ip4, "2.2.2.2", - outer_fib_id=1) + outer_table_id=1) gre_if.add_vpp_config() gre_if.admin_up() gre_if.config_ip4() @@ -968,6 +973,77 @@ class TestGRE(VppTestCase): route_via_tun_2.remove_vpp_config() gre_if.remove_vpp_config() + def test_mgre(self): + """ mGRE IPv4 tunnel Tests """ + + for itf in self.pg_interfaces[3:]: + # + # one underlay nh for each overlay/tunnel peer + # + itf.generate_remote_hosts(4) + itf.configure_ipv4_neighbors() + + # + # Create an L3 GRE tunnel. + # - set it admin up + # - assign an IP Addres + # - Add a route via the tunnel + # + gre_if = VppGreInterface(self, + itf.local_ip4, + "0.0.0.0", + mode=(VppEnum.vl_api_gre_tunnel_mode_t. + GRE_API_TUNNEL_MODE_MP)) + gre_if.add_vpp_config() + gre_if.admin_up() + gre_if.config_ip4() + gre_if.generate_remote_hosts(4) + + # + # for-each peer + # + for ii in range(1, 4): + route_addr = "4.4.4.%d" % ii + + # + # route traffic via the peer + # + route_via_tun = VppIpRoute( + self, route_addr, 32, + [VppRoutePath(gre_if._remote_hosts[ii].ip4, + gre_if.sw_if_index)]) + route_via_tun.add_vpp_config() + + # + # Add a NHRP entry resolves the peer + # + nhrp = VppNhrp(self, gre_if, + gre_if._remote_hosts[ii].ip4, + itf._remote_hosts[ii].ip4) + nhrp.add_vpp_config() + + # + # Send a packet stream that is routed into the tunnel + # - packets are GRE encapped + # + tx = self.create_stream_ip4(self.pg0, "5.5.5.5", route_addr) + rx = self.send_and_expect(self.pg0, tx, itf) + self.verify_tunneled_4o4(self.pg0, rx, tx, + itf.local_ip4, + gre_if._remote_hosts[ii].ip4) + + # + # delete and re-add the NHRP + # + nhrp.remove_vpp_config() + self.send_and_assert_no_replies(self.pg0, tx) + + nhrp.add_vpp_config() + rx = self.send_and_expect(self.pg0, tx, itf) + self.verify_tunneled_4o4(self.pg0, rx, tx, + itf.local_ip4, + gre_if._remote_hosts[ii].ip4) + if __name__ == '__main__': unittest.main(testRunner=VppTestRunner) diff --git a/test/vpp_gre_interface.py b/test/vpp_gre_interface.py index 333fc0306ea..905c3832532 100644 --- a/test/vpp_gre_interface.py +++ b/test/vpp_gre_interface.py @@ -9,25 +9,32 @@ class VppGreInterface(VppInterface): VPP GRE interface """ - def __init__(self, test, src_ip, dst_ip, outer_fib_id=0, type=None, + def __init__(self, test, src_ip, dst_ip, outer_table_id=0, + type=None, mode=None, session=0): """ Create VPP GRE interface """ super(VppGreInterface, self).__init__(test) self.t_src = src_ip self.t_dst = dst_ip - self.t_outer_fib = outer_fib_id + self.t_outer_table = outer_table_id self.t_session = session self.t_type = type if not self.t_type: self.t_type = (VppEnum.vl_api_gre_tunnel_type_t. GRE_API_TUNNEL_TYPE_L3) + self.t_mode = mode + if not self.t_mode: + self.t_mode = (VppEnum.vl_api_gre_tunnel_mode_t. + GRE_API_TUNNEL_MODE_P2P) def add_vpp_config(self): - r = self.test.vapi.gre_tunnel_add_del(self.t_src, - self.t_dst, - outer_fib_id=self.t_outer_fib, - tunnel_type=self.t_type, - session_id=self.t_session) + r = self.test.vapi.gre_tunnel_add_del( + self.t_src, + self.t_dst, + outer_table_id=self.t_outer_table, + type=self.t_type, + mode=self.t_mode, + session_id=self.t_session) self.set_sw_if_index(r.sw_if_index) self.generate_remote_hosts() self.test.registry.register(self, self.test.logger) @@ -37,8 +44,9 @@ class VppGreInterface(VppInterface): self.unconfig() self.test.vapi.gre_tunnel_add_del(self.t_src, self.t_dst, - outer_fib_id=self.t_outer_fib, - tunnel_type=self.t_type, + outer_table_id=self.t_outer_table, + type=self.t_type, + mode=self.t_mode, session_id=self.t_session, is_add=0) diff --git a/test/vpp_nhrp.py b/test/vpp_nhrp.py new file mode 100644 index 00000000000..e04e3054fd2 --- /dev/null +++ b/test/vpp_nhrp.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +""" + NHRP objects +""" + +from vpp_object import VppObject + + +def find_nhrp(test, ne): + ns = test.vapi.nhrp_dump() + for n in ns: + if ne.peer == str(n.entry.peer) \ + and ne.itf._sw_if_index == n.entry.sw_if_index: + return True + return False + + +class VppNhrp(VppObject): + + def __init__(self, test, itf, peer, nh, table_id=0): + self._test = test + self.table_id = table_id + self.peer = peer + self.itf = itf + self.nh = nh + + def add_vpp_config(self): + r = self._test.vapi.nhrp_entry_add_del( + is_add=1, + entry={ + 'nh_table_id': self.table_id, + 'sw_if_index': self.itf.sw_if_index, + 'peer': self.peer, + 'nh': self.nh, + }) + self._test.registry.register(self, self._test.logger) + + def remove_vpp_config(self): + r = self._test.vapi.nhrp_entry_add_del( + is_add=0, + entry={ + 'nh_table_id': self.table_id, + 'sw_if_index': self.itf.sw_if_index, + 'peer': self.peer, + }) + + def query_vpp_config(self): + return find_nhrp(self._test, self) + + def object_id(self): + return ("nhrp-%s-%s" % (self.itf, self.peer)) diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py index 556145ac97e..65b58f15f52 100644 --- a/test/vpp_papi_provider.py +++ b/test/vpp_papi_provider.py @@ -530,8 +530,9 @@ class VppPapiProvider(object): def gre_tunnel_add_del(self, src, dst, - outer_fib_id=0, - tunnel_type=0, + outer_table_id=0, + type=0, + mode=0, instance=0xFFFFFFFF, session_id=0, is_add=1): @@ -552,11 +553,12 @@ class VppPapiProvider(object): {'is_add': is_add, 'tunnel': { - 'type': tunnel_type, + 'type': type, + 'mode': mode, 'instance': instance, 'src': src, 'dst': dst, - 'outer_fib_id': outer_fib_id, + 'outer_table_id': outer_table_id, 'session_id': session_id} } ) |