#include <vnet/fib/fib_table.h>
#include <vnet/mfib/mfib_table.h>
-#include <vnet/vnet_msg_enum.h>
-
-#define vl_typedefs /* define message structures */
-#include <vnet/vnet_all_api_h.h>
-#undef vl_typedefs
-
-#define vl_endianfun /* define message structures */
-#include <vnet/vnet_all_api_h.h>
-#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 <vnet/vnet_all_api_h.h>
-#undef vl_printfun
+#include <vnet/format_fns.h>
+#include <bier/bier.api_enum.h>
+#include <bier/bier.api_types.h>
+#define REPLY_MSG_ID_BASE bier_main.msg_id_base
#include <vlibapi/api_helper_macros.h>
-#include <vnet/fib/fib_api.h>
-#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)
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;
if (!reg)
return;
- pool_foreach(bt, bier_table_pool,
- ({
+ pool_foreach (bt, bier_table_pool)
+ {
/*
* skip the ecmp tables.
*/
{
send_bier_table_details(reg, mp->context, bt);
}
- }));
+ }
}
static void
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;
}
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];
- rv = fib_path_api_parse(&mp->br_paths[ii], brpath);
+ rv = fib_api_path_decode(&mp->br_route.br_paths[ii], brpath);
if (0 != rv)
{
}
}
- if (mp->br_is_add)
+ if (mp->br_is_replace)
+ {
+ if (0 == vec_len(brpaths))
+ {
+ bier_table_route_delete(&bti, bp);
+ }
+ else
+ {
+ bier_table_route_path_update(&bti, bp, brpaths);
+ }
+ }
+ 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);
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;
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)
{
- fib_api_path_encode(api_rpath, fp);
+ fib_api_path_encode(rpath, fp);
fp++;
}
+ vec_free(path_ctx.rpaths);
vl_api_send_msg (ctx->reg, (u8 *) 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 ();
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;
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
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);
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
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))
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;
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)
- {
- fib_api_path_encode(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);
+ }
}
}
&ctx);
}
-#define vl_msg_name_crc_list
-#include <vnet/bier/bier.api.h>
-#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 <bier/bier.api.c>
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);