From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-eopbgr140085.outbound.protection.outlook.com [40.107.14.85]) by dpdk.org (Postfix) with ESMTP id 876BC2BF5 for ; Tue, 11 Dec 2018 08:29:42 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=m5Xpe/xmzqJ8GDJZIi3OUfQIjlVKLso4bD595MuKx/0=; b=u1YQRik4zpcNawqNIG83JUA3u9eC7S0QqBI2sqZHVEbTWK6qjkqat3at5uNYWtI/v0jAng/MxJHEoCNK4cimzkOVS3XGaDP7wRYJ05zUnfTirAANjoRee2KMilXxL7pXkcn0f9+/FCDWpDz//pJdy/Cp/zNek8q06AxK60P2KnA= Received: from VI1PR05MB3440.eurprd05.prod.outlook.com (10.170.239.18) by VI1PR05MB4622.eurprd05.prod.outlook.com (20.176.3.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1404.20; Tue, 11 Dec 2018 07:29:41 +0000 Received: from VI1PR05MB3440.eurprd05.prod.outlook.com ([fe80::30a9:3107:b1f8:de56]) by VI1PR05MB3440.eurprd05.prod.outlook.com ([fe80::30a9:3107:b1f8:de56%3]) with mapi id 15.20.1404.026; Tue, 11 Dec 2018 07:29:40 +0000 From: Ori Kam To: Asaf Penso , Stephen Hemminger CC: Adrien Mazarguil , "dev@dpdk.org" , Shahaf Shuler , Thomas Monjalon Thread-Topic: [dpdk-dev] [PATCH] ethdev: add function to print a flow Thread-Index: AQHUhy6uk2CN7DZIq0ujCLWKDIF8yaVyS1AAgAbrAXCAAAEGIA== Date: Tue, 11 Dec 2018 07:29:40 +0000 Message-ID: References: <1543418758-23748-1-git-send-email-asafp@mellanox.com> <20181206134418.475b8d06@xeon-e3> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=orika@mellanox.com; x-originating-ip: [42.120.102.172] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; VI1PR05MB4622; 6:jMYQfEJpdC7aw3dFX+Msd4zoLdo2oCOmXMKGC1kuO7Jo3WHdqe9WJjWRCoib2QiOieQmDO952/M2D0go4k0Fg+nVq3Gb2ieLQh5ejbK0XOk78VujU6GC29z0vLNb3gWvSrjAhaDhz35VEeAPBKxPAu1SBI6qX8eFg0I8JRcAP2Q3Qd0EjxLRFMh+tOGmRJxsi2Mh+OqFjQiIZF60BOhYMRKqhvKjJpMl15FfNKXsrFF+f7co0BACBdxwG3u5QOlpzZ//m1tRm4sfIHczZvKxpdtIp3Uy6FR3mN5eUeABn1DzrNrjSxNC4J97aaZCT/DXCkY+xTQXRPYNjFEM42lqzYcCnXo/54Wo9Ta8N491mwNc3HpsrVfjnoU9Lm1qwdyY9FQORWw8MGicmdr0dTxwaU6hwlv14q8+E6s5P7diCkBxgnqtvA1CIjZkFckpebwOi8O2MwoFqKSYUZcpavwbDg==; 5:3uNoMiNh28E4p/OourvDNSKP/VxKOOKjRH1rzNLqWxBnOQnWdtVn6u0IQDIFrx4u0gUnnyejDuh1srdkUuFIOm4ckhdpGNU713F9TNyp0jK0OG63LHgU9k+3Kf8yv1Wz50Ipw9QtvWZ/45rjKPrnGeRQpy+mAjfxlrg38eyV7x0=; 7:I3baCbGx+nwNpjDvwy53nskPbOoIfTxzXpVfgaT21+GoCzITjAxCEGqGZwdOxwigBKT+FgrugpoLdD2th2Vfzsi4c7rHfE5yItTn3NGgJV5LtUG2UNEsJy0p2tCVN/u9aInUtzmbhqoHf2S7SILQFQ== x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: 2f242be1-5eaf-42cb-f9a1-08d65f3a69f1 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390098)(7020095)(4652040)(8989299)(5600074)(711020)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:VI1PR05MB4622; x-ms-traffictypediagnostic: VI1PR05MB4622: x-ld-processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(3230017)(999002)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(3231472)(944501520)(52105112)(3002001)(10201501046)(6055026)(148016)(149066)(150057)(6041310)(20161123558120)(20161123560045)(20161123562045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:VI1PR05MB4622; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB4622; x-forefront-prvs: 08831F51DC x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(136003)(39860400002)(376002)(396003)(366004)(346002)(199004)(189003)(13464003)(8676002)(256004)(33656002)(86362001)(446003)(575784001)(486006)(14444005)(3846002)(11346002)(229853002)(6116002)(97736004)(71190400001)(4744004)(66066001)(105586002)(476003)(316002)(106356001)(74316002)(99286004)(7736002)(305945005)(71200400001)(4326008)(102836004)(5660300001)(6246003)(7696005)(53546011)(6506007)(8936002)(55016002)(26005)(186003)(81156014)(54906003)(14454004)(53936002)(110136005)(478600001)(6436002)(25786009)(76176011)(81166006)(68736007)(9686003)(2906002); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB4622; H:VI1PR05MB3440.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: 4bG5obXR4AjlRYPKWBWSIkZBn7awQ6YTlEnFaHi9jJU6wKwdrPEW1JJ6JsgwjOs8cO5/gHH4OjBkBG4WqYWi5ZQYb+1tzLqzPW76rAnGdJbwxVagsprG4y+38Tg7M2F+6D+JyVVtLaJnX5xlx+myGWWZdxJVlm6EKMDodHUAVPlshcGmFzqgKJWYXbuUHKkkawgYnlkmN/5cARWJELJGtcvehkzFOD9LUrOCYUMBVEv1tJpxXogHawXGd34RZ1Izu6C81EucFWzsnU92BK1B7PZAqoRwcwwA7Cp+5/Kv29I5D+2jBZ2olwJBnMWTC2ig spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2f242be1-5eaf-42cb-f9a1-08d65f3a69f1 X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Dec 2018 07:29:40.8860 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB4622 Subject: Re: [dpdk-dev] [PATCH] ethdev: add function to print a flow 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: , X-List-Received-Date: Tue, 11 Dec 2018 07:29:42 -0000 General comment for the discussion. I think it is important that all fields of all actions and items will be pr= inted. This means that any modification to the rte_flow should also reflect in this function. Best, Ori > -----Original Message----- > From: Asaf Penso > Sent: Tuesday, December 11, 2018 9:25 AM > To: Stephen Hemminger > Cc: Adrien Mazarguil ; dev@dpdk.org; Shahaf > Shuler ; Ori Kam ; Thomas > Monjalon > Subject: RE: [dpdk-dev] [PATCH] ethdev: add function to print a flow >=20 >=20 >=20 > Regards, > Asaf Penso >=20 > > -----Original Message----- > > From: Stephen Hemminger > > Sent: Thursday, December 6, 2018 11:44 PM > > To: Asaf Penso > > Cc: Adrien Mazarguil ; dev@dpdk.org; > > Shahaf Shuler ; Ori Kam ; > > Thomas Monjalon > > Subject: Re: [dpdk-dev] [PATCH] ethdev: add function to print a flow > > > > On Wed, 28 Nov 2018 15:26:06 +0000 > > Asaf Penso wrote: > > > > > Flow contains the following information: port id, attributes, pattern= s > > > and actions. > > > The function rte_flow_print prints all above information. > > > > > > It can be used for debugging purposes to validate the behavior of > > > different dpdk applications. > > > > > > Example: running testpmd with the following flow create: > > > flow create 1 transfer ingress > > > pattern eth src is 52:54:00:15:b1:b1 dst is 24:8A:07:8D:AE:C6 / end > > > actions of_push_vlan ethertype 0x8100 / of_set_vlan_vid vlan_vid 0x88= 8 > > > / of_set_vlan_pcp vlan_pcp 7 / port_id id 0 / end Will result in this > > > output: > > > Print flow info > > > port_id =3D1 > > > group =3D0 > > > priority =3D0 > > > ingress =3D1 > > > egress =3D0 > > > transfer =3D1 > > > group =3D0 > > > reserved =3D0 > > > pattern type =3D9 > > > name=3DRTE_FLOW_ITEM_TYPE_ETH > > > spec type=3D0x0, src=3D52:54:00:15:b1:b1, dst=3D24:8a:07:8d:ae:c6 > > > mask type=3D0x0, src=3Dff:ff:ff:ff:ff:ff, dst=3Dff:ff:ff:ff:ff:ff a= ctions > > > type =3D23 name=3DRTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN > > > ethertype=3D0x81 > > > actions type =3D24 > > > name=3DRTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID > > > vlan_vid=3D0x8808 > > > actions type =3D25 > > > name=3DRTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP > > > vlan_pcp=3D7 > > > actions type =3D13 > > > name=3DRTE_FLOW_ACTION_TYPE_PORT_ID > > > id=3D0 > > > reserved=3D0 > > > > > > Signed-off-by: Asaf Penso > > > --- > > > lib/librte_ethdev/rte_ethdev_version.map | 1 + > > > lib/librte_ethdev/rte_flow.c | 226 > > ++++++++++++++++++++++++++++++ > > > lib/librte_ethdev/rte_flow.h | 31 ++++ > > > 3 files changed, 258 insertions(+), 0 deletions(-) > > > > > > diff --git a/lib/librte_ethdev/rte_ethdev_version.map > > > b/lib/librte_ethdev/rte_ethdev_version.map > > > index 92ac3de..7676983 100644 > > > --- a/lib/librte_ethdev/rte_ethdev_version.map > > > +++ b/lib/librte_ethdev/rte_ethdev_version.map > > > @@ -249,6 +249,7 @@ EXPERIMENTAL { > > > rte_eth_switch_domain_free; > > > rte_flow_conv; > > > rte_flow_expand_rss; > > > + rte_flow_print; > > > rte_mtr_capabilities_get; > > > rte_mtr_create; > > > rte_mtr_destroy; > > > diff --git a/lib/librte_ethdev/rte_flow.c > > > b/lib/librte_ethdev/rte_flow.c index 3277be1..742d892 100644 > > > --- a/lib/librte_ethdev/rte_flow.c > > > +++ b/lib/librte_ethdev/rte_flow.c > > > @@ -16,6 +16,8 @@ > > > #include "rte_flow_driver.h" > > > #include "rte_flow.h" > > > > > > +int rte_flow_logtype; > > > + > > > /** > > > * Flow elements description tables. > > > */ > > > @@ -202,6 +204,222 @@ struct rte_flow_desc_data { > > > NULL, rte_strerror(ENOSYS)); > > > } > > > > > > +/* Example: > > > + * > > > + * struct eth_addr mac; > > > + * [...] > > > + * printf("The Ethernet address is "RTE_ETH_ADDR_FMT"\n", > > > + * RTE_ETH_ADDR_ARGS(mac)); > > > + * > > > + */ > > > +#define RTE_ETH_ADDR_FMT \ > > > + > > "%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"P > > RIx8 > > > +#define RTE_ETH_ADDR_ARGS(addr) > > RTE_ETH_ADDR_BYTES_ARGS((addr).ea) > > > +#define RTE_ETH_ADDR_BYTES_ARGS(bytes) \ > > > + (bytes)[0], (bytes)[1], (bytes)[2], (bytes)[3], (bytes)[4], > > > +(bytes)[5] > > > + > > > +/* Print the flow fields. */ > > > +void __rte_experimental > > > +rte_flow_print(uint16_t port_id, > > > + const struct rte_flow_attr *attr, > > > + const struct rte_flow_item pattern[], > > > + const struct rte_flow_action actions[]) { > > > + RTE_FLOW_LOG(INFO, "Print flow info\n"); > > > + RTE_FLOW_LOG(INFO, "port_id =3D%u\n", port_id); > > > + RTE_FLOW_LOG(INFO, "group =3D%u\n", attr->group); > > > + RTE_FLOW_LOG(INFO, "priority =3D%u\n", attr->priority); > > > + RTE_FLOW_LOG(INFO, "ingress =3D%u\n", attr->ingress); > > > + RTE_FLOW_LOG(INFO, "egress =3D%u\n", attr->egress); > > > + RTE_FLOW_LOG(INFO, "transfer =3D%u\n", attr->transfer); > > > + RTE_FLOW_LOG(INFO, "group =3D%u\n", attr->group); > > > + RTE_FLOW_LOG(INFO, "reserved =3D%u\n", attr->reserved); > > > + > > > + for (; pattern->type !=3D RTE_FLOW_ITEM_TYPE_END; pattern++) { > > > + RTE_FLOW_LOG(INFO, "pattern type =3D%u\n", pattern- > > >type); > > > + switch (pattern->type) { > > > + case RTE_FLOW_ITEM_TYPE_ETH: { > > > + RTE_FLOW_LOG(INFO, " > > name=3DRTE_FLOW_ITEM_TYPE_ETH\n"); > > > + if (pattern->spec) { > > > + const struct rte_flow_item_eth *spec =3D > > > + pattern->spec; > > > + RTE_FLOW_LOG(INFO, " spec type=3D0x%x, " > > > + "src=3D"RTE_ETH_ADDR_FMT", > > dst=3D"RTE_ETH_ADDR_FMT > > > + "\n", > > > + spec->type, > > > + RTE_ETH_ADDR_BYTES_ARGS(spec- > > >src.addr_bytes), > > > + RTE_ETH_ADDR_BYTES_ARGS(spec- > > >dst.addr_bytes)); > > > + } > > > + > > > + if (pattern->mask) { > > > + const struct rte_flow_item_eth *mask =3D > > > + pattern->mask; > > > + RTE_FLOW_LOG(INFO, " mask type=3D0x%x, " > > > + "src=3D"RTE_ETH_ADDR_FMT", > > dst=3D"RTE_ETH_ADDR_FMT > > > + "\n", > > > + mask->type, > > > + RTE_ETH_ADDR_BYTES_ARGS(mask- > > >src.addr_bytes), > > > + RTE_ETH_ADDR_BYTES_ARGS(mask- > > >dst.addr_bytes)); > > > + } > > > + break; > > > + } > > > + case RTE_FLOW_ITEM_TYPE_VLAN: { > > > + RTE_FLOW_LOG(INFO, " > > name=3DRTE_FLOW_ITEM_TYPE_VLAN\n"); > > > + if (pattern->spec) { > > > + const struct rte_flow_item_vlan *spec =3D > > > + pattern->spec; > > > + RTE_FLOW_LOG(INFO, " spec tci=3D0x%x\n", > > > + spec->tci); > > > + RTE_FLOW_LOG(INFO, " spec > > inner_type=3D%u\n", > > > + spec->inner_type); > > > + } > > > + if (pattern->mask) { > > > + const struct rte_flow_item_vlan *mask =3D > > > + pattern->mask; > > > + RTE_FLOW_LOG(INFO, " mask tci=3D0x%x\n", > > > + mask->tci); > > > + RTE_FLOW_LOG(INFO, " mask > > inner_type=3D%u\n", > > > + mask->inner_type); > > > + } > > > + break; > > > + } > > > + case RTE_FLOW_ITEM_TYPE_IPV4: { > > > + RTE_FLOW_LOG(INFO, " > > name=3DRTE_FLOW_ITEM_TYPE_IPV4\n"); > > > + if (pattern->spec) { > > > + const struct rte_flow_item_ipv4 *spec =3D > > > + pattern->spec; > > > + RTE_FLOW_LOG(INFO, " spec > > version_ihl=3D%u\n", > > > + spec->hdr.version_ihl); > > > + RTE_FLOW_LOG(INFO, " spec > > type_of_service=3D%u\n", > > > + spec->hdr.type_of_service); > > > + RTE_FLOW_LOG(INFO, " spec > > total_length=3D%u\n", > > > + spec->hdr.total_length); > > > + RTE_FLOW_LOG(INFO, " spec > > packet_id=3D%u\n", > > > + spec->hdr.packet_id); > > > + RTE_FLOW_LOG(INFO, " spec > > fragment_offset=3D%u\n", > > > + spec->hdr.fragment_offset); > > > + RTE_FLOW_LOG(INFO, " spec > > time_to_live=3D%u\n", > > > + spec->hdr.time_to_live); > > > + RTE_FLOW_LOG(INFO, " spec > > next_proto_id=3D%u\n", > > > + spec->hdr.next_proto_id); > > > + RTE_FLOW_LOG(INFO, " spec > > hdr_checksum=3D0x%x\n", > > > + spec->hdr.hdr_checksum); > > > + RTE_FLOW_LOG(INFO, > > > + " spec src_addr=3D%d.%d.%d.%d\n", > > > + (spec->hdr.src_addr & 0x000000FF), > > > + (spec->hdr.src_addr & 0x0000FF00) > > >> 8, > > > + (spec->hdr.src_addr & 0x00FF0000) > > >> 16, > > > + (spec->hdr.src_addr & 0xFF000000) > > > + >> 24); > > > + RTE_FLOW_LOG(INFO, > > > + " spec dst_addr=3D%d.%d.%d.%d\n", > > > + (spec->hdr.dst_addr & 0x000000FF), > > > + (spec->hdr.dst_addr & 0x0000FF00) > > >> 8, > > > + (spec->hdr.dst_addr & 0x00FF0000) > > >> 16, > > > + (spec->hdr.dst_addr & 0xFF000000) > > > + >> 24); > > > + } > > > + > > > + if (pattern->mask) { > > > + const struct rte_flow_item_ipv4 *mask =3D > > > + pattern->mask; > > > + RTE_FLOW_LOG(INFO, " mask > > version_ihl=3D%u\n", > > > + mask->hdr.version_ihl); > > > + RTE_FLOW_LOG(INFO, " mask > > type_of_service=3D%u\n", > > > + mask->hdr.type_of_service); > > > + RTE_FLOW_LOG(INFO, " mask > > total_length=3D%u\n", > > > + mask->hdr.total_length); > > > + RTE_FLOW_LOG(INFO, " mask > > packet_id=3D%u\n", > > > + mask->hdr.packet_id); > > > + RTE_FLOW_LOG(INFO, " mask > > fragment_offset=3D%u\n", > > > + mask->hdr.fragment_offset); > > > + RTE_FLOW_LOG(INFO, " mask > > time_to_live=3D%u\n", > > > + mask->hdr.time_to_live); > > > + RTE_FLOW_LOG(INFO, " mask > > next_proto_id=3D%u\n", > > > + mask->hdr.next_proto_id); > > > + RTE_FLOW_LOG(INFO, " mask > > hdr_checksum=3D0x%x\n", > > > + mask->hdr.hdr_checksum); > > > + RTE_FLOW_LOG(INFO, > > > + " mask src_addr=3D%d.%d.%d.%d\n", > > > + (mask->hdr.src_addr & 0x000000FF), > > > + (mask->hdr.src_addr & 0x0000FF00) > > >> 8, > > > + (mask->hdr.src_addr & 0x00FF0000) > > >> 16, > > > + (mask->hdr.src_addr & 0xFF000000) > > > + >> 24); > > > + RTE_FLOW_LOG(INFO, > > > + " mask dst_addr=3D%d.%d.%d.%d\n", > > > + (mask->hdr.dst_addr & 0x000000FF), > > > + (mask->hdr.dst_addr & 0x0000FF00) > > >> 8, > > > + (mask->hdr.dst_addr & 0x00FF0000) > > >> 16, > > > + (mask->hdr.dst_addr & 0xFF000000) > > > + >> 24); > > > + } > > > + break; > > > + } > > > + default: > > > + RTE_FLOW_LOG(INFO, "unfamiliar pattern item\n"); > > > + } > > > + } > > > + > > > + for (; actions->type !=3D RTE_FLOW_ACTION_TYPE_END; actions++) { > > > + RTE_FLOW_LOG(INFO, "actions type =3D%u\n", actions- > > >type); > > > + switch (actions->type) { > > > + case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN: { > > > + RTE_FLOW_LOG(INFO, > > > + " > > name=3DRTE_FLOW_ACTION_TYPE_OF_POP_VLAN\n"); > > > + break; > > > + } > > > + case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN: { > > > + RTE_FLOW_LOG(INFO, > > > + " > > name=3DRTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN\n"); > > > + if (actions->conf) { > > > + const struct rte_flow_action_of_push_vlan > > > + *conf =3D actions->conf; > > > + RTE_FLOW_LOG(INFO, " > > ethertype=3D0x%x\n", > > > + conf->ethertype); > > > + } > > > + break; > > > + } > > > + case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID: { > > > + RTE_FLOW_LOG(INFO, > > > + " > > name=3DRTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID\n"); > > > + if (actions->conf) { > > > + const struct > > rte_flow_action_of_set_vlan_vid > > > + *conf =3D actions->conf; > > > + RTE_FLOW_LOG(INFO, " vlan_vid=3D0x%x\n", > > > + conf->vlan_vid); > > > + } > > > + break; > > > + } > > > + case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP: { > > > + RTE_FLOW_LOG(INFO, > > > + " > > name=3DRTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP\n"); > > > + if (actions->conf) { > > > + const struct > > rte_flow_action_of_set_vlan_pcp > > > + *conf =3D actions->conf; > > > + RTE_FLOW_LOG(INFO, " vlan_pcp=3D%u\n", > > > + conf->vlan_pcp); > > > + } > > > + break; > > > + } > > > + case RTE_FLOW_ACTION_TYPE_PORT_ID: { > > > + RTE_FLOW_LOG(INFO, > > > + " > > name=3DRTE_FLOW_ACTION_TYPE_PORT_ID\n"); > > > + if (actions->conf) { > > > + const struct rte_flow_action_port_id > > > + *conf =3D actions->conf; > > > + RTE_FLOW_LOG(INFO, " id=3D%u\n", conf- > > >id); > > > + RTE_FLOW_LOG(INFO, " reserved=3D%u\n", > > > + conf->reserved); > > > + } > > > + break; > > > + } > > > + default: > > > + RTE_FLOW_LOG(INFO, "unfamiliar action item\n"); > > > + } > > > + } > > > +} > > > + > > > /* Create a flow rule on a given port. */ struct rte_flow * > > > rte_flow_create(uint16_t port_id, @@ -1001,3 +1219,11 @@ enum > > > rte_flow_conv_item_spec_type { > > > }; > > > return lsize; > > > } > > > + > > > +RTE_INIT(flow_init_log) > > > +{ > > > + rte_flow_logtype =3D rte_log_register("lib.flow"); > > > + if (rte_flow_logtype >=3D 0) > > > + rte_log_set_level(rte_flow_logtype, RTE_LOG_INFO); } > > > + > > > diff --git a/lib/librte_ethdev/rte_flow.h > > > b/lib/librte_ethdev/rte_flow.h index c0fe879..0a7e70b 100644 > > > --- a/lib/librte_ethdev/rte_flow.h > > > +++ b/lib/librte_ethdev/rte_flow.h > > > @@ -28,6 +28,12 @@ > > > #include > > > #include > > > #include > > > +#include > > > + > > > +extern int rte_flow_logtype; > > > + > > > +#define RTE_FLOW_LOG(level, ...) \ > > > + rte_log(RTE_LOG_ ## level, rte_flow_logtype, "" __VA_ARGS__) > > > > > > #ifdef __cplusplus > > > extern "C" { > > > @@ -2414,6 +2420,31 @@ enum rte_flow_conv_op { > > > struct rte_flow_error *error); > > > > > > /** > > > + * Print the flow fields. > > > + * > > > + * The flow contains the port id, different attributes, the pattern'= s > > > + * items and the action's items, which are all being printed. > > > + * > > > + * @b EXPERIMENTAL: this API may change without prior notice > > > + * > > > + * @param port_id > > > + * Port identifier of Ethernet device. > > > + * @param[in] attr > > > + * Flow rule attributes. > > > + * @param[in] pattern > > > + * Pattern specification (list terminated by the END pattern item)= . > > > + * @param[in] actions > > > + * Associated actions (list terminated by the END action). > > > + * > > > + * @note not all enum values of patterns and actions are printed. > > > + */ > > > +void __rte_experimental > > > +rte_flow_print(uint16_t port_id, > > > + const struct rte_flow_attr *attr, > > > + const struct rte_flow_item pattern[], > > > + const struct rte_flow_action actions[]); > > > + > > > +/** > > > * Create a flow rule on a given port. > > > * > > > * @param port_id > > > > Since this is a debug function, it would make more sense for it to take= a 'FILE > > *' > > for output like the other debug functions do. That would make it consi= stent > > with rte_pktmbuf_dump rte_event_dev_dump, rte_mempool_dump, etc. > > > > Why not name it rte_flow_dump? >=20 > Thanks for pointing this out. I'll consider renaming and make it accept a= file. > I'll wait for more comments first before uploading another version of the= patch.