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 * 11 * *_REQUEST states are used to mark filter to be sent to PF driver to perform 12 * an action (either add or delete filter). *_PENDING states are an indication 13 * that request was sent to PF and the driver is waiting for response. 14 * 15 * Both DELETE and DISABLE states are being used to delete a filter in PF. 16 * The difference is that after a successful response filter in DEL_PENDING 17 * state is being deleted from VF driver as well and filter in DIS_PENDING state 18 * is being changed to INACTIVE state. 19 */ 20 enum iavf_fdir_fltr_state_t { 21 IAVF_FDIR_FLTR_ADD_REQUEST, /* User requests to add filter */ 22 IAVF_FDIR_FLTR_ADD_PENDING, /* Filter pending add by the PF */ 23 IAVF_FDIR_FLTR_DEL_REQUEST, /* User requests to delete filter */ 24 IAVF_FDIR_FLTR_DEL_PENDING, /* Filter pending delete by the PF */ 25 IAVF_FDIR_FLTR_DIS_REQUEST, /* Filter scheduled to be disabled */ 26 IAVF_FDIR_FLTR_DIS_PENDING, /* Filter pending disable by the PF */ 27 IAVF_FDIR_FLTR_INACTIVE, /* Filter inactive on link down */ 28 IAVF_FDIR_FLTR_ACTIVE, /* Filter is active */ 29 }; 30 31 enum iavf_fdir_flow_type { 32 /* NONE - used for undef/error */ 33 IAVF_FDIR_FLOW_NONE = 0, 34 IAVF_FDIR_FLOW_IPV4_TCP, 35 IAVF_FDIR_FLOW_IPV4_UDP, 36 IAVF_FDIR_FLOW_IPV4_SCTP, 37 IAVF_FDIR_FLOW_IPV4_AH, 38 IAVF_FDIR_FLOW_IPV4_ESP, 39 IAVF_FDIR_FLOW_IPV4_OTHER, 40 IAVF_FDIR_FLOW_IPV6_TCP, 41 IAVF_FDIR_FLOW_IPV6_UDP, 42 IAVF_FDIR_FLOW_IPV6_SCTP, 43 IAVF_FDIR_FLOW_IPV6_AH, 44 IAVF_FDIR_FLOW_IPV6_ESP, 45 IAVF_FDIR_FLOW_IPV6_OTHER, 46 IAVF_FDIR_FLOW_NON_IP_L2, 47 /* MAX - this must be last and add anything new just above it */ 48 IAVF_FDIR_FLOW_PTYPE_MAX, 49 }; 50 51 /* Must not exceed the array element number of '__be32 data[2]' in the ethtool 52 * 'struct ethtool_rx_flow_spec.m_ext.data[2]' to express the flex-byte (word). 53 */ 54 #define IAVF_FLEX_WORD_NUM 2 55 56 struct iavf_flex_word { 57 u16 offset; 58 u16 word; 59 }; 60 61 struct iavf_ipv4_addrs { 62 __be32 src_ip; 63 __be32 dst_ip; 64 }; 65 66 struct iavf_ipv6_addrs { 67 struct in6_addr src_ip; 68 struct in6_addr dst_ip; 69 }; 70 71 struct iavf_fdir_eth { 72 __be16 etype; 73 }; 74 75 struct iavf_fdir_ip { 76 union { 77 struct iavf_ipv4_addrs v4_addrs; 78 struct iavf_ipv6_addrs v6_addrs; 79 }; 80 __be16 src_port; 81 __be16 dst_port; 82 __be32 l4_header; /* first 4 bytes of the layer 4 header */ 83 __be32 spi; /* security parameter index for AH/ESP */ 84 union { 85 u8 tos; 86 u8 tclass; 87 }; 88 u8 proto; 89 }; 90 91 struct iavf_fdir_extra { 92 u32 usr_def[IAVF_FLEX_WORD_NUM]; 93 }; 94 95 /* bookkeeping of Flow Director filters */ 96 struct iavf_fdir_fltr { 97 enum iavf_fdir_fltr_state_t state; 98 struct list_head list; 99 100 enum iavf_fdir_flow_type flow_type; 101 102 struct iavf_fdir_eth eth_data; 103 struct iavf_fdir_eth eth_mask; 104 105 struct iavf_fdir_ip ip_data; 106 struct iavf_fdir_ip ip_mask; 107 108 struct iavf_fdir_extra ext_data; 109 struct iavf_fdir_extra ext_mask; 110 111 enum virtchnl_action action; 112 113 /* flex byte filter data */ 114 u8 ip_ver; /* used to adjust the flex offset, 4 : IPv4, 6 : IPv6 */ 115 u8 flex_cnt; 116 struct iavf_flex_word flex_words[IAVF_FLEX_WORD_NUM]; 117 118 u32 flow_id; 119 120 u32 loc; /* Rule location inside the flow table */ 121 u32 q_index; 122 123 struct virtchnl_fdir_add vc_add_msg; 124 }; 125 126 int iavf_validate_fdir_fltr_masks(struct iavf_adapter *adapter, 127 struct iavf_fdir_fltr *fltr); 128 int iavf_fill_fdir_add_msg(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); 129 void iavf_print_fdir_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); 130 bool iavf_fdir_is_dup_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); 131 void iavf_fdir_list_add_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); 132 struct iavf_fdir_fltr *iavf_find_fdir_fltr_by_loc(struct iavf_adapter *adapter, u32 loc); 133 #endif /* _IAVF_FDIR_H_ */ 134