diff options
-rw-r--r-- | devlink/devlink.c | 2 | ||||
-rw-r--r-- | include/uapi/linux/pkt_cls.h | 4 | ||||
-rw-r--r-- | man/man8/bridge.8 | 14 | ||||
-rw-r--r-- | man/man8/ip-route.8.in | 10 | ||||
-rw-r--r-- | misc/ss.c | 11 | ||||
-rw-r--r-- | tc/q_taprio.c | 91 |
6 files changed, 82 insertions, 50 deletions
diff --git a/devlink/devlink.c b/devlink/devlink.c index fe69f53c..616720a9 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -4860,7 +4860,7 @@ static int cmd_port_param_show(struct dl *dl) static void cmd_port_function_help(void) { - pr_err("Usage: devlink port function set DEV/PORT_INDEX [ hw_addr ADDR ] [ state STATE ]\n"); + pr_err("Usage: devlink port function set DEV/PORT_INDEX [ hw_addr ADDR ] [ state { active | inactive } ]\n"); pr_err(" [ roce { enable | disable } ] [ migratable { enable | disable } ]\n"); pr_err(" devlink port function rate { help | show | add | del | set }\n"); } diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h index 75506f15..c7082cc6 100644 --- a/include/uapi/linux/pkt_cls.h +++ b/include/uapi/linux/pkt_cls.h @@ -713,9 +713,11 @@ enum { TCA_FLOWER_KEY_CFM_OPT_UNSPEC, TCA_FLOWER_KEY_CFM_MD_LEVEL, TCA_FLOWER_KEY_CFM_OPCODE, - TCA_FLOWER_KEY_CFM_OPT_MAX, + __TCA_FLOWER_KEY_CFM_OPT_MAX, }; +#define TCA_FLOWER_KEY_CFM_OPT_MAX (__TCA_FLOWER_KEY_CFM_OPT_MAX - 1) + #define TCA_FLOWER_MASK_FLAGS_RANGE (1 << 0) /* Range-based match */ /* Match-all classifier */ diff --git a/man/man8/bridge.8 b/man/man8/bridge.8 index dd0659d3..c52c9331 100644 --- a/man/man8/bridge.8 +++ b/man/man8/bridge.8 @@ -68,7 +68,9 @@ bridge \- show / manipulate bridge addresses and devices .ti -8 .BR "bridge link" " [ " show " ] [ " .B dev -.IR DEV " ]" +.IR DEV " ] [" +.B master +.IR DEVICE " ]" .ti -8 .BR "bridge fdb" " { " add " | " append " | " del " | " replace " } " @@ -670,9 +672,15 @@ display current time when using monitor option. .SS bridge link show - list ports configuration for all bridges. -This command displays port configuration and flags for all bridges. +This command displays ports configuration and flags for all bridges by default. + +.TP +.BI dev " DEV" +only display the specific bridge port named DEV. -To display port configuration and flags for a specific bridge, use the +.TP +.BI master " DEVICE" +only display ports of the bridge named DEVICE. This is similar to "ip link show master <bridge_device>" command. .SH bridge fdb - forwarding database management diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in index 76151689..7a97d744 100644 --- a/man/man8/ip-route.8.in +++ b/man/man8/ip-route.8.in @@ -866,10 +866,16 @@ See \fBFlavors parameters\fR section. .B End.X nh6 .I NEXTHOP +.RB [ " flavors " +.IR FLAVORS " ] " - Regular SRv6 processing as intermediate segment endpoint. Additionally, forward processed packets to given next-hop. This action only accepts packets with a non-zero Segments Left -value. Other matching packets are dropped. +value. Other matching packets are dropped. The presence of flavors +can change the regular processing of an End.X behavior according to +the user-provided Flavor operations and information carried in the packet. +See \fBFlavors parameters\fR section. + .B End.DX6 nh6 .I NEXTHOP @@ -977,7 +983,7 @@ subset of the existing behaviors. removes (i.e. pops) the SRH from the IPv6 header. The PSP operation takes place only at a penultimate SR Segment Endpoint node (e.g., the Segment Left must be one) and does not happen at non-penultimate -endpoint nodes. +endpoint nodes. This flavor is currently only supported by End behavior. .B usp - Ultimate Segment Pop of the SRH (not yet supported in kernel) @@ -2983,12 +2983,6 @@ static void tcp_tls_conf(const char *name, struct rtattr *attr) } } -static void tcp_tls_zc_sendfile(struct rtattr *attr) -{ - if (attr) - out(" zc_ro_tx"); -} - static void mptcp_subflow_info(struct rtattr *tb[]) { u_int32_t flags = 0; @@ -3219,7 +3213,10 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r, tcp_tls_cipher(tlsinfo[TLS_INFO_CIPHER]); tcp_tls_conf("rxconf", tlsinfo[TLS_INFO_RXCONF]); tcp_tls_conf("txconf", tlsinfo[TLS_INFO_TXCONF]); - tcp_tls_zc_sendfile(tlsinfo[TLS_INFO_ZC_RO_TX]); + if (!!tlsinfo[TLS_INFO_ZC_RO_TX]) + out(" zc_ro_tx"); + if (!!tlsinfo[TLS_INFO_RX_NO_PAD]) + out(" no_pad_rx"); } if (ulpinfo[INET_ULP_INFO_MPTCP]) { struct rtattr *sfinfo[MPTCP_SUBFLOW_ATTR_MAX + 1] = diff --git a/tc/q_taprio.c b/tc/q_taprio.c index 913197f6..ef8fc7a0 100644 --- a/tc/q_taprio.c +++ b/tc/q_taprio.c @@ -416,14 +416,11 @@ static int taprio_parse_opt(struct qdisc_util *qu, int argc, return 0; } -static int print_sched_list(FILE *f, struct rtattr *list) +static void print_sched_list(FILE *f, struct rtattr *list) { - struct rtattr *item; + struct rtattr *item, *nla; int rem; - if (list == NULL) - return 0; - rem = RTA_PAYLOAD(list); open_json_array(PRINT_JSON, "schedule"); @@ -432,60 +429,82 @@ static int print_sched_list(FILE *f, struct rtattr *list) for (item = RTA_DATA(list); RTA_OK(item, rem); item = RTA_NEXT(item, rem)) { struct rtattr *tb[TCA_TAPRIO_SCHED_ENTRY_MAX + 1]; - __u32 index = 0, gatemask = 0, interval = 0; - __u8 command = 0; parse_rtattr_nested(tb, TCA_TAPRIO_SCHED_ENTRY_MAX, item); - if (tb[TCA_TAPRIO_SCHED_ENTRY_INDEX]) - index = rta_getattr_u32(tb[TCA_TAPRIO_SCHED_ENTRY_INDEX]); + open_json_object(NULL); - if (tb[TCA_TAPRIO_SCHED_ENTRY_CMD]) - command = rta_getattr_u8(tb[TCA_TAPRIO_SCHED_ENTRY_CMD]); + nla = tb[TCA_TAPRIO_SCHED_ENTRY_INDEX]; + if (nla) { + __u32 index = rta_getattr_u32(nla); - if (tb[TCA_TAPRIO_SCHED_ENTRY_GATE_MASK]) - gatemask = rta_getattr_u32(tb[TCA_TAPRIO_SCHED_ENTRY_GATE_MASK]); + print_uint(PRINT_ANY, "index", "\tindex %u", index); + } - if (tb[TCA_TAPRIO_SCHED_ENTRY_INTERVAL]) - interval = rta_getattr_u32(tb[TCA_TAPRIO_SCHED_ENTRY_INTERVAL]); + nla = tb[TCA_TAPRIO_SCHED_ENTRY_CMD]; + if (nla) { + __u8 command = rta_getattr_u8(nla); + + print_string(PRINT_ANY, "cmd", " cmd %s", + entry_cmd_to_str(command)); + } + + nla = tb[TCA_TAPRIO_SCHED_ENTRY_GATE_MASK]; + if (nla) { + __u32 gatemask = rta_getattr_u32(nla); + + print_0xhex(PRINT_ANY, "gatemask", " gatemask %#llx", + gatemask); + } + + nla = tb[TCA_TAPRIO_SCHED_ENTRY_INTERVAL]; + if (nla) { + __u32 interval = rta_getattr_u32(nla); + + print_uint(PRINT_ANY, "interval", " interval %u", + interval); + } - open_json_object(NULL); - print_uint(PRINT_ANY, "index", "\tindex %u", index); - print_string(PRINT_ANY, "cmd", " cmd %s", entry_cmd_to_str(command)); - print_0xhex(PRINT_ANY, "gatemask", " gatemask %#llx", gatemask); - print_uint(PRINT_ANY, "interval", " interval %u", interval); close_json_object(); print_nl(); } close_json_array(PRINT_ANY, ""); - - return 0; } static int print_schedule(FILE *f, struct rtattr **tb) { - int64_t base_time = 0, cycle_time = 0, cycle_time_extension = 0; + struct rtattr *nla; - if (tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]) - base_time = rta_getattr_s64(tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]); + nla = tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]; + if (nla) { + int64_t base_time = rta_getattr_s64(nla); - if (tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME]) - cycle_time = rta_getattr_s64(tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME]); + print_lluint(PRINT_ANY, "base_time", "\tbase-time %lld", + base_time); + } - if (tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION]) - cycle_time_extension = rta_getattr_s64( - tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION]); + nla = tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME]; + if (nla) { + int64_t cycle_time = rta_getattr_s64(nla); - print_lluint(PRINT_ANY, "base_time", "\tbase-time %lld", base_time); + print_lluint(PRINT_ANY, "cycle_time", " cycle-time %lld", + cycle_time); + } - print_lluint(PRINT_ANY, "cycle_time", " cycle-time %lld", cycle_time); + nla = tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION]; + if (nla) { + int64_t cycle_time_extension = rta_getattr_s64(nla); - print_lluint(PRINT_ANY, "cycle_time_extension", - " cycle-time-extension %lld", cycle_time_extension); + print_lluint(PRINT_ANY, "cycle_time_extension", + " cycle-time-extension %lld", + cycle_time_extension); + } - print_sched_list(f, tb[TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]); + nla = tb[TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]; + if (nla) + print_sched_list(f, nla); return 0; } @@ -635,7 +654,7 @@ static int taprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) parse_rtattr_nested(t, TCA_TAPRIO_ATTR_MAX, tb[TCA_TAPRIO_ATTR_ADMIN_SCHED]); - open_json_object(NULL); + open_json_object("admin"); print_schedule(f, t); |