summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pimd/pim_cmd.c14
-rw-r--r--pimd/pim_rp.c42
-rw-r--r--pimd/pim_rp.h2
-rw-r--r--pimd/pim_zebra.c2
4 files changed, 60 insertions, 0 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index bd3a85abb0..bbc1de3443 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -2004,6 +2004,19 @@ DEFUN (show_ip_pim_upstream_rpf,
return CMD_SUCCESS;
}
+DEFUN (show_ip_pim_rp,
+ show_ip_pim_rp_cmd,
+ "show ip pim rp-info ",
+ SHOW_STR
+ IP_STR
+ PIM_STR
+ "PIM RP information\n")
+{
+ pim_rp_show_information (vty);
+
+ return CMD_SUCCESS;
+}
+
DEFUN (show_ip_pim_rpf,
show_ip_pim_rpf_cmd,
"show ip pim rpf",
@@ -4863,6 +4876,7 @@ void pim_cmd_init()
install_element (VIEW_NODE, &show_ip_pim_upstream_cmd);
install_element (VIEW_NODE, &show_ip_pim_upstream_join_desired_cmd);
install_element (VIEW_NODE, &show_ip_pim_upstream_rpf_cmd);
+ install_element (VIEW_NODE, &show_ip_pim_rp_cmd);
install_element (VIEW_NODE, &show_ip_multicast_cmd);
install_element (VIEW_NODE, &show_ip_mroute_cmd);
install_element (VIEW_NODE, &show_ip_mroute_count_cmd);
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c
index 84de870764..7a356a7689 100644
--- a/pimd/pim_rp.c
+++ b/pimd/pim_rp.c
@@ -26,6 +26,8 @@
#include "linklist.h"
#include "prefix.h"
#include "memory.h"
+#include "vty.h"
+#include "vrf.h"
#include "pimd.h"
#include "pim_vty.h"
@@ -35,6 +37,7 @@
#include "pim_rpf.h"
#include "pim_sock.h"
#include "pim_memory.h"
+#include "pim_iface.h"
struct rp_info
{
@@ -148,6 +151,24 @@ pim_rp_find_match_group (struct prefix *group)
return NULL;
}
+static void
+pim_rp_check_interfaces (struct rp_info *rp_info)
+{
+ struct listnode *node;
+ struct interface *ifp;
+
+ for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp))
+ {
+ struct pim_interface *pim_ifp = ifp->info;
+
+ if (!pim_ifp)
+ continue;
+
+ if (pim_ifp->primary_address.s_addr == rp_info->rp.rpf_addr.s_addr)
+ rp_info->i_am_rp = 1;
+ }
+}
+
int
pim_rp_new (const char *rp, const char *group_range)
{
@@ -185,6 +206,7 @@ pim_rp_new (const char *rp, const char *group_range)
XFREE (MTYPE_PIM_RP, rp_info);
if (!pim_rp_setup ())
return -2;
+ pim_rp_check_interfaces (rp_all);
return 0;
}
@@ -210,6 +232,7 @@ pim_rp_new (const char *rp, const char *group_range)
if (!pim_rp_setup ())
return -2;
+ pim_rp_check_interfaces (rp_info);
return 0;
}
@@ -453,3 +476,22 @@ pim_rp_check_is_my_ip_address (struct in_addr group, struct in_addr dest_addr)
return 0;
}
+
+void
+pim_rp_show_information (struct vty *vty)
+{
+ struct rp_info *rp_info;
+ struct listnode *node;
+
+ vty_out (vty, "RP Addr Group Oif I_am_RP%s", VTY_NEWLINE);
+ for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
+ {
+ char buf[48];
+ vty_out (vty, "%-10s %-10s %-10s%-10d%s",
+ inet_ntoa (rp_info->rp.rpf_addr),
+ prefix2str(&rp_info->group, buf, 48),
+ rp_info->rp.source_nexthop.interface->name,
+ rp_info->i_am_rp, VTY_NEWLINE);
+ }
+ return;
+}
diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h
index be50bbb18b..c9dfa201f1 100644
--- a/pimd/pim_rp.h
+++ b/pimd/pim_rp.h
@@ -42,4 +42,6 @@ struct pim_rpf *pim_rp_g (struct in_addr group);
#define I_am_RP(G) pim_rp_i_am_rp ((G))
#define RP(G) pim_rp_g ((G))
+
+void pim_rp_show_information (struct vty *vty);
#endif
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index b171fbb702..aa1121c8a2 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -506,6 +506,7 @@ static int on_rpf_cache_refresh(struct thread *t)
qpim_rpf_cache_refresh_last = pim_time_monotonic_sec();
++qpim_rpf_cache_refresh_events;
+ pim_rp_setup ();
return 0;
}
@@ -659,6 +660,7 @@ static int redist_read_ipv4_route(int command, struct zclient *zclient,
sched_rpf_cache_refresh();
+ pim_rp_setup ();
return 0;
}