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