From 44db1caefbf5067b0cf0073299c9f21265331412 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Thu, 24 Dec 2020 09:16:09 +0000 Subject: linux-cp: Linux Interface Mirroring for Control Plane Integration Type: feature please see FEATURE.yaml for details. Signed-off-by: Neale Ranns Signed-off-by: Matthew Smith Signed-off-by: Jon Loeliger Signed-off-by: Pim van Pelt Change-Id: I04a45c15c0838906aa787e06660fa29f39f755fa --- src/vlibapi/api_helper_macros.h | 66 ++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 27 deletions(-) (limited to 'src/vlibapi') 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 { \ -- cgit 1.2.3-korg