From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from dpdk.org (dpdk.org [92.243.14.124])
	by dpdk.space (Postfix) with ESMTP id 0ECA6A05FE
	for <public@inbox.dpdk.org>; Tue, 19 Mar 2019 06:24:02 +0100 (CET)
Received: from [92.243.14.124] (localhost [127.0.0.1])
	by dpdk.org (Postfix) with ESMTP id D27EB239;
	Tue, 19 Mar 2019 06:24:00 +0100 (CET)
Received: from mga01.intel.com (mga01.intel.com [192.55.52.88])
 by dpdk.org (Postfix) with ESMTP id 6ED54A3;
 Tue, 19 Mar 2019 06:23:59 +0100 (CET)
X-Amp-Result: SKIPPED(no attachment in message)
X-Amp-File-Uploaded: False
Received: from orsmga003.jf.intel.com ([10.7.209.27])
 by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;
 18 Mar 2019 22:23:58 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="5.58,496,1544515200"; d="scan'208";a="135229705"
Received: from pgsmsx108.gar.corp.intel.com ([10.221.44.103])
 by orsmga003.jf.intel.com with ESMTP; 18 Mar 2019 22:23:56 -0700
Received: from pgsmsx103.gar.corp.intel.com ([169.254.2.210]) by
 PGSMSX108.gar.corp.intel.com ([169.254.8.195]) with mapi id 14.03.0415.000;
 Tue, 19 Mar 2019 13:23:55 +0800
From: "Zhao1, Wei" <wei.zhao1@intel.com>
To: "dev@dpdk.org" <dev@dpdk.org>
CC: "stable@dpdk.org" <stable@dpdk.org>, "Zhang, Qi Z" <qi.z.zhang@intel.com>, 
 "Lu, Wenzhuo" <wenzhuo.lu@intel.com>, "Ananyev, Konstantin"
 <konstantin.ananyev@intel.com>, "Peng, Yuan" <yuan.peng@intel.com>, "Yigit,
 Ferruh" <ferruh.yigit@intel.com>
Thread-Topic: [PATCH v2] app/testpmd: fix support of hex string parser for
 flow API
Thread-Index: AQHU3Wa6C/6IvmjBv0O55SXq9+6icKYSbJsQ
Date: Tue, 19 Mar 2019 05:23:55 +0000
Message-ID:
 <A2573D2ACFCADC41BB3BE09C6DE313CA07EC77F5@PGSMSX103.gar.corp.intel.com>
References: <1552639435-68184-1-git-send-email-wei.zhao1@intel.com>
 <1552896961-33681-1-git-send-email-wei.zhao1@intel.com>
In-Reply-To: <1552896961-33681-1-git-send-email-wei.zhao1@intel.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
dlp-product: dlpe-windows
dlp-version: 11.0.400.15
dlp-reaction: no-action
x-originating-ip: [172.30.20.205]
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Subject: Re: [dpdk-dev] [PATCH v2] app/testpmd: fix support of hex string
 parser for flow API
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>
Message-ID: <20190319052355.0uiptBkJA0IiVNt44TncQlY8mZz9xR6CmNxOI-kOBKk@z>

Send on behalf of pengyuan
Tested-by: Peng Yuan <yuan.peng@intel.com>




- Tested Branch: master
- Tested Commit: 239912fa798e6e671072ca7ff987afd74c1e506c
- OS: 4.13.9-300.fc27.x86_64
- GCC: gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
- CPU: Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
- NIC: Intel Corporation Device Fortville [8086:1583]
- Default x86_64-native-linuxapp-gcc configuration
- Prerequisites:
- Total 1 case1, 1 passed, 0 failed

- Case steps:
1. Bind the pf port to dpdk driver:
./usertools/dpdk-devbind.py -b igb_uio 05:00.0 05:00.1
2. start testpmd:
./x86_64-native-linuxapp-gcc/app/testpmd -c 1ffff -n 4 - -i --nb-cores=3D8 =
--rxq=3D4 --txq=3D4 --port-topology=3Dchained

3.    testpmd> flow create 0 ingress pattern end actions rss types ipv4-udp=
 end key 1234567890123456789012345678901234567890FFFFFFFFFFFF12345678901234=
56789012345678901234567890FFFFFFFFFFFF / end
    testpmd> show port 0 rss-hash key
    RSS functions:
     ipv4-udp udp
    RSS key:
    1234567890123456789012345678901234567890FFFFFFFFFFFF1234567890123456789=
012345678901234567890FFFFFFFFFFFF

52bytes key can be set successfully.

> -----Original Message-----
> From: Zhao1, Wei
> Sent: Monday, March 18, 2019 4:16 PM
> To: dev@dpdk.org
> Cc: stable@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; Zhao1, Wei <wei.zhao1@intel.com>
> Subject: [PATCH v2] app/testpmd: fix support of hex string parser for flo=
w
> API
>=20
> There is need for users to set configuration of HEX number for RSS key. T=
he
> key byte should be pass down as hex number not as char string. This patch
> enable cmdline flow parse HEX number, in order to not using string which
> pass ASIC number.
>=20
> Fixes: f4d623f96119 ("app/testpmd: fix missing RSS fields in flow action"=
)
> Cc: stable@dpdk.org
>=20
> Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
>=20
> ---
>=20
> v2:
> fix bug of string length limite.
> ---
>  app/test-pmd/cmdline_flow.c | 146
> +++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 145 insertions(+), 1 deletion(-)
>=20
> diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
> index 36659a6..7d263c6 100644
> --- a/app/test-pmd/cmdline_flow.c
> +++ b/app/test-pmd/cmdline_flow.c
> @@ -35,6 +35,7 @@ enum index {
>  	PREFIX,
>  	BOOLEAN,
>  	STRING,
> +	HEX,
>  	MAC_ADDR,
>  	IPV4_ADDR,
>  	IPV6_ADDR,
> @@ -1122,6 +1123,9 @@ static int parse_boolean(struct context *, const
> struct token *,  static int parse_string(struct context *, const struct t=
oken *,
>  			const char *, unsigned int,
>  			void *, unsigned int);
> +static int parse_hex(struct context *ctx, const struct token *token,
> +			const char *str, unsigned int len,
> +			void *buf, unsigned int size);
>  static int parse_mac_addr(struct context *, const struct token *,
>  			  const char *, unsigned int,
>  			  void *, unsigned int);
> @@ -1198,6 +1202,13 @@ static const struct token token_list[] =3D {
>  		.call =3D parse_string,
>  		.comp =3D comp_none,
>  	},
> +	[HEX] =3D {
> +		.name =3D "{hex}",
> +		.type =3D "HEX",
> +		.help =3D "fixed string",
> +		.call =3D parse_hex,
> +		.comp =3D comp_none,
> +	},
>  	[MAC_ADDR] =3D {
>  		.name =3D "{MAC address}",
>  		.type =3D "MAC-48",
> @@ -2306,7 +2317,7 @@ static const struct token token_list[] =3D {
>  	[ACTION_RSS_KEY] =3D {
>  		.name =3D "key",
>  		.help =3D "RSS hash key",
> -		.next =3D NEXT(action_rss, NEXT_ENTRY(STRING)),
> +		.next =3D NEXT(action_rss, NEXT_ENTRY(HEX)),
>  		.args =3D ARGS(ARGS_ENTRY_ARB(0, 0),
>  			     ARGS_ENTRY_ARB
>  			     (offsetof(struct action_rss_data, conf) + @@ -
> 4475,6 +4486,139 @@ parse_string(struct context *ctx, const struct token
> *token,
>  	return -1;
>  }
>=20
> +static uint32_t
> +get_hex_val(char c)
> +{
> +	switch (c) {
> +	case '0': case '1': case '2': case '3': case '4': case '5':
> +	case '6': case '7': case '8': case '9':
> +		return c - '0';
> +	case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
> +		return c - 'A' + 10;
> +	case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
> +		return c - 'a' + 10;
> +	default:
> +		return 0;
> +	}
> +}
> +
> +static int
> +parse_hex_string(const char *src, uint8_t *dst, uint32_t *size) {
> +	const char *c;
> +	uint32_t i;
> +
> +	/* Check input parameters */
> +	if ((src =3D=3D NULL) ||
> +		(dst =3D=3D NULL) ||
> +		(size =3D=3D NULL) ||
> +		(*size =3D=3D 0))
> +		return -1;
> +	if ((*size & 1) !=3D 0)
> +		return -1;
> +
> +	for (c =3D src, i =3D 0; i < *size; c++, i++) {
> +		if ((((*c) >=3D '0') && ((*c) <=3D '9')) ||
> +			(((*c) >=3D 'A') && ((*c) <=3D 'F')) ||
> +			(((*c) >=3D 'a') && ((*c) <=3D 'f')))
> +			continue;
> +
> +		return -1;
> +	}
> +	*size =3D *size / 2;
> +
> +	/* Convert chars to bytes */
> +	for (i =3D 0; i < *size; i++)
> +		dst[i] =3D get_hex_val(src[2 * i]) * 16 +
> +			get_hex_val(src[2 * i + 1]);
> +
> +	return 0;
> +}
> +
> +static int
> +parse_hex(struct context *ctx, const struct token *token,
> +		const char *str, unsigned int len,
> +		void *buf, unsigned int size)
> +{
> +	const struct arg *arg_data =3D pop_args(ctx);
> +	const struct arg *arg_len =3D pop_args(ctx);
> +	const struct arg *arg_addr =3D pop_args(ctx);
> +	char tmp[16]; /* Ought to be enough. */
> +	int ret;
> +	unsigned int hexlen =3D len;
> +	unsigned int length =3D 256;
> +	uint8_t hex_tmp[length];
> +
> +	/* Arguments are expected. */
> +	if (!arg_data)
> +		return -1;
> +	if (!arg_len) {
> +		push_args(ctx, arg_data);
> +		return -1;
> +	}
> +	if (!arg_addr) {
> +		push_args(ctx, arg_len);
> +		push_args(ctx, arg_data);
> +		return -1;
> +	}
> +	size =3D arg_data->size;
> +	/* Bit-mask fill is not supported. */
> +	if (arg_data->mask)
> +		goto error;
> +	if (!ctx->object)
> +		return len;
> +
> +	/* translate bytes string to array. */
> +	if (str[0] =3D=3D '0' && ((str[1] =3D=3D 'x') ||
> +			(str[1] =3D=3D 'X'))) {
> +		str +=3D 2;
> +		hexlen -=3D 2;
> +	}
> +	if (hexlen > length)
> +		return -1;
> +	ret =3D parse_hex_string(str, hex_tmp, &hexlen);
> +	if (ret < 0)
> +		goto error;
> +	/* Let parse_int() fill length information first. */
> +	ret =3D snprintf(tmp, sizeof(tmp), "%u", hexlen);
> +	if (ret < 0)
> +		goto error;
> +	push_args(ctx, arg_len);
> +	ret =3D parse_int(ctx, token, tmp, ret, NULL, 0);
> +	if (ret < 0) {
> +		pop_args(ctx);
> +		goto error;
> +	}
> +	buf =3D (uint8_t *)ctx->object + arg_data->offset;
> +	/* Output buffer is not necessarily NUL-terminated. */
> +	memcpy(buf, hex_tmp, hexlen);
> +	memset((uint8_t *)buf + len, 0x00, size - hexlen);
> +	if (ctx->objmask)
> +		memset((uint8_t *)ctx->objmask + arg_data->offset,
> +					0xff, hexlen);
> +	/* Save address if requested. */
> +	if (arg_addr->size) {
> +		memcpy((uint8_t *)ctx->object + arg_addr->offset,
> +		       (void *[]){
> +			(uint8_t *)ctx->object + arg_data->offset
> +		       },
> +		       arg_addr->size);
> +		if (ctx->objmask)
> +			memcpy((uint8_t *)ctx->objmask + arg_addr->offset,
> +			       (void *[]){
> +				(uint8_t *)ctx->objmask + arg_data->offset
> +			       },
> +			       arg_addr->size);
> +	}
> +	return len;
> +error:
> +	push_args(ctx, arg_addr);
> +	push_args(ctx, arg_len);
> +	push_args(ctx, arg_data);
> +	return -1;
> +
> +}
> +
>  /**
>   * Parse a MAC address.
>   *
> --
> 2.7.5