From 8c18117d8cade288d00636af7378e9d2bf3ac000 Mon Sep 17 00:00:00 2001
From: Maxime Bizon <mbizon@freebox.fr>
Date: Thu, 12 Dec 2019 23:53:37 +0100
Subject: [PATCH 3/3] 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 97af3e5..78f3f74 100644
--- a/include/netlink-private/types.h
+++ b/include/netlink-private/types.h
@@ -199,6 +199,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 8fd0994..4ba0624 100644
--- a/include/netlink/route/link.h
+++ b/include/netlink/route/link.h
@@ -173,6 +173,9 @@ extern unsigned int rtnl_link_get_flags(struct rtnl_link *);
 extern void	rtnl_link_set_mtu(struct rtnl_link *, unsigned int);
 extern unsigned int rtnl_link_get_mtu(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_txqlen(struct rtnl_link *, unsigned int);
 extern unsigned int rtnl_link_get_txqlen(struct rtnl_link *);
 
diff --git a/lib/route/link.c b/lib/route/link.c
index df01a71..8a331be 100644
--- a/lib/route/link.c
+++ b/lib/route/link.c
@@ -73,6 +73,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;
@@ -373,6 +375,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] = {
@@ -487,6 +491,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)
@@ -2231,6 +2245,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 600f374..60077ca 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.17.1

