aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding/bond_netlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/bonding/bond_netlink.c')
-rw-r--r--drivers/net/bonding/bond_netlink.c66
1 files changed, 65 insertions, 1 deletions
diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c
index 7b1124366011..1bda29249d12 100644
--- a/drivers/net/bonding/bond_netlink.c
+++ b/drivers/net/bonding/bond_netlink.c
@@ -28,6 +28,8 @@ static size_t bond_get_slave_size(const struct net_device *bond_dev,
28 nla_total_size(MAX_ADDR_LEN) + /* IFLA_BOND_SLAVE_PERM_HWADDR */ 28 nla_total_size(MAX_ADDR_LEN) + /* IFLA_BOND_SLAVE_PERM_HWADDR */
29 nla_total_size(sizeof(u16)) + /* IFLA_BOND_SLAVE_QUEUE_ID */ 29 nla_total_size(sizeof(u16)) + /* IFLA_BOND_SLAVE_QUEUE_ID */
30 nla_total_size(sizeof(u16)) + /* IFLA_BOND_SLAVE_AD_AGGREGATOR_ID */ 30 nla_total_size(sizeof(u16)) + /* IFLA_BOND_SLAVE_AD_AGGREGATOR_ID */
31 nla_total_size(sizeof(u8)) + /* IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE */
32 nla_total_size(sizeof(u16)) + /* IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE */
31 0; 33 0;
32} 34}
33 35
@@ -56,12 +58,23 @@ static int bond_fill_slave_info(struct sk_buff *skb,
56 58
57 if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) { 59 if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) {
58 const struct aggregator *agg; 60 const struct aggregator *agg;
61 const struct port *ad_port;
59 62
63 ad_port = &SLAVE_AD_INFO(slave)->port;
60 agg = SLAVE_AD_INFO(slave)->port.aggregator; 64 agg = SLAVE_AD_INFO(slave)->port.aggregator;
61 if (agg) 65 if (agg) {
62 if (nla_put_u16(skb, IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, 66 if (nla_put_u16(skb, IFLA_BOND_SLAVE_AD_AGGREGATOR_ID,
63 agg->aggregator_identifier)) 67 agg->aggregator_identifier))
64 goto nla_put_failure; 68 goto nla_put_failure;
69 if (nla_put_u8(skb,
70 IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE,
71 ad_port->actor_oper_port_state))
72 goto nla_put_failure;
73 if (nla_put_u16(skb,
74 IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
75 ad_port->partner_oper.port_state))
76 goto nla_put_failure;
77 }
65 } 78 }
66 79
67 return 0; 80 return 0;
@@ -94,6 +107,10 @@ static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = {
94 [IFLA_BOND_AD_LACP_RATE] = { .type = NLA_U8 }, 107 [IFLA_BOND_AD_LACP_RATE] = { .type = NLA_U8 },
95 [IFLA_BOND_AD_SELECT] = { .type = NLA_U8 }, 108 [IFLA_BOND_AD_SELECT] = { .type = NLA_U8 },
96 [IFLA_BOND_AD_INFO] = { .type = NLA_NESTED }, 109 [IFLA_BOND_AD_INFO] = { .type = NLA_NESTED },
110 [IFLA_BOND_AD_ACTOR_SYS_PRIO] = { .type = NLA_U16 },
111 [IFLA_BOND_AD_USER_PORT_KEY] = { .type = NLA_U16 },
112 [IFLA_BOND_AD_ACTOR_SYSTEM] = { .type = NLA_BINARY,
113 .len = ETH_ALEN },
97}; 114};
98 115
99static const struct nla_policy bond_slave_policy[IFLA_BOND_SLAVE_MAX + 1] = { 116static const struct nla_policy bond_slave_policy[IFLA_BOND_SLAVE_MAX + 1] = {
@@ -379,6 +396,36 @@ static int bond_changelink(struct net_device *bond_dev,
379 if (err) 396 if (err)
380 return err; 397 return err;
381 } 398 }
399 if (data[IFLA_BOND_AD_ACTOR_SYS_PRIO]) {
400 int actor_sys_prio =
401 nla_get_u16(data[IFLA_BOND_AD_ACTOR_SYS_PRIO]);
402
403 bond_opt_initval(&newval, actor_sys_prio);
404 err = __bond_opt_set(bond, BOND_OPT_AD_ACTOR_SYS_PRIO, &newval);
405 if (err)
406 return err;
407 }
408
409 if (data[IFLA_BOND_AD_USER_PORT_KEY]) {
410 int port_key =
411 nla_get_u16(data[IFLA_BOND_AD_USER_PORT_KEY]);
412
413 bond_opt_initval(&newval, port_key);
414 err = __bond_opt_set(bond, BOND_OPT_AD_USER_PORT_KEY, &newval);
415 if (err)
416 return err;
417 }
418
419 if (data[IFLA_BOND_AD_ACTOR_SYSTEM]) {
420 if (nla_len(data[IFLA_BOND_AD_ACTOR_SYSTEM]) != ETH_ALEN)
421 return -EINVAL;
422
423 bond_opt_initval(&newval,
424 nla_get_be64(data[IFLA_BOND_AD_ACTOR_SYSTEM]));
425 err = __bond_opt_set(bond, BOND_OPT_AD_ACTOR_SYSTEM, &newval);
426 if (err)
427 return err;
428 }
382 return 0; 429 return 0;
383} 430}
384 431
@@ -426,6 +473,9 @@ static size_t bond_get_size(const struct net_device *bond_dev)
426 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_ACTOR_KEY */ 473 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_ACTOR_KEY */
427 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_PARTNER_KEY*/ 474 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_PARTNER_KEY*/
428 nla_total_size(ETH_ALEN) + /* IFLA_BOND_AD_INFO_PARTNER_MAC*/ 475 nla_total_size(ETH_ALEN) + /* IFLA_BOND_AD_INFO_PARTNER_MAC*/
476 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_ACTOR_SYS_PRIO */
477 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_USER_PORT_KEY */
478 nla_total_size(ETH_ALEN) + /* IFLA_BOND_AD_ACTOR_SYSTEM */
429 0; 479 0;
430} 480}
431 481
@@ -551,6 +601,20 @@ static int bond_fill_info(struct sk_buff *skb,
551 if (BOND_MODE(bond) == BOND_MODE_8023AD) { 601 if (BOND_MODE(bond) == BOND_MODE_8023AD) {
552 struct ad_info info; 602 struct ad_info info;
553 603
604 if (capable(CAP_NET_ADMIN)) {
605 if (nla_put_u16(skb, IFLA_BOND_AD_ACTOR_SYS_PRIO,
606 bond->params.ad_actor_sys_prio))
607 goto nla_put_failure;
608
609 if (nla_put_u16(skb, IFLA_BOND_AD_USER_PORT_KEY,
610 bond->params.ad_user_port_key))
611 goto nla_put_failure;
612
613 if (nla_put(skb, IFLA_BOND_AD_ACTOR_SYSTEM,
614 sizeof(bond->params.ad_actor_system),
615 &bond->params.ad_actor_system))
616 goto nla_put_failure;
617 }
554 if (!bond_3ad_get_active_agg_info(bond, &info)) { 618 if (!bond_3ad_get_active_agg_info(bond, &info)) {
555 struct nlattr *nest; 619 struct nlattr *nest;
556 620