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 9D346A0577; Tue, 14 Apr 2020 11:23:21 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 775A51C21A; Tue, 14 Apr 2020 11:23:17 +0200 (CEST) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2048.outbound.protection.outlook.com [40.107.22.48]) by dpdk.org (Postfix) with ESMTP id A40D51C215 for ; Tue, 14 Apr 2020 11:23:16 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MKmf5029MiV+nH9EYn4gdjXPdOHIt9kIntODjx2/yyfzT0n8hKAMt/wIqxkiGfTYC9pGm7/jIRjFhV3S5Jk9tbMQw97zh+TvhOMcjw1slJ/mQC+/aSlEdFsjpu4evXZPXwFg6Ifyp6PfVpECcIYBNQwYm9ahFuSSUtZfmVN3O8wAxvKhU/zN85SqDU346C6iJADe6G36ojSwtvxg2uLQhX8KWusliHD3sFGEp331ggFgwo42Zhj3EDesXoAYahMkaEDmQTiUMrGd64t4cfGPn+R2S6CAZx0ag+s9QXD2BBo2Gvngra2+gZLyF3j1I+tMcFr2APUwfxIDhkddGeoXYw== 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=hXlLFkv/cjbX5KiZBYyXJUmHydPjjS5h+cm5xguanJ4=; b=BZL0rndFNad5MRGWMibpiI0uNAT+NNk32wFt5Tx9oFdkS/5hPBiJ3gTarpBmekSNnGZoQEwASkG4vkjaJ92iQypR8jVeKTxRTpIIEdaYLBkN4vuxzNzMG5h2lDiGxW+qLQP7pMvP8KSRBF6bUJ4wAJC4oOPhVff9rG1PejZ3sKU2+NZ36c1J3twmJM68iEL6zzqN4I7s9AyHCCD+JqFJ2wku40InC6ZbEQSsfQfZggV2uzy/kw6/MPyQgq7RoLNaAgDJ6B/gSeGkHACYU94MSU/frz4s/t/akh3qBQgFDdp2IsP991b8nlxjev4dXAHBX7fop45x2wCti5zYSwPymw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=mellanox.com; dmarc=pass action=none header.from=mellanox.com; dkim=pass header.d=mellanox.com; arc=none 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=hXlLFkv/cjbX5KiZBYyXJUmHydPjjS5h+cm5xguanJ4=; b=Eu+1VYE94AIbemAkZjc7opmHi0ixM/6Em1YdalqtguFnalA9j8+5+iDdUemJAQkfVh1ef2OU1CNciyNmOYOJuEQeWXBe0eZraJAewyTkUZZ6lyS+k/GAfM11QydtWLOT+Y/3+deSvdYBt6S3lrwAMqskxnSR2yGxrTsgUaaCFdg= Received: from VI1PR0502MB2943.eurprd05.prod.outlook.com (2603:10a6:800:b8::15) by VI1PR0502MB3006.eurprd05.prod.outlook.com (2603:10a6:800:b2::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2900.24; Tue, 14 Apr 2020 09:23:14 +0000 Received: from VI1PR0502MB2943.eurprd05.prod.outlook.com ([fe80::9da2:ce8a:6469:4f8c]) by VI1PR0502MB2943.eurprd05.prod.outlook.com ([fe80::9da2:ce8a:6469:4f8c%5]) with mapi id 15.20.2900.028; Tue, 14 Apr 2020 09:23:14 +0000 From: Bill Zhou To: Ori Kam , Matan Azrad , "wenzhuo.lu@intel.com" , "jingjing.wu@intel.com" , "bernard.iremonger@intel.com" , "john.mcnamara@intel.com" , "marko.kovacevic@intel.com" , Thomas Monjalon , "ferruh.yigit@intel.com" , "arybchenko@solarflare.com" CC: "dev@dpdk.org" Thread-Topic: [PATCH v2] ethdev: support flow aging Thread-Index: AQHWEjmj6DyFILdbVEWNnLVAssWcJ6h4V7fw Date: Tue, 14 Apr 2020 09:23:14 +0000 Message-ID: References: <20200410094631.31330-1-dongz@mellanox.com> <20200414083255.14014-1-dongz@mellanox.com> In-Reply-To: Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=dongz@mellanox.com; x-originating-ip: [101.206.253.230] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: ea0fb69c-2ef0-4cd1-c7fa-08d7e055758c x-ms-traffictypediagnostic: VI1PR0502MB3006:|VI1PR0502MB3006: x-ld-processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3173; x-forefront-prvs: 0373D94D15 x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR0502MB2943.eurprd05.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(10009020)(4636009)(376002)(396003)(346002)(39850400004)(136003)(366004)(5660300002)(110136005)(8676002)(478600001)(81156014)(52536014)(2906002)(71200400001)(4326008)(7696005)(30864003)(66946007)(8936002)(53546011)(6506007)(316002)(55016002)(26005)(86362001)(33656002)(64756008)(76116006)(186003)(66476007)(66446008)(9686003)(66556008)(921003)(1121003); DIR:OUT; SFP:1101; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: iZgQM9wp5FT7vFLVLGRdB9m4vJqRfBYuacgK7dev5iZupgo//7kdImWcdW7W6fLvRsXmwur+6ug0YJFg0i+lchMOn/C9k5MtUoXE8I+nBadKZLAe14SqEKeA70uspc/CeiCzkdk7yxKmaJGk8KNPrYn1pj7/g2KRyvseYLjrziWmF5GkaV+8ObKwMOBxA4+yWytB+faj1VHEQuM8YDzhidUnOPOB7ewmWB2QCVv60OGgBCfSK/VPio7ngagH6pq6KDnOQRpfK8Jg4Hx5wt2cQAl56LDFIqmTcyK6USIv9v4oupRjRIW7LmVGV+4TPgt6AU6Bt0pUxWWWMxXSkbIAEcRUJcbh1N6wo5OFVrE4B6kqp8WOY9/jIjycN6kUFcZ+6XZdXOa0CAY/27d/EhRW0wQUoA/PJYujD69UIQ2HY9FA/T5GU5pPVZHY9rRzT5HbyNIUKLrsSmgQpOCSILL3Yfa0e9o+14XueJ9LW64zNQ9kQ4QS7LbLe3qFNg7OnX7E x-ms-exchange-antispam-messagedata: CjUjqQGseqKK77M0vVPZYYYo2PF1F5NWStW8R2JYHtXXgE97vOLEyhIjbfv0ck6erWIP5hB/Zkyh/drVOavN7mFAzzKg7PbNBZZ0BKvPP5x6L9Rt/jU+NmEscmpRz29OcZOQfZUsJApdYgTg1URciw== 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: ea0fb69c-2ef0-4cd1-c7fa-08d7e055758c X-MS-Exchange-CrossTenant-originalarrivaltime: 14 Apr 2020 09:23:14.3857 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ELe7r8KPb2/0rg7C+OkRFYh76y5rqza0xjngGrFYHbRbXcTWqW6pMbGiVXTOiPdrOF/4Or/FGAIvyUVE/Uppgw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0502MB3006 Subject: Re: [dpdk-dev] [PATCH v2] ethdev: support flow aging 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: Ori Kam > Sent: Tuesday, April 14, 2020 4:50 PM > To: Bill Zhou ; Matan Azrad > ; wenzhuo.lu@intel.com; jingjing.wu@intel.com; > bernard.iremonger@intel.com; john.mcnamara@intel.com; > marko.kovacevic@intel.com; Thomas Monjalon ; > ferruh.yigit@intel.com; arybchenko@solarflare.com > Cc: dev@dpdk.org > Subject: RE: [PATCH v2] ethdev: support flow aging >=20 >=20 >=20 > > -----Original Message----- > > From: Dong Zhou > > Sent: Tuesday, April 14, 2020 11:33 AM > > To: Ori Kam ; Matan Azrad > ; > > wenzhuo.lu@intel.com; jingjing.wu@intel.com; > > bernard.iremonger@intel.com; john.mcnamara@intel.com; > > marko.kovacevic@intel.com; Thomas Monjalon ; > > ferruh.yigit@intel.com; arybchenko@solarflare.com > > Cc: dev@dpdk.org > > Subject: [PATCH v2] ethdev: support flow aging > > > > One of the reasons to destroy a flow is the fact that no packet > > matches the flow for "timeout" time. > > For example, when TCP\UDP sessions are suddenly closed. > > > > Currently, there is not any DPDK mechanism for flow aging and the > > applications use their own ways to detect and destroy aged-out flows. > > > > The flow aging implementation need include: > > - A new rte_flow action: RTE_FLOW_ACTION_TYPE_AGE to set the > timeout and > > the application flow context for each flow. > > - A new ethdev event: RTE_ETH_EVENT_FLOW_AGED for the driver to > report > > that there are new aged-out flows. > > - A new rte_flow API: rte_flow_get_aged_flows to get the aged-out flows > > contexts from the port. > > - Support input flow aging command line in Testpmd. > > > > Signed-off-by: Dong Zhou > > --- > Like said before nice patch and hope to see more patches from you. > Just a small nit please next time add change log. >=20 Sorry for it. --- v2: Removing "* Added support for flow Aging mechanism base on counter." this line from doc/guides/rel_notes/release_20_05.rst, this patch does not include this support. --- > Acked-by: Ori Kam > Thanks, > Ori >=20 >=20 > > app/test-pmd/cmdline_flow.c | 26 ++++++++++ > > doc/guides/prog_guide/rte_flow.rst | 22 +++++++++ > > doc/guides/rel_notes/release_20_05.rst | 11 +++++ > > lib/librte_ethdev/rte_ethdev.h | 1 + > > lib/librte_ethdev/rte_ethdev_version.map | 3 ++ > > lib/librte_ethdev/rte_flow.c | 18 +++++++ > > lib/librte_ethdev/rte_flow.h | 62 ++++++++++++++++++++++++ > > lib/librte_ethdev/rte_flow_driver.h | 6 +++ > > 8 files changed, 149 insertions(+) > > > > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > > index e6ab8ff2f7..45bcff3cf5 100644 > > --- a/app/test-pmd/cmdline_flow.c > > +++ b/app/test-pmd/cmdline_flow.c > > @@ -343,6 +343,8 @@ enum index { > > ACTION_SET_IPV4_DSCP_VALUE, > > ACTION_SET_IPV6_DSCP, > > ACTION_SET_IPV6_DSCP_VALUE, > > + ACTION_AGE, > > + ACTION_AGE_TIMEOUT, > > }; > > > > /** Maximum size for pattern in struct rte_flow_item_raw. */ @@ > > -1145,6 +1147,7 @@ static const enum index next_action[] =3D { > > ACTION_SET_META, > > ACTION_SET_IPV4_DSCP, > > ACTION_SET_IPV6_DSCP, > > + ACTION_AGE, > > ZERO, > > }; > > > > @@ -1370,6 +1373,13 @@ static const enum index > action_set_ipv6_dscp[] =3D { > > ZERO, > > }; > > > > +static const enum index action_age[] =3D { > > + ACTION_AGE, > > + ACTION_AGE_TIMEOUT, > > + ACTION_NEXT, > > + ZERO, > > +}; > > + > > static int parse_set_raw_encap_decap(struct context *, const struct > token *, > > const char *, unsigned int, > > void *, unsigned int); > > @@ -3694,6 +3704,22 @@ static const struct token token_list[] =3D { > > (struct rte_flow_action_set_dscp, dscp)), > > .call =3D parse_vc_conf, > > }, > > + [ACTION_AGE] =3D { > > + .name =3D "age", > > + .help =3D "set a specific metadata header", > > + .next =3D NEXT(action_age), > > + .priv =3D PRIV_ACTION(AGE, > > + sizeof(struct rte_flow_action_age)), > > + .call =3D parse_vc, > > + }, > > + [ACTION_AGE_TIMEOUT] =3D { > > + .name =3D "timeout", > > + .help =3D "flow age timeout value", > > + .args =3D ARGS(ARGS_ENTRY_BF(struct rte_flow_action_age, > > + timeout, 24)), > > + .next =3D NEXT(action_age, NEXT_ENTRY(UNSIGNED)), > > + .call =3D parse_vc_conf, > > + }, > > }; > > > > /** Remove and return last entry from argument stack. */ diff --git > > a/doc/guides/prog_guide/rte_flow.rst > > b/doc/guides/prog_guide/rte_flow.rst > > index 41c147913c..cf4368e1c4 100644 > > --- a/doc/guides/prog_guide/rte_flow.rst > > +++ b/doc/guides/prog_guide/rte_flow.rst > > @@ -2616,6 +2616,28 @@ Otherwise, RTE_FLOW_ERROR_TYPE_ACTION > error > > will be returned. > > | ``dscp`` | DSCP in low 6 bits, rest ignore | > > +-----------+---------------------------------+ > > > > +Action: ``AGE`` > > +^^^^^^^^^^^^^^^^^^^^^^^^^ > > + > > +Set ageing timeout configuration to a flow. > > + > > +Event RTE_ETH_EVENT_FLOW_AGED will be reported if timeout passed > > +without any matching on the flow. > > + > > +.. _table_rte_flow_action_age: > > + > > +.. table:: AGE > > + > > + +--------------+---------------------------------+ > > + | Field | Value | > > + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D+ > > + | ``timeout`` | 24 bits timeout value | > > + +--------------+---------------------------------+ > > + | ``reserved`` | 8 bits reserved, must be zero | > > + +--------------+---------------------------------+ > > + | ``context`` | user input flow context | > > + +--------------+---------------------------------+ > > + > > Negative types > > ~~~~~~~~~~~~~~ > > > > diff --git a/doc/guides/rel_notes/release_20_05.rst > > b/doc/guides/rel_notes/release_20_05.rst > > index db885f3609..6b3cd8cda7 100644 > > --- a/doc/guides/rel_notes/release_20_05.rst > > +++ b/doc/guides/rel_notes/release_20_05.rst > > @@ -100,6 +100,17 @@ New Features > > > > * Added generic filter support. > > > > +* **Added flow Aging Support.** > > + > > + Added flow Aging support to detect and report aged-out flows, > including: > > + > > + * Added new action: RTE_FLOW_ACTION_TYPE_AGE to set the timeout > and > > the > > + application flow context for each flow. > > + * Added new event: RTE_ETH_EVENT_FLOW_AGED for the driver to > report > > that > > + there are new aged-out flows. > > + * Added new API: rte_flow_get_aged_flows to get the aged-out flows > > contexts > > + from the port. > > + > > Removed Items > > ------------- > > > > diff --git a/lib/librte_ethdev/rte_ethdev.h > > b/lib/librte_ethdev/rte_ethdev.h index d1a593ad11..74c9d00f36 100644 > > --- a/lib/librte_ethdev/rte_ethdev.h > > +++ b/lib/librte_ethdev/rte_ethdev.h > > @@ -3015,6 +3015,7 @@ enum rte_eth_event_type { > > RTE_ETH_EVENT_NEW, /**< port is probed */ > > RTE_ETH_EVENT_DESTROY, /**< port is released */ > > RTE_ETH_EVENT_IPSEC, /**< IPsec offload related event */ > > + RTE_ETH_EVENT_FLOW_AGED,/**< New aged-out flows is detected > */ > > RTE_ETH_EVENT_MAX /**< max value of this enum */ > > }; > > > > diff --git a/lib/librte_ethdev/rte_ethdev_version.map > > b/lib/librte_ethdev/rte_ethdev_version.map > > index 3f32fdecf7..fa4b5816be 100644 > > --- a/lib/librte_ethdev/rte_ethdev_version.map > > +++ b/lib/librte_ethdev/rte_ethdev_version.map > > @@ -230,4 +230,7 @@ EXPERIMENTAL { > > > > # added in 20.02 > > rte_flow_dev_dump; > > + > > + # added in 20.05 > > + rte_flow_get_aged_flows; > > }; > > diff --git a/lib/librte_ethdev/rte_flow.c > > b/lib/librte_ethdev/rte_flow.c index a5ac1c7fbd..3699edce49 100644 > > --- a/lib/librte_ethdev/rte_flow.c > > +++ b/lib/librte_ethdev/rte_flow.c > > @@ -172,6 +172,7 @@ static const struct rte_flow_desc_data > > rte_flow_desc_action[] =3D { > > MK_FLOW_ACTION(SET_META, sizeof(struct > rte_flow_action_set_meta)), > > MK_FLOW_ACTION(SET_IPV4_DSCP, sizeof(struct > > rte_flow_action_set_dscp)), > > MK_FLOW_ACTION(SET_IPV6_DSCP, sizeof(struct > > rte_flow_action_set_dscp)), > > + MK_FLOW_ACTION(AGE, sizeof(struct rte_flow_action_age)), > > }; > > > > int > > @@ -1232,3 +1233,20 @@ rte_flow_dev_dump(uint16_t port_id, FILE > *file, > > struct rte_flow_error *error) > > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > > NULL, rte_strerror(ENOSYS)); > > } > > + > > +int > > +rte_flow_get_aged_flows(uint16_t port_id, void **contexts, > > + uint32_t nb_contexts, struct rte_flow_error *error) { > > + struct rte_eth_dev *dev =3D &rte_eth_devices[port_id]; > > + const struct rte_flow_ops *ops =3D rte_flow_ops_get(port_id, error); > > + > > + if (unlikely(!ops)) > > + return -rte_errno; > > + if (likely(!!ops->get_aged_flows)) > > + return flow_err(port_id, ops->get_aged_flows(dev, contexts, > > + nb_contexts, error), error); > > + return rte_flow_error_set(error, ENOTSUP, > > + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, > > + NULL, rte_strerror(ENOTSUP)); > > +} > > diff --git a/lib/librte_ethdev/rte_flow.h > > b/lib/librte_ethdev/rte_flow.h index 7f3e08fad3..fab44f6c0b 100644 > > --- a/lib/librte_ethdev/rte_flow.h > > +++ b/lib/librte_ethdev/rte_flow.h > > @@ -2081,6 +2081,16 @@ enum rte_flow_action_type { > > * See struct rte_flow_action_set_dscp. > > */ > > RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP, > > + > > + /** > > + * Report as aged flow if timeout passed without any matching on > the > > + * flow. > > + * > > + * See struct rte_flow_action_age. > > + * See function rte_flow_get_aged_flows > > + * see enum RTE_ETH_EVENT_FLOW_AGED > > + */ > > + RTE_FLOW_ACTION_TYPE_AGE, > > }; > > > > /** > > @@ -2122,6 +2132,25 @@ struct rte_flow_action_queue { > > uint16_t index; /**< Queue index to use. */ }; > > > > +/** > > + * @warning > > + * @b EXPERIMENTAL: this structure may change without prior notice > > + * > > + * RTE_FLOW_ACTION_TYPE_AGE > > + * > > + * Report flow as aged-out if timeout passed without any matching > > + * on the flow. RTE_ETH_EVENT_FLOW_AGED event is triggered when a > > + * port detects new aged-out flows. > > + * > > + * The flow context and the flow handle will be reported by the > > + * rte_flow_get_aged_flows API. > > + */ > > +struct rte_flow_action_age { > > + uint32_t timeout:24; /**< Time in seconds. */ > > + uint32_t reserved:8; /**< Reserved, must be zero. */ > > + void *context; > > + /**< The user flow context, NULL means the rte_flow > pointer. > > */ > > +}; > > > > /** > > * @warning > > @@ -3254,6 +3283,39 @@ rte_flow_conv(enum rte_flow_conv_op op, > > const void *src, > > struct rte_flow_error *error); > > > > +/** > > + * Get aged-out flows of a given port. > > + * > > + * RTE_ETH_EVENT_FLOW_AGED event will be triggered when at least > one > > new aged > > + * out flow was detected after the last call to rte_flow_get_aged_flow= s. > > + * This function can be called to get the aged flows usynchronously > > +from the > > + * event callback or synchronously regardless the event. > > + * This is not safe to call rte_flow_get_aged_flows function with > > +other flow > > + * functions from multiple threads simultaneously. > > + * > > + * @param port_id > > + * Port identifier of Ethernet device. > > + * @param[in, out] contexts > > + * The address of an array of pointers to the aged-out flows context= s. > > + * @param[in] nb_contexts > > + * The length of context array pointers. > > + * @param[out] error > > + * Perform verbose error reporting if not NULL. Initialized in case = of > > + * error only. > > + * > > + * @return > > + * if nb_contexts is 0, return the amount of all aged contexts. > > + * if nb_contexts is not 0 , return the amount of aged flows reporte= d > > + * in the context array, otherwise negative errno value. > > + * > > + * @see rte_flow_action_age > > + * @see RTE_ETH_EVENT_FLOW_AGED > > + */ > > +__rte_experimental > > +int > > +rte_flow_get_aged_flows(uint16_t port_id, void **contexts, > > + uint32_t nb_contexts, struct rte_flow_error *error); > > + > > #ifdef __cplusplus > > } > > #endif > > diff --git a/lib/librte_ethdev/rte_flow_driver.h > > b/lib/librte_ethdev/rte_flow_driver.h > > index 51a9a57a0f..881cc469b7 100644 > > --- a/lib/librte_ethdev/rte_flow_driver.h > > +++ b/lib/librte_ethdev/rte_flow_driver.h > > @@ -101,6 +101,12 @@ struct rte_flow_ops { > > (struct rte_eth_dev *dev, > > FILE *file, > > struct rte_flow_error *error); > > + /** See rte_flow_get_aged_flows() */ > > + int (*get_aged_flows) > > + (struct rte_eth_dev *dev, > > + void **context, > > + uint32_t nb_contexts, > > + struct rte_flow_error *err); > > }; > > > > /** > > -- > > 2.21.0