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:
+2
-1
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user