1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (c) 2021, Intel Corporation. */ 3 4 #ifndef _IAVF_FDIR_H_ 5 #define _IAVF_FDIR_H_ 6 7 struct iavf_adapter; 8 9 /* State of Flow Director filter */ 10 enum iavf_fdir_fltr_state_t { 11 IAVF_FDIR_FLTR_ADD_REQUEST, /* User requests to add filter */ 12 IAVF_FDIR_FLTR_ADD_PENDING, /* Filter pending add by the PF */ 13 IAVF_FDIR_FLTR_DEL_REQUEST, /* User requests to delete filter */ 14 IAVF_FDIR_FLTR_DEL_PENDING, /* Filter pending delete by the PF */ 15 IAVF_FDIR_FLTR_ACTIVE, /* Filter is active */ 16 }; 17 18 enum iavf_fdir_flow_type { 19 /* NONE - used for undef/error */ 20 IAVF_FDIR_FLOW_NONE = 0, 21 IAVF_FDIR_FLOW_IPV4_TCP, 22 IAVF_FDIR_FLOW_IPV4_UDP, 23 IAVF_FDIR_FLOW_IPV4_SCTP, 24 IAVF_FDIR_FLOW_IPV4_AH, 25 IAVF_FDIR_FLOW_IPV4_ESP, 26 IAVF_FDIR_FLOW_IPV4_OTHER, 27 IAVF_FDIR_FLOW_IPV6_TCP, 28 IAVF_FDIR_FLOW_IPV6_UDP, 29 IAVF_FDIR_FLOW_IPV6_SCTP, 30 IAVF_FDIR_FLOW_IPV6_AH, 31 IAVF_FDIR_FLOW_IPV6_ESP, 32 IAVF_FDIR_FLOW_IPV6_OTHER, 33 IAVF_FDIR_FLOW_NON_IP_L2, 34 /* MAX - this must be last and add anything new just above it */ 35 IAVF_FDIR_FLOW_PTYPE_MAX, 36 }; 37 38 /* Must not exceed the array element number of '__be32 data[2]' in the ethtool 39 * 'struct ethtool_rx_flow_spec.m_ext.data[2]' to express the flex-byte (word). 40 */ 41 #define IAVF_FLEX_WORD_NUM 2 42 43 struct iavf_flex_word { 44 u16 offset; 45 u16 word; 46 }; 47 48 struct iavf_ipv4_addrs { 49 __be32 src_ip; 50 __be32 dst_ip; 51 }; 52 53 struct iavf_ipv6_addrs { 54 struct in6_addr src_ip; 55 struct in6_addr dst_ip; 56 }; 57 58 struct iavf_fdir_eth { 59 __be16 etype; 60 }; 61 62 struct iavf_fdir_ip { 63 union { 64 struct iavf_ipv4_addrs v4_addrs; 65 struct iavf_ipv6_addrs v6_addrs; 66 }; 67 __be16 src_port; 68 __be16 dst_port; 69 __be32 l4_header; /* first 4 bytes of the layer 4 header */ 70 __be32 spi; /* security parameter index for AH/ESP */ 71 union { 72 u8 tos; 73 u8 tclass; 74 }; 75 u8 proto; 76 }; 77 78 struct iavf_fdir_extra { 79 u32 usr_def[IAVF_FLEX_WORD_NUM]; 80 }; 81 82 /* bookkeeping of Flow Director filters */ 83 struct iavf_fdir_fltr { 84 enum iavf_fdir_fltr_state_t state; 85 struct list_head list; 86 87 enum iavf_fdir_flow_type flow_type; 88 89 struct iavf_fdir_eth eth_data; 90 struct iavf_fdir_eth eth_mask; 91 92 struct iavf_fdir_ip ip_data; 93 struct iavf_fdir_ip ip_mask; 94 95 struct iavf_fdir_extra ext_data; 96 struct iavf_fdir_extra ext_mask; 97 98 enum virtchnl_action action; 99 100 /* flex byte filter data */ 101 u8 ip_ver; /* used to adjust the flex offset, 4 : IPv4, 6 : IPv6 */ 102 u8 flex_cnt; 103 struct iavf_flex_word flex_words[IAVF_FLEX_WORD_NUM]; 104 105 u32 flow_id; 106 107 u32 loc; /* Rule location inside the flow table */ 108 u32 q_index; 109 110 struct virtchnl_fdir_add vc_add_msg; 111 }; 112 113 int iavf_validate_fdir_fltr_masks(struct iavf_adapter *adapter, 114 struct iavf_fdir_fltr *fltr); 115 int iavf_fill_fdir_add_msg(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); 116 void iavf_print_fdir_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); 117 bool iavf_fdir_is_dup_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); 118 void iavf_fdir_list_add_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); 119 struct iavf_fdir_fltr *iavf_find_fdir_fltr_by_loc(struct iavf_adapter *adapter, u32 loc); 120 #endif /* _IAVF_FDIR_H_ */ 121