[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