diff options
| author | Mark Brown <broonie@kernel.org> | 2020-12-11 17:47:55 +0000 | 
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2020-12-11 17:47:55 +0000 | 
| commit | 031616c434db05ce766f76c62865f55698e0924f (patch) | |
| tree | 7f29aa1ff3e7b51a8058cd570fb785c6e769b245 /tools/testing/selftests/bpf/progs/test_pkt_access.c | |
| parent | 064841ccfc49b2315dc0b797239862d3a343aa07 (diff) | |
| parent | 85a7555575a0e48f9b73db310d0d762a08a46d63 (diff) | |
Merge remote-tracking branch 'asoc/for-5.10' into asoc-linus
Diffstat (limited to 'tools/testing/selftests/bpf/progs/test_pkt_access.c')
| -rw-r--r-- | tools/testing/selftests/bpf/progs/test_pkt_access.c | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/progs/test_pkt_access.c b/tools/testing/selftests/bpf/progs/test_pkt_access.c index e72eba4a93d2..852051064507 100644 --- a/tools/testing/selftests/bpf/progs/test_pkt_access.c +++ b/tools/testing/selftests/bpf/progs/test_pkt_access.c @@ -79,6 +79,24 @@ int get_skb_ifindex(int val, struct __sk_buff *skb, int var)  	return skb->ifindex * val * var;  } +__attribute__ ((noinline)) +int test_pkt_write_access_subprog(struct __sk_buff *skb, __u32 off) +{ +	void *data = (void *)(long)skb->data; +	void *data_end = (void *)(long)skb->data_end; +	struct tcphdr *tcp = NULL; + +	if (off > sizeof(struct ethhdr) + sizeof(struct ipv6hdr)) +		return -1; + +	tcp = data + off; +	if (tcp + 1 > data_end) +		return -1; +	/* make modification to the packet data */ +	tcp->check++; +	return 0; +} +  SEC("classifier/test_pkt_access")  int test_pkt_access(struct __sk_buff *skb)  { @@ -117,6 +135,8 @@ int test_pkt_access(struct __sk_buff *skb)  	if (test_pkt_access_subprog3(3, skb) != skb->len * 3 * skb->ifindex)  		return TC_ACT_SHOT;  	if (tcp) { +		if (test_pkt_write_access_subprog(skb, (void *)tcp - data)) +			return TC_ACT_SHOT;  		if (((void *)(tcp) + 20) > data_end || proto != 6)  			return TC_ACT_SHOT;  		barrier(); /* to force ordering of checks */  | 
