diff options
author | Andy Roulin <aroulin@cumulusnetworks.com> | 2019-12-31 04:15:02 -0800 |
---|---|---|
committer | David Ahern <dsahern@gmail.com> | 2020-01-02 17:45:32 +0000 |
commit | 39ac2d2b802b42ae460e84cc3fb971ceafb2b4d2 (patch) | |
tree | 9b9cd6518724fdc31854c9a4ba3c24053555111e | |
parent | a6cf98c23fc692c3816bf4c0ecc221c125a6e169 (diff) | |
download | iproute2-39ac2d2b802b42ae460e84cc3fb971ceafb2b4d2.tar.gz |
iplink: bond: print lacp actor/partner oper states as strings
The 802.3ad/LACP actor/partner operating states are only printed as
numbers, e.g,
ad_actor_oper_port_state 15
Add an additional output in ip link show that prints a string describing
the individual 3ad bit meanings in the following way:
ad_actor_oper_port_state_str <active,short_timeout,aggregating,in_sync>
JSON output is also supported, the field becomes a json array:
"ad_actor_oper_port_state_str":
["active","short_timeout","aggregating","in_sync"]
Signed-off-by: Andy Roulin <aroulin@cumulusnetworks.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
-rw-r--r-- | ip/iplink_bond_slave.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/ip/iplink_bond_slave.c b/ip/iplink_bond_slave.c index 4eaf72b86..d488aaab4 100644 --- a/ip/iplink_bond_slave.c +++ b/ip/iplink_bond_slave.c @@ -68,6 +68,26 @@ static void print_slave_mii_status(FILE *f, struct rtattr *tb) slave_mii_status[status]); } +static void print_slave_oper_state(FILE *fp, const char *name, __u16 state) +{ + open_json_array(PRINT_ANY, name); + print_string(PRINT_FP, NULL, " <", NULL); +#define _PF(s, str) if (state & LACP_STATE_##s) { \ + state &= ~LACP_STATE_##s; \ + print_string(PRINT_ANY, NULL, \ + state ? "%s," : "%s", str); } + _PF(LACP_ACTIVITY, "active"); + _PF(LACP_TIMEOUT, "short_timeout"); + _PF(AGGREGATION, "aggregating"); + _PF(SYNCHRONIZATION, "in_sync"); + _PF(COLLECTING, "collecting"); + _PF(DISTRIBUTING, "distributing"); + _PF(DEFAULTED, "defaulted"); + _PF(EXPIRED, "expired"); +#undef _PF + close_json_array(PRINT_ANY, "> "); +} + static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) { SPRINT_BUF(b1); @@ -106,17 +126,25 @@ static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *t "ad_aggregator_id %d ", rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_AGGREGATOR_ID])); - if (tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE]) + if (tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE]) { + __u8 state = rta_getattr_u8(tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE]); + print_int(PRINT_ANY, "ad_actor_oper_port_state", "ad_actor_oper_port_state %d ", - rta_getattr_u8(tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE])); + state); + print_slave_oper_state(f, "ad_actor_oper_port_state_str", state); + } + + if (tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE]) { + __u16 state = rta_getattr_u8(tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE]); - if (tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE]) print_int(PRINT_ANY, "ad_partner_oper_port_state", "ad_partner_oper_port_state %d ", - rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE])); + state); + print_slave_oper_state(f, "ad_partner_oper_port_state_str", state); + } } static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv, |