mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-09 12:39:21 +00:00
pimd: pim_upstream *always* creates a channel_oil
Modify code base so that pim_upstream *always* creates a channel_oil and as such we do not need to create it later or play other games. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
afb2f47031
commit
46dd6edb06
@ -518,11 +518,7 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp,
|
|||||||
up->upstream_register);
|
up->upstream_register);
|
||||||
up->sptbit = PIM_UPSTREAM_SPTBIT_TRUE;
|
up->sptbit = PIM_UPSTREAM_SPTBIT_TRUE;
|
||||||
}
|
}
|
||||||
if (!up->channel_oil)
|
|
||||||
up->channel_oil = pim_channel_oil_add(
|
|
||||||
pim_ifp->pim, &sg,
|
|
||||||
pim_ifp->mroute_vif_index,
|
|
||||||
__PRETTY_FUNCTION__);
|
|
||||||
pim_upstream_inherited_olist(pim_ifp->pim, up);
|
pim_upstream_inherited_olist(pim_ifp->pim, up);
|
||||||
if (!up->channel_oil->installed)
|
if (!up->channel_oil->installed)
|
||||||
pim_mroute_add(up->channel_oil,
|
pim_mroute_add(up->channel_oil,
|
||||||
|
@ -716,7 +716,8 @@ static struct pim_upstream *pim_upstream_new(struct pim_instance *pim,
|
|||||||
up->join_state = PIM_UPSTREAM_NOTJOINED;
|
up->join_state = PIM_UPSTREAM_NOTJOINED;
|
||||||
up->reg_state = PIM_REG_NOINFO;
|
up->reg_state = PIM_REG_NOINFO;
|
||||||
up->state_transition = pim_time_monotonic_sec();
|
up->state_transition = pim_time_monotonic_sec();
|
||||||
up->channel_oil = NULL;
|
up->channel_oil =
|
||||||
|
pim_channel_oil_add(pim, &up->sg, MAXVIFS, __PRETTY_FUNCTION__);
|
||||||
up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE;
|
up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE;
|
||||||
|
|
||||||
up->rpf.source_nexthop.interface = NULL;
|
up->rpf.source_nexthop.interface = NULL;
|
||||||
@ -740,48 +741,25 @@ static struct pim_upstream *pim_upstream_new(struct pim_instance *pim,
|
|||||||
pim_upstream_fill_static_iif(up, incoming);
|
pim_upstream_fill_static_iif(up, incoming);
|
||||||
pim_ifp = up->rpf.source_nexthop.interface->info;
|
pim_ifp = up->rpf.source_nexthop.interface->info;
|
||||||
assert(pim_ifp);
|
assert(pim_ifp);
|
||||||
up->channel_oil = pim_channel_oil_add(pim, &up->sg,
|
pim_channel_oil_change_iif(pim, up->channel_oil,
|
||||||
pim_ifp->mroute_vif_index,
|
pim_ifp->mroute_vif_index,
|
||||||
__PRETTY_FUNCTION__);
|
__PRETTY_FUNCTION__);
|
||||||
} else if (up->upstream_addr.s_addr == INADDR_ANY) {
|
} else if (up->upstream_addr.s_addr != INADDR_ANY) {
|
||||||
/* Create a dummmy channel oil with incoming ineterface MAXVIFS,
|
|
||||||
* since RP is not configured
|
|
||||||
*/
|
|
||||||
up->channel_oil = pim_channel_oil_add(pim, &up->sg, MAXVIFS,
|
|
||||||
__PRETTY_FUNCTION__);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
rpf_result = pim_rpf_update(pim, up, NULL);
|
rpf_result = pim_rpf_update(pim, up, NULL);
|
||||||
if (rpf_result == PIM_RPF_FAILURE) {
|
if (rpf_result == PIM_RPF_FAILURE) {
|
||||||
if (PIM_DEBUG_TRACE)
|
if (PIM_DEBUG_TRACE)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"%s: Attempting to create upstream(%s), Unable to RPF for source",
|
"%s: Attempting to create upstream(%s), Unable to RPF for source",
|
||||||
__PRETTY_FUNCTION__, up->sg_str);
|
__PRETTY_FUNCTION__, up->sg_str);
|
||||||
/* Create a dummmy channel oil with incoming ineterface
|
|
||||||
* MAXVIFS, since RP is not reachable
|
|
||||||
*/
|
|
||||||
up->channel_oil = pim_channel_oil_add(
|
|
||||||
pim, &up->sg, MAXVIFS, __PRETTY_FUNCTION__);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (up->rpf.source_nexthop.interface) {
|
if (up->rpf.source_nexthop.interface) {
|
||||||
pim_ifp = up->rpf.source_nexthop.interface->info;
|
pim_ifp = up->rpf.source_nexthop.interface->info;
|
||||||
if (pim_ifp)
|
if (pim_ifp)
|
||||||
up->channel_oil = pim_channel_oil_add(
|
pim_channel_oil_change_iif(
|
||||||
pim, &up->sg, pim_ifp->mroute_vif_index,
|
pim, up->channel_oil,
|
||||||
|
pim_ifp->mroute_vif_index,
|
||||||
__PRETTY_FUNCTION__);
|
__PRETTY_FUNCTION__);
|
||||||
else {
|
|
||||||
/*
|
|
||||||
* Yeah this should not happen
|
|
||||||
* but let's be sure that we are not
|
|
||||||
* doing something stupid, all paths
|
|
||||||
* through upstream creation will
|
|
||||||
* create a channel oil
|
|
||||||
*/
|
|
||||||
up->channel_oil = pim_channel_oil_add(
|
|
||||||
pim, &up->sg, MAXVIFS,
|
|
||||||
__PRETTY_FUNCTION__);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1526,22 +1504,14 @@ int pim_upstream_inherited_olist_decide(struct pim_instance *pim,
|
|||||||
struct pim_upstream *up)
|
struct pim_upstream *up)
|
||||||
{
|
{
|
||||||
struct interface *ifp;
|
struct interface *ifp;
|
||||||
struct pim_interface *pim_ifp = NULL;
|
|
||||||
struct pim_ifchannel *ch, *starch;
|
struct pim_ifchannel *ch, *starch;
|
||||||
struct pim_upstream *starup = up->parent;
|
struct pim_upstream *starup = up->parent;
|
||||||
int output_intf = 0;
|
int output_intf = 0;
|
||||||
|
|
||||||
if (up->rpf.source_nexthop.interface)
|
if (!up->rpf.source_nexthop.interface)
|
||||||
pim_ifp = up->rpf.source_nexthop.interface->info;
|
|
||||||
else {
|
|
||||||
if (PIM_DEBUG_TRACE)
|
if (PIM_DEBUG_TRACE)
|
||||||
zlog_debug("%s: up %s RPF is not present",
|
zlog_debug("%s: up %s RPF is not present",
|
||||||
__PRETTY_FUNCTION__, up->sg_str);
|
__PRETTY_FUNCTION__, up->sg_str);
|
||||||
}
|
|
||||||
if (pim_ifp && !up->channel_oil)
|
|
||||||
up->channel_oil = pim_channel_oil_add(pim, &up->sg,
|
|
||||||
pim_ifp->mroute_vif_index,
|
|
||||||
__PRETTY_FUNCTION__);
|
|
||||||
|
|
||||||
FOR_ALL_INTERFACES (pim->vrf, ifp) {
|
FOR_ALL_INTERFACES (pim->vrf, ifp) {
|
||||||
if (!ifp->info)
|
if (!ifp->info)
|
||||||
|
@ -1231,14 +1231,15 @@ void pim_forward_start(struct pim_ifchannel *ch)
|
|||||||
__FILE__, __PRETTY_FUNCTION__,
|
__FILE__, __PRETTY_FUNCTION__,
|
||||||
source_str);
|
source_str);
|
||||||
}
|
}
|
||||||
up->channel_oil = pim_channel_oil_add(
|
pim_channel_oil_change_iif(pim, up->channel_oil,
|
||||||
pim, &up->sg, MAXVIFS, __PRETTY_FUNCTION__);
|
MAXVIFS,
|
||||||
|
__PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
up->channel_oil = pim_channel_oil_add(
|
pim_channel_oil_change_iif(pim, up->channel_oil,
|
||||||
pim, &up->sg, input_iface_vif_index,
|
input_iface_vif_index,
|
||||||
__PRETTY_FUNCTION__);
|
__PRETTY_FUNCTION__);
|
||||||
|
|
||||||
if (PIM_DEBUG_TRACE) {
|
if (PIM_DEBUG_TRACE) {
|
||||||
struct interface *in_intf = pim_if_find_by_vif_index(
|
struct interface *in_intf = pim_if_find_by_vif_index(
|
||||||
@ -1249,10 +1250,6 @@ void pim_forward_start(struct pim_ifchannel *ch)
|
|||||||
in_intf ? in_intf->name : "Unknown",
|
in_intf ? in_intf->name : "Unknown",
|
||||||
input_iface_vif_index, up->sg_str);
|
input_iface_vif_index, up->sg_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
up->channel_oil =
|
|
||||||
pim_channel_oil_add(pim, &up->sg, input_iface_vif_index,
|
|
||||||
__PRETTY_FUNCTION__);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)
|
if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)
|
||||||
|
Loading…
Reference in New Issue
Block a user