mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-13 16:26:10 +00:00
ospf: BFD down not tearing down OSPF adjacency for point-to-point network
Root Cause: Lookup for the point-to-point neighbor was failing because the neighbor lookup was based on neighbor interface IP address. But, for point-to-point neighbor the key is router-id for lookup. Lookup failure was causing the BFD updates from PTM to get dropped. Fix: Added walk of the neighbor list if the network type is point-to-point to find the appropriate neighbor. The match is based on source IP address of the neighbor since that’s the address registered with BFD for monitoring. Ticket: CM-20411 Signed-off-by: Radhika Mahankali <radhika@cumulusnetworks.com>
This commit is contained in:
parent
f149ebd9a7
commit
6e641a8f2e
@ -202,8 +202,9 @@ static int ospf_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
|
|||||||
struct interface *ifp;
|
struct interface *ifp;
|
||||||
struct ospf_interface *oi;
|
struct ospf_interface *oi;
|
||||||
struct ospf_if_params *params;
|
struct ospf_if_params *params;
|
||||||
struct ospf_neighbor *nbr;
|
struct ospf_neighbor *nbr = NULL;
|
||||||
struct route_node *node;
|
struct route_node *node;
|
||||||
|
struct route_node *n_node;
|
||||||
struct prefix p;
|
struct prefix p;
|
||||||
int status;
|
int status;
|
||||||
int old_status;
|
int old_status;
|
||||||
@ -231,7 +232,28 @@ static int ospf_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
|
|||||||
if ((oi = node->info) == NULL)
|
if ((oi = node->info) == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
nbr = ospf_nbr_lookup_by_addr(oi->nbrs, &p.u.prefix4);
|
/* walk the neighbor list for point-to-point network */
|
||||||
|
if (oi->type == OSPF_IFTYPE_POINTOPOINT) {
|
||||||
|
for (n_node = route_top(oi->nbrs); n_node;
|
||||||
|
n_node = route_next(n_node)) {
|
||||||
|
nbr = n_node->info;
|
||||||
|
if (nbr) {
|
||||||
|
/* skip myself */
|
||||||
|
if (nbr == oi->nbr_self) {
|
||||||
|
nbr = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Found the matching neighbor */
|
||||||
|
if (nbr->src.s_addr ==
|
||||||
|
p.u.prefix4.s_addr)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nbr = ospf_nbr_lookup_by_addr(oi->nbrs, &p.u.prefix4);
|
||||||
|
}
|
||||||
|
|
||||||
if (!nbr || !nbr->bfd_info)
|
if (!nbr || !nbr->bfd_info)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user