xref: /dpdk/drivers/net/hns3/hns3_fdir.h (revision ac72aae60f71b8716f65d1e2daf531a5ca38c998)
1fcba820dSWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause
253e6f86cSMin Hu (Connor)  * Copyright(c) 2018-2021 HiSilicon Limited.
3fcba820dSWei Hu (Xavier)  */
4fcba820dSWei Hu (Xavier) 
52ad146efSChengwen Feng #ifndef HNS3_FDIR_H
62ad146efSChengwen Feng #define HNS3_FDIR_H
7fcba820dSWei Hu (Xavier) 
81c757dd5SChengwen Feng #include <stdint.h>
91c757dd5SChengwen Feng 
101c757dd5SChengwen Feng #include <rte_flow.h>
111c757dd5SChengwen Feng 
12fcba820dSWei Hu (Xavier) struct hns3_fd_key_cfg {
13fcba820dSWei Hu (Xavier) 	uint8_t key_sel;
14fcba820dSWei Hu (Xavier) 	uint8_t inner_sipv6_word_en;
15fcba820dSWei Hu (Xavier) 	uint8_t inner_dipv6_word_en;
16fcba820dSWei Hu (Xavier) 	uint8_t outer_sipv6_word_en;
17fcba820dSWei Hu (Xavier) 	uint8_t outer_dipv6_word_en;
18fcba820dSWei Hu (Xavier) 	uint32_t tuple_active;
19fcba820dSWei Hu (Xavier) 	uint32_t meta_data_active;
20fcba820dSWei Hu (Xavier) };
21fcba820dSWei Hu (Xavier) 
22fcba820dSWei Hu (Xavier) enum HNS3_FD_STAGE {
23fcba820dSWei Hu (Xavier) 	HNS3_FD_STAGE_1,
24fcba820dSWei Hu (Xavier) 	HNS3_FD_STAGE_2,
25fcba820dSWei Hu (Xavier) 	HNS3_FD_STAGE_NUM,
26fcba820dSWei Hu (Xavier) };
27fcba820dSWei Hu (Xavier) 
28fcba820dSWei Hu (Xavier) enum HNS3_FD_ACTION {
29fcba820dSWei Hu (Xavier) 	HNS3_FD_ACTION_ACCEPT_PACKET,
30fcba820dSWei Hu (Xavier) 	HNS3_FD_ACTION_DROP_PACKET,
31fcba820dSWei Hu (Xavier) };
32fcba820dSWei Hu (Xavier) 
33fcba820dSWei Hu (Xavier) struct hns3_fd_cfg {
34fcba820dSWei Hu (Xavier) 	uint8_t fd_mode;
35fcba820dSWei Hu (Xavier) 	uint16_t max_key_length;
36fcba820dSWei Hu (Xavier) 	uint32_t rule_num[HNS3_FD_STAGE_NUM]; /* rule entry number */
37fcba820dSWei Hu (Xavier) 	uint16_t cnt_num[HNS3_FD_STAGE_NUM];  /* rule hit counter number */
38fcba820dSWei Hu (Xavier) 	struct hns3_fd_key_cfg key_cfg[HNS3_FD_STAGE_NUM];
39fcba820dSWei Hu (Xavier) };
40fcba820dSWei Hu (Xavier) 
41fcba820dSWei Hu (Xavier) /* OUTER_XXX indicates tuples in tunnel header of tunnel packet
42fcba820dSWei Hu (Xavier)  * INNER_XXX indicate tuples in tunneled header of tunnel packet or
43fcba820dSWei Hu (Xavier)  *           tuples of non-tunnel packet
44fcba820dSWei Hu (Xavier)  */
45fcba820dSWei Hu (Xavier) enum HNS3_FD_TUPLE {
46fcba820dSWei Hu (Xavier) 	OUTER_DST_MAC,
47fcba820dSWei Hu (Xavier) 	OUTER_SRC_MAC,
48fcba820dSWei Hu (Xavier) 	OUTER_VLAN_TAG_FST,
49fcba820dSWei Hu (Xavier) 	OUTER_VLAN_TAG_SEC,
50fcba820dSWei Hu (Xavier) 	OUTER_ETH_TYPE,
51fcba820dSWei Hu (Xavier) 	OUTER_L2_RSV,
52fcba820dSWei Hu (Xavier) 	OUTER_IP_TOS,
53fcba820dSWei Hu (Xavier) 	OUTER_IP_PROTO,
54fcba820dSWei Hu (Xavier) 	OUTER_SRC_IP,
55fcba820dSWei Hu (Xavier) 	OUTER_DST_IP,
56fcba820dSWei Hu (Xavier) 	OUTER_L3_RSV,
57fcba820dSWei Hu (Xavier) 	OUTER_SRC_PORT,
58fcba820dSWei Hu (Xavier) 	OUTER_DST_PORT,
59fcba820dSWei Hu (Xavier) 	OUTER_L4_RSV,
60fcba820dSWei Hu (Xavier) 	OUTER_TUN_VNI,
61fcba820dSWei Hu (Xavier) 	OUTER_TUN_FLOW_ID,
62fcba820dSWei Hu (Xavier) 	INNER_DST_MAC,
63fcba820dSWei Hu (Xavier) 	INNER_SRC_MAC,
64fcba820dSWei Hu (Xavier) 	INNER_VLAN_TAG1,
65fcba820dSWei Hu (Xavier) 	INNER_VLAN_TAG2,
66fcba820dSWei Hu (Xavier) 	INNER_ETH_TYPE,
67fcba820dSWei Hu (Xavier) 	INNER_L2_RSV,
68fcba820dSWei Hu (Xavier) 	INNER_IP_TOS,
69fcba820dSWei Hu (Xavier) 	INNER_IP_PROTO,
70fcba820dSWei Hu (Xavier) 	INNER_SRC_IP,
71fcba820dSWei Hu (Xavier) 	INNER_DST_IP,
72fcba820dSWei Hu (Xavier) 	INNER_L3_RSV,
73fcba820dSWei Hu (Xavier) 	INNER_SRC_PORT,
74fcba820dSWei Hu (Xavier) 	INNER_DST_PORT,
75fcba820dSWei Hu (Xavier) 	INNER_SCTP_TAG,
76fcba820dSWei Hu (Xavier) 	MAX_TUPLE,
77fcba820dSWei Hu (Xavier) };
78fcba820dSWei Hu (Xavier) 
79fcba820dSWei Hu (Xavier) #define VLAN_TAG_NUM_MAX 2
80fcba820dSWei Hu (Xavier) #define VNI_OR_TNI_LEN 3
81fcba820dSWei Hu (Xavier) #define IP_ADDR_LEN    4 /* Length of IPv6 address. */
82fcba820dSWei Hu (Xavier) #define IP_ADDR_KEY_ID 3 /* The last 32bit of IP address as FDIR search key */
83fcba820dSWei Hu (Xavier) #define IPV6_ADDR_WORD_MASK 3 /* The last two word of IPv6 as FDIR search key */
84fcba820dSWei Hu (Xavier) 
85fcba820dSWei Hu (Xavier) struct hns3_fd_rule_tuples {
86fcba820dSWei Hu (Xavier) 	uint8_t src_mac[RTE_ETHER_ADDR_LEN];
87fcba820dSWei Hu (Xavier) 	uint8_t dst_mac[RTE_ETHER_ADDR_LEN];
88fcba820dSWei Hu (Xavier) 	uint32_t src_ip[IP_ADDR_LEN];
89fcba820dSWei Hu (Xavier) 	uint32_t dst_ip[IP_ADDR_LEN];
90fcba820dSWei Hu (Xavier) 	uint16_t src_port;
91fcba820dSWei Hu (Xavier) 	uint16_t dst_port;
92fcba820dSWei Hu (Xavier) 	uint16_t vlan_tag1;
93fcba820dSWei Hu (Xavier) 	uint16_t vlan_tag2;
94fcba820dSWei Hu (Xavier) 	uint16_t ether_type;
95fcba820dSWei Hu (Xavier) 	uint8_t ip_tos;
96fcba820dSWei Hu (Xavier) 	uint8_t ip_proto;
97fcba820dSWei Hu (Xavier) 	uint32_t sctp_tag;
98fcba820dSWei Hu (Xavier) 	uint16_t outer_src_port;
99fcba820dSWei Hu (Xavier) 	uint16_t tunnel_type;
100a4732847SChengwen Feng 	uint16_t outer_vlan_tag1;
101a4732847SChengwen Feng 	uint16_t outer_vlan_tag2;
102fcba820dSWei Hu (Xavier) 	uint16_t outer_ether_type;
103fcba820dSWei Hu (Xavier) 	uint8_t outer_proto;
104fcba820dSWei Hu (Xavier) 	uint8_t outer_tun_vni[VNI_OR_TNI_LEN];
105fcba820dSWei Hu (Xavier) 	uint8_t outer_tun_flow_id;
106fcba820dSWei Hu (Xavier) };
107fcba820dSWei Hu (Xavier) 
108fcba820dSWei Hu (Xavier) struct hns3_fd_ad_data {
109fcba820dSWei Hu (Xavier) 	uint16_t ad_id;
110fcba820dSWei Hu (Xavier) 	uint8_t drop_packet;
111f8e7fcbfSChengwen Feng 	/*
112f8e7fcbfSChengwen Feng 	 * equal 0 when action is drop.
113f8e7fcbfSChengwen Feng 	 * index of queue when action is queue.
114f8e7fcbfSChengwen Feng 	 * index of first queue of queue region when action is queue region.
115f8e7fcbfSChengwen Feng 	 */
116fcba820dSWei Hu (Xavier) 	uint16_t queue_id;
117f8e7fcbfSChengwen Feng 	/*
118f8e7fcbfSChengwen Feng 	 * equal 0 when action is drop.
119f8e7fcbfSChengwen Feng 	 * equal 1 when action is queue.
120f8e7fcbfSChengwen Feng 	 * numbers of queues of queue region when action is queue region.
121f8e7fcbfSChengwen Feng 	 */
122f8e7fcbfSChengwen Feng 	uint16_t nb_queues;
123fcba820dSWei Hu (Xavier) 	uint8_t use_counter;
124fcba820dSWei Hu (Xavier) 	uint8_t counter_id;
125fcba820dSWei Hu (Xavier) 	uint8_t use_next_stage;
126fcba820dSWei Hu (Xavier) 	uint8_t write_rule_id_to_bd;
127fcba820dSWei Hu (Xavier) 	uint8_t next_input_key;
128fcba820dSWei Hu (Xavier) 	uint16_t rule_id;
129fcba820dSWei Hu (Xavier) };
130fcba820dSWei Hu (Xavier) 
131fcba820dSWei Hu (Xavier) #define HNS3_RULE_FLAG_FDID		0x1
132fcba820dSWei Hu (Xavier) #define HNS3_RULE_FLAG_VF_ID		0x2
133fcba820dSWei Hu (Xavier) #define HNS3_RULE_FLAG_COUNTER		0x4
134fdfcb94dSChengwen Feng #define HNS3_RULE_FLAG_COUNTER_INDIR	0x8
135fcba820dSWei Hu (Xavier) 
136fcba820dSWei Hu (Xavier) struct hns3_fdir_key_conf {
137fcba820dSWei Hu (Xavier) 	struct hns3_fd_rule_tuples spec;
138fcba820dSWei Hu (Xavier) 	struct hns3_fd_rule_tuples mask;
139fcba820dSWei Hu (Xavier) 	uint8_t vlan_num;
140fcba820dSWei Hu (Xavier) 	uint8_t outer_vlan_num;
141fcba820dSWei Hu (Xavier) };
142fcba820dSWei Hu (Xavier) 
143fcba820dSWei Hu (Xavier) struct hns3_fdir_rule {
144fcba820dSWei Hu (Xavier) 	struct hns3_fdir_key_conf key_conf;
145fcba820dSWei Hu (Xavier) 	uint32_t input_set;
146fcba820dSWei Hu (Xavier) 	uint32_t flags;
147fcba820dSWei Hu (Xavier) 	uint32_t fd_id; /* APP marked unique value for this rule. */
148fcba820dSWei Hu (Xavier) 	uint8_t action;
1497be78d02SJosh Soref 	/* VF id, available when flags with HNS3_RULE_FLAG_VF_ID. */
150fcba820dSWei Hu (Xavier) 	uint8_t vf_id;
151f8e7fcbfSChengwen Feng 	/*
152f8e7fcbfSChengwen Feng 	 * equal 0 when action is drop.
153f8e7fcbfSChengwen Feng 	 * index of queue when action is queue.
154f8e7fcbfSChengwen Feng 	 * index of first queue of queue region when action is queue region.
155f8e7fcbfSChengwen Feng 	 */
156fcba820dSWei Hu (Xavier) 	uint16_t queue_id;
157f8e7fcbfSChengwen Feng 	/*
158f8e7fcbfSChengwen Feng 	 * equal 0 when action is drop.
159f8e7fcbfSChengwen Feng 	 * equal 1 when action is queue.
160f8e7fcbfSChengwen Feng 	 * numbers of queues of queue region when action is queue region.
161f8e7fcbfSChengwen Feng 	 */
162f8e7fcbfSChengwen Feng 	uint16_t nb_queues;
163fcba820dSWei Hu (Xavier) 	uint16_t location;
164fcba820dSWei Hu (Xavier) 	struct rte_flow_action_count act_cnt;
165051d4bc9SJie Hai 	bool has_vlan_m;
166051d4bc9SJie Hai 	bool has_vlan_v;
167051d4bc9SJie Hai 	bool has_more_vlan_m;
168051d4bc9SJie Hai 	bool has_more_vlan_v;
169fcba820dSWei Hu (Xavier) };
170fcba820dSWei Hu (Xavier) 
171fcba820dSWei Hu (Xavier) /* FDIR filter list structure */
172fcba820dSWei Hu (Xavier) struct hns3_fdir_rule_ele {
173fcba820dSWei Hu (Xavier) 	TAILQ_ENTRY(hns3_fdir_rule_ele) entries;
174fcba820dSWei Hu (Xavier) 	struct hns3_fdir_rule fdir_conf;
175fcba820dSWei Hu (Xavier) };
176fcba820dSWei Hu (Xavier) 
177fcba820dSWei Hu (Xavier) TAILQ_HEAD(hns3_fdir_rule_list, hns3_fdir_rule_ele);
178fcba820dSWei Hu (Xavier) 
179fcba820dSWei Hu (Xavier) /*
18006b9ee34SHuisong Li  * On 'strict' mode, hardware bases on VLAN number to exactly match the
18106b9ee34SHuisong Li  * input flow.
18206b9ee34SHuisong Li  */
18306b9ee34SHuisong Li #define HNS3_FDIR_VLAN_STRICT_MATCH	1
18406b9ee34SHuisong Li #define HNS3_FDIR_VLAN_NOSTRICT_MATCH	0
18506b9ee34SHuisong Li 
18606b9ee34SHuisong Li /*
187a4732847SChengwen Feng  * The hardware supports many tuples match (see @enum HNS3_FD_TUPLE),
188a4732847SChengwen Feng  * however, the width of hardware entries is limited, therefore, only part
189a4732847SChengwen Feng  * of tuples are enabled (see as @hns3_init_fd_config).
190a4732847SChengwen Feng  *
191a4732847SChengwen Feng  * We should replace the existing tuples if we want to enable other tuples
192a4732847SChengwen Feng  * because the width capacity is insufficient.
193a4732847SChengwen Feng  */
194a4732847SChengwen Feng enum hns3_fdir_tuple_config {
195a4732847SChengwen Feng 	/* Default tuple config (see as @hns3_init_fd_config). */
196a4732847SChengwen Feng 	HNS3_FDIR_TUPLE_CONFIG_DEFAULT,
197a4732847SChengwen Feng 	/*
198a4732847SChengwen Feng 	 * Based on the default tuple config, disable the inner src-mac tuple,
199a4732847SChengwen Feng 	 * and enable the outer VLAN tuple.
200a4732847SChengwen Feng 	 */
201a4732847SChengwen Feng 	HNS3_FDIR_TUPLE_OUTVLAN_REPLACE_INSMAC,
202a4732847SChengwen Feng 	/*
203a4732847SChengwen Feng 	 * Based on the default tuple config, disable the inner dst-mac tuple,
204a4732847SChengwen Feng 	 * and enable the outer VLAN tuple.
205a4732847SChengwen Feng 	 */
206a4732847SChengwen Feng 	HNS3_FDIR_TUPLE_OUTVLAN_REPLACE_INDMAC,
207a4732847SChengwen Feng 	/*
208a4732847SChengwen Feng 	 * Based on the default tuple config, disable the inner src-ip tuple,
209a4732847SChengwen Feng 	 * and enable the outer VLAN tuple.
210a4732847SChengwen Feng 	 */
211a4732847SChengwen Feng 	HNS3_FDIR_TUPLE_OUTVLAN_REPLACE_INSIP,
212a4732847SChengwen Feng 	/*
213a4732847SChengwen Feng 	 * Based on the default tuple config, disable the inner dst-ip tuple,
214a4732847SChengwen Feng 	 * and enable the outer VLAN tuple.
215a4732847SChengwen Feng 	 */
216a4732847SChengwen Feng 	HNS3_FDIR_TUPLE_OUTVLAN_REPLACE_INDIP,
217a4732847SChengwen Feng 	/*
218a4732847SChengwen Feng 	 * Based on the default tuple config, disable the sctp-tag tuple,
219a4732847SChengwen Feng 	 * and enable the outer VLAN tuple.
220a4732847SChengwen Feng 	 */
221a4732847SChengwen Feng 	HNS3_FDIR_TUPLE_OUTVLAN_REPLACE_SCTPTAG,
222a4732847SChengwen Feng 	/*
223a4732847SChengwen Feng 	 * Based on the default tuple config, disable the tunnel vni tuple,
224a4732847SChengwen Feng 	 * and enable the outer VLAN tuple.
225a4732847SChengwen Feng 	 */
226a4732847SChengwen Feng 	HNS3_FDIR_TUPLE_OUTVLAN_REPLACE_TUNVNI,
227a4732847SChengwen Feng 
228a4732847SChengwen Feng 	HNS3_FDIR_TUPLE_CONFIG_BUTT
229a4732847SChengwen Feng };
230a4732847SChengwen Feng 
231*ac72aae6SDengdui Huang enum hns3_fdir_index_config {
232*ac72aae6SDengdui Huang 	/* Generate the hardware flow director index based on rte_hash (Default) */
233*ac72aae6SDengdui Huang 	HNS3_FDIR_INDEX_CONFIG_HASH,
234*ac72aae6SDengdui Huang 
235*ac72aae6SDengdui Huang 	/* Use the rte_flow priority field as the hardware flow director index. */
236*ac72aae6SDengdui Huang 	HNS3_FDIR_INDEX_CONFIG_PRIORITY
237*ac72aae6SDengdui Huang };
238*ac72aae6SDengdui Huang 
239a4732847SChengwen Feng /*
240fcba820dSWei Hu (Xavier)  *  A structure used to define fields of a FDIR related info.
241fcba820dSWei Hu (Xavier)  */
242fcba820dSWei Hu (Xavier) struct hns3_fdir_info {
243fcba820dSWei Hu (Xavier) 	struct hns3_fdir_rule_list fdir_list;
244fcba820dSWei Hu (Xavier) 	struct hns3_fdir_rule_ele **hash_map;
245fcba820dSWei Hu (Xavier) 	struct rte_hash *hash_handle;
246fcba820dSWei Hu (Xavier) 	struct hns3_fd_cfg fd_cfg;
24706b9ee34SHuisong Li 	uint8_t vlan_match_mode;
248a4732847SChengwen Feng 	enum hns3_fdir_tuple_config tuple_cfg;
249*ac72aae6SDengdui Huang 	enum hns3_fdir_index_config index_cfg;
250fcba820dSWei Hu (Xavier) };
251fcba820dSWei Hu (Xavier) 
252fcba820dSWei Hu (Xavier) struct hns3_adapter;
2531c757dd5SChengwen Feng struct hns3_hw;
254fcba820dSWei Hu (Xavier) 
255fcba820dSWei Hu (Xavier) int hns3_init_fd_config(struct hns3_adapter *hns);
256fcba820dSWei Hu (Xavier) int hns3_fdir_filter_init(struct hns3_adapter *hns);
257fcba820dSWei Hu (Xavier) void hns3_fdir_filter_uninit(struct hns3_adapter *hns);
258fcba820dSWei Hu (Xavier) int hns3_fdir_filter_program(struct hns3_adapter *hns,
259fcba820dSWei Hu (Xavier) 			     struct hns3_fdir_rule *rule, bool del);
260fcba820dSWei Hu (Xavier) int hns3_clear_all_fdir_filter(struct hns3_adapter *hns);
26152600004SHuisong Li int hns3_fd_get_count(struct hns3_hw *hw, uint32_t id, uint64_t *value);
262fcba820dSWei Hu (Xavier) int hns3_restore_all_fdir_filter(struct hns3_adapter *hns);
263fcba820dSWei Hu (Xavier) 
264a4732847SChengwen Feng enum hns3_fdir_tuple_config hns3_parse_tuple_config(const char *name);
265a4732847SChengwen Feng const char *hns3_tuple_config_name(enum hns3_fdir_tuple_config tuple_cfg);
266*ac72aae6SDengdui Huang const char *hns3_fdir_index_config_name(enum hns3_fdir_index_config cfg);
267a4732847SChengwen Feng 
2682ad146efSChengwen Feng #endif /* HNS3_FDIR_H */
269