Change-Id: I798e4fb6470ae9e763f8de1c290ff0fc3c0b7f9e
Signed-off-by: Neale Ranns <nranns@cisco.com>
/**
* The one instance of replicate main
*/
/**
* The one instance of replicate main
*/
-replicate_main_t replicate_main;
+replicate_main_t replicate_main = {
+ .repm_counters = {
+ .name = "mroutes",
+ .stat_segment_name = "/net/mroute",
+ },
+};
static inline index_t
replicate_get_index (const replicate_t *rep)
static inline index_t
replicate_get_index (const replicate_t *rep)
-fib_table_entry_get_stats_index(u32 fib_index,
- const fib_prefix_t *prefix)
+fib_table_entry_get_stats_index (u32 fib_index,
+ const fib_prefix_t *prefix)
{
return (fib_entry_get_stats_index(
fib_table_lookup_exact_match(fib_index, prefix)));
{
return (fib_entry_get_stats_index(
fib_table_lookup_exact_match(fib_index, prefix)));
@param next_hop_afi - Use dpo_proto_t
FIXME
*/
@param next_hop_afi - Use dpo_proto_t
FIXME
*/
-autoreply define ip_mroute_add_del
+define ip_mroute_add_del
{
u32 client_index;
u32 context;
{
u32 client_index;
u32 context;
+define ip_mroute_add_del_reply
+{
+ u32 context;
+ i32 retval;
+ u32 stats_index;
+};
+
/** \brief Dump IP multicast fib table
@param client_index - opaque cookie to identify the sender
*/
/** \brief Dump IP multicast fib table
@param client_index - opaque cookie to identify the sender
*/
u8 grp_address[4];
u8 src_address[4];
u32 count;
u8 grp_address[4];
u8 src_address[4];
u32 count;
vl_api_fib_path_t path[count];
};
vl_api_fib_path_t path[count];
};
mroute_add_del_handler (u8 is_add,
u8 is_local,
u32 fib_index,
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)
{
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 = {
stats_dslock_with_hint (1 /* release hint */ , 2 /* tag */ );
fib_route_path_t path = {
}
else if (!is_local && ~0 == next_hop_sw_if_index)
{
}
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)
{
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);
+ return (mfib_entry_index);
-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;
fib_protocol_t fproto;
dpo_proto_t nh_proto;
ip46_address_t nh;
clib_memcpy (&nh.ip6, mp->nh_address, sizeof (nh.ip6));
}
clib_memcpy (&nh.ip6, mp->nh_address, sizeof (nh.ip6));
}
- 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;
}
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;
- vnet_main_t *vnm = vnet_get_main ();
+ vnm = vnet_get_main ();
- rv = api_mroute_add_del_t_handler (mp);
+ rv = api_mroute_add_del_t_handler (mp, &stats_index);
- rv = (rv == 0) ? vnm->api_errno : rv;
-
- 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* */
pool_put(mfib_entry_pool, mfib_entry);
}
pool_put(mfib_entry_pool, mfib_entry);
}
+u32
+mfib_entry_get_stats_index (fib_node_index_t fib_entry_index)
+{
+ mfib_entry_t *mfib_entry;
+
+ mfib_entry = mfib_entry_get(fib_entry_index);
+
+ return (mfib_entry->mfe_rep.dpoi_index);
+}
+
/*
* mfib_entry_back_walk_notify
*
/*
* mfib_entry_back_walk_notify
*
extern u32 mfib_entry_get_fib_index(fib_node_index_t fib_entry_index);
extern int mfib_entry_is_sourced(fib_node_index_t fib_entry_index,
mfib_source_t source);
extern u32 mfib_entry_get_fib_index(fib_node_index_t fib_entry_index);
extern int mfib_entry_is_sourced(fib_node_index_t fib_entry_index,
mfib_source_t source);
+extern u32 mfib_entry_get_stats_index(fib_node_index_t fib_entry_index);
extern const dpo_id_t*mfib_entry_contribute_ip_forwarding(
fib_node_index_t mfib_entry_index);
extern const dpo_id_t*mfib_entry_contribute_ip_forwarding(
fib_node_index_t mfib_entry_index);
self.pg_enable_capture(self.pg_interfaces)
self.pg_start()
self.pg_enable_capture(self.pg_interfaces)
self.pg_start()
+ self.assertEqual(route_1_1_1_1_232_1_1_1.get_stats()['packets'],
+ len(tx))
+
# We expect replications on Pg1->7
self.verify_capture_ip4(self.pg1, tx)
self.verify_capture_ip4(self.pg2, tx)
# We expect replications on Pg1->7
self.verify_capture_ip4(self.pg1, tx)
self.verify_capture_ip4(self.pg2, tx)
self.verify_capture_ip4(self.pg1, tx)
self.verify_capture_ip4(self.pg2, tx)
self.verify_capture_ip4(self.pg1, tx)
self.verify_capture_ip4(self.pg2, tx)
+ self.assertEqual(route_1_1_1_1_232_1_1_1.get_stats()['packets'],
+ 2*len(tx))
+
# no replications on Pg0
self.pg0.assert_nothing_captured(
remark="IP multicast packets forwarded on PG0")
# no replications on Pg0
self.pg0.assert_nothing_captured(
remark="IP multicast packets forwarded on PG0")
# We expect replications on Pg1 only
self.verify_capture_ip4(self.pg1, tx)
# We expect replications on Pg1 only
self.verify_capture_ip4(self.pg1, tx)
+ self.assertEqual(route_232.get_stats()['packets'], len(tx))
# no replications on Pg0, Pg2 not Pg3
self.pg0.assert_nothing_captured(
# no replications on Pg0, Pg2 not Pg3
self.pg0.assert_nothing_captured(
def add_vpp_config(self):
for path in self.paths:
def add_vpp_config(self):
for path in self.paths:
- self._test.vapi.ip_mroute_add_del(self.src_addr,
- self.grp_addr,
- self.grp_addr_len,
- self.e_flags,
- path.proto,
- path.nh_itf,
- path.nh_addr,
- path.nh_i_flags,
- bier_imp=path.bier_imp,
- rpf_id=self.rpf_id,
- table_id=self.table_id,
- is_ipv6=self.is_ip6)
+ r = self._test.vapi.ip_mroute_add_del(self.src_addr,
+ self.grp_addr,
+ self.grp_addr_len,
+ self.e_flags,
+ path.proto,
+ path.nh_itf,
+ path.nh_addr,
+ path.nh_i_flags,
+ bier_imp=path.bier_imp,
+ rpf_id=self.rpf_id,
+ table_id=self.table_id,
+ is_ipv6=self.is_ip6)
+ self.stats_index = r.stats_index
self._test.registry.register(self, self._test.logger)
def remove_vpp_config(self):
self._test.registry.register(self, self._test.logger)
def remove_vpp_config(self):
inet_ntop(AF_INET, self.grp_addr),
self.grp_addr_len))
inet_ntop(AF_INET, self.grp_addr),
self.grp_addr_len))
+ def get_stats(self):
+ c = self._test.statistics.get_counter("/net/mroute")
+ return c[0][self.stats_index]
+
class VppMFibSignal(object):
def __init__(self, test, route, interface, packet):
class VppMFibSignal(object):
def __init__(self, test, route, interface, packet):