1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (C) 2018-2020, Intel Corporation. */ 3 4 #include "ice_common.h" 5 6 /* These are training packet headers used to program flow director filters. */ 7 static const u8 ice_fdir_tcpv4_pkt[] = { 8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 10 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 11 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 14 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 15 }; 16 17 static const u8 ice_fdir_udpv4_pkt[] = { 18 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 20 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 0x00, 0x00, 24 }; 25 26 static const u8 ice_fdir_sctpv4_pkt[] = { 27 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 29 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33 }; 34 35 static const u8 ice_fdir_ipv4_pkt[] = { 36 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 37 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 38 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10, 39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 40 0x00, 0x00 41 }; 42 43 static const u8 ice_fdir_udp4_gtpu4_pkt[] = { 44 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 46 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 49 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 50 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 52 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 0x00, 0x00, 56 }; 57 58 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = { 59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 60 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 61 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 64 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 65 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 67 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 72 }; 73 74 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = { 75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 76 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 77 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 80 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 81 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 83 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 0x00, 0x00, 87 }; 88 89 static const u8 ice_fdir_ipv4_gtpu4_pkt[] = { 90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 91 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 92 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 94 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 95 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 96 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 98 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 100 0x00, 0x00, 101 }; 102 103 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = { 104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 105 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 106 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73, 107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 110 }; 111 112 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = { 113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 114 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 115 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00, 116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 121 0x00, 0x00, 122 }; 123 124 static const u8 ice_fdir_ipv4_esp_pkt[] = { 125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 127 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32, 128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 130 0x00, 0x00 131 }; 132 133 static const u8 ice_fdir_ipv6_esp_pkt[] = { 134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 135 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 136 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00, 137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 142 }; 143 144 static const u8 ice_fdir_ipv4_ah_pkt[] = { 145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 146 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 147 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33, 148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 151 0x00, 0x00 152 }; 153 154 static const u8 ice_fdir_ipv6_ah_pkt[] = { 155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 156 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 157 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00, 158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 164 }; 165 166 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = { 167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 168 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 169 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 171 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00, 172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 173 0x00, 0x00, 174 }; 175 176 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = { 177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 178 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 179 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 184 0x11, 0x94, 0x00, 0x00, 0x00, 0x08, 185 }; 186 187 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = { 188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 189 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 190 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 192 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00, 193 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 195 0x00, 0x00, 196 }; 197 198 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = { 199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 200 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 201 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 203 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00, 204 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00, 205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 206 0x00, 0x00, 207 }; 208 209 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = { 210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 211 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 212 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00, 213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65, 217 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 218 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 220 }; 221 222 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = { 223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 224 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 225 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00, 226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65, 230 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 231 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 233 }; 234 235 static const u8 ice_fdir_non_ip_l2_pkt[] = { 236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 239 }; 240 241 static const u8 ice_fdir_tcpv6_pkt[] = { 242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 243 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 244 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00, 245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 250 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 251 0x00, 0x00, 252 }; 253 254 static const u8 ice_fdir_udpv6_pkt[] = { 255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 256 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 257 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 260 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 262 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 263 }; 264 265 static const u8 ice_fdir_sctpv6_pkt[] = { 266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 267 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 268 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00, 269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 274 0x00, 0x00, 275 }; 276 277 static const u8 ice_fdir_ipv6_pkt[] = { 278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 279 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 280 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00, 281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 285 }; 286 287 static const u8 ice_fdir_tcp4_tun_pkt[] = { 288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 289 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 290 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 293 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 296 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 297 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 300 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 301 }; 302 303 static const u8 ice_fdir_udp4_tun_pkt[] = { 304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 305 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 306 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 309 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 312 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 313 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 315 0x00, 0x00, 0x00, 0x00, 316 }; 317 318 static const u8 ice_fdir_sctp4_tun_pkt[] = { 319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 320 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 321 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 324 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 327 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 328 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 331 }; 332 333 static const u8 ice_fdir_ip4_tun_pkt[] = { 334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 335 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 336 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 339 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 342 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 343 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 344 0x00, 0x00, 0x00, 0x00, 345 }; 346 347 static const u8 ice_fdir_tcp6_tun_pkt[] = { 348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 349 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 350 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 353 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 356 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 362 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 363 0x00, 0x00, 0x00, 0x00, 364 }; 365 366 static const u8 ice_fdir_udp6_tun_pkt[] = { 367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 368 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 369 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 372 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 375 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 381 }; 382 383 static const u8 ice_fdir_sctp6_tun_pkt[] = { 384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 385 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 386 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 389 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 392 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40, 393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 398 0x00, 0x00, 0x00, 0x00, 399 }; 400 401 static const u8 ice_fdir_ip6_tun_pkt[] = { 402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 403 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 404 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 407 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 410 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 415 }; 416 417 /* Flow Director no-op training packet table */ 418 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = { 419 { 420 ICE_FLTR_PTYPE_NONF_IPV4_TCP, 421 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt, 422 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt, 423 }, 424 { 425 ICE_FLTR_PTYPE_NONF_IPV4_UDP, 426 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt, 427 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt, 428 }, 429 { 430 ICE_FLTR_PTYPE_NONF_IPV4_SCTP, 431 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt, 432 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt, 433 }, 434 { 435 ICE_FLTR_PTYPE_NONF_IPV4_OTHER, 436 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt, 437 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt, 438 }, 439 { 440 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP, 441 sizeof(ice_fdir_udp4_gtpu4_pkt), 442 ice_fdir_udp4_gtpu4_pkt, 443 sizeof(ice_fdir_udp4_gtpu4_pkt), 444 ice_fdir_udp4_gtpu4_pkt, 445 }, 446 { 447 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP, 448 sizeof(ice_fdir_tcp4_gtpu4_pkt), 449 ice_fdir_tcp4_gtpu4_pkt, 450 sizeof(ice_fdir_tcp4_gtpu4_pkt), 451 ice_fdir_tcp4_gtpu4_pkt, 452 }, 453 { 454 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP, 455 sizeof(ice_fdir_icmp4_gtpu4_pkt), 456 ice_fdir_icmp4_gtpu4_pkt, 457 sizeof(ice_fdir_icmp4_gtpu4_pkt), 458 ice_fdir_icmp4_gtpu4_pkt, 459 }, 460 { 461 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER, 462 sizeof(ice_fdir_ipv4_gtpu4_pkt), 463 ice_fdir_ipv4_gtpu4_pkt, 464 sizeof(ice_fdir_ipv4_gtpu4_pkt), 465 ice_fdir_ipv4_gtpu4_pkt, 466 }, 467 { 468 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3, 469 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt, 470 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt, 471 }, 472 { 473 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3, 474 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt, 475 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt, 476 }, 477 { 478 ICE_FLTR_PTYPE_NONF_IPV4_ESP, 479 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt, 480 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt, 481 }, 482 { 483 ICE_FLTR_PTYPE_NONF_IPV6_ESP, 484 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt, 485 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt, 486 }, 487 { 488 ICE_FLTR_PTYPE_NONF_IPV4_AH, 489 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt, 490 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt, 491 }, 492 { 493 ICE_FLTR_PTYPE_NONF_IPV6_AH, 494 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt, 495 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt, 496 }, 497 { 498 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP, 499 sizeof(ice_fdir_ipv4_nat_t_esp_pkt), 500 ice_fdir_ipv4_nat_t_esp_pkt, 501 sizeof(ice_fdir_ipv4_nat_t_esp_pkt), 502 ice_fdir_ipv4_nat_t_esp_pkt, 503 }, 504 { 505 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP, 506 sizeof(ice_fdir_ipv6_nat_t_esp_pkt), 507 ice_fdir_ipv6_nat_t_esp_pkt, 508 sizeof(ice_fdir_ipv6_nat_t_esp_pkt), 509 ice_fdir_ipv6_nat_t_esp_pkt, 510 }, 511 { 512 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE, 513 sizeof(ice_fdir_ipv4_pfcp_node_pkt), 514 ice_fdir_ipv4_pfcp_node_pkt, 515 sizeof(ice_fdir_ipv4_pfcp_node_pkt), 516 ice_fdir_ipv4_pfcp_node_pkt, 517 }, 518 { 519 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION, 520 sizeof(ice_fdir_ipv4_pfcp_session_pkt), 521 ice_fdir_ipv4_pfcp_session_pkt, 522 sizeof(ice_fdir_ipv4_pfcp_session_pkt), 523 ice_fdir_ipv4_pfcp_session_pkt, 524 }, 525 { 526 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE, 527 sizeof(ice_fdir_ipv6_pfcp_node_pkt), 528 ice_fdir_ipv6_pfcp_node_pkt, 529 sizeof(ice_fdir_ipv6_pfcp_node_pkt), 530 ice_fdir_ipv6_pfcp_node_pkt, 531 }, 532 { 533 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION, 534 sizeof(ice_fdir_ipv6_pfcp_session_pkt), 535 ice_fdir_ipv6_pfcp_session_pkt, 536 sizeof(ice_fdir_ipv6_pfcp_session_pkt), 537 ice_fdir_ipv6_pfcp_session_pkt, 538 }, 539 { 540 ICE_FLTR_PTYPE_NON_IP_L2, 541 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt, 542 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt, 543 }, 544 { 545 ICE_FLTR_PTYPE_NONF_IPV6_TCP, 546 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt, 547 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt, 548 }, 549 { 550 ICE_FLTR_PTYPE_NONF_IPV6_UDP, 551 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt, 552 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt, 553 }, 554 { 555 ICE_FLTR_PTYPE_NONF_IPV6_SCTP, 556 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt, 557 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt, 558 }, 559 { 560 ICE_FLTR_PTYPE_NONF_IPV6_OTHER, 561 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt, 562 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt, 563 }, 564 }; 565 566 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt) 567 568 /** 569 * ice_set_dflt_val_fd_desc 570 * @fd_fltr_ctx: pointer to fd filter descriptor 571 */ 572 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx) 573 { 574 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 575 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL; 576 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST; 577 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS; 578 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE; 579 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX; 580 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1; 581 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT; 582 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO; 583 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE; 584 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0; 585 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0; 586 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG; 587 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO; 588 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO; 589 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET; 590 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE; 591 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD; 592 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO; 593 } 594 595 /** 596 * ice_set_fd_desc_val 597 * @ctx: pointer to fd filter descriptor context 598 * @fdir_desc: populated with fd filter descriptor values 599 */ 600 static void 601 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx, 602 struct ice_fltr_desc *fdir_desc) 603 { 604 u64 qword; 605 606 /* prep QW0 of FD filter programming desc */ 607 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) & 608 ICE_FXD_FLTR_QW0_QINDEX_M; 609 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) & 610 ICE_FXD_FLTR_QW0_COMP_Q_M; 611 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) & 612 ICE_FXD_FLTR_QW0_COMP_REPORT_M; 613 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) & 614 ICE_FXD_FLTR_QW0_FD_SPACE_M; 615 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) & 616 ICE_FXD_FLTR_QW0_STAT_CNT_M; 617 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) & 618 ICE_FXD_FLTR_QW0_STAT_ENA_M; 619 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) & 620 ICE_FXD_FLTR_QW0_EVICT_ENA_M; 621 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) & 622 ICE_FXD_FLTR_QW0_TO_Q_M; 623 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) & 624 ICE_FXD_FLTR_QW0_TO_Q_PRI_M; 625 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) & 626 ICE_FXD_FLTR_QW0_DPU_RECIPE_M; 627 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) & 628 ICE_FXD_FLTR_QW0_DROP_M; 629 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) & 630 ICE_FXD_FLTR_QW0_FLEX_PRI_M; 631 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) & 632 ICE_FXD_FLTR_QW0_FLEX_MDID_M; 633 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) & 634 ICE_FXD_FLTR_QW0_FLEX_VAL_M; 635 fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword); 636 637 /* prep QW1 of FD filter programming desc */ 638 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) & 639 ICE_FXD_FLTR_QW1_DTYPE_M; 640 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) & 641 ICE_FXD_FLTR_QW1_PCMD_M; 642 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) & 643 ICE_FXD_FLTR_QW1_PROF_PRI_M; 644 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) & 645 ICE_FXD_FLTR_QW1_PROF_M; 646 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) & 647 ICE_FXD_FLTR_QW1_FD_VSI_M; 648 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) & 649 ICE_FXD_FLTR_QW1_SWAP_M; 650 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) & 651 ICE_FXD_FLTR_QW1_FDID_PRI_M; 652 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) & 653 ICE_FXD_FLTR_QW1_FDID_MDID_M; 654 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) & 655 ICE_FXD_FLTR_QW1_FDID_M; 656 fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword); 657 } 658 659 /** 660 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct 661 * @hw: pointer to the hardware structure 662 * @input: filter 663 * @fdesc: filter descriptor 664 * @add: if add is true, this is an add operation, false implies delete 665 */ 666 void 667 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input, 668 struct ice_fltr_desc *fdesc, bool add) 669 { 670 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 }; 671 672 /* set default context info */ 673 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx); 674 675 /* change sideband filtering values */ 676 fdir_fltr_ctx.fdid = input->fltr_id; 677 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) { 678 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES; 679 fdir_fltr_ctx.qindex = 0; 680 } else if (input->dest_ctl == 681 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) { 682 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 683 fdir_fltr_ctx.qindex = 0; 684 } else { 685 if (input->dest_ctl == 686 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP) 687 fdir_fltr_ctx.toq = input->q_region; 688 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 689 fdir_fltr_ctx.qindex = input->q_index; 690 } 691 fdir_fltr_ctx.cnt_ena = input->cnt_ena; 692 fdir_fltr_ctx.cnt_index = input->cnt_index; 693 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi); 694 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE; 695 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) 696 fdir_fltr_ctx.toq_prio = 0; 697 else 698 fdir_fltr_ctx.toq_prio = 3; 699 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD : 700 ICE_FXD_FLTR_QW1_PCMD_REMOVE; 701 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET; 702 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 703 fdir_fltr_ctx.comp_report = input->comp_report; 704 fdir_fltr_ctx.fdid_prio = input->fdid_prio; 705 fdir_fltr_ctx.desc_prof = 1; 706 fdir_fltr_ctx.desc_prof_prio = 3; 707 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc); 708 } 709 710 /** 711 * ice_alloc_fd_res_cntr - obtain counter resource for FD type 712 * @hw: pointer to the hardware structure 713 * @cntr_id: returns counter index 714 */ 715 int ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id) 716 { 717 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 718 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 719 } 720 721 /** 722 * ice_free_fd_res_cntr - Free counter resource for FD type 723 * @hw: pointer to the hardware structure 724 * @cntr_id: counter index to be freed 725 */ 726 int ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id) 727 { 728 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 729 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 730 } 731 732 /** 733 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries 734 * @hw: pointer to the hardware structure 735 * @cntr_id: returns counter index 736 * @num_fltr: number of filter entries to be allocated 737 */ 738 int ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 739 { 740 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, 741 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 742 cntr_id); 743 } 744 745 /** 746 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries 747 * @hw: pointer to the hardware structure 748 * @cntr_id: returns counter index 749 * @num_fltr: number of filter entries to be allocated 750 */ 751 int ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 752 { 753 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, 754 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 755 cntr_id); 756 } 757 758 /** 759 * ice_get_fdir_cnt_all - get the number of Flow Director filters 760 * @hw: hardware data structure 761 * 762 * Returns the number of filters available on device 763 */ 764 int ice_get_fdir_cnt_all(struct ice_hw *hw) 765 { 766 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort; 767 } 768 769 /** 770 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer 771 * @pkt: packet buffer 772 * @offset: offset into buffer 773 * @addr: IPv6 address to convert and insert into pkt at offset 774 */ 775 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr) 776 { 777 int idx; 778 779 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++) 780 memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx], 781 sizeof(*addr)); 782 } 783 784 /** 785 * ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU 786 * @pkt: packet buffer 787 * @offset: offset into buffer 788 * @data: 8 bit value to convert and insert into pkt at offset 789 * 790 * This function is designed for inserting QFI (6 bits) for GTPU. 791 */ 792 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data) 793 { 794 u8 ret; 795 796 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0); 797 memcpy(pkt + offset, &ret, sizeof(ret)); 798 } 799 800 /** 801 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer. 802 * @pkt: packet buffer 803 * @offset: offset into buffer 804 * @data: 8 bit value to convert and insert into pkt at offset 805 */ 806 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data) 807 { 808 memcpy(pkt + offset, &data, sizeof(data)); 809 } 810 811 /** 812 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6. 813 * @pkt: packet buffer 814 * @offset: offset into buffer 815 * @data: 8 bit value to convert and insert into pkt at offset 816 * 817 * This function is designed for inserting Traffic Class (TC) for IPv6, 818 * since that TC is not aligned in number of bytes. Here we split it out 819 * into two part and fill each byte with data copy from pkt, then insert 820 * the two bytes data one by one. 821 */ 822 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data) 823 { 824 u8 high, low; 825 826 high = (data >> 4) + (*(pkt + offset) & 0xF0); 827 memcpy(pkt + offset, &high, sizeof(high)); 828 829 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4); 830 memcpy(pkt + offset + 1, &low, sizeof(low)); 831 } 832 833 /** 834 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer 835 * @pkt: packet buffer 836 * @offset: offset into buffer 837 * @data: 16 bit value to convert and insert into pkt at offset 838 */ 839 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data) 840 { 841 memcpy(pkt + offset, &data, sizeof(data)); 842 } 843 844 /** 845 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer 846 * @pkt: packet buffer 847 * @offset: offset into buffer 848 * @data: 32 bit value to convert and insert into pkt at offset 849 */ 850 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data) 851 { 852 memcpy(pkt + offset, &data, sizeof(data)); 853 } 854 855 /** 856 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer. 857 * @pkt: packet buffer 858 * @addr: MAC address to convert and insert into pkt at offset 859 */ 860 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr) 861 { 862 ether_addr_copy(pkt, addr); 863 } 864 865 /** 866 * ice_fdir_get_gen_prgm_pkt - generate a training packet 867 * @hw: pointer to the hardware structure 868 * @input: flow director filter data structure 869 * @pkt: pointer to return filter packet 870 * @frag: generate a fragment packet 871 * @tun: true implies generate a tunnel packet 872 */ 873 int 874 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, 875 u8 *pkt, bool frag, bool tun) 876 { 877 enum ice_fltr_ptype flow; 878 u16 tnl_port; 879 u8 *loc; 880 u16 idx; 881 882 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 883 switch (input->ip.v4.proto) { 884 case IPPROTO_TCP: 885 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP; 886 break; 887 case IPPROTO_UDP: 888 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP; 889 break; 890 case IPPROTO_SCTP: 891 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP; 892 break; 893 default: 894 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER; 895 break; 896 } 897 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 898 switch (input->ip.v6.proto) { 899 case IPPROTO_TCP: 900 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP; 901 break; 902 case IPPROTO_UDP: 903 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP; 904 break; 905 case IPPROTO_SCTP: 906 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP; 907 break; 908 default: 909 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER; 910 break; 911 } 912 } else { 913 flow = input->flow_type; 914 } 915 916 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++) 917 if (ice_fdir_pkt[idx].flow == flow) 918 break; 919 if (idx == ICE_FDIR_NUM_PKT) 920 return -EINVAL; 921 if (!tun) { 922 memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len); 923 loc = pkt; 924 } else { 925 if (!ice_get_open_tunnel_port(hw, &tnl_port, TNL_ALL)) 926 return -ENOENT; 927 if (!ice_fdir_pkt[idx].tun_pkt) 928 return -EINVAL; 929 memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, 930 ice_fdir_pkt[idx].tun_pkt_len); 931 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET, 932 htons(tnl_port)); 933 loc = &pkt[ICE_FDIR_TUN_PKT_OFF]; 934 } 935 936 /* Reverse the src and dst, since the HW expects them to be from Tx 937 * perspective. The input from user is from Rx filter perspective. 938 */ 939 switch (flow) { 940 case ICE_FLTR_PTYPE_NONF_IPV4_TCP: 941 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 942 input->ip.v4.src_ip); 943 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET, 944 input->ip.v4.src_port); 945 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 946 input->ip.v4.dst_ip); 947 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET, 948 input->ip.v4.dst_port); 949 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 950 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 951 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 952 if (frag) 953 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF; 954 break; 955 case ICE_FLTR_PTYPE_NONF_IPV4_UDP: 956 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 957 input->ip.v4.src_ip); 958 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET, 959 input->ip.v4.src_port); 960 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 961 input->ip.v4.dst_ip); 962 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 963 input->ip.v4.dst_port); 964 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 965 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 966 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 967 ice_pkt_insert_mac_addr(loc + ETH_ALEN, 968 input->ext_data.src_mac); 969 break; 970 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP: 971 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 972 input->ip.v4.src_ip); 973 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET, 974 input->ip.v4.src_port); 975 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 976 input->ip.v4.dst_ip); 977 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET, 978 input->ip.v4.dst_port); 979 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 980 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 981 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 982 break; 983 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER: 984 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 985 input->ip.v4.src_ip); 986 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 987 input->ip.v4.dst_ip); 988 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 989 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 990 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET, 991 input->ip.v4.proto); 992 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 993 break; 994 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP: 995 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP: 996 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP: 997 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER: 998 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 999 input->ip.v4.src_ip); 1000 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1001 input->ip.v4.dst_ip); 1002 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET, 1003 input->gtpu_data.teid); 1004 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET, 1005 input->gtpu_data.qfi); 1006 break; 1007 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3: 1008 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET, 1009 input->l2tpv3_data.session_id); 1010 break; 1011 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3: 1012 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET, 1013 input->l2tpv3_data.session_id); 1014 break; 1015 case ICE_FLTR_PTYPE_NONF_IPV4_ESP: 1016 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET, 1017 input->ip.v4.sec_parm_idx); 1018 break; 1019 case ICE_FLTR_PTYPE_NONF_IPV6_ESP: 1020 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET, 1021 input->ip.v6.sec_parm_idx); 1022 break; 1023 case ICE_FLTR_PTYPE_NONF_IPV4_AH: 1024 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET, 1025 input->ip.v4.sec_parm_idx); 1026 break; 1027 case ICE_FLTR_PTYPE_NONF_IPV6_AH: 1028 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET, 1029 input->ip.v6.sec_parm_idx); 1030 break; 1031 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP: 1032 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1033 input->ip.v4.src_ip); 1034 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1035 input->ip.v4.dst_ip); 1036 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET, 1037 input->ip.v4.sec_parm_idx); 1038 break; 1039 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP: 1040 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1041 input->ip.v6.src_ip); 1042 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1043 input->ip.v6.dst_ip); 1044 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET, 1045 input->ip.v6.sec_parm_idx); 1046 break; 1047 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE: 1048 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION: 1049 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 1050 input->ip.v4.dst_port); 1051 break; 1052 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE: 1053 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION: 1054 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 1055 input->ip.v6.dst_port); 1056 break; 1057 case ICE_FLTR_PTYPE_NON_IP_L2: 1058 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET, 1059 input->ext_data.ether_type); 1060 break; 1061 case ICE_FLTR_PTYPE_NONF_IPV6_TCP: 1062 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1063 input->ip.v6.src_ip); 1064 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1065 input->ip.v6.dst_ip); 1066 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET, 1067 input->ip.v6.src_port); 1068 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET, 1069 input->ip.v6.dst_port); 1070 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1071 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1072 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1073 break; 1074 case ICE_FLTR_PTYPE_NONF_IPV6_UDP: 1075 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1076 input->ip.v6.src_ip); 1077 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1078 input->ip.v6.dst_ip); 1079 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET, 1080 input->ip.v6.src_port); 1081 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 1082 input->ip.v6.dst_port); 1083 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1084 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1085 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1086 break; 1087 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP: 1088 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1089 input->ip.v6.src_ip); 1090 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1091 input->ip.v6.dst_ip); 1092 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET, 1093 input->ip.v6.src_port); 1094 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET, 1095 input->ip.v6.dst_port); 1096 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1097 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1098 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1099 break; 1100 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER: 1101 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1102 input->ip.v6.src_ip); 1103 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1104 input->ip.v6.dst_ip); 1105 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1106 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1107 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET, 1108 input->ip.v6.proto); 1109 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1110 break; 1111 default: 1112 return -EINVAL; 1113 } 1114 1115 if (input->flex_fltr) 1116 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word); 1117 1118 return 0; 1119 } 1120 1121 /** 1122 * ice_fdir_has_frag - does flow type have 2 ptypes 1123 * @flow: flow ptype 1124 * 1125 * returns true is there is a fragment packet for this ptype 1126 */ 1127 bool ice_fdir_has_frag(enum ice_fltr_ptype flow) 1128 { 1129 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 1130 return true; 1131 else 1132 return false; 1133 } 1134 1135 /** 1136 * ice_fdir_find_fltr_by_idx - find filter with idx 1137 * @hw: pointer to hardware structure 1138 * @fltr_idx: index to find. 1139 * 1140 * Returns pointer to filter if found or null 1141 */ 1142 struct ice_fdir_fltr * 1143 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx) 1144 { 1145 struct ice_fdir_fltr *rule; 1146 1147 list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 1148 /* rule ID found in the list */ 1149 if (fltr_idx == rule->fltr_id) 1150 return rule; 1151 if (fltr_idx < rule->fltr_id) 1152 break; 1153 } 1154 return NULL; 1155 } 1156 1157 /** 1158 * ice_fdir_list_add_fltr - add a new node to the flow director filter list 1159 * @hw: hardware structure 1160 * @fltr: filter node to add to structure 1161 */ 1162 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr) 1163 { 1164 struct ice_fdir_fltr *rule, *parent = NULL; 1165 1166 list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 1167 /* rule ID found or pass its spot in the list */ 1168 if (rule->fltr_id >= fltr->fltr_id) 1169 break; 1170 parent = rule; 1171 } 1172 1173 if (parent) 1174 list_add(&fltr->fltr_node, &parent->fltr_node); 1175 else 1176 list_add(&fltr->fltr_node, &hw->fdir_list_head); 1177 } 1178 1179 /** 1180 * ice_fdir_update_cntrs - increment / decrement filter counter 1181 * @hw: pointer to hardware structure 1182 * @flow: filter flow type 1183 * @add: true implies filters added 1184 */ 1185 void 1186 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add) 1187 { 1188 int incr; 1189 1190 incr = add ? 1 : -1; 1191 hw->fdir_active_fltr += incr; 1192 1193 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) 1194 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow); 1195 else 1196 hw->fdir_fltr_cnt[flow] += incr; 1197 } 1198 1199 /** 1200 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses 1201 * @a: IP v6 address 1202 * @b: IP v6 address 1203 * 1204 * Returns 0 on equal, returns non-0 if different 1205 */ 1206 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b) 1207 { 1208 return memcmp(a, b, 4 * sizeof(__be32)); 1209 } 1210 1211 /** 1212 * ice_fdir_comp_rules - compare 2 filters 1213 * @a: a Flow Director filter data structure 1214 * @b: a Flow Director filter data structure 1215 * @v6: bool true if v6 filter 1216 * 1217 * Returns true if the filters match 1218 */ 1219 static bool 1220 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6) 1221 { 1222 enum ice_fltr_ptype flow_type = a->flow_type; 1223 1224 /* The calling function already checks that the two filters have the 1225 * same flow_type. 1226 */ 1227 if (!v6) { 1228 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 1229 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 1230 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) { 1231 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 1232 a->ip.v4.src_ip == b->ip.v4.src_ip && 1233 a->ip.v4.dst_port == b->ip.v4.dst_port && 1234 a->ip.v4.src_port == b->ip.v4.src_port) 1235 return true; 1236 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 1237 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 1238 a->ip.v4.src_ip == b->ip.v4.src_ip && 1239 a->ip.v4.l4_header == b->ip.v4.l4_header && 1240 a->ip.v4.proto == b->ip.v4.proto && 1241 a->ip.v4.ip_ver == b->ip.v4.ip_ver && 1242 a->ip.v4.tos == b->ip.v4.tos) 1243 return true; 1244 } 1245 } else { 1246 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP || 1247 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP || 1248 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) { 1249 if (a->ip.v6.dst_port == b->ip.v6.dst_port && 1250 a->ip.v6.src_port == b->ip.v6.src_port && 1251 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip, 1252 b->ip.v6.dst_ip) && 1253 !ice_cmp_ipv6_addr(a->ip.v6.src_ip, 1254 b->ip.v6.src_ip)) 1255 return true; 1256 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 1257 if (a->ip.v6.dst_port == b->ip.v6.dst_port && 1258 a->ip.v6.src_port == b->ip.v6.src_port) 1259 return true; 1260 } 1261 } 1262 1263 return false; 1264 } 1265 1266 /** 1267 * ice_fdir_is_dup_fltr - test if filter is already in list for PF 1268 * @hw: hardware data structure 1269 * @input: Flow Director filter data structure 1270 * 1271 * Returns true if the filter is found in the list 1272 */ 1273 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input) 1274 { 1275 struct ice_fdir_fltr *rule; 1276 bool ret = false; 1277 1278 list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 1279 enum ice_fltr_ptype flow_type; 1280 1281 if (rule->flow_type != input->flow_type) 1282 continue; 1283 1284 flow_type = input->flow_type; 1285 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 1286 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 1287 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP || 1288 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 1289 ret = ice_fdir_comp_rules(rule, input, false); 1290 else 1291 ret = ice_fdir_comp_rules(rule, input, true); 1292 if (ret) { 1293 if (rule->fltr_id == input->fltr_id && 1294 rule->q_index != input->q_index) 1295 ret = false; 1296 else 1297 break; 1298 } 1299 } 1300 1301 return ret; 1302 } 1303