X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_api.c;h=77b2cabaa44dde78b2ae9a4528ff2b0d2cb5bc1d;hb=31ed744;hp=002ea0b051a7a0fd7adfa02ba5b2b48971efedd9;hpb=ceb4d05ba0fb9771069b0081b928a9e75401fc87;p=vpp.git diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c index 002ea0b051a..77b2cabaa44 100644 --- a/src/vnet/bier/bier_api.c +++ b/src/vnet/bier/bier_api.c @@ -73,40 +73,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) { @@ -124,18 +131,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 +151,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); } })); } @@ -161,11 +168,15 @@ 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 = ntohs(mp->br_bp); + bp = ntohl(mp->br_bp); brpaths = NULL; - if (0 == bp || bp > 0xffff) + 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; goto done; @@ -191,8 +202,16 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp) mp->br_paths[ii].n_labels - 1); for (jj = 0; jj < mp->br_paths[ii].n_labels; jj++) { - brpath->frp_label_stack[jj] = - ntohl(mp->br_paths[ii].label_stack[jj]); + 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); } if (mp->br_paths[ii].is_udp_encap) @@ -236,15 +255,15 @@ vl_api_bier_route_add_del_t_handler (vl_api_bier_route_add_del_t * mp) if (mp->br_is_add) { - bier_table_route_add(&bti, ntohs(mp->br_bp), brpaths); + bier_table_route_add(&bti, bp, brpaths); } else { - bier_table_route_remove(&bti, ntohs(mp->br_bp), brpaths); + bier_table_route_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 +271,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,11 +283,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; @@ -296,17 +315,17 @@ send_bier_route_details (const bier_table_t *bt, 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 +335,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); @@ -333,26 +352,35 @@ vl_api_bier_imp_add_t_handler (vl_api_bier_imp_add_t * mp) 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 +399,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) { @@ -395,27 +423,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 +473,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) { @@ -461,22 +488,22 @@ send_bier_disp_table_details (unix_shared_memory_queue_t * q, 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); })); } @@ -603,7 +630,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 +644,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 +653,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; @@ -653,7 +680,7 @@ send_bier_disp_entry_details (const bier_disp_table_t *bdt, fp++; } - vl_msg_api_send_shmem (ctx->q, (u8 *) & mp); + vl_api_send_msg (ctx->reg, (u8 *) mp); } } } @@ -661,14 +688,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),