]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospfd: rework BFD integration
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Wed, 3 Mar 2021 20:22:47 +0000 (17:22 -0300)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Tue, 23 Mar 2021 13:18:42 +0000 (10:18 -0300)
Use new BFD API to integrate with OSPFv2.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
ospfd/ospf_bfd.c
ospfd/ospf_bfd.h
ospfd/ospf_interface.c
ospfd/ospf_interface.h
ospfd/ospf_main.c
ospfd/ospf_neighbor.c
ospfd/ospf_neighbor.h
ospfd/ospf_nsm.c
ospfd/ospf_vty.c
ospfd/ospfd.c

index a9bc9069d20f3f509281deafa3781389aef8ae39..1f864224835d6a803a7a46ddda51ad5ca4765f8b 100644 (file)
@@ -23,6 +23,7 @@
 #include <zebra.h>
 
 #include "command.h"
+#include "json.h"
 #include "linklist.h"
 #include "memory.h"
 #include "prefix.h"
 #include "ospf_dump.h"
 #include "ospf_vty.h"
 
-extern struct zclient *zclient;
-
-/*
- * ospf_bfd_info_free - Free BFD info structure
- */
-void ospf_bfd_info_free(void **bfd_info)
-{
-       bfd_info_free((struct bfd_info **)bfd_info);
-}
-
-/*
- * ospf_bfd_reg_dereg_nbr - Register/Deregister a neighbor with BFD through
- *                          zebra for starting/stopping the monitoring of
- *                          the neighbor rechahability.
- */
-static void ospf_bfd_reg_dereg_nbr(struct ospf_neighbor *nbr, int command)
-{
-       struct ospf_interface *oi = nbr->oi;
-       struct interface *ifp = oi->ifp;
-       struct ospf_if_params *params;
-       struct bfd_info *bfd_info;
-       int cbit;
-
-       /* Check if BFD is enabled */
-       params = IF_DEF_PARAMS(ifp);
-
-       /* Check if BFD is enabled */
-       if (!params->bfd_info)
-               return;
-       bfd_info = (struct bfd_info *)params->bfd_info;
-
-       if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
-               zlog_debug("%s nbr (%pI4) with BFD. OSPF vrf %s",
-                          bfd_get_command_dbg_str(command),
-                          &nbr->src,
-                          ospf_vrf_id_to_name(oi->ospf->vrf_id));
+DEFINE_MTYPE_STATIC(OSPFD, BFD_CONFIG, "BFD configuration data");
 
-       cbit = CHECK_FLAG(bfd_info->flags, BFD_FLAG_BFD_CBIT_ON);
-
-       bfd_peer_sendmsg(zclient, bfd_info, AF_INET, &nbr->src, NULL, ifp->name,
-                        0, 0, cbit, command, 0, oi->ospf->vrf_id);
-}
+extern struct zclient *zclient;
 
 /*
  * ospf_bfd_trigger_event - Neighbor is registered/deregistered with BFD when
@@ -94,293 +56,151 @@ static void ospf_bfd_reg_dereg_nbr(struct ospf_neighbor *nbr, int command)
 void ospf_bfd_trigger_event(struct ospf_neighbor *nbr, int old_state, int state)
 {
        if ((old_state < NSM_TwoWay) && (state >= NSM_TwoWay))
-               ospf_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_REGISTER);
+               bfd_sess_install(nbr->bfd_session);
        else if ((old_state >= NSM_TwoWay) && (state < NSM_TwoWay))
-               ospf_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_DEREGISTER);
+               bfd_sess_uninstall(nbr->bfd_session);
 }
 
-/*
- * ospf_bfd_reg_dereg_all_nbr - Register/Deregister all neighbors associated
- *                              with a interface with BFD through
- *                              zebra for starting/stopping the monitoring of
- *                              the neighbor rechahability.
- */
-static int ospf_bfd_reg_dereg_all_nbr(struct interface *ifp, int command)
+static void ospf_bfd_session_change(struct bfd_session_params *bsp,
+                                   const struct bfd_session_status *bss,
+                                   void *arg)
 {
-       struct ospf_interface *oi;
-       struct route_table *nbrs;
-       struct ospf_neighbor *nbr;
-       struct route_node *irn;
-       struct route_node *nrn;
-
-       for (irn = route_top(IF_OIFS(ifp)); irn; irn = route_next(irn)) {
-               if ((oi = irn->info) == NULL)
-                       continue;
+       struct ospf_neighbor *nbr = arg;
 
-               if ((nbrs = oi->nbrs) == NULL)
-                       continue;
+       /* BFD peer went down. */
+       if (bss->state == BFD_STATUS_DOWN
+           && bss->previous_state == BFD_STATUS_UP) {
+               if (IS_DEBUG_OSPF(nsm, NSM_EVENTS))
+                       zlog_debug("NSM[%s:%pI4]: BFD Down", IF_NAME(nbr->oi),
+                                  &nbr->address.u.prefix4);
 
-               for (nrn = route_top(nbrs); nrn; nrn = route_next(nrn)) {
-                       if ((nbr = nrn->info) == NULL || nbr == oi->nbr_self)
-                               continue;
-
-                       if (command != ZEBRA_BFD_DEST_DEREGISTER)
-                               ospf_bfd_info_nbr_create(oi, nbr);
-                       else
-                               bfd_info_free(
-                                       (struct bfd_info **)&nbr->bfd_info);
-
-                       if (nbr->state < NSM_TwoWay)
-                               continue;
-
-                       ospf_bfd_reg_dereg_nbr(nbr, command);
-               }
+               OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_InactivityTimer);
        }
 
-       return 0;
+       /* BFD peer went up. */
+       if (bss->state == BSS_UP && bss->previous_state == BSS_DOWN)
+               if (IS_DEBUG_OSPF(nsm, NSM_EVENTS))
+                       zlog_debug("NSM[%s:%pI4]: BFD Up", IF_NAME(nbr->oi),
+                                  &nbr->address.u.prefix4);
 }
 
-/*
- * ospf_bfd_nbr_replay - Replay all the neighbors that have BFD enabled
- *                       to zebra
- */
-static int ospf_bfd_nbr_replay(ZAPI_CALLBACK_ARGS)
+void ospf_neighbor_bfd_apply(struct ospf_neighbor *nbr)
 {
-       struct listnode *inode, *node, *onode;
-       struct ospf *ospf;
-       struct ospf_interface *oi;
-       struct route_table *nbrs;
-       struct route_node *rn;
-       struct ospf_neighbor *nbr;
-       struct ospf_if_params *params;
+       struct ospf_interface *oi = nbr->oi;
+       struct ospf_if_params *oip = IF_DEF_PARAMS(oi->ifp);
 
-       if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) {
-               zlog_debug("Zebra: BFD Dest replay request");
+       /* BFD configuration was removed. */
+       if (oip->bfd_config == NULL) {
+               bfd_sess_free(&nbr->bfd_session);
+               return;
        }
 
-       /* Send the client registration */
-       bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER, vrf_id);
-
-       /* Replay the neighbor, if BFD is enabled in OSPF */
-       for (ALL_LIST_ELEMENTS(om->ospf, node, onode, ospf)) {
-               for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, inode, oi)) {
-                       if ((nbrs = oi->nbrs) == NULL)
-                               continue;
-
-                       params = IF_DEF_PARAMS(oi->ifp);
-                       if (!params->bfd_info)
-                               continue;
-
-                       for (rn = route_top(nbrs); rn; rn = route_next(rn)) {
-                               if ((nbr = rn->info) == NULL
-                                   || nbr == oi->nbr_self)
-                                       continue;
+       /* New BFD session. */
+       if (nbr->bfd_session == NULL) {
+               nbr->bfd_session = bfd_sess_new(ospf_bfd_session_change, nbr);
+               bfd_sess_set_ipv4_addrs(nbr->bfd_session, NULL, &nbr->src);
+               bfd_sess_set_interface(nbr->bfd_session, oi->ifp->name);
+               bfd_sess_set_vrf(nbr->bfd_session, oi->ospf->vrf_id);
+               bfd_sess_enable(nbr->bfd_session, true);
+       }
 
-                               if (nbr->state < NSM_TwoWay)
-                                       continue;
+       /* Set new configuration. */
+       bfd_sess_set_timers(nbr->bfd_session,
+                           oip->bfd_config->detection_multiplier,
+                           oip->bfd_config->min_rx, oip->bfd_config->min_tx);
+       bfd_sess_set_profile(nbr->bfd_session, oip->bfd_config->profile);
 
-                               if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
-                                       zlog_debug("Replaying nbr (%pI4) to BFD",
-                                                  &nbr->src);
+       /* Don't start sessions on down OSPF sessions. */
+       if (nbr->state < NSM_TwoWay)
+               return;
 
-                               ospf_bfd_reg_dereg_nbr(nbr,
-                                                      ZEBRA_BFD_DEST_UPDATE);
-                       }
-               }
-       }
-       return 0;
+       bfd_sess_install(nbr->bfd_session);
 }
 
-/*
- * ospf_bfd_interface_dest_update - Find the neighbor for which the BFD status
- *                                  has changed and bring down the neighbor
- *                                  connectivity if the BFD status changed to
- *                                  down.
- */
-static int ospf_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
+static void ospf_interface_bfd_apply(struct interface *ifp)
 {
-       struct interface *ifp;
        struct ospf_interface *oi;
-       struct ospf_if_params *params;
-       struct ospf_neighbor *nbr = NULL;
-       struct route_node *node;
-       struct route_node *n_node;
-       struct prefix p, src_p;
-       int status;
-       int old_status;
-       struct bfd_info *bfd_info;
-       struct timeval tv;
-
-       ifp = bfd_get_peer_info(zclient->ibuf, &p, &src_p, &status, NULL,
-                               vrf_id);
-
-       if ((ifp == NULL) || (p.family != AF_INET))
-               return 0;
-
-       if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
-               zlog_debug("Zebra: interface %s bfd destination %pFX %s",
-                          ifp->name, &p, bfd_get_status_str(status));
-
-       params = IF_DEF_PARAMS(ifp);
-       if (!params->bfd_info)
-               return 0;
-
-       for (node = route_top(IF_OIFS(ifp)); node; node = route_next(node)) {
-               if ((oi = node->info) == NULL)
-                       continue;
-
-               /* 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);
-               }
+       struct route_table *nbrs;
+       struct ospf_neighbor *nbr;
+       struct route_node *irn;
+       struct route_node *nrn;
 
-               if (!nbr || !nbr->bfd_info)
+       /* Iterate over all interfaces and set neighbors BFD session. */
+       for (irn = route_top(IF_OIFS(ifp)); irn; irn = route_next(irn)) {
+               if ((oi = irn->info) == NULL)
                        continue;
-
-               bfd_info = (struct bfd_info *)nbr->bfd_info;
-               if (bfd_info->status == status)
+               if ((nbrs = oi->nbrs) == NULL)
                        continue;
+               for (nrn = route_top(nbrs); nrn; nrn = route_next(nrn)) {
+                       if ((nbr = nrn->info) == NULL || nbr == oi->nbr_self)
+                               continue;
 
-               old_status = bfd_info->status;
-               BFD_SET_CLIENT_STATUS(bfd_info->status, status);
-               monotime(&tv);
-               bfd_info->last_update = tv.tv_sec;
-
-               if ((status == BFD_STATUS_DOWN)
-                   && (old_status == BFD_STATUS_UP)) {
-                       if (IS_DEBUG_OSPF(nsm, NSM_EVENTS))
-                               zlog_debug("NSM[%s:%pI4]: BFD Down",
-                                          IF_NAME(nbr->oi),
-                                          &nbr->address.u.prefix4);
-
-                       OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_InactivityTimer);
-               }
-               if ((status == BFD_STATUS_UP)
-                   && (old_status == BFD_STATUS_DOWN)) {
-                       if (IS_DEBUG_OSPF(nsm, NSM_EVENTS))
-                               zlog_debug("NSM[%s:%pI4]: BFD Up",
-                                          IF_NAME(nbr->oi),
-                                          &nbr->address.u.prefix4);
+                       ospf_neighbor_bfd_apply(nbr);
                }
        }
-
-       return 0;
 }
 
-/*
- * ospf_bfd_info_nbr_create - Create/update BFD information for a neighbor.
- */
-void ospf_bfd_info_nbr_create(struct ospf_interface *oi,
-                             struct ospf_neighbor *nbr)
+static void ospf_interface_enable_bfd(struct interface *ifp)
 {
-       struct bfd_info *oi_bfd_info;
-       struct bfd_info *nbr_bfd_info;
-       struct interface *ifp = oi->ifp;
-       struct ospf_if_params *params;
+       struct ospf_if_params *oip = IF_DEF_PARAMS(ifp);
 
-       /* Check if BFD is enabled */
-       params = IF_DEF_PARAMS(ifp);
-
-       /* Check if BFD is enabled */
-       if (!params->bfd_info)
+       if (oip->bfd_config)
                return;
 
-       oi_bfd_info = (struct bfd_info *)params->bfd_info;
-       if (!nbr->bfd_info)
-               nbr->bfd_info = bfd_info_create();
+       /* Allocate memory for configurations and set defaults. */
+       oip->bfd_config = XCALLOC(MTYPE_BFD_CONFIG, sizeof(*oip->bfd_config));
+       oip->bfd_config->detection_multiplier = BFD_DEF_DETECT_MULT;
+       oip->bfd_config->min_rx = BFD_DEF_MIN_RX;
+       oip->bfd_config->min_tx = BFD_DEF_MIN_TX;
+}
 
-       nbr_bfd_info = (struct bfd_info *)nbr->bfd_info;
-       nbr_bfd_info->detect_mult = oi_bfd_info->detect_mult;
-       nbr_bfd_info->desired_min_tx = oi_bfd_info->desired_min_tx;
-       nbr_bfd_info->required_min_rx = oi_bfd_info->required_min_rx;
+void ospf_interface_disable_bfd(struct interface *ifp,
+                               struct ospf_if_params *oip)
+{
+       XFREE(MTYPE_BFD_CONFIG, oip->bfd_config);
+       ospf_interface_bfd_apply(ifp);
 }
 
 /*
  * ospf_bfd_write_config - Write the interface BFD configuration.
  */
-void ospf_bfd_write_config(struct vty *vty, struct ospf_if_params *params)
-
+void ospf_bfd_write_config(struct vty *vty, const struct ospf_if_params *params
+                          __attribute__((unused)))
 {
 #if HAVE_BFDD == 0
-       struct bfd_info *bfd_info;
-#endif /* ! HAVE_BFDD */
-
-       if (!params->bfd_info)
-               return;
-
-#if HAVE_BFDD == 0
-       bfd_info = (struct bfd_info *)params->bfd_info;
-
        if (CHECK_FLAG(bfd_info->flags, BFD_FLAG_PARAM_CFG))
-               vty_out(vty, " ip ospf bfd %d %d %d\n", bfd_info->detect_mult,
-                       bfd_info->required_min_rx, bfd_info->desired_min_tx);
+               vty_out(vty, " ip ospf bfd %d %d %d\n",
+                       params->bfd_config->detection_multiplier,
+                       params->bfd_config->min_rx, params->bfd_config->min_tx);
        else
 #endif /* ! HAVE_BFDD */
                vty_out(vty, " ip ospf bfd\n");
 }
 
-/*
- * ospf_bfd_show_info - Show BFD info structure
- */
-void ospf_bfd_show_info(struct vty *vty, void *bfd_info, json_object *json_obj,
-                       bool use_json, int param_only)
-{
-       if (param_only)
-               bfd_show_param(vty, (struct bfd_info *)bfd_info, 1, 0, use_json,
-                              json_obj);
-       else
-               bfd_show_info(vty, (struct bfd_info *)bfd_info, 0, 1, use_json,
-                             json_obj);
-}
-
-/*
- * ospf_bfd_interface_show - Show the interface BFD configuration.
- */
-void ospf_bfd_interface_show(struct vty *vty, struct interface *ifp,
-                            json_object *json_interface_sub, bool use_json)
+void ospf_interface_bfd_show(struct vty *vty, const struct interface *ifp,
+                            struct json_object *json)
 {
-       struct ospf_if_params *params;
-
-       params = IF_DEF_PARAMS(ifp);
-
-       ospf_bfd_show_info(vty, params->bfd_info, json_interface_sub, use_json,
-                          1);
-}
-
-/*
- * ospf_bfd_if_param_set - Set the configured BFD paramter values for
- *                         interface.
- */
-static void ospf_bfd_if_param_set(struct interface *ifp, uint32_t min_rx,
-                                 uint32_t min_tx, uint8_t detect_mult,
-                                 int defaults)
-{
-       struct ospf_if_params *params;
-       int command = 0;
+       struct ospf_if_params *params = IF_DEF_PARAMS(ifp);
+       struct bfd_configuration *bfd_config = params->bfd_config;
+       struct json_object *json_bfd;
 
-       params = IF_DEF_PARAMS(ifp);
+       if (bfd_config == NULL)
+               return;
 
-       bfd_set_param((struct bfd_info **)&(params->bfd_info), min_rx, min_tx,
-                     detect_mult, NULL, defaults, &command);
-       if (command)
-               ospf_bfd_reg_dereg_all_nbr(ifp, command);
+       if (json) {
+               json_bfd = json_object_new_object();
+               json_object_int_add(json_bfd, "detectionMultiplier",
+                                   bfd_config->detection_multiplier);
+               json_object_int_add(json_bfd, "rxMinInterval",
+                                   bfd_config->min_rx);
+               json_object_int_add(json_bfd, "txMinInterval",
+                                   bfd_config->min_tx);
+               json_object_object_add(json, "peerBfdInfo", json_bfd);
+       } else
+               vty_out(vty,
+                       "  BFD: Detect Multiplier: %d, Min Rx interval: %d, Min Tx interval: %d\n",
+                       bfd_config->detection_multiplier, bfd_config->min_rx,
+                       bfd_config->min_tx);
 }
 
 DEFUN (ip_ospf_bfd,
@@ -391,17 +211,8 @@ DEFUN (ip_ospf_bfd,
        "Enables BFD support\n")
 {
        VTY_DECLVAR_CONTEXT(interface, ifp);
-       struct ospf_if_params *params;
-       struct bfd_info *bfd_info;
-
-       assert(ifp);
-       params = IF_DEF_PARAMS(ifp);
-       bfd_info = params->bfd_info;
-
-       if (!bfd_info || !CHECK_FLAG(bfd_info->flags, BFD_FLAG_PARAM_CFG))
-               ospf_bfd_if_param_set(ifp, BFD_DEF_MIN_RX, BFD_DEF_MIN_TX,
-                                     BFD_DEF_DETECT_MULT, 1);
-
+       ospf_interface_enable_bfd(ifp);
+       ospf_interface_bfd_apply(ifp);
        return CMD_SUCCESS;
 }
 
@@ -421,23 +232,20 @@ DEFUN(
        "Desired min transmit interval\n")
 {
        VTY_DECLVAR_CONTEXT(interface, ifp);
+       struct ospf_if_params *params;
        int idx_number = 3;
        int idx_number_2 = 4;
        int idx_number_3 = 5;
-       uint32_t rx_val;
-       uint32_t tx_val;
-       uint8_t dm_val;
-       int ret;
 
-       assert(ifp);
+       ospf_interface_enable_bfd(ifp);
 
-       if ((ret = bfd_validate_param(
-                    vty, argv[idx_number]->arg, argv[idx_number_2]->arg,
-                    argv[idx_number_3]->arg, &dm_val, &rx_val, &tx_val))
-           != CMD_SUCCESS)
-               return ret;
+       params = IF_DEF_PARAMS(ifp);
+       params->bfd_config->detection_multiplier =
+               strtol(argv[idx_number]->arg, NULL, 10);
+       params->bfd_config->min_rx = strtol(argv[idx_number_2]->arg, NULL, 10);
+       params->bfd_config->min_tx = strtol(argv[idx_number_3]->arg, NULL, 10);
 
-       ospf_bfd_if_param_set(ifp, rx_val, tx_val, dm_val, 0);
+       ospf_interface_bfd_apply(ifp);
 
        return CMD_SUCCESS;
 }
@@ -461,26 +269,13 @@ DEFUN (no_ip_ospf_bfd,
 )
 {
        VTY_DECLVAR_CONTEXT(interface, ifp);
-       struct ospf_if_params *params;
-
-       assert(ifp);
-
-       params = IF_DEF_PARAMS(ifp);
-       if (params->bfd_info) {
-               ospf_bfd_reg_dereg_all_nbr(ifp, ZEBRA_BFD_DEST_DEREGISTER);
-               bfd_info_free(&(params->bfd_info));
-       }
-
+       ospf_interface_disable_bfd(ifp, IF_DEF_PARAMS(ifp));
        return CMD_SUCCESS;
 }
 
-void ospf_bfd_init(void)
+void ospf_bfd_init(struct thread_master *tm)
 {
-       bfd_gbl_init();
-
-       /* Initialize BFD client functions */
-       zclient->interface_bfd_dest_update = ospf_bfd_interface_dest_update;
-       zclient->bfd_dest_replay = ospf_bfd_nbr_replay;
+       bfd_protocol_integration_init(zclient, tm);
 
        /* Install BFD command */
        install_element(INTERFACE_NODE, &ip_ospf_bfd_cmd);
index 74385d326852f3d02c3460f5bc17fd084f8e3a5a..9393c839f501c69698f37e955c43c81095302f54 100644 (file)
 #ifndef _ZEBRA_OSPF_BFD_H
 #define _ZEBRA_OSPF_BFD_H
 
+#include "ospfd/ospf_interface.h"
 #include "json.h"
 
-extern void ospf_bfd_init(void);
+extern void ospf_bfd_init(struct thread_master *tm);
 
 extern void ospf_bfd_write_config(struct vty *vty,
-                                 struct ospf_if_params *params);
+                                 const struct ospf_if_params *params);
 
 extern void ospf_bfd_trigger_event(struct ospf_neighbor *nbr, int old_state,
                                   int state);
 
-extern void ospf_bfd_interface_show(struct vty *vty, struct interface *ifp,
-                                   json_object *json_interface_sub,
-                                   bool use_json);
-
-extern void ospf_bfd_info_nbr_create(struct ospf_interface *oi,
-                                    struct ospf_neighbor *nbr);
+/**
+ * Legacy information: it is the peers who actually have this information
+ * and the protocol should not need to know about timers.
+ */
+extern void ospf_interface_bfd_show(struct vty *vty,
+                                   const struct interface *ifp,
+                                   struct json_object *json);
 
-extern void ospf_bfd_show_info(struct vty *vty, void *bfd_info,
-                              json_object *json_obj, bool use_json,
-                              int param_only);
+/**
+ * Disables interface BFD configuration and remove settings from all peers.
+ */
+extern void ospf_interface_disable_bfd(struct interface *ifp,
+                                      struct ospf_if_params *oip);
 
-extern void ospf_bfd_info_free(void **bfd_info);
+/**
+ * Create/update BFD session for this OSPF neighbor.
+ */
+extern void ospf_neighbor_bfd_apply(struct ospf_neighbor *nbr);
 
 #endif /* _ZEBRA_OSPF_BFD_H */
index 0161f05d71e8e6d8728e0054a394676c138c6bfd..d494f0fbce5dacb271fec9d51c60a8b86f2b5946 100644 (file)
@@ -35,6 +35,7 @@
 #include "ldp_sync.h"
 
 #include "ospfd/ospfd.h"
+#include "ospfd/ospf_bfd.h"
 #include "ospfd/ospf_spf.h"
 #include "ospfd/ospf_interface.h"
 #include "ospfd/ospf_ism.h"
@@ -545,10 +546,11 @@ static struct ospf_if_params *ospf_new_if_params(void)
        return oip;
 }
 
-void ospf_del_if_params(struct ospf_if_params *oip)
+static void ospf_del_if_params(struct interface *ifp,
+                              struct ospf_if_params *oip)
 {
        list_delete(&oip->auth_crypt);
-       bfd_info_free(&(oip->bfd_info));
+       ospf_interface_disable_bfd(ifp, oip);
        ldp_sync_info_free(&(oip->ldp_sync_info));
        XFREE(MTYPE_OSPF_IF_PARAMS, oip);
 }
@@ -582,7 +584,7 @@ void ospf_free_if_params(struct interface *ifp, struct in_addr addr)
            && !OSPF_IF_PARAM_CONFIGURED(oip, auth_type)
            && !OSPF_IF_PARAM_CONFIGURED(oip, if_area)
            && listcount(oip->auth_crypt) == 0) {
-               ospf_del_if_params(oip);
+               ospf_del_if_params(ifp, oip);
                rn->info = NULL;
                route_unlock_node(rn);
        }
@@ -696,10 +698,10 @@ static int ospf_if_delete_hook(struct interface *ifp)
 
        for (rn = route_top(IF_OIFS_PARAMS(ifp)); rn; rn = route_next(rn))
                if (rn->info)
-                       ospf_del_if_params(rn->info);
+                       ospf_del_if_params(ifp, rn->info);
        route_table_finish(IF_OIFS_PARAMS(ifp));
 
-       ospf_del_if_params((struct ospf_if_params *)IF_DEF_PARAMS(ifp));
+       ospf_del_if_params(ifp, IF_DEF_PARAMS(ifp));
        XFREE(MTYPE_OSPF_IF_INFO, ifp->info);
 
        return rc;
index 2f146c06f3d714d8e4bed2021569202b8a93e609..7c30bed94ca85b93f0b6607c5b775ddedc146f58 100644 (file)
@@ -22,6 +22,7 @@
 #ifndef _ZEBRA_OSPF_INTERFACE_H
 #define _ZEBRA_OSPF_INTERFACE_H
 
+#include "lib/bfd.h"
 #include "qobj.h"
 #include "hook.h"
 #include "ospfd/ospf_packet.h"
@@ -104,7 +105,16 @@ struct ospf_if_params {
        uint32_t network_lsa_seqnum; /* Network LSA seqnum */
 
        /* BFD configuration */
-       struct bfd_info *bfd_info;
+       struct bfd_configuration {
+               /** BFD session detection multiplier. */
+               uint8_t detection_multiplier;
+               /** BFD session minimum required receive interval. */
+               uint32_t min_rx;
+               /** BFD session minimum required transmission interval. */
+               uint32_t min_tx;
+               /** BFD profile. */
+               char profile[BFD_PROFILE_NAME_LEN];
+       } * bfd_config;
 
        /* MPLS LDP-IGP Sync configuration */
        struct ldp_sync_info *ldp_sync_info;
@@ -285,7 +295,6 @@ extern struct ospf_if_params *ospf_lookup_if_params(struct interface *,
                                                    struct in_addr);
 extern struct ospf_if_params *ospf_get_if_params(struct interface *,
                                                 struct in_addr);
-extern void ospf_del_if_params(struct ospf_if_params *);
 extern void ospf_free_if_params(struct interface *, struct in_addr);
 extern void ospf_if_update_params(struct interface *, struct in_addr);
 
index 9ae2e8b043e3937648561757e0ba14d820b01ab4..d23dea0ca1506f1d472f0b76bce71327781267a2 100644 (file)
@@ -22,6 +22,7 @@
 #include <zebra.h>
 
 #include <lib/version.h>
+#include "bfd.h"
 #include "getopt.h"
 #include "thread.h"
 #include "prefix.h"
@@ -98,6 +99,7 @@ static void sighup(void)
 static void sigint(void)
 {
        zlog_notice("Terminating on signal");
+       bfd_protocol_integration_set_shutdown(true);
        ospf_terminate();
        exit(0);
 }
@@ -214,7 +216,7 @@ int main(int argc, char **argv)
        ospf_vty_clear_init();
 
        /* OSPF BFD init */
-       ospf_bfd_init();
+       ospf_bfd_init(master);
 
        /* OSPF LDP IGP Sync init */
        ospf_ldp_sync_init();
index 2fa43923ab3c5cbe4bfdaeaba58ce9d853a06867..a1b35b2fcd2bd912fc99fc16c3ef4d681373505f 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <zebra.h>
 
+#include "lib/bfd.h"
 #include "linklist.h"
 #include "prefix.h"
 #include "memory.h"
@@ -99,8 +100,6 @@ struct ospf_neighbor *ospf_nbr_new(struct ospf_interface *oi)
 
        nbr->crypt_seqnum = 0;
 
-       ospf_bfd_info_nbr_create(oi, nbr);
-
        /* Initialize GR Helper info*/
        nbr->gr_helper_info.recvd_grace_period = 0;
        nbr->gr_helper_info.actual_grace_period = 0;
@@ -149,7 +148,7 @@ void ospf_nbr_free(struct ospf_neighbor *nbr)
        /* Cancel all events. */ /* Thread lookup cost would be negligible. */
        thread_cancel_event(master, nbr);
 
-       ospf_bfd_info_free(&nbr->bfd_info);
+       bfd_sess_free(&nbr->bfd_session);
 
        OSPF_NSM_TIMER_OFF(nbr->gr_helper_info.t_grace_timer);
 
@@ -458,6 +457,9 @@ static struct ospf_neighbor *ospf_nbr_add(struct ospf_interface *oi,
        if (ntohs(ospfh->auth_type) == OSPF_AUTH_CRYPTOGRAPHIC)
                nbr->crypt_seqnum = ospfh->u.crypt.crypt_seqnum;
 
+       /* Configure BFD if interface has it. */
+       ospf_neighbor_bfd_apply(nbr);
+
        if (IS_DEBUG_OSPF_EVENT)
                zlog_debug("NSM[%s:%pI4]: start", IF_NAME(oi),
                           &nbr->router_id);
index 758693e28948fd79f72c07e807d550c66c2984c1..2ce6d6755c9dbb5920bab606cc3575b564b03b40 100644 (file)
@@ -88,7 +88,7 @@ struct ospf_neighbor {
        uint32_t state_change;           /* NSM state change counter       */
 
        /* BFD information */
-       void *bfd_info;
+       struct bfd_session_params *bfd_session;
 
        /* ospf graceful restart HELPER info */
        struct ospf_helper_info gr_helper_info;
index ca33fd4e1888cf1956ef2d68f38f8e296c3b63c0..006c4888aeb654c8ed54febf58f82b666d5f1033 100644 (file)
@@ -761,7 +761,8 @@ static void nsm_change_state(struct ospf_neighbor *nbr, int state)
        if (state == NSM_Down)
                nbr->crypt_seqnum = 0;
 
-       ospf_bfd_trigger_event(nbr, old_state, state);
+       if (nbr->bfd_session)
+               ospf_bfd_trigger_event(nbr, old_state, state);
 
        /* Preserve old status? */
 }
index 6e42169b3ae23a42708d6a250d41a8406ea9f25c..52dc1d9e8682b62d6722a3aa77c8eae2effe8232 100644 (file)
@@ -3776,7 +3776,8 @@ static void show_ip_ospf_interface_sub(struct vty *vty, struct ospf *ospf,
                                "  Neighbor Count is %d, Adjacent neighbor count is %d\n",
                                ospf_nbr_count(oi, 0),
                                ospf_nbr_count(oi, NSM_Full));
-               ospf_bfd_interface_show(vty, ifp, json_interface_sub, use_json);
+
+               ospf_interface_bfd_show(vty, ifp, json_interface_sub);
 
                /* OSPF Authentication information */
                ospf_interface_auth_show(vty, oi, json_interface_sub, use_json);
@@ -5282,7 +5283,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
                                                 .helper_exit_reason));
        }
 
-       ospf_bfd_show_info(vty, nbr->bfd_info, json_neigh, use_json, 0);
+       bfd_sess_show(vty, json_neigh, nbr->bfd_session);
 
        if (use_json)
                json_object_array_add(json_neigh_array, json_neigh);
@@ -11716,7 +11717,7 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf)
                        }
 
                        /* bfd  print. */
-                       if (params && params->bfd_info)
+                       if (params && params->bfd_config)
                                ospf_bfd_write_config(vty, params);
 
                        /* MTU ignore print. */
index 1a1861fc58d52f5995ed1ebe8d91d858b1979a0c..9856e601305fc42d562c85feb55c77d780af5886 100644 (file)
@@ -42,6 +42,7 @@
 #include "ldp_sync.h"
 
 #include "ospfd/ospfd.h"
+#include "ospfd/ospf_bfd.h"
 #include "ospfd/ospf_network.h"
 #include "ospfd/ospf_interface.h"
 #include "ospfd/ospf_ism.h"
@@ -1931,6 +1932,9 @@ static void ospf_nbr_nbma_add(struct ospf_nbr_nbma *nbr_nbma,
 
                nbr_nbma->nbr = nbr;
 
+               /* Configure BFD if interface has it. */
+               ospf_neighbor_bfd_apply(nbr);
+
                OSPF_NSM_EVENT_EXECUTE(nbr, NSM_Start);
        }
 }