X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_api.c;h=d8248b1b2bd2a0860d1b5128f8554a12c540007e;hp=77b2cabaa44dde78b2ae9a4528ff2b0d2cb5bc1d;hb=775f73c;hpb=31ed74407643595fdce206e9d7487108fb8b33ab diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c index 77b2cabaa44..d8248b1b2bd 100644 --- a/src/vnet/bier/bier_api.c +++ b/src/vnet/bier/bier_api.c @@ -49,6 +49,7 @@ #undef vl_printfun #include +#include #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,16 +264,15 @@ 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) { - fp->weight = api_rpath->rpath.frp_weight; - fp->preference = api_rpath->rpath.frp_preference; - fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index); - fp->n_labels = 0; - copy_fib_next_hop (api_rpath, fp); + fib_api_path_encode(api_rpath, fp); fp++; } @@ -346,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 (); @@ -415,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; @@ -482,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; @@ -547,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)); } @@ -658,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; @@ -667,16 +628,15 @@ 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) { - fp->weight = api_rpath->rpath.frp_weight; - fp->preference = api_rpath->rpath.frp_preference; - fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index); - fp->n_labels = 0; - copy_fib_next_hop (api_rpath, fp); + fib_api_path_encode(api_rpath, fp); fp++; }