fib: fib api updates
[vpp.git] / src / vnet / bier / bier_api.c
index d8248b1..66f6b42 100644 (file)
@@ -169,10 +169,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 +184,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)
         {
@@ -242,9 +242,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;
 
@@ -258,24 +261,25 @@ send_bier_route_details (const bier_table_t *bt,
     mp->_vl_msg_id = ntohs(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_w_ext(be->be_path_list,
                              NULL,
                              fib_path_encode,
-                             &api_rpaths);
+                            &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);
 }
 
@@ -506,16 +510,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_fast (&brp->frp_addr.ip4,
-                         mp->bde_paths[ii].next_hop,
+            clib_memcpy (&brp->frp_addr.ip4,
+                         &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_fast (&brp->frp_addr.ip6,
-                         mp->bde_paths[ii].next_hop,
+            clib_memcpy (&brp->frp_addr.ip6,
+                         &mp->bde_paths[ii].nh.address.ip6,
                          sizeof (brp->frp_addr.ip6));
         }
         if (ip46_address_is_zero(&brp->frp_addr))
@@ -601,7 +605,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;
@@ -611,8 +614,14 @@ 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);
@@ -631,16 +640,17 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt,
             fib_path_list_walk_w_ext(pl,
                                      NULL,
                                      fib_path_encode,
-                                     &api_rpaths);
+                                     &path_ctx);
 
             fp = mp->bde_paths;
-            vec_foreach (api_rpath, api_rpaths)
+            vec_foreach (rpath, path_ctx.rpaths)
             {
-                fib_api_path_encode(api_rpath, fp);
+                fib_api_path_encode(rpath, fp);
                 fp++;
             }
 
             vl_api_send_msg (ctx->reg, (u8 *) mp);
+            vec_free(path_ctx.rpaths);
         }
     }
 }