diff options
Diffstat (limited to 'ospfd/ospf_bfd.c')
| -rw-r--r-- | ospfd/ospf_bfd.c | 544 | 
1 files changed, 267 insertions, 277 deletions
diff --git a/ospfd/ospf_bfd.c b/ospfd/ospf_bfd.c index 1bcffea6fd..6d07b44364 100644 --- a/ospfd/ospf_bfd.c +++ b/ospfd/ospf_bfd.c @@ -49,10 +49,9 @@ extern struct zclient *zclient;  /*   * ospf_bfd_info_free - Free BFD info structure   */ -void -ospf_bfd_info_free(void **bfd_info) +void ospf_bfd_info_free(void **bfd_info)  { -  bfd_info_free((struct bfd_info **) bfd_info); +	bfd_info_free((struct bfd_info **)bfd_info);  }  /* @@ -60,42 +59,40 @@ ospf_bfd_info_free(void **bfd_info)   *                          zebra for starting/stopping the monitoring of   *                          the neighbor rechahability.   */ -static void -ospf_bfd_reg_dereg_nbr (struct ospf_neighbor *nbr, int command) +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; - -  /* 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 (%s) with BFD", -                  bfd_get_command_dbg_str(command), -                  inet_ntoa (nbr->src)); - -  bfd_peer_sendmsg (zclient, bfd_info, AF_INET, -                    &nbr->src, NULL, ifp->name, 0, 0, command, 0, VRF_DEFAULT); +	struct ospf_interface *oi = nbr->oi; +	struct interface *ifp = oi->ifp; +	struct ospf_if_params *params; +	struct bfd_info *bfd_info; + +	/* 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 (%s) with BFD", +			   bfd_get_command_dbg_str(command), +			   inet_ntoa(nbr->src)); + +	bfd_peer_sendmsg(zclient, bfd_info, AF_INET, &nbr->src, NULL, ifp->name, +			 0, 0, command, 0, VRF_DEFAULT);  }  /*   * ospf_bfd_trigger_event - Neighbor is registered/deregistered with BFD when   *                          neighbor state is changed to/from 2way.   */ -void -ospf_bfd_trigger_event(struct ospf_neighbor *nbr, int old_state, int state) +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); -  else if ((old_state >= NSM_TwoWay) && (state < NSM_TwoWay)) -    ospf_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_DEREGISTER); +	if ((old_state < NSM_TwoWay) && (state >= NSM_TwoWay)) +		ospf_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_REGISTER); +	else if ((old_state >= NSM_TwoWay) && (state < NSM_TwoWay)) +		ospf_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_DEREGISTER);  }  /* @@ -104,95 +101,91 @@ ospf_bfd_trigger_event(struct ospf_neighbor *nbr, int old_state, int state)   *                              zebra for starting/stopping the monitoring of   *                              the neighbor rechahability.   */ -static int -ospf_bfd_reg_dereg_all_nbr (struct interface *ifp, int command) +static int ospf_bfd_reg_dereg_all_nbr(struct interface *ifp, int command)  { -  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; - -      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; - -          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); -        } -    } - -  return 0; +	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; + +		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; + +			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); +		} +	} + +	return 0;  }  /*   * ospf_bfd_nbr_replay - Replay all the neighbors that have BFD enabled   *                       to zebra   */ -static int -ospf_bfd_nbr_replay (int command, struct zclient *zclient, zebra_size_t length, -                     vrf_id_t vrf_id) +static int ospf_bfd_nbr_replay(int command, struct zclient *zclient, +			       zebra_size_t length, vrf_id_t vrf_id)  { -  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; - -  if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) -    { -      zlog_debug("Zebra: BFD Dest replay request"); -    } - -  /* Send the client registration */ -  bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); - -  /* Replay the neighbor, if BFD is enabled in BGP */ -  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; - -              if (nbr->state < NSM_TwoWay) -                continue; - -              if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) -                zlog_debug ("Replaying nbr (%s) to BFD", inet_ntoa (nbr->src)); - -              ospf_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_UPDATE); -            } -        } -    } -  return 0; +	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; + +	if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) { +		zlog_debug("Zebra: BFD Dest replay request"); +	} + +	/* Send the client registration */ +	bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); + +	/* Replay the neighbor, if BFD is enabled in BGP */ +	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; + +				if (nbr->state < NSM_TwoWay) +					continue; + +				if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) +					zlog_debug("Replaying nbr (%s) to BFD", +						   inet_ntoa(nbr->src)); + +				ospf_bfd_reg_dereg_nbr(nbr, +						       ZEBRA_BFD_DEST_UPDATE); +			} +		} +	} +	return 0;  }  /* @@ -201,163 +194,160 @@ ospf_bfd_nbr_replay (int command, struct zclient *zclient, zebra_size_t length,   *                                  connectivity if the BFD status changed to   *                                  down.   */ -static int -ospf_bfd_interface_dest_update (int command, struct zclient *zclient, -                                 zebra_size_t length, vrf_id_t vrf_id) +static int ospf_bfd_interface_dest_update(int command, struct zclient *zclient, +					  zebra_size_t length, vrf_id_t vrf_id)  { -  struct interface *ifp; -  struct ospf_interface *oi; -  struct ospf_if_params *params; -  struct ospf_neighbor *nbr; -  struct route_node *node; -  struct prefix p; -  int status; -  int old_status; -  struct bfd_info *bfd_info; -  struct timeval tv; - -  ifp = bfd_get_peer_info (zclient->ibuf, &p, NULL, &status, vrf_id); - -  if ((ifp == NULL) || (p.family != AF_INET)) -    return 0; - -  if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) -    { -      char buf[PREFIX2STR_BUFFER]; -      prefix2str(&p, buf, sizeof(buf)); -      zlog_debug("Zebra: interface %s bfd destination %s %s", ifp->name, buf, -                 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; - -      nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &p.u.prefix4); -      if (!nbr || !nbr->bfd_info) -        continue; - -      bfd_info = (struct bfd_info *)nbr->bfd_info; -      if (bfd_info->status == status) -        continue; - -      old_status = bfd_info->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:%s]: BFD Down", -                        IF_NAME (nbr->oi), inet_ntoa (nbr->address.u.prefix4)); - -          OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_InactivityTimer); -        } -    } - -  return 0; +	struct interface *ifp; +	struct ospf_interface *oi; +	struct ospf_if_params *params; +	struct ospf_neighbor *nbr; +	struct route_node *node; +	struct prefix p; +	int status; +	int old_status; +	struct bfd_info *bfd_info; +	struct timeval tv; + +	ifp = bfd_get_peer_info(zclient->ibuf, &p, NULL, &status, vrf_id); + +	if ((ifp == NULL) || (p.family != AF_INET)) +		return 0; + +	if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) { +		char buf[PREFIX2STR_BUFFER]; +		prefix2str(&p, buf, sizeof(buf)); +		zlog_debug("Zebra: interface %s bfd destination %s %s", +			   ifp->name, buf, 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; + +		nbr = ospf_nbr_lookup_by_addr(oi->nbrs, &p.u.prefix4); +		if (!nbr || !nbr->bfd_info) +			continue; + +		bfd_info = (struct bfd_info *)nbr->bfd_info; +		if (bfd_info->status == status) +			continue; + +		old_status = bfd_info->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:%s]: BFD Down", +					   IF_NAME(nbr->oi), +					   inet_ntoa(nbr->address.u.prefix4)); + +			OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_InactivityTimer); +		} +	} + +	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) +void ospf_bfd_info_nbr_create(struct ospf_interface *oi, +			      struct ospf_neighbor *nbr)  { -  struct bfd_info *oi_bfd_info; -  struct bfd_info *nbr_bfd_info; -  struct interface *ifp = oi->ifp; -  struct ospf_if_params *params; - -  /* Check if BFD is enabled */ -  params = IF_DEF_PARAMS (ifp); - -  /* Check if BFD is enabled */ -  if (!params->bfd_info) -    return; - -  oi_bfd_info = (struct bfd_info *)params->bfd_info; -  if (!nbr->bfd_info) -    nbr->bfd_info = bfd_info_create(); - -  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; +	struct bfd_info *oi_bfd_info; +	struct bfd_info *nbr_bfd_info; +	struct interface *ifp = oi->ifp; +	struct ospf_if_params *params; + +	/* Check if BFD is enabled */ +	params = IF_DEF_PARAMS(ifp); + +	/* Check if BFD is enabled */ +	if (!params->bfd_info) +		return; + +	oi_bfd_info = (struct bfd_info *)params->bfd_info; +	if (!nbr->bfd_info) +		nbr->bfd_info = bfd_info_create(); + +	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;  }  /*   * 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, struct ospf_if_params *params)  { -  struct bfd_info *bfd_info; +	struct bfd_info *bfd_info; -  if (!params->bfd_info) -    return; +	if (!params->bfd_info) +		return; -  bfd_info = (struct bfd_info *)params->bfd_info; +	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); -  else -    vty_out (vty, " ip ospf bfd\n"); +	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); +	else +		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, -                    u_char use_json, int param_only) +void ospf_bfd_show_info(struct vty *vty, void *bfd_info, json_object *json_obj, +			u_char 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); +	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, u_char use_json) +void ospf_bfd_interface_show(struct vty *vty, struct interface *ifp, +			     json_object *json_interface_sub, u_char use_json)  { -  struct ospf_if_params *params; +	struct ospf_if_params *params; -  params = IF_DEF_PARAMS (ifp); +	params = IF_DEF_PARAMS(ifp); -  ospf_bfd_show_info(vty, params->bfd_info, json_interface_sub, use_json, 1); +	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, u_int32_t min_rx, -                       u_int32_t min_tx, u_int8_t detect_mult, int defaults) +static void ospf_bfd_if_param_set(struct interface *ifp, u_int32_t min_rx, +				  u_int32_t min_tx, u_int8_t detect_mult, +				  int defaults)  { -  struct ospf_if_params *params; -  int command = 0; +	struct ospf_if_params *params; +	int command = 0; -  params = IF_DEF_PARAMS (ifp); +	params = IF_DEF_PARAMS(ifp); -  bfd_set_param((struct bfd_info **)&(params->bfd_info), min_rx, min_tx, -                  detect_mult, defaults, &command); -  if (command) -    ospf_bfd_reg_dereg_all_nbr(ifp, command); +	bfd_set_param((struct bfd_info **)&(params->bfd_info), min_rx, min_tx, +		      detect_mult, defaults, &command); +	if (command) +		ospf_bfd_reg_dereg_all_nbr(ifp, command);  }  DEFUN (ip_ospf_bfd, @@ -367,19 +357,19 @@ DEFUN (ip_ospf_bfd,         "OSPF interface commands\n"         "Enables BFD support\n")  { -  VTY_DECLVAR_CONTEXT(interface, ifp); -  struct ospf_if_params *params; -  struct bfd_info *bfd_info; +	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; +	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); +	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); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (ip_ospf_bfd_param, @@ -392,24 +382,26 @@ DEFUN (ip_ospf_bfd_param,         "Required min receive interval\n"         "Desired min transmit interval\n")  { -  VTY_DECLVAR_CONTEXT(interface, ifp); -  int idx_number = 3; -  int idx_number_2 = 4; -  int idx_number_3 = 5; -  u_int32_t rx_val; -  u_int32_t tx_val; -  u_int8_t dm_val; -  int ret; - -  assert (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; - -  ospf_bfd_if_param_set (ifp, rx_val, tx_val, dm_val, 0); - -  return CMD_SUCCESS; +	VTY_DECLVAR_CONTEXT(interface, ifp); +	int idx_number = 3; +	int idx_number_2 = 4; +	int idx_number_3 = 5; +	u_int32_t rx_val; +	u_int32_t tx_val; +	u_int8_t dm_val; +	int ret; + +	assert(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; + +	ospf_bfd_if_param_set(ifp, rx_val, tx_val, dm_val, 0); + +	return CMD_SUCCESS;  }  DEFUN (no_ip_ospf_bfd, @@ -423,32 +415,30 @@ DEFUN (no_ip_ospf_bfd,         "Required min receive interval\n"         "Desired min transmit interval\n")  { -  VTY_DECLVAR_CONTEXT(interface, ifp); -  struct ospf_if_params *params; +	VTY_DECLVAR_CONTEXT(interface, ifp); +	struct ospf_if_params *params; -  assert (ifp); +	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)); -    } +	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)); +	} -  return CMD_SUCCESS; +	return CMD_SUCCESS;  } -void -ospf_bfd_init(void) +void ospf_bfd_init(void)  { -  bfd_gbl_init(); +	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; +	/* Initialize BFD client functions */ +	zclient->interface_bfd_dest_update = ospf_bfd_interface_dest_update; +	zclient->bfd_dest_replay = ospf_bfd_nbr_replay; -  /* Install BFD command */ -  install_element (INTERFACE_NODE, &ip_ospf_bfd_cmd); -  install_element (INTERFACE_NODE, &ip_ospf_bfd_param_cmd); -  install_element (INTERFACE_NODE, &no_ip_ospf_bfd_cmd); +	/* Install BFD command */ +	install_element(INTERFACE_NODE, &ip_ospf_bfd_cmd); +	install_element(INTERFACE_NODE, &ip_ospf_bfd_param_cmd); +	install_element(INTERFACE_NODE, &no_ip_ospf_bfd_cmd);  }  | 
