diff options
author | Neale Ranns <nranns@cisco.com> | 2020-12-24 09:16:09 +0000 |
---|---|---|
committer | Ole Tr�an <otroan@employees.org> | 2021-02-04 14:16:34 +0000 |
commit | 44db1caefbf5067b0cf0073299c9f21265331412 (patch) | |
tree | 4981dc028db66398cf6dc2ca9d309aa5a7bf7a1d /src/vlibapi | |
parent | 1a52d37fc50acd479274c29c2e92b05cf32c3a6d (diff) |
linux-cp: Linux Interface Mirroring for Control Plane Integration
Type: feature
please see FEATURE.yaml for details.
Signed-off-by: Neale Ranns <nranns@cisco.com>
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
Signed-off-by: Jon Loeliger <jdl@netgate.com>
Signed-off-by: Pim van Pelt <pim@ipng.nl>
Change-Id: I04a45c15c0838906aa787e06660fa29f39f755fa
Diffstat (limited to 'src/vlibapi')
-rw-r--r-- | src/vlibapi/api_helper_macros.h | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/src/vlibapi/api_helper_macros.h b/src/vlibapi/api_helper_macros.h index 8064d67a14e..d49282e9e65 100644 --- a/src/vlibapi/api_helper_macros.h +++ b/src/vlibapi/api_helper_macros.h @@ -201,33 +201,45 @@ do { \ vl_api_send_msg (rp, (u8 *)rmp); \ } while(0); -#define REPLY_AND_DETAILS_MACRO(t, p, body) \ -do { \ - vl_api_registration_t *rp; \ - rp = vl_api_client_index_to_registration (mp->client_index); \ - if (rp == 0) \ - return; \ - u32 cursor = clib_net_to_host_u32 (mp->cursor); \ - vlib_main_t *vm = vlib_get_main (); \ - f64 start = vlib_time_now (vm); \ - if (pool_is_free_index (p, cursor)) { \ - cursor = pool_next_index (p, cursor); \ - if (cursor == ~0) \ - rv = VNET_API_ERROR_INVALID_VALUE; \ - } \ - while (cursor != ~0) { \ - do {body;} while (0); \ - cursor = pool_next_index (p, cursor); \ - if (vl_api_process_may_suspend (vm, rp, start)) { \ - if (cursor != ~0) \ - rv = VNET_API_ERROR_EAGAIN; \ - break; \ - } \ - } \ - REPLY_MACRO2 (t, ({ \ - rmp->cursor = clib_host_to_net_u32 (cursor); \ - })); \ -} while(0); +#define REPLY_AND_DETAILS_MACRO(t, p, body) \ + do \ + { \ + if (pool_elts (p) == 0) \ + { \ + REPLY_MACRO (t); \ + break; \ + } \ + vl_api_registration_t *rp; \ + rp = vl_api_client_index_to_registration (mp->client_index); \ + if (rp == 0) \ + return; \ + u32 cursor = clib_net_to_host_u32 (mp->cursor); \ + vlib_main_t *vm = vlib_get_main (); \ + f64 start = vlib_time_now (vm); \ + if (pool_is_free_index (p, cursor)) \ + { \ + cursor = pool_next_index (p, cursor); \ + if (cursor == ~0) \ + rv = VNET_API_ERROR_INVALID_VALUE; \ + } \ + while (cursor != ~0) \ + { \ + do \ + { \ + body; \ + } \ + while (0); \ + cursor = pool_next_index (p, cursor); \ + if (vl_api_process_may_suspend (vm, rp, start)) \ + { \ + if (cursor != ~0) \ + rv = VNET_API_ERROR_EAGAIN; \ + break; \ + } \ + } \ + REPLY_MACRO2 (t, ({ rmp->cursor = clib_host_to_net_u32 (cursor); })); \ + } \ + while (0); #define REPLY_AND_DETAILS_VEC_MACRO(t, v, mp, rmp, rv, body) \ do { \ |