X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fethdev%2Frte_flow.h;h=c16f5ba13533db05ca986891794797133c1a976b;hb=9847fd125d329a4097bea9276d9bbf5f37859948;hp=25e20f5048d7724cc0b0b35819d776cf12068350;hpb=dc7b3bfcf8a905aa9d55fab893f72decb0141d0a;p=dpdk.git diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index 25e20f5048..c16f5ba135 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -562,6 +563,15 @@ enum rte_flow_item_type { * @see struct rte_flow_item_integrity. */ RTE_FLOW_ITEM_TYPE_INTEGRITY, + + /** + * [META] + * + * Matches conntrack state. + * + * @see struct rte_flow_item_conntrack. + */ + RTE_FLOW_ITEM_TYPE_CONNTRACK, }; /** @@ -1735,6 +1745,51 @@ rte_flow_item_integrity_mask = { }; #endif +/** + * The packet is valid after conntrack checking. + */ +#define RTE_FLOW_CONNTRACK_PKT_STATE_VALID RTE_BIT32(0) +/** + * The state of the connection is changed. + */ +#define RTE_FLOW_CONNTRACK_PKT_STATE_CHANGED RTE_BIT32(1) +/** + * Error is detected on this packet for this connection and + * an invalid state is set. + */ +#define RTE_FLOW_CONNTRACK_PKT_STATE_INVALID RTE_BIT32(2) +/** + * The HW connection tracking module is disabled. + * It can be due to application command or an invalid state. + */ +#define RTE_FLOW_CONNTRACK_PKT_STATE_DISABLED RTE_BIT32(3) +/** + * The packet contains some bad field(s) and cannot continue + * with the conntrack module checking. + */ +#define RTE_FLOW_CONNTRACK_PKT_STATE_BAD RTE_BIT32(4) + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * RTE_FLOW_ITEM_TYPE_CONNTRACK + * + * Matches the state of a packet after it passed the connection tracking + * examination. The state is a bitmap of one RTE_FLOW_CONNTRACK_PKT_STATE* + * or a reasonable combination of these bits. + */ +struct rte_flow_item_conntrack { + uint32_t flags; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_CONNTRACK. */ +#ifndef __cplusplus +static const struct rte_flow_item_conntrack rte_flow_item_conntrack_mask = { + .flags = 0xffffffff, +}; +#endif + /** * Matching pattern item definition. * @@ -2328,6 +2383,15 @@ enum rte_flow_action_type { * or different ethdev ports. */ RTE_FLOW_ACTION_TYPE_INDIRECT, + + /** + * [META] + * + * Enable tracking a TCP connection state. + * + * @see struct rte_flow_action_conntrack. + */ + RTE_FLOW_ACTION_TYPE_CONNTRACK, }; /** @@ -2926,6 +2990,154 @@ struct rte_flow_action_set_dscp { */ struct rte_flow_action_handle; +/** + * The state of a TCP connection. + */ +enum rte_flow_conntrack_state { + /** SYN-ACK packet was seen. */ + RTE_FLOW_CONNTRACK_STATE_SYN_RECV, + /** 3-way handshake was done. */ + RTE_FLOW_CONNTRACK_STATE_ESTABLISHED, + /** First FIN packet was received to close the connection. */ + RTE_FLOW_CONNTRACK_STATE_FIN_WAIT, + /** First FIN was ACKed. */ + RTE_FLOW_CONNTRACK_STATE_CLOSE_WAIT, + /** Second FIN was received, waiting for the last ACK. */ + RTE_FLOW_CONNTRACK_STATE_LAST_ACK, + /** Second FIN was ACKed, connection was closed. */ + RTE_FLOW_CONNTRACK_STATE_TIME_WAIT, +}; + +/** + * The last passed TCP packet flags of a connection. + */ +enum rte_flow_conntrack_tcp_last_index { + RTE_FLOW_CONNTRACK_FLAG_NONE = 0, /**< No Flag. */ + RTE_FLOW_CONNTRACK_FLAG_SYN = RTE_BIT32(0), /**< With SYN flag. */ + RTE_FLOW_CONNTRACK_FLAG_SYNACK = RTE_BIT32(1), /**< With SYNACK flag. */ + RTE_FLOW_CONNTRACK_FLAG_FIN = RTE_BIT32(2), /**< With FIN flag. */ + RTE_FLOW_CONNTRACK_FLAG_ACK = RTE_BIT32(3), /**< With ACK flag. */ + RTE_FLOW_CONNTRACK_FLAG_RST = RTE_BIT32(4), /**< With RST flag. */ +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * Configuration parameters for each direction of a TCP connection. + * All fields should be in host byte order. + * If needed, driver should convert all fields to network byte order + * if HW needs them in that way. + */ +struct rte_flow_tcp_dir_param { + /** TCP window scaling factor, 0xF to disable. */ + uint32_t scale:4; + /** The FIN was sent by this direction. */ + uint32_t close_initiated:1; + /** An ACK packet has been received by this side. */ + uint32_t last_ack_seen:1; + /** + * If set, it indicates that there is unacknowledged data for the + * packets sent from this direction. + */ + uint32_t data_unacked:1; + /** + * Maximal value of sequence + payload length in sent + * packets (next ACK from the opposite direction). + */ + uint32_t sent_end; + /** + * Maximal value of (ACK + window size) in received packet + length + * over sent packet (maximal sequence could be sent). + */ + uint32_t reply_end; + /** Maximal value of actual window size in sent packets. */ + uint32_t max_win; + /** Maximal value of ACK in sent packets. */ + uint32_t max_ack; +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * RTE_FLOW_ACTION_TYPE_CONNTRACK + * + * Configuration and initial state for the connection tracking module. + * This structure could be used for both setting and query. + * All fields should be in host byte order. + */ +struct rte_flow_action_conntrack { + /** The peer port number, can be the same port. */ + uint16_t peer_port; + /** + * Direction of this connection when creating a flow rule, the + * value only affects the creation of subsequent flow rules. + */ + uint32_t is_original_dir:1; + /** + * Enable / disable the conntrack HW module. When disabled, the + * result will always be RTE_FLOW_CONNTRACK_FLAG_DISABLED. + * In this state the HW will act as passthrough. + * It only affects this conntrack object in the HW without any effect + * to the other objects. + */ + uint32_t enable:1; + /** At least one ack was seen after the connection was established. */ + uint32_t live_connection:1; + /** Enable selective ACK on this connection. */ + uint32_t selective_ack:1; + /** A challenge ack has passed. */ + uint32_t challenge_ack_passed:1; + /** + * 1: The last packet is seen from the original direction. + * 0: The last packet is seen from the reply direction. + */ + uint32_t last_direction:1; + /** No TCP check will be done except the state change. */ + uint32_t liberal_mode:1; + /**