| @@ -35,7 +35,7 @@ · 34 unmodified lines |
| 35 | .prog_type = BPF_PROG_TYPE_XDP, | 35 | .prog_type = BPF_PROG_TYPE_XDP, |
| 36 | }, | 36 | }, |
| 37 | { | 37 | { |
| 38 | "XDP pkt read, pkt_data' > pkt_end, good access", | 38 | "XDP pkt read, pkt_data' > pkt_end, corner case, good access", |
| 39 | .insns = { | 39 | .insns = { |
| 40 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), | 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, | 41 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| @@ -87,6 +87,41 @@ · 45 unmodified lines |
| 87 | .prog_type = BPF_PROG_TYPE_XDP, | 87 | .prog_type = BPF_PROG_TYPE_XDP, |
| 88 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 88 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 89 | }, | 89 | }, |
| | 90 | { |
| | 91 | "XDP pkt read, pkt_data' > pkt_end, corner case +1, 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, 9), |
| | 98 | BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), |
| | 99 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9), |
| | 100 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 101 | BPF_EXIT_INSN(), |
| | 102 | }, |
| | 103 | .result = ACCEPT, |
| | 104 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 105 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 106 | }, |
| | 107 | { |
| | 108 | "XDP pkt read, pkt_data' > pkt_end, corner case -1, bad access", |
| | 109 | .insns = { |
| | 110 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 111 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 112 | offsetof(struct xdp_md, data_end)), |
| | 113 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 114 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 115 | BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), |
| | 116 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 117 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 118 | BPF_EXIT_INSN(), |
| | 119 | }, |
| | 120 | .errstr = "R1 offset is outside of the packet", |
| | 121 | .result = REJECT, |
| | 122 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 123 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 124 | }, |
| 90 | { | 125 | { |
| 91 | "XDP pkt read, pkt_end > pkt_data', good access", | 126 | "XDP pkt read, pkt_end > pkt_data', good access", |
| 92 | .insns = { | 127 | .insns = { |
| @@ -106,16 +141,16 @@ · 13 unmodified lines |
| 106 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 141 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 107 | }, | 142 | }, |
| 108 | { | 143 | { |
| 109 | "XDP pkt read, pkt_end > pkt_data', bad access 1", | 144 | "XDP pkt read, pkt_end > pkt_data', corner case -1, bad access", |
| 110 | .insns = { | 145 | .insns = { |
| 111 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), | 146 | 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, | 147 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| 113 | offsetof(struct xdp_md, data_end)), | 148 | offsetof(struct xdp_md, data_end)), |
| 114 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), | 149 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| 115 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), | 150 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), |
| 116 | BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), | 151 | BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), |
| 117 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), | 152 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| 118 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), | 153 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6), |
| 119 | BPF_MOV64_IMM(BPF_REG_0, 0), | 154 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 120 | BPF_EXIT_INSN(), | 155 | BPF_EXIT_INSN(), |
| 121 | }, | 156 | }, |
| @@ -142,6 +177,42 @@ · 20 unmodified lines |
| 142 | .prog_type = BPF_PROG_TYPE_XDP, | 177 | .prog_type = BPF_PROG_TYPE_XDP, |
| 143 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 178 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 144 | }, | 179 | }, |
| | 180 | { |
| | 181 | "XDP pkt read, pkt_end > pkt_data', corner case, good access", |
| | 182 | .insns = { |
| | 183 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 184 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 185 | offsetof(struct xdp_md, data_end)), |
| | 186 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 187 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 188 | BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), |
| | 189 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 190 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 191 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 192 | BPF_EXIT_INSN(), |
| | 193 | }, |
| | 194 | .result = ACCEPT, |
| | 195 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 196 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 197 | }, |
| | 198 | { |
| | 199 | "XDP pkt read, pkt_end > pkt_data', corner case +1, good access", |
| | 200 | .insns = { |
| | 201 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 202 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 203 | offsetof(struct xdp_md, data_end)), |
| | 204 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 205 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), |
| | 206 | BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), |
| | 207 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 208 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), |
| | 209 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 210 | BPF_EXIT_INSN(), |
| | 211 | }, |
| | 212 | .result = ACCEPT, |
| | 213 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 214 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 215 | }, |
| 145 | { | 216 | { |
| 146 | "XDP pkt read, pkt_data' < pkt_end, good access", | 217 | "XDP pkt read, pkt_data' < pkt_end, good access", |
| 147 | .insns = { | 218 | .insns = { |
| @@ -161,16 +232,16 @@ · 13 unmodified lines |
| 161 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 232 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 162 | }, | 233 | }, |
| 163 | { | 234 | { |
| 164 | "XDP pkt read, pkt_data' < pkt_end, bad access 1", | 235 | "XDP pkt read, pkt_data' < pkt_end, corner case -1, bad access", |
| 165 | .insns = { | 236 | .insns = { |
| 166 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), | 237 | 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, | 238 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| 168 | offsetof(struct xdp_md, data_end)), | 239 | offsetof(struct xdp_md, data_end)), |
| 169 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), | 240 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| 170 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), | 241 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), |
| 171 | BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), | 242 | BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), |
| 172 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), | 243 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| 173 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), | 244 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6), |
| 174 | BPF_MOV64_IMM(BPF_REG_0, 0), | 245 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 175 | BPF_EXIT_INSN(), | 246 | BPF_EXIT_INSN(), |
| 176 | }, | 247 | }, |
| @@ -198,7 +269,43 @@ · 21 unmodified lines |
| 198 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 269 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 199 | }, | 270 | }, |
| 200 | { | 271 | { |
| 201 | "XDP pkt read, pkt_end < pkt_data', good access", | 272 | "XDP pkt read, pkt_data' < pkt_end, corner case, good access", |
| | 273 | .insns = { |
| | 274 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 275 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 276 | offsetof(struct xdp_md, data_end)), |
| | 277 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 278 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 279 | BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), |
| | 280 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 281 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 282 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 283 | BPF_EXIT_INSN(), |
| | 284 | }, |
| | 285 | .result = ACCEPT, |
| | 286 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 287 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 288 | }, |
| | 289 | { |
| | 290 | "XDP pkt read, pkt_data' < pkt_end, corner case +1, good access", |
| | 291 | .insns = { |
| | 292 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 293 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 294 | offsetof(struct xdp_md, data_end)), |
| | 295 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 296 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), |
| | 297 | BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), |
| | 298 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 299 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), |
| | 300 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 301 | BPF_EXIT_INSN(), |
| | 302 | }, |
| | 303 | .result = ACCEPT, |
| | 304 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 305 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 306 | }, |
| | 307 | { |
| | 308 | "XDP pkt read, pkt_end < pkt_data', corner case, good access", |
| 202 | .insns = { | 309 | .insns = { |
| 203 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), | 310 | 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, | 311 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| @@ -250,6 +357,41 @@ · 45 unmodified lines |
| 250 | .prog_type = BPF_PROG_TYPE_XDP, | 357 | .prog_type = BPF_PROG_TYPE_XDP, |
| 251 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 358 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 252 | }, | 359 | }, |
| | 360 | { |
| | 361 | "XDP pkt read, pkt_end < pkt_data', corner case +1, good access", |
| | 362 | .insns = { |
| | 363 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 364 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 365 | offsetof(struct xdp_md, data_end)), |
| | 366 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 367 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9), |
| | 368 | BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), |
| | 369 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9), |
| | 370 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 371 | BPF_EXIT_INSN(), |
| | 372 | }, |
| | 373 | .result = ACCEPT, |
| | 374 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 375 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 376 | }, |
| | 377 | { |
| | 378 | "XDP pkt read, pkt_end < pkt_data', corner case -1, bad access", |
| | 379 | .insns = { |
| | 380 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 381 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 382 | offsetof(struct xdp_md, data_end)), |
| | 383 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 384 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 385 | BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), |
| | 386 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 387 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 388 | BPF_EXIT_INSN(), |
| | 389 | }, |
| | 390 | .errstr = "R1 offset is outside of the packet", |
| | 391 | .result = REJECT, |
| | 392 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 393 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 394 | }, |
| 253 | { | 395 | { |
| 254 | "XDP pkt read, pkt_data' >= pkt_end, good access", | 396 | "XDP pkt read, pkt_data' >= pkt_end, good access", |
| 255 | .insns = { | 397 | .insns = { |
| @@ -268,15 +410,15 @@ · 12 unmodified lines |
| 268 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 410 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 269 | }, | 411 | }, |
| 270 | { | 412 | { |
| 271 | "XDP pkt read, pkt_data' >= pkt_end, bad access 1", | 413 | "XDP pkt read, pkt_data' >= pkt_end, corner case -1, bad access", |
| 272 | .insns = { | 414 | .insns = { |
| 273 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), | 415 | 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, | 416 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| 275 | offsetof(struct xdp_md, data_end)), | 417 | offsetof(struct xdp_md, data_end)), |
| 276 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), | 418 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| 277 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), | 419 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), |
| 278 | BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), | 420 | 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), | 421 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6), |
| 280 | BPF_MOV64_IMM(BPF_REG_0, 0), | 422 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 281 | BPF_EXIT_INSN(), | 423 | BPF_EXIT_INSN(), |
| 282 | }, | 424 | }, |
| @@ -304,7 +446,41 @@ · 21 unmodified lines |
| 304 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 446 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 305 | }, | 447 | }, |
| 306 | { | 448 | { |
| 307 | "XDP pkt read, pkt_end >= pkt_data', good access", | 449 | "XDP pkt read, pkt_data' >= pkt_end, corner case, good access", |
| | 450 | .insns = { |
| | 451 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 452 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 453 | offsetof(struct xdp_md, data_end)), |
| | 454 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 455 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 456 | BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), |
| | 457 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 458 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 459 | BPF_EXIT_INSN(), |
| | 460 | }, |
| | 461 | .result = ACCEPT, |
| | 462 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 463 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 464 | }, |
| | 465 | { |
| | 466 | "XDP pkt read, pkt_data' >= pkt_end, corner case +1, good access", |
| | 467 | .insns = { |
| | 468 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 469 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 470 | offsetof(struct xdp_md, data_end)), |
| | 471 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 472 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), |
| | 473 | BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), |
| | 474 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), |
| | 475 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 476 | BPF_EXIT_INSN(), |
| | 477 | }, |
| | 478 | .result = ACCEPT, |
| | 479 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 480 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 481 | }, |
| | 482 | { |
| | 483 | "XDP pkt read, pkt_end >= pkt_data', corner case, good access", |
| 308 | .insns = { | 484 | .insns = { |
| 309 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), | 485 | 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, | 486 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| @@ -359,7 +535,44 @@ · 48 unmodified lines |
| 359 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 535 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 360 | }, | 536 | }, |
| 361 | { | 537 | { |
| 362 | "XDP pkt read, pkt_data' <= pkt_end, good access", | 538 | "XDP pkt read, pkt_end >= pkt_data', corner case +1, good access", |
| | 539 | .insns = { |
| | 540 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 541 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 542 | offsetof(struct xdp_md, data_end)), |
| | 543 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 544 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9), |
| | 545 | BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), |
| | 546 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 547 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9), |
| | 548 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 549 | BPF_EXIT_INSN(), |
| | 550 | }, |
| | 551 | .result = ACCEPT, |
| | 552 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 553 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 554 | }, |
| | 555 | { |
| | 556 | "XDP pkt read, pkt_end >= pkt_data', corner case -1, bad access", |
| | 557 | .insns = { |
| | 558 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 559 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 560 | offsetof(struct xdp_md, data_end)), |
| | 561 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 562 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 563 | BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), |
| | 564 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 565 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 566 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 567 | BPF_EXIT_INSN(), |
| | 568 | }, |
| | 569 | .errstr = "R1 offset is outside of the packet", |
| | 570 | .result = REJECT, |
| | 571 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 572 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 573 | }, |
| | 574 | { |
| | 575 | "XDP pkt read, pkt_data' <= pkt_end, corner case, good access", |
| 363 | .insns = { | 576 | .insns = { |
| 364 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), | 577 | 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, | 578 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| @@ -413,6 +626,43 @@ · 47 unmodified lines |
| 413 | .prog_type = BPF_PROG_TYPE_XDP, | 626 | .prog_type = BPF_PROG_TYPE_XDP, |
| 414 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 627 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 415 | }, | 628 | }, |
| | 629 | { |
| | 630 | "XDP pkt read, pkt_data' <= pkt_end, corner case +1, good access", |
| | 631 | .insns = { |
| | 632 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 633 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 634 | offsetof(struct xdp_md, data_end)), |
| | 635 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 636 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9), |
| | 637 | BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), |
| | 638 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 639 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9), |
| | 640 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 641 | BPF_EXIT_INSN(), |
| | 642 | }, |
| | 643 | .result = ACCEPT, |
| | 644 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 645 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 646 | }, |
| | 647 | { |
| | 648 | "XDP pkt read, pkt_data' <= pkt_end, corner case -1, bad access", |
| | 649 | .insns = { |
| | 650 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 651 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 652 | offsetof(struct xdp_md, data_end)), |
| | 653 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 654 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 655 | BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), |
| | 656 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 657 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 658 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 659 | BPF_EXIT_INSN(), |
| | 660 | }, |
| | 661 | .errstr = "R1 offset is outside of the packet", |
| | 662 | .result = REJECT, |
| | 663 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 664 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 665 | }, |
| 416 | { | 666 | { |
| 417 | "XDP pkt read, pkt_end <= pkt_data', good access", | 667 | "XDP pkt read, pkt_end <= pkt_data', good access", |
| 418 | .insns = { | 668 | .insns = { |
| @@ -431,15 +681,15 @@ · 12 unmodified lines |
| 431 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 681 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 432 | }, | 682 | }, |
| 433 | { | 683 | { |
| 434 | "XDP pkt read, pkt_end <= pkt_data', bad access 1", | 684 | "XDP pkt read, pkt_end <= pkt_data', corner case -1, bad access", |
| 435 | .insns = { | 685 | .insns = { |
| 436 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), | 686 | 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, | 687 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| 438 | offsetof(struct xdp_md, data_end)), | 688 | offsetof(struct xdp_md, data_end)), |
| 439 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), | 689 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| 440 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), | 690 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), |
| 441 | BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), | 691 | 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), | 692 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6), |
| 443 | BPF_MOV64_IMM(BPF_REG_0, 0), | 693 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 444 | BPF_EXIT_INSN(), | 694 | BPF_EXIT_INSN(), |
| 445 | }, | 695 | }, |
| @@ -467,7 +717,41 @@ · 21 unmodified lines |
| 467 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 717 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 468 | }, | 718 | }, |
| 469 | { | 719 | { |
| 470 | "XDP pkt read, pkt_meta' > pkt_data, good access", | 720 | "XDP pkt read, pkt_end <= pkt_data', corner case, good access", |
| | 721 | .insns = { |
| | 722 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 723 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 724 | offsetof(struct xdp_md, data_end)), |
| | 725 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 726 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 727 | BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), |
| | 728 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 729 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 730 | BPF_EXIT_INSN(), |
| | 731 | }, |
| | 732 | .result = ACCEPT, |
| | 733 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 734 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 735 | }, |
| | 736 | { |
| | 737 | "XDP pkt read, pkt_end <= pkt_data', corner case +1, good access", |
| | 738 | .insns = { |
| | 739 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 740 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| | 741 | offsetof(struct xdp_md, data_end)), |
| | 742 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 743 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), |
| | 744 | BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), |
| | 745 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), |
| | 746 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 747 | BPF_EXIT_INSN(), |
| | 748 | }, |
| | 749 | .result = ACCEPT, |
| | 750 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 751 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 752 | }, |
| | 753 | { |
| | 754 | "XDP pkt read, pkt_meta' > pkt_data, corner case, good access", |
| 471 | .insns = { | 755 | .insns = { |
| 472 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 756 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 473 | offsetof(struct xdp_md, data_meta)), | 757 | offsetof(struct xdp_md, data_meta)), |
| @@ -519,6 +803,41 @@ · 45 unmodified lines |
| 519 | .prog_type = BPF_PROG_TYPE_XDP, | 803 | .prog_type = BPF_PROG_TYPE_XDP, |
| 520 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 804 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 521 | }, | 805 | }, |
| | 806 | { |
| | 807 | "XDP pkt read, pkt_meta' > pkt_data, corner case +1, good access", |
| | 808 | .insns = { |
| | 809 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 810 | offsetof(struct xdp_md, data_meta)), |
| | 811 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 812 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 813 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9), |
| | 814 | BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), |
| | 815 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9), |
| | 816 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 817 | BPF_EXIT_INSN(), |
| | 818 | }, |
| | 819 | .result = ACCEPT, |
| | 820 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 821 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 822 | }, |
| | 823 | { |
| | 824 | "XDP pkt read, pkt_meta' > pkt_data, corner case -1, bad access", |
| | 825 | .insns = { |
| | 826 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 827 | offsetof(struct xdp_md, data_meta)), |
| | 828 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 829 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 830 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 831 | BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), |
| | 832 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 833 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 834 | BPF_EXIT_INSN(), |
| | 835 | }, |
| | 836 | .errstr = "R1 offset is outside of the packet", |
| | 837 | .result = REJECT, |
| | 838 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 839 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 840 | }, |
| 522 | { | 841 | { |
| 523 | "XDP pkt read, pkt_data > pkt_meta', good access", | 842 | "XDP pkt read, pkt_data > pkt_meta', good access", |
| 524 | .insns = { | 843 | .insns = { |
| @@ -538,16 +857,16 @@ · 13 unmodified lines |
| 538 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 857 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 539 | }, | 858 | }, |
| 540 | { | 859 | { |
| 541 | "XDP pkt read, pkt_data > pkt_meta', bad access 1", | 860 | "XDP pkt read, pkt_data > pkt_meta', corner case -1, bad access", |
| 542 | .insns = { | 861 | .insns = { |
| 543 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 862 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 544 | offsetof(struct xdp_md, data_meta)), | 863 | offsetof(struct xdp_md, data_meta)), |
| 545 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), | 864 | 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), | 865 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| 547 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), | 866 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), |
| 548 | BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), | 867 | BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), |
| 549 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), | 868 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| 550 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), | 869 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6), |
| 551 | BPF_MOV64_IMM(BPF_REG_0, 0), | 870 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 552 | BPF_EXIT_INSN(), | 871 | BPF_EXIT_INSN(), |
| 553 | }, | 872 | }, |
| @@ -574,6 +893,42 @@ · 20 unmodified lines |
| 574 | .prog_type = BPF_PROG_TYPE_XDP, | 893 | .prog_type = BPF_PROG_TYPE_XDP, |
| 575 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 894 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 576 | }, | 895 | }, |
| | 896 | { |
| | 897 | "XDP pkt read, pkt_data > pkt_meta', corner case, good access", |
| | 898 | .insns = { |
| | 899 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 900 | offsetof(struct xdp_md, data_meta)), |
| | 901 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 902 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 903 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 904 | BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), |
| | 905 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 906 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 907 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 908 | BPF_EXIT_INSN(), |
| | 909 | }, |
| | 910 | .result = ACCEPT, |
| | 911 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 912 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 913 | }, |
| | 914 | { |
| | 915 | "XDP pkt read, pkt_data > pkt_meta', corner case +1, good access", |
| | 916 | .insns = { |
| | 917 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 918 | offsetof(struct xdp_md, data_meta)), |
| | 919 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 920 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 921 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), |
| | 922 | BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), |
| | 923 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 924 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), |
| | 925 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 926 | BPF_EXIT_INSN(), |
| | 927 | }, |
| | 928 | .result = ACCEPT, |
| | 929 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 930 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 931 | }, |
| 577 | { | 932 | { |
| 578 | "XDP pkt read, pkt_meta' < pkt_data, good access", | 933 | "XDP pkt read, pkt_meta' < pkt_data, good access", |
| 579 | .insns = { | 934 | .insns = { |
| @@ -593,16 +948,16 @@ · 13 unmodified lines |
| 593 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 948 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 594 | }, | 949 | }, |
| 595 | { | 950 | { |
| 596 | "XDP pkt read, pkt_meta' < pkt_data, bad access 1", | 951 | "XDP pkt read, pkt_meta' < pkt_data, corner case -1, bad access", |
| 597 | .insns = { | 952 | .insns = { |
| 598 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 953 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 599 | offsetof(struct xdp_md, data_meta)), | 954 | offsetof(struct xdp_md, data_meta)), |
| 600 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), | 955 | 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), | 956 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| 602 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), | 957 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), |
| 603 | BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), | 958 | BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), |
| 604 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), | 959 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| 605 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), | 960 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6), |
| 606 | BPF_MOV64_IMM(BPF_REG_0, 0), | 961 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 607 | BPF_EXIT_INSN(), | 962 | BPF_EXIT_INSN(), |
| 608 | }, | 963 | }, |
| @@ -630,7 +985,43 @@ · 21 unmodified lines |
| 630 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 985 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 631 | }, | 986 | }, |
| 632 | { | 987 | { |
| 633 | "XDP pkt read, pkt_data < pkt_meta', good access", | 988 | "XDP pkt read, pkt_meta' < pkt_data, corner case, good access", |
| | 989 | .insns = { |
| | 990 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 991 | offsetof(struct xdp_md, data_meta)), |
| | 992 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 993 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 994 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 995 | BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), |
| | 996 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 997 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 998 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 999 | BPF_EXIT_INSN(), |
| | 1000 | }, |
| | 1001 | .result = ACCEPT, |
| | 1002 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1003 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1004 | }, |
| | 1005 | { |
| | 1006 | "XDP pkt read, pkt_meta' < pkt_data, corner case +1, good access", |
| | 1007 | .insns = { |
| | 1008 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1009 | offsetof(struct xdp_md, data_meta)), |
| | 1010 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1011 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1012 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), |
| | 1013 | BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), |
| | 1014 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 1015 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), |
| | 1016 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1017 | BPF_EXIT_INSN(), |
| | 1018 | }, |
| | 1019 | .result = ACCEPT, |
| | 1020 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1021 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1022 | }, |
| | 1023 | { |
| | 1024 | "XDP pkt read, pkt_data < pkt_meta', corner case, good access", |
| 634 | .insns = { | 1025 | .insns = { |
| 635 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 1026 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 636 | offsetof(struct xdp_md, data_meta)), | 1027 | offsetof(struct xdp_md, data_meta)), |
| @@ -682,6 +1073,41 @@ · 45 unmodified lines |
| 682 | .prog_type = BPF_PROG_TYPE_XDP, | 1073 | .prog_type = BPF_PROG_TYPE_XDP, |
| 683 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 1074 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 684 | }, | 1075 | }, |
| | 1076 | { |
| | 1077 | "XDP pkt read, pkt_data < pkt_meta', corner case +1, good access", |
| | 1078 | .insns = { |
| | 1079 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1080 | offsetof(struct xdp_md, data_meta)), |
| | 1081 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1082 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1083 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9), |
| | 1084 | BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), |
| | 1085 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9), |
| | 1086 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1087 | BPF_EXIT_INSN(), |
| | 1088 | }, |
| | 1089 | .result = ACCEPT, |
| | 1090 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1091 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1092 | }, |
| | 1093 | { |
| | 1094 | "XDP pkt read, pkt_data < pkt_meta', corner case -1, bad access", |
| | 1095 | .insns = { |
| | 1096 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1097 | offsetof(struct xdp_md, data_meta)), |
| | 1098 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1099 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1100 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 1101 | BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), |
| | 1102 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 1103 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1104 | BPF_EXIT_INSN(), |
| | 1105 | }, |
| | 1106 | .errstr = "R1 offset is outside of the packet", |
| | 1107 | .result = REJECT, |
| | 1108 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1109 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1110 | }, |
| 685 | { | 1111 | { |
| 686 | "XDP pkt read, pkt_meta' >= pkt_data, good access", | 1112 | "XDP pkt read, pkt_meta' >= pkt_data, good access", |
| 687 | .insns = { | 1113 | .insns = { |
| @@ -700,15 +1126,15 @@ · 12 unmodified lines |
| 700 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 1126 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 701 | }, | 1127 | }, |
| 702 | { | 1128 | { |
| 703 | "XDP pkt read, pkt_meta' >= pkt_data, bad access 1", | 1129 | "XDP pkt read, pkt_meta' >= pkt_data, corner case -1, bad access", |
| 704 | .insns = { | 1130 | .insns = { |
| 705 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 1131 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 706 | offsetof(struct xdp_md, data_meta)), | 1132 | offsetof(struct xdp_md, data_meta)), |
| 707 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), | 1133 | 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), | 1134 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| 709 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), | 1135 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), |
| 710 | BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), | 1136 | 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), | 1137 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6), |
| 712 | BPF_MOV64_IMM(BPF_REG_0, 0), | 1138 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 713 | BPF_EXIT_INSN(), | 1139 | BPF_EXIT_INSN(), |
| 714 | }, | 1140 | }, |
| @@ -736,7 +1162,41 @@ · 21 unmodified lines |
| 736 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 1162 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 737 | }, | 1163 | }, |
| 738 | { | 1164 | { |
| 739 | "XDP pkt read, pkt_data >= pkt_meta', good access", | 1165 | "XDP pkt read, pkt_meta' >= pkt_data, corner case, good access", |
| | 1166 | .insns = { |
| | 1167 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1168 | offsetof(struct xdp_md, data_meta)), |
| | 1169 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1170 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1171 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 1172 | BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), |
| | 1173 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 1174 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1175 | BPF_EXIT_INSN(), |
| | 1176 | }, |
| | 1177 | .result = ACCEPT, |
| | 1178 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1179 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1180 | }, |
| | 1181 | { |
| | 1182 | "XDP pkt read, pkt_meta' >= pkt_data, corner case +1, good access", |
| | 1183 | .insns = { |
| | 1184 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1185 | offsetof(struct xdp_md, data_meta)), |
| | 1186 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1187 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1188 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), |
| | 1189 | BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), |
| | 1190 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), |
| | 1191 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1192 | BPF_EXIT_INSN(), |
| | 1193 | }, |
| | 1194 | .result = ACCEPT, |
| | 1195 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1196 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1197 | }, |
| | 1198 | { |
| | 1199 | "XDP pkt read, pkt_data >= pkt_meta', corner case, good access", |
| 740 | .insns = { | 1200 | .insns = { |
| 741 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 1201 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 742 | offsetof(struct xdp_md, data_meta)), | 1202 | offsetof(struct xdp_md, data_meta)), |
| @@ -791,7 +1251,44 @@ · 48 unmodified lines |
| 791 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 1251 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 792 | }, | 1252 | }, |
| 793 | { | 1253 | { |
| 794 | "XDP pkt read, pkt_meta' <= pkt_data, good access", | 1254 | "XDP pkt read, pkt_data >= pkt_meta', corner case +1, good access", |
| | 1255 | .insns = { |
| | 1256 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1257 | offsetof(struct xdp_md, data_meta)), |
| | 1258 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1259 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1260 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9), |
| | 1261 | BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), |
| | 1262 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 1263 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9), |
| | 1264 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1265 | BPF_EXIT_INSN(), |
| | 1266 | }, |
| | 1267 | .result = ACCEPT, |
| | 1268 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1269 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1270 | }, |
| | 1271 | { |
| | 1272 | "XDP pkt read, pkt_data >= pkt_meta', corner case -1, bad access", |
| | 1273 | .insns = { |
| | 1274 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1275 | offsetof(struct xdp_md, data_meta)), |
| | 1276 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1277 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1278 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 1279 | BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), |
| | 1280 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 1281 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 1282 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1283 | BPF_EXIT_INSN(), |
| | 1284 | }, |
| | 1285 | .errstr = "R1 offset is outside of the packet", |
| | 1286 | .result = REJECT, |
| | 1287 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1288 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1289 | }, |
| | 1290 | { |
| | 1291 | "XDP pkt read, pkt_meta' <= pkt_data, corner case, good access", |
| 795 | .insns = { | 1292 | .insns = { |
| 796 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 1293 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 797 | offsetof(struct xdp_md, data_meta)), | 1294 | offsetof(struct xdp_md, data_meta)), |
| @@ -845,6 +1342,43 @@ · 47 unmodified lines |
| 845 | .prog_type = BPF_PROG_TYPE_XDP, | 1342 | .prog_type = BPF_PROG_TYPE_XDP, |
| 846 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 1343 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 847 | }, | 1344 | }, |
| | 1345 | { |
| | 1346 | "XDP pkt read, pkt_meta' <= pkt_data, corner case +1, good access", |
| | 1347 | .insns = { |
| | 1348 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1349 | offsetof(struct xdp_md, data_meta)), |
| | 1350 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1351 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1352 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9), |
| | 1353 | BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), |
| | 1354 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 1355 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9), |
| | 1356 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1357 | BPF_EXIT_INSN(), |
| | 1358 | }, |
| | 1359 | .result = ACCEPT, |
| | 1360 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1361 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1362 | }, |
| | 1363 | { |
| | 1364 | "XDP pkt read, pkt_meta' <= pkt_data, corner case -1, bad access", |
| | 1365 | .insns = { |
| | 1366 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1367 | offsetof(struct xdp_md, data_meta)), |
| | 1368 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1369 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1370 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 1371 | BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), |
| | 1372 | BPF_JMP_IMM(BPF_JA, 0, 0, 1), |
| | 1373 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 1374 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1375 | BPF_EXIT_INSN(), |
| | 1376 | }, |
| | 1377 | .errstr = "R1 offset is outside of the packet", |
| | 1378 | .result = REJECT, |
| | 1379 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1380 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1381 | }, |
| 848 | { | 1382 | { |
| 849 | "XDP pkt read, pkt_data <= pkt_meta', good access", | 1383 | "XDP pkt read, pkt_data <= pkt_meta', good access", |
| 850 | .insns = { | 1384 | .insns = { |
| @@ -863,15 +1397,15 @@ · 12 unmodified lines |
| 863 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 1397 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 864 | }, | 1398 | }, |
| 865 | { | 1399 | { |
| 866 | "XDP pkt read, pkt_data <= pkt_meta', bad access 1", | 1400 | "XDP pkt read, pkt_data <= pkt_meta', corner case -1, bad access", |
| 867 | .insns = { | 1401 | .insns = { |
| 868 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 1402 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 869 | offsetof(struct xdp_md, data_meta)), | 1403 | offsetof(struct xdp_md, data_meta)), |
| 870 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), | 1404 | 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), | 1405 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| 872 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), | 1406 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), |
| 873 | BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), | 1407 | 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), | 1408 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6), |
| 875 | BPF_MOV64_IMM(BPF_REG_0, 0), | 1409 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 876 | BPF_EXIT_INSN(), | 1410 | BPF_EXIT_INSN(), |
| 877 | }, | 1411 | }, |
| @@ -898,3 +1432,37 @@ · 20 unmodified lines |
| 898 | .prog_type = BPF_PROG_TYPE_XDP, | 1432 | .prog_type = BPF_PROG_TYPE_XDP, |
| 899 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 1433 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 900 | }, | 1434 | }, |
| | 1435 | { |
| | 1436 | "XDP pkt read, pkt_data <= pkt_meta', corner case, good access", |
| | 1437 | .insns = { |
| | 1438 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1439 | offsetof(struct xdp_md, data_meta)), |
| | 1440 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1441 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1442 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), |
| | 1443 | BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), |
| | 1444 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7), |
| | 1445 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1446 | BPF_EXIT_INSN(), |
| | 1447 | }, |
| | 1448 | .result = ACCEPT, |
| | 1449 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1450 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1451 | }, |
| | 1452 | { |
| | 1453 | "XDP pkt read, pkt_data <= pkt_meta', corner case +1, good access", |
| | 1454 | .insns = { |
| | 1455 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| | 1456 | offsetof(struct xdp_md, data_meta)), |
| | 1457 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)), |
| | 1458 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), |
| | 1459 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), |
| | 1460 | BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), |
| | 1461 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), |
| | 1462 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| | 1463 | BPF_EXIT_INSN(), |
| | 1464 | }, |
| | 1465 | .result = ACCEPT, |
| | 1466 | .prog_type = BPF_PROG_TYPE_XDP, |
| | 1467 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| | 1468 | }, |