From patchwork Wed Dec 23 12:41:20 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rahul Lakkireddy X-Patchwork-Id: 9652 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id EEB4768A5; Wed, 23 Dec 2015 13:41:56 +0100 (CET) Received: from stargate3.asicdesigners.com (stargate.chelsio.com [12.32.117.8]) by dpdk.org (Postfix) with ESMTP id E465C5A9D for ; Wed, 23 Dec 2015 13:41:54 +0100 (CET) Received: from localhost (scalar.blr.asicdesigners.com [10.193.185.94]) by stargate3.asicdesigners.com (8.13.8/8.13.8) with ESMTP id tBNCfpw0008859; Wed, 23 Dec 2015 04:41:52 -0800 From: Rahul Lakkireddy To: dev@dpdk.org Date: Wed, 23 Dec 2015 18:11:20 +0530 Message-Id: X-Mailer: git-send-email 2.5.3 In-Reply-To: References: In-Reply-To: References: Cc: Felix Marti , Kumar Sanghvi , Nirranjan Kirubaharan Subject: [dpdk-dev] [RFC v2 1/2] 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add a new packet filter flow that allows filtering a packet based on matching ingress port, ethertype, vlan, ip, and tcp/udp fields, i.e. matching based on any or all fields at the same time. Add the ability to provide masks for fields in flow to allow range of values. Allow selection of maskfull vs maskless filter types. Provide mechanism to set priority to maskfull vs maskless filter types when packet matches several filter types. Add a new vlan flow containing inner and outer vlan to match. Add tos, proto, and ttl fields that can be matched for ipv4 flow. Add tc, flow_label, next_header, and hop_limit fields that can be matched for ipv6 flow. Add a new behavior switch. Add the ability to provide behavior arguments to allow insert/deletion/ swapping of matched fields in the flow. Useful when rewriting matched fields with new 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. Signed-off-by: Rahul Lakkireddy Signed-off-by: Kumar Sanghvi --- v2: 1. Added ttl to rte_eth_ipv4_flow and tc, flow_label, next_header, and hop_limit to rte_eth_ipv6_flow. 2. Added new field type to rte_eth_pkt_filter_flow to differentiate between maskfull and maskless filter types. 3. Added new field prio to rte_eth_pkt_filter_flow to allow setting priority over maskfull or maskless when packet matches multiple filter types. 4. Added new behavior sub op RTE_FDIR_BEHAVIOR_SUB_OP_SWAP to allow swapping fields in matched flows. Useful when swapping mac addresses in hardware before switching. lib/librte_ether/rte_eth_ctrl.h | 127 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 1 deletion(-) diff --git a/lib/librte_ether/rte_eth_ctrl.h b/lib/librte_ether/rte_eth_ctrl.h index ce224ad..5cc22a0 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 /** * Feature filter types @@ -407,6 +411,9 @@ 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. */ + uint8_t ttl; /**< IPV4 time to live to match. */ }; /** @@ -443,6 +450,10 @@ struct rte_eth_sctpv4_flow { struct rte_eth_ipv6_flow { uint32_t src_ip[4]; /**< IPv6 source address to match. */ uint32_t dst_ip[4]; /**< IPv6 destination address to match. */ + uint8_t tc; /**< IPv6 traffic class to match. */ + uint32_t flow_label; /**< IPv6 flow label to match. */ + uint8_t next_header; /**< IPv6 next header to match. */ + uint8_t hop_limit; /**< IPv6 hop limits to match. */ }; /** @@ -500,6 +511,51 @@ struct rte_eth_tunnel_flow { }; /** + * 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. + */ +enum rte_eth_pkt_filter_type { + RTE_ETH_PKT_FILTER_TYPE_MASKLESS = 0, /**< Ignore masks in the flow */ + RTE_ETH_PKT_FILTER_TYPE_MASKFULL, /**< Consider masks in the flow */ +}; + +struct rte_eth_pkt_filter_flow { + enum rte_eth_pkt_filter_type type; /**< Type of filter */ + enum rte_eth_pkt_filter_type prio; + /**< Prioritize the filter type when a packet matches several types */ + 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 +570,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; }; /** @@ -545,6 +602,7 @@ enum rte_eth_fdir_behavior { RTE_ETH_FDIR_ACCEPT = 0, RTE_ETH_FDIR_REJECT, RTE_ETH_FDIR_PASSTHRU, + RTE_ETH_FDIR_SWITCH, }; /** @@ -559,6 +617,71 @@ enum rte_eth_fdir_status { }; /** + * Behavior sub operations on fields in matched flows. + */ +enum rte_eth_fdir_behavior_sub_op { + RTE_FDIR_BEHAVIOR_SUB_OP_UNKNOWN = 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 */ + RTE_FDIR_BEHAVIOR_SUB_OP_SWAP, + /**< Swap 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 rewrite. */ + 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 +692,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 */ }; /**