aboutsummaryrefslogtreecommitdiffstats
path: root/net/bridge
diff options
context:
space:
mode:
authorJiri Pirko <jiri@resnulli.us>2014-09-05 09:51:30 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-09 14:29:55 -0400
commit3ac636b8591c37bb5028814a4ebd41d263b56181 (patch)
tree97295e084197799d256c88b57205b36d8b7b4b80 /net/bridge
parentced8283f90b88bbf7ec9a6b869586b611167394e (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.c18
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
279static const struct nla_policy ifla_brport_policy[IFLA_BRPORT_MAX + 1] = { 279static 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
464static 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
464static int br_port_fill_slave_info(struct sk_buff *skb, 474static 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};