summaryrefslogtreecommitdiffstats
path: root/staticd
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2020-10-03 05:52:53 +0200
committerGitHub <noreply@github.com>2020-10-03 05:52:53 +0200
commit4b40d5ffb0c34d4e99dd121085b46d4f4a896b72 (patch)
treedc7a3949a66a00ecc6df1ff00307a78c9574848a /staticd
parentMerge pull request #7225 from idryzhov/vtysh-fix-domainname (diff)
parentstaticd : Added the warning log for route when VRF is not ready. (diff)
downloadfrr-4b40d5ffb0c34d4e99dd121085b46d4f4a896b72.tar.xz
frr-4b40d5ffb0c34d4e99dd121085b46d4f4a896b72.zip
Merge pull request #6882 from vishaldhingra/static
staticd : Added the warning log for route when VRF is not ready.
Diffstat (limited to 'staticd')
-rw-r--r--staticd/static_debug.c11
-rw-r--r--staticd/static_debug.h3
-rw-r--r--staticd/static_nb_config.c12
-rw-r--r--staticd/static_nht.h6
-rw-r--r--staticd/static_routes.c54
-rw-r--r--staticd/static_routes.h13
-rw-r--r--staticd/static_vty.c16
-rw-r--r--staticd/static_zebra.c9
8 files changed, 103 insertions, 21 deletions
diff --git a/staticd/static_debug.c b/staticd/static_debug.c
index e43d4e79f..45f845b40 100644
--- a/staticd/static_debug.c
+++ b/staticd/static_debug.c
@@ -34,13 +34,16 @@
/* clang-format off */
struct debug static_dbg_events = {0, "Staticd events"};
+struct debug static_dbg_route = {0, "Staticd route"};
struct debug *static_debug_arr[] = {
- &static_dbg_events
+ &static_dbg_events,
+ &static_dbg_route
};
const char *static_debugs_conflines[] = {
- "debug static events"
+ "debug static events",
+ "debug static route"
};
/* clang-format on */
@@ -102,12 +105,14 @@ int static_debug_status_write(struct vty *vty)
* Debug general internal events
*
*/
-void static_debug_set(int vtynode, bool onoff, bool events)
+void static_debug_set(int vtynode, bool onoff, bool events, bool route)
{
uint32_t mode = DEBUG_NODE2MODE(vtynode);
if (events)
DEBUG_MODE_SET(&static_dbg_events, mode, onoff);
+ if (route)
+ DEBUG_MODE_SET(&static_dbg_route, mode, onoff);
}
/*
diff --git a/staticd/static_debug.h b/staticd/static_debug.h
index 481c266e1..3a96339f4 100644
--- a/staticd/static_debug.h
+++ b/staticd/static_debug.h
@@ -30,6 +30,7 @@
/* staticd debugging records */
extern struct debug static_dbg_events;
+extern struct debug static_dbg_route;
/*
* Initialize staticd debugging.
@@ -67,7 +68,7 @@ int static_debug_status_write(struct vty *vty);
* Debug general internal events
*
*/
-void static_debug_set(int vtynode, bool onoff, bool events);
+void static_debug_set(int vtynode, bool onoff, bool events, bool route);
#endif /* _STATIC_DEBUG_H */
diff --git a/staticd/static_nb_config.c b/staticd/static_nb_config.c
index e89832069..6e59f50a0 100644
--- a/staticd/static_nb_config.c
+++ b/staticd/static_nb_config.c
@@ -222,6 +222,13 @@ static int nexthop_mpls_label_stack_entry_create(struct nb_cb_create_args *args)
switch (args->event) {
case NB_EV_VALIDATE:
+ if (!mpls_enabled) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "%% MPLS not turned on in kernel ignoring static route");
+ return NB_ERR_VALIDATION;
+ }
+ break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
break;
@@ -481,6 +488,11 @@ int routing_control_plane_protocols_control_plane_protocol_staticd_route_list_cr
yang_dnode_get_string(args->dnode, "./prefix"));
return NB_ERR;
}
+ if (vrf->vrf_id == VRF_UNKNOWN)
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "Static Route to %s not installed currently because dependent config not fully available",
+ yang_dnode_get_string(args->dnode, "./prefix"));
nb_running_set_entry(args->dnode, rn);
break;
}
diff --git a/staticd/static_nht.h b/staticd/static_nht.h
index 18bb9e39c..9139c367d 100644
--- a/staticd/static_nht.h
+++ b/staticd/static_nht.h
@@ -47,4 +47,10 @@ extern void static_nht_reset_start(struct prefix *nhp, afi_t afi,
*/
extern void static_nht_mark_state(struct prefix *sp, vrf_id_t vrf_id,
enum static_install_states state);
+
+/*
+ * For the given nexthop, returns the string
+ */
+extern void static_get_nh_str(struct static_nexthop *nh, char *nexthop,
+ size_t size);
#endif
diff --git a/staticd/static_routes.c b/staticd/static_routes.c
index d9f2faaba..d6aab296c 100644
--- a/staticd/static_routes.c
+++ b/staticd/static_routes.c
@@ -27,10 +27,13 @@
#include <lib/vrf.h>
#include <lib/memory.h>
+#include "printfrr.h"
+
#include "static_vrf.h"
#include "static_routes.h"
#include "static_memory.h"
#include "static_zebra.h"
+#include "static_debug.h"
DEFINE_MTYPE_STATIC(STATIC, STATIC_ROUTE, "Static Route Info");
DEFINE_MTYPE(STATIC, STATIC_PATH, "Static Path");
@@ -256,8 +259,12 @@ static_add_nexthop(struct route_node *rn, struct static_path *pn, safi_t safi,
}
static_nexthop_list_add_after(&(pn->nexthop_list), cp, nh);
- if (nh_svrf->vrf->vrf_id == VRF_UNKNOWN)
+ if (nh_svrf->vrf->vrf_id == VRF_UNKNOWN) {
+ zlog_warn(
+ "Static Route to %pFX not installed currently because dependent config not fully available",
+ &rn->p);
return nh;
+ }
/* check whether interface exists in system & install if it does */
switch (nh->type) {
@@ -301,11 +308,25 @@ void static_install_nexthop(struct route_node *rn, struct static_path *pn,
nh_svrf = static_vty_get_unknown_vrf(nh_vrf);
- if (!nh_svrf)
+ if (!nh_svrf) {
+ char nexthop_str[NEXTHOP_STR];
+
+ static_get_nh_str(nh, nexthop_str, sizeof(nexthop_str));
+ DEBUGD(&static_dbg_route,
+ "Static Route %pFX not installed for %s vrf %s not ready",
+ &rn->p, nexthop_str, nh_vrf);
return;
+ }
- if (nh_svrf->vrf->vrf_id == VRF_UNKNOWN)
+ if (nh_svrf->vrf->vrf_id == VRF_UNKNOWN) {
+ char nexthop_str[NEXTHOP_STR];
+
+ static_get_nh_str(nh, nexthop_str, sizeof(nexthop_str));
+ DEBUGD(&static_dbg_route,
+ "Static Route %pFX not installed for %s vrf %s is unknown",
+ &rn->p, nexthop_str, nh_vrf);
return;
+ }
/* check whether interface exists in system & install if it does */
switch (nh->type) {
@@ -760,3 +781,30 @@ void static_route_info_init(struct static_route_info *si)
{
static_path_list_init(&(si->path_list));
}
+
+
+void static_get_nh_str(struct static_nexthop *nh, char *nexthop, size_t size)
+{
+ switch (nh->type) {
+ case STATIC_IFNAME:
+ snprintfrr(nexthop, size, "ifindex : %s", nh->ifname);
+ break;
+ case STATIC_IPV4_GATEWAY:
+ snprintfrr(nexthop, size, "ip4 : %pI4", &nh->addr.ipv4);
+ break;
+ case STATIC_IPV4_GATEWAY_IFNAME:
+ snprintfrr(nexthop, size, "ip4-ifindex : %pI4 : %s",
+ &nh->addr.ipv4, nh->ifname);
+ break;
+ case STATIC_BLACKHOLE:
+ snprintfrr(nexthop, size, "blackhole : %d", nh->bh_type);
+ break;
+ case STATIC_IPV6_GATEWAY:
+ snprintfrr(nexthop, size, "ip6 : %pI6", &nh->addr.ipv6);
+ break;
+ case STATIC_IPV6_GATEWAY_IFNAME:
+ snprintfrr(nexthop, size, "ip6-ifindex : %pI6 : %s",
+ &nh->addr.ipv6, nh->ifname);
+ break;
+ };
+}
diff --git a/staticd/static_routes.h b/staticd/static_routes.h
index e5c10d18a..bd2cd78fd 100644
--- a/staticd/static_routes.h
+++ b/staticd/static_routes.h
@@ -197,4 +197,17 @@ extern bool static_add_nexthop_validate(struct static_vrf *svrf,
struct ipaddr *ipaddr);
extern struct stable_info *static_get_stable_info(struct route_node *rn);
extern void static_route_info_init(struct static_route_info *si);
+
+/*
+ * Max string return via API static_get_nh_str in size_t
+ */
+
+#define NEXTHOP_STR (INET6_ADDRSTRLEN + INTERFACE_NAMSIZ + 25)
+/*
+ * For the given nexthop, returns the string
+ * nexthop : returns the formatted string in nexthop
+ * size : max size of formatted string
+ */
+extern void static_get_nh_str(struct static_nexthop *nh, char *nexthop,
+ size_t size);
#endif
diff --git a/staticd/static_vty.c b/staticd/static_vty.c
index 482167155..f5bc9df64 100644
--- a/staticd/static_vty.c
+++ b/staticd/static_vty.c
@@ -1111,19 +1111,17 @@ DEFPY_YANG(ipv6_route_vrf,
ifname, flag, tag_str, distance_str, label,
table_str, false, color_str);
}
-DEFPY_YANG(debug_staticd,
- debug_staticd_cmd,
- "[no] debug static [{events$events}]",
- NO_STR
- DEBUG_STR
- STATICD_STR
- "Debug events\n")
+DEFPY_YANG(debug_staticd, debug_staticd_cmd,
+ "[no] debug static [{events$events|route$route}]",
+ NO_STR DEBUG_STR STATICD_STR
+ "Debug events\n"
+ "Debug route\n")
{
/* If no specific category, change all */
if (strmatch(argv[argc - 1]->text, "static"))
- static_debug_set(vty->node, !no, true);
+ static_debug_set(vty->node, !no, true, true);
else
- static_debug_set(vty->node, !no, !!events);
+ static_debug_set(vty->node, !no, !!events, !!route);
return CMD_SUCCESS;
}
diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c
index 57903daae..efde3babd 100644
--- a/staticd/static_zebra.c
+++ b/staticd/static_zebra.c
@@ -42,8 +42,7 @@
#include "static_zebra.h"
#include "static_nht.h"
#include "static_vty.h"
-
-bool debug;
+#include "static_debug.h"
/* Zebra structure to hold current status. */
struct zclient *zclient;
@@ -313,9 +312,9 @@ void static_zebra_nht_register(struct route_node *rn, struct static_nexthop *nh,
static_nht_hash_alloc);
nhtd->refcount++;
- if (debug)
- zlog_debug("Registered nexthop(%pFX) for %pRN %d", &p,
- rn, nhtd->nh_num);
+ DEBUGD(&static_dbg_route,
+ "Registered nexthop(%pFX) for %pRN %d", &p, rn,
+ nhtd->nh_num);
if (nhtd->refcount > 1 && nhtd->nh_num) {
static_nht_update(&rn->p, nhtd->nh, nhtd->nh_num, afi,
nh->nh_vrf_id);