|
@@ -94,6 +94,10 @@ static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = {
|
|
|
[IFLA_BOND_AD_LACP_RATE] = { .type = NLA_U8 },
|
|
|
[IFLA_BOND_AD_SELECT] = { .type = NLA_U8 },
|
|
|
[IFLA_BOND_AD_INFO] = { .type = NLA_NESTED },
|
|
|
+ [IFLA_BOND_AD_ACTOR_SYS_PRIO] = { .type = NLA_U16 },
|
|
|
+ [IFLA_BOND_AD_USER_PORT_KEY] = { .type = NLA_U16 },
|
|
|
+ [IFLA_BOND_AD_ACTOR_SYSTEM] = { .type = NLA_BINARY,
|
|
|
+ .len = ETH_ALEN },
|
|
|
};
|
|
|
|
|
|
static const struct nla_policy bond_slave_policy[IFLA_BOND_SLAVE_MAX + 1] = {
|
|
@@ -379,6 +383,36 @@ static int bond_changelink(struct net_device *bond_dev,
|
|
|
if (err)
|
|
|
return err;
|
|
|
}
|
|
|
+ if (data[IFLA_BOND_AD_ACTOR_SYS_PRIO]) {
|
|
|
+ int actor_sys_prio =
|
|
|
+ nla_get_u16(data[IFLA_BOND_AD_ACTOR_SYS_PRIO]);
|
|
|
+
|
|
|
+ bond_opt_initval(&newval, actor_sys_prio);
|
|
|
+ err = __bond_opt_set(bond, BOND_OPT_AD_ACTOR_SYS_PRIO, &newval);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data[IFLA_BOND_AD_USER_PORT_KEY]) {
|
|
|
+ int port_key =
|
|
|
+ nla_get_u16(data[IFLA_BOND_AD_USER_PORT_KEY]);
|
|
|
+
|
|
|
+ bond_opt_initval(&newval, port_key);
|
|
|
+ err = __bond_opt_set(bond, BOND_OPT_AD_USER_PORT_KEY, &newval);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data[IFLA_BOND_AD_ACTOR_SYSTEM]) {
|
|
|
+ if (nla_len(data[IFLA_BOND_AD_ACTOR_SYSTEM]) != ETH_ALEN)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ bond_opt_initval(&newval,
|
|
|
+ nla_get_be64(data[IFLA_BOND_AD_ACTOR_SYSTEM]));
|
|
|
+ err = __bond_opt_set(bond, BOND_OPT_AD_ACTOR_SYSTEM, &newval);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -426,6 +460,9 @@ static size_t bond_get_size(const struct net_device *bond_dev)
|
|
|
nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_ACTOR_KEY */
|
|
|
nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_PARTNER_KEY*/
|
|
|
nla_total_size(ETH_ALEN) + /* IFLA_BOND_AD_INFO_PARTNER_MAC*/
|
|
|
+ nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_ACTOR_SYS_PRIO */
|
|
|
+ nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_USER_PORT_KEY */
|
|
|
+ nla_total_size(ETH_ALEN) + /* IFLA_BOND_AD_ACTOR_SYSTEM */
|
|
|
0;
|
|
|
}
|
|
|
|
|
@@ -551,6 +588,19 @@ static int bond_fill_info(struct sk_buff *skb,
|
|
|
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
|
|
struct ad_info info;
|
|
|
|
|
|
+ if (nla_put_u16(skb, IFLA_BOND_AD_ACTOR_SYS_PRIO,
|
|
|
+ bond->params.ad_actor_sys_prio))
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
+ if (nla_put_u16(skb, IFLA_BOND_AD_USER_PORT_KEY,
|
|
|
+ bond->params.ad_user_port_key))
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
+ if (nla_put(skb, IFLA_BOND_AD_ACTOR_SYSTEM,
|
|
|
+ sizeof(bond->params.ad_actor_system),
|
|
|
+ &bond->params.ad_actor_system))
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
if (!bond_3ad_get_active_agg_info(bond, &info)) {
|
|
|
struct nlattr *nest;
|
|
|
|