diff options
author | Jiri Pirko <jiri@resnulli.us> | 2014-09-05 09:51:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-09 14:29:55 -0400 |
commit | 3ac636b8591c37bb5028814a4ebd41d263b56181 (patch) | |
tree | 97295e084197799d256c88b57205b36d8b7b4b80 /net/bridge | |
parent | ced8283f90b88bbf7ec9a6b869586b611167394e (diff) |
bridge: implement rtnl_link_ops->slave_changelink
Allow rtnetlink users to set port info via IFLA_INFO_SLAVE_DATA attr
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge')
-rw-r--r-- | net/bridge/br_netlink.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 80d23471743f..05aeea1222a7 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -276,7 +276,7 @@ static int br_afspec(struct net_bridge *br, | |||
276 | return err; | 276 | return err; |
277 | } | 277 | } |
278 | 278 | ||
279 | static const struct nla_policy ifla_brport_policy[IFLA_BRPORT_MAX + 1] = { | 279 | static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = { |
280 | [IFLA_BRPORT_STATE] = { .type = NLA_U8 }, | 280 | [IFLA_BRPORT_STATE] = { .type = NLA_U8 }, |
281 | [IFLA_BRPORT_COST] = { .type = NLA_U32 }, | 281 | [IFLA_BRPORT_COST] = { .type = NLA_U32 }, |
282 | [IFLA_BRPORT_PRIORITY] = { .type = NLA_U16 }, | 282 | [IFLA_BRPORT_PRIORITY] = { .type = NLA_U16 }, |
@@ -382,7 +382,7 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh) | |||
382 | if (p && protinfo) { | 382 | if (p && protinfo) { |
383 | if (protinfo->nla_type & NLA_F_NESTED) { | 383 | if (protinfo->nla_type & NLA_F_NESTED) { |
384 | err = nla_parse_nested(tb, IFLA_BRPORT_MAX, | 384 | err = nla_parse_nested(tb, IFLA_BRPORT_MAX, |
385 | protinfo, ifla_brport_policy); | 385 | protinfo, br_port_policy); |
386 | if (err) | 386 | if (err) |
387 | return err; | 387 | return err; |
388 | 388 | ||
@@ -461,6 +461,16 @@ static int br_dev_newlink(struct net *src_net, struct net_device *dev, | |||
461 | return register_netdevice(dev); | 461 | return register_netdevice(dev); |
462 | } | 462 | } |
463 | 463 | ||
464 | static int br_port_slave_changelink(struct net_device *brdev, | ||
465 | struct net_device *dev, | ||
466 | struct nlattr *tb[], | ||
467 | struct nlattr *data[]) | ||
468 | { | ||
469 | if (!data) | ||
470 | return 0; | ||
471 | return br_setport(br_port_get_rtnl(dev), data); | ||
472 | } | ||
473 | |||
464 | static int br_port_fill_slave_info(struct sk_buff *skb, | 474 | static int br_port_fill_slave_info(struct sk_buff *skb, |
465 | const struct net_device *brdev, | 475 | const struct net_device *brdev, |
466 | const struct net_device *dev) | 476 | const struct net_device *dev) |
@@ -504,6 +514,10 @@ struct rtnl_link_ops br_link_ops __read_mostly = { | |||
504 | .validate = br_validate, | 514 | .validate = br_validate, |
505 | .newlink = br_dev_newlink, | 515 | .newlink = br_dev_newlink, |
506 | .dellink = br_dev_delete, | 516 | .dellink = br_dev_delete, |
517 | |||
518 | .slave_maxtype = IFLA_BRPORT_MAX, | ||
519 | .slave_policy = br_port_policy, | ||
520 | .slave_changelink = br_port_slave_changelink, | ||
507 | .get_slave_size = br_port_get_slave_size, | 521 | .get_slave_size = br_port_get_slave_size, |
508 | .fill_slave_info = br_port_fill_slave_info, | 522 | .fill_slave_info = br_port_fill_slave_info, |
509 | }; | 523 | }; |