]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: Add interface sysctl ignore on linkdown status
authorDonald Sharp <sharpd@nvidia.com>
Thu, 23 Jun 2022 15:00:08 +0000 (11:00 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Thu, 23 Jun 2022 15:23:37 +0000 (11:23 -0400)
Add the ability to decode the ignore on linkdown nexthop
status for an interface.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
zebra/interface.c
zebra/interface.h
zebra/netconf_netlink.c
zebra/zebra_dplane.c
zebra/zebra_dplane.h

index 93ffeb437c1ada80278940c781df6ebc6bc9920e..5f36b88a1cdd8d99c19bf3e0d6dcc3a7ccf238cd 100644 (file)
@@ -1407,7 +1407,7 @@ static void zebra_if_netconf_update_ctx(struct zebra_dplane_ctx *ctx,
                                        struct interface *ifp)
 {
        struct zebra_if *zif;
-       enum dplane_netconf_status_e mpls;
+       enum dplane_netconf_status_e mpls, linkdown;
 
        zif = ifp->info;
        if (!zif) {
@@ -1424,10 +1424,17 @@ static void zebra_if_netconf_update_ctx(struct zebra_dplane_ctx *ctx,
        else if (mpls == DPLANE_NETCONF_STATUS_DISABLED)
                zif->mpls = false;
 
+       linkdown = dplane_ctx_get_netconf_linkdown(ctx);
+       if (linkdown == DPLANE_NETCONF_STATUS_ENABLED)
+               zif->linkdown = true;
+       else if (linkdown == DPLANE_NETCONF_STATUS_DISABLED)
+               zif->linkdown = false;
+
        if (IS_ZEBRA_DEBUG_KERNEL)
-               zlog_debug("%s: if %s, ifindex %d, mpls %s",
+               zlog_debug("%s: if %s, ifindex %d, mpls %s linkdown %s",
                           __func__, ifp->name, ifp->ifindex,
-                          (zif->mpls ? "ON" : "OFF"));
+                          (zif->mpls ? "ON" : "OFF"),
+                          (zif->linkdown ? "ON" : "OFF"));
 }
 
 void zebra_if_dplane_result(struct zebra_dplane_ctx *ctx)
@@ -1890,6 +1897,9 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp)
        if (zebra_if->mpls)
                vty_out(vty, "  MPLS enabled\n");
 
+       if (zebra_if->linkdown)
+               vty_out(vty, "  Ignore all routes with linkdown\n");
+
        /* Hardware address. */
        vty_out(vty, "  Type: %s\n", if_link_type_str(ifp->ll_type));
        if (ifp->hw_addr_len != 0) {
@@ -2211,6 +2221,7 @@ static void if_dump_vty_json(struct vty *vty, struct interface *ifp,
                                       zebra_if->desc);
 
        json_object_boolean_add(json_if, "mplsEnabled", zebra_if->mpls);
+       json_object_boolean_add(json_if, "linkDown", zebra_if->linkdown);
 
        if (ifp->ifindex == IFINDEX_INTERNAL) {
                json_object_boolean_add(json_if, "pseudoInterface", true);
index 5569711aa7837d06ac54179261a6ec0d9333e36a..54ad91a0b21ce9dfbc95347b44b3adae04cdf25e 100644 (file)
@@ -129,6 +129,9 @@ struct zebra_if {
        /* MPLS status. */
        bool mpls;
 
+       /* Linkdown status */
+       bool linkdown;
+
        /* Router advertise configuration. */
        uint8_t rtadv_enable;
 
index 03ddfdc5251864c5129b6f6725d8137ac74b3e58..cc6a1201a5a4e4b4b9b921f9a24ba7d266d466f2 100644 (file)
@@ -45,9 +45,11 @@ static struct rtattr *netconf_rta(struct netconfmsg *ncm)
  * Handle netconf update about a single interface: create dplane
  * context, and enqueue for processing in the main zebra pthread.
  */
-static int netlink_netconf_dplane_update(ns_id_t ns_id, ifindex_t ifindex,
-                                        enum dplane_netconf_status_e mpls_on,
-                                        enum dplane_netconf_status_e mcast_on)
+static int
+netlink_netconf_dplane_update(ns_id_t ns_id, ifindex_t ifindex,
+                             enum dplane_netconf_status_e mpls_on,
+                             enum dplane_netconf_status_e mcast_on,
+                             enum dplane_netconf_status_e linkdown_on)
 {
        struct zebra_dplane_ctx *ctx;
 
@@ -58,6 +60,7 @@ static int netlink_netconf_dplane_update(ns_id_t ns_id, ifindex_t ifindex,
 
        dplane_ctx_set_netconf_mpls(ctx, mpls_on);
        dplane_ctx_set_netconf_mcast(ctx, mcast_on);
+       dplane_ctx_set_netconf_linkdown(ctx, linkdown_on);
 
        /* Enqueue ctx for main pthread to process */
        dplane_provider_enqueue_to_zebra(ctx);
@@ -77,6 +80,8 @@ int netlink_netconf_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
        uint32_t ival;
        enum dplane_netconf_status_e mpls_on = DPLANE_NETCONF_STATUS_UNKNOWN;
        enum dplane_netconf_status_e mcast_on = DPLANE_NETCONF_STATUS_UNKNOWN;
+       enum dplane_netconf_status_e linkdown_on =
+               DPLANE_NETCONF_STATUS_UNKNOWN;
 
        if (h->nlmsg_type != RTM_NEWNETCONF && h->nlmsg_type != RTM_DELNETCONF)
                return 0;
@@ -133,12 +138,23 @@ int netlink_netconf_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
                        mcast_on = DPLANE_NETCONF_STATUS_DISABLED;
        }
 
+       if (tb[NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN]) {
+               ival = *(uint32_t *)RTA_DATA(
+                       tb[NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN]);
+               if (ival != 0)
+                       linkdown_on = DPLANE_NETCONF_STATUS_ENABLED;
+               else
+                       linkdown_on = DPLANE_NETCONF_STATUS_DISABLED;
+       }
+
        if (IS_ZEBRA_DEBUG_KERNEL)
-               zlog_debug("%s: interface %u is mpls on: %d multicast on: %d",
-                          __func__, ifindex, mpls_on, mcast_on);
+               zlog_debug(
+                       "%s: interface %u is mpls on: %d multicast on: %d linkdown: %d",
+                       __func__, ifindex, mpls_on, mcast_on, linkdown_on);
 
        /* Create a dplane context and pass it along for processing */
-       netlink_netconf_dplane_update(ns_id, ifindex, mpls_on, mcast_on);
+       netlink_netconf_dplane_update(ns_id, ifindex, mpls_on, mcast_on,
+                                     linkdown_on);
 
        return 0;
 }
index d464f4a4e6ed298186e59a3ab6e99fa209628531..3a3bac6c74db9cbaa36032dc08f5d766ee335780 100644 (file)
@@ -303,6 +303,7 @@ struct dplane_gre_ctx {
 struct dplane_netconf_info {
        enum dplane_netconf_status_e mpls_val;
        enum dplane_netconf_status_e mcast_val;
+       enum dplane_netconf_status_e linkdown_val;
 };
 
 /*
@@ -2348,6 +2349,14 @@ dplane_ctx_get_netconf_mcast(const struct zebra_dplane_ctx *ctx)
        return ctx->u.netconf.mcast_val;
 }
 
+enum dplane_netconf_status_e
+dplane_ctx_get_netconf_linkdown(const struct zebra_dplane_ctx *ctx)
+{
+       DPLANE_CTX_VALID(ctx);
+
+       return ctx->u.netconf.linkdown_val;
+}
+
 void dplane_ctx_set_netconf_mpls(struct zebra_dplane_ctx *ctx,
                                 enum dplane_netconf_status_e val)
 {
@@ -2364,6 +2373,15 @@ void dplane_ctx_set_netconf_mcast(struct zebra_dplane_ctx *ctx,
        ctx->u.netconf.mcast_val = val;
 }
 
+void dplane_ctx_set_netconf_linkdown(struct zebra_dplane_ctx *ctx,
+                                    enum dplane_netconf_status_e val)
+{
+       DPLANE_CTX_VALID(ctx);
+
+       ctx->u.netconf.linkdown_val = val;
+}
+
+
 /*
  * Retrieve the limit on the number of pending, unprocessed updates.
  */
index 7ba824c5c07ae5360aa1c28bd83c095a06736a63..d147a3e21c62909cce4866e449004670a98efdfb 100644 (file)
@@ -596,10 +596,15 @@ enum dplane_netconf_status_e
 dplane_ctx_get_netconf_mpls(const struct zebra_dplane_ctx *ctx);
 enum dplane_netconf_status_e
 dplane_ctx_get_netconf_mcast(const struct zebra_dplane_ctx *ctx);
+enum dplane_netconf_status_e
+dplane_ctx_get_netconf_linkdown(const struct zebra_dplane_ctx *ctx);
+
 void dplane_ctx_set_netconf_mpls(struct zebra_dplane_ctx *ctx,
                                 enum dplane_netconf_status_e val);
 void dplane_ctx_set_netconf_mcast(struct zebra_dplane_ctx *ctx,
                                  enum dplane_netconf_status_e val);
+void dplane_ctx_set_netconf_linkdown(struct zebra_dplane_ctx *ctx,
+                                    enum dplane_netconf_status_e val);
 
 /* Namespace fd info - esp. for netlink communication */
 const struct zebra_dplane_info *dplane_ctx_get_ns(