diff options
author | Donald Sharp <sharpd@cumulusnetworks.com> | 2020-10-03 05:52:53 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-03 05:52:53 +0200 |
commit | 4b40d5ffb0c34d4e99dd121085b46d4f4a896b72 (patch) | |
tree | dc7a3949a66a00ecc6df1ff00307a78c9574848a /staticd | |
parent | Merge pull request #7225 from idryzhov/vtysh-fix-domainname (diff) | |
parent | staticd : Added the warning log for route when VRF is not ready. (diff) | |
download | frr-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.c | 11 | ||||
-rw-r--r-- | staticd/static_debug.h | 3 | ||||
-rw-r--r-- | staticd/static_nb_config.c | 12 | ||||
-rw-r--r-- | staticd/static_nht.h | 6 | ||||
-rw-r--r-- | staticd/static_routes.c | 54 | ||||
-rw-r--r-- | staticd/static_routes.h | 13 | ||||
-rw-r--r-- | staticd/static_vty.c | 16 | ||||
-rw-r--r-- | staticd/static_zebra.c | 9 |
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); |