Back to home page

OSCL-LXR

 
 

    


0001 {
0002     "XDP pkt read, pkt_end mangling, bad access 1",
0003     .insns = {
0004     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0005     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0006             offsetof(struct xdp_md, data_end)),
0007     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0008     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0009     BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8),
0010     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0011     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0012     BPF_MOV64_IMM(BPF_REG_0, 0),
0013     BPF_EXIT_INSN(),
0014     },
0015     .errstr = "R3 pointer arithmetic on pkt_end",
0016     .result = REJECT,
0017     .prog_type = BPF_PROG_TYPE_XDP,
0018 },
0019 {
0020     "XDP pkt read, pkt_end mangling, bad access 2",
0021     .insns = {
0022     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0023     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0024             offsetof(struct xdp_md, data_end)),
0025     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0026     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0027     BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8),
0028     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0029     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0030     BPF_MOV64_IMM(BPF_REG_0, 0),
0031     BPF_EXIT_INSN(),
0032     },
0033     .errstr = "R3 pointer arithmetic on pkt_end",
0034     .result = REJECT,
0035     .prog_type = BPF_PROG_TYPE_XDP,
0036 },
0037 {
0038     "XDP pkt read, pkt_data' > pkt_end, corner case, good access",
0039     .insns = {
0040     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0041     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0042             offsetof(struct xdp_md, data_end)),
0043     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0044     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0045     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0046     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0047     BPF_MOV64_IMM(BPF_REG_0, 0),
0048     BPF_EXIT_INSN(),
0049     },
0050     .result = ACCEPT,
0051     .prog_type = BPF_PROG_TYPE_XDP,
0052     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0053 },
0054 {
0055     "XDP pkt read, pkt_data' > pkt_end, bad access 1",
0056     .insns = {
0057     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0058     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0059             offsetof(struct xdp_md, data_end)),
0060     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0061     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0062     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0063     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
0064     BPF_MOV64_IMM(BPF_REG_0, 0),
0065     BPF_EXIT_INSN(),
0066     },
0067     .errstr = "R1 offset is outside of the packet",
0068     .result = REJECT,
0069     .prog_type = BPF_PROG_TYPE_XDP,
0070     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0071 },
0072 {
0073     "XDP pkt read, pkt_data' > pkt_end, bad access 2",
0074     .insns = {
0075     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0076     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0077             offsetof(struct xdp_md, data_end)),
0078     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0079     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0080     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0),
0081     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0082     BPF_MOV64_IMM(BPF_REG_0, 0),
0083     BPF_EXIT_INSN(),
0084     },
0085     .errstr = "R1 offset is outside of the packet",
0086     .result = REJECT,
0087     .prog_type = BPF_PROG_TYPE_XDP,
0088     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0089 },
0090 {
0091     "XDP pkt read, pkt_data' > pkt_end, corner case +1, good access",
0092     .insns = {
0093     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0094     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0095             offsetof(struct xdp_md, data_end)),
0096     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0097     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9),
0098     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0099     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9),
0100     BPF_MOV64_IMM(BPF_REG_0, 0),
0101     BPF_EXIT_INSN(),
0102     },
0103     .result = ACCEPT,
0104     .prog_type = BPF_PROG_TYPE_XDP,
0105     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0106 },
0107 {
0108     "XDP pkt read, pkt_data' > pkt_end, corner case -1, bad access",
0109     .insns = {
0110     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0111     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0112             offsetof(struct xdp_md, data_end)),
0113     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0114     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0115     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0116     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0117     BPF_MOV64_IMM(BPF_REG_0, 0),
0118     BPF_EXIT_INSN(),
0119     },
0120     .errstr = "R1 offset is outside of the packet",
0121     .result = REJECT,
0122     .prog_type = BPF_PROG_TYPE_XDP,
0123     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0124 },
0125 {
0126     "XDP pkt read, pkt_end > pkt_data', good access",
0127     .insns = {
0128     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0129     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0130             offsetof(struct xdp_md, data_end)),
0131     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0132     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0133     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0134     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0135     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
0136     BPF_MOV64_IMM(BPF_REG_0, 0),
0137     BPF_EXIT_INSN(),
0138     },
0139     .result = ACCEPT,
0140     .prog_type = BPF_PROG_TYPE_XDP,
0141     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0142 },
0143 {
0144     "XDP pkt read, pkt_end > pkt_data', corner case -1, bad access",
0145     .insns = {
0146     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0147     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0148             offsetof(struct xdp_md, data_end)),
0149     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0150     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
0151     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0152     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0153     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6),
0154     BPF_MOV64_IMM(BPF_REG_0, 0),
0155     BPF_EXIT_INSN(),
0156     },
0157     .errstr = "R1 offset is outside of the packet",
0158     .result = REJECT,
0159     .prog_type = BPF_PROG_TYPE_XDP,
0160     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0161 },
0162 {
0163     "XDP pkt read, pkt_end > pkt_data', bad access 2",
0164     .insns = {
0165     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0166     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0167             offsetof(struct xdp_md, data_end)),
0168     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0169     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0170     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0171     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0172     BPF_MOV64_IMM(BPF_REG_0, 0),
0173     BPF_EXIT_INSN(),
0174     },
0175     .errstr = "R1 offset is outside of the packet",
0176     .result = REJECT,
0177     .prog_type = BPF_PROG_TYPE_XDP,
0178     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0179 },
0180 {
0181     "XDP pkt read, pkt_end > pkt_data', corner case, good access",
0182     .insns = {
0183     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0184     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0185             offsetof(struct xdp_md, data_end)),
0186     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0187     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0188     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0189     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0190     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0191     BPF_MOV64_IMM(BPF_REG_0, 0),
0192     BPF_EXIT_INSN(),
0193     },
0194     .result = ACCEPT,
0195     .prog_type = BPF_PROG_TYPE_XDP,
0196     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0197 },
0198 {
0199     "XDP pkt read, pkt_end > pkt_data', corner case +1, good access",
0200     .insns = {
0201     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0202     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0203             offsetof(struct xdp_md, data_end)),
0204     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0205     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0206     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0207     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0208     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0209     BPF_MOV64_IMM(BPF_REG_0, 0),
0210     BPF_EXIT_INSN(),
0211     },
0212     .result = ACCEPT,
0213     .prog_type = BPF_PROG_TYPE_XDP,
0214     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0215 },
0216 {
0217     "XDP pkt read, pkt_data' < pkt_end, good access",
0218     .insns = {
0219     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0220     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0221             offsetof(struct xdp_md, data_end)),
0222     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0223     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0224     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0225     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0226     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
0227     BPF_MOV64_IMM(BPF_REG_0, 0),
0228     BPF_EXIT_INSN(),
0229     },
0230     .result = ACCEPT,
0231     .prog_type = BPF_PROG_TYPE_XDP,
0232     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0233 },
0234 {
0235     "XDP pkt read, pkt_data' < pkt_end, corner case -1, bad access",
0236     .insns = {
0237     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0238     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0239             offsetof(struct xdp_md, data_end)),
0240     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0241     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
0242     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0243     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0244     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6),
0245     BPF_MOV64_IMM(BPF_REG_0, 0),
0246     BPF_EXIT_INSN(),
0247     },
0248     .errstr = "R1 offset is outside of the packet",
0249     .result = REJECT,
0250     .prog_type = BPF_PROG_TYPE_XDP,
0251     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0252 },
0253 {
0254     "XDP pkt read, pkt_data' < pkt_end, bad access 2",
0255     .insns = {
0256     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0257     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0258             offsetof(struct xdp_md, data_end)),
0259     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0260     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0261     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0262     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0263     BPF_MOV64_IMM(BPF_REG_0, 0),
0264     BPF_EXIT_INSN(),
0265     },
0266     .errstr = "R1 offset is outside of the packet",
0267     .result = REJECT,
0268     .prog_type = BPF_PROG_TYPE_XDP,
0269     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0270 },
0271 {
0272     "XDP pkt read, pkt_data' < pkt_end, corner case, good access",
0273     .insns = {
0274     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0275     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0276             offsetof(struct xdp_md, data_end)),
0277     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0278     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0279     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0280     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0281     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0282     BPF_MOV64_IMM(BPF_REG_0, 0),
0283     BPF_EXIT_INSN(),
0284     },
0285     .result = ACCEPT,
0286     .prog_type = BPF_PROG_TYPE_XDP,
0287     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0288 },
0289 {
0290     "XDP pkt read, pkt_data' < pkt_end, corner case +1, good access",
0291     .insns = {
0292     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0293     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0294             offsetof(struct xdp_md, data_end)),
0295     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0296     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0297     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0298     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0299     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0300     BPF_MOV64_IMM(BPF_REG_0, 0),
0301     BPF_EXIT_INSN(),
0302     },
0303     .result = ACCEPT,
0304     .prog_type = BPF_PROG_TYPE_XDP,
0305     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0306 },
0307 {
0308     "XDP pkt read, pkt_end < pkt_data', corner case, good access",
0309     .insns = {
0310     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0311     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0312             offsetof(struct xdp_md, data_end)),
0313     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0314     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0315     BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
0316     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0317     BPF_MOV64_IMM(BPF_REG_0, 0),
0318     BPF_EXIT_INSN(),
0319     },
0320     .result = ACCEPT,
0321     .prog_type = BPF_PROG_TYPE_XDP,
0322     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0323 },
0324 {
0325     "XDP pkt read, pkt_end < pkt_data', bad access 1",
0326     .insns = {
0327     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0328     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0329             offsetof(struct xdp_md, data_end)),
0330     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0331     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0332     BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
0333     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
0334     BPF_MOV64_IMM(BPF_REG_0, 0),
0335     BPF_EXIT_INSN(),
0336     },
0337     .errstr = "R1 offset is outside of the packet",
0338     .result = REJECT,
0339     .prog_type = BPF_PROG_TYPE_XDP,
0340     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0341 },
0342 {
0343     "XDP pkt read, pkt_end < pkt_data', bad access 2",
0344     .insns = {
0345     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0346     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0347             offsetof(struct xdp_md, data_end)),
0348     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0349     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0350     BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0),
0351     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0352     BPF_MOV64_IMM(BPF_REG_0, 0),
0353     BPF_EXIT_INSN(),
0354     },
0355     .errstr = "R1 offset is outside of the packet",
0356     .result = REJECT,
0357     .prog_type = BPF_PROG_TYPE_XDP,
0358     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0359 },
0360 {
0361     "XDP pkt read, pkt_end < pkt_data', corner case +1, good access",
0362     .insns = {
0363     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0364     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0365             offsetof(struct xdp_md, data_end)),
0366     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0367     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9),
0368     BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
0369     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9),
0370     BPF_MOV64_IMM(BPF_REG_0, 0),
0371     BPF_EXIT_INSN(),
0372     },
0373     .result = ACCEPT,
0374     .prog_type = BPF_PROG_TYPE_XDP,
0375     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0376 },
0377 {
0378     "XDP pkt read, pkt_end < pkt_data', corner case -1, bad access",
0379     .insns = {
0380     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0381     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0382             offsetof(struct xdp_md, data_end)),
0383     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0384     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0385     BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
0386     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0387     BPF_MOV64_IMM(BPF_REG_0, 0),
0388     BPF_EXIT_INSN(),
0389     },
0390     .errstr = "R1 offset is outside of the packet",
0391     .result = REJECT,
0392     .prog_type = BPF_PROG_TYPE_XDP,
0393     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0394 },
0395 {
0396     "XDP pkt read, pkt_data' >= pkt_end, good access",
0397     .insns = {
0398     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0399     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0400             offsetof(struct xdp_md, data_end)),
0401     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0402     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0403     BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
0404     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
0405     BPF_MOV64_IMM(BPF_REG_0, 0),
0406     BPF_EXIT_INSN(),
0407     },
0408     .result = ACCEPT,
0409     .prog_type = BPF_PROG_TYPE_XDP,
0410     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0411 },
0412 {
0413     "XDP pkt read, pkt_data' >= pkt_end, corner case -1, bad access",
0414     .insns = {
0415     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0416     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0417             offsetof(struct xdp_md, data_end)),
0418     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0419     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
0420     BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
0421     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6),
0422     BPF_MOV64_IMM(BPF_REG_0, 0),
0423     BPF_EXIT_INSN(),
0424     },
0425     .errstr = "R1 offset is outside of the packet",
0426     .result = REJECT,
0427     .prog_type = BPF_PROG_TYPE_XDP,
0428     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0429 },
0430 {
0431     "XDP pkt read, pkt_data' >= pkt_end, bad access 2",
0432     .insns = {
0433     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0434     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0435             offsetof(struct xdp_md, data_end)),
0436     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0437     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0438     BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0),
0439     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
0440     BPF_MOV64_IMM(BPF_REG_0, 0),
0441     BPF_EXIT_INSN(),
0442     },
0443     .errstr = "R1 offset is outside of the packet",
0444     .result = REJECT,
0445     .prog_type = BPF_PROG_TYPE_XDP,
0446     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0447 },
0448 {
0449     "XDP pkt read, pkt_data' >= pkt_end, corner case, good access",
0450     .insns = {
0451     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0452     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0453             offsetof(struct xdp_md, data_end)),
0454     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0455     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0456     BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
0457     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0458     BPF_MOV64_IMM(BPF_REG_0, 0),
0459     BPF_EXIT_INSN(),
0460     },
0461     .result = ACCEPT,
0462     .prog_type = BPF_PROG_TYPE_XDP,
0463     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0464 },
0465 {
0466     "XDP pkt read, pkt_data' >= pkt_end, corner case +1, good access",
0467     .insns = {
0468     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0469     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0470             offsetof(struct xdp_md, data_end)),
0471     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0472     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0473     BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
0474     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0475     BPF_MOV64_IMM(BPF_REG_0, 0),
0476     BPF_EXIT_INSN(),
0477     },
0478     .result = ACCEPT,
0479     .prog_type = BPF_PROG_TYPE_XDP,
0480     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0481 },
0482 {
0483     "XDP pkt read, pkt_end >= pkt_data', corner case, good access",
0484     .insns = {
0485     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0486     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0487             offsetof(struct xdp_md, data_end)),
0488     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0489     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0490     BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
0491     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0492     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0493     BPF_MOV64_IMM(BPF_REG_0, 0),
0494     BPF_EXIT_INSN(),
0495     },
0496     .result = ACCEPT,
0497     .prog_type = BPF_PROG_TYPE_XDP,
0498     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0499 },
0500 {
0501     "XDP pkt read, pkt_end >= pkt_data', bad access 1",
0502     .insns = {
0503     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0504     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0505             offsetof(struct xdp_md, data_end)),
0506     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0507     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0508     BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
0509     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0510     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
0511     BPF_MOV64_IMM(BPF_REG_0, 0),
0512     BPF_EXIT_INSN(),
0513     },
0514     .errstr = "R1 offset is outside of the packet",
0515     .result = REJECT,
0516     .prog_type = BPF_PROG_TYPE_XDP,
0517     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0518 },
0519 {
0520     "XDP pkt read, pkt_end >= pkt_data', bad access 2",
0521     .insns = {
0522     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0523     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0524             offsetof(struct xdp_md, data_end)),
0525     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0526     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0527     BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
0528     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0529     BPF_MOV64_IMM(BPF_REG_0, 0),
0530     BPF_EXIT_INSN(),
0531     },
0532     .errstr = "R1 offset is outside of the packet",
0533     .result = REJECT,
0534     .prog_type = BPF_PROG_TYPE_XDP,
0535     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0536 },
0537 {
0538     "XDP pkt read, pkt_end >= pkt_data', corner case +1, good access",
0539     .insns = {
0540     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0541     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0542             offsetof(struct xdp_md, data_end)),
0543     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0544     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9),
0545     BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
0546     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0547     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9),
0548     BPF_MOV64_IMM(BPF_REG_0, 0),
0549     BPF_EXIT_INSN(),
0550     },
0551     .result = ACCEPT,
0552     .prog_type = BPF_PROG_TYPE_XDP,
0553     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0554 },
0555 {
0556     "XDP pkt read, pkt_end >= pkt_data', corner case -1, bad access",
0557     .insns = {
0558     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0559     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0560             offsetof(struct xdp_md, data_end)),
0561     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0562     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0563     BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
0564     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0565     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0566     BPF_MOV64_IMM(BPF_REG_0, 0),
0567     BPF_EXIT_INSN(),
0568     },
0569     .errstr = "R1 offset is outside of the packet",
0570     .result = REJECT,
0571     .prog_type = BPF_PROG_TYPE_XDP,
0572     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0573 },
0574 {
0575     "XDP pkt read, pkt_data' <= pkt_end, corner case, good access",
0576     .insns = {
0577     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0578     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0579             offsetof(struct xdp_md, data_end)),
0580     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0581     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0582     BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
0583     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0584     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0585     BPF_MOV64_IMM(BPF_REG_0, 0),
0586     BPF_EXIT_INSN(),
0587     },
0588     .result = ACCEPT,
0589     .prog_type = BPF_PROG_TYPE_XDP,
0590     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0591 },
0592 {
0593     "XDP pkt read, pkt_data' <= pkt_end, bad access 1",
0594     .insns = {
0595     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0596     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0597             offsetof(struct xdp_md, data_end)),
0598     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0599     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0600     BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
0601     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0602     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
0603     BPF_MOV64_IMM(BPF_REG_0, 0),
0604     BPF_EXIT_INSN(),
0605     },
0606     .errstr = "R1 offset is outside of the packet",
0607     .result = REJECT,
0608     .prog_type = BPF_PROG_TYPE_XDP,
0609     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0610 },
0611 {
0612     "XDP pkt read, pkt_data' <= pkt_end, bad access 2",
0613     .insns = {
0614     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0615     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0616             offsetof(struct xdp_md, data_end)),
0617     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0618     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0619     BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
0620     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0621     BPF_MOV64_IMM(BPF_REG_0, 0),
0622     BPF_EXIT_INSN(),
0623     },
0624     .errstr = "R1 offset is outside of the packet",
0625     .result = REJECT,
0626     .prog_type = BPF_PROG_TYPE_XDP,
0627     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0628 },
0629 {
0630     "XDP pkt read, pkt_data' <= pkt_end, corner case +1, good access",
0631     .insns = {
0632     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0633     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0634             offsetof(struct xdp_md, data_end)),
0635     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0636     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9),
0637     BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
0638     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0639     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9),
0640     BPF_MOV64_IMM(BPF_REG_0, 0),
0641     BPF_EXIT_INSN(),
0642     },
0643     .result = ACCEPT,
0644     .prog_type = BPF_PROG_TYPE_XDP,
0645     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0646 },
0647 {
0648     "XDP pkt read, pkt_data' <= pkt_end, corner case -1, bad access",
0649     .insns = {
0650     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0651     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0652             offsetof(struct xdp_md, data_end)),
0653     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0654     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0655     BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
0656     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0657     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0658     BPF_MOV64_IMM(BPF_REG_0, 0),
0659     BPF_EXIT_INSN(),
0660     },
0661     .errstr = "R1 offset is outside of the packet",
0662     .result = REJECT,
0663     .prog_type = BPF_PROG_TYPE_XDP,
0664     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0665 },
0666 {
0667     "XDP pkt read, pkt_end <= pkt_data', good access",
0668     .insns = {
0669     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0670     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0671             offsetof(struct xdp_md, data_end)),
0672     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0673     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0674     BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
0675     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
0676     BPF_MOV64_IMM(BPF_REG_0, 0),
0677     BPF_EXIT_INSN(),
0678     },
0679     .result = ACCEPT,
0680     .prog_type = BPF_PROG_TYPE_XDP,
0681     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0682 },
0683 {
0684     "XDP pkt read, pkt_end <= pkt_data', corner case -1, bad access",
0685     .insns = {
0686     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0687     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0688             offsetof(struct xdp_md, data_end)),
0689     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0690     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
0691     BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
0692     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6),
0693     BPF_MOV64_IMM(BPF_REG_0, 0),
0694     BPF_EXIT_INSN(),
0695     },
0696     .errstr = "R1 offset is outside of the packet",
0697     .result = REJECT,
0698     .prog_type = BPF_PROG_TYPE_XDP,
0699     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0700 },
0701 {
0702     "XDP pkt read, pkt_end <= pkt_data', bad access 2",
0703     .insns = {
0704     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0705     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0706             offsetof(struct xdp_md, data_end)),
0707     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0708     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0709     BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0),
0710     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
0711     BPF_MOV64_IMM(BPF_REG_0, 0),
0712     BPF_EXIT_INSN(),
0713     },
0714     .errstr = "R1 offset is outside of the packet",
0715     .result = REJECT,
0716     .prog_type = BPF_PROG_TYPE_XDP,
0717     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0718 },
0719 {
0720     "XDP pkt read, pkt_end <= pkt_data', corner case, good access",
0721     .insns = {
0722     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0723     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0724             offsetof(struct xdp_md, data_end)),
0725     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0726     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0727     BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
0728     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0729     BPF_MOV64_IMM(BPF_REG_0, 0),
0730     BPF_EXIT_INSN(),
0731     },
0732     .result = ACCEPT,
0733     .prog_type = BPF_PROG_TYPE_XDP,
0734     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0735 },
0736 {
0737     "XDP pkt read, pkt_end <= pkt_data', corner case +1, good access",
0738     .insns = {
0739     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
0740     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0741             offsetof(struct xdp_md, data_end)),
0742     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0743     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0744     BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
0745     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0746     BPF_MOV64_IMM(BPF_REG_0, 0),
0747     BPF_EXIT_INSN(),
0748     },
0749     .result = ACCEPT,
0750     .prog_type = BPF_PROG_TYPE_XDP,
0751     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0752 },
0753 {
0754     "XDP pkt read, pkt_meta' > pkt_data, corner case, good access",
0755     .insns = {
0756     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0757             offsetof(struct xdp_md, data_meta)),
0758     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0759     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0760     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0761     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0762     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0763     BPF_MOV64_IMM(BPF_REG_0, 0),
0764     BPF_EXIT_INSN(),
0765     },
0766     .result = ACCEPT,
0767     .prog_type = BPF_PROG_TYPE_XDP,
0768     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0769 },
0770 {
0771     "XDP pkt read, pkt_meta' > pkt_data, bad access 1",
0772     .insns = {
0773     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0774             offsetof(struct xdp_md, data_meta)),
0775     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0776     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0777     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0778     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0779     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
0780     BPF_MOV64_IMM(BPF_REG_0, 0),
0781     BPF_EXIT_INSN(),
0782     },
0783     .errstr = "R1 offset is outside of the packet",
0784     .result = REJECT,
0785     .prog_type = BPF_PROG_TYPE_XDP,
0786     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0787 },
0788 {
0789     "XDP pkt read, pkt_meta' > pkt_data, bad access 2",
0790     .insns = {
0791     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0792             offsetof(struct xdp_md, data_meta)),
0793     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0794     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0795     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0796     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0),
0797     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0798     BPF_MOV64_IMM(BPF_REG_0, 0),
0799     BPF_EXIT_INSN(),
0800     },
0801     .errstr = "R1 offset is outside of the packet",
0802     .result = REJECT,
0803     .prog_type = BPF_PROG_TYPE_XDP,
0804     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0805 },
0806 {
0807     "XDP pkt read, pkt_meta' > pkt_data, corner case +1, good access",
0808     .insns = {
0809     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0810             offsetof(struct xdp_md, data_meta)),
0811     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0812     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0813     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 9),
0814     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0815     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -9),
0816     BPF_MOV64_IMM(BPF_REG_0, 0),
0817     BPF_EXIT_INSN(),
0818     },
0819     .result = ACCEPT,
0820     .prog_type = BPF_PROG_TYPE_XDP,
0821     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0822 },
0823 {
0824     "XDP pkt read, pkt_meta' > pkt_data, corner case -1, bad access",
0825     .insns = {
0826     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0827             offsetof(struct xdp_md, data_meta)),
0828     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0829     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0830     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0831     BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
0832     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0833     BPF_MOV64_IMM(BPF_REG_0, 0),
0834     BPF_EXIT_INSN(),
0835     },
0836     .errstr = "R1 offset is outside of the packet",
0837     .result = REJECT,
0838     .prog_type = BPF_PROG_TYPE_XDP,
0839     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0840 },
0841 {
0842     "XDP pkt read, pkt_data > pkt_meta', good access",
0843     .insns = {
0844     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0845             offsetof(struct xdp_md, data_meta)),
0846     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0847     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0848     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0849     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0850     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0851     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
0852     BPF_MOV64_IMM(BPF_REG_0, 0),
0853     BPF_EXIT_INSN(),
0854     },
0855     .result = ACCEPT,
0856     .prog_type = BPF_PROG_TYPE_XDP,
0857     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0858 },
0859 {
0860     "XDP pkt read, pkt_data > pkt_meta', corner case -1, bad access",
0861     .insns = {
0862     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0863             offsetof(struct xdp_md, data_meta)),
0864     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0865     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0866     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
0867     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0868     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0869     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6),
0870     BPF_MOV64_IMM(BPF_REG_0, 0),
0871     BPF_EXIT_INSN(),
0872     },
0873     .errstr = "R1 offset is outside of the packet",
0874     .result = REJECT,
0875     .prog_type = BPF_PROG_TYPE_XDP,
0876     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0877 },
0878 {
0879     "XDP pkt read, pkt_data > pkt_meta', bad access 2",
0880     .insns = {
0881     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0882             offsetof(struct xdp_md, data_meta)),
0883     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0884     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0885     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0886     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0887     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0888     BPF_MOV64_IMM(BPF_REG_0, 0),
0889     BPF_EXIT_INSN(),
0890     },
0891     .errstr = "R1 offset is outside of the packet",
0892     .result = REJECT,
0893     .prog_type = BPF_PROG_TYPE_XDP,
0894     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0895 },
0896 {
0897     "XDP pkt read, pkt_data > pkt_meta', corner case, good access",
0898     .insns = {
0899     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0900             offsetof(struct xdp_md, data_meta)),
0901     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0902     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0903     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0904     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0905     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0906     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0907     BPF_MOV64_IMM(BPF_REG_0, 0),
0908     BPF_EXIT_INSN(),
0909     },
0910     .result = ACCEPT,
0911     .prog_type = BPF_PROG_TYPE_XDP,
0912     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0913 },
0914 {
0915     "XDP pkt read, pkt_data > pkt_meta', corner case +1, good access",
0916     .insns = {
0917     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0918             offsetof(struct xdp_md, data_meta)),
0919     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0920     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0921     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0922     BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1),
0923     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0924     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0925     BPF_MOV64_IMM(BPF_REG_0, 0),
0926     BPF_EXIT_INSN(),
0927     },
0928     .result = ACCEPT,
0929     .prog_type = BPF_PROG_TYPE_XDP,
0930     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0931 },
0932 {
0933     "XDP pkt read, pkt_meta' < pkt_data, good access",
0934     .insns = {
0935     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0936             offsetof(struct xdp_md, data_meta)),
0937     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0938     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0939     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0940     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0941     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0942     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
0943     BPF_MOV64_IMM(BPF_REG_0, 0),
0944     BPF_EXIT_INSN(),
0945     },
0946     .result = ACCEPT,
0947     .prog_type = BPF_PROG_TYPE_XDP,
0948     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0949 },
0950 {
0951     "XDP pkt read, pkt_meta' < pkt_data, corner case -1, bad access",
0952     .insns = {
0953     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0954             offsetof(struct xdp_md, data_meta)),
0955     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0956     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0957     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
0958     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0959     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0960     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6),
0961     BPF_MOV64_IMM(BPF_REG_0, 0),
0962     BPF_EXIT_INSN(),
0963     },
0964     .errstr = "R1 offset is outside of the packet",
0965     .result = REJECT,
0966     .prog_type = BPF_PROG_TYPE_XDP,
0967     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0968 },
0969 {
0970     "XDP pkt read, pkt_meta' < pkt_data, bad access 2",
0971     .insns = {
0972     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0973             offsetof(struct xdp_md, data_meta)),
0974     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0975     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0976     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
0977     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0978     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
0979     BPF_MOV64_IMM(BPF_REG_0, 0),
0980     BPF_EXIT_INSN(),
0981     },
0982     .errstr = "R1 offset is outside of the packet",
0983     .result = REJECT,
0984     .prog_type = BPF_PROG_TYPE_XDP,
0985     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0986 },
0987 {
0988     "XDP pkt read, pkt_meta' < pkt_data, corner case, good access",
0989     .insns = {
0990     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0991             offsetof(struct xdp_md, data_meta)),
0992     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0993     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
0994     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7),
0995     BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1),
0996     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0997     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -7),
0998     BPF_MOV64_IMM(BPF_REG_0, 0),
0999     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",
1025     .insns = {
1026     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1027             offsetof(struct xdp_md, data_meta)),
1028     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1029     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1030     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1031     BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
1032     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
1033     BPF_MOV64_IMM(BPF_REG_0, 0),
1034     BPF_EXIT_INSN(),
1035     },
1036     .result = ACCEPT,
1037     .prog_type = BPF_PROG_TYPE_XDP,
1038     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1039 },
1040 {
1041     "XDP pkt read, pkt_data < pkt_meta', bad access 1",
1042     .insns = {
1043     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1044             offsetof(struct xdp_md, data_meta)),
1045     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1046     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1047     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1048     BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1),
1049     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
1050     BPF_MOV64_IMM(BPF_REG_0, 0),
1051     BPF_EXIT_INSN(),
1052     },
1053     .errstr = "R1 offset is outside of the packet",
1054     .result = REJECT,
1055     .prog_type = BPF_PROG_TYPE_XDP,
1056     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1057 },
1058 {
1059     "XDP pkt read, pkt_data < pkt_meta', bad access 2",
1060     .insns = {
1061     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1062             offsetof(struct xdp_md, data_meta)),
1063     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1064     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1065     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1066     BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0),
1067     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
1068     BPF_MOV64_IMM(BPF_REG_0, 0),
1069     BPF_EXIT_INSN(),
1070     },
1071     .errstr = "R1 offset is outside of the packet",
1072     .result = REJECT,
1073     .prog_type = BPF_PROG_TYPE_XDP,
1074     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
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 },
1111 {
1112     "XDP pkt read, pkt_meta' >= pkt_data, good access",
1113     .insns = {
1114     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1115             offsetof(struct xdp_md, data_meta)),
1116     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1117     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1118     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1119     BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
1120     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
1121     BPF_MOV64_IMM(BPF_REG_0, 0),
1122     BPF_EXIT_INSN(),
1123     },
1124     .result = ACCEPT,
1125     .prog_type = BPF_PROG_TYPE_XDP,
1126     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1127 },
1128 {
1129     "XDP pkt read, pkt_meta' >= pkt_data, corner case -1, bad access",
1130     .insns = {
1131     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1132             offsetof(struct xdp_md, data_meta)),
1133     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1134     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1135     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
1136     BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1),
1137     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6),
1138     BPF_MOV64_IMM(BPF_REG_0, 0),
1139     BPF_EXIT_INSN(),
1140     },
1141     .errstr = "R1 offset is outside of the packet",
1142     .result = REJECT,
1143     .prog_type = BPF_PROG_TYPE_XDP,
1144     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1145 },
1146 {
1147     "XDP pkt read, pkt_meta' >= pkt_data, bad access 2",
1148     .insns = {
1149     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1150             offsetof(struct xdp_md, data_meta)),
1151     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1152     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1153     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1154     BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0),
1155     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
1156     BPF_MOV64_IMM(BPF_REG_0, 0),
1157     BPF_EXIT_INSN(),
1158     },
1159     .errstr = "R1 offset is outside of the packet",
1160     .result = REJECT,
1161     .prog_type = BPF_PROG_TYPE_XDP,
1162     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1163 },
1164 {
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",
1200     .insns = {
1201     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1202             offsetof(struct xdp_md, data_meta)),
1203     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1204     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1205     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1206     BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
1207     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
1208     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
1209     BPF_MOV64_IMM(BPF_REG_0, 0),
1210     BPF_EXIT_INSN(),
1211     },
1212     .result = ACCEPT,
1213     .prog_type = BPF_PROG_TYPE_XDP,
1214     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1215 },
1216 {
1217     "XDP pkt read, pkt_data >= pkt_meta', bad access 1",
1218     .insns = {
1219     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1220             offsetof(struct xdp_md, data_meta)),
1221     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1222     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1223     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1224     BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
1225     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
1226     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
1227     BPF_MOV64_IMM(BPF_REG_0, 0),
1228     BPF_EXIT_INSN(),
1229     },
1230     .errstr = "R1 offset is outside of the packet",
1231     .result = REJECT,
1232     .prog_type = BPF_PROG_TYPE_XDP,
1233     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1234 },
1235 {
1236     "XDP pkt read, pkt_data >= pkt_meta', bad access 2",
1237     .insns = {
1238     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1239             offsetof(struct xdp_md, data_meta)),
1240     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1241     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1242     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1243     BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1),
1244     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
1245     BPF_MOV64_IMM(BPF_REG_0, 0),
1246     BPF_EXIT_INSN(),
1247     },
1248     .errstr = "R1 offset is outside of the packet",
1249     .result = REJECT,
1250     .prog_type = BPF_PROG_TYPE_XDP,
1251     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1252 },
1253 {
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",
1292     .insns = {
1293     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1294             offsetof(struct xdp_md, data_meta)),
1295     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1296     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1297     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1298     BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
1299     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
1300     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
1301     BPF_MOV64_IMM(BPF_REG_0, 0),
1302     BPF_EXIT_INSN(),
1303     },
1304     .result = ACCEPT,
1305     .prog_type = BPF_PROG_TYPE_XDP,
1306     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1307 },
1308 {
1309     "XDP pkt read, pkt_meta' <= pkt_data, bad access 1",
1310     .insns = {
1311     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1312             offsetof(struct xdp_md, data_meta)),
1313     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1314     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1315     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1316     BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
1317     BPF_JMP_IMM(BPF_JA, 0, 0, 1),
1318     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4),
1319     BPF_MOV64_IMM(BPF_REG_0, 0),
1320     BPF_EXIT_INSN(),
1321     },
1322     .errstr = "R1 offset is outside of the packet",
1323     .result = REJECT,
1324     .prog_type = BPF_PROG_TYPE_XDP,
1325     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1326 },
1327 {
1328     "XDP pkt read, pkt_meta' <= pkt_data, bad access 2",
1329     .insns = {
1330     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1331             offsetof(struct xdp_md, data_meta)),
1332     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1333     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1334     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1335     BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1),
1336     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8),
1337     BPF_MOV64_IMM(BPF_REG_0, 0),
1338     BPF_EXIT_INSN(),
1339     },
1340     .errstr = "R1 offset is outside of the packet",
1341     .result = REJECT,
1342     .prog_type = BPF_PROG_TYPE_XDP,
1343     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
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 },
1382 {
1383     "XDP pkt read, pkt_data <= pkt_meta', good access",
1384     .insns = {
1385     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1386             offsetof(struct xdp_md, data_meta)),
1387     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1388     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1389     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1390     BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
1391     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
1392     BPF_MOV64_IMM(BPF_REG_0, 0),
1393     BPF_EXIT_INSN(),
1394     },
1395     .result = ACCEPT,
1396     .prog_type = BPF_PROG_TYPE_XDP,
1397     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1398 },
1399 {
1400     "XDP pkt read, pkt_data <= pkt_meta', corner case -1, bad access",
1401     .insns = {
1402     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1403             offsetof(struct xdp_md, data_meta)),
1404     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1405     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1406     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
1407     BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1),
1408     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -6),
1409     BPF_MOV64_IMM(BPF_REG_0, 0),
1410     BPF_EXIT_INSN(),
1411     },
1412     .errstr = "R1 offset is outside of the packet",
1413     .result = REJECT,
1414     .prog_type = BPF_PROG_TYPE_XDP,
1415     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
1416 },
1417 {
1418     "XDP pkt read, pkt_data <= pkt_meta', bad access 2",
1419     .insns = {
1420     BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1421             offsetof(struct xdp_md, data_meta)),
1422     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
1423     BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1424     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
1425     BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0),
1426     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5),
1427     BPF_MOV64_IMM(BPF_REG_0, 0),
1428     BPF_EXIT_INSN(),
1429     },
1430     .errstr = "R1 offset is outside of the packet",
1431     .result = REJECT,
1432     .prog_type = BPF_PROG_TYPE_XDP,
1433     .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
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 },