Skip to content

Commit 3384c7c

Browse files
vvfedorenkoborkmann
authored andcommitted
selftests/bpf: Test new __sk_buff field hwtstamp
Analogous to the gso_segs selftests introduced in commit d9ff286 ("bpf: allow BPF programs access skb_shared_info->gso_segs field"). Signed-off-by: Vadim Fedorenko <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Acked-by: Martin KaFai Lau <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent f64c4ac commit 3384c7c

File tree

5 files changed

+72
-0
lines changed

5 files changed

+72
-0
lines changed

lib/test_bpf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8800,6 +8800,7 @@ static __init struct sk_buff *build_test_skb(void)
88008800
skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
88018801
skb_shinfo(skb[0])->gso_segs = 0;
88028802
skb_shinfo(skb[0])->frag_list = skb[1];
8803+
skb_shinfo(skb[0])->hwtstamps.hwtstamp = 1000;
88038804

88048805
/* adjust skb[0]'s len */
88058806
skb[0]->len += skb[1]->len;

net/bpf/test_run.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,12 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
507507
/* gso_size is allowed */
508508

509509
if (!range_is_zero(__skb, offsetofend(struct __sk_buff, gso_size),
510+
offsetof(struct __sk_buff, hwtstamp)))
511+
return -EINVAL;
512+
513+
/* hwtstamp is allowed */
514+
515+
if (!range_is_zero(__skb, offsetofend(struct __sk_buff, hwtstamp),
510516
sizeof(struct __sk_buff)))
511517
return -EINVAL;
512518

@@ -529,6 +535,7 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
529535
return -EINVAL;
530536
skb_shinfo(skb)->gso_segs = __skb->gso_segs;
531537
skb_shinfo(skb)->gso_size = __skb->gso_size;
538+
skb_shinfo(skb)->hwtstamps.hwtstamp = __skb->hwtstamp;
532539

533540
return 0;
534541
}
@@ -548,6 +555,7 @@ static void convert_skb_to___skb(struct sk_buff *skb, struct __sk_buff *__skb)
548555
memcpy(__skb->cb, &cb->data, QDISC_CB_PRIV_LEN);
549556
__skb->wire_len = cb->pkt_len;
550557
__skb->gso_segs = skb_shinfo(skb)->gso_segs;
558+
__skb->hwtstamp = skb_shinfo(skb)->hwtstamps.hwtstamp;
551559
}
552560

553561
int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,

tools/testing/selftests/bpf/prog_tests/skb_ctx.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ void test_skb_ctx(void)
1818
.gso_segs = 8,
1919
.mark = 9,
2020
.gso_size = 10,
21+
.hwtstamp = 11,
2122
};
2223
struct bpf_prog_test_run_attr tattr = {
2324
.data_in = &pkt_v4,

tools/testing/selftests/bpf/progs/test_skb_ctx.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ int process(struct __sk_buff *skb)
2929
return 1;
3030
if (skb->ifindex != 1)
3131
return 1;
32+
if (skb->hwtstamp != 11)
33+
return 1;
3234

3335
return 0;
3436
}

tools/testing/selftests/bpf/verifier/ctx_skb.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,66 @@
10571057
.result = ACCEPT,
10581058
.prog_type = BPF_PROG_TYPE_SCHED_CLS,
10591059
},
1060+
{
1061+
"padding after gso_size is not accessible",
1062+
.insns = {
1063+
BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1064+
offsetofend(struct __sk_buff, gso_size)),
1065+
BPF_MOV64_IMM(BPF_REG_0, 0),
1066+
BPF_EXIT_INSN(),
1067+
},
1068+
.result = REJECT,
1069+
.result_unpriv = REJECT,
1070+
.errstr = "invalid bpf_context access off=180 size=4",
1071+
.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1072+
},
1073+
{
1074+
"read hwtstamp from CGROUP_SKB",
1075+
.insns = {
1076+
BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
1077+
offsetof(struct __sk_buff, hwtstamp)),
1078+
BPF_MOV64_IMM(BPF_REG_0, 0),
1079+
BPF_EXIT_INSN(),
1080+
},
1081+
.result = ACCEPT,
1082+
.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
1083+
},
1084+
{
1085+
"read hwtstamp from CGROUP_SKB",
1086+
.insns = {
1087+
BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1,
1088+
offsetof(struct __sk_buff, hwtstamp)),
1089+
BPF_MOV64_IMM(BPF_REG_0, 0),
1090+
BPF_EXIT_INSN(),
1091+
},
1092+
.result = ACCEPT,
1093+
.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
1094+
},
1095+
{
1096+
"write hwtstamp from CGROUP_SKB",
1097+
.insns = {
1098+
BPF_MOV64_IMM(BPF_REG_0, 0),
1099+
BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0,
1100+
offsetof(struct __sk_buff, hwtstamp)),
1101+
BPF_MOV64_IMM(BPF_REG_0, 0),
1102+
BPF_EXIT_INSN(),
1103+
},
1104+
.result = REJECT,
1105+
.result_unpriv = REJECT,
1106+
.errstr = "invalid bpf_context access off=184 size=8",
1107+
.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
1108+
},
1109+
{
1110+
"read hwtstamp from CLS",
1111+
.insns = {
1112+
BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
1113+
offsetof(struct __sk_buff, hwtstamp)),
1114+
BPF_MOV64_IMM(BPF_REG_0, 0),
1115+
BPF_EXIT_INSN(),
1116+
},
1117+
.result = ACCEPT,
1118+
.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1119+
},
10601120
{
10611121
"check wire_len is not readable by sockets",
10621122
.insns = {

0 commit comments

Comments
 (0)