[PATCH] Support RTEXT_FILTER_VF

Jef Oliver jef.oliver at intel.com
Mon May 16 16:23:23 PDT 2016


This patch adds RTEXT_FILTER_VF mask support for SRIOV VFs. Since
SRIOV VFs don't have a defined address family (ie bridge), there
are no new address family specific operations defined.

Exposing this mask makes rtnl_link_get_num_vfs() properly return
the number of loaded SRIOV VFs.

Signed-off-by: Jef Oliver <jef.oliver at intel.com>
---
 lib/route/link.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/lib/route/link.c b/lib/route/link.c
index 1fa2672..0ac7b78 100644
--- a/lib/route/link.c
+++ b/lib/route/link.c
@@ -677,6 +677,7 @@ static int link_request_update(struct nl_cache *cache, struct nl_sock *sk)
 	struct rtnl_link_af_ops *ops;
 	struct nl_msg *msg;
 	int err;
+	__u32 vf_mask = RTEXT_FILTER_VF;
 
 	msg = nlmsg_alloc_simple(RTM_GETLINK, NLM_F_DUMP);
 	if (!msg)
@@ -686,12 +687,17 @@ static int link_request_update(struct nl_cache *cache, struct nl_sock *sk)
 	if (nlmsg_append(msg, &hdr, sizeof(hdr), NLMSG_ALIGNTO) < 0)
 		goto nla_put_failure;
 
+	err = nla_put(msg, IFLA_EXT_MASK, sizeof(vf_mask), &vf_mask);
+	if (err)
+		goto nla_put_failure;
+
 	ops = rtnl_link_af_ops_lookup(family);
 	if (ops && ops->ao_get_af) {
 		err = ops->ao_get_af(msg);
 		if (err)
 			goto nla_put_failure;
 	}
+
 	err = nl_send_auto(sk, msg);
 	if (err > 0)
 		err = 0;
@@ -1218,6 +1224,8 @@ int rtnl_link_build_get_request(int ifindex, const char *name,
 {
 	struct ifinfomsg ifi;
 	struct nl_msg *msg;
+	__u32 vf_mask = RTEXT_FILTER_VF;
+	int err;
 
 	if (ifindex <= 0 && !name) {
 		APPBUG("ifindex or name must be specified");
@@ -1232,18 +1240,24 @@ int rtnl_link_build_get_request(int ifindex, const char *name,
 	if (ifindex > 0)
 		ifi.ifi_index = ifindex;
 
-	if (nlmsg_append(msg, &ifi, sizeof(ifi), NLMSG_ALIGNTO) < 0)
+	if (nlmsg_append(msg, &ifi, sizeof(ifi), NLMSG_ALIGNTO) < 0) {
+		err = -NLE_MSGSIZE;
 		goto nla_put_failure;
+	}
 
 	if (name)
 		NLA_PUT_STRING(msg, IFLA_IFNAME, name);
 
+	err = nla_put(msg, IFLA_EXT_MASK, sizeof(vf_mask), &vf_mask);
+	if (err)
+		goto nla_put_failure;
+
 	*result = msg;
 	return 0;
 
 nla_put_failure:
 	nlmsg_free(msg);
-	return -NLE_MSGSIZE;
+	return err;
 }
 
 /**
-- 
2.8.2




More information about the libnl mailing list