X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_api.c;h=eeab2fef9645c2639a882b079a44544ba92a36f6;hb=f441b5d0e;hp=77b2cabaa44dde78b2ae9a4528ff2b0d2cb5bc1d;hpb=31ed74407643595fdce206e9d7487108fb8b33ab;p=vpp.git diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c index 77b2cabaa44..eeab2fef964 100644 --- a/src/vnet/bier/bier_api.c +++ b/src/vnet/bier/bier_api.c @@ -32,36 +32,19 @@ #include #include -#include - -#define vl_typedefs /* define message structures */ -#include -#undef vl_typedefs - -#define vl_endianfun /* define message structures */ -#include -#undef vl_endianfun - -/* instantiate all the print functions we know about */ -#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) -#define vl_printfun -#include -#undef vl_printfun +#include +#include +#include +#define REPLY_MSG_ID_BASE bier_main.msg_id_base #include -#define foreach_bier_api_msg \ - _(BIER_TABLE_ADD_DEL, bier_table_add_del) \ - _(BIER_TABLE_DUMP, bier_table_dump) \ - _(BIER_ROUTE_ADD_DEL, bier_route_add_del) \ - _(BIER_ROUTE_DUMP, bier_route_dump) \ - _(BIER_IMP_ADD, bier_imp_add) \ - _(BIER_IMP_DEL, bier_imp_del) \ - _(BIER_IMP_DUMP, bier_imp_dump) \ - _(BIER_DISP_TABLE_ADD_DEL, bier_disp_table_add_del) \ - _(BIER_DISP_TABLE_DUMP, bier_disp_table_dump) \ - _(BIER_DISP_ENTRY_ADD_DEL, bier_disp_entry_add_del) \ - _(BIER_DISP_ENTRY_DUMP, bier_disp_entry_dump) +typedef struct +{ + u16 msg_id_base; +} bier_main_t; + +bier_main_t bier_main; static void vl_api_bier_table_add_del_t_handler (vl_api_bier_table_add_del_t * mp) @@ -122,8 +105,8 @@ send_bier_table_details (vl_api_registration_t * reg, mp = vl_msg_api_alloc(sizeof(*mp)); if (!mp) return; - memset(mp, 0, sizeof(*mp)); - mp->_vl_msg_id = ntohs(VL_API_BIER_TABLE_DETAILS); + clib_memset(mp, 0, sizeof(*mp)); + mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_TABLE_DETAILS); mp->context = context; mp->bt_label = bt->bt_ll; @@ -144,8 +127,8 @@ vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp) if (!reg) return; - pool_foreach(bt, bier_table_pool, - ({ + pool_foreach (bt, bier_table_pool) + { /* * skip the ecmp tables. */ @@ -153,7 +136,7 @@ vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp) { send_bier_table_details(reg, mp->context, bt); } - })); + } } static void @@ -164,14 +147,14 @@ 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); + 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; @@ -183,83 +166,44 @@ 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]; - memset(brpath, 0, sizeof(*brpath)); - brpath->frp_sw_if_index = ~0; + rv = fib_api_path_decode(&mp->br_route.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); @@ -280,9 +224,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; @@ -292,29 +239,29 @@ send_bier_route_details (const bier_table_t *bt, if (!mp) return; - memset(mp, 0, m_size); - mp->_vl_msg_id = ntohs(VL_API_BIER_ROUTE_DETAILS); + clib_memset(mp, 0, m_size); + mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + 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) { - 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(rpath, fp); fp++; } + vec_free(path_ctx.rpaths); vl_api_send_msg (ctx->reg, (u8 *) mp); } @@ -346,7 +293,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,8 +362,8 @@ 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); - mp->_vl_msg_id = ntohs(VL_API_BIER_IMP_DETAILS); + clib_memset(mp, 0, sizeof(*mp)+n_bytes); + mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_IMP_DETAILS); mp->context = context; mp->bi_tbl_id.bt_set = bi->bi_tbl.bti_set; @@ -440,10 +387,10 @@ vl_api_bier_imp_dump_t_handler (vl_api_bier_imp_dump_t * mp) if (!reg) return; - pool_foreach(bi, bier_imp_pool, - ({ + pool_foreach (bi, bier_imp_pool) + { send_bier_imp_details(reg, mp->context, bi); - })); + } } static void @@ -482,8 +429,9 @@ 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)); - mp->_vl_msg_id = ntohs(VL_API_BIER_DISP_TABLE_DETAILS); + clib_memset(mp, 0, sizeof(*mp)); + mp->_vl_msg_id = + ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_DISP_TABLE_DETAILS); mp->context = context; mp->bdt_tbl_id = htonl(bdt->bdt_table_id); @@ -501,10 +449,10 @@ vl_api_bier_disp_table_dump_t_handler (vl_api_bier_disp_table_dump_t * mp) if (!reg) return; - pool_foreach(bdt, bier_disp_table_pool, - ({ + pool_foreach (bdt, bier_disp_table_pool) + { send_bier_disp_table_details(reg, mp->context, bdt); - })); + } } static void @@ -545,16 +493,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)) @@ -640,7 +588,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; @@ -650,38 +597,42 @@ 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); - mp->_vl_msg_id = ntohs(VL_API_BIER_DISP_ENTRY_DETAILS); - mp->context = ctx->context; + clib_memset(mp, 0, m_size); + mp->_vl_msg_id = + ntohs (REPLY_MSG_ID_BASE + VL_API_BIER_DISP_ENTRY_DETAILS); + mp->context = ctx->context; - mp->bde_tbl_id = htonl(bdt->bdt_table_id); - mp->bde_n_paths = htonl(n_paths); - mp->bde_payload_proto = pproto; - mp->bde_bp = htons(bp); + mp->bde_tbl_id = htonl (bdt->bdt_table_id); + mp->bde_n_paths = htonl (n_paths); + 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) - { - 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); - fp++; - } + fp = mp->bde_paths; + vec_foreach (rpath, path_ctx.rpaths) + { + fib_api_path_encode (rpath, fp); + fp++; + } - vl_api_send_msg (ctx->reg, (u8 *) mp); - } + vl_api_send_msg (ctx->reg, (u8 *) mp); + vec_free (path_ctx.rpaths); + } } } @@ -703,39 +654,14 @@ vl_api_bier_disp_entry_dump_t_handler (vl_api_bier_disp_entry_dump_t * mp) &ctx); } -#define vl_msg_name_crc_list -#include -#undef vl_msg_name_crc_list - -static void -setup_message_id_table (api_main_t * am) -{ -#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); - foreach_vl_msg_name_crc_bier; -#undef _ -} +#include static clib_error_t * bier_api_hookup (vlib_main_t * vm) { - api_main_t *am = &api_main; - -#define _(N,n) \ - vl_msg_api_set_handlers(VL_API_##N, #n, \ - vl_api_##n##_t_handler, \ - vl_noop_handler, \ - vl_api_##n##_t_endian, \ - vl_api_##n##_t_print, \ - sizeof(vl_api_##n##_t), 1); - foreach_bier_api_msg; -#undef _ - - /* - * Set up the (msg_name, crc, message-id) table - */ - setup_message_id_table (am); + bier_main.msg_id_base = setup_message_id_table (); - return 0; + return 0; } VLIB_API_INIT_FUNCTION (bier_api_hookup);