xref: /dpdk/drivers/net/hns3/hns3_flow.h (revision e3069658da9ffb6f83a0d972ff2776c405eb6a8f)
13600ffc9SMin Hu (Connor) /* SPDX-License-Identifier: BSD-3-Clause
23600ffc9SMin Hu (Connor)  * Copyright(C) 2021 HiSilicon Limited
33600ffc9SMin Hu (Connor)  */
43600ffc9SMin Hu (Connor) 
52ad146efSChengwen Feng #ifndef HNS3_FLOW_H
62ad146efSChengwen Feng #define HNS3_FLOW_H
73600ffc9SMin Hu (Connor) 
83600ffc9SMin Hu (Connor) #include <rte_flow.h>
91c757dd5SChengwen Feng #include <ethdev_driver.h>
101c757dd5SChengwen Feng 
111c757dd5SChengwen Feng #include "hns3_rss.h"
12*e3069658SHuisong Li #include "hns3_fdir.h"
133600ffc9SMin Hu (Connor) 
143600ffc9SMin Hu (Connor) struct hns3_flow_counter {
153600ffc9SMin Hu (Connor) 	LIST_ENTRY(hns3_flow_counter) next; /* Pointer to the next counter. */
16fdfcb94dSChengwen Feng 	uint32_t indirect:1; /* Indirect counter flag */
173600ffc9SMin Hu (Connor) 	uint32_t ref_cnt:31; /* Reference counter. */
183600ffc9SMin Hu (Connor) 	uint16_t id;   /* Counter ID. */
193600ffc9SMin Hu (Connor) 	uint64_t hits; /* Number of packets matched by the rule. */
203600ffc9SMin Hu (Connor) };
213600ffc9SMin Hu (Connor) 
223600ffc9SMin Hu (Connor) struct rte_flow {
233600ffc9SMin Hu (Connor) 	enum rte_filter_type filter_type;
243600ffc9SMin Hu (Connor) 	void *rule;
253600ffc9SMin Hu (Connor) 	uint32_t counter_id;
263600ffc9SMin Hu (Connor) };
273600ffc9SMin Hu (Connor) 
28b93ad0ccSHuisong Li struct hns3_flow_rss_conf {
29b93ad0ccSHuisong Li 	struct rte_flow_action_rss conf;
30b93ad0ccSHuisong Li 	uint8_t key[HNS3_RSS_KEY_SIZE_MAX];  /* Hash key */
31b93ad0ccSHuisong Li 	uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */
32*e3069658SHuisong Li 	uint64_t pattern_type;
33*e3069658SHuisong Li 	uint64_t hw_pctypes; /* packet types in driver */
34b93ad0ccSHuisong Li };
35b93ad0ccSHuisong Li 
363600ffc9SMin Hu (Connor) /* rss filter list structure */
373600ffc9SMin Hu (Connor) struct hns3_rss_conf_ele {
383600ffc9SMin Hu (Connor) 	TAILQ_ENTRY(hns3_rss_conf_ele) entries;
39b93ad0ccSHuisong Li 	struct hns3_flow_rss_conf filter_info;
403600ffc9SMin Hu (Connor) };
413600ffc9SMin Hu (Connor) 
423600ffc9SMin Hu (Connor) /* hns3_flow memory list structure */
433600ffc9SMin Hu (Connor) struct hns3_flow_mem {
443600ffc9SMin Hu (Connor) 	TAILQ_ENTRY(hns3_flow_mem) entries;
453600ffc9SMin Hu (Connor) 	struct rte_flow *flow;
463600ffc9SMin Hu (Connor) };
473600ffc9SMin Hu (Connor) 
48fdfcb94dSChengwen Feng enum {
49fdfcb94dSChengwen Feng 	HNS3_INDIRECT_ACTION_TYPE_COUNT = 1,
50fdfcb94dSChengwen Feng };
51fdfcb94dSChengwen Feng 
52fdfcb94dSChengwen Feng struct rte_flow_action_handle {
53fdfcb94dSChengwen Feng 	int indirect_type;
54fdfcb94dSChengwen Feng 	uint32_t counter_id;
55fdfcb94dSChengwen Feng };
56fdfcb94dSChengwen Feng 
57*e3069658SHuisong Li union hns3_filter_conf {
58*e3069658SHuisong Li 	struct hns3_fdir_rule fdir_conf;
59*e3069658SHuisong Li 	struct hns3_flow_rss_conf rss_conf;
60*e3069658SHuisong Li };
61*e3069658SHuisong Li 
62*e3069658SHuisong Li struct hns3_filter_info {
63*e3069658SHuisong Li 	enum rte_filter_type type;
64*e3069658SHuisong Li 	union hns3_filter_conf conf;
65*e3069658SHuisong Li };
66*e3069658SHuisong Li 
673600ffc9SMin Hu (Connor) TAILQ_HEAD(hns3_rss_filter_list, hns3_rss_conf_ele);
683600ffc9SMin Hu (Connor) TAILQ_HEAD(hns3_flow_mem_list, hns3_flow_mem);
693600ffc9SMin Hu (Connor) 
703600ffc9SMin Hu (Connor) int hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
713600ffc9SMin Hu (Connor) 			  const struct rte_flow_ops **ops);
723600ffc9SMin Hu (Connor) void hns3_flow_init(struct rte_eth_dev *dev);
733600ffc9SMin Hu (Connor) void hns3_flow_uninit(struct rte_eth_dev *dev);
741042ed40SHuisong Li int hns3_restore_filter(struct hns3_adapter *hns);
753600ffc9SMin Hu (Connor) 
762ad146efSChengwen Feng #endif /* HNS3_FLOW_H */
77