summaryrefslogtreecommitdiff
path: root/pimd/pim_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_zebra.c')
-rw-r--r--pimd/pim_zebra.c68
1 files changed, 46 insertions, 22 deletions
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index b21da624d6..1bb4852c6b 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -48,6 +48,8 @@
#undef PIM_DEBUG_IFADDR_DUMP
#define PIM_DEBUG_IFADDR_DUMP
+static struct zclient *zclient = NULL;
+
static int fib_lookup_if_vif_index(struct in_addr addr);
static int del_oif(struct channel_oil *channel_oil,
struct interface *oif,
@@ -724,31 +726,31 @@ void pim_zebra_init(char *zebra_sock_path)
#endif
/* Socket for receiving updates from Zebra daemon */
- qpim_zclient_update = zclient_new (master);
-
- qpim_zclient_update->zebra_connected = pim_zebra_connected;
- qpim_zclient_update->router_id_update = pim_router_id_update_zebra;
- qpim_zclient_update->interface_add = pim_zebra_if_add;
- qpim_zclient_update->interface_delete = pim_zebra_if_del;
- qpim_zclient_update->interface_up = pim_zebra_if_state_up;
- qpim_zclient_update->interface_down = pim_zebra_if_state_down;
- qpim_zclient_update->interface_address_add = pim_zebra_if_address_add;
- qpim_zclient_update->interface_address_delete = pim_zebra_if_address_del;
- qpim_zclient_update->redistribute_route_ipv4_add = redist_read_ipv4_route;
- qpim_zclient_update->redistribute_route_ipv4_del = redist_read_ipv4_route;
-
- zclient_init(qpim_zclient_update, ZEBRA_ROUTE_PIM, 0);
+ zclient = zclient_new (master);
+
+ zclient->zebra_connected = pim_zebra_connected;
+ zclient->router_id_update = pim_router_id_update_zebra;
+ zclient->interface_add = pim_zebra_if_add;
+ zclient->interface_delete = pim_zebra_if_del;
+ zclient->interface_up = pim_zebra_if_state_up;
+ zclient->interface_down = pim_zebra_if_state_down;
+ zclient->interface_address_add = pim_zebra_if_address_add;
+ zclient->interface_address_delete = pim_zebra_if_address_del;
+ zclient->redistribute_route_ipv4_add = redist_read_ipv4_route;
+ zclient->redistribute_route_ipv4_del = redist_read_ipv4_route;
+
+ zclient_init(zclient, ZEBRA_ROUTE_PIM, 0);
if (PIM_DEBUG_PIM_TRACE) {
zlog_info("zclient_init cleared redistribution request");
}
- zassert(qpim_zclient_update->redist_default == ZEBRA_ROUTE_PIM);
+ zassert(zclient->redist_default == ZEBRA_ROUTE_PIM);
/* Request all redistribution */
for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
- if (i == qpim_zclient_update->redist_default)
+ if (i == zclient->redist_default)
continue;
- vrf_bitmap_set (qpim_zclient_update->redist[AFI_IP][i], VRF_DEFAULT);;
+ vrf_bitmap_set (zclient->redist[AFI_IP][i], VRF_DEFAULT);;
if (PIM_DEBUG_PIM_TRACE) {
zlog_debug("%s: requesting redistribution for %s (%i)",
__PRETTY_FUNCTION__, zebra_route_string(i), i);
@@ -757,7 +759,7 @@ void pim_zebra_init(char *zebra_sock_path)
/* Request default information */
zclient_redistribute_default (ZEBRA_REDISTRIBUTE_DEFAULT_ADD,
- qpim_zclient_update, VRF_DEFAULT);
+ zclient, VRF_DEFAULT);
if (PIM_DEBUG_PIM_TRACE) {
zlog_info("%s: requesting default information redistribution",
@@ -1095,7 +1097,13 @@ void igmp_source_forward_start(struct igmp_source *source)
Feed IGMPv3-gathered local membership information into PIM
per-interface (S,G) state.
*/
- pim_ifchannel_local_membership_add(group->group_igmp_sock->interface, &sg);
+ if (!pim_ifchannel_local_membership_add(group->group_igmp_sock->interface, &sg))
+ {
+ if (PIM_DEBUG_MROUTE)
+ zlog_warn ("%s: Failure to add local membership for %s",
+ __PRETTY_FUNCTION__, pim_str_sg_dump (&sg));
+ return;
+ }
IGMP_SOURCE_DO_FORWARDING(source->source_flags);
}
@@ -1165,6 +1173,7 @@ void igmp_source_forward_stop(struct igmp_source *source)
void pim_forward_start(struct pim_ifchannel *ch)
{
struct pim_upstream *up = ch->upstream;
+ uint32_t mask = PIM_OIF_FLAG_PROTO_PIM;
if (PIM_DEBUG_PIM_TRACE) {
char source_str[INET_ADDRSTRLEN];
@@ -1204,9 +1213,10 @@ void pim_forward_start(struct pim_ifchannel *ch)
}
}
- pim_channel_add_oif(up->channel_oil,
- ch->interface,
- PIM_OIF_FLAG_PROTO_PIM);
+ if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)
+ mask = PIM_OIF_FLAG_PROTO_IGMP;
+
+ pim_channel_add_oif(up->channel_oil, ch->interface, mask);
}
void pim_forward_stop(struct pim_ifchannel *ch)
@@ -1232,3 +1242,17 @@ void pim_forward_stop(struct pim_ifchannel *ch)
ch->interface,
PIM_OIF_FLAG_PROTO_PIM);
}
+
+void
+pim_zebra_zclient_update (struct vty *vty)
+{
+ vty_out(vty, "Zclient update socket: ");
+
+ if (zclient) {
+ vty_out(vty, "%d failures=%d%s", zclient->sock,
+ zclient->fail, VTY_NEWLINE);
+ }
+ else {
+ vty_out(vty, "<null zclient>%s", VTY_NEWLINE);
+ }
+}