-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsockmap_redirect.c
More file actions
59 lines (50 loc) · 1.51 KB
/
Copy pathsockmap_redirect.c
File metadata and controls
59 lines (50 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <linux/bpf.h>
#include <sys/socket.h>
#include <bpf/bpf_endian.h>
#include <bpf/bpf_helpers.h>
/* Map local port in host byte order to target socket */
struct {
__uint(type, BPF_MAP_TYPE_SOCKHASH);
__uint(max_entries, 1024);
__type(key, __u32);
__type(value, __u64);
} sock_map SEC(".maps");
char _license[] SEC("license") = "GPL";
SEC("sk_msg")
int sk_msg_prog(struct sk_msg_md *msg)
{
__u32 lport = msg->local_port;
__u32 rport = msg->remote_port;
bpf_printk("SK_MSG: redirecting from local_port=%u remote_port=%u", lport, rport);
// Try to redirect based on local port
int ret = bpf_msg_redirect_hash(msg, &sock_map, &lport, BPF_F_INGRESS);
if (ret != SK_PASS) {
bpf_printk("SK_MSG: redirect failed, ret=%d", ret);
}
return ret;
}
SEC("sockops")
int sockops_prog(struct bpf_sock_ops *ctx)
{
__u32 lport = ctx->local_port;
__u32 rport = bpf_ntohl(ctx->remote_port);
__u64 cookie = bpf_get_socket_cookie(ctx);
switch (ctx->op) {
case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB:
bpf_printk("SOCKOPS: ACTIVE_ESTABLISHED lport=%u rport=%u cookie=%lx",
lport, rport, cookie);
bpf_sock_hash_update(ctx, &sock_map, &lport, BPF_ANY);
break;
case BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB:
bpf_printk("SOCKOPS: PASSIVE_ESTABLISHED lport=%u rport=%u cookie=%lx",
lport, rport, cookie);
bpf_sock_hash_update(ctx, &sock_map, &lport, BPF_ANY);
break;
case BPF_SOCK_OPS_STATE_CB:
if (ctx->args[1] == BPF_TCP_CLOSE) {
bpf_printk("SOCKOPS: TCP_CLOSE lport=%u", lport);
}
break;
}
return SK_PASS;
}