[dpdk-dev] [PATCH v7 02/25] ethdev: add a link status text representation

Yigit, Ferruh ferruh.yigit at intel.com
Fri Jul 10 21:01:23 CEST 2020


> Subject: Re: [PATCH v7 02/25] ethdev: add a link status text representation
> 
> 10.07.2020 16:06, Yigit, Ferruh пишет:
> > On 7/10/2020 8:02 AM, Ivan Dyukov wrote:
> >> This commit add function which treat link status structure and format
> >> it to text representation.
> >>
> >> Signed-off-by: Ivan Dyukov <i.dyukov at samsung.com>
> > <...>
> >
> >> +static int
> >> +rte_eth_link_strf_parser(char *str, size_t len, const char *const fmt,
> >> +			   const struct rte_eth_link *link) {
> >> +	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";
> >> +	char gbits_str[20];
> >> +	char mbits_str[20];
> >> +
> >> +	/* preformat complex formatting to easily concatinate it further */
> >> +	snprintf(mbits_str, sizeof(mbits_str), "%u", link->link_speed);
> >> +	snprintf(gbits_str, sizeof(gbits_str), "%.1f", gbits);
> >> +	/* 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;
> >> +			/* ignore unknown specifier */
> >> +			default:
> >> +				*str_cur = '%';
> >> +				offset++;
> >> +				fmt_cur--;
> >> +				break;
> > What do you think ignoring the unknown specifiers and keep continue
> > processing the string, instead of break? Just keep unknown specifier
> > as it is in the output string.
> yep. it's exactly what code do.  break exit from the switch but not from string
> processing.  I have unit tests for this case. They  work fine.
> Please review unit tests and send me more cases if they need to be tested.

yes it does as you explained, I miss read it, so it is good, please ignore this comment. 



More information about the dev mailing list