1c90ed40cSTony Nguyen /* SPDX-License-Identifier: GPL-2.0 */ 2c90ed40cSTony Nguyen /* Copyright (c) 2019, Intel Corporation. */ 3c90ed40cSTony Nguyen 4c90ed40cSTony Nguyen #ifndef _ICE_FLOW_H_ 5c90ed40cSTony Nguyen #define _ICE_FLOW_H_ 6c90ed40cSTony Nguyen 72c61054cSTony Nguyen #define ICE_FLOW_ENTRY_HANDLE_INVAL 0 8c90ed40cSTony Nguyen #define ICE_FLOW_FLD_OFF_INVAL 0xffff 9c90ed40cSTony Nguyen 10c90ed40cSTony Nguyen /* Generate flow hash field from flow field type(s) */ 11c90ed40cSTony Nguyen #define ICE_FLOW_HASH_IPV4 \ 12c90ed40cSTony Nguyen (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | \ 13c90ed40cSTony Nguyen BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)) 14c90ed40cSTony Nguyen #define ICE_FLOW_HASH_IPV6 \ 15c90ed40cSTony Nguyen (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | \ 16c90ed40cSTony Nguyen BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)) 17c90ed40cSTony Nguyen #define ICE_FLOW_HASH_TCP_PORT \ 18c90ed40cSTony Nguyen (BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | \ 19c90ed40cSTony Nguyen BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)) 20c90ed40cSTony Nguyen #define ICE_FLOW_HASH_UDP_PORT \ 21c90ed40cSTony Nguyen (BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | \ 22c90ed40cSTony Nguyen BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)) 231c01c8c6SMd Fahad Iqbal Polash #define ICE_FLOW_HASH_SCTP_PORT \ 241c01c8c6SMd Fahad Iqbal Polash (BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | \ 251c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)) 26c90ed40cSTony Nguyen 27c90ed40cSTony Nguyen #define ICE_HASH_INVALID 0 28c90ed40cSTony Nguyen #define ICE_HASH_TCP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_TCP_PORT) 29c90ed40cSTony Nguyen #define ICE_HASH_TCP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_TCP_PORT) 30c90ed40cSTony Nguyen #define ICE_HASH_UDP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_UDP_PORT) 31c90ed40cSTony Nguyen #define ICE_HASH_UDP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_UDP_PORT) 32c90ed40cSTony Nguyen 330577313eSQi Zhang #define ICE_FLOW_HASH_GTP_TEID \ 340577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID)) 350577313eSQi Zhang 360577313eSQi Zhang #define ICE_FLOW_HASH_GTP_IPV4_TEID \ 370577313eSQi Zhang (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_TEID) 380577313eSQi Zhang #define ICE_FLOW_HASH_GTP_IPV6_TEID \ 390577313eSQi Zhang (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_TEID) 400577313eSQi Zhang 410577313eSQi Zhang #define ICE_FLOW_HASH_GTP_U_TEID \ 420577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)) 430577313eSQi Zhang 440577313eSQi Zhang #define ICE_FLOW_HASH_GTP_U_IPV4_TEID \ 450577313eSQi Zhang (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_TEID) 460577313eSQi Zhang #define ICE_FLOW_HASH_GTP_U_IPV6_TEID \ 470577313eSQi Zhang (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_TEID) 480577313eSQi Zhang 490577313eSQi Zhang #define ICE_FLOW_HASH_GTP_U_EH_TEID \ 500577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID)) 510577313eSQi Zhang 520577313eSQi Zhang #define ICE_FLOW_HASH_GTP_U_EH_QFI \ 530577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_QFI)) 540577313eSQi Zhang 550577313eSQi Zhang #define ICE_FLOW_HASH_GTP_U_IPV4_EH \ 560577313eSQi Zhang (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_EH_TEID | \ 570577313eSQi Zhang ICE_FLOW_HASH_GTP_U_EH_QFI) 580577313eSQi Zhang #define ICE_FLOW_HASH_GTP_U_IPV6_EH \ 590577313eSQi Zhang (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_EH_TEID | \ 600577313eSQi Zhang ICE_FLOW_HASH_GTP_U_EH_QFI) 610577313eSQi Zhang 620577313eSQi Zhang #define ICE_FLOW_HASH_PPPOE_SESS_ID \ 630577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID)) 640577313eSQi Zhang 650577313eSQi Zhang #define ICE_FLOW_HASH_PPPOE_SESS_ID_ETH \ 660577313eSQi Zhang (ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_PPPOE_SESS_ID) 670577313eSQi Zhang #define ICE_FLOW_HASH_PPPOE_TCP_ID \ 680577313eSQi Zhang (ICE_FLOW_HASH_TCP_PORT | ICE_FLOW_HASH_PPPOE_SESS_ID) 690577313eSQi Zhang #define ICE_FLOW_HASH_PPPOE_UDP_ID \ 700577313eSQi Zhang (ICE_FLOW_HASH_UDP_PORT | ICE_FLOW_HASH_PPPOE_SESS_ID) 710577313eSQi Zhang 720577313eSQi Zhang #define ICE_FLOW_HASH_PFCP_SEID \ 730577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID)) 740577313eSQi Zhang #define ICE_FLOW_HASH_PFCP_IPV4_SEID \ 750577313eSQi Zhang (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_PFCP_SEID) 760577313eSQi Zhang #define ICE_FLOW_HASH_PFCP_IPV6_SEID \ 770577313eSQi Zhang (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_PFCP_SEID) 780577313eSQi Zhang 790577313eSQi Zhang #define ICE_FLOW_HASH_L2TPV3_SESS_ID \ 800577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID)) 810577313eSQi Zhang #define ICE_FLOW_HASH_L2TPV3_IPV4_SESS_ID \ 820577313eSQi Zhang (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_L2TPV3_SESS_ID) 830577313eSQi Zhang #define ICE_FLOW_HASH_L2TPV3_IPV6_SESS_ID \ 840577313eSQi Zhang (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_L2TPV3_SESS_ID) 850577313eSQi Zhang 860577313eSQi Zhang #define ICE_FLOW_HASH_ESP_SPI \ 870577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI)) 880577313eSQi Zhang #define ICE_FLOW_HASH_ESP_IPV4_SPI \ 890577313eSQi Zhang (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_ESP_SPI) 900577313eSQi Zhang #define ICE_FLOW_HASH_ESP_IPV6_SPI \ 910577313eSQi Zhang (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_ESP_SPI) 920577313eSQi Zhang 930577313eSQi Zhang #define ICE_FLOW_HASH_AH_SPI \ 940577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_AH_SPI)) 950577313eSQi Zhang #define ICE_FLOW_HASH_AH_IPV4_SPI \ 960577313eSQi Zhang (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_AH_SPI) 970577313eSQi Zhang #define ICE_FLOW_HASH_AH_IPV6_SPI \ 980577313eSQi Zhang (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_AH_SPI) 990577313eSQi Zhang 1000577313eSQi Zhang #define ICE_FLOW_HASH_NAT_T_ESP_SPI \ 1010577313eSQi Zhang (BIT_ULL(ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI)) 1020577313eSQi Zhang #define ICE_FLOW_HASH_NAT_T_ESP_IPV4_SPI \ 1030577313eSQi Zhang (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_NAT_T_ESP_SPI) 1040577313eSQi Zhang #define ICE_FLOW_HASH_NAT_T_ESP_IPV6_SPI \ 1050577313eSQi Zhang (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_NAT_T_ESP_SPI) 1060577313eSQi Zhang 107c90ed40cSTony Nguyen /* Protocol header fields within a packet segment. A segment consists of one or 108c90ed40cSTony Nguyen * more protocol headers that make up a logical group of protocol headers. Each 109c90ed40cSTony Nguyen * logical group of protocol headers encapsulates or is encapsulated using/by 110c90ed40cSTony Nguyen * tunneling or encapsulation protocols for network virtualization such as GRE, 111c90ed40cSTony Nguyen * VxLAN, etc. 112c90ed40cSTony Nguyen */ 113c90ed40cSTony Nguyen enum ice_flow_seg_hdr { 114c90ed40cSTony Nguyen ICE_FLOW_SEG_HDR_NONE = 0x00000000, 115390bd141SQi Zhang ICE_FLOW_SEG_HDR_ETH = 0x00000001, 116390bd141SQi Zhang ICE_FLOW_SEG_HDR_VLAN = 0x00000002, 117c90ed40cSTony Nguyen ICE_FLOW_SEG_HDR_IPV4 = 0x00000004, 118c90ed40cSTony Nguyen ICE_FLOW_SEG_HDR_IPV6 = 0x00000008, 119390bd141SQi Zhang ICE_FLOW_SEG_HDR_ARP = 0x00000010, 120390bd141SQi Zhang ICE_FLOW_SEG_HDR_ICMP = 0x00000020, 121c90ed40cSTony Nguyen ICE_FLOW_SEG_HDR_TCP = 0x00000040, 122c90ed40cSTony Nguyen ICE_FLOW_SEG_HDR_UDP = 0x00000080, 123c90ed40cSTony Nguyen ICE_FLOW_SEG_HDR_SCTP = 0x00000100, 124a4e82a81STony Nguyen ICE_FLOW_SEG_HDR_GRE = 0x00000200, 1250577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPC = 0x00000400, 1260577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPC_TEID = 0x00000800, 1270577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPU_IP = 0x00001000, 1280577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPU_EH = 0x00002000, 1290577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPU_DWN = 0x00004000, 1300577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPU_UP = 0x00008000, 1310577313eSQi Zhang ICE_FLOW_SEG_HDR_PPPOE = 0x00010000, 1320577313eSQi Zhang ICE_FLOW_SEG_HDR_PFCP_NODE = 0x00020000, 1330577313eSQi Zhang ICE_FLOW_SEG_HDR_PFCP_SESSION = 0x00040000, 1340577313eSQi Zhang ICE_FLOW_SEG_HDR_L2TPV3 = 0x00080000, 1350577313eSQi Zhang ICE_FLOW_SEG_HDR_ESP = 0x00100000, 1360577313eSQi Zhang ICE_FLOW_SEG_HDR_AH = 0x00200000, 1370577313eSQi Zhang ICE_FLOW_SEG_HDR_NAT_T_ESP = 0x00400000, 138*7012dfd1SQi Zhang /* The following is an additive bit for ICE_FLOW_SEG_HDR_IPV4 and 139*7012dfd1SQi Zhang * ICE_FLOW_SEG_HDR_IPV6 which include the IPV4 other PTYPEs 140*7012dfd1SQi Zhang */ 141*7012dfd1SQi Zhang ICE_FLOW_SEG_HDR_IPV_OTHER = 0x20000000, 142c90ed40cSTony Nguyen }; 143c90ed40cSTony Nguyen 1440577313eSQi Zhang /* These segments all have the same PTYPES, but are otherwise distinguished by 1450577313eSQi Zhang * the value of the gtp_eh_pdu and gtp_eh_pdu_link flags: 1460577313eSQi Zhang * 1470577313eSQi Zhang * gtp_eh_pdu gtp_eh_pdu_link 1480577313eSQi Zhang * ICE_FLOW_SEG_HDR_GTPU_IP 0 0 1490577313eSQi Zhang * ICE_FLOW_SEG_HDR_GTPU_EH 1 don't care 1500577313eSQi Zhang * ICE_FLOW_SEG_HDR_GTPU_DWN 1 0 1510577313eSQi Zhang * ICE_FLOW_SEG_HDR_GTPU_UP 1 1 1520577313eSQi Zhang */ 1530577313eSQi Zhang #define ICE_FLOW_SEG_HDR_GTPU (ICE_FLOW_SEG_HDR_GTPU_IP | \ 1540577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPU_EH | \ 1550577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPU_DWN | \ 1560577313eSQi Zhang ICE_FLOW_SEG_HDR_GTPU_UP) 1570577313eSQi Zhang #define ICE_FLOW_SEG_HDR_PFCP (ICE_FLOW_SEG_HDR_PFCP_NODE | \ 1580577313eSQi Zhang ICE_FLOW_SEG_HDR_PFCP_SESSION) 1590577313eSQi Zhang 160c90ed40cSTony Nguyen enum ice_flow_field { 161390bd141SQi Zhang /* L2 */ 162390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ETH_DA, 163390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ETH_SA, 164390bd141SQi Zhang ICE_FLOW_FIELD_IDX_S_VLAN, 165390bd141SQi Zhang ICE_FLOW_FIELD_IDX_C_VLAN, 166390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ETH_TYPE, 167c90ed40cSTony Nguyen /* L3 */ 168b199dddbSQi Zhang ICE_FLOW_FIELD_IDX_IPV4_DSCP, 169b199dddbSQi Zhang ICE_FLOW_FIELD_IDX_IPV6_DSCP, 170b199dddbSQi Zhang ICE_FLOW_FIELD_IDX_IPV4_TTL, 171b199dddbSQi Zhang ICE_FLOW_FIELD_IDX_IPV4_PROT, 172b199dddbSQi Zhang ICE_FLOW_FIELD_IDX_IPV6_TTL, 173b199dddbSQi Zhang ICE_FLOW_FIELD_IDX_IPV6_PROT, 174c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_IPV4_SA, 175c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_IPV4_DA, 176c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_IPV6_SA, 177c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_IPV6_DA, 178c90ed40cSTony Nguyen /* L4 */ 179c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_TCP_SRC_PORT, 180c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_TCP_DST_PORT, 181c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_UDP_SRC_PORT, 182c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_UDP_DST_PORT, 1831c01c8c6SMd Fahad Iqbal Polash ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT, 1841c01c8c6SMd Fahad Iqbal Polash ICE_FLOW_FIELD_IDX_SCTP_DST_PORT, 185390bd141SQi Zhang ICE_FLOW_FIELD_IDX_TCP_FLAGS, 186390bd141SQi Zhang /* ARP */ 187390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ARP_SIP, 188390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ARP_DIP, 189390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ARP_SHA, 190390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ARP_DHA, 191390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ARP_OP, 192390bd141SQi Zhang /* ICMP */ 193390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ICMP_TYPE, 194390bd141SQi Zhang ICE_FLOW_FIELD_IDX_ICMP_CODE, 195a4e82a81STony Nguyen /* GRE */ 196a4e82a81STony Nguyen ICE_FLOW_FIELD_IDX_GRE_KEYID, 1970577313eSQi Zhang /* GTPC_TEID */ 1980577313eSQi Zhang ICE_FLOW_FIELD_IDX_GTPC_TEID, 1990577313eSQi Zhang /* GTPU_IP */ 2000577313eSQi Zhang ICE_FLOW_FIELD_IDX_GTPU_IP_TEID, 2010577313eSQi Zhang /* GTPU_EH */ 2020577313eSQi Zhang ICE_FLOW_FIELD_IDX_GTPU_EH_TEID, 2030577313eSQi Zhang ICE_FLOW_FIELD_IDX_GTPU_EH_QFI, 2040577313eSQi Zhang /* GTPU_UP */ 2050577313eSQi Zhang ICE_FLOW_FIELD_IDX_GTPU_UP_TEID, 2060577313eSQi Zhang /* GTPU_DWN */ 2070577313eSQi Zhang ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID, 2080577313eSQi Zhang /* PPPoE */ 2090577313eSQi Zhang ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID, 2100577313eSQi Zhang /* PFCP */ 2110577313eSQi Zhang ICE_FLOW_FIELD_IDX_PFCP_SEID, 2120577313eSQi Zhang /* L2TPv3 */ 2130577313eSQi Zhang ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID, 2140577313eSQi Zhang /* ESP */ 2150577313eSQi Zhang ICE_FLOW_FIELD_IDX_ESP_SPI, 2160577313eSQi Zhang /* AH */ 2170577313eSQi Zhang ICE_FLOW_FIELD_IDX_AH_SPI, 2180577313eSQi Zhang /* NAT_T ESP */ 2190577313eSQi Zhang ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI, 220c90ed40cSTony Nguyen /* The total number of enums must not exceed 64 */ 221c90ed40cSTony Nguyen ICE_FLOW_FIELD_IDX_MAX 222c90ed40cSTony Nguyen }; 223c90ed40cSTony Nguyen 2241c01c8c6SMd Fahad Iqbal Polash /* Flow headers and fields for AVF support */ 2251c01c8c6SMd Fahad Iqbal Polash enum ice_flow_avf_hdr_field { 2261c01c8c6SMd Fahad Iqbal Polash /* Values 0 - 28 are reserved for future use */ 2271c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_INVALID = 0, 2281c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP = 29, 2291c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP, 2301c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV4_UDP, 2311c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK, 2321c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV4_TCP, 2331c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV4_SCTP, 2341c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV4_OTHER, 2351c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_FRAG_IPV4, 2361c01c8c6SMd Fahad Iqbal Polash /* Values 37-38 are reserved */ 2371c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP = 39, 2381c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP, 2391c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV6_UDP, 2401c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK, 2411c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV6_TCP, 2421c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV6_SCTP, 2431c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_IPV6_OTHER, 2441c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_FRAG_IPV6, 2451c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_RSVD47, 2461c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_FCOE_OX, 2471c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_FCOE_RX, 2481c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_FCOE_OTHER, 2491c01c8c6SMd Fahad Iqbal Polash /* Values 51-62 are reserved */ 2501c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_L2_PAYLOAD = 63, 2511c01c8c6SMd Fahad Iqbal Polash ICE_AVF_FLOW_FIELD_MAX 2521c01c8c6SMd Fahad Iqbal Polash }; 2531c01c8c6SMd Fahad Iqbal Polash 2541c01c8c6SMd Fahad Iqbal Polash /* Supported RSS offloads This macro is defined to support 2551c01c8c6SMd Fahad Iqbal Polash * VIRTCHNL_OP_GET_RSS_HENA_CAPS ops. PF driver sends the RSS hardware 2561c01c8c6SMd Fahad Iqbal Polash * capabilities to the caller of this ops. 2571c01c8c6SMd Fahad Iqbal Polash */ 2581c01c8c6SMd Fahad Iqbal Polash #define ICE_DEFAULT_RSS_HENA ( \ 2591c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_UDP) | \ 2601c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_SCTP) | \ 2611c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP) | \ 2621c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_OTHER) | \ 2631c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV4) | \ 2641c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_UDP) | \ 2651c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP) | \ 2661c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_SCTP) | \ 2671c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_OTHER) | \ 2681c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV6) | \ 2691c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK) | \ 2701c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP) | \ 2711c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP) | \ 2721c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK) | \ 2731c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP) | \ 2741c01c8c6SMd Fahad Iqbal Polash BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP)) 2751c01c8c6SMd Fahad Iqbal Polash 27631ad4e4eSTony Nguyen enum ice_flow_dir { 27731ad4e4eSTony Nguyen ICE_FLOW_RX = 0x02, 27831ad4e4eSTony Nguyen }; 27931ad4e4eSTony Nguyen 2802c61054cSTony Nguyen enum ice_flow_priority { 2812c61054cSTony Nguyen ICE_FLOW_PRIO_LOW, 2822c61054cSTony Nguyen ICE_FLOW_PRIO_NORMAL, 2832c61054cSTony Nguyen ICE_FLOW_PRIO_HIGH 2842c61054cSTony Nguyen }; 2852c61054cSTony Nguyen 286c90ed40cSTony Nguyen #define ICE_FLOW_SEG_MAX 2 2872c57ffcbSHenry Tieman #define ICE_FLOW_SEG_RAW_FLD_MAX 2 28831ad4e4eSTony Nguyen #define ICE_FLOW_FV_EXTRACT_SZ 2 28931ad4e4eSTony Nguyen 290c90ed40cSTony Nguyen #define ICE_FLOW_SET_HDRS(seg, val) ((seg)->hdrs |= (u32)(val)) 291c90ed40cSTony Nguyen 292c90ed40cSTony Nguyen struct ice_flow_seg_xtrct { 293c90ed40cSTony Nguyen u8 prot_id; /* Protocol ID of extracted header field */ 294c90ed40cSTony Nguyen u16 off; /* Starting offset of the field in header in bytes */ 295c90ed40cSTony Nguyen u8 idx; /* Index of FV entry used */ 296c90ed40cSTony Nguyen u8 disp; /* Displacement of field in bits fr. FV entry's start */ 297b199dddbSQi Zhang u16 mask; /* Mask for field */ 298c90ed40cSTony Nguyen }; 299c90ed40cSTony Nguyen 300c90ed40cSTony Nguyen enum ice_flow_fld_match_type { 301c90ed40cSTony Nguyen ICE_FLOW_FLD_TYPE_REG, /* Value, mask */ 302c90ed40cSTony Nguyen ICE_FLOW_FLD_TYPE_RANGE, /* Value, mask, last (upper bound) */ 303c90ed40cSTony Nguyen ICE_FLOW_FLD_TYPE_PREFIX, /* IP address, prefix, size of prefix */ 304c90ed40cSTony Nguyen ICE_FLOW_FLD_TYPE_SIZE, /* Value, mask, size of match */ 305c90ed40cSTony Nguyen }; 306c90ed40cSTony Nguyen 307c90ed40cSTony Nguyen struct ice_flow_fld_loc { 308c90ed40cSTony Nguyen /* Describe offsets of field information relative to the beginning of 309c90ed40cSTony Nguyen * input buffer provided when adding flow entries. 310c90ed40cSTony Nguyen */ 311c90ed40cSTony Nguyen u16 val; /* Offset where the value is located */ 312c90ed40cSTony Nguyen u16 mask; /* Offset where the mask/prefix value is located */ 313c90ed40cSTony Nguyen u16 last; /* Length or offset where the upper value is located */ 314c90ed40cSTony Nguyen }; 315c90ed40cSTony Nguyen 316c90ed40cSTony Nguyen struct ice_flow_fld_info { 317c90ed40cSTony Nguyen enum ice_flow_fld_match_type type; 318c90ed40cSTony Nguyen /* Location where to retrieve data from an input buffer */ 319c90ed40cSTony Nguyen struct ice_flow_fld_loc src; 320c90ed40cSTony Nguyen /* Location where to put the data into the final entry buffer */ 321c90ed40cSTony Nguyen struct ice_flow_fld_loc entry; 322c90ed40cSTony Nguyen struct ice_flow_seg_xtrct xtrct; 323c90ed40cSTony Nguyen }; 324c90ed40cSTony Nguyen 3252c57ffcbSHenry Tieman struct ice_flow_seg_fld_raw { 3262c57ffcbSHenry Tieman struct ice_flow_fld_info info; 3272c57ffcbSHenry Tieman u16 off; /* Offset from the start of the segment */ 3282c57ffcbSHenry Tieman }; 3292c57ffcbSHenry Tieman 330c90ed40cSTony Nguyen struct ice_flow_seg_info { 331c90ed40cSTony Nguyen u32 hdrs; /* Bitmask indicating protocol headers present */ 332c90ed40cSTony Nguyen u64 match; /* Bitmask indicating header fields to be matched */ 333c90ed40cSTony Nguyen u64 range; /* Bitmask indicating header fields matched as ranges */ 334c90ed40cSTony Nguyen 335c90ed40cSTony Nguyen struct ice_flow_fld_info fields[ICE_FLOW_FIELD_IDX_MAX]; 3362c57ffcbSHenry Tieman 3372c57ffcbSHenry Tieman u8 raws_cnt; /* Number of raw fields to be matched */ 3382c57ffcbSHenry Tieman struct ice_flow_seg_fld_raw raws[ICE_FLOW_SEG_RAW_FLD_MAX]; 339c90ed40cSTony Nguyen }; 340c90ed40cSTony Nguyen 341148beb61SHenry Tieman /* This structure describes a flow entry, and is tracked only in this file */ 342148beb61SHenry Tieman struct ice_flow_entry { 343148beb61SHenry Tieman struct list_head l_entry; 344148beb61SHenry Tieman 345148beb61SHenry Tieman u64 id; 346148beb61SHenry Tieman struct ice_flow_prof *prof; 347148beb61SHenry Tieman /* Flow entry's content */ 348148beb61SHenry Tieman void *entry; 349148beb61SHenry Tieman enum ice_flow_priority priority; 350148beb61SHenry Tieman u16 vsi_handle; 351148beb61SHenry Tieman u16 entry_sz; 352148beb61SHenry Tieman }; 353148beb61SHenry Tieman 354ecfb751fSBixuan Cui #define ICE_FLOW_ENTRY_HNDL(e) ((u64)(uintptr_t)e) 355ecfb751fSBixuan Cui #define ICE_FLOW_ENTRY_PTR(h) ((struct ice_flow_entry *)(uintptr_t)(h)) 356148beb61SHenry Tieman 35731ad4e4eSTony Nguyen struct ice_flow_prof { 35831ad4e4eSTony Nguyen struct list_head l_entry; 35931ad4e4eSTony Nguyen 36031ad4e4eSTony Nguyen u64 id; 36131ad4e4eSTony Nguyen enum ice_flow_dir dir; 36231ad4e4eSTony Nguyen u8 segs_cnt; 36331ad4e4eSTony Nguyen 36431ad4e4eSTony Nguyen /* Keep track of flow entries associated with this flow profile */ 36531ad4e4eSTony Nguyen struct mutex entries_lock; 36631ad4e4eSTony Nguyen struct list_head entries; 36731ad4e4eSTony Nguyen 36831ad4e4eSTony Nguyen struct ice_flow_seg_info segs[ICE_FLOW_SEG_MAX]; 36931ad4e4eSTony Nguyen 37031ad4e4eSTony Nguyen /* software VSI handles referenced by this flow profile */ 37131ad4e4eSTony Nguyen DECLARE_BITMAP(vsis, ICE_MAX_VSI); 37231ad4e4eSTony Nguyen }; 37331ad4e4eSTony Nguyen 374c90ed40cSTony Nguyen struct ice_rss_cfg { 375c90ed40cSTony Nguyen struct list_head l_entry; 376c90ed40cSTony Nguyen /* bitmap of VSIs added to the RSS entry */ 377c90ed40cSTony Nguyen DECLARE_BITMAP(vsis, ICE_MAX_VSI); 378c90ed40cSTony Nguyen u64 hashed_flds; 379c90ed40cSTony Nguyen u32 packet_hdr; 380c90ed40cSTony Nguyen }; 381c90ed40cSTony Nguyen 382148beb61SHenry Tieman enum ice_status 383148beb61SHenry Tieman ice_flow_add_prof(struct ice_hw *hw, enum ice_block blk, enum ice_flow_dir dir, 384148beb61SHenry Tieman u64 prof_id, struct ice_flow_seg_info *segs, u8 segs_cnt, 385148beb61SHenry Tieman struct ice_flow_prof **prof); 386148beb61SHenry Tieman enum ice_status 387148beb61SHenry Tieman ice_flow_rem_prof(struct ice_hw *hw, enum ice_block blk, u64 prof_id); 388148beb61SHenry Tieman enum ice_status 389148beb61SHenry Tieman ice_flow_add_entry(struct ice_hw *hw, enum ice_block blk, u64 prof_id, 390148beb61SHenry Tieman u64 entry_id, u16 vsi, enum ice_flow_priority prio, 391148beb61SHenry Tieman void *data, u64 *entry_h); 392148beb61SHenry Tieman enum ice_status 393148beb61SHenry Tieman ice_flow_rem_entry(struct ice_hw *hw, enum ice_block blk, u64 entry_h); 394148beb61SHenry Tieman void 395148beb61SHenry Tieman ice_flow_set_fld(struct ice_flow_seg_info *seg, enum ice_flow_field fld, 396148beb61SHenry Tieman u16 val_loc, u16 mask_loc, u16 last_loc, bool range); 3972c57ffcbSHenry Tieman void 3982c57ffcbSHenry Tieman ice_flow_add_fld_raw(struct ice_flow_seg_info *seg, u16 off, u8 len, 3992c57ffcbSHenry Tieman u16 val_loc, u16 mask_loc); 4002c61054cSTony Nguyen void ice_rem_vsi_rss_list(struct ice_hw *hw, u16 vsi_handle); 401c90ed40cSTony Nguyen enum ice_status ice_replay_rss_cfg(struct ice_hw *hw, u16 vsi_handle); 4021c01c8c6SMd Fahad Iqbal Polash enum ice_status 4031c01c8c6SMd Fahad Iqbal Polash ice_add_avf_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u64 hashed_flds); 4042c61054cSTony Nguyen enum ice_status ice_rem_vsi_rss_cfg(struct ice_hw *hw, u16 vsi_handle); 405c90ed40cSTony Nguyen enum ice_status 406c90ed40cSTony Nguyen ice_add_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u64 hashed_flds, 407c90ed40cSTony Nguyen u32 addl_hdrs); 4086876fb64SMd Fahad Iqbal Polash u64 ice_get_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u32 hdrs); 409c90ed40cSTony Nguyen #endif /* _ICE_FLOW_H_ */ 410