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