diff options
author | Alexander Chernavin <achernavin@netgate.com> | 2023-06-26 15:57:57 +0000 |
---|---|---|
committer | Neale Ranns <neale@graphiant.com> | 2023-06-29 05:11:10 +0000 |
commit | e1cc8753605a40b24f132a99e915a2650ce7df51 (patch) | |
tree | 517f4945e1948b691e77e0daf97ccac8d80f7447 | |
parent | c8767c42aadb5bd63206e117673991ef799e2d18 (diff) |
ip-neighbor: add api for getting neighbor db config
There is an API call to change neighbor database configuration (i.e.
limit on peer number, aging, and recycling). With this change, make
getting current values of these settings available via the API.
Type: improvement
Change-Id: Ie9394e086b68cf9b28ad98dea162f203f8043cbb
Signed-off-by: Alexander Chernavin <achernavin@netgate.com>
-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( |