X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_api.c;h=2e8fc626baabed123e0ddc9600aca633c72111d8;hb=ef90ed08;hp=840c33b7a37db9cab32b8f016d0e82e8929ecb48;hpb=6c4dae27e75fc668f86c9cca0f3f58273b680621;p=vpp.git diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c index 840c33b7a37..2e8fc626baa 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) \ @@ -73,34 +74,41 @@ vl_api_bier_table_add_del_t_handler (vl_api_bier_table_add_del_t * mp) vnm = vnet_get_main (); vnm->api_errno = 0; - bier_table_id_t bti = { - .bti_set = mp->bt_tbl_id.bt_set, - .bti_sub_domain = mp->bt_tbl_id.bt_sub_domain, - .bti_hdr_len = mp->bt_tbl_id.bt_hdr_len_id, - .bti_type = BIER_TABLE_MPLS_SPF, - .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN, - }; - - if (mp->bt_is_add) + if (mp->bt_tbl_id.bt_hdr_len_id >= BIER_HDR_LEN_2048) { - mpls_label_t label = ntohl(mp->bt_label); - - /* - * convert acceptable 'don't want a label' values from - * the API to the correct internal INVLID value - */ - if ((0 == label) || (~0 == label)) - { - label = MPLS_LABEL_INVALID; - } - bier_table_add_or_lock(&bti, label); + rv = VNET_API_ERROR_BIER_BSL_UNSUP; } else { - bier_table_unlock(&bti); - } + bier_table_id_t bti = { + .bti_set = mp->bt_tbl_id.bt_set, + .bti_sub_domain = mp->bt_tbl_id.bt_sub_domain, + .bti_hdr_len = mp->bt_tbl_id.bt_hdr_len_id, + .bti_type = BIER_TABLE_MPLS_SPF, + .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN, + }; + + if (mp->bt_is_add) + { + mpls_label_t label = ntohl(mp->bt_label); - rv = vnm->api_errno; + /* + * convert acceptable 'don't want a label' values from + * the API to the correct internal INVLID value + */ + if ((0 == label) || (~0 == label)) + { + label = MPLS_LABEL_INVALID; + } + bier_table_add_or_lock(&bti, label); + } + else + { + bier_table_unlock(&bti); + } + + rv = vnm->api_errno; + } REPLY_MACRO (VL_API_BIER_TABLE_ADD_DEL_REPLY); } @@ -157,14 +165,18 @@ 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; - bp = ntohl(mp->br_bp); brpaths = NULL; + if (mp->br_tbl_id.bt_hdr_len_id >= BIER_HDR_LEN_2048) + { + rv = VNET_API_ERROR_BIER_BSL_UNSUP; + goto done; + } if (0 == bp || bp > BIER_BP_MAX) { rv = -1; @@ -184,67 +196,36 @@ 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] = - ntohl(mp->br_paths[ii].label_stack[jj]); + 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); done: - vec_free(brpaths); rv = (rv == 0) ? vnm->api_errno : rv; REPLY_MACRO (VL_API_BIER_ROUTE_ADD_DEL_REPLY); @@ -264,11 +245,11 @@ send_bier_route_details (const bier_table_t *bt, fib_route_path_encode_t *api_rpaths = NULL, *api_rpath; bier_route_details_walk_t *ctx = args; vl_api_bier_route_details_t *mp; - vl_api_fib_path3_t *fp; + vl_api_fib_path_t *fp; u32 n_paths, m_size; n_paths = fib_path_list_get_n_paths(be->be_path_list); - m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path3_t)); + m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path_t)); mp = vl_msg_api_alloc(m_size); if (!mp) return; @@ -288,11 +269,7 @@ send_bier_route_details (const bier_table_t *bt, 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++; } @@ -327,32 +304,41 @@ 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 (); vnm->api_errno = 0; - bier_table_id_t bti = { - .bti_set = mp->bi_tbl_id.bt_set, - .bti_sub_domain = mp->bi_tbl_id.bt_sub_domain, - .bti_hdr_len = mp->bi_tbl_id.bt_hdr_len_id, - .bti_type = BIER_TABLE_MPLS_SPF, - .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN, - }; - bier_bit_string_t bs = { - .bbs_len = mp->bi_n_bytes, - .bbs_buckets = mp->bi_bytes, - }; - - bii = bier_imp_add_or_lock(&bti, ntohs(mp->bi_src), &bs); + /* + * The BSL support by VPP is limited to the size of the + * available space in the vlib_buffer_t + */ + if (mp->bi_tbl_id.bt_hdr_len_id >= BIER_HDR_LEN_2048) + { + rv = VNET_API_ERROR_BIER_BSL_UNSUP; + } + else + { + bier_table_id_t bti = { + .bti_set = mp->bi_tbl_id.bt_set, + .bti_sub_domain = mp->bi_tbl_id.bt_sub_domain, + .bti_hdr_len = mp->bi_tbl_id.bt_hdr_len_id, + .bti_type = BIER_TABLE_MPLS_SPF, + .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN, + }; + bier_bit_string_t bs = { + .bbs_len = mp->bi_n_bytes, + .bbs_buckets = mp->bi_bytes, + }; + + bii = bier_imp_add_or_lock(&bti, ntohs(mp->bi_src), &bs); + } - /* *INDENT-OFF* */ REPLY_MACRO2 (VL_API_BIER_IMP_ADD_REPLY, ({ rmp->bi_index = ntohl (bii); })); - /* *INDENT-OM* */ } static void @@ -395,10 +381,9 @@ send_bier_imp_details (vl_api_registration_t * reg, mp->bi_tbl_id.bt_sub_domain = bi->bi_tbl.bti_sub_domain; mp->bi_tbl_id.bt_hdr_len_id = bi->bi_tbl.bti_hdr_len; - mp->bi_src = htons(bier_hdr_get_src_id(©)); mp->bi_n_bytes = n_bytes; - memcpy(mp->bi_bytes, bi->bi_bits.bits, n_bytes); + memcpy(mp->bi_bytes, bi->bi_bits, n_bytes); vl_api_send_msg (reg, (u8 *) mp); } @@ -617,7 +602,7 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt, bier_disp_entry_details_walk_t *ctx = args; vl_api_bier_disp_entry_details_t *mp; bier_hdr_proto_id_t pproto; - vl_api_fib_path3_t *fp; + vl_api_fib_path_t *fp; u32 n_paths, m_size; FOR_EACH_BIER_HDR_PROTO(pproto) @@ -626,7 +611,7 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt, if (INDEX_INVALID != pl) { n_paths = fib_path_list_get_n_paths(pl); - m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path3_t)); + m_size = sizeof(*mp) + (n_paths * sizeof(vl_api_fib_path_t)); mp = vl_msg_api_alloc(m_size); if (!mp) return; @@ -645,11 +630,7 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt, 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++; }