0001 {
0002 "meta access, test1",
0003 .insns = {
0004 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0005 offsetof(struct xdp_md, data_meta)),
0006 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0007 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
0008 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
0009 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
0010 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
0011 BPF_MOV64_IMM(BPF_REG_0, 0),
0012 BPF_EXIT_INSN(),
0013 },
0014 .result = ACCEPT,
0015 .prog_type = BPF_PROG_TYPE_XDP,
0016 },
0017 {
0018 "meta access, test2",
0019 .insns = {
0020 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0021 offsetof(struct xdp_md, data_meta)),
0022 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0023 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
0024 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 8),
0025 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
0026 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
0027 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
0028 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
0029 BPF_MOV64_IMM(BPF_REG_0, 0),
0030 BPF_EXIT_INSN(),
0031 },
0032 .result = REJECT,
0033 .errstr = "invalid access to packet, off=-8",
0034 .prog_type = BPF_PROG_TYPE_XDP,
0035 },
0036 {
0037 "meta access, test3",
0038 .insns = {
0039 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0040 offsetof(struct xdp_md, data_meta)),
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_0, BPF_REG_2),
0044 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
0045 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
0046 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
0047 BPF_MOV64_IMM(BPF_REG_0, 0),
0048 BPF_EXIT_INSN(),
0049 },
0050 .result = REJECT,
0051 .errstr = "invalid access to packet",
0052 .prog_type = BPF_PROG_TYPE_XDP,
0053 },
0054 {
0055 "meta access, test4",
0056 .insns = {
0057 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0058 offsetof(struct xdp_md, data_meta)),
0059 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0060 offsetof(struct xdp_md, data_end)),
0061 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, offsetof(struct xdp_md, data)),
0062 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
0063 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
0064 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
0065 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
0066 BPF_MOV64_IMM(BPF_REG_0, 0),
0067 BPF_EXIT_INSN(),
0068 },
0069 .result = REJECT,
0070 .errstr = "invalid access to packet",
0071 .prog_type = BPF_PROG_TYPE_XDP,
0072 },
0073 {
0074 "meta access, test5",
0075 .insns = {
0076 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
0077 offsetof(struct xdp_md, data_meta)),
0078 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, offsetof(struct xdp_md, data)),
0079 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
0080 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
0081 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_4, 3),
0082 BPF_MOV64_IMM(BPF_REG_2, -8),
0083 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_xdp_adjust_meta),
0084 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0),
0085 BPF_MOV64_IMM(BPF_REG_0, 0),
0086 BPF_EXIT_INSN(),
0087 },
0088 .result = REJECT,
0089 .errstr = "R3 !read_ok",
0090 .prog_type = BPF_PROG_TYPE_XDP,
0091 },
0092 {
0093 "meta access, test6",
0094 .insns = {
0095 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0096 offsetof(struct xdp_md, data_meta)),
0097 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0098 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
0099 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
0100 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
0101 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
0102 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_0, 1),
0103 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
0104 BPF_MOV64_IMM(BPF_REG_0, 0),
0105 BPF_EXIT_INSN(),
0106 },
0107 .result = REJECT,
0108 .errstr = "invalid access to packet",
0109 .prog_type = BPF_PROG_TYPE_XDP,
0110 },
0111 {
0112 "meta access, test7",
0113 .insns = {
0114 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0115 offsetof(struct xdp_md, data_meta)),
0116 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0117 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
0118 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
0119 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
0120 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8),
0121 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
0122 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
0123 BPF_MOV64_IMM(BPF_REG_0, 0),
0124 BPF_EXIT_INSN(),
0125 },
0126 .result = ACCEPT,
0127 .prog_type = BPF_PROG_TYPE_XDP,
0128 },
0129 {
0130 "meta access, test8",
0131 .insns = {
0132 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0133 offsetof(struct xdp_md, data_meta)),
0134 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0135 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
0136 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF),
0137 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
0138 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
0139 BPF_MOV64_IMM(BPF_REG_0, 0),
0140 BPF_EXIT_INSN(),
0141 },
0142 .result = ACCEPT,
0143 .prog_type = BPF_PROG_TYPE_XDP,
0144 },
0145 {
0146 "meta access, test9",
0147 .insns = {
0148 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0149 offsetof(struct xdp_md, data_meta)),
0150 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0151 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2),
0152 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF),
0153 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1),
0154 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1),
0155 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
0156 BPF_MOV64_IMM(BPF_REG_0, 0),
0157 BPF_EXIT_INSN(),
0158 },
0159 .result = REJECT,
0160 .errstr = "invalid access to packet",
0161 .prog_type = BPF_PROG_TYPE_XDP,
0162 },
0163 {
0164 "meta access, test10",
0165 .insns = {
0166 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0167 offsetof(struct xdp_md, data_meta)),
0168 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0169 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
0170 offsetof(struct xdp_md, data_end)),
0171 BPF_MOV64_IMM(BPF_REG_5, 42),
0172 BPF_MOV64_IMM(BPF_REG_6, 24),
0173 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8),
0174 BPF_ATOMIC_OP(BPF_DW, BPF_ADD, BPF_REG_10, BPF_REG_6, -8),
0175 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8),
0176 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6),
0177 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_5),
0178 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
0179 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
0180 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8),
0181 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_5, 1),
0182 BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
0183 BPF_MOV64_IMM(BPF_REG_0, 0),
0184 BPF_EXIT_INSN(),
0185 },
0186 .result = REJECT,
0187 .errstr = "invalid access to packet",
0188 .prog_type = BPF_PROG_TYPE_XDP,
0189 },
0190 {
0191 "meta access, test11",
0192 .insns = {
0193 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0194 offsetof(struct xdp_md, data_meta)),
0195 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0196 BPF_MOV64_IMM(BPF_REG_5, 42),
0197 BPF_MOV64_IMM(BPF_REG_6, 24),
0198 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8),
0199 BPF_ATOMIC_OP(BPF_DW, BPF_ADD, BPF_REG_10, BPF_REG_6, -8),
0200 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8),
0201 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6),
0202 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_5),
0203 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2),
0204 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
0205 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8),
0206 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_3, 1),
0207 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_5, 0),
0208 BPF_MOV64_IMM(BPF_REG_0, 0),
0209 BPF_EXIT_INSN(),
0210 },
0211 .result = ACCEPT,
0212 .prog_type = BPF_PROG_TYPE_XDP,
0213 },
0214 {
0215 "meta access, test12",
0216 .insns = {
0217 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
0218 offsetof(struct xdp_md, data_meta)),
0219 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, offsetof(struct xdp_md, data)),
0220 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1,
0221 offsetof(struct xdp_md, data_end)),
0222 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3),
0223 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16),
0224 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 5),
0225 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0),
0226 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2),
0227 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16),
0228 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 1),
0229 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
0230 BPF_MOV64_IMM(BPF_REG_0, 0),
0231 BPF_EXIT_INSN(),
0232 },
0233 .result = ACCEPT,
0234 .prog_type = BPF_PROG_TYPE_XDP,
0235 },