]> git.proxmox.com Git - mirror_frr.git/commitdiff
staticd : Added the warning log for route when VRF is not ready.
authorvdhingra <vdhingra@vmware.com>
Mon, 10 Aug 2020 07:00:09 +0000 (00:00 -0700)
committervdhingra <vdhingra@vmware.com>
Tue, 1 Sep 2020 04:12:21 +0000 (21:12 -0700)
During the yangification of staticd, refactoring of code
around static_hold_route data struct has been done, In this
context warning log message when VRF is not ready had been
removed. This should not be removed, adding it back.

I have missed one MPLS validation too, adding it back.

Signed-off-by: vishaldhingra <vdhingra@vmware.com>
staticd/static_debug.c
staticd/static_debug.h
staticd/static_nb_config.c
staticd/static_nht.h
staticd/static_routes.c
staticd/static_routes.h
staticd/static_vty.c
staticd/static_zebra.c

index e43d4e79ff0eb4e7b6fea07f82ae8687c697d1a9..45f845b40b2022305743291ae6dbcae46b04ed61 100644 (file)
 
 /* 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);
 }
 
 /*
index 481c266e14767d671227f235e78981f1845ed455..3a96339f47d8e977d62b47a1a4356c9460493bfe 100644 (file)
@@ -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 */
index e89832069c6489526e1225313fb995e4967f48fc..6e59f50a0020c8feb2d26eff94ffb66ff14d33b5 100644 (file)
@@ -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;
        }
index 18bb9e39cacddc50e7947ea7dc33ac1d32f4cd2d..9139c367d18d17225edc0e23549b0e7b9c6b6d72 100644 (file)
@@ -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
index d9f2faabaf7225e1e4ae839630491b5958ec0adc..d6aab296c950f52346a25dbbbbd75b87b22f1ac7 100644 (file)
 #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;
+       };
+}
index e5c10d18a418d7bc6df3c33b910fcfbe85501965..bd2cd78fd9338894cc1a5047d0e7286cfdb12015 100644 (file)
@@ -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
index 476340693442f669ad7251e00f13c12c25191ec4..91a8379da04b8a507ae7f6b38b141c1a3af480a9 100644 (file)
@@ -1124,19 +1124,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;
 }
index 1bdbb69d00ad2a987c7b10f383d60cf07a7c2d90..ca29b7647776ecd30f36bbbddd32026dbda10151 100644 (file)
@@ -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);