[dpdk-dev] [PATCH v6 02/25] ethdev: add a link status text representation
Stephen Hemminger
stephen at networkplumber.org
Mon Jul 6 23:24:19 CEST 2020
On Mon, 6 Jul 2020 23:37:16 +0300
Ivan Dyukov <i.dyukov at samsung.com> wrote:
> static int
> +rte_eth_link_strf_parser(char *str, size_t len, const char *const fmt,
> + struct rte_eth_link *link)
The link arg should be const.
> +{
> + size_t offset = 0;
> + const char *fmt_cur = fmt;
> + char *str_cur = str;
> + double gbits = (double)link->link_speed / 1000.;
> + static const char AUTONEG_STR[] = "Autoneg";
> + static const char FIXED_STR[] = "Fixed";
> + static const char FDX_STR[] = "FDX";
> + static const char HDX_STR[] = "HDX";
> + static const char UNKNOWN_STR[] = "Unknown";
> + static const char UP_STR[] = "Up";
> + static const char DOWN_STR[] = "Down";
Why are these UPPER_CASE_CONSTANTS? That does not match DPDK style.
> +
> + char gbits_str[20];
> + char mbits_str[20];
> + /* preformat complex formatting to easily concatinate it further */
Blank line between declaration and code.
> + snprintf(mbits_str, 20, "%u", link->link_speed);
> + snprintf(gbits_str, 20, "%.1f", gbits);
Use sizeof(mbits_str) which is safer and matches what youare doing.
> + /* init str before formatting */
> + str[0] = 0;
> + while (*fmt_cur) {
> + /* check str bounds */
> + if (offset > (len - 1)) {
> + str[len - 1] = '\0';
> + return -1;
> + }
> + if (*fmt_cur == '%') {
> + /* set null terminator to current position,
> + * it's required for strlcat
> + */
> + *str_cur = '\0';
> + switch (*++fmt_cur) {
> + /* Speed in Mbits/s */
> + case 'M':
> + if (link->link_speed ==
> + ETH_SPEED_NUM_UNKNOWN)
> + offset = strlcat(str, UNKNOWN_STR,
> + len);
> + else
> + offset = strlcat(str, mbits_str, len);
> + break;
> + /* Speed in Gbits/s */
> + case 'G':
> + if (link->link_speed ==
> + ETH_SPEED_NUM_UNKNOWN)
> + offset = strlcat(str, UNKNOWN_STR,
> + len);
> + else
> + offset = strlcat(str, gbits_str, len);
> + break;
> + /* Link status */
> + case 'S':
> + offset = strlcat(str, link->link_status ?
> + UP_STR : DOWN_STR, len);
> + break;
> + /* Link autoneg */
> + case 'A':
> + offset = strlcat(str, link->link_autoneg ?
> + AUTONEG_STR : FIXED_STR, len);
> + break;
> + /* Link duplex */
> + case 'D':
> + offset = strlcat(str, link->link_duplex ?
> + FDX_STR : HDX_STR, len);
> + break;
> + /* Error cases */
> + default:
> + return -1;
> +
> + }
> + if (offset > (len - 1))
> + return -1;
> +
> + str_cur = str + offset;
> + } else {
> + *str_cur++ = *fmt_cur;
> + offset++;
> + }
> + fmt_cur++;
> + }
> + *str_cur = '\0';
> + return offset;
> +}
> +
> +int
> +rte_eth_link_printf(const char *const fmt,
> + struct rte_eth_link *link)
> +{
> + char text[200];
> + int ret;
> + ret = rte_eth_link_strf(text, 200, fmt, link);
Blank line tween declaration and code.
> + if (ret > 0)
> + printf("%s", text);
> + return ret;
> +}
More information about the dev
mailing list