OSDN Git Service

selftests/bpf: Test new __sk_buff field hwtstamp
authorVadim Fedorenko <vfedorenko@novek.ru>
Thu, 9 Sep 2021 22:04:09 +0000 (01:04 +0300)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 10 Sep 2021 21:20:13 +0000 (23:20 +0200)
Analogous to the gso_segs selftests introduced in commit d9ff286a0f59
("bpf: allow BPF programs access skb_shared_info->gso_segs field").

Signed-off-by: Vadim Fedorenko <vfedorenko@novek.ru>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20210909220409.8804-3-vfedorenko@novek.ru
lib/test_bpf.c
net/bpf/test_run.c
tools/testing/selftests/bpf/prog_tests/skb_ctx.c
tools/testing/selftests/bpf/progs/test_skb_ctx.c
tools/testing/selftests/bpf/verifier/ctx_skb.c

index 830a18e..0018d51 100644 (file)
@@ -8800,6 +8800,7 @@ static __init struct sk_buff *build_test_skb(void)
        skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
        skb_shinfo(skb[0])->gso_segs = 0;
        skb_shinfo(skb[0])->frag_list = skb[1];
+       skb_shinfo(skb[0])->hwtstamps.hwtstamp = 1000;
 
        /* adjust skb[0]'s len */
        skb[0]->len += skb[1]->len;
index 1153b89..fcb2f49 100644 (file)
@@ -507,6 +507,12 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
        /* gso_size is allowed */
 
        if (!range_is_zero(__skb, offsetofend(struct __sk_buff, gso_size),
+                          offsetof(struct __sk_buff, hwtstamp)))
+               return -EINVAL;
+
+       /* hwtstamp is allowed */
+
+       if (!range_is_zero(__skb, offsetofend(struct __sk_buff, hwtstamp),
                           sizeof(struct __sk_buff)))
                return -EINVAL;
 
@@ -529,6 +535,7 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
                return -EINVAL;
        skb_shinfo(skb)->gso_segs = __skb->gso_segs;
        skb_shinfo(skb)->gso_size = __skb->gso_size;
+       skb_shinfo(skb)->hwtstamps.hwtstamp = __skb->hwtstamp;
 
        return 0;
 }
@@ -548,6 +555,7 @@ static void convert_skb_to___skb(struct sk_buff *skb, struct __sk_buff *__skb)
        memcpy(__skb->cb, &cb->data, QDISC_CB_PRIV_LEN);
        __skb->wire_len = cb->pkt_len;
        __skb->gso_segs = skb_shinfo(skb)->gso_segs;
+       __skb->hwtstamp = skb_shinfo(skb)->hwtstamps.hwtstamp;
 }
 
 int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
index 2bf8c68..c437e6b 100644 (file)
@@ -18,6 +18,7 @@ void test_skb_ctx(void)
                .gso_segs = 8,
                .mark = 9,
                .gso_size = 10,
+               .hwtstamp = 11,
        };
        struct bpf_prog_test_run_attr tattr = {
                .data_in = &pkt_v4,
index bbd5a9c..ba4dab0 100644 (file)
@@ -29,6 +29,8 @@ int process(struct __sk_buff *skb)
                return 1;
        if (skb->ifindex != 1)
                return 1;
+       if (skb->hwtstamp != 11)
+               return 1;
 
        return 0;
 }
index 2022c0f..9e1a30b 100644 (file)
        .prog_type = BPF_PROG_TYPE_SCHED_CLS,
 },
 {
+       "padding after gso_size is not accessible",
+       .insns = {
+       BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
+                   offsetofend(struct __sk_buff, gso_size)),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .result = REJECT,
+       .result_unpriv = REJECT,
+       .errstr = "invalid bpf_context access off=180 size=4",
+       .prog_type = BPF_PROG_TYPE_SCHED_CLS,
+},
+{
+       "read hwtstamp from CGROUP_SKB",
+       .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
+                   offsetof(struct __sk_buff, hwtstamp)),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .result = ACCEPT,
+       .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
+},
+{
+       "read hwtstamp from CGROUP_SKB",
+       .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1,
+                   offsetof(struct __sk_buff, hwtstamp)),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .result = ACCEPT,
+       .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
+},
+{
+       "write hwtstamp from CGROUP_SKB",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
+                   offsetof(struct __sk_buff, hwtstamp)),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .result = REJECT,
+       .result_unpriv = REJECT,
+       .errstr = "invalid bpf_context access off=184 size=8",
+       .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
+},
+{
+       "read hwtstamp from CLS",
+       .insns = {
+       BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
+                   offsetof(struct __sk_buff, hwtstamp)),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .result = ACCEPT,
+       .prog_type = BPF_PROG_TYPE_SCHED_CLS,
+},
+{
        "check wire_len is not readable by sockets",
        .insns = {
                BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,