1 { 2 "XDP pkt read, pkt_end mangling, bad access 1", 3 .insns = { 4 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 5 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 6 offsetof(struct xdp_md, data_end)), 7 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8), 10 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 11 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 12 BPF_MOV64_IMM(BPF_REG_0, 0), 13 BPF_EXIT_INSN(), 14 }, 15 .errstr = "R3 pointer arithmetic on pkt_end", 16 .result = REJECT, 17 .prog_type = BPF_PROG_TYPE_XDP, 18 }, 19 { 20 "XDP pkt read, pkt_end mangling, bad access 2", 21 .insns = { 22 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 23 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 24 offsetof(struct xdp_md, data_end)), 25 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 26 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 27 BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8), 28 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 29 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 30 BPF_MOV64_IMM(BPF_REG_0, 0), 31 BPF_EXIT_INSN(), 32 }, 33 .errstr = "R3 pointer arithmetic on pkt_end", 34 .result = REJECT, 35 .prog_type = BPF_PROG_TYPE_XDP, 36 }, 37 { 38 "XDP pkt read, pkt_data' > pkt_end, good access", 39 .insns = { 40 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 41 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 42 offsetof(struct xdp_md, data_end)), 43 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 44 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 45 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 46 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 47 BPF_MOV64_IMM(BPF_REG_0, 0), 48 BPF_EXIT_INSN(), 49 }, 50 .result = ACCEPT, 51 .prog_type = BPF_PROG_TYPE_XDP, 52 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 53 }, 54 { 55 "XDP pkt read, pkt_data' > pkt_end, bad access 1", 56 .insns = { 57 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 58 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 59 offsetof(struct xdp_md, data_end)), 60 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 61 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 62 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 63 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 64 BPF_MOV64_IMM(BPF_REG_0, 0), 65 BPF_EXIT_INSN(), 66 }, 67 .errstr = "R1 offset is outside of the packet", 68 .result = REJECT, 69 .prog_type = BPF_PROG_TYPE_XDP, 70 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 71 }, 72 { 73 "XDP pkt read, pkt_data' > pkt_end, bad access 2", 74 .insns = { 75 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 76 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 77 offsetof(struct xdp_md, data_end)), 78 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 79 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 80 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 81 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 82 BPF_MOV64_IMM(BPF_REG_0, 0), 83 BPF_EXIT_INSN(), 84 }, 85 .errstr = "R1 offset is outside of the packet", 86 .result = REJECT, 87 .prog_type = BPF_PROG_TYPE_XDP, 88 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 89 }, 90 { 91 "XDP pkt read, pkt_end > pkt_data', good access", 92 .insns = { 93 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 94 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 95 offsetof(struct xdp_md, data_end)), 96 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 97 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 98 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 99 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 100 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 101 BPF_MOV64_IMM(BPF_REG_0, 0), 102 BPF_EXIT_INSN(), 103 }, 104 .result = ACCEPT, 105 .prog_type = BPF_PROG_TYPE_XDP, 106 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 107 }, 108 { 109 "XDP pkt read, pkt_end > pkt_data', bad access 1", 110 .insns = { 111 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 112 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 113 offsetof(struct xdp_md, data_end)), 114 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 115 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 116 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 117 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 118 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 119 BPF_MOV64_IMM(BPF_REG_0, 0), 120 BPF_EXIT_INSN(), 121 }, 122 .errstr = "R1 offset is outside of the packet", 123 .result = REJECT, 124 .prog_type = BPF_PROG_TYPE_XDP, 125 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 126 }, 127 { 128 "XDP pkt read, pkt_end > pkt_data', bad access 2", 129 .insns = { 130 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 131 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 132 offsetof(struct xdp_md, data_end)), 133 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 134 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 135 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 136 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 137 BPF_MOV64_IMM(BPF_REG_0, 0), 138 BPF_EXIT_INSN(), 139 }, 140 .errstr = "R1 offset is outside of the packet", 141 .result = REJECT, 142 .prog_type = BPF_PROG_TYPE_XDP, 143 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 144 }, 145 { 146 "XDP pkt read, pkt_data' < pkt_end, good access", 147 .insns = { 148 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 149 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 150 offsetof(struct xdp_md, data_end)), 151 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 152 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 153 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 154 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 155 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 156 BPF_MOV64_IMM(BPF_REG_0, 0), 157 BPF_EXIT_INSN(), 158 }, 159 .result = ACCEPT, 160 .prog_type = BPF_PROG_TYPE_XDP, 161 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 162 }, 163 { 164 "XDP pkt read, pkt_data' < pkt_end, bad access 1", 165 .insns = { 166 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 167 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 168 offsetof(struct xdp_md, data_end)), 169 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 170 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 171 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 172 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 173 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 174 BPF_MOV64_IMM(BPF_REG_0, 0), 175 BPF_EXIT_INSN(), 176 }, 177 .errstr = "R1 offset is outside of the packet", 178 .result = REJECT, 179 .prog_type = BPF_PROG_TYPE_XDP, 180 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 181 }, 182 { 183 "XDP pkt read, pkt_data' < pkt_end, bad access 2", 184 .insns = { 185 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 186 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 187 offsetof(struct xdp_md, data_end)), 188 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 189 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 190 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 191 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 192 BPF_MOV64_IMM(BPF_REG_0, 0), 193 BPF_EXIT_INSN(), 194 }, 195 .errstr = "R1 offset is outside of the packet", 196 .result = REJECT, 197 .prog_type = BPF_PROG_TYPE_XDP, 198 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 199 }, 200 { 201 "XDP pkt read, pkt_end < pkt_data', good access", 202 .insns = { 203 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 204 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 205 offsetof(struct xdp_md, data_end)), 206 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 207 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 208 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 209 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 210 BPF_MOV64_IMM(BPF_REG_0, 0), 211 BPF_EXIT_INSN(), 212 }, 213 .result = ACCEPT, 214 .prog_type = BPF_PROG_TYPE_XDP, 215 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 216 }, 217 { 218 "XDP pkt read, pkt_end < pkt_data', bad access 1", 219 .insns = { 220 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 221 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 222 offsetof(struct xdp_md, data_end)), 223 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 224 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 225 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 226 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 227 BPF_MOV64_IMM(BPF_REG_0, 0), 228 BPF_EXIT_INSN(), 229 }, 230 .errstr = "R1 offset is outside of the packet", 231 .result = REJECT, 232 .prog_type = BPF_PROG_TYPE_XDP, 233 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 234 }, 235 { 236 "XDP pkt read, pkt_end < pkt_data', bad access 2", 237 .insns = { 238 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 239 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 240 offsetof(struct xdp_md, data_end)), 241 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 242 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 243 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 244 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 245 BPF_MOV64_IMM(BPF_REG_0, 0), 246 BPF_EXIT_INSN(), 247 }, 248 .errstr = "R1 offset is outside of the packet", 249 .result = REJECT, 250 .prog_type = BPF_PROG_TYPE_XDP, 251 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 252 }, 253 { 254 "XDP pkt read, pkt_data' >= pkt_end, good access", 255 .insns = { 256 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 257 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 258 offsetof(struct xdp_md, data_end)), 259 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 260 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 261 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 262 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 263 BPF_MOV64_IMM(BPF_REG_0, 0), 264 BPF_EXIT_INSN(), 265 }, 266 .result = ACCEPT, 267 .prog_type = BPF_PROG_TYPE_XDP, 268 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 269 }, 270 { 271 "XDP pkt read, pkt_data' >= pkt_end, bad access 1", 272 .insns = { 273 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 274 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 275 offsetof(struct xdp_md, data_end)), 276 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 277 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 278 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 279 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 280 BPF_MOV64_IMM(BPF_REG_0, 0), 281 BPF_EXIT_INSN(), 282 }, 283 .errstr = "R1 offset is outside of the packet", 284 .result = REJECT, 285 .prog_type = BPF_PROG_TYPE_XDP, 286 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 287 }, 288 { 289 "XDP pkt read, pkt_data' >= pkt_end, bad access 2", 290 .insns = { 291 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 292 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 293 offsetof(struct xdp_md, data_end)), 294 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 295 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 296 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 297 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 298 BPF_MOV64_IMM(BPF_REG_0, 0), 299 BPF_EXIT_INSN(), 300 }, 301 .errstr = "R1 offset is outside of the packet", 302 .result = REJECT, 303 .prog_type = BPF_PROG_TYPE_XDP, 304 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 305 }, 306 { 307 "XDP pkt read, pkt_end >= pkt_data', good access", 308 .insns = { 309 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 310 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 311 offsetof(struct xdp_md, data_end)), 312 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 313 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 314 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 315 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 316 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 317 BPF_MOV64_IMM(BPF_REG_0, 0), 318 BPF_EXIT_INSN(), 319 }, 320 .result = ACCEPT, 321 .prog_type = BPF_PROG_TYPE_XDP, 322 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 323 }, 324 { 325 "XDP pkt read, pkt_end >= pkt_data', bad access 1", 326 .insns = { 327 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 328 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 329 offsetof(struct xdp_md, data_end)), 330 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 331 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 332 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 333 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 334 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 335 BPF_MOV64_IMM(BPF_REG_0, 0), 336 BPF_EXIT_INSN(), 337 }, 338 .errstr = "R1 offset is outside of the packet", 339 .result = REJECT, 340 .prog_type = BPF_PROG_TYPE_XDP, 341 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 342 }, 343 { 344 "XDP pkt read, pkt_end >= pkt_data', bad access 2", 345 .insns = { 346 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 347 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 348 offsetof(struct xdp_md, data_end)), 349 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 350 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 351 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 352 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 353 BPF_MOV64_IMM(BPF_REG_0, 0), 354 BPF_EXIT_INSN(), 355 }, 356 .errstr = "R1 offset is outside of the packet", 357 .result = REJECT, 358 .prog_type = BPF_PROG_TYPE_XDP, 359 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 360 }, 361 { 362 "XDP pkt read, pkt_data' <= pkt_end, good access", 363 .insns = { 364 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 365 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 366 offsetof(struct xdp_md, data_end)), 367 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 368 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 369 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 370 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 371 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 372 BPF_MOV64_IMM(BPF_REG_0, 0), 373 BPF_EXIT_INSN(), 374 }, 375 .result = ACCEPT, 376 .prog_type = BPF_PROG_TYPE_XDP, 377 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 378 }, 379 { 380 "XDP pkt read, pkt_data' <= pkt_end, bad access 1", 381 .insns = { 382 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 383 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 384 offsetof(struct xdp_md, data_end)), 385 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 386 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 387 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 388 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 389 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 390 BPF_MOV64_IMM(BPF_REG_0, 0), 391 BPF_EXIT_INSN(), 392 }, 393 .errstr = "R1 offset is outside of the packet", 394 .result = REJECT, 395 .prog_type = BPF_PROG_TYPE_XDP, 396 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 397 }, 398 { 399 "XDP pkt read, pkt_data' <= pkt_end, bad access 2", 400 .insns = { 401 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 402 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 403 offsetof(struct xdp_md, data_end)), 404 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 405 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 406 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 407 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 408 BPF_MOV64_IMM(BPF_REG_0, 0), 409 BPF_EXIT_INSN(), 410 }, 411 .errstr = "R1 offset is outside of the packet", 412 .result = REJECT, 413 .prog_type = BPF_PROG_TYPE_XDP, 414 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 415 }, 416 { 417 "XDP pkt read, pkt_end <= pkt_data', good access", 418 .insns = { 419 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 420 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 421 offsetof(struct xdp_md, data_end)), 422 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 423 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 424 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 425 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 426 BPF_MOV64_IMM(BPF_REG_0, 0), 427 BPF_EXIT_INSN(), 428 }, 429 .result = ACCEPT, 430 .prog_type = BPF_PROG_TYPE_XDP, 431 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 432 }, 433 { 434 "XDP pkt read, pkt_end <= pkt_data', bad access 1", 435 .insns = { 436 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 437 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 438 offsetof(struct xdp_md, data_end)), 439 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 440 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 441 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 442 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 443 BPF_MOV64_IMM(BPF_REG_0, 0), 444 BPF_EXIT_INSN(), 445 }, 446 .errstr = "R1 offset is outside of the packet", 447 .result = REJECT, 448 .prog_type = BPF_PROG_TYPE_XDP, 449 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 450 }, 451 { 452 "XDP pkt read, pkt_end <= pkt_data', bad access 2", 453 .insns = { 454 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), 455 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 456 offsetof(struct xdp_md, data_end)), 457 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 458 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 459 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 460 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 461 BPF_MOV64_IMM(BPF_REG_0, 0), 462 BPF_EXIT_INSN(), 463 }, 464 .errstr = "R1 offset is outside of the packet", 465 .result = REJECT, 466 .prog_type = BPF_PROG_TYPE_XDP, 467 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 468 }, 469 { 470 "XDP pkt read, pkt_meta' > pkt_data, good access", 471 .insns = { 472 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 473 offsetof(struct xdp_md, data_meta)), 474 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 475 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 476 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 477 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 478 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 479 BPF_MOV64_IMM(BPF_REG_0, 0), 480 BPF_EXIT_INSN(), 481 }, 482 .result = ACCEPT, 483 .prog_type = BPF_PROG_TYPE_XDP, 484 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 485 }, 486 { 487 "XDP pkt read, pkt_meta' > pkt_data, bad access 1", 488 .insns = { 489 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 490 offsetof(struct xdp_md, data_meta)), 491 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 492 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 493 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 494 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 495 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 496 BPF_MOV64_IMM(BPF_REG_0, 0), 497 BPF_EXIT_INSN(), 498 }, 499 .errstr = "R1 offset is outside of the packet", 500 .result = REJECT, 501 .prog_type = BPF_PROG_TYPE_XDP, 502 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 503 }, 504 { 505 "XDP pkt read, pkt_meta' > pkt_data, bad access 2", 506 .insns = { 507 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 508 offsetof(struct xdp_md, data_meta)), 509 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 510 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 511 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 512 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 513 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 514 BPF_MOV64_IMM(BPF_REG_0, 0), 515 BPF_EXIT_INSN(), 516 }, 517 .errstr = "R1 offset is outside of the packet", 518 .result = REJECT, 519 .prog_type = BPF_PROG_TYPE_XDP, 520 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 521 }, 522 { 523 "XDP pkt read, pkt_data > pkt_meta', good access", 524 .insns = { 525 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 526 offsetof(struct xdp_md, data_meta)), 527 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 528 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 529 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 530 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 531 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 532 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 533 BPF_MOV64_IMM(BPF_REG_0, 0), 534 BPF_EXIT_INSN(), 535 }, 536 .result = ACCEPT, 537 .prog_type = BPF_PROG_TYPE_XDP, 538 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 539 }, 540 { 541 "XDP pkt read, pkt_data > pkt_meta', bad access 1", 542 .insns = { 543 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 544 offsetof(struct xdp_md, data_meta)), 545 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 546 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 547 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 548 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 549 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 550 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 551 BPF_MOV64_IMM(BPF_REG_0, 0), 552 BPF_EXIT_INSN(), 553 }, 554 .errstr = "R1 offset is outside of the packet", 555 .result = REJECT, 556 .prog_type = BPF_PROG_TYPE_XDP, 557 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 558 }, 559 { 560 "XDP pkt read, pkt_data > pkt_meta', bad access 2", 561 .insns = { 562 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 563 offsetof(struct xdp_md, data_meta)), 564 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 565 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 566 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 567 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 568 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 569 BPF_MOV64_IMM(BPF_REG_0, 0), 570 BPF_EXIT_INSN(), 571 }, 572 .errstr = "R1 offset is outside of the packet", 573 .result = REJECT, 574 .prog_type = BPF_PROG_TYPE_XDP, 575 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 576 }, 577 { 578 "XDP pkt read, pkt_meta' < pkt_data, good access", 579 .insns = { 580 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 581 offsetof(struct xdp_md, data_meta)), 582 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 583 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 584 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 585 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 586 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 587 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 588 BPF_MOV64_IMM(BPF_REG_0, 0), 589 BPF_EXIT_INSN(), 590 }, 591 .result = ACCEPT, 592 .prog_type = BPF_PROG_TYPE_XDP, 593 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 594 }, 595 { 596 "XDP pkt read, pkt_meta' < pkt_data, bad access 1", 597 .insns = { 598 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 599 offsetof(struct xdp_md, data_meta)), 600 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 601 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 602 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 603 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 604 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 605 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 606 BPF_MOV64_IMM(BPF_REG_0, 0), 607 BPF_EXIT_INSN(), 608 }, 609 .errstr = "R1 offset is outside of the packet", 610 .result = REJECT, 611 .prog_type = BPF_PROG_TYPE_XDP, 612 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 613 }, 614 { 615 "XDP pkt read, pkt_meta' < pkt_data, bad access 2", 616 .insns = { 617 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 618 offsetof(struct xdp_md, data_meta)), 619 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 620 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 621 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 622 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 623 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 624 BPF_MOV64_IMM(BPF_REG_0, 0), 625 BPF_EXIT_INSN(), 626 }, 627 .errstr = "R1 offset is outside of the packet", 628 .result = REJECT, 629 .prog_type = BPF_PROG_TYPE_XDP, 630 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 631 }, 632 { 633 "XDP pkt read, pkt_data < pkt_meta', good access", 634 .insns = { 635 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 636 offsetof(struct xdp_md, data_meta)), 637 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 638 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 639 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 640 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 641 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 642 BPF_MOV64_IMM(BPF_REG_0, 0), 643 BPF_EXIT_INSN(), 644 }, 645 .result = ACCEPT, 646 .prog_type = BPF_PROG_TYPE_XDP, 647 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 648 }, 649 { 650 "XDP pkt read, pkt_data < pkt_meta', bad access 1", 651 .insns = { 652 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 653 offsetof(struct xdp_md, data_meta)), 654 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 655 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 656 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 657 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 658 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 659 BPF_MOV64_IMM(BPF_REG_0, 0), 660 BPF_EXIT_INSN(), 661 }, 662 .errstr = "R1 offset is outside of the packet", 663 .result = REJECT, 664 .prog_type = BPF_PROG_TYPE_XDP, 665 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 666 }, 667 { 668 "XDP pkt read, pkt_data < pkt_meta', bad access 2", 669 .insns = { 670 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 671 offsetof(struct xdp_md, data_meta)), 672 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 673 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 674 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 675 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 676 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 677 BPF_MOV64_IMM(BPF_REG_0, 0), 678 BPF_EXIT_INSN(), 679 }, 680 .errstr = "R1 offset is outside of the packet", 681 .result = REJECT, 682 .prog_type = BPF_PROG_TYPE_XDP, 683 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 684 }, 685 { 686 "XDP pkt read, pkt_meta' >= pkt_data, good access", 687 .insns = { 688 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 689 offsetof(struct xdp_md, data_meta)), 690 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 691 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 692 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 693 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 694 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 695 BPF_MOV64_IMM(BPF_REG_0, 0), 696 BPF_EXIT_INSN(), 697 }, 698 .result = ACCEPT, 699 .prog_type = BPF_PROG_TYPE_XDP, 700 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 701 }, 702 { 703 "XDP pkt read, pkt_meta' >= pkt_data, bad access 1", 704 .insns = { 705 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 706 offsetof(struct xdp_md, data_meta)), 707 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 708 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 709 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 710 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 711 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 712 BPF_MOV64_IMM(BPF_REG_0, 0), 713 BPF_EXIT_INSN(), 714 }, 715 .errstr = "R1 offset is outside of the packet", 716 .result = REJECT, 717 .prog_type = BPF_PROG_TYPE_XDP, 718 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 719 }, 720 { 721 "XDP pkt read, pkt_meta' >= pkt_data, bad access 2", 722 .insns = { 723 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 724 offsetof(struct xdp_md, data_meta)), 725 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 726 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 728 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 729 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 730 BPF_MOV64_IMM(BPF_REG_0, 0), 731 BPF_EXIT_INSN(), 732 }, 733 .errstr = "R1 offset is outside of the packet", 734 .result = REJECT, 735 .prog_type = BPF_PROG_TYPE_XDP, 736 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 737 }, 738 { 739 "XDP pkt read, pkt_data >= pkt_meta', good access", 740 .insns = { 741 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 742 offsetof(struct xdp_md, data_meta)), 743 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 744 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 745 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 746 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 747 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 748 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 749 BPF_MOV64_IMM(BPF_REG_0, 0), 750 BPF_EXIT_INSN(), 751 }, 752 .result = ACCEPT, 753 .prog_type = BPF_PROG_TYPE_XDP, 754 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 755 }, 756 { 757 "XDP pkt read, pkt_data >= pkt_meta', bad access 1", 758 .insns = { 759 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 760 offsetof(struct xdp_md, data_meta)), 761 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 762 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 763 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 764 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 765 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 766 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 767 BPF_MOV64_IMM(BPF_REG_0, 0), 768 BPF_EXIT_INSN(), 769 }, 770 .errstr = "R1 offset is outside of the packet", 771 .result = REJECT, 772 .prog_type = BPF_PROG_TYPE_XDP, 773 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 774 }, 775 { 776 "XDP pkt read, pkt_data >= pkt_meta', bad access 2", 777 .insns = { 778 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 779 offsetof(struct xdp_md, data_meta)), 780 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 781 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 782 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 783 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 784 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 785 BPF_MOV64_IMM(BPF_REG_0, 0), 786 BPF_EXIT_INSN(), 787 }, 788 .errstr = "R1 offset is outside of the packet", 789 .result = REJECT, 790 .prog_type = BPF_PROG_TYPE_XDP, 791 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 792 }, 793 { 794 "XDP pkt read, pkt_meta' <= pkt_data, good access", 795 .insns = { 796 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 797 offsetof(struct xdp_md, data_meta)), 798 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 799 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 800 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 801 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 802 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 803 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 804 BPF_MOV64_IMM(BPF_REG_0, 0), 805 BPF_EXIT_INSN(), 806 }, 807 .result = ACCEPT, 808 .prog_type = BPF_PROG_TYPE_XDP, 809 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 810 }, 811 { 812 "XDP pkt read, pkt_meta' <= pkt_data, bad access 1", 813 .insns = { 814 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 815 offsetof(struct xdp_md, data_meta)), 816 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 817 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 818 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 819 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 820 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 821 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 822 BPF_MOV64_IMM(BPF_REG_0, 0), 823 BPF_EXIT_INSN(), 824 }, 825 .errstr = "R1 offset is outside of the packet", 826 .result = REJECT, 827 .prog_type = BPF_PROG_TYPE_XDP, 828 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 829 }, 830 { 831 "XDP pkt read, pkt_meta' <= pkt_data, bad access 2", 832 .insns = { 833 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 834 offsetof(struct xdp_md, data_meta)), 835 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 836 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 837 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 838 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 839 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 840 BPF_MOV64_IMM(BPF_REG_0, 0), 841 BPF_EXIT_INSN(), 842 }, 843 .errstr = "R1 offset is outside of the packet", 844 .result = REJECT, 845 .prog_type = BPF_PROG_TYPE_XDP, 846 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 847 }, 848 { 849 "XDP pkt read, pkt_data <= pkt_meta', good access", 850 .insns = { 851 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 852 offsetof(struct xdp_md, data_meta)), 853 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 854 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 855 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 856 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 857 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 858 BPF_MOV64_IMM(BPF_REG_0, 0), 859 BPF_EXIT_INSN(), 860 }, 861 .result = ACCEPT, 862 .prog_type = BPF_PROG_TYPE_XDP, 863 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 864 }, 865 { 866 "XDP pkt read, pkt_data <= pkt_meta', bad access 1", 867 .insns = { 868 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 869 offsetof(struct xdp_md, data_meta)), 870 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 871 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 872 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 873 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 874 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 875 BPF_MOV64_IMM(BPF_REG_0, 0), 876 BPF_EXIT_INSN(), 877 }, 878 .errstr = "R1 offset is outside of the packet", 879 .result = REJECT, 880 .prog_type = BPF_PROG_TYPE_XDP, 881 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 882 }, 883 { 884 "XDP pkt read, pkt_data <= pkt_meta', bad access 2", 885 .insns = { 886 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 887 offsetof(struct xdp_md, data_meta)), 888 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), 889 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 890 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 891 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 892 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 893 BPF_MOV64_IMM(BPF_REG_0, 0), 894 BPF_EXIT_INSN(), 895 }, 896 .errstr = "R1 offset is outside of the packet", 897 .result = REJECT, 898 .prog_type = BPF_PROG_TYPE_XDP, 899 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 900 },