summaryrefslogtreecommitdiff
path: root/ospfd/ospf_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_vty.c')
-rw-r--r--ospfd/ospf_vty.c623
1 files changed, 618 insertions, 5 deletions
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index 8099b0160c..87c1c91afb 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -5121,6 +5121,71 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
" Thread Link State Update Retransmission %s\n\n",
nbr->t_ls_upd != NULL ? "on" : "off");
+ if (!use_json) {
+ vty_out(vty, " Graceful restart Helper info:\n");
+
+ if (OSPF_GR_IS_ACTIVE_HELPER(nbr)) {
+ vty_out(vty,
+ " Graceful Restart HELPER Status : Inprogress.\n");
+
+ vty_out(vty,
+ " Graceful Restart grace period time: %d (seconds).\n",
+ nbr->gr_helper_info.recvd_grace_period);
+ vty_out(vty, " Graceful Restart reason: %s.\n",
+ ospf_restart_reason_desc
+ [nbr->gr_helper_info
+ .gr_restart_reason]);
+ } else {
+ vty_out(vty,
+ " Graceful Restart HELPER Status : None\n");
+ }
+
+ if (nbr->gr_helper_info.rejected_reason
+ != OSPF_HELPER_REJECTED_NONE)
+ vty_out(vty, " Helper rejected reason: %s.\n",
+ ospf_rejected_reason_desc
+ [nbr->gr_helper_info.rejected_reason]);
+
+ if (nbr->gr_helper_info.helper_exit_reason
+ != OSPF_GR_HELPER_EXIT_NONE)
+ vty_out(vty, " Last helper exit reason: %s.\n\n",
+ ospf_exit_reason_desc
+ [nbr->gr_helper_info
+ .helper_exit_reason]);
+ else
+ vty_out(vty, "\n");
+ } else {
+ json_object_string_add(json_neigh, "grHelperStatus",
+ OSPF_GR_IS_ACTIVE_HELPER(nbr) ?
+ "Inprogress"
+ : "None");
+ if (OSPF_GR_IS_ACTIVE_HELPER(nbr)) {
+ json_object_int_add(
+ json_neigh, "graceInterval",
+ nbr->gr_helper_info.recvd_grace_period);
+ json_object_string_add(
+ json_neigh, "grRestartReason",
+ ospf_restart_reason_desc
+ [nbr->gr_helper_info
+ .gr_restart_reason]);
+ }
+
+ if (nbr->gr_helper_info.rejected_reason
+ != OSPF_HELPER_REJECTED_NONE)
+ json_object_string_add(
+ json_neigh, "helperRejectReason",
+ ospf_rejected_reason_desc
+ [nbr->gr_helper_info.rejected_reason]);
+
+ if (nbr->gr_helper_info.helper_exit_reason
+ != OSPF_GR_HELPER_EXIT_NONE)
+ json_object_string_add(
+ json_neigh, "helperExitReason",
+ ospf_exit_reason_desc
+ [nbr->gr_helper_info
+ .helper_exit_reason]);
+ }
+
ospf_bfd_show_info(vty, nbr->bfd_info, json_neigh, use_json, 0);
if (use_json)
@@ -8070,12 +8135,25 @@ DEFUN (ip_ospf_area,
ospf = ospf_lookup_instance(instance);
if (instance && ospf == NULL) {
+ /*
+ * At this point we know we have received
+ * an instance and there is no ospf instance
+ * associated with it. This means we are
+ * in a situation where we have an
+ * ospf command that is setup for a different
+ * process(instance). We need to safely
+ * remove the command from ourselves and
+ * allow the other instance(process) handle
+ * the configuration command.
+ */
params = IF_DEF_PARAMS(ifp);
if (OSPF_IF_PARAM_CONFIGURED(params, if_area)) {
UNSET_IF_PARAM(params, if_area);
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
- ospf_interface_area_unset(ospf, ifp);
- ospf->if_ospf_cli_count--;
+ if (ospf) {
+ ospf_interface_area_unset(ospf, ifp);
+ ospf->if_ospf_cli_count--;
+ }
}
return CMD_NOT_MY_INSTANCE;
}
@@ -8167,7 +8245,7 @@ DEFUN (no_ip_ospf_area,
else
ospf = ospf_lookup_instance(instance);
- if (ospf == NULL)
+ if (instance && ospf == NULL)
return CMD_NOT_MY_INSTANCE;
argv_find(argv, argc, "area", &idx);
@@ -8197,8 +8275,11 @@ DEFUN (no_ip_ospf_area,
ospf_if_update_params((ifp), (addr));
}
- ospf_interface_area_unset(ospf, ifp);
- ospf->if_ospf_cli_count--;
+ if (ospf) {
+ ospf_interface_area_unset(ospf, ifp);
+ ospf->if_ospf_cli_count--;
+ }
+
return CMD_SUCCESS;
}
@@ -8988,6 +9069,487 @@ DEFUN (no_ospf_proactive_arp,
return CMD_SUCCESS;
}
+/* Graceful Restart HELPER Commands */
+DEFPY(ospf_gr_helper_enable, ospf_gr_helper_enable_cmd,
+ "graceful-restart helper-only [A.B.C.D]",
+ "OSPF Graceful Restart\n"
+ "Enable Helper support\n"
+ "Advertising router id\n")
+{
+ VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
+ struct in_addr addr;
+ int ret;
+
+ if (argc == 3) {
+ ret = inet_aton(argv[2]->arg, &addr);
+ if (!ret) {
+ vty_out(vty,
+ "Please specify the valid routerid address.\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
+ ospf_gr_helper_support_set_per_routerid(ospf, &addr, OSPF_GR_TRUE);
+ return CMD_SUCCESS;
+ }
+
+ ospf_gr_helper_support_set(ospf, OSPF_GR_TRUE);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY(no_ospf_gr_helper_enable,
+ no_ospf_gr_helper_enable_cmd,
+ "no graceful-restart helper-only [A.B.C.D]",
+ NO_STR
+ "OSPF Graceful Restart\n"
+ "Disable Helper support\n"
+ "Advertising router id\n")
+{
+ VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
+ struct in_addr addr;
+ int ret;
+
+ if (argc == 4) {
+ ret = inet_aton(argv[3]->arg, &addr);
+ if (!ret) {
+ vty_out(vty,
+ "Please specify the valid routerid address.\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
+ ospf_gr_helper_support_set_per_routerid(ospf, &addr,
+ OSPF_GR_FALSE);
+ return CMD_SUCCESS;
+ }
+
+ ospf_gr_helper_support_set(ospf, OSPF_GR_FALSE);
+ return CMD_SUCCESS;
+}
+
+DEFPY(ospf_gr_helper_enable_lsacheck,
+ ospf_gr_helper_enable_lsacheck_cmd,
+ "graceful-restart helper strict-lsa-checking",
+ "OSPF Graceful Restart\n"
+ "OSPF GR Helper\n"
+ "Enable strict LSA check\n")
+{
+ VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
+
+ ospf_gr_helper_lsa_check_set(ospf, OSPF_GR_TRUE);
+ return CMD_SUCCESS;
+}
+
+DEFPY(no_ospf_gr_helper_enable_lsacheck,
+ no_ospf_gr_helper_enable_lsacheck_cmd,
+ "no graceful-restart helper strict-lsa-checking",
+ NO_STR
+ "OSPF Graceful Restart\n"
+ "OSPF GR Helper\n"
+ "Disable strict LSA check\n")
+{
+ VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
+
+ ospf_gr_helper_lsa_check_set(ospf, OSPF_GR_FALSE);
+ return CMD_SUCCESS;
+}
+
+DEFPY(ospf_gr_helper_supported_grace_time,
+ ospf_gr_helper_supported_grace_time_cmd,
+ "graceful-restart helper supported-grace-time (10-1800)$interval",
+ "OSPF Graceful Restart\n"
+ "OSPF GR Helper\n"
+ "Supported grace timer\n"
+ "Grace interval(in seconds)\n")
+{
+ VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
+
+ ospf_gr_helper_supported_gracetime_set(ospf, interval);
+ return CMD_SUCCESS;
+}
+
+DEFPY(no_ospf_gr_helper_supported_grace_time,
+ no_ospf_gr_helper_supported_grace_time_cmd,
+ "no graceful-restart helper supported-grace-time (10-1800)$interval",
+ NO_STR
+ "OSPF Graceful Restart\n"
+ "OSPF GR Helper\n"
+ "Supported grace timer\n"
+ "Grace interval(in seconds)\n")
+{
+ VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
+
+ ospf_gr_helper_supported_gracetime_set(ospf, OSPF_MAX_GRACE_INTERVAL);
+ return CMD_SUCCESS;
+}
+
+DEFPY(ospf_gr_helper_planned_only,
+ ospf_gr_helper_planned_only_cmd,
+ "graceful-restart helper planned-only",
+ "OSPF Graceful Restart\n"
+ "OSPF GR Helper\n"
+ "Supported only planned restart\n")
+{
+ VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
+
+ ospf_gr_helper_set_supported_planned_only_restart(ospf, OSPF_GR_TRUE);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY(no_ospf_gr_helper_planned_only,
+ no_ospf_gr_helper_planned_only_cmd,
+ "no graceful-restart helper planned-only",
+ NO_STR
+ "OSPF Graceful Restart\n"
+ "OSPF GR Helper\n"
+ "Supported only for planned restart\n")
+{
+ VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
+
+ ospf_gr_helper_set_supported_planned_only_restart(ospf, OSPF_GR_FALSE);
+
+ return CMD_SUCCESS;
+}
+
+static int ospf_print_vty_helper_dis_rtr_walkcb(struct hash_bucket *backet,
+ void *arg)
+{
+ struct advRtr *rtr = backet->data;
+ struct vty *vty = (struct vty *)arg;
+ static unsigned int count;
+
+ vty_out(vty, "%-6s,", inet_ntoa(rtr->advRtrAddr));
+ count++;
+
+ if (count % 5 == 0)
+ vty_out(vty, "\n");
+
+ return HASHWALK_CONTINUE;
+}
+
+static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
+ uint8_t use_vrf, json_object *json,
+ bool uj, bool detail)
+{
+ struct listnode *node;
+ struct ospf_interface *oi;
+ json_object *json_vrf = NULL;
+
+ if (uj) {
+ if (use_vrf)
+ json_vrf = json_object_new_object();
+ else
+ json_vrf = json;
+ }
+
+ if (ospf->instance) {
+ if (uj)
+ json_object_int_add(json, "ospfInstance",
+ ospf->instance);
+ else
+ vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
+ }
+
+ ospf_show_vrf_name(ospf, vty, json_vrf, use_vrf);
+
+ if (uj) {
+ if (use_vrf) {
+ if (ospf->vrf_id == VRF_DEFAULT)
+ json_object_object_add(json, "default",
+ json_vrf);
+ else
+ json_object_object_add(json, ospf->name,
+ json_vrf);
+ }
+ } else
+ vty_out(vty, "\n");
+
+ /* Show Router ID. */
+ if (uj) {
+ json_object_string_add(json_vrf, "routerId",
+ inet_ntoa(ospf->router_id));
+ } else {
+ vty_out(vty, "\n OSPF Router with ID (%s)\n\n",
+ inet_ntoa(ospf->router_id));
+ }
+
+ if (!uj) {
+
+ if (ospf->is_helper_supported)
+ vty_out(vty,
+ " Graceful restart helper support enabled.\n");
+ else
+ vty_out(vty,
+ " Graceful restart helper support disabled.\n");
+
+ if (ospf->strict_lsa_check)
+ vty_out(vty, " Strict LSA check is enabled.\n");
+ else
+ vty_out(vty, " Strict LSA check is disabled.\n");
+
+ if (ospf->only_planned_restart)
+ vty_out(vty,
+ " Helper supported for planned restarts only.\n");
+ else
+ vty_out(vty,
+ " Helper supported for Planned and Unplanned Restarts.\n");
+
+ vty_out(vty,
+ " Supported Graceful restart interval: %d(in seconds).\n",
+ ospf->supported_grace_time);
+
+ if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf)) {
+ vty_out(vty, " Enable Router list:\n");
+ vty_out(vty, " ");
+ hash_walk(ospf->enable_rtr_list,
+ ospf_print_vty_helper_dis_rtr_walkcb, vty);
+ vty_out(vty, "\n\n");
+ }
+
+ if (ospf->last_exit_reason != OSPF_GR_HELPER_EXIT_NONE) {
+ vty_out(vty, " Last Helper exit Reason :%s\n",
+ ospf_exit_reason_desc[ospf->last_exit_reason]);
+ }
+
+ if (ospf->active_restarter_cnt)
+ vty_out(vty,
+ " Number of Active neighbours in graceful restart: %d\n",
+ ospf->active_restarter_cnt);
+ else
+ vty_out(vty, "\n");
+
+ } else {
+ json_object_string_add(
+ json_vrf, "helperSupport",
+ (ospf->is_helper_supported) ? "Enabled" : "Disabled");
+ json_object_string_add(json_vrf, "strictLsaCheck",
+ (ospf->strict_lsa_check) ? "Enabled"
+ : "Disabled");
+ json_object_string_add(
+ json_vrf, "restartSupoort",
+ (ospf->only_planned_restart)
+ ? "Planned Restart only"
+ : "Planned and Unplanned Restarts");
+
+ json_object_int_add(json_vrf, "supportedGracePeriod",
+ ospf->supported_grace_time);
+
+ if (ospf->last_exit_reason != OSPF_GR_HELPER_EXIT_NONE)
+ json_object_string_add(
+ json_vrf, "LastExitReason",
+ ospf_exit_reason_desc[ospf->last_exit_reason]);
+
+ if (ospf->active_restarter_cnt)
+ json_object_int_add(json_vrf, "activeRestarterCnt",
+ ospf->active_restarter_cnt);
+ }
+
+
+ if (detail) {
+ int cnt = 1;
+ json_object *json_neighbors = NULL;
+
+ for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
+ struct route_node *rn;
+ struct ospf_neighbor *nbr;
+ json_object *json_neigh;
+
+ if (ospf_interface_neighbor_count(oi) == 0)
+ continue;
+
+ if (uj) {
+ json_object_object_get_ex(json_vrf, "Neighbors",
+ &json_neighbors);
+ if (!json_neighbors) {
+ json_neighbors =
+ json_object_new_object();
+ json_object_object_add(json_vrf,
+ "Neighbors",
+ json_neighbors);
+ }
+ }
+
+ for (rn = route_top(oi->nbrs); rn;
+ rn = route_next(rn)) {
+
+ if (!rn->info)
+ continue;
+
+ nbr = rn->info;
+
+ if (!OSPF_GR_IS_ACTIVE_HELPER(nbr))
+ continue;
+
+ if (!uj) {
+ vty_out(vty, " Neighbour %d :\n", cnt);
+ vty_out(vty, " Address : %s\n",
+ inet_ntoa(nbr->address.u
+ .prefix4));
+ vty_out(vty, " Routerid : %s\n",
+ inet_ntoa(nbr->router_id));
+ vty_out(vty,
+ " Received Grace period : %d(in seconds).\n",
+ nbr->gr_helper_info
+ .recvd_grace_period);
+ vty_out(vty,
+ " Actual Grace period : %d(in seconds)\n",
+ nbr->gr_helper_info
+ .actual_grace_period);
+ vty_out(vty,
+ " Remaining GraceTime:%ld(in seconds).\n",
+ thread_timer_remain_second(
+ nbr->gr_helper_info
+ .t_grace_timer));
+ vty_out(vty,
+ " Graceful Restart reason: %s.\n\n",
+ ospf_restart_reason_desc
+ [nbr->gr_helper_info
+ .gr_restart_reason]);
+ cnt++;
+ } else {
+ json_neigh = json_object_new_object();
+ json_object_string_add(
+ json_neigh, "srcAddr",
+ inet_ntoa(nbr->src));
+
+ json_object_string_add(
+ json_neigh, "routerid",
+ inet_ntoa(nbr->router_id));
+ json_object_int_add(
+ json_neigh,
+ "recvdGraceInterval",
+ nbr->gr_helper_info
+ .recvd_grace_period);
+ json_object_int_add(
+ json_neigh,
+ "actualGraceInterval",
+ nbr->gr_helper_info
+ .actual_grace_period);
+ json_object_int_add(
+ json_neigh, "remainGracetime",
+ thread_timer_remain_second(
+ nbr->gr_helper_info
+ .t_grace_timer));
+ json_object_string_add(
+ json_neigh, "restartReason",
+ ospf_restart_reason_desc
+ [nbr->gr_helper_info
+ .gr_restart_reason]);
+ json_object_object_add(
+ json_neighbors,
+ inet_ntoa(nbr->src),
+ json_neigh);
+ }
+ }
+ }
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFPY (show_ip_ospf_gr_helper,
+ show_ip_ospf_gr_helper_cmd,
+ "show ip ospf [vrf <NAME|all>] graceful-restart helper [detail] [json]",
+ SHOW_STR
+ IP_STR
+ "OSPF information\n"
+ VRF_CMD_HELP_STR
+ "All VRFs\n"
+ "OSPF Graceful Restart\n"
+ "Helper details in the router\n"
+ "Detailed informtion\n"
+ JSON_STR)
+{
+ char *vrf_name = NULL;
+ bool all_vrf = false;
+ int ret = CMD_SUCCESS;
+ int idx_vrf = 0;
+ int idx = 0;
+ uint8_t use_vrf = 0;
+ bool uj = use_json(argc, argv);
+ struct ospf *ospf = NULL;
+ json_object *json = NULL;
+ struct listnode *node = NULL;
+ int inst = 0;
+ bool detail = false;
+
+ OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
+
+ if (argv_find(argv, argc, "detail", &idx))
+ detail = true;
+
+ if (uj)
+ json = json_object_new_object();
+
+ /* vrf input is provided */
+ if (vrf_name) {
+ use_vrf = 1;
+
+ if (all_vrf) {
+ for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
+ if (!ospf->oi_running)
+ continue;
+
+ ret = ospf_show_gr_helper_details(
+ vty, ospf, use_vrf, json, uj, detail);
+ }
+
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
+ json_object_free(json);
+ }
+
+ return ret;
+ }
+
+ ospf = ospf_lookup_by_inst_name(inst, vrf_name);
+
+ if (ospf == NULL || !ospf->oi_running) {
+
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
+ json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
+ return CMD_SUCCESS;
+ }
+
+ } else {
+ /* Default Vrf */
+ ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
+
+ if (ospf == NULL || !ospf->oi_running) {
+
+ if (uj) {
+ vty_out(vty, "%s\n",
+ json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
+ json_object_free(json);
+ } else
+ vty_out(vty, "%% OSPF instance not found\n");
+
+ return CMD_SUCCESS;
+ }
+
+ ospf_show_gr_helper_details(vty, ospf, use_vrf, json, uj,
+ detail);
+ }
+
+ if (uj) {
+ vty_out(vty, "%s\n", json_object_to_json_string_ext(
+ json, JSON_C_TO_STRING_PRETTY));
+ json_object_free(json);
+ }
+
+ return CMD_SUCCESS;
+}
+/* Graceful Restart HELPER commands end */
+
static void config_write_stub_router(struct vty *vty, struct ospf *ospf)
{
struct listnode *ln;
@@ -10310,6 +10872,41 @@ static int config_write_ospf_redistribute(struct vty *vty, struct ospf *ospf)
return 0;
}
+static int ospf_cfg_write_helper_dis_rtr_walkcb(struct hash_bucket *backet,
+ void *arg)
+{
+ struct advRtr *rtr = backet->data;
+ struct vty *vty = (struct vty *)arg;
+
+ vty_out(vty, " graceful-restart helper-only %s\n",
+ inet_ntoa(rtr->advRtrAddr));
+ return HASHWALK_CONTINUE;
+}
+
+static int config_write_ospf_gr_helper(struct vty *vty, struct ospf *ospf)
+{
+ if (ospf->is_helper_supported)
+ vty_out(vty, " graceful-restart helper-only\n");
+
+ if (!ospf->strict_lsa_check)
+ vty_out(vty, " no graceful-restart helper strict-lsa-checking\n");
+
+ if (ospf->only_planned_restart)
+ vty_out(vty, " graceful-restart helper planned-only\n");
+
+ if (ospf->supported_grace_time != OSPF_MAX_GRACE_INTERVAL)
+ vty_out(vty,
+ " graceful-restart helper supported-grace-time %d\n",
+ ospf->supported_grace_time);
+
+ if (OSPF_HELPER_ENABLE_RTR_COUNT(ospf)) {
+ hash_walk(ospf->enable_rtr_list,
+ ospf_cfg_write_helper_dis_rtr_walkcb, vty);
+ }
+
+ return 0;
+}
+
static int config_write_ospf_default_metric(struct vty *vty, struct ospf *ospf)
{
if (ospf->default_metric != -1)
@@ -10477,6 +11074,9 @@ static int ospf_config_write_one(struct vty *vty, struct ospf *ospf)
/* Redistribute information print. */
config_write_ospf_redistribute(vty, ospf);
+ /* Print gr helper configs */
+ config_write_ospf_gr_helper(vty, ospf);
+
/* passive-interface print. */
if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
vty_out(vty, " passive-interface default\n");
@@ -10620,6 +11220,9 @@ void ospf_vty_show_init(void)
/* "show ip ospf vrfs" commands. */
install_element(VIEW_NODE, &show_ip_ospf_vrfs_cmd);
+
+ /* "show ip ospf gr-helper details" command */
+ install_element(VIEW_NODE, &show_ip_ospf_gr_helper_cmd);
}
@@ -10735,6 +11338,16 @@ static void ospf_vty_zebra_init(void)
install_element(OSPF_NODE, &no_ospf_distance_cmd);
install_element(OSPF_NODE, &no_ospf_distance_ospf_cmd);
install_element(OSPF_NODE, &ospf_distance_ospf_cmd);
+
+ /*Ospf garcefull restart helper configurations */
+ install_element(OSPF_NODE, &ospf_gr_helper_enable_cmd);
+ install_element(OSPF_NODE, &no_ospf_gr_helper_enable_cmd);
+ install_element(OSPF_NODE, &ospf_gr_helper_enable_lsacheck_cmd);
+ install_element(OSPF_NODE, &no_ospf_gr_helper_enable_lsacheck_cmd);
+ install_element(OSPF_NODE, &ospf_gr_helper_supported_grace_time_cmd);
+ install_element(OSPF_NODE, &no_ospf_gr_helper_supported_grace_time_cmd);
+ install_element(OSPF_NODE, &ospf_gr_helper_planned_only_cmd);
+ install_element(OSPF_NODE, &no_ospf_gr_helper_planned_only_cmd);
#if 0
install_element (OSPF_NODE, &ospf_distance_source_cmd);
install_element (OSPF_NODE, &no_ospf_distance_source_cmd);