[dpdk-dev] [PATCH v9 02/24] ethdev: add a link status text representation
Gaëtan Rivet
grive at u256.net
Tue Aug 11 13:02:41 CEST 2020
On 11/08/20 11:52 +0300, Ivan Dyukov wrote:
> Link status structure keeps complicated values which are hard to
> represent to end user. e.g. link_speed has INT_MAX value which
> means that speed is unknown, link_duplex equal to 0 means
> 'half-duplex' etc. To simplify processing of the values
> in application, new dpdk function is introduced.
>
> This commit adds function which treat link status structure
> and format it to text representation. User may create custom
> link status string using format string. If format string is NULL,
> the function construct standard link status string.
>
> Signed-off-by: Ivan Dyukov <i.dyukov at samsung.com>
Hello Ivan,
I don't see much difference for this patch, from what I read in previous
thread on the principle it does not seem motivated enough?
I'd have a few nits on the implementation, but on the principle: I think
this can be an incentive to get properly formatted port status strings.
The API is a little awkward however, and it is definitely complex to
maintain a format-based function. I think we could do without.
I've tried a smaller alternative.
+ simpler to use.
+ simpler to maintain.
+ safer in general.
+ no need to declare local string to store intermediate output.
- one ugly macro.
@Thomas, Stephen: would something like this be easier to accept
in librte_ethdev?
index d79699e2ed..9d72a0b70e 100644
--- a/examples/ip_pipeline/cli.c
+++ b/examples/ip_pipeline/cli.c
@@ -273,13 +273,13 @@ print_link_info(struct link *link, char *out, size_t out_size)
"\n"
"%s: flags=<%s> mtu %u\n"
"\tether %02X:%02X:%02X:%02X:%02X:%02X rxqueues %u txqueues %u\n"
- "\tport# %u speed %u Mbps\n"
+ "\tport# %u speed %s\n"
"\tRX packets %" PRIu64" bytes %" PRIu64"\n"
"\tRX errors %" PRIu64" missed %" PRIu64" no-mbuf %" PRIu64"\n"
"\tTX packets %" PRIu64" bytes %" PRIu64"\n"
"\tTX errors %" PRIu64"\n",
link->name,
- eth_link.link_status == 0 ? "DOWN" : "UP",
+ rte_eth_link_status_str(eth_link.link_status),
mtu,
mac_addr.addr_bytes[0], mac_addr.addr_bytes[1],
mac_addr.addr_bytes[2], mac_addr.addr_bytes[3],
@@ -287,7 +287,7 @@ print_link_info(struct link *link, char *out, size_t out_size)
link->n_rxq,
link->n_txq,
link->port_id,
- eth_link.link_speed,
+ rte_eth_link_speed_str(eth_link.link_speed),
stats.ipackets,
stats.ibytes,
stats.ierrors,
diff --git a/examples/ipv4_multicast/main.c b/examples/ipv4_multicast/main.c
index 7e255c35a3..1350313ee9 100644
--- a/examples/ipv4_multicast/main.c
+++ b/examples/ipv4_multicast/main.c
@@ -591,14 +591,8 @@ check_all_ports_link_status(uint32_t port_mask)
}
/* print link status if flag set */
if (print_flag == 1) {
- if (link.link_status)
- printf(
- "Port%d Link Up. Speed %u Mbps - %s\n",
- portid, link.link_speed,
- (link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
- ("full-duplex") : ("half-duplex"));
- else
- printf("Port %d Link Down\n", portid);
+ printf("Port %s " RTE_ETH_LINK_FMT "\n",
+ RTE_ETH_LINK_STR(link));
continue;
}
/* clear all_ports_up flag if any link down */
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index 57e4a6ca58..f81e876d49 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -4993,6 +4993,102 @@ rte_eth_tx_buffer(uint16_t port_id, uint16_t queue_id,
return rte_eth_tx_buffer_flush(port_id, queue_id, buffer);
}
+/**
+ * Missing: doc.
+ */
+static inline const char *
+rte_eth_link_speed_str(uint32_t speed)
+{
+ struct {
+ const char *str;
+ uint32_t speed;
+ } speed_str_map[] = {
+ { "Unknown", ETH_SPEED_NUM_NONE },
+ { "10 Mbps", ETH_SPEED_NUM_10M },
+ { "100 Mbps", ETH_SPEED_NUM_100M },
+ { "1 Gbps", ETH_SPEED_NUM_1G },
+ { "2.5 Gbps", ETH_SPEED_NUM_2_5G },
+ { "5 Gbps", ETH_SPEED_NUM_5G },
+ { "10 Gbps", ETH_SPEED_NUM_10G },
+ { "20 Gbps", ETH_SPEED_NUM_20G },
+ { "25 Gbps", ETH_SPEED_NUM_25G },
+ { "40 Gbps", ETH_SPEED_NUM_40G },
+ { "50 Gbps", ETH_SPEED_NUM_50G },
+ { "56 Gbps", ETH_SPEED_NUM_56G },
+ { "100 Gbps", ETH_SPEED_NUM_100G },
+ { "200 Gbps", ETH_SPEED_NUM_200G },
+ };
+ size_t i;
+
+ for (i = 0; i < RTE_DIM(speed_str_map); i++) {
+ if (speed == speed_str_map[i].speed)
+ return speed_str_map[i].str;
+ }
+
+ return speed_str_map[0].str;
+}
+
+/**
+ * Missing: doc.
+ */
+static inline const char *
+rte_eth_link_duplex_str(uint16_t duplex)
+{
+ const char *str[] = {
+ [0] = "HDX",
+ [1] = "FDX",
+ };
+
+ return str[!!duplex];
+}
+
+/**
+ * Missing: doc.
+ */
+static inline const char *
+rte_eth_link_autoneg_str(uint16_t autoneg)
+{
+ const char *str[] = {
+ [0] = "Fixed",
+ [1] = "Autoneg",
+ };
+
+ return str[!!autoneg];
+}
+
+/**
+ * Missing: doc.
+ */
+static inline const char *
+rte_eth_link_status_str(uint16_t status)
+{
+ const char *str[] = {
+ [0] = "Down",
+ [1] = "Up",
+ };
+
+ return str[!!status];
+}
+
+/* internal. */
+#define RTE_ETH_LINK_DOWN_OR_WHAT_(link, what, sep) \
+ ((link).link_status == ETH_LINK_DOWN ? "" : (what)), \
+ ((link).link_status == ETH_LINK_DOWN ? "" : (sep)) \
+
+/**
+ * Missing: doc.
+ */
+#define RTE_ETH_LINK_FMT "%s%s%s%s%s%s"
+
+/**
+ * Missing: doc.
+ */
+#define RTE_ETH_LINK_STR(link) \
+ ((link).link_status == ETH_LINK_DOWN ? "Link down" : "Link up at "), \
+ RTE_ETH_LINK_DOWN_OR_WHAT_(link, rte_eth_link_speed_str((link).link_speed), " "), \
+ RTE_ETH_LINK_DOWN_OR_WHAT_(link, rte_eth_link_duplex_str((link).link_duplex), " "), \
+ RTE_ETH_LINK_DOWN_OR_WHAT_(link, rte_eth_link_autoneg_str((link).link_autoneg), "")
+
#ifdef __cplusplus
}
#endif
--
Gaëtan
More information about the dev
mailing list