mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 22:30:43 +00:00
pimd: del_oif and pim_channel_del_oif are the same function
These two functions do the exact same thing. Refactor Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
d78f0ac13c
commit
220dbacef6
149
pimd/pim_zebra.c
149
pimd/pim_zebra.c
@ -53,9 +53,6 @@
|
|||||||
static struct zclient *zclient = NULL;
|
static struct zclient *zclient = NULL;
|
||||||
|
|
||||||
static int fib_lookup_if_vif_index(struct in_addr addr);
|
static int fib_lookup_if_vif_index(struct in_addr addr);
|
||||||
static int del_oif(struct channel_oil *channel_oil,
|
|
||||||
struct interface *oif,
|
|
||||||
uint32_t proto_mask);
|
|
||||||
|
|
||||||
/* Router-id update message from zebra. */
|
/* Router-id update message from zebra. */
|
||||||
static int pim_router_id_update_zebra(int command, struct zclient *zclient,
|
static int pim_router_id_update_zebra(int command, struct zclient *zclient,
|
||||||
@ -521,8 +518,6 @@ pim_scan_individual_oil (struct channel_oil *c_oil, int in_vif_index)
|
|||||||
source_str, group_str,
|
source_str, group_str,
|
||||||
new_iif->name, input_iface_vif_index);
|
new_iif->name, input_iface_vif_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
//del_oif(c_oil, new_iif, PIM_OIF_FLAG_PROTO_ANY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update iif vif_index */
|
/* update iif vif_index */
|
||||||
@ -765,121 +760,6 @@ static int fib_lookup_if_vif_index(struct in_addr addr)
|
|||||||
return vif_index;
|
return vif_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int del_oif(struct channel_oil *channel_oil,
|
|
||||||
struct interface *oif,
|
|
||||||
uint32_t proto_mask)
|
|
||||||
{
|
|
||||||
struct pim_interface *pim_ifp;
|
|
||||||
int old_ttl;
|
|
||||||
|
|
||||||
pim_ifp = oif->info;
|
|
||||||
|
|
||||||
if (PIM_DEBUG_MROUTE) {
|
|
||||||
char group_str[INET_ADDRSTRLEN];
|
|
||||||
char source_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<group?>", channel_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
|
|
||||||
pim_inet4_dump("<source?>", channel_oil->oil.mfcc_origin, source_str, sizeof(source_str));
|
|
||||||
zlog_debug("%s %s: (S,G)=(%s,%s): proto_mask=%u OIF=%s vif_index=%d",
|
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
|
||||||
source_str, group_str,
|
|
||||||
proto_mask, oif->name, pim_ifp->mroute_vif_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prevent single protocol from unsubscribing same interface from
|
|
||||||
channel (S,G) multiple times */
|
|
||||||
if (!(channel_oil->oif_flags[pim_ifp->mroute_vif_index] & proto_mask)) {
|
|
||||||
if (PIM_DEBUG_MROUTE)
|
|
||||||
{
|
|
||||||
char group_str[INET_ADDRSTRLEN];
|
|
||||||
char source_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<group?>", channel_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
|
|
||||||
pim_inet4_dump("<source?>", channel_oil->oil.mfcc_origin, source_str, sizeof(source_str));
|
|
||||||
zlog_debug("%s %s: nonexistent protocol mask %u removed OIF %s (vif_index=%d, min_ttl=%d) from channel (S,G)=(%s,%s)",
|
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
|
||||||
proto_mask, oif->name, pim_ifp->mroute_vif_index,
|
|
||||||
channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index],
|
|
||||||
source_str, group_str);
|
|
||||||
}
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Mark that protocol is no longer interested in this OIF */
|
|
||||||
channel_oil->oif_flags[pim_ifp->mroute_vif_index] &= ~proto_mask;
|
|
||||||
|
|
||||||
/* Allow multiple protocols to unsubscribe same interface from
|
|
||||||
channel (S,G) multiple times, by silently ignoring requests while
|
|
||||||
there is at least one protocol interested in the channel */
|
|
||||||
if (channel_oil->oif_flags[pim_ifp->mroute_vif_index] & PIM_OIF_FLAG_PROTO_ANY) {
|
|
||||||
|
|
||||||
/* Check the OIF keeps existing before returning, and only log
|
|
||||||
warning otherwise */
|
|
||||||
if (channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index] < 1) {
|
|
||||||
if (PIM_DEBUG_MROUTE)
|
|
||||||
{
|
|
||||||
char group_str[INET_ADDRSTRLEN];
|
|
||||||
char source_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<group?>", channel_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
|
|
||||||
pim_inet4_dump("<source?>", channel_oil->oil.mfcc_origin, source_str, sizeof(source_str));
|
|
||||||
zlog_debug("%s %s: protocol mask %u removing nonexistent OIF %s (vif_index=%d, min_ttl=%d) from channel (S,G)=(%s,%s)",
|
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
|
||||||
proto_mask, oif->name, pim_ifp->mroute_vif_index,
|
|
||||||
channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index],
|
|
||||||
source_str, group_str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
old_ttl = channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index];
|
|
||||||
|
|
||||||
if (old_ttl < 1) {
|
|
||||||
if (PIM_DEBUG_MROUTE)
|
|
||||||
{
|
|
||||||
char group_str[INET_ADDRSTRLEN];
|
|
||||||
char source_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<group?>", channel_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
|
|
||||||
pim_inet4_dump("<source?>", channel_oil->oil.mfcc_origin, source_str, sizeof(source_str));
|
|
||||||
zlog_debug("%s %s: interface %s (vif_index=%d) is not output for channel (S,G)=(%s,%s)",
|
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
|
||||||
oif->name, pim_ifp->mroute_vif_index,
|
|
||||||
source_str, group_str);
|
|
||||||
}
|
|
||||||
return -3;
|
|
||||||
}
|
|
||||||
|
|
||||||
channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index] = 0;
|
|
||||||
|
|
||||||
if (pim_mroute_add(channel_oil, __PRETTY_FUNCTION__)) {
|
|
||||||
char group_str[INET_ADDRSTRLEN];
|
|
||||||
char source_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<group?>", channel_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
|
|
||||||
pim_inet4_dump("<source?>", channel_oil->oil.mfcc_origin, source_str, sizeof(source_str));
|
|
||||||
zlog_warn("%s %s: could not remove output interface %s (vif_index=%d) from channel (S,G)=(%s,%s)",
|
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
|
||||||
oif->name, pim_ifp->mroute_vif_index,
|
|
||||||
source_str, group_str);
|
|
||||||
|
|
||||||
channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index] = old_ttl;
|
|
||||||
return -4;
|
|
||||||
}
|
|
||||||
|
|
||||||
--channel_oil->oil_size;
|
|
||||||
|
|
||||||
if (PIM_DEBUG_MROUTE) {
|
|
||||||
char group_str[INET_ADDRSTRLEN];
|
|
||||||
char source_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<group?>", channel_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
|
|
||||||
pim_inet4_dump("<source?>", channel_oil->oil.mfcc_origin, source_str, sizeof(source_str));
|
|
||||||
zlog_debug("%s %s: (S,G)=(%s,%s): proto_mask=%u OIF=%s vif_index=%d: DONE",
|
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
|
||||||
source_str, group_str,
|
|
||||||
proto_mask, oif->name, pim_ifp->mroute_vif_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void igmp_source_forward_start(struct igmp_source *source)
|
void igmp_source_forward_start(struct igmp_source *source)
|
||||||
{
|
{
|
||||||
struct igmp_group *group;
|
struct igmp_group *group;
|
||||||
@ -1034,16 +914,16 @@ void igmp_source_forward_stop(struct igmp_source *source)
|
|||||||
Possibly because of multiple calls. When that happens, we
|
Possibly because of multiple calls. When that happens, we
|
||||||
enter the below if statement and this function returns early
|
enter the below if statement and this function returns early
|
||||||
which in turn triggers the calling function to assert.
|
which in turn triggers the calling function to assert.
|
||||||
Making the call to del_oif and ignoring the return code
|
Making the call to pim_channel_del_oif and ignoring the return code
|
||||||
fixes the issue without ill effect, similar to
|
fixes the issue without ill effect, similar to
|
||||||
pim_forward_stop below.
|
pim_forward_stop below.
|
||||||
*/
|
*/
|
||||||
result = del_oif(source->source_channel_oil,
|
result = pim_channel_del_oif(source->source_channel_oil,
|
||||||
group->group_igmp_sock->interface,
|
group->group_igmp_sock->interface,
|
||||||
PIM_OIF_FLAG_PROTO_IGMP);
|
PIM_OIF_FLAG_PROTO_IGMP);
|
||||||
if (result) {
|
if (result) {
|
||||||
if (PIM_DEBUG_IGMP_TRACE)
|
if (PIM_DEBUG_IGMP_TRACE)
|
||||||
zlog_debug("%s: del_oif() failed with return=%d",
|
zlog_debug("%s: pim_channel_del_oif() failed with return=%d",
|
||||||
__func__, result);
|
__func__, result);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1117,18 +997,9 @@ void pim_forward_stop(struct pim_ifchannel *ch)
|
|||||||
ch->sg_str, ch->interface->name);
|
ch->sg_str, ch->interface->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!up->channel_oil) {
|
pim_channel_del_oif(up->channel_oil,
|
||||||
if (PIM_DEBUG_PIM_TRACE)
|
ch->interface,
|
||||||
zlog_debug("%s: (S,G)=%s oif=%s missing channel OIL",
|
PIM_OIF_FLAG_PROTO_PIM);
|
||||||
__PRETTY_FUNCTION__,
|
|
||||||
ch->sg_str, ch->interface->name);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
del_oif(up->channel_oil,
|
|
||||||
ch->interface,
|
|
||||||
PIM_OIF_FLAG_PROTO_PIM);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user