aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2019-04-18 10:23:56 +0000
committerOle Trøan <otroan@employees.org>2019-12-04 22:45:11 +0000
commit5f8f6173328f8d77feea5fd100e150c3094c11f0 (patch)
tree16849c6e7619b227a93ce9846f344da2cc96ef2d /test
parent79619c10142e15754e2f0b2ba26c20d415e7c36f (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.py80
-rw-r--r--test/vpp_gre_interface.py26
-rw-r--r--test/vpp_nhrp.py51
-rw-r--r--test/vpp_papi_provider.py10
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}
}
)