teib: Add adj-fibs for peers/adjacencies on p2mp interface

Type: fix

Change-Id: I6fdc4e952097e92ac3aa53e0be3ef99e0d801b28
Signed-off-by: Neale Ranns <nranns@cisco.com>
This commit is contained in:
Neale Ranns
2020-09-02 14:46:53 +00:00
parent fc639ff2d7
commit 256b67bc88
9 changed files with 310 additions and 39 deletions
+2 -1
View File
@@ -472,7 +472,8 @@ mgre_update_adj (vnet_main_t * vnm, u32 sw_if_index, adj_index_t ai)
ti = gm->tunnel_index_by_sw_if_index[sw_if_index];
t = pool_elt_at_index (gm->tunnels, ti);
ne = teib_entry_find (sw_if_index, &adj->sub_type.nbr.next_hop);
ne = teib_entry_find (sw_if_index,
adj->ia_nh_proto, &adj->sub_type.nbr.next_hop);
if (NULL == ne)
// no NHRP entry to provide the next-hop
+2 -1
View File
@@ -364,7 +364,8 @@ mipip_update_adj (vnet_main_t * vnm, u32 sw_if_index, adj_index_t ai)
ti = gm->tunnel_index_by_sw_if_index[sw_if_index];
t = pool_elt_at_index (gm->tunnels, ti);
ne = teib_entry_find (sw_if_index, &adj->sub_type.nbr.next_hop);
ne = teib_entry_find (sw_if_index,
adj->ia_nh_proto, &adj->sub_type.nbr.next_hop);
if (NULL == ne)
{
+3 -1
View File
@@ -718,7 +718,9 @@ ipsec_tun_protect_update (u32 sw_if_index,
ip_address_to_46 (nh, &peer);
ipsec_tun_protect_update_from_teib
(itp, teib_entry_find (sw_if_index, &peer));
(itp, teib_entry_find (sw_if_index,
ip_address_family_to_fib_proto
(ip_addr_version (nh)), &peer));
}
if (is_l2)
+219 -18
View File
File diff suppressed because it is too large Load Diff
+6 -1
View File
@@ -37,6 +37,7 @@ typedef struct teib_entry_t_ teib_entry_t;
extern u32 teib_entry_get_sw_if_index (const teib_entry_t * ne);
extern u32 teib_entry_get_fib_index (const teib_entry_t * ne);
extern const ip46_address_t *teib_entry_get_peer (const teib_entry_t * ne);
extern fib_protocol_t teib_entry_get_proto (const teib_entry_t * ne);
extern const fib_prefix_t *teib_entry_get_nh (const teib_entry_t * ne);
extern u8 *format_teib_entry (u8 * s, va_list * args);
@@ -44,12 +45,16 @@ extern u8 *format_teib_entry (u8 * s, va_list * args);
* Create a new TEIB entry
*/
extern int teib_entry_add (u32 sw_if_index,
fib_protocol_t fproto,
const ip46_address_t * peer,
u32 nh_table_id, const ip46_address_t * nh);
extern int teib_entry_del (u32 sw_if_index, const ip46_address_t * peer);
extern int teib_entry_del (u32 sw_if_index,
fib_protocol_t fproto,
const ip46_address_t * peer);
extern teib_entry_t *teib_entry_find (u32 sw_if_index,
fib_protocol_t fproto,
const ip46_address_t * peer);
extern teib_entry_t *teib_entry_get (index_t nei);
+12 -5
View File
@@ -39,19 +39,26 @@ static void
vl_api_teib_entry_add_del_t_handler (vl_api_teib_entry_add_del_t * mp)
{
vl_api_teib_entry_add_del_reply_t *rmp;
ip46_address_t peer, nh;
ip46_address_t nh;
ip_address_t peer;
int rv;
VALIDATE_SW_IF_INDEX ((&mp->entry));
ip_address_decode (&mp->entry.peer, &peer);
ip_address_decode2 (&mp->entry.peer, &peer);
ip_address_decode (&mp->entry.nh, &nh);
if (mp->is_add)
rv = teib_entry_add (ntohl (mp->entry.sw_if_index), &peer,
ntohl (mp->entry.nh_table_id), &nh);
rv = teib_entry_add (ntohl (mp->entry.sw_if_index),
ip_address_family_to_fib_proto (ip_addr_version
(&peer)),
&ip_addr_46 (&peer), ntohl (mp->entry.nh_table_id),
&nh);
else
rv = teib_entry_del (ntohl (mp->entry.sw_if_index), &peer);
rv = teib_entry_del (ntohl (mp->entry.sw_if_index),
ip_address_family_to_fib_proto (ip_addr_version
(&peer)),
&ip_addr_46 (&peer));
BAD_SW_IF_INDEX_LABEL;
+14 -8
View File
@@ -20,8 +20,8 @@ teib_add (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
unformat_input_t _line_input, *line_input = &_line_input;
ip46_address_t peer = ip46_address_initializer;
ip46_address_t nh = ip46_address_initializer;
ip_address_t peer = IP_ADDRESS_V6_ALL_0S;
u32 sw_if_index, nh_table_id;
clib_error_t *error = NULL;
int rv;
@@ -38,7 +38,7 @@ teib_add (vlib_main_t * vm,
if (unformat (line_input, "%U", unformat_vnet_sw_interface,
vnet_get_main (), &sw_if_index))
;
else if (unformat (line_input, "peer %U", unformat_ip46_address, &peer))
else if (unformat (line_input, "peer %U", unformat_ip_address, &peer))
;
else if (unformat (line_input, "nh %U", unformat_ip46_address, &nh))
;
@@ -58,7 +58,7 @@ teib_add (vlib_main_t * vm,
format_unformat_error, line_input);
goto done;
}
if (ip46_address_is_zero (&peer))
if (ip_address_is_zero (&peer))
{
error = clib_error_return (0, "peer required'",
format_unformat_error, line_input);
@@ -71,7 +71,10 @@ teib_add (vlib_main_t * vm,
goto done;
}
rv = teib_entry_add (sw_if_index, &peer, nh_table_id, &nh);
rv = teib_entry_add (sw_if_index,
ip_address_family_to_fib_proto (ip_addr_version
(&peer)),
&ip_addr_46 (&peer), nh_table_id, &nh);
if (rv)
{
@@ -99,7 +102,7 @@ teib_del (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
unformat_input_t _line_input, *line_input = &_line_input;
ip46_address_t peer = ip46_address_initializer;
ip_address_t peer = IP_ADDRESS_V6_ALL_0S;
clib_error_t *error = NULL;
u32 sw_if_index;
int rv;
@@ -115,7 +118,7 @@ teib_del (vlib_main_t * vm,
if (unformat (line_input, "%U", unformat_vnet_sw_interface,
vnet_get_main (), &sw_if_index))
;
else if (unformat (line_input, "peer %U", unformat_ip46_address, &peer))
else if (unformat (line_input, "peer %U", unformat_ip_address, &peer))
;
else
{
@@ -130,14 +133,17 @@ teib_del (vlib_main_t * vm,
error = clib_error_return (0, "interface required'",
format_unformat_error, line_input);
}
if (ip46_address_is_zero (&peer))
if (ip_address_is_zero (&peer))
{
error = clib_error_return (0, "peer required'",
format_unformat_error, line_input);
goto done;
}
rv = teib_entry_del (sw_if_index, &peer);
rv = teib_entry_del (sw_if_index,
ip_address_family_to_fib_proto (ip_addr_version
(&peer)),
&ip_addr_46 (&peer));
if (rv)
{
+47 -2
View File
@@ -45,7 +45,7 @@ class TestIPIP(VppTestCase):
@classmethod
def setUpClass(cls):
super(TestIPIP, cls).setUpClass()
cls.create_pg_interfaces(range(2))
cls.create_pg_interfaces(range(3))
cls.interfaces = list(cls.pg_interfaces)
@classmethod
@@ -54,8 +54,14 @@ class TestIPIP(VppTestCase):
def setUp(self):
super(TestIPIP, self).setUp()
self.table = VppIpTable(self, 1, register=False)
self.table.add_vpp_config()
for i in self.interfaces:
i.admin_up()
self.pg2.set_table_ip4(self.table.table_id)
for i in self.interfaces:
i.config_ip4()
i.config_ip6()
i.disable_ipv6_ra()
@@ -68,8 +74,11 @@ class TestIPIP(VppTestCase):
for i in self.pg_interfaces:
i.unconfig_ip4()
i.unconfig_ip6()
i.set_table_ip4(0)
i.admin_down()
self.table.remove_vpp_config()
def validate(self, rx, expected):
self.assertEqual(rx, expected.__class__(expected))
@@ -475,7 +484,7 @@ class TestIPIP(VppTestCase):
def test_mipip4(self):
""" p2mp IPv4 tunnel Tests """
for itf in self.pg_interfaces:
for itf in self.pg_interfaces[:2]:
#
# one underlay nh for each overlay/tunnel peer
#
@@ -579,8 +588,44 @@ class TestIPIP(VppTestCase):
self.assertEqual(rx[IP].dst, itf._remote_hosts[ii].ip4)
rx = self.send_and_expect(self.pg0, tx_i, self.pg0)
#
# we can also send to the peer's address
#
inner = (IP(dst=teib.peer, src="5.5.5.5") /
UDP(sport=1234, dport=1234) /
Raw(b'0x44' * 100))
tx_e = [(Ether(dst=self.pg0.local_mac,
src=self.pg0.remote_mac) /
inner) for x in range(63)]
rxs = self.send_and_expect(self.pg0, tx_e, itf)
#
# with all of the peers in place, swap the ip-table of
# the ipip interface
#
table = VppIpTable(self, 2)
table.add_vpp_config()
ipip_if.unconfig_ip4()
ipip_if.set_table_ip4(self.table.table_id)
ipip_if.config_ip4()
#
# we should still be able to reach the peers from the new table
#
inner = (IP(dst=teib.peer, src="5.5.5.5") /
UDP(sport=1234, dport=1234) /
Raw(b'0x44' * 100))
tx_e = [(Ether(dst=self.pg0.local_mac,
src=self.pg0.remote_mac) /
inner) for x in range(63)]
rxs = self.send_and_expect(self.pg2, tx_e, itf)
ipip_if.admin_down()
ipip_if.unconfig_ip4()
ipip_if.set_table_ip4(0)
class TestIPIP6(VppTestCase):
+5 -2
View File
@@ -188,16 +188,19 @@ class VppIpTable(VppObject):
def __init__(self,
test,
table_id,
is_ip6=0):
is_ip6=0,
register=True):
self._test = test
self.table_id = table_id
self.is_ip6 = is_ip6
self.register = register
def add_vpp_config(self):
self._test.vapi.ip_table_add_del(is_add=1,
table={'is_ip6': self.is_ip6,
'table_id': self.table_id})
self._test.registry.register(self, self._test.logger)
if self.register:
self._test.registry.register(self, self._test.logger)
return self
def remove_vpp_config(self):