From ab17f9803d08ee5c1b3e4618da170c8cb2da3eb5 Mon Sep 17 00:00:00 2001 From: Jef Oliver Date: Wed, 31 Aug 2016 17:27:08 -0700 Subject: [PATCH] lib/route: Allow override of IFLA_AF_SPEC nesting 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 Signed-off-by: Thomas Haller --- 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.40.0