mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-04 15:30:02 +00:00
pimd: Fix creation of channel oil to happen 1st.
This has 2 fixes: On nocache event, crate the channel oil first in case we don't need to actually create the upstream information on wrvifwhole, create the channel oil and install it, then only create the upstream information if we are connected to the source. Ticket: CM-12593 Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
e8e277d564
commit
5f6f65b14c
@ -89,6 +89,7 @@ pim_mroute_msg_nocache (int fd, struct interface *ifp, const struct igmpmsg *msg
|
||||
struct pim_upstream *up;
|
||||
struct pim_rpf *rpg;
|
||||
struct prefix_sg sg;
|
||||
struct channel_oil *oil;
|
||||
|
||||
rpg = RP(msg->im_dst);
|
||||
/*
|
||||
@ -123,6 +124,16 @@ pim_mroute_msg_nocache (int fd, struct interface *ifp, const struct igmpmsg *msg
|
||||
__PRETTY_FUNCTION__, pim_str_sg_dump (&sg));
|
||||
}
|
||||
|
||||
oil = pim_channel_oil_add (&sg, pim_ifp->mroute_vif_index);
|
||||
if (!oil) {
|
||||
if (PIM_DEBUG_MROUTE) {
|
||||
zlog_debug("%s: Failure to add channel oil for %s",
|
||||
__PRETTY_FUNCTION__,
|
||||
pim_str_sg_dump (&sg));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
up = pim_upstream_add (&sg, ifp);
|
||||
if (!up) {
|
||||
if (PIM_DEBUG_MROUTE) {
|
||||
@ -135,16 +146,7 @@ pim_mroute_msg_nocache (int fd, struct interface *ifp, const struct igmpmsg *msg
|
||||
|
||||
pim_upstream_keep_alive_timer_start (up, qpim_keep_alive_time);
|
||||
|
||||
up->channel_oil = pim_channel_oil_add(&sg,
|
||||
pim_ifp->mroute_vif_index);
|
||||
if (!up->channel_oil) {
|
||||
if (PIM_DEBUG_MROUTE) {
|
||||
zlog_debug("%s: Failure to add channel oil for %s",
|
||||
__PRETTY_FUNCTION__,
|
||||
pim_str_sg_dump (&sg));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
up->channel_oil = oil;
|
||||
up->channel_oil->cc.pktcnt++;
|
||||
up->fhr = 1;
|
||||
pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
|
||||
@ -304,6 +306,7 @@ pim_mroute_msg_wrvifwhole (int fd, struct interface *ifp, const char *buf)
|
||||
struct pim_ifchannel *ch;
|
||||
struct pim_upstream *up;
|
||||
struct prefix_sg sg;
|
||||
struct channel_oil *oil;
|
||||
|
||||
memset (&sg, 0, sizeof (struct prefix_sg));
|
||||
sg.src = ip_hdr->ip_src;
|
||||
@ -351,29 +354,33 @@ pim_mroute_msg_wrvifwhole (int fd, struct interface *ifp, const char *buf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
up = pim_upstream_add (&sg, ifp);
|
||||
|
||||
if (!up)
|
||||
{
|
||||
if (PIM_DEBUG_MROUTE)
|
||||
zlog_debug ("%s: WRONGVIF%s unable to create upstream on interface",
|
||||
pim_str_sg_dump (&sg), ifp->name);
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (pim_if_connected_to_source (ifp, sg.src))
|
||||
up->fhr = 1;
|
||||
|
||||
pim_ifp = ifp->info;
|
||||
pim_upstream_keep_alive_timer_start (up, qpim_keep_alive_time);
|
||||
up->channel_oil = pim_channel_oil_add (&sg, pim_ifp->mroute_vif_index);
|
||||
up->channel_oil->cc.pktcnt++;
|
||||
pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
|
||||
up->join_state = PIM_UPSTREAM_JOINED;
|
||||
pim_upstream_inherited_olist (up);
|
||||
oil = pim_channel_oil_add (&sg, pim_ifp->mroute_vif_index);
|
||||
if (!oil->installed)
|
||||
pim_mroute_add (oil);
|
||||
if (pim_if_connected_to_source (ifp, sg.src))
|
||||
{
|
||||
up = pim_upstream_add (&sg, ifp);
|
||||
|
||||
// Send the packet to the RP
|
||||
pim_mroute_msg_wholepkt (fd, ifp, buf);
|
||||
if (!up)
|
||||
{
|
||||
if (PIM_DEBUG_MROUTE)
|
||||
zlog_debug ("%s: WRONGVIF%s unable to create upstream on interface",
|
||||
pim_str_sg_dump (&sg), ifp->name);
|
||||
return -2;
|
||||
}
|
||||
up->fhr = 1;
|
||||
|
||||
pim_upstream_keep_alive_timer_start (up, qpim_keep_alive_time);
|
||||
up->channel_oil = oil;
|
||||
up->channel_oil->cc.pktcnt++;
|
||||
pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
|
||||
up->join_state = PIM_UPSTREAM_JOINED;
|
||||
pim_upstream_inherited_olist (up);
|
||||
|
||||
// Send the packet to the RP
|
||||
pim_mroute_msg_wholepkt (fd, ifp, buf);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user