ip-neighbor: Replace feature for the ip-neighbor data-base

Type: feature

DB replace is implemented with a mark and sweep algorithm (just the the
FIB)

Signed-off-by: Neale Ranns <nranns@cisco.com>
Change-Id: I54ab06e11552219e2a18e1b4a87d531321cf3829
This commit is contained in:
Neale Ranns
2020-04-02 17:08:28 +00:00
parent c17ff6ec3b
commit c87fbb417a
7 changed files with 262 additions and 15 deletions

View File

@ -1849,5 +1849,122 @@ class NeighborAgeTestCase(VppTestCase):
self.pg0.remote_hosts[0].ip4))
class NeighborReplaceTestCase(VppTestCase):
""" ARP/ND Replacement """
@classmethod
def setUpClass(cls):
super(NeighborReplaceTestCase, cls).setUpClass()
@classmethod
def tearDownClass(cls):
super(NeighborReplaceTestCase, cls).tearDownClass()
def setUp(self):
super(NeighborReplaceTestCase, self).setUp()
self.create_pg_interfaces(range(4))
# pg0 configured with ip4 and 6 addresses used for input
# pg1 configured with ip4 and 6 addresses used for output
# pg2 is unnumbered to pg0
for i in self.pg_interfaces:
i.admin_up()
i.config_ip4()
i.config_ip6()
i.resolve_arp()
i.resolve_ndp()
def tearDown(self):
super(NeighborReplaceTestCase, self).tearDown()
for i in self.pg_interfaces:
i.unconfig_ip4()
i.unconfig_ip6()
i.admin_down()
def test_replace(self):
""" replace """
N_HOSTS = 16
for i in self.pg_interfaces:
i.generate_remote_hosts(N_HOSTS)
i.configure_ipv4_neighbors()
i.configure_ipv6_neighbors()
# replace them all
self.vapi.ip_neighbor_replace_begin()
self.vapi.ip_neighbor_replace_end()
for i in self.pg_interfaces:
for h in range(N_HOSTS):
self.assertFalse(find_nbr(self,
self.pg0.sw_if_index,
self.pg0.remote_hosts[h].ip4))
self.assertFalse(find_nbr(self,
self.pg0.sw_if_index,
self.pg0.remote_hosts[h].ip6))
#
# and them all back via the API
#
for i in self.pg_interfaces:
for h in range(N_HOSTS):
VppNeighbor(self,
i.sw_if_index,
i.remote_hosts[h].mac,
i.remote_hosts[h].ip4).add_vpp_config()
VppNeighbor(self,
i.sw_if_index,
i.remote_hosts[h].mac,
i.remote_hosts[h].ip6).add_vpp_config()
#
# begin the replacement again, this time touch some
# the neighbours on pg1 so they are not deleted
#
self.vapi.ip_neighbor_replace_begin()
# update from the API all neighbours on pg1
for h in range(N_HOSTS):
VppNeighbor(self,
self.pg1.sw_if_index,
self.pg1.remote_hosts[h].mac,
self.pg1.remote_hosts[h].ip4).add_vpp_config()
VppNeighbor(self,
self.pg1.sw_if_index,
self.pg1.remote_hosts[h].mac,
self.pg1.remote_hosts[h].ip6).add_vpp_config()
# update from the data-plane all neighbours on pg3
self.pg3.configure_ipv4_neighbors()
self.pg3.configure_ipv6_neighbors()
# complete the replacement
self.logger.info(self.vapi.cli("sh ip neighbors"))
self.vapi.ip_neighbor_replace_end()
for i in self.pg_interfaces:
if i == self.pg1 or i == self.pg3:
# neighbours on pg1 and pg3 are still present
for h in range(N_HOSTS):
self.assertTrue(find_nbr(self,
i.sw_if_index,
i.remote_hosts[h].ip4))
self.assertTrue(find_nbr(self,
i.sw_if_index,
i.remote_hosts[h].ip6))
else:
# all other neighbours are toast
for h in range(N_HOSTS):
self.assertFalse(find_nbr(self,
i.sw_if_index,
i.remote_hosts[h].ip4))
self.assertFalse(find_nbr(self,
i.sw_if_index,
i.remote_hosts[h].ip6))
if __name__ == '__main__':
unittest.main(testRunner=VppTestRunner)