1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2001-2021 Intel Corporation 3 */ 4 5 #include "ice_common.h" 6 #include "ice_fdir.h" 7 8 /* These are training packet headers used to program flow director filters. */ 9 static const u8 ice_fdir_tcpv4_pkt[] = { 10 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 12 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 13 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 16 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 17 }; 18 19 static const u8 ice_fdir_udpv4_pkt[] = { 20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 22 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 0x00, 0x00, 26 }; 27 28 static const u8 ice_fdir_sctpv4_pkt[] = { 29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 31 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 }; 36 37 static const u8 ice_fdir_ipv4_pkt[] = { 38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 40 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10, 41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 0x00, 0x00 43 }; 44 45 static const u8 ice_fdir_udp4_vxlan_pkt[] = { 46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 48 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 54 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 55 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 57 0x00, 0x00, 0x00, 0x00, 58 }; 59 60 static const u8 ice_fdir_ipv4_gtpu4_pkt[] = { 61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 62 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 63 0x00, 0x38, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 64 0x7c, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 65 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x24, 66 0xbf, 0xc0, 0x30, 0xff, 0x00, 0x14, 0x00, 0x00, 67 0x00, 0x00, 0x45, 0x00, 0x00, 0x14, 0x00, 0x01, 68 0x00, 0x00, 0x40, 0x00, 0x3a, 0x3d, 0x00, 0x00, 69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70 }; 71 72 static const u8 ice_fdir_udp4_gtpu4_pkt[] = { 73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 74 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 75 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 76 0x7c, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x2c, 78 0x00, 0x6f, 0x30, 0xff, 0x00, 0x1c, 0x00, 0x00, 79 0x00, 0x00, 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 80 0x00, 0x00, 0x40, 0x11, 0x3a, 0x24, 0x00, 0x00, 81 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 0x00, 0x00, 0x00, 0x08, 0xbe, 0xc7, 0x00, 0x00, 83 }; 84 85 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = { 86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 88 0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 89 0x7c, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x38, 91 0x00, 0x4c, 0x30, 0xff, 0x00, 0x28, 0x00, 0x00, 92 0x00, 0x00, 0x45, 0x00, 0x00, 0x28, 0x00, 0x01, 93 0x00, 0x00, 0x40, 0x06, 0x3a, 0x23, 0x00, 0x00, 94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 96 0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x4e, 0xd2, 97 0x00, 0x00, 0x00, 0x00, 98 }; 99 100 static const u8 ice_fdir_ipv4_gtpu4_eh_pkt[] = { 101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 102 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 103 0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 104 0x7c, 0xa8, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 105 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x2e, 106 0xba, 0x1d, 0x34, 0xff, 0x00, 0x1e, 0x00, 0x00, 107 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00, 108 0x00, 0x00, 0x45, 0x00, 0x00, 0x16, 0x00, 0x01, 109 0x00, 0x00, 0x40, 0x00, 0x7c, 0xe5, 0x7f, 0x00, 110 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 111 }; 112 113 static const u8 ice_fdir_udp4_gtpu4_eh_pkt[] = { 114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 115 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 116 0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 117 0x7c, 0xa0, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 118 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x36, 119 0xb8, 0x23, 0x34, 0xff, 0x00, 0x26, 0x00, 0x00, 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00, 121 0x00, 0x00, 0x45, 0x00, 0x00, 0x1e, 0x00, 0x01, 122 0x00, 0x00, 0x40, 0x11, 0x7c, 0xcc, 0x7f, 0x00, 123 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 124 0x00, 0x00, 0x00, 0x0a, 0x01, 0xd8, 0x00, 0x00, 125 }; 126 127 static const u8 ice_fdir_tcp4_gtpu4_eh_pkt[] = { 128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 129 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 130 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 131 0x7c, 0x94, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 132 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x42, 133 0xb8, 0x00, 0x34, 0xff, 0x00, 0x32, 0x00, 0x00, 134 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00, 135 0x00, 0x00, 0x45, 0x00, 0x00, 0x2a, 0x00, 0x01, 136 0x00, 0x00, 0x40, 0x06, 0x7c, 0xcb, 0x7f, 0x00, 137 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 139 0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x91, 0xde, 140 0x00, 0x00, 0x00, 0x00, 141 }; 142 143 static const u8 ice_fdir_ipv4_gtpu4_eh_dw_pkt[] = { 144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 145 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 146 0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 147 0x7c, 0xa8, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 148 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x2e, 149 0xba, 0x1d, 0x34, 0xff, 0x00, 0x1e, 0x00, 0x00, 150 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00, 151 0x00, 0x00, 0x45, 0x00, 0x00, 0x16, 0x00, 0x01, 152 0x00, 0x00, 0x40, 0x00, 0x7c, 0xe5, 0x7f, 0x00, 153 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 154 }; 155 156 static const u8 ice_fdir_udp4_gtpu4_eh_dw_pkt[] = { 157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 158 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 159 0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 160 0x7c, 0xa0, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 161 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x36, 162 0xb8, 0x23, 0x34, 0xff, 0x00, 0x26, 0x00, 0x00, 163 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00, 164 0x00, 0x00, 0x45, 0x00, 0x00, 0x1e, 0x00, 0x01, 165 0x00, 0x00, 0x40, 0x11, 0x7c, 0xcc, 0x7f, 0x00, 166 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 167 0x00, 0x00, 0x00, 0x0a, 0x01, 0xd8, 0x00, 0x00, 168 }; 169 170 static const u8 ice_fdir_tcp4_gtpu4_eh_dw_pkt[] = { 171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 172 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 173 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 174 0x7c, 0x94, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 175 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x42, 176 0xb8, 0x00, 0x34, 0xff, 0x00, 0x32, 0x00, 0x00, 177 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00, 178 0x00, 0x00, 0x45, 0x00, 0x00, 0x2a, 0x00, 0x01, 179 0x00, 0x00, 0x40, 0x06, 0x7c, 0xcb, 0x7f, 0x00, 180 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 182 0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x91, 0xde, 183 0x00, 0x00, 0x00, 0x00, 184 }; 185 186 static const u8 ice_fdir_ipv4_gtpu4_eh_up_pkt[] = { 187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 188 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 189 0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 190 0x7c, 0xa8, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 191 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x2e, 192 0xba, 0x0d, 0x34, 0xff, 0x00, 0x1e, 0x00, 0x00, 193 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x10, 194 0x00, 0x00, 0x45, 0x00, 0x00, 0x16, 0x00, 0x01, 195 0x00, 0x00, 0x40, 0x00, 0x7c, 0xe5, 0x7f, 0x00, 196 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 197 }; 198 199 static const u8 ice_fdir_udp4_gtpu4_eh_up_pkt[] = { 200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 201 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 202 0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 203 0x7c, 0xa0, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 204 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x36, 205 0xb8, 0x13, 0x34, 0xff, 0x00, 0x26, 0x00, 0x00, 206 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x10, 207 0x00, 0x00, 0x45, 0x00, 0x00, 0x1e, 0x00, 0x01, 208 0x00, 0x00, 0x40, 0x11, 0x7c, 0xcc, 0x7f, 0x00, 209 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 210 0x00, 0x00, 0x00, 0x0a, 0x01, 0xd8, 0x00, 0x00, 211 }; 212 213 static const u8 ice_fdir_tcp4_gtpu4_eh_up_pkt[] = { 214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 215 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 216 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 217 0x7c, 0x94, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 218 0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x42, 219 0xb7, 0xf0, 0x34, 0xff, 0x00, 0x32, 0x00, 0x00, 220 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x10, 221 0x00, 0x00, 0x45, 0x00, 0x00, 0x2a, 0x00, 0x01, 222 0x00, 0x00, 0x40, 0x06, 0x7c, 0xcb, 0x7f, 0x00, 223 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 225 0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x91, 0xde, 226 0x00, 0x00, 0x00, 0x00, 227 }; 228 229 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = { 230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 231 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 232 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 234 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 235 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 236 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 238 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 241 0x00, 0x00, 242 }; 243 244 static const u8 ice_fdir_ipv6_gtpu4_pkt[] = { 245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 246 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 247 0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 248 0x7c, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 249 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x38, 250 0x24, 0x42, 0x30, 0xff, 0x00, 0x28, 0x00, 0x00, 251 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 252 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 256 0x00, 0x00, 0x00, 0x00, 257 }; 258 259 static const u8 ice_fdir_udp6_gtpu4_pkt[] = { 260 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 261 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 262 0x00, 0x54, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 263 0x7c, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 264 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x40, 265 0x4e, 0x3d, 0x30, 0xff, 0x00, 0x30, 0x00, 0x00, 266 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 267 0x11, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x08, 272 0xff, 0xdc, 0x00, 0x00, 273 }; 274 275 static const u8 ice_fdir_tcp6_gtpu4_pkt[] = { 276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 277 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 278 0x00, 0x62, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 279 0x7c, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 280 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x4e, 281 0x59, 0x08, 0x30, 0xff, 0x00, 0x3e, 0x00, 0x00, 282 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x16, 283 0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 287 0x00, 0x00, 0x00, 0x14, 0x00, 0x50, 0x00, 0x00, 288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 289 0x20, 0x00, 0x8f, 0x7b, 0x00, 0x00, 0x00, 0x00, 290 }; 291 292 static const u8 ice_fdir_ipv6_gtpu6_pkt[] = { 293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 294 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00, 295 0x00, 0x00, 0x00, 0x38, 0x11, 0x40, 0x00, 0x00, 296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68, 300 0x08, 0x68, 0x00, 0x38, 0x22, 0x43, 0x30, 0xff, 301 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 302 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 0x00, 0x00, 303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 307 }; 308 309 static const u8 ice_fdir_ipv6_gtpu6_eh_pkt[] = { 310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 311 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00, 312 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00, 313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68, 317 0x08, 0x68, 0x00, 0x44, 0x1b, 0x9a, 0x34, 0xff, 318 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 319 0x00, 0x85, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 320 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 321 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 325 0x00, 0x00, 0x00, 0x00, 326 }; 327 328 static const u8 ice_fdir_ipv6_gtpu6_eh_dw_pkt[] = { 329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 330 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00, 331 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00, 332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68, 336 0x08, 0x68, 0x00, 0x44, 0x1b, 0x9a, 0x34, 0xff, 337 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 338 0x00, 0x85, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 339 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 340 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 344 0x00, 0x00, 0x00, 0x00, 345 }; 346 347 static const u8 ice_fdir_ipv6_gtpu6_eh_up_pkt[] = { 348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 349 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00, 350 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00, 351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68, 355 0x08, 0x68, 0x00, 0x44, 0x1b, 0x8a, 0x34, 0xff, 356 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 357 0x00, 0x85, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 358 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 359 0x3b, 0x40, 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, 0x00, 0x00, 0x00, 0x00, 363 0x00, 0x00, 0x00, 0x00, 364 }; 365 366 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = { 367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 368 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 369 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73, 370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 373 }; 374 375 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = { 376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 377 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 378 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00, 379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 384 0x00, 0x00, 385 }; 386 387 static const u8 ice_fdir_ipv4_esp_pkt[] = { 388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 389 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 390 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32, 391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 393 0x00, 0x00 394 }; 395 396 static const u8 ice_fdir_ipv6_esp_pkt[] = { 397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 398 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 399 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00, 400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 405 }; 406 407 static const u8 ice_fdir_ipv4_ah_pkt[] = { 408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 409 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 410 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33, 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 415 }; 416 417 static const u8 ice_fdir_ipv6_ah_pkt[] = { 418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 419 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 420 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00, 421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 427 }; 428 429 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = { 430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 431 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 432 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 433 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 434 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00, 435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 436 0x00, 0x00, 437 }; 438 439 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = { 440 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 441 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 442 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 443 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 447 0x11, 0x94, 0x00, 0x00, 0x00, 0x08, 448 }; 449 450 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = { 451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 452 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 453 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 455 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00, 456 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 458 0x00, 0x00, 459 }; 460 461 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = { 462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 463 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 464 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 465 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 466 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00, 467 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00, 468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 469 0x00, 0x00, 470 }; 471 472 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = { 473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 474 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 475 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00, 476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 477 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65, 480 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 481 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 483 }; 484 485 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = { 486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 487 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 488 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00, 489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 490 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 491 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 492 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65, 493 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 494 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 496 }; 497 498 static const u8 ice_fdir_non_ip_l2_pkt[] = { 499 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 500 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 501 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 502 }; 503 504 static const u8 ice_fdir_ecpri_tp0_pkt[] = { 505 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 506 0x00, 0x00, 0x00, 0x00, 0xAE, 0xFE, 0x10, 0x00, 507 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 508 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 509 }; 510 511 static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = { 512 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 513 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 514 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 515 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 516 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 517 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 518 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 519 }; 520 521 static const u8 ice_fdir_tcpv6_pkt[] = { 522 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 523 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 524 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00, 525 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 526 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 527 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 528 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 529 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 530 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 531 0x00, 0x00, 532 }; 533 534 static const u8 ice_fdir_udpv6_pkt[] = { 535 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 536 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 537 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 538 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 539 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 540 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 541 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 542 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 543 }; 544 545 static const u8 ice_fdir_sctpv6_pkt[] = { 546 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 547 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 548 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00, 549 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 551 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 552 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 553 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 554 0x00, 0x00, 555 }; 556 557 static const u8 ice_fdir_ipv6_pkt[] = { 558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 559 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 560 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00, 561 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 562 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 563 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 565 }; 566 567 static const u8 ice_fdir_tcp4_tun_pkt[] = { 568 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 569 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 570 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 571 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 572 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 573 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 574 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 575 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 576 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 577 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 578 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 579 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 580 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 581 }; 582 583 static const u8 ice_fdir_udp4_tun_pkt[] = { 584 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 585 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 586 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 588 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 589 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 590 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 591 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 592 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 593 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 594 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 595 0x00, 0x00, 0x00, 0x00, 596 }; 597 598 static const u8 ice_fdir_sctp4_tun_pkt[] = { 599 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 600 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 601 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 602 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 603 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 604 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 605 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 606 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 607 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 608 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 610 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 611 }; 612 613 static const u8 ice_fdir_ip4_tun_pkt[] = { 614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 615 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 616 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 618 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 619 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 622 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 623 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 624 0x00, 0x00, 0x00, 0x00, 625 }; 626 627 static const u8 ice_fdir_tcp6_tun_pkt[] = { 628 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 629 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 630 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 631 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 632 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 633 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 634 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 635 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 636 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 637 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 639 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 640 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 642 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 643 0x00, 0x00, 0x00, 0x00, 644 }; 645 646 static const u8 ice_fdir_udp6_tun_pkt[] = { 647 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 648 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 649 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 650 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 651 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 652 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 653 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 655 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 658 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 659 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 660 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 661 }; 662 663 static const u8 ice_fdir_sctp6_tun_pkt[] = { 664 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 665 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 666 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 667 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 668 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 669 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 671 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 672 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40, 673 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 674 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 675 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 676 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 677 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 678 0x00, 0x00, 0x00, 0x00, 679 }; 680 681 static const u8 ice_fdir_ip6_tun_pkt[] = { 682 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 683 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 684 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 687 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 688 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 689 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 690 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 691 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 692 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 695 }; 696 697 /* Flow Director no-op training packet table */ 698 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = { 699 { 700 ICE_FLTR_PTYPE_NONF_IPV4_TCP, 701 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt, 702 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt, 703 }, 704 { 705 ICE_FLTR_PTYPE_NONF_IPV4_UDP, 706 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt, 707 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt, 708 }, 709 { 710 ICE_FLTR_PTYPE_NONF_IPV4_SCTP, 711 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt, 712 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt, 713 }, 714 { 715 ICE_FLTR_PTYPE_NONF_IPV4_OTHER, 716 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt, 717 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt, 718 }, 719 { 720 ICE_FLTR_PTYPE_NONF_IPV4_GTPU, 721 sizeof(ice_fdir_ipv4_gtpu4_pkt), 722 ice_fdir_ipv4_gtpu4_pkt, 723 sizeof(ice_fdir_ipv4_gtpu4_pkt), 724 ice_fdir_ipv4_gtpu4_pkt, 725 }, 726 { 727 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH, 728 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt), 729 ice_fdir_ipv4_gtpu4_eh_pkt, 730 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt), 731 ice_fdir_ipv4_gtpu4_eh_pkt, 732 }, 733 { 734 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW, 735 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt), 736 ice_fdir_ipv4_gtpu4_eh_dw_pkt, 737 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt), 738 ice_fdir_ipv4_gtpu4_eh_dw_pkt, 739 }, 740 { 741 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP, 742 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt), 743 ice_fdir_ipv4_gtpu4_eh_up_pkt, 744 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt), 745 ice_fdir_ipv4_gtpu4_eh_up_pkt, 746 }, 747 { 748 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4, 749 sizeof(ice_fdir_ipv4_gtpu4_pkt), 750 ice_fdir_ipv4_gtpu4_pkt, 751 sizeof(ice_fdir_ipv4_gtpu4_pkt), 752 ice_fdir_ipv4_gtpu4_pkt, 753 }, 754 { 755 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP, 756 sizeof(ice_fdir_udp4_gtpu4_pkt), 757 ice_fdir_udp4_gtpu4_pkt, 758 sizeof(ice_fdir_udp4_gtpu4_pkt), 759 ice_fdir_udp4_gtpu4_pkt, 760 }, 761 { 762 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP, 763 sizeof(ice_fdir_tcp4_gtpu4_pkt), 764 ice_fdir_tcp4_gtpu4_pkt, 765 sizeof(ice_fdir_tcp4_gtpu4_pkt), 766 ice_fdir_tcp4_gtpu4_pkt, 767 }, 768 { 769 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4, 770 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt), 771 ice_fdir_ipv4_gtpu4_eh_pkt, 772 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt), 773 ice_fdir_ipv4_gtpu4_eh_pkt, 774 }, 775 { 776 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP, 777 sizeof(ice_fdir_udp4_gtpu4_eh_pkt), 778 ice_fdir_udp4_gtpu4_eh_pkt, 779 sizeof(ice_fdir_udp4_gtpu4_eh_pkt), 780 ice_fdir_udp4_gtpu4_eh_pkt, 781 }, 782 { 783 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP, 784 sizeof(ice_fdir_tcp4_gtpu4_eh_pkt), 785 ice_fdir_tcp4_gtpu4_eh_pkt, 786 sizeof(ice_fdir_tcp4_gtpu4_eh_pkt), 787 ice_fdir_tcp4_gtpu4_eh_pkt, 788 }, 789 { 790 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4, 791 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt), 792 ice_fdir_ipv4_gtpu4_eh_dw_pkt, 793 sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt), 794 ice_fdir_ipv4_gtpu4_eh_dw_pkt, 795 }, 796 { 797 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP, 798 sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt), 799 ice_fdir_udp4_gtpu4_eh_dw_pkt, 800 sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt), 801 ice_fdir_udp4_gtpu4_eh_dw_pkt, 802 }, 803 { 804 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP, 805 sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt), 806 ice_fdir_tcp4_gtpu4_eh_dw_pkt, 807 sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt), 808 ice_fdir_tcp4_gtpu4_eh_dw_pkt, 809 }, 810 { 811 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4, 812 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt), 813 ice_fdir_ipv4_gtpu4_eh_up_pkt, 814 sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt), 815 ice_fdir_ipv4_gtpu4_eh_up_pkt, 816 }, 817 { 818 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP, 819 sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt), 820 ice_fdir_udp4_gtpu4_eh_up_pkt, 821 sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt), 822 ice_fdir_udp4_gtpu4_eh_up_pkt, 823 }, 824 { 825 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP, 826 sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt), 827 ice_fdir_tcp4_gtpu4_eh_up_pkt, 828 sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt), 829 ice_fdir_tcp4_gtpu4_eh_up_pkt, 830 }, 831 { 832 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP, 833 sizeof(ice_fdir_icmp4_gtpu4_pkt), 834 ice_fdir_icmp4_gtpu4_pkt, 835 sizeof(ice_fdir_icmp4_gtpu4_pkt), 836 ice_fdir_icmp4_gtpu4_pkt, 837 }, 838 { 839 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER, 840 sizeof(ice_fdir_ipv4_gtpu4_pkt), 841 ice_fdir_ipv4_gtpu4_pkt, 842 sizeof(ice_fdir_ipv4_gtpu4_pkt), 843 ice_fdir_ipv4_gtpu4_pkt, 844 }, 845 { 846 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6, 847 sizeof(ice_fdir_ipv6_gtpu4_pkt), 848 ice_fdir_ipv6_gtpu4_pkt, 849 sizeof(ice_fdir_ipv6_gtpu4_pkt), 850 ice_fdir_ipv6_gtpu4_pkt, 851 }, 852 { 853 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP, 854 sizeof(ice_fdir_udp6_gtpu4_pkt), 855 ice_fdir_udp6_gtpu4_pkt, 856 sizeof(ice_fdir_udp6_gtpu4_pkt), 857 ice_fdir_udp6_gtpu4_pkt, 858 }, 859 { 860 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP, 861 sizeof(ice_fdir_tcp6_gtpu4_pkt), 862 ice_fdir_tcp6_gtpu4_pkt, 863 sizeof(ice_fdir_tcp6_gtpu4_pkt), 864 ice_fdir_tcp6_gtpu4_pkt, 865 }, 866 { 867 ICE_FLTR_PTYPE_NONF_IPV6_GTPU, 868 sizeof(ice_fdir_ipv6_gtpu6_pkt), 869 ice_fdir_ipv6_gtpu6_pkt, 870 sizeof(ice_fdir_ipv6_gtpu6_pkt), 871 ice_fdir_ipv6_gtpu6_pkt, 872 }, 873 { 874 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH, 875 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt), 876 ice_fdir_ipv6_gtpu6_eh_pkt, 877 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt), 878 ice_fdir_ipv6_gtpu6_eh_pkt, 879 }, 880 { 881 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW, 882 sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt), 883 ice_fdir_ipv6_gtpu6_eh_dw_pkt, 884 sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt), 885 ice_fdir_ipv6_gtpu6_eh_dw_pkt, 886 }, 887 { 888 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP, 889 sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt), 890 ice_fdir_ipv6_gtpu6_eh_up_pkt, 891 sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt), 892 ice_fdir_ipv6_gtpu6_eh_up_pkt, 893 }, 894 { 895 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER, 896 sizeof(ice_fdir_ipv6_gtpu6_pkt), 897 ice_fdir_ipv6_gtpu6_pkt, 898 sizeof(ice_fdir_ipv6_gtpu6_pkt), 899 ice_fdir_ipv6_gtpu6_pkt, 900 }, 901 { 902 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER, 903 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt), 904 ice_fdir_ipv4_gtpu4_eh_pkt, 905 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt), 906 ice_fdir_ipv4_gtpu4_eh_pkt, 907 }, 908 { 909 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER, 910 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt), 911 ice_fdir_ipv6_gtpu6_eh_pkt, 912 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt), 913 ice_fdir_ipv6_gtpu6_eh_pkt, 914 }, 915 { 916 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3, 917 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt, 918 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt, 919 }, 920 { 921 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3, 922 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt, 923 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt, 924 }, 925 { 926 ICE_FLTR_PTYPE_NONF_IPV4_ESP, 927 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt, 928 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt, 929 }, 930 { 931 ICE_FLTR_PTYPE_NONF_IPV6_ESP, 932 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt, 933 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt, 934 }, 935 { 936 ICE_FLTR_PTYPE_NONF_IPV4_AH, 937 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt, 938 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt, 939 }, 940 { 941 ICE_FLTR_PTYPE_NONF_IPV6_AH, 942 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt, 943 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt, 944 }, 945 { 946 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP, 947 sizeof(ice_fdir_ipv4_nat_t_esp_pkt), 948 ice_fdir_ipv4_nat_t_esp_pkt, 949 sizeof(ice_fdir_ipv4_nat_t_esp_pkt), 950 ice_fdir_ipv4_nat_t_esp_pkt, 951 }, 952 { 953 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP, 954 sizeof(ice_fdir_ipv6_nat_t_esp_pkt), 955 ice_fdir_ipv6_nat_t_esp_pkt, 956 sizeof(ice_fdir_ipv6_nat_t_esp_pkt), 957 ice_fdir_ipv6_nat_t_esp_pkt, 958 }, 959 { 960 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE, 961 sizeof(ice_fdir_ipv4_pfcp_node_pkt), 962 ice_fdir_ipv4_pfcp_node_pkt, 963 sizeof(ice_fdir_ipv4_pfcp_node_pkt), 964 ice_fdir_ipv4_pfcp_node_pkt, 965 }, 966 { 967 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION, 968 sizeof(ice_fdir_ipv4_pfcp_session_pkt), 969 ice_fdir_ipv4_pfcp_session_pkt, 970 sizeof(ice_fdir_ipv4_pfcp_session_pkt), 971 ice_fdir_ipv4_pfcp_session_pkt, 972 }, 973 { 974 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE, 975 sizeof(ice_fdir_ipv6_pfcp_node_pkt), 976 ice_fdir_ipv6_pfcp_node_pkt, 977 sizeof(ice_fdir_ipv6_pfcp_node_pkt), 978 ice_fdir_ipv6_pfcp_node_pkt, 979 }, 980 { 981 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION, 982 sizeof(ice_fdir_ipv6_pfcp_session_pkt), 983 ice_fdir_ipv6_pfcp_session_pkt, 984 sizeof(ice_fdir_ipv6_pfcp_session_pkt), 985 ice_fdir_ipv6_pfcp_session_pkt, 986 }, 987 { 988 ICE_FLTR_PTYPE_NON_IP_L2, 989 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt, 990 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt, 991 }, 992 { 993 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN, 994 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt, 995 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt, 996 }, 997 { 998 ICE_FLTR_PTYPE_NONF_ECPRI_TP0, 999 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt, 1000 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt, 1001 }, 1002 { 1003 ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0, 1004 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt), 1005 ice_fdir_ipv4_udp_ecpri_tp0_pkt, 1006 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt), 1007 ice_fdir_ipv4_udp_ecpri_tp0_pkt, 1008 }, 1009 { 1010 ICE_FLTR_PTYPE_NONF_IPV6_TCP, 1011 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt, 1012 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt, 1013 }, 1014 { 1015 ICE_FLTR_PTYPE_NONF_IPV6_UDP, 1016 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt, 1017 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt, 1018 }, 1019 { 1020 ICE_FLTR_PTYPE_NONF_IPV6_SCTP, 1021 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt, 1022 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt, 1023 }, 1024 { 1025 ICE_FLTR_PTYPE_NONF_IPV6_OTHER, 1026 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt, 1027 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt, 1028 }, 1029 }; 1030 1031 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt) 1032 1033 /** 1034 * ice_set_dflt_val_fd_desc 1035 * @fd_fltr_ctx: pointer to fd filter descriptor 1036 */ 1037 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx) 1038 { 1039 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 1040 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL; 1041 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST; 1042 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS; 1043 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE; 1044 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX; 1045 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1; 1046 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT; 1047 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO; 1048 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE; 1049 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0; 1050 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0; 1051 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG; 1052 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO; 1053 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO; 1054 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET; 1055 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE; 1056 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD; 1057 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO; 1058 } 1059 1060 /** 1061 * ice_set_fd_desc_val 1062 * @ctx: pointer to fd filter descriptor context 1063 * @fdir_desc: populated with fd filter descriptor values 1064 */ 1065 static void 1066 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx, 1067 struct ice_fltr_desc *fdir_desc) 1068 { 1069 u64 qword; 1070 1071 /* prep QW0 of FD filter programming desc */ 1072 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) & 1073 ICE_FXD_FLTR_QW0_QINDEX_M; 1074 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) & 1075 ICE_FXD_FLTR_QW0_COMP_Q_M; 1076 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) & 1077 ICE_FXD_FLTR_QW0_COMP_REPORT_M; 1078 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) & 1079 ICE_FXD_FLTR_QW0_FD_SPACE_M; 1080 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) & 1081 ICE_FXD_FLTR_QW0_STAT_CNT_M; 1082 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) & 1083 ICE_FXD_FLTR_QW0_STAT_ENA_M; 1084 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) & 1085 ICE_FXD_FLTR_QW0_EVICT_ENA_M; 1086 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) & 1087 ICE_FXD_FLTR_QW0_TO_Q_M; 1088 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) & 1089 ICE_FXD_FLTR_QW0_TO_Q_PRI_M; 1090 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) & 1091 ICE_FXD_FLTR_QW0_DPU_RECIPE_M; 1092 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) & 1093 ICE_FXD_FLTR_QW0_DROP_M; 1094 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) & 1095 ICE_FXD_FLTR_QW0_FLEX_PRI_M; 1096 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) & 1097 ICE_FXD_FLTR_QW0_FLEX_MDID_M; 1098 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) & 1099 ICE_FXD_FLTR_QW0_FLEX_VAL_M; 1100 fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword); 1101 1102 /* prep QW1 of FD filter programming desc */ 1103 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) & 1104 ICE_FXD_FLTR_QW1_DTYPE_M; 1105 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) & 1106 ICE_FXD_FLTR_QW1_PCMD_M; 1107 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) & 1108 ICE_FXD_FLTR_QW1_PROF_PRI_M; 1109 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) & 1110 ICE_FXD_FLTR_QW1_PROF_M; 1111 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) & 1112 ICE_FXD_FLTR_QW1_FD_VSI_M; 1113 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) & 1114 ICE_FXD_FLTR_QW1_SWAP_M; 1115 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) & 1116 ICE_FXD_FLTR_QW1_FDID_PRI_M; 1117 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) & 1118 ICE_FXD_FLTR_QW1_FDID_MDID_M; 1119 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) & 1120 ICE_FXD_FLTR_QW1_FDID_M; 1121 fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword); 1122 } 1123 1124 /** 1125 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct 1126 * @hw: pointer to the hardware structure 1127 * @input: filter 1128 * @fdesc: filter descriptor 1129 * @add: if add is true, this is an add operation, false implies delete 1130 */ 1131 void 1132 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input, 1133 struct ice_fltr_desc *fdesc, bool add) 1134 { 1135 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 }; 1136 1137 /* set default context info */ 1138 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx); 1139 1140 /* change sideband filtering values */ 1141 fdir_fltr_ctx.fdid = input->fltr_id; 1142 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) { 1143 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES; 1144 fdir_fltr_ctx.qindex = 0; 1145 } else if (input->dest_ctl == 1146 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) { 1147 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 1148 fdir_fltr_ctx.qindex = 0; 1149 } else { 1150 if (input->dest_ctl == 1151 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP) 1152 fdir_fltr_ctx.toq = input->q_region; 1153 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 1154 fdir_fltr_ctx.qindex = input->q_index; 1155 } 1156 fdir_fltr_ctx.cnt_ena = input->cnt_ena; 1157 fdir_fltr_ctx.cnt_index = input->cnt_index; 1158 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi); 1159 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE; 1160 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) 1161 fdir_fltr_ctx.toq_prio = 0; 1162 else 1163 fdir_fltr_ctx.toq_prio = 3; 1164 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD : 1165 ICE_FXD_FLTR_QW1_PCMD_REMOVE; 1166 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET; 1167 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 1168 fdir_fltr_ctx.comp_report = input->comp_report; 1169 fdir_fltr_ctx.fdid_prio = input->fdid_prio; 1170 fdir_fltr_ctx.desc_prof = 1; 1171 fdir_fltr_ctx.desc_prof_prio = 3; 1172 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc); 1173 } 1174 1175 /** 1176 * ice_alloc_fd_res_cntr - obtain counter resource for FD type 1177 * @hw: pointer to the hardware structure 1178 * @cntr_id: returns counter index 1179 */ 1180 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id) 1181 { 1182 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 1183 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 1184 } 1185 1186 /** 1187 * ice_free_fd_res_cntr - Free counter resource for FD type 1188 * @hw: pointer to the hardware structure 1189 * @cntr_id: counter index to be freed 1190 */ 1191 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id) 1192 { 1193 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 1194 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 1195 } 1196 1197 /** 1198 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries 1199 * @hw: pointer to the hardware structure 1200 * @cntr_id: returns counter index 1201 * @num_fltr: number of filter entries to be allocated 1202 */ 1203 enum ice_status 1204 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 1205 { 1206 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, 1207 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 1208 cntr_id); 1209 } 1210 1211 /** 1212 * ice_free_fd_guar_item - Free flow director guaranteed entries 1213 * @hw: pointer to the hardware structure 1214 * @cntr_id: counter index that needs to be freed 1215 * @num_fltr: number of filters to be freed 1216 */ 1217 enum ice_status 1218 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr) 1219 { 1220 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, 1221 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 1222 cntr_id); 1223 } 1224 1225 /** 1226 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries 1227 * @hw: pointer to the hardware structure 1228 * @cntr_id: returns counter index 1229 * @num_fltr: number of filter entries to be allocated 1230 */ 1231 enum ice_status 1232 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 1233 { 1234 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, 1235 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 1236 cntr_id); 1237 } 1238 1239 /** 1240 * ice_free_fd_shrd_item - Free flow director shared entries 1241 * @hw: pointer to the hardware structure 1242 * @cntr_id: counter index that needs to be freed 1243 * @num_fltr: number of filters to be freed 1244 */ 1245 enum ice_status 1246 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr) 1247 { 1248 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, 1249 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 1250 cntr_id); 1251 } 1252 1253 /** 1254 * ice_get_fdir_cnt_all - get the number of Flow Director filters 1255 * @hw: hardware data structure 1256 * 1257 * Returns the number of filters available on device 1258 */ 1259 int ice_get_fdir_cnt_all(struct ice_hw *hw) 1260 { 1261 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort; 1262 } 1263 1264 /** 1265 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer. 1266 * @pkt: packet buffer 1267 * @offset: offset into buffer 1268 * @addr: IPv6 address to convert and insert into pkt at offset 1269 */ 1270 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr) 1271 { 1272 int idx; 1273 1274 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++) 1275 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx], 1276 sizeof(*addr), ICE_NONDMA_TO_NONDMA); 1277 } 1278 1279 /** 1280 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu 1281 * @pkt: packet buffer 1282 * @offset: offset into buffer 1283 * @data: 8 bit value to convert and insert into pkt at offset 1284 * 1285 * This function is designed for inserting qfi (6 bits) for gtpu. 1286 */ 1287 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data) 1288 { 1289 u8 ret; 1290 1291 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0); 1292 ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA); 1293 } 1294 1295 /** 1296 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer. 1297 * @pkt: packet buffer 1298 * @offset: offset into buffer 1299 * @data: 8 bit value to convert and insert into pkt at offset 1300 */ 1301 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data) 1302 { 1303 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA); 1304 } 1305 1306 /** 1307 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6. 1308 * @pkt: packet buffer 1309 * @offset: offset into buffer 1310 * @data: 8 bit value to convert and insert into pkt at offset 1311 * 1312 * This function is designed for inserting Traffic Class (TC) for IPv6, 1313 * since that TC is not aligned in number of bytes. Here we split it out 1314 * into two part and fill each byte with data copy from pkt, then insert 1315 * the two bytes data one by one. 1316 */ 1317 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data) 1318 { 1319 u8 high, low; 1320 1321 high = (data >> 4) + (*(pkt + offset) & 0xF0); 1322 ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA); 1323 1324 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4); 1325 ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA); 1326 } 1327 1328 /** 1329 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer. 1330 * @pkt: packet buffer 1331 * @offset: offset into buffer 1332 * @data: 16 bit value to convert and insert into pkt at offset 1333 */ 1334 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data) 1335 { 1336 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA); 1337 } 1338 1339 /** 1340 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer. 1341 * @pkt: packet buffer 1342 * @offset: offset into buffer 1343 * @data: 32 bit value to convert and insert into pkt at offset 1344 */ 1345 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data) 1346 { 1347 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA); 1348 } 1349 1350 /** 1351 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer. 1352 * @pkt: packet buffer 1353 * @addr: MAC address to convert and insert into pkt at offset 1354 */ 1355 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr) 1356 { 1357 ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA); 1358 } 1359 1360 /** 1361 * ice_fdir_get_open_tunnel_port 1362 * @hw: pointer to the hardware structure 1363 * @flow: flow ptype 1364 * @port: returns open port 1365 * 1366 * returns an open tunnel port specified for this flow type 1367 */ 1368 static enum ice_status 1369 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow, 1370 u16 *port) 1371 { 1372 switch (flow) { 1373 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0: 1374 /* eCPRI tunnel */ 1375 if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port)) 1376 return ICE_ERR_DOES_NOT_EXIST; 1377 break; 1378 default: 1379 if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) && 1380 !ice_get_open_tunnel_port(hw, TNL_GENEVE, port)) 1381 return ICE_ERR_DOES_NOT_EXIST; 1382 } 1383 1384 return ICE_SUCCESS; 1385 } 1386 1387 /** 1388 * ice_fdir_get_gen_prgm_pkt - generate a training packet 1389 * @hw: pointer to the hardware structure 1390 * @input: flow director filter data structure 1391 * @pkt: pointer to return filter packet 1392 * @frag: generate a fragment packet 1393 * @tun: true implies generate a tunnel packet 1394 */ 1395 enum ice_status 1396 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, 1397 u8 *pkt, bool frag, bool tun) 1398 { 1399 enum ice_fltr_ptype flow; 1400 u16 tnl_port; 1401 u8 *loc; 1402 u16 idx; 1403 1404 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 1405 switch (input->ip.v4.proto) { 1406 case ICE_IP_PROTO_TCP: 1407 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP; 1408 break; 1409 case ICE_IP_PROTO_UDP: 1410 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP; 1411 break; 1412 case ICE_IP_PROTO_SCTP: 1413 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP; 1414 break; 1415 default: 1416 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER; 1417 break; 1418 } 1419 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 1420 switch (input->ip.v6.proto) { 1421 case ICE_IP_PROTO_TCP: 1422 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP; 1423 break; 1424 case ICE_IP_PROTO_UDP: 1425 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP; 1426 break; 1427 case ICE_IP_PROTO_SCTP: 1428 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP; 1429 break; 1430 default: 1431 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER; 1432 break; 1433 } 1434 } else { 1435 flow = input->flow_type; 1436 } 1437 1438 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++) 1439 if (ice_fdir_pkt[idx].flow == flow) 1440 break; 1441 if (idx == ICE_FDIR_NUM_PKT) 1442 return ICE_ERR_PARAM; 1443 if (!tun) { 1444 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt, 1445 ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA); 1446 loc = pkt; 1447 } else { 1448 if (!ice_fdir_pkt[idx].tun_pkt) 1449 return ICE_ERR_PARAM; 1450 1451 switch (flow) { 1452 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4: 1453 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP: 1454 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP: 1455 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6: 1456 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP: 1457 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP: 1458 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, 1459 ice_fdir_pkt[idx].tun_pkt_len, 1460 ICE_NONDMA_TO_NONDMA); 1461 loc = &pkt[ICE_FDIR_GTPU_IP_INNER_PKT_OFF]; 1462 break; 1463 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4: 1464 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP: 1465 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP: 1466 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4: 1467 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP: 1468 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP: 1469 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4: 1470 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP: 1471 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP: 1472 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, 1473 ice_fdir_pkt[idx].tun_pkt_len, 1474 ICE_NONDMA_TO_NONDMA); 1475 loc = &pkt[ICE_FDIR_GTPU_EH_INNER_PKT_OFF]; 1476 break; 1477 default: 1478 if (ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port)) 1479 return ICE_ERR_DOES_NOT_EXIST; 1480 1481 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, 1482 ice_fdir_pkt[idx].tun_pkt_len, 1483 ICE_NONDMA_TO_NONDMA); 1484 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET, 1485 HTONS(tnl_port)); 1486 loc = &pkt[ICE_FDIR_TUN_PKT_OFF]; 1487 break; 1488 } 1489 } 1490 1491 /* Reverse the src and dst, since the HW expects them to be from Tx 1492 * perspective. The input from user is from Rx filter perspective. 1493 */ 1494 switch (flow) { 1495 case ICE_FLTR_PTYPE_NONF_IPV4_TCP: 1496 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1497 input->ip.v4.src_ip); 1498 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET, 1499 input->ip.v4.src_port); 1500 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1501 input->ip.v4.dst_ip); 1502 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET, 1503 input->ip.v4.dst_port); 1504 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1505 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1506 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1507 if (frag) 1508 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF; 1509 break; 1510 case ICE_FLTR_PTYPE_NONF_IPV4_UDP: 1511 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac); 1512 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, 1513 input->ext_data_outer.src_mac); 1514 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET, 1515 input->ip_outer.v4.dst_ip); 1516 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET, 1517 input->ip_outer.v4.src_ip); 1518 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos); 1519 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1520 input->ip.v4.src_ip); 1521 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET, 1522 input->ip.v4.src_port); 1523 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1524 input->ip.v4.dst_ip); 1525 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 1526 input->ip.v4.dst_port); 1527 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1528 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1529 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1530 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac); 1531 break; 1532 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP: 1533 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1534 input->ip.v4.src_ip); 1535 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET, 1536 input->ip.v4.src_port); 1537 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1538 input->ip.v4.dst_ip); 1539 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET, 1540 input->ip.v4.dst_port); 1541 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1542 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1543 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1544 break; 1545 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER: 1546 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1547 input->ip.v4.src_ip); 1548 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1549 input->ip.v4.dst_ip); 1550 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1551 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1552 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET, 1553 input->ip.v4.proto); 1554 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1555 break; 1556 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN: 1557 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac); 1558 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac); 1559 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET, 1560 input->ip_outer.v4.dst_ip); 1561 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET, 1562 input->ip_outer.v4.src_ip); 1563 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos); 1564 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET, 1565 input->vxlan_data.vni); 1566 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1567 input->ip.v4.src_ip); 1568 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET, 1569 input->ip.v4.src_port); 1570 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1571 input->ip.v4.dst_ip); 1572 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 1573 input->ip.v4.dst_port); 1574 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1575 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1576 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1577 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac); 1578 break; 1579 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU: 1580 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1581 input->ip.v4.src_ip); 1582 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1583 input->ip.v4.dst_ip); 1584 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET, 1585 input->gtpu_data.teid); 1586 break; 1587 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4: 1588 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4: 1589 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4: 1590 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4: 1591 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET, 1592 input->ip.v4.src_ip); 1593 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET, 1594 input->ip.v4.dst_ip); 1595 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos); 1596 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl); 1597 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_PROTO_OFFSET, 1598 input->ip.v4.proto); 1599 break; 1600 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH: 1601 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW: 1602 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP: 1603 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1604 input->ip.v4.src_ip); 1605 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1606 input->ip.v4.dst_ip); 1607 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET, 1608 input->gtpu_data.teid); 1609 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET, 1610 input->gtpu_data.qfi); 1611 break; 1612 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP: 1613 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP: 1614 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP: 1615 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP: 1616 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET, 1617 input->ip.v4.src_ip); 1618 ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_DST_PORT_OFFSET, 1619 input->ip.v4.src_port); 1620 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET, 1621 input->ip.v4.dst_ip); 1622 ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_SRC_PORT_OFFSET, 1623 input->ip.v4.dst_port); 1624 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos); 1625 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl); 1626 break; 1627 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP: 1628 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP: 1629 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP: 1630 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP: 1631 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET, 1632 input->ip.v4.src_ip); 1633 ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_DST_PORT_OFFSET, 1634 input->ip.v4.src_port); 1635 ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET, 1636 input->ip.v4.dst_ip); 1637 ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_SRC_PORT_OFFSET, 1638 input->ip.v4.dst_port); 1639 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos); 1640 ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl); 1641 break; 1642 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6: 1643 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET, 1644 input->ip.v6.src_ip); 1645 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET, 1646 input->ip.v6.dst_ip); 1647 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc); 1648 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim); 1649 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_PROTO_OFFSET, 1650 input->ip.v6.proto); 1651 break; 1652 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP: 1653 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET, 1654 input->ip.v6.src_ip); 1655 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET, 1656 input->ip.v6.dst_ip); 1657 ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_DST_PORT_OFFSET, 1658 input->ip.v6.src_port); 1659 ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_SRC_PORT_OFFSET, 1660 input->ip.v6.dst_port); 1661 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc); 1662 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim); 1663 break; 1664 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP: 1665 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET, 1666 input->ip.v6.src_ip); 1667 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET, 1668 input->ip.v6.dst_ip); 1669 ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_DST_PORT_OFFSET, 1670 input->ip.v6.src_port); 1671 ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_SRC_PORT_OFFSET, 1672 input->ip.v6.dst_port); 1673 ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc); 1674 ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim); 1675 break; 1676 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU: 1677 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER: 1678 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1679 input->ip.v6.src_ip); 1680 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1681 input->ip.v6.dst_ip); 1682 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET, 1683 input->gtpu_data.teid); 1684 break; 1685 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH: 1686 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW: 1687 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP: 1688 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER: 1689 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1690 input->ip.v6.src_ip); 1691 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1692 input->ip.v6.dst_ip); 1693 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET, 1694 input->gtpu_data.teid); 1695 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET, 1696 input->gtpu_data.qfi); 1697 break; 1698 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3: 1699 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET, 1700 input->l2tpv3_data.session_id); 1701 break; 1702 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3: 1703 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET, 1704 input->l2tpv3_data.session_id); 1705 break; 1706 case ICE_FLTR_PTYPE_NONF_IPV4_ESP: 1707 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET, 1708 input->ip.v4.sec_parm_idx); 1709 break; 1710 case ICE_FLTR_PTYPE_NONF_IPV6_ESP: 1711 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET, 1712 input->ip.v6.sec_parm_idx); 1713 break; 1714 case ICE_FLTR_PTYPE_NONF_IPV4_AH: 1715 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET, 1716 input->ip.v4.sec_parm_idx); 1717 break; 1718 case ICE_FLTR_PTYPE_NONF_IPV6_AH: 1719 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET, 1720 input->ip.v6.sec_parm_idx); 1721 break; 1722 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP: 1723 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1724 input->ip.v4.src_ip); 1725 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1726 input->ip.v4.dst_ip); 1727 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET, 1728 input->ip.v4.sec_parm_idx); 1729 break; 1730 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP: 1731 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1732 input->ip.v6.src_ip); 1733 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1734 input->ip.v6.dst_ip); 1735 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET, 1736 input->ip.v6.sec_parm_idx); 1737 break; 1738 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE: 1739 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION: 1740 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 1741 input->ip.v4.dst_port); 1742 break; 1743 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE: 1744 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION: 1745 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 1746 input->ip.v6.dst_port); 1747 break; 1748 case ICE_FLTR_PTYPE_NON_IP_L2: 1749 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET, 1750 input->ext_data.ether_type); 1751 break; 1752 case ICE_FLTR_PTYPE_NONF_ECPRI_TP0: 1753 ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET, 1754 input->ecpri_data.pc_id); 1755 break; 1756 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0: 1757 /* Use pkt instead of loc, since PC_ID is in outer part */ 1758 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET, 1759 input->ecpri_data.pc_id); 1760 break; 1761 case ICE_FLTR_PTYPE_NONF_IPV6_TCP: 1762 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1763 input->ip.v6.src_ip); 1764 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1765 input->ip.v6.dst_ip); 1766 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET, 1767 input->ip.v6.src_port); 1768 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET, 1769 input->ip.v6.dst_port); 1770 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1771 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1772 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1773 break; 1774 case ICE_FLTR_PTYPE_NONF_IPV6_UDP: 1775 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1776 input->ip.v6.src_ip); 1777 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1778 input->ip.v6.dst_ip); 1779 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET, 1780 input->ip.v6.src_port); 1781 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 1782 input->ip.v6.dst_port); 1783 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1784 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1785 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1786 break; 1787 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP: 1788 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1789 input->ip.v6.src_ip); 1790 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1791 input->ip.v6.dst_ip); 1792 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET, 1793 input->ip.v6.src_port); 1794 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET, 1795 input->ip.v6.dst_port); 1796 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1797 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1798 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1799 break; 1800 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER: 1801 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1802 input->ip.v6.src_ip); 1803 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1804 input->ip.v6.dst_ip); 1805 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1806 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1807 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET, 1808 input->ip.v6.proto); 1809 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1810 break; 1811 default: 1812 return ICE_ERR_PARAM; 1813 } 1814 1815 if (input->flex_fltr) 1816 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word); 1817 1818 return ICE_SUCCESS; 1819 } 1820 1821 /** 1822 * ice_fdir_get_prgm_pkt - generate a training packet 1823 * @input: flow director filter data structure 1824 * @pkt: pointer to return filter packet 1825 * @frag: generate a fragment packet 1826 */ 1827 enum ice_status 1828 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag) 1829 { 1830 return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false); 1831 } 1832 1833 /** 1834 * ice_fdir_has_frag - does flow type have 2 ptypes 1835 * @flow: flow ptype 1836 * 1837 * returns true is there is a fragment packet for this ptype 1838 */ 1839 bool ice_fdir_has_frag(enum ice_fltr_ptype flow) 1840 { 1841 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 1842 return true; 1843 else 1844 return false; 1845 } 1846 1847 /** 1848 * ice_fdir_find_fltr_by_idx - find filter with idx 1849 * @hw: pointer to hardware structure 1850 * @fltr_idx: index to find. 1851 * 1852 * Returns pointer to filter if found or null 1853 */ 1854 struct ice_fdir_fltr * 1855 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx) 1856 { 1857 struct ice_fdir_fltr *rule; 1858 1859 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr, 1860 fltr_node) { 1861 /* rule ID found in the list */ 1862 if (fltr_idx == rule->fltr_id) 1863 return rule; 1864 if (fltr_idx < rule->fltr_id) 1865 break; 1866 } 1867 return NULL; 1868 } 1869 1870 /** 1871 * ice_fdir_list_add_fltr - add a new node to the flow director filter list 1872 * @hw: hardware structure 1873 * @fltr: filter node to add to structure 1874 */ 1875 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr) 1876 { 1877 struct ice_fdir_fltr *rule, *parent = NULL; 1878 1879 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr, 1880 fltr_node) { 1881 /* rule ID found or pass its spot in the list */ 1882 if (rule->fltr_id >= fltr->fltr_id) 1883 break; 1884 parent = rule; 1885 } 1886 1887 if (parent) 1888 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node); 1889 else 1890 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head); 1891 } 1892 1893 /** 1894 * ice_fdir_update_cntrs - increment / decrement filter counter 1895 * @hw: pointer to hardware structure 1896 * @flow: filter flow type 1897 * @acl_fltr: true indicates an ACL filter 1898 * @add: true implies filters added 1899 */ 1900 void 1901 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, 1902 bool acl_fltr, bool add) 1903 { 1904 int incr; 1905 1906 incr = add ? 1 : -1; 1907 hw->fdir_active_fltr += incr; 1908 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) { 1909 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow); 1910 } else { 1911 if (acl_fltr) 1912 hw->acl_fltr_cnt[flow] += incr; 1913 else 1914 hw->fdir_fltr_cnt[flow] += incr; 1915 } 1916 } 1917 1918 /** 1919 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses 1920 * @a: IP v6 address 1921 * @b: IP v6 address 1922 * 1923 * Returns 0 on equal, returns non-0 if different 1924 */ 1925 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b) 1926 { 1927 return memcmp(a, b, 4 * sizeof(__be32)); 1928 } 1929 1930 /** 1931 * ice_fdir_comp_rules - compare 2 filters 1932 * @a: a Flow Director filter data structure 1933 * @b: a Flow Director filter data structure 1934 * @v6: bool true if v6 filter 1935 * 1936 * Returns true if the filters match 1937 */ 1938 static bool 1939 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6) 1940 { 1941 enum ice_fltr_ptype flow_type = a->flow_type; 1942 1943 /* The calling function already checks that the two filters have the 1944 * same flow_type. 1945 */ 1946 if (!v6) { 1947 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 1948 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 1949 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) { 1950 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 1951 a->ip.v4.src_ip == b->ip.v4.src_ip && 1952 a->ip.v4.dst_port == b->ip.v4.dst_port && 1953 a->ip.v4.src_port == b->ip.v4.src_port) 1954 return true; 1955 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 1956 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 1957 a->ip.v4.src_ip == b->ip.v4.src_ip && 1958 a->ip.v4.l4_header == b->ip.v4.l4_header && 1959 a->ip.v4.proto == b->ip.v4.proto && 1960 a->ip.v4.ip_ver == b->ip.v4.ip_ver && 1961 a->ip.v4.tos == b->ip.v4.tos) 1962 return true; 1963 } 1964 } else { 1965 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP || 1966 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP || 1967 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) { 1968 if (a->ip.v6.dst_port == b->ip.v6.dst_port && 1969 a->ip.v6.src_port == b->ip.v6.src_port && 1970 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip, 1971 b->ip.v6.dst_ip) && 1972 !ice_cmp_ipv6_addr(a->ip.v6.src_ip, 1973 b->ip.v6.src_ip)) 1974 return true; 1975 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 1976 if (a->ip.v6.dst_port == b->ip.v6.dst_port && 1977 a->ip.v6.src_port == b->ip.v6.src_port) 1978 return true; 1979 } 1980 } 1981 1982 return false; 1983 } 1984 1985 /** 1986 * ice_fdir_is_dup_fltr - test if filter is already in list for PF 1987 * @hw: hardware data structure 1988 * @input: Flow Director filter data structure 1989 * 1990 * Returns true if the filter is found in the list 1991 */ 1992 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input) 1993 { 1994 struct ice_fdir_fltr *rule; 1995 bool ret = false; 1996 1997 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr, 1998 fltr_node) { 1999 enum ice_fltr_ptype flow_type; 2000 2001 if (rule->flow_type != input->flow_type) 2002 continue; 2003 2004 flow_type = input->flow_type; 2005 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 2006 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 2007 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP || 2008 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 2009 ret = ice_fdir_comp_rules(rule, input, false); 2010 else 2011 ret = ice_fdir_comp_rules(rule, input, true); 2012 if (ret) { 2013 if (rule->fltr_id == input->fltr_id && 2014 rule->q_index != input->q_index) 2015 ret = false; 2016 else 2017 break; 2018 } 2019 } 2020 2021 return ret; 2022 } 2023 2024 /** 2025 * ice_clear_pf_fd_table - admin command to clear FD table for PF 2026 * @hw: hardware data structure 2027 * 2028 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06) 2029 */ 2030 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw) 2031 { 2032 struct ice_aqc_clear_fd_table *cmd; 2033 struct ice_aq_desc desc; 2034 2035 cmd = &desc.params.clear_fd_table; 2036 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table); 2037 cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX; 2038 /* vsi_index must be 0 to clear FD table for a PF */ 2039 cmd->vsi_index = CPU_TO_LE16(0); 2040 2041 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL); 2042 } 2043