[pim] RPF cache refresh statistics
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index c845a89..df6897e 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -1022,16 +1022,32 @@
}
}
+static void show_rpf_refresh_stats(struct vty *vty)
+{
+ vty_out(vty,
+ "RPF Cache Refresh Delay: %ld msecs%s"
+ "RPF Cache Refresh Timer: %ld msecs%s"
+ "RPF Cache Refresh Requests: %lld%s"
+ "RPF Cache Refresh Events: %lld%s",
+ qpim_rpf_cache_refresh_delay_msec, VTY_NEWLINE,
+ pim_time_timer_remain_msec(qpim_rpf_cache_refresher), VTY_NEWLINE,
+ qpim_rpf_cache_refresh_requests, VTY_NEWLINE,
+ qpim_rpf_cache_refresh_events, VTY_NEWLINE);
+}
+
static void pim_show_rpf(struct vty *vty)
{
struct listnode *up_node;
struct pim_upstream *up;
+ show_rpf_refresh_stats(vty);
+
+ vty_out(vty, "%s", VTY_NEWLINE);
+
vty_out(vty,
"Source Group RpfIface RpfAddress RibNextHop Metric Pref%s",
VTY_NEWLINE);
-
for (ALL_LIST_ELEMENTS_RO(qpim_upstream_list, up_node, up)) {
char src_str[100];
char grp_str[100];
@@ -1847,7 +1863,7 @@
vty_out(vty, "%s", VTY_NEWLINE);
- vty_out(vty, "Interface Address ifIndex VifIndex PktsIn PktsOut BytesIn BytesOut%s",
+ vty_out(vty, "Interface Address ifi Vif PktsIn PktsOut BytesIn BytesOut%s",
VTY_NEWLINE);
for (ALL_LIST_ELEMENTS_RO(iflist, node, ifp)) {
@@ -1878,7 +1894,7 @@
ifaddr = pim_ifp->primary_address;
- vty_out(vty, "%-9s %-15s %7d %8d %6lu %7lu %7lu %8lu%s",
+ vty_out(vty, "%-9s %-15s %3d %3d %7lu %7lu %10lu %10lu%s",
ifp->name,
inet_ntoa(ifaddr),
ifp->ifindex,
@@ -1934,12 +1950,8 @@
VTY_NEWLINE);
vty_out(vty, "%s", VTY_NEWLINE);
- vty_out(vty, "RPF Cache Refresh Delay: %ld msecs%s",
- qpim_rpf_cache_refresh_delay_msec,
- VTY_NEWLINE);
- vty_out(vty, "RPF Cache Refresh Timer: %ld msecs%s",
- pim_time_timer_remain_msec(qpim_rpf_cache_refresher),
- VTY_NEWLINE);
+
+ show_rpf_refresh_stats(vty);
show_multicast_interfaces(vty);
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index 56e4dba..9764532 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -447,13 +447,21 @@
/* update kernel multicast forwarding cache (MFC) */
scan_oil();
+ ++qpim_rpf_cache_refresh_events;
+
return 0;
}
static void sched_rpf_cache_refresh()
{
- if (qpim_rpf_cache_refresher)
+ ++qpim_rpf_cache_refresh_requests;
+
+ if (qpim_rpf_cache_refresher) {
+ /* Refresh timer is already running */
return;
+ }
+
+ /* Start refresh timer */
if (PIM_DEBUG_ZEBRA) {
zlog_debug("%s: triggering %ld msec timer",
diff --git a/pimd/pimd.c b/pimd/pimd.c
index f255a28..e8afe77 100644
--- a/pimd/pimd.c
+++ b/pimd/pimd.c
@@ -54,6 +54,8 @@
struct pim_assert_metric qpim_infinite_assert_metric;
long qpim_rpf_cache_refresh_delay_msec = 10000;
struct thread *qpim_rpf_cache_refresher = 0;
+int64_t qpim_rpf_cache_refresh_requests = 0;
+int64_t qpim_rpf_cache_refresh_events = 0;
struct in_addr qpim_inaddr_any;
static void pim_free()
diff --git a/pimd/pimd.h b/pimd/pimd.h
index 10f8518..aaf5faa 100644
--- a/pimd/pimd.h
+++ b/pimd/pimd.h
@@ -80,6 +80,8 @@
struct pim_assert_metric qpim_infinite_assert_metric;
long qpim_rpf_cache_refresh_delay_msec;
struct thread *qpim_rpf_cache_refresher;
+int64_t qpim_rpf_cache_refresh_requests;
+int64_t qpim_rpf_cache_refresh_events;
struct in_addr qpim_inaddr_any;
#define PIM_JP_HOLDTIME (qpim_t_periodic * 7 / 2)