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=92712580f14c2b4dfd7ae8b222968b7ad78bb173;hb=775f73c;hpb=be302d72031a7620fd1e79a620a99e8822bbac28 diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c index 92712580f14..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) \ @@ -73,40 +74,47 @@ 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); } static void -send_bier_table_details (unix_shared_memory_queue_t * q, +send_bier_table_details (vl_api_registration_t * reg, u32 context, const bier_table_t *bt) { @@ -115,7 +123,7 @@ send_bier_table_details (unix_shared_memory_queue_t * q, 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; @@ -124,18 +132,18 @@ send_bier_table_details (unix_shared_memory_queue_t * q, mp->bt_tbl_id.bt_sub_domain = bt->bt_id.bti_sub_domain; mp->bt_tbl_id.bt_hdr_len_id = bt->bt_id.bti_hdr_len; - vl_msg_api_send_shmem (q, (u8 *) & mp); + vl_api_send_msg (reg, (u8 *) mp); } static void vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp) { - unix_shared_memory_queue_t *q; + vl_api_registration_t *reg; bier_table_t *bt; - q = vl_api_client_index_to_input_queue (mp->client_index); - if (q == 0) - return; + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; pool_foreach(bt, bier_table_pool, ({ @@ -144,7 +152,7 @@ vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp) */ if (bier_table_is_main(bt)) { - send_bier_table_details(q, mp->context, bt); + send_bier_table_details(reg, mp->context, bt); } })); } @@ -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); @@ -252,7 +233,7 @@ done: typedef struct bier_route_details_walk_t_ { - unix_shared_memory_queue_t * q; + vl_api_registration_t * reg; u32 context; } bier_route_details_walk_t; @@ -264,16 +245,16 @@ 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; - 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; @@ -283,30 +264,29 @@ 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++; } - vl_msg_api_send_shmem (ctx->q, (u8 *) & mp); + vl_api_send_msg (ctx->reg, (u8 *) mp); } static void vl_api_bier_route_dump_t_handler (vl_api_bier_route_dump_t * mp) { - unix_shared_memory_queue_t *q; + vl_api_registration_t *reg; - q = vl_api_client_index_to_input_queue (mp->client_index); - if (q == 0) - return; + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; bier_table_id_t bti = { .bti_set = mp->br_tbl_id.bt_set, @@ -316,7 +296,7 @@ vl_api_bier_route_dump_t_handler (vl_api_bier_route_dump_t * mp) .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN, }; bier_route_details_walk_t ctx = { - .q = q, + .reg = reg, .context = mp->context, }; bier_table_walk(&bti, send_bier_route_details, &ctx); @@ -327,32 +307,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 = bii; + rmp->bi_index = ntohl (bii); })); - /* *INDENT-OM* */ } static void @@ -371,7 +360,7 @@ vl_api_bier_imp_del_t_handler (vl_api_bier_imp_del_t * mp) } static void -send_bier_imp_details (unix_shared_memory_queue_t * q, +send_bier_imp_details (vl_api_registration_t * reg, u32 context, const bier_imp_t *bi) { @@ -387,7 +376,7 @@ send_bier_imp_details (unix_shared_memory_queue_t * q, 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; @@ -395,27 +384,26 @@ send_bier_imp_details (unix_shared_memory_queue_t * q, 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_msg_api_send_shmem (q, (u8 *) & mp); + vl_api_send_msg (reg, (u8 *) mp); } static void vl_api_bier_imp_dump_t_handler (vl_api_bier_imp_dump_t * mp) { - unix_shared_memory_queue_t *q; + vl_api_registration_t *reg; bier_imp_t *bi; - q = vl_api_client_index_to_input_queue (mp->client_index); - if (q == 0) - return; + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; pool_foreach(bi, bier_imp_pool, ({ - send_bier_imp_details(q, mp->context, bi); + send_bier_imp_details(reg, mp->context, bi); })); } @@ -446,7 +434,7 @@ vl_api_bier_disp_table_add_del_t_handler (vl_api_bier_disp_table_add_del_t * mp) } static void -send_bier_disp_table_details (unix_shared_memory_queue_t * q, +send_bier_disp_table_details (vl_api_registration_t * reg, u32 context, const bier_disp_table_t *bdt) { @@ -455,28 +443,28 @@ send_bier_disp_table_details (unix_shared_memory_queue_t * q, 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; mp->bdt_tbl_id = htonl(bdt->bdt_table_id); - vl_msg_api_send_shmem (q, (u8 *) & mp); + vl_api_send_msg (reg, (u8 *) mp); } static void vl_api_bier_disp_table_dump_t_handler (vl_api_bier_disp_table_dump_t * mp) { - unix_shared_memory_queue_t *q; + vl_api_registration_t *reg; bier_disp_table_t *bdt; - q = vl_api_client_index_to_input_queue (mp->client_index); - if (q == 0) - return; + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; pool_foreach(bdt, bier_disp_table_pool, ({ - send_bier_disp_table_details(q, mp->context, bdt); + send_bier_disp_table_details(reg, mp->context, bdt); })); } @@ -520,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)); } @@ -603,7 +591,7 @@ done: typedef struct bier_disp_entry_details_walk_t_ { - unix_shared_memory_queue_t * q; + vl_api_registration_t * reg; u32 context; } bier_disp_entry_details_walk_t; @@ -617,7 +605,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,12 +614,12 @@ 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; - 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; @@ -640,20 +628,19 @@ 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++; } - vl_msg_api_send_shmem (ctx->q, (u8 *) & mp); + vl_api_send_msg (ctx->reg, (u8 *) mp); } } } @@ -661,14 +648,14 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt, static void vl_api_bier_disp_entry_dump_t_handler (vl_api_bier_disp_entry_dump_t * mp) { - unix_shared_memory_queue_t *q; + vl_api_registration_t *reg; - q = vl_api_client_index_to_input_queue (mp->client_index); - if (q == 0) - return; + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; bier_disp_entry_details_walk_t ctx = { - .q = q, + .reg = reg, .context = mp->context, }; bier_disp_table_walk(ntohl(mp->bde_tbl_id),