-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests: bpf: Test sockmap update from BPF
Add a test which copies a socket from a sockmap into another sockmap or sockhash. This excercises bpf_map_update_elem support from BPF context. Compare the socket cookies from source and destination to ensure that the copy succeeded. Also check that the verifier rejects map_update from unsafe contexts. Signed-off-by: Lorenz Bauer <lmb@cloudflare.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20200821102948.21918-7-lmb@cloudflare.com
- Loading branch information
Lorenz Bauer
authored and
Alexei Starovoitov
committed
Aug 21, 2020
1 parent
0126240
commit bb23c0e
Showing
3 changed files
with
149 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
23 changes: 23 additions & 0 deletions
23
tools/testing/selftests/bpf/progs/test_sockmap_invalid_update.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// Copyright (c) 2020 Cloudflare | ||
#include "vmlinux.h" | ||
#include <bpf/bpf_helpers.h> | ||
|
||
struct { | ||
__uint(type, BPF_MAP_TYPE_SOCKMAP); | ||
__uint(max_entries, 1); | ||
__type(key, __u32); | ||
__type(value, __u64); | ||
} map SEC(".maps"); | ||
|
||
SEC("sockops") | ||
int bpf_sockmap(struct bpf_sock_ops *skops) | ||
{ | ||
__u32 key = 0; | ||
|
||
if (skops->sk) | ||
bpf_map_update_elem(&map, &key, skops->sk, 0); | ||
return 0; | ||
} | ||
|
||
char _license[] SEC("license") = "GPL"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// Copyright (c) 2020 Cloudflare | ||
#include "vmlinux.h" | ||
#include <bpf/bpf_helpers.h> | ||
|
||
struct { | ||
__uint(type, BPF_MAP_TYPE_SOCKMAP); | ||
__uint(max_entries, 1); | ||
__type(key, __u32); | ||
__type(value, __u64); | ||
} src SEC(".maps"); | ||
|
||
struct { | ||
__uint(type, BPF_MAP_TYPE_SOCKMAP); | ||
__uint(max_entries, 1); | ||
__type(key, __u32); | ||
__type(value, __u64); | ||
} dst_sock_map SEC(".maps"); | ||
|
||
struct { | ||
__uint(type, BPF_MAP_TYPE_SOCKHASH); | ||
__uint(max_entries, 1); | ||
__type(key, __u32); | ||
__type(value, __u64); | ||
} dst_sock_hash SEC(".maps"); | ||
|
||
SEC("classifier/copy_sock_map") | ||
int copy_sock_map(void *ctx) | ||
{ | ||
struct bpf_sock *sk; | ||
bool failed = false; | ||
__u32 key = 0; | ||
|
||
sk = bpf_map_lookup_elem(&src, &key); | ||
if (!sk) | ||
return SK_DROP; | ||
|
||
if (bpf_map_update_elem(&dst_sock_map, &key, sk, 0)) | ||
failed = true; | ||
|
||
if (bpf_map_update_elem(&dst_sock_hash, &key, sk, 0)) | ||
failed = true; | ||
|
||
bpf_sk_release(sk); | ||
return failed ? SK_DROP : SK_PASS; | ||
} | ||
|
||
char _license[] SEC("license") = "GPL"; |