summaryrefslogtreecommitdiffstats
path: root/ospfd
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2020-10-15 01:19:39 +0200
committerGitHub <noreply@github.com>2020-10-15 01:19:39 +0200
commit2c6592c1405808e95dc43e298a9ec4446e9cbdd1 (patch)
treea463d7ee9ad743025636f354fa6b1efefb19e3dc /ospfd
parentMerge pull request #7308 from mjstapp/fix_ospf_gr_sa (diff)
parentospfd: make reason string production safer (diff)
downloadfrr-2c6592c1405808e95dc43e298a9ec4446e9cbdd1.tar.xz
frr-2c6592c1405808e95dc43e298a9ec4446e9cbdd1.zip
Merge pull request #7309 from mjstapp/fix_ospf_gr_reasons
ospfd: make GR reason string production safer
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_gr_helper.c50
-rw-r--r--ospfd/ospf_gr_helper.h6
-rw-r--r--ospfd/ospf_vty.c45
3 files changed, 66 insertions, 35 deletions
diff --git a/ospfd/ospf_gr_helper.c b/ospfd/ospf_gr_helper.c
index bf6a45bcd..616013fb9 100644
--- a/ospfd/ospf_gr_helper.c
+++ b/ospfd/ospf_gr_helper.c
@@ -50,26 +50,26 @@
#include "ospfd/ospf_ism.h"
#include "ospfd/ospf_gr_helper.h"
-const char *ospf_exit_reason_desc[] = {
+static const char * const ospf_exit_reason_desc[] = {
"Unknown reason",
"Helper inprogress",
"Topology Change",
- "Grace timer expairy",
+ "Grace timer expiry",
"Successful graceful restart",
};
-const char *ospf_restart_reason_desc[] = {
+static const char * const ospf_restart_reason_desc[] = {
"Unknown restart",
"Software restart",
"Software reload/upgrade",
"Switch to redundant control processor",
};
-const char *ospf_rejected_reason_desc[] = {
+static const char * const ospf_rejected_reason_desc[] = {
"Unknown reason",
"Helper support disabled",
"Neighbour is not in FULL state",
- "Supports only planned restart but received for unplanned",
+ "Supports only planned restart but received unplanned",
"Topo change due to change in lsa rxmt list",
"LSA age is more than Grace interval",
};
@@ -118,6 +118,39 @@ static void ospf_enable_rtr_hash_destroy(struct ospf *ospf)
}
/*
+ * GR exit reason strings
+ */
+const char *ospf_exit_reason2str(unsigned int reason)
+{
+ if (reason < array_size(ospf_exit_reason_desc))
+ return(ospf_exit_reason_desc[reason]);
+ else
+ return "Invalid reason";
+}
+
+/*
+ * GR restart reason strings
+ */
+const char *ospf_restart_reason2str(unsigned int reason)
+{
+ if (reason < array_size(ospf_restart_reason_desc))
+ return(ospf_restart_reason_desc[reason]);
+ else
+ return "Invalid reason";
+}
+
+/*
+ * GR rejected reason strings
+ */
+const char *ospf_rejected_reason2str(unsigned int reason)
+{
+ if (reason < array_size(ospf_rejected_reason_desc))
+ return(ospf_rejected_reason_desc[reason]);
+ else
+ return "Invalid reason";
+}
+
+/*
* Initialize GR helper config data structures.
*
* OSPF
@@ -346,7 +379,8 @@ int ospf_process_grace_lsa(struct ospf *ospf, struct ospf_lsa *lsa,
zlog_debug(
"%s, Grace LSA received from %s, grace interval:%u, restartreason :%s",
__PRETTY_FUNCTION__, inet_ntoa(restart_addr),
- grace_interval, ospf_restart_reason_desc[restart_reason]);
+ grace_interval,
+ ospf_restart_reason2str(restart_reason));
/* Incase of broadcast links, if RESTARTER is DR_OTHER,
* grace LSA might be received from DR, so need to get
@@ -638,7 +672,7 @@ void ospf_gr_helper_exit(struct ospf_neighbor *nbr,
if (IS_DEBUG_OSPF_GR_HELPER)
zlog_debug("%s, Exiting from HELPER support to %s, due to %s",
__PRETTY_FUNCTION__, inet_ntoa(nbr->src),
- ospf_exit_reason_desc[reason]);
+ ospf_exit_reason2str(reason));
/* Reset helper status*/
nbr->gr_helper_info.gr_helper_status = OSPF_GR_NOT_HELPER;
@@ -1018,7 +1052,7 @@ static void show_ospf_grace_lsa_info(struct vty *vty, struct ospf_lsa *lsa)
sum += TLV_SIZE(tlvh);
vty_out(vty, " Restart reason:%s\n",
- ospf_restart_reason_desc[grReason->reason]);
+ ospf_restart_reason2str(grReason->reason));
break;
case RESTARTER_IP_ADDR_TYPE:
if (TLV_SIZE(tlvh) <
diff --git a/ospfd/ospf_gr_helper.h b/ospfd/ospf_gr_helper.h
index 4e83028fe..c355bb4f3 100644
--- a/ospfd/ospf_gr_helper.h
+++ b/ospfd/ospf_gr_helper.h
@@ -152,9 +152,9 @@ struct advRtr {
#define OSPF_GR_FAILURE 0
#define OSPF_GR_INVALID -1
-extern const char *ospf_exit_reason_desc[];
-extern const char *ospf_restart_reason_desc[];
-extern const char *ospf_rejected_reason_desc[];
+const char *ospf_exit_reason2str(unsigned int reason);
+const char *ospf_restart_reason2str(unsigned int reason);
+const char *ospf_rejected_reason2str(unsigned int reason);
extern void ospf_gr_helper_init(struct ospf *ospf);
extern void ospf_gr_helper_stop(struct ospf *ospf);
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index 87c1c91af..5c82e1139 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -5132,9 +5132,8 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *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]);
+ ospf_restart_reason2str(
+ nbr->gr_helper_info.gr_restart_reason));
} else {
vty_out(vty,
" Graceful Restart HELPER Status : None\n");
@@ -5143,15 +5142,14 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
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]);
+ ospf_rejected_reason2str(
+ 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]);
+ ospf_exit_reason2str(
+ nbr->gr_helper_info.helper_exit_reason));
else
vty_out(vty, "\n");
} else {
@@ -5165,25 +5163,24 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
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]);
+ ospf_restart_reason2str(
+ 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]);
+ ospf_rejected_reason2str(
+ 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_exit_reason2str(
+ nbr->gr_helper_info
+ .helper_exit_reason));
}
ospf_bfd_show_info(vty, nbr->bfd_info, json_neigh, use_json, 0);
@@ -9308,7 +9305,7 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
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]);
+ ospf_exit_reason2str(ospf->last_exit_reason));
}
if (ospf->active_restarter_cnt)
@@ -9337,7 +9334,7 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
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]);
+ ospf_exit_reason2str(ospf->last_exit_reason));
if (ospf->active_restarter_cnt)
json_object_int_add(json_vrf, "activeRestarterCnt",
@@ -9402,9 +9399,9 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
.t_grace_timer));
vty_out(vty,
" Graceful Restart reason: %s.\n\n",
- ospf_restart_reason_desc
- [nbr->gr_helper_info
- .gr_restart_reason]);
+ ospf_restart_reason2str(
+ nbr->gr_helper_info
+ .gr_restart_reason));
cnt++;
} else {
json_neigh = json_object_new_object();
@@ -9432,9 +9429,9 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
.t_grace_timer));
json_object_string_add(
json_neigh, "restartReason",
- ospf_restart_reason_desc
- [nbr->gr_helper_info
- .gr_restart_reason]);
+ ospf_restart_reason2str(
+ nbr->gr_helper_info
+ .gr_restart_reason));
json_object_object_add(
json_neighbors,
inet_ntoa(nbr->src),