|
|
@ -1,71 +0,0 @@ |
|
|
|
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; |
|
|
|
|