From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D8154A00BE; Mon, 27 Apr 2020 11:19:19 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 086B31C21E; Mon, 27 Apr 2020 11:19:19 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 5E7B11C20D for ; Mon, 27 Apr 2020 11:19:17 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03R9GPff001033; Mon, 27 Apr 2020 02:19:16 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-transfer-encoding : mime-version; s=pfpt0818; bh=icbYhOqaFHknV9/i/G/6vU6XFkUmAfYpsJtB0NtORqo=; b=qeF0K5NXHAu+1P73hATOi/kBVwRJWwFundsluNaCzqfnGq8RwcDTG3aT8GgkMUBEeE6q QUJB4t7khW72pMGtKGE6drHiR/M4tpyLMkLPmX7gzIDj+ZjxdjUb7VSUWLVI7codrSVA uH+hIR2ggXVdlcAaFiSfAfIRsETIdnEnOAaejXnrN4/snig6ofV9FDMuTyGPK4pu5O9+ 2GrnzOXdQdmt4H7+3edY3/CeB20GcaF50uS4sUcdPRQ1F37jIsc0OIrKtgbE3GCMvFQr grnqpUKhAceSszVJFXZPPqzKcGLFDxHc7MDbmjPlYH5r28XhKtHFENCiJxZZxwQ30xKG jg== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0a-0016f401.pphosted.com with ESMTP id 30mjjq6x0b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 27 Apr 2020 02:19:16 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 27 Apr 2020 02:19:14 -0700 Received: from SC-EXCH02.marvell.com (10.93.176.82) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 27 Apr 2020 02:19:14 -0700 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.177) by SC-EXCH02.marvell.com (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2 via Frontend Transport; Mon, 27 Apr 2020 02:19:13 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EUgTqfza/c4LJCIdemk5e6UF/5pK5+JR5mZbLGX2GK7r1wcBic4LYeIUIuetXUXlH2ZrUEizmwcgrEhFrH/bd5H2EPBpV56i8NTdHVm/dXHXKDEPDeS8NxGio1Utgz3UMv/+4+mdP4WWj+lziQW7RFVNZzwcQwsPxzYY7Ro/6ZFSHynUNen/aJhcDgC+5bz5O94dZ10KCnGnEu4R8OcguaZqrtrEyTmTqdNaxvC8kgA5u7sMIYA1NBN6VEctlEXwBzrb7h9AxmVkunYTONnG9YXedcRshcFPdrMIsfS/1Z0FCOB7N3/nLSn3S1Z44eVqwaGrzqfrDDUi26fxuqyykQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=icbYhOqaFHknV9/i/G/6vU6XFkUmAfYpsJtB0NtORqo=; b=RDxhDw7CRdxSq4hNE9LuMpboA3Y1kHANTEsZWlID3xBWSFlxec4wD3dU+g/hvX4vX6juCOGzm3ixABQi1kv6qwRyQQdWaQ+n7t2F2DxoxZeZ0NweO7SsvzinSGVH4f95+MdL0Ke1Xd9Lylyn9blZc4DlB0lFuJcyN92LpgPs2OKCvrltzyHO7mAuWCEZbHL/sohA1YIWd4uE3t4ep15PiQ/Ycv6v4vwn7QV9bHfsZUWyqZf13II50Mff/RWTnruY1w0l4fgpnRyvGW6qDCQyCEDlj02qbno974WIV8RYRB9c3Zdchczxd2EP5INmFazGHRmQM7Gdj2b9tUGeQ6PIRA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com; dkim=pass header.d=marvell.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector1-marvell-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=icbYhOqaFHknV9/i/G/6vU6XFkUmAfYpsJtB0NtORqo=; b=GkrcZoKp32A10MZXRt4zD0rp7dEsNWp5+C2NRg2jgBl4FX4+5r/jmOE0l1Ee4e221RZbxtu24Du0KdRMsboQaRFLw4RitleASGSyJRkqTHvXioNyesV/dYw68Qz8v27np37AxIOVb8T7xuts28q/y2sX6313P3EhiY/PAUkw1ec= Received: from BY5PR18MB3105.namprd18.prod.outlook.com (2603:10b6:a03:1a4::30) by BY5PR18MB3108.namprd18.prod.outlook.com (2603:10b6:a03:1ab::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13; Mon, 27 Apr 2020 09:19:11 +0000 Received: from BY5PR18MB3105.namprd18.prod.outlook.com ([fe80::cc6:c7ae:dc40:7ddf]) by BY5PR18MB3105.namprd18.prod.outlook.com ([fe80::cc6:c7ae:dc40:7ddf%7]) with mapi id 15.20.2937.023; Mon, 27 Apr 2020 09:19:11 +0000 From: Sunil Kumar Kori To: Pavan Nikhilesh Bhagavatula , "Jerin Jacob Kollanukkaran" , "thomas@monjalon.net" , John McNamara , "Marko Kovacevic" , Ori Kam , "Bruce Richardson" , Radu Nicolau , Akhil Goyal , Tomasz Kantecki , Pavan Nikhilesh Bhagavatula CC: "Andrzej Ostruszka [C]" , "dev@dpdk.org" , Vamsi Krishna Attunuru Thread-Topic: [dpdk-dev] [PATCH v3] examples/l2fwd: add cmdline option for forwarding port info Thread-Index: AQHWHGna27h1tykXHkKy9dQEtJw+JqiMo/XA Date: Mon, 27 Apr 2020 09:19:11 +0000 Message-ID: References: <20200405035243.8726-1-vattunuru@marvell.com> <20200427075944.1314-1-pbhagavatula@marvell.com> In-Reply-To: <20200427075944.1314-1-pbhagavatula@marvell.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [2401:4900:1690:2160:48ed:8f1c:ba81:cee2] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 2a908a4d-d5d3-42fa-ed09-08d7ea8c0c50 x-ms-traffictypediagnostic: BY5PR18MB3108: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:655; x-forefront-prvs: 0386B406AA x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BY5PR18MB3105.namprd18.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(396003)(346002)(366004)(39850400004)(376002)(136003)(4326008)(55016002)(8676002)(110136005)(54906003)(2906002)(81156014)(71200400001)(9686003)(5660300002)(33656002)(478600001)(316002)(86362001)(30864003)(76116006)(8936002)(7696005)(66556008)(6506007)(64756008)(52536014)(6636002)(107886003)(66946007)(66476007)(66446008)(186003)(921003); DIR:OUT; SFP:1101; received-spf: None (protection.outlook.com: marvell.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 5I4id2ZrM97ZAj/E2U3/E0KCVcKeWjS0vYK+Gp1cdg7pctY2cN3AaGyUTpTYYXR0fNGaNQH5qNsOp1E6VFngRIot9FKc9fRGTDnDigQWG5SPCAJshl4cPP+Qr9vXbtMDW7G3Eq1MfjvCGsoJKJJzSkL/TZRhtEydKqXoOQ+SnkbuL5y8Y7gVXepWxI9KnaPfC6yMi51+T7yHnjNLJ09ypsC3iA9cqwI0kLgXoDhLHqldlbD/HQpT6mRvQG7zADbyJqCGodmnoLQFV51p5/5cqbHSa6YwWS50waRNokZTeBcIcHoBpServbWJJSUsHqfJWxC+UEPFbGBdCyYVrmNhk4se7L36CkgnKH8R07aOQjd+qC7rrqNto/fqsm3mhwEFgh5uKcT0jvEmD65w4l2K5oMJknV7IQADi0BoOYnSoexnLtM726kh5dfNTE74gx+zl2uTruFGf2YUtcQ0/xF9KiokolE/rKCTzfwHbUTW43Y= x-ms-exchange-antispam-messagedata: UmaDPwv8kuEMcNe3EwkjY/LzWl2+kiNAzOuJm6hcZS7uAqW/OvWnRoKHUbBGvO5bcXLqCV4arkYMHaGyuvmfHCuS4O/FjP7+oo5UUiuNALJ6fgcjyYIKofAqhxBzlWQC2ttVicFgTw2fhX/7rfcPNqFS8Y29v2TTKuVMbGgCu9siHbV2z5aBC1qlSRuo8zXHRprcvhhrWPvWMxCcwv67SA7NepiEUPt+iN/q6AFsN/6ioQ7r4LbKfXYDev2ape2urWPlRBhN0/WVGfl1KrzUTYLMdqcvNYdGf4snjGHZDm6IEXeXXBQujMWjzIg76HL7kTLiIk0ACXeqRhFNCPfl7NkUfPQBqEsNdsLXYRUZnCsXzyL2wF7xEYy0qtD9lqQ2xmYSqTfEXXEUMMNi1Zcrk53b+NAVol9Wji53uhnLT5y049ERqV3R0AtxVFMKyUvX6Rev3HtLmzECF+NWY8rQocpN8yfmL73Nm/+gtRBua/JH7FrnA786GOjwrF6Gr/S2ampfKkH0ebzKt3kfvs/gUP9oOmEYK8sF3vjIo4RTelDhEzUlFFvj8FEKXO2HfftrQq/FQTvqW/IdVi6RnHLweouGDbEjh0AnItkXXxoVKnLrj46NQcYS29rnq/FN82GnFHKvb4En1R1Avz9+R1cfCQGFyW6vMx+v1k4xzzAEmKODkljqh/9bo0YP+rlSORAipk8cqfX/7vdZZ9HjL346vlCfhCe5XU2veTXHGCG+kpNlz1QSDHiRbcn3y6H7HxrgIw2Jv67Pm96DKRi9N7J2hly1bxYOmZejAlqILnhcBVN2pxnH2aICpVmFyhMxakOwdlM/RixEPELS+Uv59BdQZ8JFjoCsweqwncEEA6wSbmwy5bsPHajZe/Ne9xMScsiY Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 2a908a4d-d5d3-42fa-ed09-08d7ea8c0c50 X-MS-Exchange-CrossTenant-originalarrivaltime: 27 Apr 2020 09:19:11.7756 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 70e1fb47-1155-421d-87fc-2e58f638b6e0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ZzyI6+ZQALAutmaJV8oIaGRt/4Xa0iVT2wkKEiYVilUjMh09cqZBlZ5AMtO8RFAho4d/nzZ27RFTI6bUR/lBQg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR18MB3108 X-OriginatorOrg: marvell.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-27_05:2020-04-24, 2020-04-27 signatures=0 Subject: Re: [dpdk-dev] [PATCH v3] examples/l2fwd: add cmdline option for forwarding port info X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" >-----Original Message----- >From: pbhagavatula@marvell.com >Sent: Monday, April 27, 2020 1:30 PM >To: Jerin Jacob Kollanukkaran ; thomas@monjalon.net; >John McNamara ; Marko Kovacevic >; Ori Kam ; Bruce >Richardson ; Radu Nicolau >; Akhil Goyal ; Tomasz >Kantecki ; Sunil Kumar Kori >; Pavan Nikhilesh Bhagavatula > >Cc: Andrzej Ostruszka [C] ; dev@dpdk.org; Vamsi >Krishna Attunuru >Subject: [dpdk-dev] [PATCH v3] examples/l2fwd: add cmdline option for >forwarding port info > >From: Vamsi Attunuru > >Current l2fwd application statically configures adjacent ports as destinat= ion >ports for forwarding the traffic. > >Add a portmap option to pass the forwarding port pair mapping which allows >the user to configure forwarding port mapping. > >If no portmap argument is specified, destination port map is not changed a= nd >traffic gets forwarded with existing mapping. > >To align port/queue configuration of each lcore with destination port map, >port/queue configuration of each lcore gets modified when portmap option i= s >specified. > >Ex: ./l2fwd -c 0xff -- -p 0x3f -q 2 --portmap=3D"(0,3)(1,4)(2,5)" > >With above portmap option, traffic received from portid =3D 0 gets forward= ed to >port =3D 3 and vice versa, similarly traffic gets forwarded on other port = pairs >(1,4) and (2,5) > >Signed-off-by: Vamsi Attunuru >Signed-off-by: Pavan Nikhilesh >Acked-by: Andrzej Ostruszka >--- > v3 Changes: > * s/config/portmap/ > * rebase on master > > v2 Changes: > * Fix command option format in docs. > * Use memcpy instead of snprintf. > * Rephrase if-else condition. > > doc/guides/rel_notes/release_20_05.rst | 7 + > .../sample_app_ug/l2_forward_real_virtual.rst | 18 +- > examples/l2fwd/main.c | 182 +++++++++++++++--- > 3 files changed, 181 insertions(+), 26 deletions(-) > >diff --git a/doc/guides/rel_notes/release_20_05.rst >b/doc/guides/rel_notes/release_20_05.rst >index b124c3f28..019bec5d7 100644 >--- a/doc/guides/rel_notes/release_20_05.rst >+++ b/doc/guides/rel_notes/release_20_05.rst >@@ -212,6 +212,13 @@ New Features > * Added IPsec inbound load-distribution support for ipsec-secgw applica= tion > using NIC load distribution feature(Flow Director). > >+* **Added --portmap command line parameter to l2fwd example.** >+ >+ Added new command line option ``--portmap=3D"(port, port)[,(port, >+ port)]"`` to pass forwarding port details. >+ See the :doc:`doc/guides/sample_app_ug/l2_forward_real_virtual` for >+ more details of this parameter usage. >+ > > Removed Items > ------------- >diff --git a/doc/guides/sample_app_ug/l2_forward_real_virtual.rst >b/doc/guides/sample_app_ug/l2_forward_real_virtual.rst >index 39d6b0067..b54321b5b 100644 >--- a/doc/guides/sample_app_ug/l2_forward_real_virtual.rst >+++ b/doc/guides/sample_app_ug/l2_forward_real_virtual.rst >@@ -91,7 +91,10 @@ The application requires a number of command line >options: > > .. code-block:: console > >- ./build/l2fwd [EAL options] -- -p PORTMASK [-q NQ] --[no-]mac-updatin= g >+ ./build/l2fwd [EAL options] -- -p PORTMASK >+ [-q NQ] >+ --[no-]mac-updating >+ --portmap=3D"(port, port)[,(port, port= )]" Will it be better to represent as [--portmap=3D"(port, port)[,(port, port)]= ] as it is a optional parameter ? > > where, > >@@ -99,7 +102,10 @@ where, > > * q NQ: A number of queues (=3Dports) per lcore (default is 1) > >-* --[no-]mac-updating: Enable or disable MAC addresses updating (enable= d >by default). >+* --[no-]mac-updating: Enable or disable MAC addresses updating (enable= d >by default) >+ >+* --portmap=3D"(port,port)[,(port,port)]": Determines which ports are >mapped to >+ which ports for packet forwarding. May be rephrased a bit shorter as "Determines forwarding ports mapping".=20 > > To run the application in linux environment with 4 lcores, 16 ports and 8= RX >queues per lcore and MAC address updating enabled, issue the command: >@@ -108,6 +114,14 @@ updating enabled, issue the command: > > $ ./build/l2fwd -l 0-3 -n 4 -- -q 8 -p ffff > >+To run the application in linux environment with 4 lcores, 4 ports, 8 >+RX queues per lcore and MAC address updating enabled, to forward RX >+traffic of ports 0 & 1 on ports 2 & 3 respectively and vice versa, issue = the >command: IMO, No need to mentioned information about MAC address update enabled beca= use it is enabled by default and no param is passed in below command. So informati= on is not relevant here. >+ >+.. code-block:: console >+ >+ $ ./build/l2fwd -l 0-3 -n 4 -- -q 8 -p f --portmap=3D"(0,2)(1,3)" It looks like comma is missed in between two port map information. >+ > Refer to the *DPDK Getting Started Guide* for general information on runn= ing >applications and the Environment Abstraction Layer (EAL) options. > >diff --git a/examples/l2fwd/main.c b/examples/l2fwd/main.c index >88ddfe589..81861a22a 100644 >--- a/examples/l2fwd/main.c >+++ b/examples/l2fwd/main.c >@@ -38,6 +38,7 @@ > #include > #include > #include >+#include > > static volatile bool force_quit; > >@@ -67,6 +68,15 @@ static uint32_t l2fwd_enabled_port_mask =3D 0; > /* list of enabled ports */ > static uint32_t l2fwd_dst_ports[RTE_MAX_ETHPORTS]; > >+struct port_pair_params { >+#define NUM_PORTS 2 >+ uint16_t port[NUM_PORTS]; >+} __rte_cache_aligned; Is there any specific reason to use this syntax to declare two ports instea= d of following=20 struct port_pair_params { uint16_t port1; uint16_t port2; };=20 >+ >+static struct port_pair_params >+port_pair_params_array[RTE_MAX_ETHPORTS]; Should not be RTE_MAX_ETHPORTS/2 if only 1:1 mapping is allowed ? As I understood it is used to store CLI port mapping, I think it is better = to Use any other MACRO which define maximum number of port map parameter. If you consider it, then it can also be updated in documentation. >+static struct port_pair_params *port_pair_params; static uint16_t >+nb_port_pair_params; >+ > static unsigned int l2fwd_rx_queue_per_lcore =3D 1; > > #define MAX_RX_QUEUE_PER_LCORE 16 >@@ -294,11 +304,13 @@ l2fwd_usage(const char *prgname) > printf("%s [EAL options] -- -p PORTMASK [-q NQ]\n" > " -p PORTMASK: hexadecimal bitmask of ports to configure\n" > " -q NQ: number of queue (=3Dports) per lcore (default is 1)\n" >- " -T PERIOD: statistics will be refreshed each PERIOD >seconds (0 to disable, 10 default, 86400 maximum)\n" >- " --[no-]mac-updating: Enable or disable MAC addresses >updating (enabled by default)\n" >- " When enabled:\n" >- " - The source MAC address is replaced by the TX port >MAC address\n" >- " - The destination MAC address is replaced by >02:00:00:00:00:TX_PORT_ID\n", >+ " -T PERIOD: statistics will be refreshed each PERIOD seconds (0= to >disable, 10 default, 86400 maximum)\n" >+ " --[no-]mac-updating: Enable or disable MAC addresses updating >(enabled by default)\n" >+ " When enabled:\n" >+ " - The source MAC address is replaced by the TX port MAC >address\n" >+ " - The destination MAC address is replaced by >02:00:00:00:00:TX_PORT_ID\n" >+ " --portmap: Configure forwarding port pair mapping\n" >+ " Default: alternate port pairs\n\n", IMO, Indentation changes for other parameters should in separate patch.=20 > prgname); > } > >@@ -319,6 +331,61 @@ l2fwd_parse_portmask(const char *portmask) > return pm; > } > >+static int >+l2fwd_parse_port_pair_config(const char *q_arg) { >+ enum fieldnames { >+ FLD_PORT1 =3D 0, >+ FLD_PORT2, >+ _NUM_FLD >+ }; >+ unsigned long int_fld[_NUM_FLD]; >+ const char *p, *p0 =3D q_arg; >+ char *str_fld[_NUM_FLD]; >+ unsigned int size; >+ char s[256]; >+ char *end; >+ int i; >+ >+ nb_port_pair_params =3D 0; >+ >+ while ((p =3D strchr(p0, '(')) !=3D NULL) { >+ ++p; >+ p0 =3D strchr(p, ')'); >+ if (p0 =3D=3D NULL) >+ return -1; >+ >+ size =3D p0 - p; >+ if (size >=3D sizeof(s)) >+ return -1; >+ >+ memcpy(s, p, size); >+ s[size] =3D '\0'; >+ if (rte_strsplit(s, sizeof(s), str_fld, >+ _NUM_FLD, ',') !=3D _NUM_FLD) >+ return -1; >+ for (i =3D 0; i < _NUM_FLD; i++) { >+ errno =3D 0; >+ int_fld[i] =3D strtoul(str_fld[i], &end, 0); >+ if (errno !=3D 0 || end =3D=3D str_fld[i] || >+ int_fld[i] >=3D RTE_MAX_ETHPORTS) >+ return -1; >+ } >+ if (nb_port_pair_params >=3D RTE_MAX_ETHPORTS/2) { >+ printf("exceeded max number of port pair params: >%hu\n", >+ nb_port_pair_params); >+ return -1; >+ } >+ port_pair_params_array[nb_port_pair_params].port[0] =3D >+ (uint16_t)int_fld[FLD_PORT1]; >+ port_pair_params_array[nb_port_pair_params].port[1] =3D >+ (uint16_t)int_fld[FLD_PORT2]; >+ ++nb_port_pair_params; >+ } >+ port_pair_params =3D port_pair_params_array; >+ return 0; >+} >+ > static unsigned int > l2fwd_parse_nqueue(const char *q_arg) > { >@@ -361,6 +428,7 @@ static const char short_options[] =3D > > #define CMD_LINE_OPT_MAC_UPDATING "mac-updating" > #define CMD_LINE_OPT_NO_MAC_UPDATING "no-mac-updating" >+#define CMD_LINE_OPT_PORTMAP_CONFIG "portmap" > > enum { > /* long options mapped to a short option */ @@ -368,11 +436,13 @@ >enum { > /* first long only option value must be >=3D 256, so that we won't > * conflict with short options */ > CMD_LINE_OPT_MIN_NUM =3D 256, >+ CMD_LINE_OPT_PORTMAP_NUM, > }; > > static const struct option lgopts[] =3D { > { CMD_LINE_OPT_MAC_UPDATING, no_argument, &mac_updating, >1}, > { CMD_LINE_OPT_NO_MAC_UPDATING, no_argument, >&mac_updating, 0}, >+ { CMD_LINE_OPT_PORTMAP_CONFIG, 1, 0, >CMD_LINE_OPT_PORTMAP_NUM}, > {NULL, 0, 0, 0} > }; > >@@ -386,6 +456,7 @@ l2fwd_parse_args(int argc, char **argv) > char *prgname =3D argv[0]; > > argvopt =3D argv; >+ port_pair_params =3D NULL; > > while ((opt =3D getopt_long(argc, argvopt, short_options, > lgopts, &option_index)) !=3D EOF) { @@ -423,7 >+494,13 @@ l2fwd_parse_args(int argc, char **argv) > break; > > /* long options */ >- case 0: >+ case CMD_LINE_OPT_PORTMAP_NUM: >+ ret =3D l2fwd_parse_port_pair_config(optarg); >+ if (ret) { >+ fprintf(stderr, "Invalid config\n"); >+ l2fwd_usage(prgname); >+ return -1; >+ } > break; > > default: >@@ -440,6 +517,48 @@ l2fwd_parse_args(int argc, char **argv) > return ret; > } > >+/* >+ * Check port pair config with enabled port mask, >+ * and for valid port pair combinations. >+ */ >+static int >+check_port_pair_config(void) >+{ >+ uint32_t port_pair_config_mask =3D 0; >+ uint32_t port_pair_mask =3D 0; >+ uint16_t index, i, portid; >+ >+ for (index =3D 0; index < nb_port_pair_params; index++) { >+ port_pair_mask =3D 0; >+ >+ for (i =3D 0; i < NUM_PORTS; i++) { >+ portid =3D port_pair_params[index].port[i]; >+ if ((l2fwd_enabled_port_mask & (1 << portid)) =3D=3D 0) { >+ printf("port %u is not enabled in port >mask\n", >+ portid); >+ return -1; >+ } >+ if (!rte_eth_dev_is_valid_port(portid)) { >+ printf("port %u is not present on the >board\n", >+ portid); >+ return -1; >+ } >+ >+ port_pair_mask |=3D 1 << portid; >+ } >+ >+ if (port_pair_config_mask & port_pair_mask) { >+ printf("port %u is used in other port pairs\n", portid); >+ return -1; >+ } >+ port_pair_config_mask |=3D port_pair_mask; >+ } >+ >+ l2fwd_enabled_port_mask &=3D port_pair_config_mask; >+ >+ return 0; >+} >+ > /* Check the link status of all ports in up to 9s, and print them finally= */ static >void check_all_ports_link_status(uint32_t port_mask) @@ -555,6 +674,11 >@@ main(int argc, char **argv) > if (nb_ports =3D=3D 0) > rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); > >+ if (port_pair_params !=3D NULL) { >+ if (check_port_pair_config() < 0) >+ rte_exit(EXIT_FAILURE, "Invalid port pair config\n"); >+ } >+ > /* check port mask to possible port mask */ > if (l2fwd_enabled_port_mask & ~((1 << nb_ports) - 1)) > rte_exit(EXIT_FAILURE, "Invalid portmask; possible (0x%x)\n", >@@ -565,26 +689,35 @@ main(int argc, char **argv) > l2fwd_dst_ports[portid] =3D 0; > last_port =3D 0; > >- /* >- * Each logical core is assigned a dedicated TX queue on each port. >- */ >- RTE_ETH_FOREACH_DEV(portid) { >- /* skip ports that are not enabled */ >- if ((l2fwd_enabled_port_mask & (1 << portid)) =3D=3D 0) >- continue; >+ /* populate destination port details */ >+ if (port_pair_params !=3D NULL) { >+ uint16_t idx, p; > >- if (nb_ports_in_mask % 2) { >- l2fwd_dst_ports[portid] =3D last_port; >- l2fwd_dst_ports[last_port] =3D portid; >+ for (idx =3D 0; idx < (nb_port_pair_params << 1); idx++) { >+ p =3D idx & 1; >+ portid =3D port_pair_params[idx >> 1].port[p]; >+ l2fwd_dst_ports[portid] =3D >+ port_pair_params[idx >> 1].port[p ^ 1]; > } >- else >- last_port =3D portid; >+ } else { >+ RTE_ETH_FOREACH_DEV(portid) { >+ /* skip ports that are not enabled */ >+ if ((l2fwd_enabled_port_mask & (1 << portid)) =3D=3D 0) >+ continue; > >- nb_ports_in_mask++; >- } >- if (nb_ports_in_mask % 2) { >- printf("Notice: odd number of ports in portmask.\n"); >- l2fwd_dst_ports[last_port] =3D last_port; >+ if (nb_ports_in_mask % 2) { >+ l2fwd_dst_ports[portid] =3D last_port; >+ l2fwd_dst_ports[last_port] =3D portid; >+ } else { >+ last_port =3D portid; >+ } >+ >+ nb_ports_in_mask++; >+ } >+ if (nb_ports_in_mask % 2) { >+ printf("Notice: odd number of ports in portmask.\n"); >+ l2fwd_dst_ports[last_port] =3D last_port; >+ } > } > > rx_lcore_id =3D 0; >@@ -613,7 +746,8 @@ main(int argc, char **argv) > > qconf->rx_port_list[qconf->n_rx_port] =3D portid; > qconf->n_rx_port++; >- printf("Lcore %u: RX port %u\n", rx_lcore_id, portid); >+ printf("Lcore %u: RX port %u TX port %u\n", rx_lcore_id, >+ portid, l2fwd_dst_ports[portid]); > } > > nb_mbufs =3D RTE_MAX(nb_ports * (nb_rxd + nb_txd + >MAX_PKT_BURST + >-- >2.17.1