mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 06:53:03 +00:00
Merge pull request #12925 from FRRouting/mergify/bp/dev/8.5/pr-12008
pimd, pim6d: Fix RPF check (backport #12008)
This commit is contained in:
commit
d6c7332418
@ -1398,7 +1398,7 @@ void pim_show_upstream(struct pim_instance *pim, struct vty *vty,
|
|||||||
|
|
||||||
nbr = pim_neighbor_find(
|
nbr = pim_neighbor_find(
|
||||||
up->rpf.source_nexthop.interface,
|
up->rpf.source_nexthop.interface,
|
||||||
up->rpf.rpf_addr);
|
up->rpf.rpf_addr, false);
|
||||||
if (nbr)
|
if (nbr)
|
||||||
pim_time_timer_to_hhmmss(join_timer,
|
pim_time_timer_to_hhmmss(join_timer,
|
||||||
sizeof(join_timer),
|
sizeof(join_timer),
|
||||||
|
@ -290,7 +290,7 @@ int pim_hello_recv(struct interface *ifp, pim_addr src_addr, uint8_t *tlv_buf,
|
|||||||
New neighbor?
|
New neighbor?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
neigh = pim_neighbor_find(ifp, src_addr);
|
neigh = pim_neighbor_find(ifp, src_addr, false);
|
||||||
if (!neigh) {
|
if (!neigh) {
|
||||||
/* Add as new neighbor */
|
/* Add as new neighbor */
|
||||||
|
|
||||||
|
@ -419,7 +419,7 @@ struct pim_neighbor *pim_neighbor_find_by_secondary(struct interface *ifp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct pim_neighbor *pim_neighbor_find(struct interface *ifp,
|
struct pim_neighbor *pim_neighbor_find(struct interface *ifp,
|
||||||
pim_addr source_addr)
|
pim_addr source_addr, bool secondary)
|
||||||
{
|
{
|
||||||
struct pim_interface *pim_ifp;
|
struct pim_interface *pim_ifp;
|
||||||
struct listnode *node;
|
struct listnode *node;
|
||||||
@ -438,6 +438,13 @@ struct pim_neighbor *pim_neighbor_find(struct interface *ifp,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (secondary) {
|
||||||
|
struct prefix p;
|
||||||
|
|
||||||
|
pim_addr_to_prefix(&p, source_addr);
|
||||||
|
return pim_neighbor_find_by_secondary(ifp, &p);
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ struct pim_neighbor {
|
|||||||
void pim_neighbor_timer_reset(struct pim_neighbor *neigh, uint16_t holdtime);
|
void pim_neighbor_timer_reset(struct pim_neighbor *neigh, uint16_t holdtime);
|
||||||
void pim_neighbor_free(struct pim_neighbor *neigh);
|
void pim_neighbor_free(struct pim_neighbor *neigh);
|
||||||
struct pim_neighbor *pim_neighbor_find(struct interface *ifp,
|
struct pim_neighbor *pim_neighbor_find(struct interface *ifp,
|
||||||
pim_addr source_addr);
|
pim_addr source_addr, bool secondary);
|
||||||
struct pim_neighbor *pim_neighbor_find_by_secondary(struct interface *ifp,
|
struct pim_neighbor *pim_neighbor_find_by_secondary(struct interface *ifp,
|
||||||
struct prefix *src);
|
struct prefix *src);
|
||||||
struct pim_neighbor *pim_neighbor_find_if(struct interface *ifp);
|
struct pim_neighbor *pim_neighbor_find_if(struct interface *ifp);
|
||||||
|
@ -320,12 +320,11 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, pim_addr bsr_addr,
|
|||||||
if (if_is_loopback(ifp) && if_is_loopback(src_ifp))
|
if (if_is_loopback(ifp) && if_is_loopback(src_ifp))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
nbr = pim_neighbor_find(ifp, znh->nexthop_addr);
|
nbr = pim_neighbor_find(ifp, znh->nexthop_addr, true);
|
||||||
if (!nbr)
|
if (!nbr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
return znh->ifindex == src_ifp->ifindex &&
|
return znh->ifindex == src_ifp->ifindex;
|
||||||
(!pim_addr_cmp(znh->nexthop_addr, src_ip));
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -380,12 +379,13 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, pim_addr bsr_addr,
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
/* MRIB (IGP) may be pointing at a router where PIM is down */
|
/* MRIB (IGP) may be pointing at a router where PIM is down */
|
||||||
nbr = pim_neighbor_find(ifp, nhaddr);
|
|
||||||
|
nbr = pim_neighbor_find(ifp, nhaddr, true);
|
||||||
|
|
||||||
if (!nbr)
|
if (!nbr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
return nh->ifindex == src_ifp->ifindex &&
|
return nh->ifindex == src_ifp->ifindex;
|
||||||
(!pim_addr_cmp(nhaddr, src_ip));
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -568,7 +568,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
|
|||||||
src)) {
|
src)) {
|
||||||
nbr = pim_neighbor_find(
|
nbr = pim_neighbor_find(
|
||||||
nexthop->interface,
|
nexthop->interface,
|
||||||
nexthop->mrib_nexthop_addr);
|
nexthop->mrib_nexthop_addr, true);
|
||||||
if (!nbr
|
if (!nbr
|
||||||
&& !if_is_loopback(nexthop->interface)) {
|
&& !if_is_loopback(nexthop->interface)) {
|
||||||
if (PIM_DEBUG_PIM_NHT)
|
if (PIM_DEBUG_PIM_NHT)
|
||||||
@ -610,7 +610,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,
|
|||||||
#else
|
#else
|
||||||
pim_addr nhaddr = nh_node->gate.ipv6;
|
pim_addr nhaddr = nh_node->gate.ipv6;
|
||||||
#endif
|
#endif
|
||||||
nbrs[i] = pim_neighbor_find(ifps[i], nhaddr);
|
nbrs[i] = pim_neighbor_find(ifps[i], nhaddr, true);
|
||||||
if (nbrs[i] || pim_if_connected_to_source(ifps[i], src))
|
if (nbrs[i] || pim_if_connected_to_source(ifps[i], src))
|
||||||
num_nbrs++;
|
num_nbrs++;
|
||||||
}
|
}
|
||||||
@ -961,7 +961,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
|
|||||||
pim->vrf->vrf_id);
|
pim->vrf->vrf_id);
|
||||||
if (ifps[i]) {
|
if (ifps[i]) {
|
||||||
nbrs[i] = pim_neighbor_find(
|
nbrs[i] = pim_neighbor_find(
|
||||||
ifps[i], nexthop_tab[i].nexthop_addr);
|
ifps[i], nexthop_tab[i].nexthop_addr, true);
|
||||||
|
|
||||||
if (nbrs[i] || pim_if_connected_to_source(ifps[i], src))
|
if (nbrs[i] || pim_if_connected_to_source(ifps[i], src))
|
||||||
num_nbrs++;
|
num_nbrs++;
|
||||||
}
|
}
|
||||||
|
@ -302,7 +302,7 @@ int pim_pim_packet(struct interface *ifp, uint8_t *buf, size_t len,
|
|||||||
pim_msg_len - PIM_MSG_HEADER_LEN);
|
pim_msg_len - PIM_MSG_HEADER_LEN);
|
||||||
break;
|
break;
|
||||||
case PIM_MSG_TYPE_JOIN_PRUNE:
|
case PIM_MSG_TYPE_JOIN_PRUNE:
|
||||||
neigh = pim_neighbor_find(ifp, sg.src);
|
neigh = pim_neighbor_find(ifp, sg.src, false);
|
||||||
if (!neigh) {
|
if (!neigh) {
|
||||||
if (PIM_DEBUG_PIM_PACKETS)
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
@ -317,7 +317,7 @@ int pim_pim_packet(struct interface *ifp, uint8_t *buf, size_t len,
|
|||||||
pim_msg_len - PIM_MSG_HEADER_LEN);
|
pim_msg_len - PIM_MSG_HEADER_LEN);
|
||||||
break;
|
break;
|
||||||
case PIM_MSG_TYPE_ASSERT:
|
case PIM_MSG_TYPE_ASSERT:
|
||||||
neigh = pim_neighbor_find(ifp, sg.src);
|
neigh = pim_neighbor_find(ifp, sg.src, false);
|
||||||
if (!neigh) {
|
if (!neigh) {
|
||||||
if (PIM_DEBUG_PIM_PACKETS)
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
|
@ -129,8 +129,8 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
|
|||||||
i++;
|
i++;
|
||||||
} else if (neighbor_needed &&
|
} else if (neighbor_needed &&
|
||||||
!pim_if_connected_to_source(ifp, addr)) {
|
!pim_if_connected_to_source(ifp, addr)) {
|
||||||
nbr = pim_neighbor_find(ifp,
|
nbr = pim_neighbor_find(
|
||||||
nexthop_tab[i].nexthop_addr);
|
ifp, nexthop_tab[i].nexthop_addr, true);
|
||||||
if (PIM_DEBUG_PIM_TRACE_DETAIL)
|
if (PIM_DEBUG_PIM_TRACE_DETAIL)
|
||||||
zlog_debug("ifp name: %s, pim nbr: %p",
|
zlog_debug("ifp name: %s, pim nbr: %p",
|
||||||
ifp->name, nbr);
|
ifp->name, nbr);
|
||||||
|
@ -340,7 +340,7 @@ static void join_timer_stop(struct pim_upstream *up)
|
|||||||
|
|
||||||
if (up->rpf.source_nexthop.interface)
|
if (up->rpf.source_nexthop.interface)
|
||||||
nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
|
nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
|
||||||
up->rpf.rpf_addr);
|
up->rpf.rpf_addr, true);
|
||||||
|
|
||||||
if (nbr)
|
if (nbr)
|
||||||
pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr);
|
pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr);
|
||||||
@ -354,7 +354,7 @@ void join_timer_start(struct pim_upstream *up)
|
|||||||
|
|
||||||
if (up->rpf.source_nexthop.interface) {
|
if (up->rpf.source_nexthop.interface) {
|
||||||
nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
|
nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
|
||||||
up->rpf.rpf_addr);
|
up->rpf.rpf_addr, true);
|
||||||
|
|
||||||
if (PIM_DEBUG_PIM_EVENTS) {
|
if (PIM_DEBUG_PIM_EVENTS) {
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
@ -446,7 +446,8 @@ void pim_upstream_join_suppress(struct pim_upstream *up, pim_addr rpf,
|
|||||||
else {
|
else {
|
||||||
/* Remove it from jp agg from the nbr for suppression */
|
/* Remove it from jp agg from the nbr for suppression */
|
||||||
nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
|
nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
|
||||||
up->rpf.rpf_addr);
|
up->rpf.rpf_addr, true);
|
||||||
|
|
||||||
if (nbr) {
|
if (nbr) {
|
||||||
join_timer_remain_msec =
|
join_timer_remain_msec =
|
||||||
pim_time_timer_remain_msec(nbr->jp_timer);
|
pim_time_timer_remain_msec(nbr->jp_timer);
|
||||||
@ -498,7 +499,8 @@ void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label,
|
|||||||
struct pim_neighbor *nbr;
|
struct pim_neighbor *nbr;
|
||||||
|
|
||||||
nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
|
nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
|
||||||
up->rpf.rpf_addr);
|
up->rpf.rpf_addr, true);
|
||||||
|
|
||||||
if (nbr)
|
if (nbr)
|
||||||
join_timer_remain_msec =
|
join_timer_remain_msec =
|
||||||
pim_time_timer_remain_msec(nbr->jp_timer);
|
pim_time_timer_remain_msec(nbr->jp_timer);
|
||||||
|
@ -270,7 +270,8 @@ void pim_zebra_upstream_rpf_changed(struct pim_instance *pim,
|
|||||||
struct pim_neighbor *nbr;
|
struct pim_neighbor *nbr;
|
||||||
|
|
||||||
nbr = pim_neighbor_find(old->source_nexthop.interface,
|
nbr = pim_neighbor_find(old->source_nexthop.interface,
|
||||||
old->rpf_addr);
|
old->rpf_addr, true);
|
||||||
|
|
||||||
if (nbr)
|
if (nbr)
|
||||||
pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr);
|
pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr);
|
||||||
|
|
||||||
|
@ -134,8 +134,6 @@ static int zserv_encode_nexthop(struct stream *s, struct nexthop *nexthop)
|
|||||||
stream_putl(s, nexthop->ifindex);
|
stream_putl(s, nexthop->ifindex);
|
||||||
break;
|
break;
|
||||||
case NEXTHOP_TYPE_IPV6:
|
case NEXTHOP_TYPE_IPV6:
|
||||||
stream_put(s, &nexthop->gate.ipv6, 16);
|
|
||||||
break;
|
|
||||||
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||||
stream_put(s, &nexthop->gate.ipv6, 16);
|
stream_put(s, &nexthop->gate.ipv6, 16);
|
||||||
stream_putl(s, nexthop->ifindex);
|
stream_putl(s, nexthop->ifindex);
|
||||||
|
Loading…
Reference in New Issue
Block a user