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 <jef.oliver@intel.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
Jef Oliver 2016-08-31 17:27:08 -07:00 committed by Thomas Haller
parent 9be1849eab
commit ab17f9803d
2 changed files with 14 additions and 4 deletions

View File

@ -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);

View File

@ -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;
}