From 97082f668bd19adf75e968ab499d5c0926a233b5 Mon Sep 17 00:00:00 2001
From: Maxime Bizon <mbizon@freebox.fr>
Date: Thu, 12 Dec 2019 23:53:37 +0100
Subject: [PATCH 2/7] link: retrieve min/max mtu from link

---
 include/netlink-private/types.h |  2 ++
 include/netlink/route/link.h    |  3 +++
 lib/route/link.c                | 24 ++++++++++++++++++++++++
 libnl-route-3.sym               |  2 ++
 4 files changed, 31 insertions(+)

diff --git a/include/netlink-private/types.h b/include/netlink-private/types.h
index 750f191..7128d07 100644
--- a/include/netlink-private/types.h
+++ b/include/netlink-private/types.h
@@ -194,6 +194,8 @@ struct rtnl_link
 	uint32_t			l_flags;
 	uint32_t			l_change;
 	uint32_t			l_mtu;
+	uint32_t			l_min_mtu;
+	uint32_t			l_max_mtu;
 	uint32_t			l_link;
 	int32_t                         l_link_netnsid;
 	uint32_t			l_txqlen;
diff --git a/include/netlink/route/link.h b/include/netlink/route/link.h
index add464b..5623e9a 100644
--- a/include/netlink/route/link.h
+++ b/include/netlink/route/link.h
@@ -171,6 +171,9 @@ extern unsigned int rtnl_link_get_mtu(struct rtnl_link *);
 extern void     rtnl_link_set_txqlen(struct rtnl_link *, unsigned int);
 extern unsigned int rtnl_link_get_txqlen(struct rtnl_link *);
 
+extern unsigned int rtnl_link_get_max_mtu(struct rtnl_link *);
+extern unsigned int rtnl_link_get_min_mtu(struct rtnl_link *);
+
 extern void     rtnl_link_set_ifindex(struct rtnl_link *, int);
 extern int      rtnl_link_get_ifindex(struct rtnl_link *);
 
diff --git a/lib/route/link.c b/lib/route/link.c
index 3202600..afc234c 100644
--- a/lib/route/link.c
+++ b/lib/route/link.c
@@ -66,6 +66,8 @@
 #define LINK_ATTR_GSO_MAX_SEGS		((uint64_t) 1 << 37)
 #define LINK_ATTR_GSO_MAX_SIZE		((uint64_t) 1 << 38)
 #define LINK_ATTR_LINKINFO_SLAVE_KIND	((uint64_t) 1 << 39)
+#define LINK_ATTR_MIN_MTU		((uint64_t) 1 << 40)
+#define LINK_ATTR_MAX_MTU		((uint64_t) 1 << 41)
 
 static struct nl_cache_ops rtnl_link_ops;
 static struct nl_object_ops link_obj_ops;
@@ -382,6 +384,8 @@ struct nla_policy rtln_link_policy[IFLA_MAX+1] = {
 	[IFLA_PHYS_SWITCH_ID]	= { .type = NLA_UNSPEC },
 	[IFLA_NET_NS_PID]	= { .type = NLA_U32 },
 	[IFLA_NET_NS_FD]	= { .type = NLA_U32 },
+	[IFLA_MIN_MTU]		= { .type = NLA_U32 },
+	[IFLA_MAX_MTU]		= { .type = NLA_U32 },
 };
 
 static struct nla_policy link_info_policy[IFLA_INFO_MAX+1] = {
@@ -496,6 +500,16 @@ int rtnl_link_info_parse(struct rtnl_link *link, struct nlattr **tb)
 		link->ce_mask |= LINK_ATTR_MTU;
 	}
 
+	if (tb[IFLA_MIN_MTU]) {
+		link->l_min_mtu = nla_get_u32(tb[IFLA_MIN_MTU]);
+		link->ce_mask |= LINK_ATTR_MIN_MTU;
+	}
+
+	if (tb[IFLA_MAX_MTU]) {
+		link->l_max_mtu = nla_get_u32(tb[IFLA_MAX_MTU]);
+		link->ce_mask |= LINK_ATTR_MAX_MTU;
+	}
+
 	if (tb[IFLA_ADDRESS]) {
 		link->l_addr = nl_addr_alloc_attr(tb[IFLA_ADDRESS], AF_UNSPEC);
 		if (link->l_addr == NULL)
@@ -2208,6 +2222,16 @@ unsigned int rtnl_link_get_mtu(struct rtnl_link *link)
 	return link->l_mtu;
 }
 
+unsigned int rtnl_link_get_max_mtu(struct rtnl_link *link)
+{
+	return link->l_max_mtu;
+}
+
+unsigned int rtnl_link_get_min_mtu(struct rtnl_link *link)
+{
+	return link->l_min_mtu;
+}
+
 /**
  * Set transmission queue length
  * @arg link		Link object
diff --git a/libnl-route-3.sym b/libnl-route-3.sym
index 8734905..d1312e9 100644
--- a/libnl-route-3.sym
+++ b/libnl-route-3.sym
@@ -297,6 +297,8 @@ global:
 	rtnl_link_get_linkmode;
 	rtnl_link_get_master;
 	rtnl_link_get_mtu;
+	rtnl_link_get_min_mtu;
+	rtnl_link_get_max_mtu;
 	rtnl_link_get_name;
 	rtnl_link_get_ns_fd;
 	rtnl_link_get_ns_pid;
-- 
2.37.1

