root/tools/testing/selftests/bpf/verifier/lwt.c

/* [<][>][^][v][top][bottom][index][help] */
   1 {
   2         "invalid direct packet write for LWT_IN",
   3         .insns = {
   4         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
   5                     offsetof(struct __sk_buff, data)),
   6         BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
   7                     offsetof(struct __sk_buff, data_end)),
   8         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
   9         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  10         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  11         BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
  12         BPF_MOV64_IMM(BPF_REG_0, 0),
  13         BPF_EXIT_INSN(),
  14         },
  15         .errstr = "cannot write into packet",
  16         .result = REJECT,
  17         .prog_type = BPF_PROG_TYPE_LWT_IN,
  18 },
  19 {
  20         "invalid direct packet write for LWT_OUT",
  21         .insns = {
  22         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  23                     offsetof(struct __sk_buff, data)),
  24         BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  25                     offsetof(struct __sk_buff, data_end)),
  26         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  27         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  28         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  29         BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
  30         BPF_MOV64_IMM(BPF_REG_0, 0),
  31         BPF_EXIT_INSN(),
  32         },
  33         .errstr = "cannot write into packet",
  34         .result = REJECT,
  35         .prog_type = BPF_PROG_TYPE_LWT_OUT,
  36 },
  37 {
  38         "direct packet write for LWT_XMIT",
  39         .insns = {
  40         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  41                     offsetof(struct __sk_buff, data)),
  42         BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  43                     offsetof(struct __sk_buff, data_end)),
  44         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  45         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  46         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  47         BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
  48         BPF_MOV64_IMM(BPF_REG_0, 0),
  49         BPF_EXIT_INSN(),
  50         },
  51         .result = ACCEPT,
  52         .prog_type = BPF_PROG_TYPE_LWT_XMIT,
  53 },
  54 {
  55         "direct packet read for LWT_IN",
  56         .insns = {
  57         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  58                     offsetof(struct __sk_buff, data)),
  59         BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  60                     offsetof(struct __sk_buff, data_end)),
  61         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  62         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  63         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  64         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
  65         BPF_MOV64_IMM(BPF_REG_0, 0),
  66         BPF_EXIT_INSN(),
  67         },
  68         .result = ACCEPT,
  69         .prog_type = BPF_PROG_TYPE_LWT_IN,
  70 },
  71 {
  72         "direct packet read for LWT_OUT",
  73         .insns = {
  74         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  75                     offsetof(struct __sk_buff, data)),
  76         BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  77                     offsetof(struct __sk_buff, data_end)),
  78         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  79         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  80         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  81         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
  82         BPF_MOV64_IMM(BPF_REG_0, 0),
  83         BPF_EXIT_INSN(),
  84         },
  85         .result = ACCEPT,
  86         .prog_type = BPF_PROG_TYPE_LWT_OUT,
  87 },
  88 {
  89         "direct packet read for LWT_XMIT",
  90         .insns = {
  91         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  92                     offsetof(struct __sk_buff, data)),
  93         BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  94                     offsetof(struct __sk_buff, data_end)),
  95         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  96         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  97         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  98         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
  99         BPF_MOV64_IMM(BPF_REG_0, 0),
 100         BPF_EXIT_INSN(),
 101         },
 102         .result = ACCEPT,
 103         .prog_type = BPF_PROG_TYPE_LWT_XMIT,
 104 },
 105 {
 106         "overlapping checks for direct packet access",
 107         .insns = {
 108         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
 109                     offsetof(struct __sk_buff, data)),
 110         BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
 111                     offsetof(struct __sk_buff, data_end)),
 112         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
 113         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
 114         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4),
 115         BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
 116         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
 117         BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
 118         BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6),
 119         BPF_MOV64_IMM(BPF_REG_0, 0),
 120         BPF_EXIT_INSN(),
 121         },
 122         .result = ACCEPT,
 123         .prog_type = BPF_PROG_TYPE_LWT_XMIT,
 124 },
 125 {
 126         "make headroom for LWT_XMIT",
 127         .insns = {
 128         BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
 129         BPF_MOV64_IMM(BPF_REG_2, 34),
 130         BPF_MOV64_IMM(BPF_REG_3, 0),
 131         BPF_EMIT_CALL(BPF_FUNC_skb_change_head),
 132         /* split for s390 to succeed */
 133         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 134         BPF_MOV64_IMM(BPF_REG_2, 42),
 135         BPF_MOV64_IMM(BPF_REG_3, 0),
 136         BPF_EMIT_CALL(BPF_FUNC_skb_change_head),
 137         BPF_MOV64_IMM(BPF_REG_0, 0),
 138         BPF_EXIT_INSN(),
 139         },
 140         .result = ACCEPT,
 141         .prog_type = BPF_PROG_TYPE_LWT_XMIT,
 142 },
 143 {
 144         "invalid access of tc_classid for LWT_IN",
 145         .insns = {
 146         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
 147                     offsetof(struct __sk_buff, tc_classid)),
 148         BPF_EXIT_INSN(),
 149         },
 150         .result = REJECT,
 151         .errstr = "invalid bpf_context access",
 152 },
 153 {
 154         "invalid access of tc_classid for LWT_OUT",
 155         .insns = {
 156         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
 157                     offsetof(struct __sk_buff, tc_classid)),
 158         BPF_EXIT_INSN(),
 159         },
 160         .result = REJECT,
 161         .errstr = "invalid bpf_context access",
 162 },
 163 {
 164         "invalid access of tc_classid for LWT_XMIT",
 165         .insns = {
 166         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
 167                     offsetof(struct __sk_buff, tc_classid)),
 168         BPF_EXIT_INSN(),
 169         },
 170         .result = REJECT,
 171         .errstr = "invalid bpf_context access",
 172 },
 173 {
 174         "check skb->tc_classid half load not permitted for lwt prog",
 175         .insns = {
 176         BPF_MOV64_IMM(BPF_REG_0, 0),
 177 #if __BYTE_ORDER == __LITTLE_ENDIAN
 178         BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
 179                     offsetof(struct __sk_buff, tc_classid)),
 180 #else
 181         BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
 182                     offsetof(struct __sk_buff, tc_classid) + 2),
 183 #endif
 184         BPF_EXIT_INSN(),
 185         },
 186         .result = REJECT,
 187         .errstr = "invalid bpf_context access",
 188         .prog_type = BPF_PROG_TYPE_LWT_IN,
 189 },

/* [<][>][^][v][top][bottom][index][help] */