X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fethdev%2Frte_flow.h;h=ebcd3a3c8e8cd26cfed23d5b95d5bc267b409f1c;hb=64be0e779fac9acd96088c62c30b98cca8d0148a;hp=ba36edb9f9d8bac8679d3323f791690e7d307ea6;hpb=1179f05cc9a044541106981b0366f474043d7872;p=dpdk.git diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index ba36edb9f9..ebcd3a3c8e 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -35,6 +35,8 @@ #include #include #include +#include +#include #ifdef __cplusplus extern "C" { @@ -635,6 +637,29 @@ enum rte_flow_item_type { * @see struct rte_flow_item_ethdev */ RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT, + + /** + * Matches a configured set of fields at runtime calculated offsets + * over the generic network header with variable length and + * flexible pattern + * + * @see struct rte_flow_item_flex. + */ + RTE_FLOW_ITEM_TYPE_FLEX, + + /** + * Matches L2TPv2 Header. + * + * See struct rte_flow_item_l2tpv2. + */ + RTE_FLOW_ITEM_TYPE_L2TPV2, + + /** + * Matches PPP Header. + * + * See struct rte_flow_item_ppp. + */ + RTE_FLOW_ITEM_TYPE_PPP, }; /** @@ -892,8 +917,8 @@ struct rte_flow_item_vlan { }; struct rte_vlan_hdr hdr; }; + /** Packet header contains at least one more VLAN, after this VLAN. */ uint32_t has_more_vlan:1; - /**< Packet header contains at least one more VLAN, after this VLAN. */ uint32_t reserved:31; /**< Reserved, must be zero. */ }; @@ -935,26 +960,26 @@ static const struct rte_flow_item_ipv4 rte_flow_item_ipv4_mask = { */ struct rte_flow_item_ipv6 { struct rte_ipv6_hdr hdr; /**< IPv6 header definition. */ + /** Header contains Hop-by-Hop Options extension header. */ uint32_t has_hop_ext:1; - /**< Header contains Hop-by-Hop Options extension header. */ + /** Header contains Routing extension header. */ uint32_t has_route_ext:1; - /**< Header contains Routing extension header. */ + /** Header contains Fragment extension header. */ uint32_t has_frag_ext:1; - /**< Header contains Fragment extension header. */ + /** Header contains Authentication extension header. */ uint32_t has_auth_ext:1; - /**< Header contains Authentication extension header. */ + /** Header contains Encapsulation Security Payload extension header. */ uint32_t has_esp_ext:1; - /**< Header contains Encapsulation Security Payload extension header. */ + /** Header contains Destination Options extension header. */ uint32_t has_dest_ext:1; - /**< Header contains Destination Options extension header. */ + /** Header contains Mobility extension header. */ uint32_t has_mobil_ext:1; - /**< Header contains Mobility extension header. */ + /** Header contains Host Identity Protocol extension header. */ uint32_t has_hip_ext:1; - /**< Header contains Host Identity Protocol extension header. */ + /** Header contains Shim6 Protocol extension header. */ uint32_t has_shim6_ext:1; - /**< Header contains Shim6 Protocol extension header. */ + /** Reserved for future extension headers, must be zero. */ uint32_t reserved:23; - /**< Reserved for future extension headers, must be zero. */ }; /** Default mask for RTE_FLOW_ITEM_TYPE_IPV6. */ @@ -1495,11 +1520,12 @@ rte_flow_item_icmp6_nd_opt_tla_eth_mask = { * RTE_FLOW_ITEM_TYPE_META * * Matches a specified metadata value. On egress, metadata can be set - * either by mbuf dynamic metadata field with PKT_TX_DYNF_METADATA flag or - * RTE_FLOW_ACTION_TYPE_SET_META. On ingress, RTE_FLOW_ACTION_TYPE_SET_META + * either by mbuf dynamic metadata field with RTE_MBUF_DYNFLAG_TX_METADATA flag + * or RTE_FLOW_ACTION_TYPE_SET_META. On ingress, RTE_FLOW_ACTION_TYPE_SET_META * sets metadata for a packet and the metadata will be reported via mbuf - * metadata dynamic field with PKT_RX_DYNF_METADATA flag. The dynamic mbuf - * field must be registered in advance by rte_flow_dynf_metadata_register(). + * metadata dynamic field with RTE_MBUF_DYNFLAG_RX_METADATA flag. The dynamic + * mbuf field must be registered in advance by + * rte_flow_dynf_metadata_register(). */ struct rte_flow_item_meta { uint32_t data; @@ -1891,6 +1917,57 @@ static const struct rte_flow_item_ethdev rte_flow_item_ethdev_mask = { }; #endif +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * RTE_FLOW_ITEM_TYPE_L2TPV2 + * + * Matches L2TPv2 Header + */ +struct rte_flow_item_l2tpv2 { + struct rte_l2tpv2_combined_msg_hdr hdr; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_L2TPV2. */ +#ifndef __cplusplus +static const struct rte_flow_item_l2tpv2 rte_flow_item_l2tpv2_mask = { + /* + * flags and version bit mask + * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + * T L x x S x O P x x x x V V V V + */ + .hdr = { + .common = { + .flags_version = RTE_BE16(0xcb0f), + }, + }, +}; +#endif + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * RTE_FLOW_ITEM_TYPE_PPP + * + * Matches PPP Header + */ +struct rte_flow_item_ppp { + struct rte_ppp_hdr hdr; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_PPP. */ +#ifndef __cplusplus +static const struct rte_flow_item_ppp rte_flow_item_ppp_mask = { + .hdr = { + .addr = 0xff, + .ctrl = 0xff, + .proto_id = RTE_BE16(0xffff), + } +}; +#endif + /** * Matching pattern item definition. * @@ -1931,6 +2008,177 @@ struct rte_flow_item { const void *mask; /**< Bit-mask applied to spec and last. */ }; +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * RTE_FLOW_ITEM_TYPE_FLEX + * + * Matches a specified set of fields within the network protocol + * header. Each field is presented as set of bits with specified width, and + * bit offset from the header beginning. + * + * The pattern is concatenation of bit fields configured at item creation + * by rte_flow_flex_item_create(). At configuration the fields are presented + * by sample_data array. + * + * This type does not support ranges (struct rte_flow_item.last). + */ +struct rte_flow_item_flex { + struct rte_flow_item_flex_handle *handle; /**< Opaque item handle. */ + uint32_t length; /**< Pattern length in bytes. */ + const uint8_t *pattern; /**< Combined bitfields pattern to match. */ +}; +/** + * Field bit offset calculation mode. + */ +enum rte_flow_item_flex_field_mode { + /** + * Dummy field, used for byte boundary alignment in pattern. + * Pattern mask and data are ignored in the match. All configuration + * parameters besides field size are ignored. + */ + FIELD_MODE_DUMMY = 0, + /** + * Fixed offset field. The bit offset from header beginning + * is permanent and defined by field_base parameter. + */ + FIELD_MODE_FIXED, + /** + * The field bit offset is extracted from other header field (indirect + * offset field). The resulting field offset to match is calculated as: + * + * field_base + (*offset_base & offset_mask) << offset_shift + */ + FIELD_MODE_OFFSET, + /** + * The field bit offset is extracted from other header field (indirect + * offset field), the latter is considered as bitmask containing some + * number of one bits, the resulting field offset to match is + * calculated as: + * + * field_base + bitcount(*offset_base & offset_mask) << offset_shift + */ + FIELD_MODE_BITMASK, +}; + +/** + * Flex item field tunnel mode + */ +enum rte_flow_item_flex_tunnel_mode { + /** + * The protocol header can be present in the packet only once. + * No multiple flex item flow inclusions (for inner/outer) are allowed. + * No any relations with tunnel protocols are imposed. The drivers + * can optimize hardware resource usage to handle match on single flex + * item of specific type. + */ + FLEX_TUNNEL_MODE_SINGLE = 0, + /** + * Flex item presents outer header only. + */ + FLEX_TUNNEL_MODE_OUTER, + /** + * Flex item presents inner header only. + */ + FLEX_TUNNEL_MODE_INNER, + /** + * Flex item presents either inner or outer header. The driver + * handles as many multiple inners as hardware supports. + */ + FLEX_TUNNEL_MODE_MULTI, + /** + * Flex item presents tunnel protocol header. + */ + FLEX_TUNNEL_MODE_TUNNEL, +}; + +/** + * + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + */ +__extension__ +struct rte_flow_item_flex_field { + /** Defines how match field offset is calculated over the packet. */ + enum rte_flow_item_flex_field_mode field_mode; + uint32_t field_size; /**< Field size in bits. */ + int32_t field_base; /**< Field offset in bits. */ + uint32_t offset_base; /**< Indirect offset field offset in bits. */ + uint32_t offset_mask; /**< Indirect offset field bit mask. */ + int32_t offset_shift; /**< Indirect offset multiply factor. */ + uint32_t field_id:16; /**< Device hint, for multiple items in flow. */ + uint32_t reserved:16; /**< Reserved field. */ +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + */ +struct rte_flow_item_flex_link { + /** + * Preceding/following header. The item type must be always provided. + * For preceding one item must specify the header value/mask to match + * for the link be taken and start the flex item header parsing. + */ + struct rte_flow_item item; + /** + * Next field value to match to continue with one of the configured + * next protocols. + */ + uint32_t next; +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + */ +struct rte_flow_item_flex_conf { + /** + * Specifies the flex item and tunnel relations and tells the PMD + * whether flex item can be used for inner, outer or both headers, + * or whether flex item presents the tunnel protocol itself. + */ + enum rte_flow_item_flex_tunnel_mode tunnel; + /** + * The next header offset, it presents the network header size covered + * by the flex item and can be obtained with all supported offset + * calculating methods (fixed, dedicated field, bitmask, etc). + */ + struct rte_flow_item_flex_field next_header; + /** + * Specifies the next protocol field to match with link next protocol + * values and continue packet parsing with matching link. + */ + struct rte_flow_item_flex_field next_protocol; + /** + * The fields will be sampled and presented for explicit match + * with pattern in the rte_flow_flex_item. There can be multiple + * fields descriptors, the number should be specified by nb_samples. + */ + struct rte_flow_item_flex_field *sample_data; + /** Number of field descriptors in the sample_data array. */ + uint32_t nb_samples; + /** + * Input link defines the flex item relation with preceding + * header. It specified the preceding item type and provides pattern + * to match. The flex item will continue parsing and will provide the + * data to flow match in case if there is the match with one of input + * links. + */ + struct rte_flow_item_flex_link *input_link; + /** Number of link descriptors in the input link array. */ + uint32_t nb_inputs; + /** + * Output link defines the next protocol field value to match and + * the following protocol header to continue packet parsing. Also + * defines the tunnel-related behaviour. + */ + struct rte_flow_item_flex_link *output_link; + /** Number of link descriptors in the output link array. */ + uint32_t nb_outputs; +}; + /** * Action types. * @@ -1992,8 +2240,8 @@ enum rte_flow_action_type { RTE_FLOW_ACTION_TYPE_JUMP, /** - * Attaches an integer value to packets and sets PKT_RX_FDIR and - * PKT_RX_FDIR_ID mbuf flags. + * Attaches an integer value to packets and sets RTE_MBUF_F_RX_FDIR and + * RTE_MBUF_F_RX_FDIR_ID mbuf flags. * * See struct rte_flow_action_mark. * @@ -2005,7 +2253,7 @@ enum rte_flow_action_type { /** * Flags packets. Similar to MARK without a specific value; only - * sets the PKT_RX_FDIR mbuf flag. + * sets the RTE_MBUF_F_RX_FDIR mbuf flag. * * No associated configuration structure. * @@ -2181,7 +2429,7 @@ enum rte_flow_action_type { RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, /** - * Implements OFPAT_SET_VLAN_VID ("set the 802.1q VLAN id") as + * Implements OFPAT_SET_VLAN_VID ("set the 802.1q VLAN ID") as * defined by the OpenFlow Switch Specification. * * See struct rte_flow_action_of_set_vlan_vid. @@ -2545,8 +2793,8 @@ enum rte_flow_action_type { /** * RTE_FLOW_ACTION_TYPE_MARK * - * Attaches an integer value to packets and sets PKT_RX_FDIR and - * PKT_RX_FDIR_ID mbuf flags. + * Attaches an integer value to packets and sets RTE_MBUF_F_RX_FDIR and + * RTE_MBUF_F_RX_FDIR_ID mbuf flags. * * This value is arbitrary and application-defined. Maximum allowed value * depends on the underlying implementation. It is returned in the @@ -2597,8 +2845,8 @@ struct rte_flow_action_queue { struct rte_flow_action_age { uint32_t timeout:24; /**< Time in seconds. */ uint32_t reserved:8; /**< Reserved, must be zero. */ + /** The user flow context, NULL means the rte_flow pointer. */ void *context; - /**< The user flow context, NULL means the rte_flow pointer. */ }; /** @@ -2610,8 +2858,8 @@ struct rte_flow_action_age { struct rte_flow_query_age { uint32_t reserved:6; /**< Reserved, must be zero. */ uint32_t aged:1; /**< 1 if aging timeout expired, 0 otherwise. */ + /** sec_since_last_hit value is valid. */ uint32_t sec_since_last_hit_valid:1; - /**< sec_since_last_hit value is valid. */ uint32_t sec_since_last_hit:24; /**< Seconds since last traffic hit. */ }; @@ -2624,12 +2872,12 @@ struct rte_flow_query_age { * Adds a counter action to a matched flow. * * If more than one count action is specified in a single flow rule, then each - * action must specify a unique id. + * action must specify a unique ID. * * Counters can be retrieved and reset through ``rte_flow_query()``, see * ``struct rte_flow_query_count``. * - * For ports within the same switch domain then the counter id namespace extends + * For ports within the same switch domain then the counter ID namespace extends * to all ports within that switch domain. */ struct rte_flow_action_count { @@ -2710,7 +2958,7 @@ struct rte_flow_action_rss { * through. */ uint32_t level; - uint64_t types; /**< Specific RSS hash types (see ETH_RSS_*). */ + uint64_t types; /**< Specific RSS hash types (see RTE_ETH_RSS_*). */ uint32_t key_len; /**< Hash key length in bytes. */ uint32_t queue_num; /**< Number of entries in @p queue. */ const uint8_t *key; /**< Hash key. */ @@ -2853,11 +3101,11 @@ struct rte_flow_action_of_push_vlan { /** * RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID * - * Implements OFPAT_SET_VLAN_VID ("set the 802.1q VLAN id") as defined by + * Implements OFPAT_SET_VLAN_VID ("set the 802.1q VLAN ID") as defined by * the OpenFlow Switch Specification. */ struct rte_flow_action_of_set_vlan_vid { - rte_be16_t vlan_vid; /**< VLAN id. */ + rte_be16_t vlan_vid; /**< VLAN ID. */ }; /** @@ -3089,10 +3337,10 @@ struct rte_flow_action_set_tag { * RTE_FLOW_ACTION_TYPE_SET_META * * Set metadata. Metadata set by mbuf metadata dynamic field with - * PKT_TX_DYNF_DATA flag on egress will be overridden by this action. On - * ingress, the metadata will be carried by mbuf metadata dynamic field - * with PKT_RX_DYNF_METADATA flag if set. The dynamic mbuf field must be - * registered in advance by rte_flow_dynf_metadata_register(). + * RTE_MBUF_DYNFLAG_TX_METADATA flag on egress will be overridden by this + * action. On ingress, the metadata will be carried by mbuf metadata dynamic + * field with RTE_MBUF_DYNFLAG_RX_METADATA flag if set. The dynamic mbuf field + * must be registered in advance by rte_flow_dynf_metadata_register(). * * Altering partial bits is supported with mask. For bits which have never * been set, unpredictable value will be seen depending on driver @@ -3242,7 +3490,7 @@ struct rte_flow_action_conntrack { uint32_t last_direction:1; /** No TCP check will be done except the state change. */ uint32_t liberal_mode:1; - /**