summaryrefslogtreecommitdiffstats
path: root/zebra/netconf_netlink.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2022-06-23 17:00:08 +0200
committerDonald Sharp <sharpd@nvidia.com>2022-06-23 17:23:37 +0200
commit3689905d326cf5bbed298baf256443454bdde6a3 (patch)
tree0a00935fb90dd6e0e41fc728218ab79534ed3be7 /zebra/netconf_netlink.c
parentlib, zebra: Notice when a nexthop is set linkdown (diff)
downloadfrr-3689905d326cf5bbed298baf256443454bdde6a3.tar.xz
frr-3689905d326cf5bbed298baf256443454bdde6a3.zip
zebra: Add interface sysctl ignore on linkdown status
Add the ability to decode the ignore on linkdown nexthop status for an interface. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'zebra/netconf_netlink.c')
-rw-r--r--zebra/netconf_netlink.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/zebra/netconf_netlink.c b/zebra/netconf_netlink.c
index 03ddfdc52..cc6a1201a 100644
--- a/zebra/netconf_netlink.c
+++ b/zebra/netconf_netlink.c
@@ -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;
}