From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 80A8A8E58 for ; Thu, 10 Dec 2015 16:46:46 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga101.fm.intel.com with ESMTP; 10 Dec 2015 07:46:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,408,1444719600"; d="scan'208";a="858159557" Received: from irsmsx107.ger.corp.intel.com ([163.33.3.99]) by fmsmga001.fm.intel.com with ESMTP; 10 Dec 2015 07:46:44 -0800 Received: from irsmsx106.ger.corp.intel.com ([169.254.8.228]) by IRSMSX107.ger.corp.intel.com ([169.254.10.124]) with mapi id 14.03.0248.002; Thu, 10 Dec 2015 15:46:43 +0000 From: "Chilikin, Andrey" To: Rahul Lakkireddy , "dev@dpdk.org" Thread-Topic: [dpdk-dev] [RFC 1/3] ethdev: add packet filter flow and new behavior switch to fdir Thread-Index: AQHRM1OrwenrUVZJnE6cGYikONSI6p7EVxQg Date: Thu, 10 Dec 2015 15:46:42 +0000 Message-ID: References: <1dabf80beb341e03923a535d0fa13f244350af34.1449747042.git.rahul.lakkireddy@chelsio.com> In-Reply-To: <1dabf80beb341e03923a535d0fa13f244350af34.1449747042.git.rahul.lakkireddy@chelsio.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-inteldataclassification: CTP_IC x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsIiwiaWQiOiJlOTRlMDQ0Yi00Yzg0LTQxZWEtYWZiYy02NjQxYzNlMDBkY2EiLCJwcm9wcyI6W3sibiI6IkludGVsRGF0YUNsYXNzaWZpY2F0aW9uIiwidmFscyI6W3sidmFsdWUiOiJDVFBfSUMifV19XX0sIlN1YmplY3RMYWJlbHMiOltdLCJUTUNWZXJzaW9uIjoiMTUuNC4xMC4xOSIsIlRydXN0ZWRMYWJlbEhhc2giOiJtcFBXSzBVUEh3ZjRaQVQ5eGJXaDlqMUdFcnFzZ0J0KzJRXC9mdENTY1JIST0ifQ== x-originating-ip: [163.33.239.180] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Cc: Kumar Sanghvi , Felix Marti , Nirranjan Kirubaharan Subject: Re: [dpdk-dev] [RFC 1/3] ethdev: add packet filter flow and new behavior switch to fdir X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Dec 2015 15:46:47 -0000 Hi Rahul, If ABI for fdir is going to be changed should we then take more general app= roach to accommodate other NICs as well? For example, for "rte_eth_ipv4_fl= ow" you have "tos" and "proto" fields added, but "ttl" was left out of scop= e. I believe that "rte_eth_udpv6_flow" should be compatible with new IPv4 s= tructure, so "flow label", "tc", "next header" and "hop limit" to be added = as well as other NICs might have support for fdir rules for all these field= s. Regards, Andrey > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Rahul Lakkireddy > Sent: Thursday, December 10, 2015 2:01 PM > To: dev@dpdk.org > Cc: Felix Marti; Kumar Sanghvi; Nirranjan Kirubaharan > Subject: [dpdk-dev] [RFC 1/3] ethdev: add packet filter flow and new beha= vior > switch to fdir >=20 > Add a new packet filter flow that allows filtering a packet based on matc= hing > ingress port, ethertype, vlan, ip, and tcp/udp fields, i.e. > matching based on any or all fields at the same time. >=20 > Add the ability to provide masks for fields in flow to allow range of val= ues. >=20 > Add a new vlan flow containing inner and outer vlan to match. Add tos and > proto fields that can be matched for ipv4_flow. >=20 > Add a new behavior switch. >=20 > Add the ability to provide behavior arguments to allow insert/deletion of > matched fields in the flow. Useful when rewriting matched fields with ne= w > values. Adds arguments for port, mac, vlan, and nat. > Ex: allows to provide new ip and port addresses to rewrite the fields of = packets > matching a filter rule before NAT'ing. >=20 > Signed-off-by: Rahul Lakkireddy > Signed-off-by: Kumar Sanghvi > --- > lib/librte_ether/rte_eth_ctrl.h | 112 > +++++++++++++++++++++++++++++++++++++++- > 1 file changed, 111 insertions(+), 1 deletion(-) >=20 > diff --git a/lib/librte_ether/rte_eth_ctrl.h b/lib/librte_ether/rte_eth_c= trl.h > index ce224ad..a2e770c 100644 > --- a/lib/librte_ether/rte_eth_ctrl.h > +++ b/lib/librte_ether/rte_eth_ctrl.h > @@ -74,7 +74,11 @@ extern "C" { > #define RTE_ETH_FLOW_IPV6_EX 15 > #define RTE_ETH_FLOW_IPV6_TCP_EX 16 > #define RTE_ETH_FLOW_IPV6_UDP_EX 17 > -#define RTE_ETH_FLOW_MAX 18 > +#define RTE_ETH_FLOW_PKT_FILTER_IPV4_TCP 18 #define > +RTE_ETH_FLOW_PKT_FILTER_IPV4_UDP 19 #define > +RTE_ETH_FLOW_PKT_FILTER_IPV6_TCP 20 #define > +RTE_ETH_FLOW_PKT_FILTER_IPV6_UDP 21 > +#define RTE_ETH_FLOW_MAX 22 >=20 > /** > * Feature filter types > @@ -407,6 +411,8 @@ struct rte_eth_l2_flow { struct rte_eth_ipv4_flow { > uint32_t src_ip; /**< IPv4 source address to match. */ > uint32_t dst_ip; /**< IPv4 destination address to match. */ > + uint8_t tos; /**< IPV4 type of service to match. */ > + uint8_t proto; /**< IPV4 proto to match. */ > }; >=20 > /** > @@ -500,6 +506,43 @@ struct rte_eth_tunnel_flow { }; >=20 > /** > + * A structure used to define the input for vlan flow. > + */ > +struct rte_eth_vlan_flow { > + uint16_t inner_vlan; /**< Inner vlan field to match. */ > + uint16_t outer_vlan; /**< Outer vlan field to match. */ }; > + > +/** > + * A union used to define the input for N-Tuple flow */ union > +rte_eth_ntuple_flow { > + struct rte_eth_tcpv4_flow tcp4; > + struct rte_eth_udpv4_flow udp4; > + struct rte_eth_tcpv6_flow tcp6; > + struct rte_eth_udpv6_flow udp6; > +}; > + > +/** > + * A structure used to define the input for packet filter. > + */ > +struct rte_eth_pkt_filter { > + uint8_t port_id; /**< Port id to match. */ > + struct rte_eth_l2_flow l2_flow; /**< L2 flow fields to match. */ > + struct rte_eth_vlan_flow vlan_flow; /**< Vlan flow fields to match. */ > + union rte_eth_ntuple_flow ntuple_flow; > + /**< N-tuple flow fields to match. */ > +}; > + > +/** > + * A structure used to define the input for packet filter flow. > + */ > +struct rte_eth_pkt_filter_flow { > + struct rte_eth_pkt_filter pkt; /**< Packet fields to match. */ > + struct rte_eth_pkt_filter mask; /**< Mask for matched fields. */ > +}; > + > +/** > * An union contains the inputs for all types of flow > */ > union rte_eth_fdir_flow { > @@ -514,6 +557,7 @@ union rte_eth_fdir_flow { > struct rte_eth_ipv6_flow ipv6_flow; > struct rte_eth_mac_vlan_flow mac_vlan_flow; > struct rte_eth_tunnel_flow tunnel_flow; > + struct rte_eth_pkt_filter_flow pkt_filter_flow; > }; >=20 > /** > @@ -545,6 +589,7 @@ enum rte_eth_fdir_behavior { > RTE_ETH_FDIR_ACCEPT =3D 0, > RTE_ETH_FDIR_REJECT, > RTE_ETH_FDIR_PASSTHRU, > + RTE_ETH_FDIR_SWITCH, > }; >=20 > /** > @@ -559,6 +604,69 @@ enum rte_eth_fdir_status { }; >=20 > /** > + * Behavior sub operations on fields in matched flows. > + */ > +enum rte_eth_fdir_behavior_sub_op { > + RTE_FDIR_BEHAVIOR_SUB_OP_UNKNOWN =3D 0, > + RTE_FDIR_BEHAVIOR_SUB_OP_INSERT, > + /**< Add/rewrite fields in matched flows */ > + RTE_FDIR_BEHAVIOR_SUB_OP_DELETE, > + /**< Delete/reset fields in matched flows */ }; > + > +/** > + * A structure used to define the input for passing port arguments for > + * behavior taken. > + */ > +struct rte_eth_behavior_arg_port { > + enum rte_eth_fdir_behavior_sub_op op; /**< Sub operation to do */ > + uint8_t port_id; /**< Physical port to redirect */ > +}; > + > +/** > + * A structure used to define the input for passing mac arguments for > + * behavior taken. > + */ > +struct rte_eth_behavior_arg_mac { > + enum rte_eth_fdir_behavior_sub_op op; /**< Sub operation to do */ > + struct ether_addr src_mac; /**< SRC Ethernet Address to rewirte. */ > + struct ether_addr dst_mac; /**< DST Ethernet Address to rewrite. */ > +}; > + > +/** > + * A structure used to define the input for passing vlan arguments for > + * behavior taken. > + */ > +struct rte_eth_behavior_arg_vlan { > + enum rte_eth_fdir_behavior_sub_op op; /**< Sub operation to do */ > + uint16_t vlan_tci; /**< New vlan fields to rewrite matched ones */ }; > + > +/** > + * A structure used to define the input for passing Network Address > + * Translation (NAT) arguments for behavior taken. > + */ > +struct rte_eth_behavior_arg_nat { > + enum rte_eth_fdir_behavior_sub_op op; /**< Sub operation to do */ > + union rte_eth_ntuple_flow nat; > + /**< New NAT fields to rewrite matched ones */ }; > + > +/** > + * Extra arguments to pass for a behavior taken. > + */ > +struct rte_eth_fdir_behavior_arg { > + struct rte_eth_behavior_arg_port port_arg; > + /**< Extra port arg to pass */ > + struct rte_eth_behavior_arg_mac mac_arg; > + /**< Extra mac arg to pass */ > + struct rte_eth_behavior_arg_vlan vlan_arg; > + /**< Extra vlan arg to pass */ > + struct rte_eth_behavior_arg_nat nat_arg; > + /**< Extra NAT arg to pass */ > +}; > + > +/** > * A structure used to define an action when match FDIR packet filter. > */ > struct rte_eth_fdir_action { > @@ -569,6 +677,8 @@ struct rte_eth_fdir_action { > /**< If report_status is RTE_ETH_FDIR_REPORT_ID_FLEX_4 or > RTE_ETH_FDIR_REPORT_FLEX_8, flex_off specifies where the > reported > flex bytes start from in flexible payload. */ > + struct rte_eth_fdir_behavior_arg behavior_arg; > + /**< Extra arguments for behavior taken */ > }; >=20 > /** > -- > 2.5.3