diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index 9b571415fd..b82ef332fb 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -1398,7 +1398,7 @@ void pim_show_upstream(struct pim_instance *pim, struct vty *vty, nbr = pim_neighbor_find( up->rpf.source_nexthop.interface, - up->rpf.rpf_addr); + up->rpf.rpf_addr, false); if (nbr) pim_time_timer_to_hhmmss(join_timer, sizeof(join_timer), diff --git a/pimd/pim_hello.c b/pimd/pim_hello.c index 03ce8687e5..4112618109 100644 --- a/pimd/pim_hello.c +++ b/pimd/pim_hello.c @@ -290,7 +290,7 @@ int pim_hello_recv(struct interface *ifp, pim_addr src_addr, uint8_t *tlv_buf, New neighbor? */ - neigh = pim_neighbor_find(ifp, src_addr); + neigh = pim_neighbor_find(ifp, src_addr, false); if (!neigh) { /* Add as new neighbor */ diff --git a/pimd/pim_neighbor.c b/pimd/pim_neighbor.c index 7726ac00b0..2457d1aaf0 100644 --- a/pimd/pim_neighbor.c +++ b/pimd/pim_neighbor.c @@ -419,7 +419,7 @@ struct pim_neighbor *pim_neighbor_find_by_secondary(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 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; } diff --git a/pimd/pim_neighbor.h b/pimd/pim_neighbor.h index a2a2df9e04..8e361f6685 100644 --- a/pimd/pim_neighbor.h +++ b/pimd/pim_neighbor.h @@ -51,7 +51,7 @@ struct pim_neighbor { void pim_neighbor_timer_reset(struct pim_neighbor *neigh, uint16_t holdtime); void pim_neighbor_free(struct pim_neighbor *neigh); 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 prefix *src); struct pim_neighbor *pim_neighbor_find_if(struct interface *ifp); diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index a33da64568..07cdac3a48 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -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)) return true; - nbr = pim_neighbor_find(ifp, znh->nexthop_addr); + nbr = pim_neighbor_find(ifp, znh->nexthop_addr, true); if (!nbr) continue; - return znh->ifindex == src_ifp->ifindex && - (!pim_addr_cmp(znh->nexthop_addr, src_ip)); + return znh->ifindex == src_ifp->ifindex; } return false; } @@ -380,12 +379,13 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, pim_addr bsr_addr, return true; /* 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) continue; - return nh->ifindex == src_ifp->ifindex && - (!pim_addr_cmp(nhaddr, src_ip)); + return nh->ifindex == src_ifp->ifindex; } return false; } @@ -568,7 +568,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, src)) { nbr = pim_neighbor_find( nexthop->interface, - nexthop->mrib_nexthop_addr); + nexthop->mrib_nexthop_addr, true); if (!nbr && !if_is_loopback(nexthop->interface)) { if (PIM_DEBUG_PIM_NHT) @@ -610,7 +610,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, #else pim_addr nhaddr = nh_node->gate.ipv6; #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)) num_nbrs++; } @@ -961,7 +961,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, pim->vrf->vrf_id); if (ifps[i]) { 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)) num_nbrs++; } diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c index 1dd99d7ecd..6a926fae86 100644 --- a/pimd/pim_pim.c +++ b/pimd/pim_pim.c @@ -302,7 +302,7 @@ int pim_pim_packet(struct interface *ifp, uint8_t *buf, size_t len, pim_msg_len - PIM_MSG_HEADER_LEN); break; case PIM_MSG_TYPE_JOIN_PRUNE: - neigh = pim_neighbor_find(ifp, sg.src); + neigh = pim_neighbor_find(ifp, sg.src, false); if (!neigh) { if (PIM_DEBUG_PIM_PACKETS) 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); break; case PIM_MSG_TYPE_ASSERT: - neigh = pim_neighbor_find(ifp, sg.src); + neigh = pim_neighbor_find(ifp, sg.src, false); if (!neigh) { if (PIM_DEBUG_PIM_PACKETS) zlog_debug( diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c index d237a73126..3ec2e53ae6 100644 --- a/pimd/pim_rpf.c +++ b/pimd/pim_rpf.c @@ -129,8 +129,8 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop, i++; } else if (neighbor_needed && !pim_if_connected_to_source(ifp, addr)) { - nbr = pim_neighbor_find(ifp, - nexthop_tab[i].nexthop_addr); + nbr = pim_neighbor_find( + ifp, nexthop_tab[i].nexthop_addr, true); if (PIM_DEBUG_PIM_TRACE_DETAIL) zlog_debug("ifp name: %s, pim nbr: %p", ifp->name, nbr); diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 4ef0bfaa48..2d542d6187 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -340,7 +340,7 @@ static void join_timer_stop(struct pim_upstream *up) if (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) 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) { nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, - up->rpf.rpf_addr); + up->rpf.rpf_addr, true); if (PIM_DEBUG_PIM_EVENTS) { zlog_debug( @@ -446,7 +446,8 @@ void pim_upstream_join_suppress(struct pim_upstream *up, pim_addr rpf, else { /* Remove it from jp agg from the nbr for suppression */ nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, - up->rpf.rpf_addr); + up->rpf.rpf_addr, true); + if (nbr) { join_timer_remain_msec = 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; nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, - up->rpf.rpf_addr); + up->rpf.rpf_addr, true); + if (nbr) join_timer_remain_msec = pim_time_timer_remain_msec(nbr->jp_timer); diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 2c76fd6868..6377deca21 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -270,7 +270,8 @@ void pim_zebra_upstream_rpf_changed(struct pim_instance *pim, struct pim_neighbor *nbr; nbr = pim_neighbor_find(old->source_nexthop.interface, - old->rpf_addr); + old->rpf_addr, true); + if (nbr) pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr); diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index a2233a6667..c0945eae2d 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -134,8 +134,6 @@ static int zserv_encode_nexthop(struct stream *s, struct nexthop *nexthop) stream_putl(s, nexthop->ifindex); break; case NEXTHOP_TYPE_IPV6: - stream_put(s, &nexthop->gate.ipv6, 16); - break; case NEXTHOP_TYPE_IPV6_IFINDEX: stream_put(s, &nexthop->gate.ipv6, 16); stream_putl(s, nexthop->ifindex);