* [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state
@ 2019-10-26 23:29 Andy Roulin
2019-10-26 23:29 ` [PATCH net-next 1/3] bonding: move 3ad port state defs to include/uapi Andy Roulin
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Andy Roulin @ 2019-10-26 23:29 UTC (permalink / raw)
To: netdev; +Cc: dsahern, nikolay, roopa, j.vosburgh, vfalico, andy
Print the bond slave 802.3ad state in a human-readable way in iproute2
The 802.3ad bond slave actor/partner state definitions are exported
to userspace in the kernel include/uapi
rtnetlink sends the bond slave state to userspace, see
- IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE; and
- IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE
These attributes only send the state value; the kernel does not export
the state field definitions to interpret the state's fields.
As the 802.3ad port states are defined in the 802.3ad standard, export
the 802.3ad bond slave state definitions to uapi/ and pretty print
them in iproute2.
net-next:
Andy Roulin (1):
bonding: move 802.3ad slave state defs to uapi
drivers/net/bonding/bond_3ad.c | 10 ----------
include/uapi/linux/if_bonding.h | 10 ++++++++++
2 files changed, 10 insertions(+), 10 deletions(-)
iproute2-next:
Andy Roulin (2):
include/uapi: update bonding kernel header
iplink: bond: print 3ad actor/partner oper states as strings
include/uapi/linux/if_bonding.h | 10 +++++++++
ip/iplink_bond_slave.c | 38 +++++++++++++++++++++++++++++----
2 files changed, 44 insertions(+), 4 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net-next 1/3] bonding: move 3ad port state defs to include/uapi
2019-10-26 23:29 [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state Andy Roulin
@ 2019-10-26 23:29 ` Andy Roulin
2019-10-26 23:29 ` [PATCH iproute2-next 2/3] include/uapi: update bonding kernel header Andy Roulin
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Andy Roulin @ 2019-10-26 23:29 UTC (permalink / raw)
To: netdev; +Cc: dsahern, nikolay, roopa, j.vosburgh, vfalico, andy
The actor and partner 802.3ad operating states are exported to userspace
in bond_netlink.c, see bond_slave_fill_info with the following
attributes:
- IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE; and
- IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE.
The operating states are exported as bitfields and userspace lacks a way
to interpret them, e.g., iproute2 only prints the states as numbers.
For userspace to interpret kernel bitfields, the bitfield definitions
should be part of the uapi. The bitfield itself is defined in the 802.3ad
standard.
This commit moves the 802.3ad bitfield definitions to
uapi/linux/if_bonding.h
Signed-off-by: Andy Roulin <aroulin@cumulusnetworks.com>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Acked-by: Roopa Prabhu <roopa@cumulusnetworks.com>
---
drivers/net/bonding/bond_3ad.c | 10 ----------
include/uapi/linux/if_bonding.h | 10 ++++++++++
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index 9274dcc6e9b0..503af517bc64 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -48,16 +48,6 @@
#define AD_CHURN_DETECTION_TIME 60
#define AD_AGGREGATE_WAIT_TIME 2
-/* Port state definitions (43.4.2.2 in the 802.3ad standard) */
-#define AD_STATE_LACP_ACTIVITY 0x1
-#define AD_STATE_LACP_TIMEOUT 0x2
-#define AD_STATE_AGGREGATION 0x4
-#define AD_STATE_SYNCHRONIZATION 0x8
-#define AD_STATE_COLLECTING 0x10
-#define AD_STATE_DISTRIBUTING 0x20
-#define AD_STATE_DEFAULTED 0x40
-#define AD_STATE_EXPIRED 0x80
-
/* Port Variables definitions used by the State Machines (43.4.7 in the
* 802.3ad standard)
*/
diff --git a/include/uapi/linux/if_bonding.h b/include/uapi/linux/if_bonding.h
index 790585f0e61b..6829213a54c5 100644
--- a/include/uapi/linux/if_bonding.h
+++ b/include/uapi/linux/if_bonding.h
@@ -95,6 +95,16 @@
#define BOND_XMIT_POLICY_ENCAP23 3 /* encapsulated layer 2+3 */
#define BOND_XMIT_POLICY_ENCAP34 4 /* encapsulated layer 3+4 */
+/* 802.3ad port state definitions (43.4.2.2 in the 802.3ad standard) */
+#define AD_STATE_LACP_ACTIVITY 0x1
+#define AD_STATE_LACP_TIMEOUT 0x2
+#define AD_STATE_AGGREGATION 0x4
+#define AD_STATE_SYNCHRONIZATION 0x8
+#define AD_STATE_COLLECTING 0x10
+#define AD_STATE_DISTRIBUTING 0x20
+#define AD_STATE_DEFAULTED 0x40
+#define AD_STATE_EXPIRED 0x80
+
typedef struct ifbond {
__s32 bond_mode;
__s32 num_slaves;
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH iproute2-next 2/3] include/uapi: update bonding kernel header
2019-10-26 23:29 [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state Andy Roulin
2019-10-26 23:29 ` [PATCH net-next 1/3] bonding: move 3ad port state defs to include/uapi Andy Roulin
@ 2019-10-26 23:29 ` Andy Roulin
2019-10-26 23:29 ` [PATCH iproute2-next 3/3] iplink: bond: print 3ad actor/partner oper states as strings Andy Roulin
2019-10-27 1:31 ` [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state David Miller
3 siblings, 0 replies; 7+ messages in thread
From: Andy Roulin @ 2019-10-26 23:29 UTC (permalink / raw)
To: netdev; +Cc: dsahern, nikolay, roopa, j.vosburgh, vfalico, andy
The kernel now exports the 802.3ad bond slave state definitions
in uapi. This commit updates the iproute2 bonding uapi to include
these changes.
Signed-off-by: Andy Roulin <aroulin@cumulusnetworks.com>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Acked-by: Roopa Prabhu <roopa@cumulusnetworks.com>
---
include/uapi/linux/if_bonding.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/include/uapi/linux/if_bonding.h b/include/uapi/linux/if_bonding.h
index 790585f0..6829213a 100644
--- a/include/uapi/linux/if_bonding.h
+++ b/include/uapi/linux/if_bonding.h
@@ -95,6 +95,16 @@
#define BOND_XMIT_POLICY_ENCAP23 3 /* encapsulated layer 2+3 */
#define BOND_XMIT_POLICY_ENCAP34 4 /* encapsulated layer 3+4 */
+/* 802.3ad port state definitions (43.4.2.2 in the 802.3ad standard) */
+#define AD_STATE_LACP_ACTIVITY 0x1
+#define AD_STATE_LACP_TIMEOUT 0x2
+#define AD_STATE_AGGREGATION 0x4
+#define AD_STATE_SYNCHRONIZATION 0x8
+#define AD_STATE_COLLECTING 0x10
+#define AD_STATE_DISTRIBUTING 0x20
+#define AD_STATE_DEFAULTED 0x40
+#define AD_STATE_EXPIRED 0x80
+
typedef struct ifbond {
__s32 bond_mode;
__s32 num_slaves;
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH iproute2-next 3/3] iplink: bond: print 3ad actor/partner oper states as strings
2019-10-26 23:29 [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state Andy Roulin
2019-10-26 23:29 ` [PATCH net-next 1/3] bonding: move 3ad port state defs to include/uapi Andy Roulin
2019-10-26 23:29 ` [PATCH iproute2-next 2/3] include/uapi: update bonding kernel header Andy Roulin
@ 2019-10-26 23:29 ` Andy Roulin
2019-10-27 9:41 ` Nikolay Aleksandrov
2019-10-28 16:58 ` Stephen Hemminger
2019-10-27 1:31 ` [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state David Miller
3 siblings, 2 replies; 7+ messages in thread
From: Andy Roulin @ 2019-10-26 23:29 UTC (permalink / raw)
To: netdev; +Cc: dsahern, nikolay, roopa, j.vosburgh, vfalico, andy
The 802.3ad 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>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Acked-by: Roopa Prabhu <roopa@cumulusnetworks.com>
---
ip/iplink_bond_slave.c | 38 ++++++++++++++++++++++++++++++++++----
1 file changed, 34 insertions(+), 4 deletions(-)
diff --git a/ip/iplink_bond_slave.c b/ip/iplink_bond_slave.c
index 4eaf72b8..99beeca1 100644
--- a/ip/iplink_bond_slave.c
+++ b/ip/iplink_bond_slave.c
@@ -68,6 +68,28 @@ 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);
+ if (!is_json_context())
+ fprintf(fp, " <");
+#define _PF(s, str) if (state&AD_STATE_##s) { \
+ state &= ~AD_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 +128,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,
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state
2019-10-26 23:29 [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state Andy Roulin
` (2 preceding siblings ...)
2019-10-26 23:29 ` [PATCH iproute2-next 3/3] iplink: bond: print 3ad actor/partner oper states as strings Andy Roulin
@ 2019-10-27 1:31 ` David Miller
3 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2019-10-27 1:31 UTC (permalink / raw)
To: aroulin; +Cc: netdev, dsahern, nikolay, roopa, j.vosburgh, vfalico, andy
Nope, this is not how you do this.
Kernel changes and iproute2 changes must be submitted separately.
I'm tossing all of this, sorry.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH iproute2-next 3/3] iplink: bond: print 3ad actor/partner oper states as strings
2019-10-26 23:29 ` [PATCH iproute2-next 3/3] iplink: bond: print 3ad actor/partner oper states as strings Andy Roulin
@ 2019-10-27 9:41 ` Nikolay Aleksandrov
2019-10-28 16:58 ` Stephen Hemminger
1 sibling, 0 replies; 7+ messages in thread
From: Nikolay Aleksandrov @ 2019-10-27 9:41 UTC (permalink / raw)
To: Andy Roulin, netdev; +Cc: dsahern, roopa, j.vosburgh, vfalico, andy
On 27/10/2019 02:29, Andy Roulin wrote:
> The 802.3ad 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>
> Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
> Acked-by: Roopa Prabhu <roopa@cumulusnetworks.com>
> ---
> ip/iplink_bond_slave.c | 38 ++++++++++++++++++++++++++++++++++----
> 1 file changed, 34 insertions(+), 4 deletions(-)
>
> diff --git a/ip/iplink_bond_slave.c b/ip/iplink_bond_slave.c
> index 4eaf72b8..99beeca1 100644
> --- a/ip/iplink_bond_slave.c
> +++ b/ip/iplink_bond_slave.c
> @@ -68,6 +68,28 @@ 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)
> +{
> +
extra new line here
> + open_json_array(PRINT_ANY, name);
> + if (!is_json_context())
> + fprintf(fp, " <");
> +#define _PF(s, str) if (state&AD_STATE_##s) { \
> + state &= ~AD_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 +128,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,
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH iproute2-next 3/3] iplink: bond: print 3ad actor/partner oper states as strings
2019-10-26 23:29 ` [PATCH iproute2-next 3/3] iplink: bond: print 3ad actor/partner oper states as strings Andy Roulin
2019-10-27 9:41 ` Nikolay Aleksandrov
@ 2019-10-28 16:58 ` Stephen Hemminger
1 sibling, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2019-10-28 16:58 UTC (permalink / raw)
To: Andy Roulin; +Cc: netdev, dsahern, nikolay, roopa, j.vosburgh, vfalico, andy
On Sat, 26 Oct 2019 16:29:54 -0700
Andy Roulin <aroulin@cumulusnetworks.com> wrote:
> + if (!is_json_context())
> + fprintf(fp, " <");
You don't need conditional here.
Use:
print_string(PRINT_FP, NULL, " <", NULL);
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-10-28 16:58 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-26 23:29 [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state Andy Roulin
2019-10-26 23:29 ` [PATCH net-next 1/3] bonding: move 3ad port state defs to include/uapi Andy Roulin
2019-10-26 23:29 ` [PATCH iproute2-next 2/3] include/uapi: update bonding kernel header Andy Roulin
2019-10-26 23:29 ` [PATCH iproute2-next 3/3] iplink: bond: print 3ad actor/partner oper states as strings Andy Roulin
2019-10-27 9:41 ` Nikolay Aleksandrov
2019-10-28 16:58 ` Stephen Hemminger
2019-10-27 1:31 ` [PATCH iproute2-net-next 0/3] pretty-print 802.3ad slave state David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.