[PATCH 4/5] lib/route: Allow override of IFLA_AF_SPEC nesting

Jef Oliver jef.oliver at intel.com
Wed Aug 31 17:27:08 PDT 2016


This patch adds the ability to override nesting into an AF specific
attribute. An example of this is the bridge module.

Regular Nesting:
[IFLA_AF_SPEC]
    [AF_INET]
        [AF_INET_ATTRS]

Bridge Nesting:
[IFLA_AF_SPEC]
    [AF_BRIDGE_ATTRS]

This patch adds ao_fill_af_no_nest to struct rtnl_link_af_ops.
When set to non-zero, this will override the nested AF attribute
and allow nesting of attributes directly into IFLA_AF_SPEC.

Signed-off-by: Jef Oliver <jef.oliver at intel.com>
---
 include/netlink-private/route/link/api.h |  8 ++++++++
 lib/route/link.c                         | 10 ++++++----
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/include/netlink-private/route/link/api.h b/include/netlink-private/route/link/api.h
index 2767f63..a3915a3 100644
--- a/include/netlink-private/route/link/api.h
+++ b/include/netlink-private/route/link/api.h
@@ -167,6 +167,14 @@ struct rtnl_link_af_ops
 	 * here. (eg. NLA_F_NESTED)
 	 */
 	const int ao_fill_pi_flags;
+
+	/** IFLA_AF_SPEC nesting override
+	 *
+	 * Called if a link message is sent to the kernel. If this is set,
+	 * the AF specific nest is not created. Instead, AF specific attributes
+     * are nested directly in the IFLA_AF_SPEC attribute.
+	 */
+	 const int ao_fill_af_no_nest;
 };
 
 extern struct rtnl_link_af_ops *rtnl_link_af_ops_lookup(unsigned int);
diff --git a/lib/route/link.c b/lib/route/link.c
index c247603..90d7a55 100644
--- a/lib/route/link.c
+++ b/lib/route/link.c
@@ -135,19 +135,21 @@ static int af_fill(struct rtnl_link *link, struct rtnl_link_af_ops *ops,
 		   void *data, void *arg)
 {
 	struct nl_msg *msg = arg;
-	struct nlattr *af_attr;
+	struct nlattr *af_attr = NULL;
 	int err;
 
 	if (!ops->ao_fill_af)
 		return 0;
 
-	if (!(af_attr = nla_nest_start(msg, ops->ao_family)))
-		return -NLE_MSGSIZE;
+	if (!ops->ao_fill_af_no_nest)
+		if (!(af_attr = nla_nest_start(msg, ops->ao_family)))
+			return -NLE_MSGSIZE;
 
 	if ((err = ops->ao_fill_af(link, arg, data)) < 0)
 		return err;
 
-	nla_nest_end(msg, af_attr);
+	if (!ops->ao_fill_af_no_nest)
+		nla_nest_end(msg, af_attr);
 
 	return 0;
 }
-- 
2.9.3




More information about the libnl mailing list