X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_api.c;h=66f6b422810f08d93a795295d440163ead973cd6;hb=097fa66b9;hp=7263ec65720604328c921d5b49dc253bd0ad498f;hpb=2303cb181b51f63c909cd506125c1f832432865a;p=vpp.git diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c index 7263ec65720..66f6b422810 100644 --- a/src/vnet/bier/bier_api.c +++ b/src/vnet/bier/bier_api.c @@ -123,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; @@ -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) { @@ -204,13 +204,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 +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; @@ -243,25 +257,29 @@ 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; - 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); } @@ -293,7 +311,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 (); @@ -362,7 +380,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; @@ -429,7 +447,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; @@ -492,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 (&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 +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; @@ -597,15 +614,21 @@ 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); + clib_memset(mp, 0, m_size); mp->_vl_msg_id = ntohs(VL_API_BIER_DISP_ENTRY_DETAILS); mp->context = ctx->context; @@ -614,16 +637,20 @@ 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, + &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); } } }