FIB: encode the label stack in the FIB path during table dump
[vpp.git] / src / vnet / bier / bier_api.c
index 8f168c4..d8248b1 100644 (file)
@@ -49,6 +49,7 @@
 #undef vl_printfun
 
 #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)           \
@@ -122,7 +123,7 @@ send_bier_table_details (vl_api_registration_t * reg,
     mp = vl_msg_api_alloc(sizeof(*mp));
     if (!mp)
         return;
-    memset(mp, 0, sizeof(*mp));
+    clib_memset(mp, 0, sizeof(*mp));
     mp->_vl_msg_id = ntohs(VL_API_BIER_TABLE_DETAILS);
     mp->context = context;
 
@@ -164,7 +165,7 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp)
     vnet_main_t *vnm;
     bier_bp_t bp;
     int rv = 0;
-    u8 ii, jj;
+    u8 ii;
 
     vnm = vnet_get_main ();
     vnm->api_errno = 0;
@@ -195,71 +196,32 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp)
     vec_foreach_index(ii, brpaths)
     {
         brpath = &brpaths[ii];
-        memset(brpath, 0, sizeof(*brpath));
-        brpath->frp_sw_if_index = ~0;
+        rv = fib_path_api_parse(&mp->br_paths[ii], brpath);
 
-        vec_validate(brpath->frp_label_stack,
-                     mp->br_paths[ii].n_labels - 1);
-        for (jj = 0; jj < mp->br_paths[ii].n_labels; jj++)
+        if (0 != rv)
         {
-            brpath->frp_label_stack[jj].fml_value =
-                ntohl(mp->br_paths[ii].label_stack[jj].label);
-            brpath->frp_label_stack[jj].fml_ttl =
-                mp->br_paths[ii].label_stack[jj].ttl;
-            brpath->frp_label_stack[jj].fml_exp =
-                mp->br_paths[ii].label_stack[jj].exp;
-            brpath->frp_label_stack[jj].fml_mode =
-                (mp->br_paths[ii].label_stack[jj].is_uniform ?
-                 FIB_MPLS_LSP_MODE_UNIFORM :
-                 FIB_MPLS_LSP_MODE_PIPE);
+            goto done;
         }
+    }
 
-        if (mp->br_paths[ii].is_udp_encap)
+    if (mp->br_is_replace)
+    {
+        if (0 == vec_len(brpaths))
         {
-            brpath->frp_flags |= FIB_ROUTE_PATH_UDP_ENCAP;
-            brpath->frp_udp_encap_id = ntohl(mp->br_paths[ii].next_hop_id);
+            bier_table_route_delete(&bti, bp);
         }
         else
         {
-            if (0 == mp->br_paths[ii].afi)
-            {
-                clib_memcpy (&brpath->frp_addr.ip4,
-                             mp->br_paths[ii].next_hop,
-                             sizeof (brpath->frp_addr.ip4));
-            }
-            else
-            {
-                clib_memcpy (&brpath->frp_addr.ip6,
-                             mp->br_paths[ii].next_hop,
-                             sizeof (brpath->frp_addr.ip6));
-            }
-            if (ip46_address_is_zero(&brpath->frp_addr))
-            {
-                index_t bdti;
-
-                bdti = bier_disp_table_find(ntohl(mp->br_paths[ii].table_id));
-
-                if (INDEX_INVALID != bdti)
-                {
-                    brpath->frp_fib_index = bdti;
-                    brpath->frp_proto = DPO_PROTO_BIER;
-                }
-                else
-                {
-                    rv = VNET_API_ERROR_NO_SUCH_FIB;
-                    goto done;
-                }
-            }
+            bier_table_route_path_update(&bti, bp, brpaths);
         }
     }
-
-    if (mp->br_is_add)
+    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);
 
@@ -292,7 +254,7 @@ send_bier_route_details (const bier_table_t *bt,
     if (!mp)
         return;
 
-    memset(mp, 0, m_size);
+    clib_memset(mp, 0, m_size);
     mp->_vl_msg_id = ntohs(VL_API_BIER_ROUTE_DETAILS);
     mp->context = ctx->context;
 
@@ -302,7 +264,10 @@ send_bier_route_details (const bier_table_t *bt,
     mp->br_bp = htons(be->be_bp);
     mp->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,
+                             &api_rpaths);
 
     fp = mp->br_paths;
     vec_foreach (api_rpath, api_rpaths)
@@ -342,7 +307,7 @@ vl_api_bier_imp_add_t_handler (vl_api_bier_imp_add_t * mp)
 {
     vl_api_bier_imp_add_reply_t *rmp;
     vnet_main_t *vnm;
-    index_t bii;
+    index_t bii = ~0;
     int rv = 0;
 
     vnm = vnet_get_main ();
@@ -411,7 +376,7 @@ 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);
+    clib_memset(mp, 0, sizeof(*mp)+n_bytes);
     mp->_vl_msg_id = ntohs(VL_API_BIER_IMP_DETAILS);
     mp->context = context;
 
@@ -478,7 +443,7 @@ 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));
+    clib_memset(mp, 0, sizeof(*mp));
     mp->_vl_msg_id = ntohs(VL_API_BIER_DISP_TABLE_DETAILS);
     mp->context = context;
 
@@ -543,13 +508,13 @@ vl_api_bier_disp_entry_add_del_t_handler (vl_api_bier_disp_entry_add_del_t * mp)
 
         if (0 == mp->bde_paths[ii].afi)
         {
-            clib_memcpy (&brp->frp_addr.ip4,
+            clib_memcpy_fast (&brp->frp_addr.ip4,
                          mp->bde_paths[ii].next_hop,
                          sizeof (brp->frp_addr.ip4));
         }
         else
         {
-            clib_memcpy (&brp->frp_addr.ip6,
+            clib_memcpy_fast (&brp->frp_addr.ip6,
                          mp->bde_paths[ii].next_hop,
                          sizeof (brp->frp_addr.ip6));
         }
@@ -654,7 +619,7 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
             if (!mp)
                 return;
 
-            memset(mp, 0, m_size);
+            clib_memset(mp, 0, m_size);
             mp->_vl_msg_id = ntohs(VL_API_BIER_DISP_ENTRY_DETAILS);
             mp->context = ctx->context;
 
@@ -663,7 +628,10 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
             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,
+                                     &api_rpaths);
 
             fp = mp->bde_paths;
             vec_foreach (api_rpath, api_rpaths)