#include <vnet/vnet.h>
#include <vlibmemory/api.h>
-#include <vpp/stats/stats.h>
#include <vnet/interface.h>
#include <vnet/api_errno.h>
#include <vnet/ethernet/ethernet.h>
ip46_address_t ip = ip46_address_initializer;
vl_api_ip_neighbor_add_del_reply_t *rmp;
ip_neighbor_flags_t flags;
+ u32 stats_index = ~0;
int rv = 0;
VALIDATE_SW_IF_INDEX (mp);
if (mp->is_add)
rv = ip_neighbor_add (&ip, mp->is_ipv6, mp->mac_address,
- ntohl (mp->sw_if_index), flags);
+ ntohl (mp->sw_if_index), flags, &stats_index);
else
rv = ip_neighbor_del (&ip, mp->is_ipv6, ntohl (mp->sw_if_index));
stats_dsunlock ();
BAD_SW_IF_INDEX_LABEL;
- REPLY_MACRO (VL_API_IP_NEIGHBOR_ADD_DEL_REPLY);
+
+ /* *INDENT-OFF* */
+ REPLY_MACRO2 (VL_API_IP_NEIGHBOR_ADD_DEL_REPLY,
+ ({
+ rmp->stats_index = htonl (stats_index);
+ }));
+ /* *INDENT-ON* */
}
void
return (0);
}
-static int
+static fib_node_index_t
mroute_add_del_handler (u8 is_add,
u8 is_local,
u32 fib_index,
u32 next_hop_sw_if_index,
ip46_address_t * nh, u32 itf_flags, u32 bier_imp)
{
+ fib_node_index_t mfib_entry_index = ~0;
+
stats_dslock_with_hint (1 /* release hint */ , 2 /* tag */ );
fib_route_path_t path = {
}
else if (!is_local && ~0 == next_hop_sw_if_index)
{
- mfib_table_entry_update (fib_index, prefix,
- MFIB_SOURCE_API, rpf_id, entry_flags);
+ mfib_entry_index = mfib_table_entry_update (fib_index, prefix,
+ MFIB_SOURCE_API,
+ rpf_id, entry_flags);
goto done;
}
if (is_add)
{
- mfib_table_entry_path_update (fib_index, prefix,
- MFIB_SOURCE_API, &path, itf_flags);
+ mfib_entry_index = mfib_table_entry_path_update (fib_index, prefix,
+ MFIB_SOURCE_API,
+ &path, itf_flags);
}
else
{
done:
stats_dsunlock ();
- return (0);
+ return (mfib_entry_index);
}
static int
-api_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp)
+api_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp,
+ u32 * stats_index)
{
+ fib_node_index_t mfib_entry_index;
fib_protocol_t fproto;
dpo_proto_t nh_proto;
ip46_address_t nh;
sizeof (pfx.fp_src_addr.ip4));
memset (&nh.ip6, 0, sizeof (nh.ip6));
clib_memcpy (&nh.ip4, mp->nh_address, sizeof (nh.ip4));
+ if (!ip46_address_is_zero (&pfx.fp_src_addr))
+ pfx.fp_len = 64;
}
else
{
clib_memcpy (&pfx.fp_src_addr.ip6, mp->src_address,
sizeof (pfx.fp_src_addr.ip6));
clib_memcpy (&nh.ip6, mp->nh_address, sizeof (nh.ip6));
+ if (!ip46_address_is_zero (&pfx.fp_src_addr))
+ pfx.fp_len = 256;
}
- return (mroute_add_del_handler (mp->is_add,
- mp->is_local,
- fib_index, &pfx,
- nh_proto,
- ntohl (mp->entry_flags),
- ntohl (mp->rpf_id),
- ntohl (mp->next_hop_sw_if_index),
- &nh,
- ntohl (mp->itf_flags),
- ntohl (mp->bier_imp)));
+ mfib_entry_index = mroute_add_del_handler (mp->is_add,
+ mp->is_local,
+ fib_index, &pfx,
+ nh_proto,
+ ntohl (mp->entry_flags),
+ ntohl (mp->rpf_id),
+ ntohl (mp->next_hop_sw_if_index),
+ &nh,
+ ntohl (mp->itf_flags),
+ ntohl (mp->bier_imp));
+
+ if (~0 != mfib_entry_index)
+ *stats_index = mfib_entry_get_stats_index (mfib_entry_index);
+
+ return (rv);
}
void
vl_api_ip_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp)
{
vl_api_ip_mroute_add_del_reply_t *rmp;
+ vnet_main_t *vnm;
+ u32 stats_index;
int rv;
- vnet_main_t *vnm = vnet_get_main ();
+ vnm = vnet_get_main ();
vnm->api_errno = 0;
+ stats_index = ~0;
- rv = api_mroute_add_del_t_handler (mp);
-
- rv = (rv == 0) ? vnm->api_errno : rv;
+ rv = api_mroute_add_del_t_handler (mp, &stats_index);
- REPLY_MACRO (VL_API_IP_MROUTE_ADD_DEL_REPLY);
+ /* *INDENT-OFF* */
+ REPLY_MACRO2 (VL_API_IP_MROUTE_ADD_DEL_REPLY,
+ ({
+ rmp->stats_index = htonl (stats_index);
+ }));
+ /* *INDENT-ON* */
}
static void