Commit 3384c7c7 authored by Vadim Fedorenko's avatar Vadim Fedorenko Committed by Daniel Borkmann
Browse files

selftests/bpf: Test new __sk_buff field hwtstamp



Analogous to the gso_segs selftests introduced in commit d9ff286a
("bpf: allow BPF programs access skb_shared_info->gso_segs field").

Signed-off-by: default avatarVadim Fedorenko <vfedorenko@novek.ru>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20210909220409.8804-3-vfedorenko@novek.ru
parent f64c4ace
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
+8 −0
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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;
}
+60 −0
Original line number Diff line number Diff line
@@ -1057,6 +1057,66 @@
	.result = ACCEPT,
	.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 = {