forked from torvalds/linux
-
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: Rewrite test_sock_addr bind bpf into C
I'm planning to extend it in the next patches. It's much easier to work with C than BPF assembly. Signed-off-by: Stanislav Fomichev <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]> Acked-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
- Loading branch information
Showing
3 changed files
with
171 additions
and
184 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
#include <string.h> | ||
|
||
#include <linux/stddef.h> | ||
#include <linux/bpf.h> | ||
#include <linux/in.h> | ||
#include <linux/in6.h> | ||
#include <sys/socket.h> | ||
#include <netinet/tcp.h> | ||
#include <linux/if.h> | ||
#include <errno.h> | ||
|
||
#include <bpf/bpf_helpers.h> | ||
#include <bpf/bpf_endian.h> | ||
|
||
#define SERV4_IP 0xc0a801feU /* 192.168.1.254 */ | ||
#define SERV4_PORT 4040 | ||
#define SERV4_REWRITE_IP 0x7f000001U /* 127.0.0.1 */ | ||
#define SERV4_REWRITE_PORT 4444 | ||
|
||
SEC("cgroup/bind4") | ||
int bind_v4_prog(struct bpf_sock_addr *ctx) | ||
{ | ||
struct bpf_sock *sk; | ||
__u32 user_ip4; | ||
__u16 user_port; | ||
|
||
sk = ctx->sk; | ||
if (!sk) | ||
return 0; | ||
|
||
if (sk->family != AF_INET) | ||
return 0; | ||
|
||
if (ctx->type != SOCK_STREAM && ctx->type != SOCK_DGRAM) | ||
return 0; | ||
|
||
if (ctx->user_ip4 != bpf_htonl(SERV4_IP) || | ||
ctx->user_port != bpf_htons(SERV4_PORT)) | ||
return 0; | ||
|
||
// u8 narrow loads: | ||
user_ip4 = 0; | ||
user_ip4 |= ((volatile __u8 *)&ctx->user_ip4)[0] << 0; | ||
user_ip4 |= ((volatile __u8 *)&ctx->user_ip4)[1] << 8; | ||
user_ip4 |= ((volatile __u8 *)&ctx->user_ip4)[2] << 16; | ||
user_ip4 |= ((volatile __u8 *)&ctx->user_ip4)[3] << 24; | ||
if (ctx->user_ip4 != user_ip4) | ||
return 0; | ||
|
||
user_port = 0; | ||
user_port |= ((volatile __u8 *)&ctx->user_port)[0] << 0; | ||
user_port |= ((volatile __u8 *)&ctx->user_port)[1] << 8; | ||
if (ctx->user_port != user_port) | ||
return 0; | ||
|
||
// u16 narrow loads: | ||
user_ip4 = 0; | ||
user_ip4 |= ((volatile __u16 *)&ctx->user_ip4)[0] << 0; | ||
user_ip4 |= ((volatile __u16 *)&ctx->user_ip4)[1] << 16; | ||
if (ctx->user_ip4 != user_ip4) | ||
return 0; | ||
|
||
ctx->user_ip4 = bpf_htonl(SERV4_REWRITE_IP); | ||
ctx->user_port = bpf_htons(SERV4_REWRITE_PORT); | ||
|
||
return 1; | ||
} | ||
|
||
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,88 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
#include <string.h> | ||
|
||
#include <linux/stddef.h> | ||
#include <linux/bpf.h> | ||
#include <linux/in.h> | ||
#include <linux/in6.h> | ||
#include <sys/socket.h> | ||
#include <netinet/tcp.h> | ||
#include <linux/if.h> | ||
#include <errno.h> | ||
|
||
#include <bpf/bpf_helpers.h> | ||
#include <bpf/bpf_endian.h> | ||
|
||
#define SERV6_IP_0 0xfaceb00c /* face:b00c:1234:5678::abcd */ | ||
#define SERV6_IP_1 0x12345678 | ||
#define SERV6_IP_2 0x00000000 | ||
#define SERV6_IP_3 0x0000abcd | ||
#define SERV6_PORT 6060 | ||
#define SERV6_REWRITE_IP_0 0x00000000 | ||
#define SERV6_REWRITE_IP_1 0x00000000 | ||
#define SERV6_REWRITE_IP_2 0x00000000 | ||
#define SERV6_REWRITE_IP_3 0x00000001 | ||
#define SERV6_REWRITE_PORT 6666 | ||
|
||
SEC("cgroup/bind6") | ||
int bind_v6_prog(struct bpf_sock_addr *ctx) | ||
{ | ||
struct bpf_sock *sk; | ||
__u32 user_ip6; | ||
__u16 user_port; | ||
int i; | ||
|
||
sk = ctx->sk; | ||
if (!sk) | ||
return 0; | ||
|
||
if (sk->family != AF_INET6) | ||
return 0; | ||
|
||
if (ctx->type != SOCK_STREAM && ctx->type != SOCK_DGRAM) | ||
return 0; | ||
|
||
if (ctx->user_ip6[0] != bpf_htonl(SERV6_IP_0) || | ||
ctx->user_ip6[1] != bpf_htonl(SERV6_IP_1) || | ||
ctx->user_ip6[2] != bpf_htonl(SERV6_IP_2) || | ||
ctx->user_ip6[3] != bpf_htonl(SERV6_IP_3) || | ||
ctx->user_port != bpf_htons(SERV6_PORT)) | ||
return 0; | ||
|
||
// u8 narrow loads: | ||
for (i = 0; i < 4; i++) { | ||
user_ip6 = 0; | ||
user_ip6 |= ((volatile __u8 *)&ctx->user_ip6[i])[0] << 0; | ||
user_ip6 |= ((volatile __u8 *)&ctx->user_ip6[i])[1] << 8; | ||
user_ip6 |= ((volatile __u8 *)&ctx->user_ip6[i])[2] << 16; | ||
user_ip6 |= ((volatile __u8 *)&ctx->user_ip6[i])[3] << 24; | ||
if (ctx->user_ip6[i] != user_ip6) | ||
return 0; | ||
} | ||
|
||
user_port = 0; | ||
user_port |= ((volatile __u8 *)&ctx->user_port)[0] << 0; | ||
user_port |= ((volatile __u8 *)&ctx->user_port)[1] << 8; | ||
if (ctx->user_port != user_port) | ||
return 0; | ||
|
||
// u16 narrow loads: | ||
for (i = 0; i < 4; i++) { | ||
user_ip6 = 0; | ||
user_ip6 |= ((volatile __u16 *)&ctx->user_ip6[i])[0] << 0; | ||
user_ip6 |= ((volatile __u16 *)&ctx->user_ip6[i])[1] << 16; | ||
if (ctx->user_ip6[i] != user_ip6) | ||
return 0; | ||
} | ||
|
||
ctx->user_ip6[0] = bpf_htonl(SERV6_REWRITE_IP_0); | ||
ctx->user_ip6[1] = bpf_htonl(SERV6_REWRITE_IP_1); | ||
ctx->user_ip6[2] = bpf_htonl(SERV6_REWRITE_IP_2); | ||
ctx->user_ip6[3] = bpf_htonl(SERV6_REWRITE_IP_3); | ||
ctx->user_port = bpf_htons(SERV6_REWRITE_PORT); | ||
|
||
return 1; | ||
} | ||
|
||
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