tcp: avoid fr segments less than mss if possible
[vpp.git] / src / vnet / bier / bier_api.c
index 93048a0..eeab2fe 100644 (file)
 #include <vnet/fib/fib_table.h>
 #include <vnet/mfib/mfib_table.h>
 
-#include <vnet/vnet_msg_enum.h>
-
-#define vl_typedefs            /* define message structures */
-#include <vnet/vnet_all_api_h.h>
-#undef vl_typedefs
-
-#define vl_endianfun           /* define message structures */
-#include <vnet/vnet_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
-#define vl_printfun
-#include <vnet/vnet_all_api_h.h>
-#undef vl_printfun
+#include <vnet/format_fns.h>
+#include <bier/bier.api_enum.h>
+#include <bier/bier.api_types.h>
 
+#define REPLY_MSG_ID_BASE bier_main.msg_id_base
 #include <vlibapi/api_helper_macros.h>
-#include <vnet/fib/fib_api.h>
 
-#define foreach_bier_api_msg                            \
-    _(BIER_TABLE_ADD_DEL, bier_table_add_del)           \
-    _(BIER_TABLE_DUMP, bier_table_dump)                 \
-    _(BIER_ROUTE_ADD_DEL, bier_route_add_del)           \
-    _(BIER_ROUTE_DUMP, bier_route_dump)                 \
-    _(BIER_IMP_ADD, bier_imp_add)                       \
-    _(BIER_IMP_DEL, bier_imp_del)                       \
-    _(BIER_IMP_DUMP, bier_imp_dump)                     \
-    _(BIER_DISP_TABLE_ADD_DEL, bier_disp_table_add_del) \
-    _(BIER_DISP_TABLE_DUMP, bier_disp_table_dump)       \
-    _(BIER_DISP_ENTRY_ADD_DEL, bier_disp_entry_add_del) \
-    _(BIER_DISP_ENTRY_DUMP, bier_disp_entry_dump)
+typedef struct
+{
+  u16 msg_id_base;
+} bier_main_t;
+
+bier_main_t bier_main;
 
 static void
 vl_api_bier_table_add_del_t_handler (vl_api_bier_table_add_del_t * mp)
@@ -123,8 +105,8 @@ send_bier_table_details (vl_api_registration_t * reg,
     mp = vl_msg_api_alloc(sizeof(*mp));
     if (!mp)
         return;
-    memset(mp, 0, sizeof(*mp));
-    mp->_vl_msg_id = ntohs(VL_API_BIER_TABLE_DETAILS);
+    clib_memset(mp, 0, sizeof(*mp));
+    mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_TABLE_DETAILS);
     mp->context = context;
 
     mp->bt_label = bt->bt_ll;
@@ -145,8 +127,8 @@ vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp)
     if (!reg)
       return;
 
-    pool_foreach(bt, bier_table_pool,
-    ({
+    pool_foreach (bt, bier_table_pool)
+     {
         /*
          * skip the ecmp tables.
          */
@@ -154,7 +136,7 @@ vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp)
         {
             send_bier_table_details(reg, mp->context, bt);
         }
-    }));
+    }
 }
 
 static void
@@ -169,10 +151,10 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp)
 
     vnm = vnet_get_main ();
     vnm->api_errno = 0;
-    bp = ntohl(mp->br_bp);
+    bp = ntohl(mp->br_route.br_bp);
     brpaths = NULL;
 
-    if (mp->br_tbl_id.bt_hdr_len_id >= BIER_HDR_LEN_2048)
+    if (mp->br_route.br_tbl_id.bt_hdr_len_id >= BIER_HDR_LEN_2048)
     {
         rv = VNET_API_ERROR_BIER_BSL_UNSUP;
         goto done;
@@ -184,19 +166,19 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp)
     }
 
     bier_table_id_t bti = {
-        .bti_set = mp->br_tbl_id.bt_set,
-        .bti_sub_domain = mp->br_tbl_id.bt_sub_domain,
-        .bti_hdr_len = mp->br_tbl_id.bt_hdr_len_id,
+        .bti_set = mp->br_route.br_tbl_id.bt_set,
+        .bti_sub_domain = mp->br_route.br_tbl_id.bt_sub_domain,
+        .bti_hdr_len = mp->br_route.br_tbl_id.bt_hdr_len_id,
         .bti_type = BIER_TABLE_MPLS_SPF,
         .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
     };
 
-    vec_validate(brpaths, mp->br_n_paths - 1);
+    vec_validate(brpaths, mp->br_route.br_n_paths - 1);
 
     vec_foreach_index(ii, brpaths)
     {
         brpath = &brpaths[ii];
-        rv = fib_path_api_parse(&mp->br_paths[ii], brpath);
+        rv = fib_api_path_decode(&mp->br_route.br_paths[ii], brpath);
 
         if (0 != rv)
         {
@@ -204,13 +186,24 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp)
         }
     }
 
-    if (mp->br_is_add)
+    if (mp->br_is_replace)
+    {
+        if (0 == vec_len(brpaths))
+        {
+            bier_table_route_delete(&bti, bp);
+        }
+        else
+        {
+            bier_table_route_path_update(&bti, bp, brpaths);
+        }
+    }
+    else if (mp->br_is_add)
     {
-        bier_table_route_add(&bti, bp, brpaths);
+        bier_table_route_path_add(&bti, bp, brpaths);
     }
     else
     {
-        bier_table_route_remove(&bti, bp, brpaths);
+        bier_table_route_path_remove(&bti, bp, brpaths);
     }
     vec_free(brpaths);
 
@@ -231,9 +224,12 @@ send_bier_route_details (const bier_table_t *bt,
                          const bier_entry_t *be,
                          void *args)
 {
-    fib_route_path_encode_t *api_rpaths = NULL, *api_rpath;
     bier_route_details_walk_t *ctx = args;
     vl_api_bier_route_details_t *mp;
+    fib_path_encode_ctx_t path_ctx = {
+        .rpaths = NULL,
+    };
+    fib_route_path_t *rpath;
     vl_api_fib_path_t *fp;
     u32 n_paths, m_size;
 
@@ -243,25 +239,29 @@ send_bier_route_details (const bier_table_t *bt,
     if (!mp)
         return;
 
-    memset(mp, 0, m_size);
-    mp->_vl_msg_id = ntohs(VL_API_BIER_ROUTE_DETAILS);
+    clib_memset(mp, 0, m_size);
+    mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_ROUTE_DETAILS);
     mp->context = ctx->context;
 
-    mp->br_tbl_id.bt_set = bt->bt_id.bti_set;
-    mp->br_tbl_id.bt_sub_domain = bt->bt_id.bti_sub_domain;
-    mp->br_tbl_id.bt_hdr_len_id = bt->bt_id.bti_hdr_len;
-    mp->br_bp = htons(be->be_bp);
-    mp->br_n_paths = htonl(n_paths);
+    mp->br_route.br_tbl_id.bt_set = bt->bt_id.bti_set;
+    mp->br_route.br_tbl_id.bt_sub_domain = bt->bt_id.bti_sub_domain;
+    mp->br_route.br_tbl_id.bt_hdr_len_id = bt->bt_id.bti_hdr_len;
+    mp->br_route.br_bp = htonl(be->be_bp);
+    mp->br_route.br_n_paths = htonl(n_paths);
 
-    fib_path_list_walk(be->be_path_list, fib_path_encode, &api_rpaths);
+    fib_path_list_walk_w_ext(be->be_path_list,
+                             NULL,
+                             fib_path_encode,
+                            &path_ctx);
 
-    fp = mp->br_paths;
-    vec_foreach (api_rpath, api_rpaths)
+    fp = mp->br_route.br_paths;
+    vec_foreach (rpath, path_ctx.rpaths)
     {
-        fib_api_path_encode(api_rpath, fp);
+        fib_api_path_encode(rpath, fp);
         fp++;
     }
 
+    vec_free(path_ctx.rpaths);
     vl_api_send_msg (ctx->reg, (u8 *) mp);
 }
 
@@ -362,8 +362,8 @@ send_bier_imp_details (vl_api_registration_t * reg,
     mp = vl_msg_api_alloc(sizeof(*mp) + n_bytes);
     if (!mp)
         return;
-    memset(mp, 0, sizeof(*mp)+n_bytes);
-    mp->_vl_msg_id = ntohs(VL_API_BIER_IMP_DETAILS);
+    clib_memset(mp, 0, sizeof(*mp)+n_bytes);
+    mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_IMP_DETAILS);
     mp->context = context;
 
     mp->bi_tbl_id.bt_set = bi->bi_tbl.bti_set;
@@ -387,10 +387,10 @@ vl_api_bier_imp_dump_t_handler (vl_api_bier_imp_dump_t * mp)
     if (!reg)
       return;
 
-    pool_foreach(bi, bier_imp_pool,
-    ({
+    pool_foreach (bi, bier_imp_pool)
+     {
         send_bier_imp_details(reg, mp->context, bi);
-    }));
+    }
 }
 
 static void
@@ -429,8 +429,9 @@ send_bier_disp_table_details (vl_api_registration_t * reg,
     mp = vl_msg_api_alloc(sizeof(*mp));
     if (!mp)
         return;
-    memset(mp, 0, sizeof(*mp));
-    mp->_vl_msg_id = ntohs(VL_API_BIER_DISP_TABLE_DETAILS);
+    clib_memset(mp, 0, sizeof(*mp));
+    mp->_vl_msg_id =
+      ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_DISP_TABLE_DETAILS);
     mp->context = context;
 
     mp->bdt_tbl_id = htonl(bdt->bdt_table_id);
@@ -448,10 +449,10 @@ vl_api_bier_disp_table_dump_t_handler (vl_api_bier_disp_table_dump_t * mp)
     if (!reg)
       return;
 
-    pool_foreach(bdt, bier_disp_table_pool,
-    ({
+    pool_foreach (bdt, bier_disp_table_pool)
+     {
         send_bier_disp_table_details(reg, mp->context, bdt);
-    }));
+    }
 }
 
 static void
@@ -492,16 +493,16 @@ vl_api_bier_disp_entry_add_del_t_handler (vl_api_bier_disp_entry_add_del_t * mp)
             brp->frp_rpf_id = ntohl(mp->bde_paths[ii].rpf_id);
         }
 
-        if (0 == mp->bde_paths[ii].afi)
+        if (FIB_API_PATH_NH_PROTO_IP4 == mp->bde_paths[ii].proto)
         {
             clib_memcpy (&brp->frp_addr.ip4,
-                         mp->bde_paths[ii].next_hop,
+                         &mp->bde_paths[ii].nh.address.ip4,
                          sizeof (brp->frp_addr.ip4));
         }
-        else
+        else if (FIB_API_PATH_NH_PROTO_IP6 == mp->bde_paths[ii].proto)
         {
             clib_memcpy (&brp->frp_addr.ip6,
-                         mp->bde_paths[ii].next_hop,
+                         &mp->bde_paths[ii].nh.address.ip6,
                          sizeof (brp->frp_addr.ip6));
         }
         if (ip46_address_is_zero(&brp->frp_addr))
@@ -587,7 +588,6 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
                               u16 bp,
                               void *args)
 {
-    fib_route_path_encode_t *api_rpaths = NULL, *api_rpath;
     bier_disp_entry_details_walk_t *ctx = args;
     vl_api_bier_disp_entry_details_t *mp;
     bier_hdr_proto_id_t pproto;
@@ -597,34 +597,42 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
     FOR_EACH_BIER_HDR_PROTO(pproto)
     {
         fib_node_index_t pl = bde->bde_pl[pproto];
+
         if (INDEX_INVALID != pl)
         {
+            fib_path_encode_ctx_t path_ctx = {
+                .rpaths = NULL,
+            };
+            fib_route_path_t *rpath;
+
             n_paths = fib_path_list_get_n_paths(pl);
             m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path_t));
             mp = vl_msg_api_alloc(m_size);
             if (!mp)
                 return;
 
-            memset(mp, 0, m_size);
-            mp->_vl_msg_id = ntohs(VL_API_BIER_DISP_ENTRY_DETAILS);
-            mp->context = ctx->context;
+            clib_memset(mp, 0, m_size);
+           mp->_vl_msg_id =
+             ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_DISP_ENTRY_DETAILS);
+           mp->context = ctx->context;
 
-            mp->bde_tbl_id = htonl(bdt->bdt_table_id);
-            mp->bde_n_paths = htonl(n_paths);
-            mp->bde_payload_proto = pproto;
-            mp->bde_bp = htons(bp);
+           mp->bde_tbl_id = htonl (bdt->bdt_table_id);
+           mp->bde_n_paths = htonl (n_paths);
+           mp->bde_payload_proto = pproto;
+           mp->bde_bp = htons (bp);
 
-            fib_path_list_walk(pl, fib_path_encode, &api_rpaths);
+           fib_path_list_walk_w_ext (pl, NULL, fib_path_encode, &path_ctx);
 
-            fp = mp->bde_paths;
-            vec_foreach (api_rpath, api_rpaths)
-            {
-                fib_api_path_encode(api_rpath, fp);
-                fp++;
-            }
+           fp = mp->bde_paths;
+           vec_foreach (rpath, path_ctx.rpaths)
+             {
+               fib_api_path_encode (rpath, fp);
+               fp++;
+             }
 
-            vl_api_send_msg (ctx->reg, (u8 *) mp);
-        }
+           vl_api_send_msg (ctx->reg, (u8 *) mp);
+           vec_free (path_ctx.rpaths);
+       }
     }
 }
 
@@ -646,39 +654,14 @@ vl_api_bier_disp_entry_dump_t_handler (vl_api_bier_disp_entry_dump_t * mp)
                          &ctx);
 }
 
-#define vl_msg_name_crc_list
-#include <vnet/bier/bier.api.h>
-#undef vl_msg_name_crc_list
-
-static void
-setup_message_id_table (api_main_t * am)
-{
-#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id);
-    foreach_vl_msg_name_crc_bier;
-#undef _
-}
+#include <bier/bier.api.c>
 
 static clib_error_t *
 bier_api_hookup (vlib_main_t * vm)
 {
-    api_main_t *am = &api_main;
-
-#define _(N,n)                                          \
-    vl_msg_api_set_handlers(VL_API_##N, #n,             \
-                            vl_api_##n##_t_handler,     \
-                            vl_noop_handler,            \
-                            vl_api_##n##_t_endian,      \
-                            vl_api_##n##_t_print,       \
-                            sizeof(vl_api_##n##_t), 1);
-    foreach_bier_api_msg;
-#undef _
-
-    /*
-     * Set up the (msg_name, crc, message-id) table
-     */
-    setup_message_id_table (am);
+  bier_main.msg_id_base = setup_message_id_table ();
 
-    return 0;
+  return 0;
 }
 
 VLIB_API_INIT_FUNCTION (bier_api_hookup);