Export the actor_oper_port_state of each port via sysfs and netlink. In 802.3ad mode it is valuable for the user to be able to check the actor_oper state, it is already exported via bond's proc entry.
Unified · Split
| @@ -28,6 +28,7 @@ static size_t bond_get_slave_size(const struct net_device *bond_dev, · 27 unmodified lines | ||
| 28 | 28 | nla_total_size(MAX_ADDR_LEN) + /* IFLA_BOND_SLAVE_PERM_HWADDR */ |
| 29 | 29 | nla_total_size(sizeof(u16)) + /* IFLA_BOND_SLAVE_QUEUE_ID */ |
| 30 | 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 */ | |
| 31 | 32 | 0; |
| 32 | 33 | } |
| 33 | 34 | |
| @@ -56,12 +57,19 @@ static int bond_fill_slave_info(struct sk_buff *skb, · 22 unmodified lines | ||
| 56 | 57 | |
| 57 | 58 | if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) { |
| 58 | 59 | const struct aggregator *agg; |
| 60 | + const struct port *ad_port; | |
| 59 | 61 | |
| 62 | + ad_port = &SLAVE_AD_INFO(slave)->port; | |
| 60 | 63 | agg = SLAVE_AD_INFO(slave)->port.aggregator; |
| 61 | − if (agg) | |
| 64 | + if (agg) { | |
| 62 | 65 | if (nla_put_u16(skb, IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, |
| 63 | 66 | agg->aggregator_identifier)) |
| 64 | 67 | goto nla_put_failure; |
| 68 | + if (nla_put_u8(skb, | |
| 69 | + IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, | |
| 70 | + ad_port->actor_oper_port_state)) | |
| 71 | + goto nla_put_failure; | |
| 72 | + } | |
| 65 | 73 | } |
| 66 | 74 | |
| 67 | 75 | return 0; |
| @@ -80,6 +80,21 @@ static ssize_t ad_aggregator_id_show(struct slave *slave, char *buf) · 79 unmodified lines | ||
| 80 | 80 | } |
| 81 | 81 | static SLAVE_ATTR_RO(ad_aggregator_id); |
| 82 | 82 | |
| 83 | +static ssize_t ad_actor_oper_port_state_show(struct slave *slave, char *buf) | |
| 84 | +{ | |
| 85 | + const struct port *ad_port; | |
| 86 | + | |
| 87 | + if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) { | |
| 88 | + ad_port = &SLAVE_AD_INFO(slave)->port; | |
| 89 | + if (ad_port->aggregator) | |
| 90 | + return sprintf(buf, "%u\n", | |
| 91 | + ad_port->actor_oper_port_state); | |
| 92 | + } | |
| 93 | + | |
| 94 | + return sprintf(buf, "N/A\n"); | |
| 95 | +} | |
| 96 | +static SLAVE_ATTR_RO(ad_actor_oper_port_state); | |
| 97 | + | |
| 83 | 98 | static const struct slave_attribute *slave_attrs[] = { |
| 84 | 99 | &slave_attr_state, |
| 85 | 100 | &slave_attr_mii_status, |
| @@ -87,6 +102,7 @@ static const struct slave_attribute *slave_attrs[] = { · 1 unmodified line | ||
| 87 | 102 | &slave_attr_perm_hwaddr, |
| 88 | 103 | &slave_attr_queue_id, |
| 89 | 104 | &slave_attr_ad_aggregator_id, |
| 105 | + &slave_attr_ad_actor_oper_port_state, | |
| 90 | 106 | NULL |
| 91 | 107 | }; |
| 92 | 108 | |
| @@ -456,6 +456,7 @@ enum { · 455 unmodified lines | ||
| 456 | 456 | IFLA_BOND_SLAVE_PERM_HWADDR, |
| 457 | 457 | IFLA_BOND_SLAVE_QUEUE_ID, |
| 458 | 458 | IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, |
| 459 | + IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, | |
| 459 | 460 | __IFLA_BOND_SLAVE_MAX, |
| 460 | 461 | }; |
| 461 | 462 | |