]> git.proxmox.com Git - mirror_frr.git/blobdiff - ospfd/ospf_bfd.c
ospf: BFD down not tearing down OSPF adjacency for point-to-point network
[mirror_frr.git] / ospfd / ospf_bfd.c
index a17975270af957fd8603dad512e163b2b9212de5..b9e78f4cd35df77753c6310299e5fde75a057fba 100644 (file)
@@ -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;
 
@@ -240,7 +262,7 @@ static int ospf_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
                        continue;
 
                old_status = bfd_info->status;
-               bfd_info->status = status;
+               BFD_SET_CLIENT_STATUS(bfd_info->status, status);
                monotime(&tv);
                bfd_info->last_update = tv.tv_sec;