api: remove legacy pd msg handlers
[vpp.git] / src / vlibapi / api_helper_macros.h
index b19d4f9..7a04bb0 100644 (file)
@@ -30,7 +30,6 @@
 #define REPLY_MACRO(t)                                                  \
 do {                                                                    \
     vl_api_registration_t *rp;                                          \
-    rv = vl_msg_api_pd_handler (mp, rv);                                \
     rp = vl_api_client_index_to_registration (mp->client_index);        \
     if (rp == 0)                                                        \
       return;                                                           \
@@ -43,10 +42,27 @@ do {                                                                    \
     vl_api_send_msg (rp, (u8 *)rmp);                                    \
 } while(0);
 
+#define REPLY_MACRO_END(t)                                              \
+do {                                                                    \
+    vl_api_registration_t *rp;                                          \
+    rp = vl_api_client_index_to_registration (mp->client_index);        \
+    if (rp == 0)                                                        \
+      return;                                                           \
+                                                                        \
+    rmp = vl_msg_api_alloc (sizeof (*rmp));                             \
+    rmp->_vl_msg_id = t+(REPLY_MSG_ID_BASE);                            \
+    rmp->context = mp->context;                                         \
+    rmp->retval = rv;                                                   \
+    api_main_t *am = vlibapi_get_main ();                              \
+    void (*endian_fp) (void *);                                                \
+    endian_fp = am->msg_endian_handlers[t+(REPLY_MSG_ID_BASE)];                \
+    (*endian_fp) (rmp);                                                        \
+    vl_api_send_msg (rp, (u8 *)rmp);                                    \
+} while(0);
+
 #define REPLY_MACRO2(t, body)                                           \
 do {                                                                    \
     vl_api_registration_t *rp;                                          \
-    rv = vl_msg_api_pd_handler (mp, rv);                                \
     rp = vl_api_client_index_to_registration (mp->client_index);        \
     if (rp == 0)                                                        \
       return;                                                           \
@@ -59,10 +75,28 @@ do {                                                                    \
     vl_api_send_msg (rp, (u8 *)rmp);                                    \
 } while(0);
 
+#define REPLY_MACRO2_END(t, body)                                       \
+do {                                                                    \
+    vl_api_registration_t *rp;                                          \
+    rp = vl_api_client_index_to_registration (mp->client_index);        \
+    if (rp == 0)                                                        \
+      return;                                                           \
+                                                                        \
+    rmp = vl_msg_api_alloc (sizeof (*rmp));                             \
+    rmp->_vl_msg_id = t+(REPLY_MSG_ID_BASE);                            \
+    rmp->context = mp->context;                                         \
+    rmp->retval = rv;                                                   \
+    do {body;} while (0);                                               \
+    api_main_t *am = vlibapi_get_main ();                              \
+    void (*endian_fp) (void *);                                                \
+    endian_fp = am->msg_endian_handlers[t+(REPLY_MSG_ID_BASE)];                \
+    (*endian_fp) (rmp);                                                        \
+    vl_api_send_msg (rp, (u8 *)rmp);                                    \
+} while(0);
+
 #define REPLY_MACRO2_ZERO(t, body)                                      \
 do {                                                                    \
     vl_api_registration_t *rp;                                          \
-    rv = vl_msg_api_pd_handler (mp, rv);                                \
     rp = vl_api_client_index_to_registration (mp->client_index);        \
     if (rp == 0)                                                        \
       return;                                                           \
@@ -78,7 +112,6 @@ do {                                                                    \
 #define REPLY_MACRO_DETAILS2(t, body)                                   \
 do {                                                                    \
     vl_api_registration_t *rp;                                          \
-    rv = vl_msg_api_pd_handler (mp, rv);                                \
     rp = vl_api_client_index_to_registration (mp->client_index);        \
     if (rp == 0)                                                        \
       return;                                                           \
@@ -90,10 +123,18 @@ do {                                                                    \
     vl_api_send_msg (rp, (u8 *)rmp);                                    \
 } while(0);
 
+#define REPLY_MACRO_DETAILS4(t, rp, context, body)                     \
+do {                                                                    \
+    rmp = vl_msg_api_alloc (sizeof (*rmp));                             \
+    rmp->_vl_msg_id = htons((t)+(REPLY_MSG_ID_BASE));                   \
+    rmp->context = context;                                             \
+    do {body;} while (0);                                               \
+    vl_api_send_msg (rp, (u8 *)rmp);                                    \
+} while(0);
+
 #define REPLY_MACRO3(t, n, body)                                        \
 do {                                                                    \
     vl_api_registration_t *rp;                                          \
-    rv = vl_msg_api_pd_handler (mp, rv);                                \
     rp = vl_api_client_index_to_registration (mp->client_index);        \
     if (rp == 0)                                                        \
       return;                                                           \
@@ -109,7 +150,6 @@ do {                                                                    \
 #define REPLY_MACRO3_ZERO(t, n, body)                                   \
 do {                                                                    \
     vl_api_registration_t *rp;                                          \
-    rv = vl_msg_api_pd_handler (mp, rv);                                \
     rp = vl_api_client_index_to_registration (mp->client_index);        \
     if (rp == 0)                                                        \
       return;                                                           \
@@ -126,7 +166,6 @@ do {                                                                    \
 do {                                                                    \
     vl_api_registration_t *rp;                                          \
     u8 is_error = 0;                                                    \
-    rv = vl_msg_api_pd_handler (mp, rv);                                \
                                                                         \
     rp = vl_api_client_index_to_registration (mp->client_index);        \
     if (rp == 0)                                                        \
@@ -153,13 +192,78 @@ do {                                                                    \
     vl_api_send_msg (rp, (u8 *)rmp);                                    \
 } while(0);
 
-/* "trust, but verify" */
+#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);
 
-static inline uword
-vnet_sw_if_index_is_api_valid (u32 sw_if_index)
-{
-  return vnet_sw_interface_is_api_valid (vnet_get_main (), sw_if_index);
-}
+#define REPLY_AND_DETAILS_VEC_MACRO(t, v, mp, rmp, rv, 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 (!v || vec_len (v) == 0) {                                        \
+    cursor = ~0;                                               \
+    rv = VNET_API_ERROR_INVALID_VALUE;                         \
+  } else if (cursor == ~0)                                     \
+      cursor = 0;                                              \
+  while (cursor != ~0 && cursor < vec_len (v)) {               \
+    do {body;} while (0);                                      \
+    ++cursor;                                                  \
+    if (vl_api_process_may_suspend (vm, rp, start)) {          \
+      if (cursor < vec_len (v))                                        \
+       rv = VNET_API_ERROR_EAGAIN;                             \
+      break;                                                   \
+    }                                                          \
+  }                                                            \
+  REPLY_MACRO2 (t, ({                                          \
+    rmp->cursor = clib_host_to_net_u32 (cursor);               \
+  }));                                                         \
+} while(0);
+
+
+/* "trust, but verify" */
+#define vnet_sw_if_index_is_api_valid(sw_if_index)                            \
+  vnet_sw_interface_is_api_valid (vnet_get_main (), sw_if_index)
 
 #define VALIDATE_SW_IF_INDEX(mp)                               \
  do { u32 __sw_if_index = ntohl((mp)->sw_if_index);            \
@@ -285,7 +389,8 @@ _(bfd_events)                                   \
 _(l2_arp_term_events)                           \
 _(ip6_ra_events)                                \
 _(dhcp6_pd_reply_events)                        \
-_(dhcp6_reply_events)
+_(dhcp6_reply_events)                          \
+_(vrrp_vr_events)
 
 typedef struct
 {
@@ -305,7 +410,7 @@ typedef struct
 
   /* convenience */
   vlib_main_t *vlib_main;
-  vnet_main_t *vnet_main;
+  struct vnet_main_t *vnet_main;
 } vpe_api_main_t;
 
 extern vpe_api_main_t vpe_api_main;