diff options
Diffstat (limited to 'drivers/net/bonding/bond_netlink.c')
| -rw-r--r-- | drivers/net/bonding/bond_netlink.c | 66 |
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 | ||
| 99 | static const struct nla_policy bond_slave_policy[IFLA_BOND_SLAVE_MAX + 1] = { | 116 | static 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 | ||
