diff options
-rw-r--r-- | src/vnet/ip-neighbor/ip_neighbor.api | 36 | ||||
-rw-r--r-- | src/vnet/ip-neighbor/ip_neighbor.c | 11 | ||||
-rw-r--r-- | src/vnet/ip-neighbor/ip_neighbor.h | 2 | ||||
-rw-r--r-- | src/vnet/ip-neighbor/ip_neighbor_api.c | 26 | ||||
-rw-r--r-- | test/test_neighbor.py | 30 |
5 files changed, 104 insertions, 1 deletions
diff --git a/src/vnet/ip-neighbor/ip_neighbor.api b/src/vnet/ip-neighbor/ip_neighbor.api index a04fcbc569e..24cddd42fab 100644 --- a/src/vnet/ip-neighbor/ip_neighbor.api +++ b/src/vnet/ip-neighbor/ip_neighbor.api @@ -20,7 +20,7 @@ called through a shared memory interface. */ -option version = "1.0.0"; +option version = "1.0.1"; import "vnet/ip/ip_types.api"; import "vnet/ethernet/ethernet_types.api"; @@ -126,6 +126,40 @@ autoreply define ip_neighbor_config bool recycle; }; +/** \brief Get neighbor database configuration per AF + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param af - Address family (v4/v6) +*/ +define ip_neighbor_config_get +{ + option in_progress; + u32 client_index; + u32 context; + vl_api_address_family_t af; +}; + +/** \brief Neighbor database configuration reply + @param context - sender context, to match reply w/ request + @param retval - error (0 is "no error") + @param af - Address family (v4/v6) + @param max_number - The maximum number of neighbours that will be created + @param max_age - The maximum age (in seconds) before an inactive neighbour + is flushed + @param recycle - If max_number of neighbours is reached and new ones need + to be created, should the oldest neighbour be 'recycled' +*/ +define ip_neighbor_config_get_reply +{ + option in_progress; + u32 context; + i32 retval; + vl_api_address_family_t af; + u32 max_number; + u32 max_age; + bool recycle; +}; + /** \brief IP neighbour replace begin The use-case is that, for some unspecified reason, the control plane diff --git a/src/vnet/ip-neighbor/ip_neighbor.c b/src/vnet/ip-neighbor/ip_neighbor.c index 8e997e4920e..d7450f9cd3e 100644 --- a/src/vnet/ip-neighbor/ip_neighbor.c +++ b/src/vnet/ip-neighbor/ip_neighbor.c @@ -1759,6 +1759,17 @@ ip_neighbor_config (ip_address_family_t af, u32 limit, u32 age, bool recycle) return (0); } +int +ip_neighbor_get_config (ip_address_family_t af, u32 *limit, u32 *age, + bool *recycle) +{ + *limit = ip_neighbor_db[af].ipndb_limit; + *age = ip_neighbor_db[af].ipndb_age; + *recycle = ip_neighbor_db[af].ipndb_recycle; + + return (0); +} + static clib_error_t * ip_neighbor_config_show (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) diff --git a/src/vnet/ip-neighbor/ip_neighbor.h b/src/vnet/ip-neighbor/ip_neighbor.h index 8c07df86ba8..cc888ba2054 100644 --- a/src/vnet/ip-neighbor/ip_neighbor.h +++ b/src/vnet/ip-neighbor/ip_neighbor.h @@ -36,6 +36,8 @@ extern int ip_neighbor_del (const ip_address_t * ip, u32 sw_if_index); extern int ip_neighbor_config (ip_address_family_t af, u32 limit, u32 age, bool recycle); +extern int ip_neighbor_get_config (ip_address_family_t af, u32 *limit, + u32 *age, bool *recycle); extern void ip_neighbor_del_all (ip_address_family_t af, u32 sw_if_index); diff --git a/src/vnet/ip-neighbor/ip_neighbor_api.c b/src/vnet/ip-neighbor/ip_neighbor_api.c index 81af86211de..a5ed546f114 100644 --- a/src/vnet/ip-neighbor/ip_neighbor_api.c +++ b/src/vnet/ip-neighbor/ip_neighbor_api.c @@ -314,6 +314,32 @@ vl_api_ip_neighbor_config_t_handler (vl_api_ip_neighbor_config_t * mp) } static void +vl_api_ip_neighbor_config_get_t_handler (vl_api_ip_neighbor_config_get_t *mp) +{ + vl_api_ip_neighbor_config_get_reply_t *rmp; + int rv; + ip_address_family_t af = AF_IP4; + u32 max_number = ~0; + u32 max_age = ~0; + bool recycle = false; + + rv = ip_address_family_decode (mp->af, &af); + + if (!rv) + rv = ip_neighbor_get_config (af, &max_number, &max_age, &recycle); + + // clang-format off + REPLY_MACRO2 (VL_API_IP_NEIGHBOR_CONFIG_GET_REPLY, + ({ + rmp->af = ip_address_family_encode (af); + rmp->max_number = htonl (max_number); + rmp->max_age = htonl (max_age); + rmp->recycle = recycle; + })); + // clang-format on +} + +static void vl_api_ip_neighbor_replace_begin_t_handler (vl_api_ip_neighbor_replace_begin_t * mp) { diff --git a/test/test_neighbor.py b/test/test_neighbor.py index f663e735d78..b600a97c3c2 100644 --- a/test/test_neighbor.py +++ b/test/test_neighbor.py @@ -2247,6 +2247,14 @@ class NeighborAgeTestCase(VppTestCase): self.assertEqual(arp.psrc, sip) self.assertEqual(arp.pdst, dip) + def verify_ip_neighbor_config(self, af, max_number, max_age, recycle): + config = self.vapi.ip_neighbor_config_get(af) + + self.assertEqual(config.af, af) + self.assertEqual(config.max_number, max_number) + self.assertEqual(config.max_age, max_age) + self.assertEqual(config.recycle, recycle) + def test_age(self): """Aging/Recycle""" @@ -2263,6 +2271,13 @@ class NeighborAgeTestCase(VppTestCase): self.pg_enable_capture(self.pg_interfaces) # + # Verify neighbor configuration defaults + # + self.verify_ip_neighbor_config( + af=vaf.ADDRESS_IP4, max_number=50000, max_age=0, recycle=False + ) + + # # Set the neighbor configuration: # limi = 200 # age = 0 seconds @@ -2271,6 +2286,9 @@ class NeighborAgeTestCase(VppTestCase): self.vapi.ip_neighbor_config( af=vaf.ADDRESS_IP4, max_number=200, max_age=0, recycle=False ) + self.verify_ip_neighbor_config( + af=vaf.ADDRESS_IP4, max_number=200, max_age=0, recycle=False + ) self.vapi.cli("sh ip neighbor-config") @@ -2298,6 +2316,9 @@ class NeighborAgeTestCase(VppTestCase): self.vapi.ip_neighbor_config( af=vaf.ADDRESS_IP4, max_number=200, max_age=0, recycle=True ) + self.verify_ip_neighbor_config( + af=vaf.ADDRESS_IP4, max_number=200, max_age=0, recycle=True + ) # now new additions are allowed VppNeighbor( @@ -2321,6 +2342,9 @@ class NeighborAgeTestCase(VppTestCase): self.vapi.ip_neighbor_config( af=vaf.ADDRESS_IP4, max_number=200, max_age=2, recycle=True ) + self.verify_ip_neighbor_config( + af=vaf.ADDRESS_IP4, max_number=200, max_age=2, recycle=True + ) self.vapi.cli("sh ip4 neighbor-sorted") @@ -2399,6 +2423,9 @@ class NeighborAgeTestCase(VppTestCase): self.vapi.ip_neighbor_config( af=vaf.ADDRESS_IP4, max_number=200, max_age=1000, recycle=True ) + self.verify_ip_neighbor_config( + af=vaf.ADDRESS_IP4, max_number=200, max_age=1000, recycle=True + ) # # load up some neighbours again, then disable the aging @@ -2414,6 +2441,9 @@ class NeighborAgeTestCase(VppTestCase): self.vapi.ip_neighbor_config( af=vaf.ADDRESS_IP4, max_number=200, max_age=0, recycle=False ) + self.verify_ip_neighbor_config( + af=vaf.ADDRESS_IP4, max_number=200, max_age=0, recycle=False + ) self.virtual_sleep(10) self.assertTrue( |