|
|
- From eb3e472904e30f35825f08319608217082d4af21 Mon Sep 17 00:00:00 2001
- From: Radhika Mahankali <radhika@cumulusnetworks.com>
- Date: Mon, 9 Apr 2018 15:30:32 -0700
- Subject: [PATCH] ospf: BFD down not tearing down OSPF adjacency for
- point-to-point network
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
-
- 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>
- ---
- ospfd/ospf_bfd.c | 26 ++++++++++++++++++++++++--
- 1 file changed, 24 insertions(+), 2 deletions(-)
-
- diff --git a/ospfd/ospf_bfd.c b/ospfd/ospf_bfd.c
- index a17975270a..05ec4991e5 100644
- --- a/ospfd/ospf_bfd.c
- +++ b/ospfd/ospf_bfd.c
- @@ -202,8 +202,9 @@ static int ospf_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
- struct interface *ifp;
- struct ospf_interface *oi;
- struct ospf_if_params *params;
- - struct ospf_neighbor *nbr;
- + struct ospf_neighbor *nbr = NULL;
- struct route_node *node;
- + struct route_node *n_node;
- struct prefix p;
- int status;
- int old_status;
- @@ -231,7 +232,28 @@ static int ospf_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
- if ((oi = node->info) == NULL)
- 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)
- continue;
-
|