ice_fdir.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /* Copyright (C) 2018-2020, Intel Corporation. */
  3. #ifndef _ICE_FDIR_H_
  4. #define _ICE_FDIR_H_
  5. #define ICE_FDIR_TUN_PKT_OFF 50
  6. #define ICE_FDIR_MAX_RAW_PKT_SIZE (512 + ICE_FDIR_TUN_PKT_OFF)
  7. /* macros for offsets into packets for flow director programming */
  8. #define ICE_ETH_TYPE_F_OFFSET 12
  9. #define ICE_ETH_VLAN_TCI_OFFSET 14
  10. #define ICE_ETH_TYPE_VLAN_OFFSET 16
  11. #define ICE_IPV4_SRC_ADDR_OFFSET 26
  12. #define ICE_IPV4_DST_ADDR_OFFSET 30
  13. #define ICE_IPV4_TCP_SRC_PORT_OFFSET 34
  14. #define ICE_IPV4_TCP_DST_PORT_OFFSET 36
  15. #define ICE_IPV4_UDP_SRC_PORT_OFFSET 34
  16. #define ICE_IPV4_UDP_DST_PORT_OFFSET 36
  17. #define ICE_IPV4_SCTP_SRC_PORT_OFFSET 34
  18. #define ICE_IPV4_SCTP_DST_PORT_OFFSET 36
  19. #define ICE_IPV4_PROTO_OFFSET 23
  20. #define ICE_IPV6_SRC_ADDR_OFFSET 22
  21. #define ICE_IPV6_DST_ADDR_OFFSET 38
  22. #define ICE_IPV6_TCP_SRC_PORT_OFFSET 54
  23. #define ICE_IPV6_TCP_DST_PORT_OFFSET 56
  24. #define ICE_IPV6_UDP_SRC_PORT_OFFSET 54
  25. #define ICE_IPV6_UDP_DST_PORT_OFFSET 56
  26. #define ICE_IPV6_SCTP_SRC_PORT_OFFSET 54
  27. #define ICE_IPV6_SCTP_DST_PORT_OFFSET 56
  28. #define ICE_MAC_ETHTYPE_OFFSET 12
  29. #define ICE_IPV4_TOS_OFFSET 15
  30. #define ICE_IPV4_TTL_OFFSET 22
  31. #define ICE_IPV6_TC_OFFSET 14
  32. #define ICE_IPV6_HLIM_OFFSET 21
  33. #define ICE_IPV6_PROTO_OFFSET 20
  34. #define ICE_IPV4_GTPU_TEID_OFFSET 46
  35. #define ICE_IPV4_GTPU_QFI_OFFSET 56
  36. #define ICE_IPV4_L2TPV3_SESS_ID_OFFSET 34
  37. #define ICE_IPV6_L2TPV3_SESS_ID_OFFSET 54
  38. #define ICE_IPV4_ESP_SPI_OFFSET 34
  39. #define ICE_IPV6_ESP_SPI_OFFSET 54
  40. #define ICE_IPV4_AH_SPI_OFFSET 38
  41. #define ICE_IPV6_AH_SPI_OFFSET 58
  42. #define ICE_IPV4_NAT_T_ESP_SPI_OFFSET 42
  43. #define ICE_IPV6_NAT_T_ESP_SPI_OFFSET 62
  44. #define ICE_FDIR_MAX_FLTRS 16384
  45. /* IP v4 has 2 flag bits that enable fragment processing: DF and MF. DF
  46. * requests that the packet not be fragmented. MF indicates that a packet has
  47. * been fragmented.
  48. */
  49. #define ICE_FDIR_IPV4_PKT_FLAG_MF 0x20
  50. #define ICE_FDIR_NO_QUEUE_IDX -1
  51. enum ice_fltr_prgm_desc_dest {
  52. ICE_FLTR_PRGM_DESC_DEST_DROP_PKT,
  53. ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX,
  54. ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP,
  55. ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER,
  56. };
  57. enum ice_fltr_prgm_desc_fd_status {
  58. ICE_FLTR_PRGM_DESC_FD_STATUS_NONE,
  59. ICE_FLTR_PRGM_DESC_FD_STATUS_FD_ID,
  60. };
  61. /* Flow Director (FD) Filter Programming descriptor */
  62. struct ice_fd_fltr_desc_ctx {
  63. u32 fdid;
  64. u16 qindex;
  65. u16 cnt_index;
  66. u16 fd_vsi;
  67. u16 flex_val;
  68. u8 comp_q;
  69. u8 comp_report;
  70. u8 fd_space;
  71. u8 cnt_ena;
  72. u8 evict_ena;
  73. u8 toq;
  74. u8 toq_prio;
  75. u8 dpu_recipe;
  76. u8 drop;
  77. u8 flex_prio;
  78. u8 flex_mdid;
  79. u8 dtype;
  80. u8 pcmd;
  81. u8 desc_prof_prio;
  82. u8 desc_prof;
  83. u8 swap;
  84. u8 fdid_prio;
  85. u8 fdid_mdid;
  86. };
  87. #define ICE_FLTR_PRGM_FLEX_WORD_SIZE sizeof(__be16)
  88. struct ice_rx_flow_userdef {
  89. u16 flex_word;
  90. u16 flex_offset;
  91. u16 flex_fltr;
  92. };
  93. struct ice_fdir_v4 {
  94. __be32 dst_ip;
  95. __be32 src_ip;
  96. __be16 dst_port;
  97. __be16 src_port;
  98. __be32 l4_header;
  99. __be32 sec_parm_idx; /* security parameter index */
  100. u8 tos;
  101. u8 ip_ver;
  102. u8 proto;
  103. u8 ttl;
  104. };
  105. #define ICE_IPV6_ADDR_LEN_AS_U32 4
  106. struct ice_fdir_v6 {
  107. __be32 dst_ip[ICE_IPV6_ADDR_LEN_AS_U32];
  108. __be32 src_ip[ICE_IPV6_ADDR_LEN_AS_U32];
  109. __be16 dst_port;
  110. __be16 src_port;
  111. __be32 l4_header; /* next header */
  112. __be32 sec_parm_idx; /* security parameter index */
  113. u8 tc;
  114. u8 proto;
  115. u8 hlim;
  116. };
  117. struct ice_fdir_udp_gtp {
  118. u8 flags;
  119. u8 msg_type;
  120. __be16 rsrvd_len;
  121. __be32 teid;
  122. __be16 rsrvd_seq_nbr;
  123. u8 rsrvd_n_pdu_nbr;
  124. u8 rsrvd_next_ext_type;
  125. u8 rsvrd_ext_len;
  126. u8 pdu_type:4,
  127. spare:4;
  128. u8 ppp:1,
  129. rqi:1,
  130. qfi:6;
  131. u32 rsvrd;
  132. u8 next_ext;
  133. };
  134. struct ice_fdir_l2tpv3 {
  135. __be32 session_id;
  136. };
  137. struct ice_fdir_extra {
  138. u8 dst_mac[ETH_ALEN]; /* dest MAC address */
  139. u8 src_mac[ETH_ALEN]; /* src MAC address */
  140. __be16 ether_type; /* for NON_IP_L2 */
  141. u32 usr_def[2]; /* user data */
  142. __be16 vlan_type; /* VLAN ethertype */
  143. __be16 vlan_tag; /* VLAN tag info */
  144. };
  145. struct ice_fdir_fltr {
  146. struct list_head fltr_node;
  147. enum ice_fltr_ptype flow_type;
  148. struct ethhdr eth, eth_mask;
  149. union {
  150. struct ice_fdir_v4 v4;
  151. struct ice_fdir_v6 v6;
  152. } ip, mask;
  153. struct ice_fdir_udp_gtp gtpu_data;
  154. struct ice_fdir_udp_gtp gtpu_mask;
  155. struct ice_fdir_l2tpv3 l2tpv3_data;
  156. struct ice_fdir_l2tpv3 l2tpv3_mask;
  157. struct ice_fdir_extra ext_data;
  158. struct ice_fdir_extra ext_mask;
  159. /* flex byte filter data */
  160. __be16 flex_word;
  161. /* queue region size (=2^q_region) */
  162. u8 q_region;
  163. u16 flex_offset;
  164. u16 flex_fltr;
  165. /* filter control */
  166. s16 q_index;
  167. u16 orig_q_index;
  168. u16 dest_vsi;
  169. u8 dest_ctl;
  170. u8 cnt_ena;
  171. u8 fltr_status;
  172. u16 cnt_index;
  173. u32 fltr_id;
  174. u8 fdid_prio;
  175. u8 comp_report;
  176. };
  177. /* Dummy packet filter definition structure */
  178. struct ice_fdir_base_pkt {
  179. enum ice_fltr_ptype flow;
  180. u16 pkt_len;
  181. const u8 *pkt;
  182. u16 tun_pkt_len;
  183. const u8 *tun_pkt;
  184. };
  185. struct ice_vsi;
  186. int ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id);
  187. int ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id);
  188. int ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr);
  189. int ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr);
  190. void
  191. ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
  192. struct ice_fltr_desc *fdesc, bool add);
  193. int
  194. ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
  195. u8 *pkt, bool frag, bool tun);
  196. int ice_get_fdir_cnt_all(struct ice_hw *hw);
  197. int ice_fdir_num_avail_fltr(struct ice_hw *hw, struct ice_vsi *vsi);
  198. bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input);
  199. bool ice_fdir_has_frag(enum ice_fltr_ptype flow);
  200. struct ice_fdir_fltr *
  201. ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx);
  202. void
  203. ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add);
  204. void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input);
  205. #endif /* _ICE_FDIR_H_ */