X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbier%2Fbier_api.c;h=eeab2fef9645c2639a882b079a44544ba92a36f6;hb=7cd35f5d688d9e3bddf66602655274dae944b086;hp=67c7046254038efd150014c099f2fa83a927dc1e;hpb=9128637ee8f7b0d903551f165a1447d427e8dd19;p=vpp.git diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c index 67c70462540..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) @@ -73,40 +56,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,8 +105,8 @@ 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)); - 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; @@ -124,29 +114,29 @@ 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, - ({ + pool_foreach (bt, bier_table_pool) + { /* * skip the ecmp tables. */ if (bier_table_is_main(bt)) { - send_bier_table_details(q, mp->context, bt); + send_bier_table_details(reg, mp->context, bt); } - })); + } } static void @@ -157,94 +147,67 @@ 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 = ntohs(mp->br_bp); + bp = ntohl(mp->br_route.br_bp); brpaths = NULL; - if (0 == bp || bp > 0xffff) + if (mp->br_route.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; } 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] = - 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, ntohs(mp->br_bp), brpaths); + bier_table_route_path_add(&bti, bp, brpaths); } else { - bier_table_route_remove(&bti, ntohs(mp->br_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 +215,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; @@ -261,52 +224,55 @@ 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; - vl_api_fib_path3_t *fp; + 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; 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); - 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++; } - vl_msg_api_send_shmem (ctx->q, (u8 *) & mp); + vec_free(path_ctx.rpaths); + 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 +282,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 +293,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 +346,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,36 +362,35 @@ 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); - 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; 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); - })); + pool_foreach (bi, bier_imp_pool) + { + send_bier_imp_details(reg, mp->context, bi); + } } static void @@ -446,7 +420,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,29 +429,30 @@ 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)); - 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); - 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); - })); + pool_foreach (bdt, bier_disp_table_pool) + { + send_bier_disp_table_details(reg, mp->context, bdt); + } } static void @@ -496,7 +471,10 @@ vl_api_bier_disp_entry_add_del_t_handler (vl_api_bier_disp_entry_add_del_t * mp) table_id = ntohl(mp->bde_tbl_id); bp = ntohs(mp->bde_bp); - if (0 == bp || bp > 0xffff) + /* + * BP=0 is the default route + */ + if (bp > 0xffff) { rv = -1; goto done; @@ -515,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)) @@ -600,7 +578,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; @@ -610,62 +588,65 @@ 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; - vl_api_fib_path3_t *fp; + vl_api_fib_path_t *fp; u32 n_paths, m_size; 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_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); - 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_msg_api_send_shmem (ctx->q, (u8 *) & mp); - } + vl_api_send_msg (ctx->reg, (u8 *) mp); + vec_free (path_ctx.rpaths); + } } } 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), @@ -673,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);