Skip to content

Commit 69d86e6

Browse files
author
lec-bit
committed
tmp
Signed-off-by: lec-bit <glfhzmy@126.com>
1 parent 66d588b commit 69d86e6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1622
-35
lines changed

bpf/include/bpf_common.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ struct {
100100
__uint(map_flags, BPF_F_NO_PREALLOC);
101101
} map_of_orig_dst SEC(".maps");
102102

103+
struct {
104+
__uint(type, BPF_MAP_TYPE_HASH);
105+
__type(key, __u64);
106+
__type(value, struct bpf_sock);
107+
__uint(max_entries, MAP_SIZE_OF_DSTINFO);
108+
__uint(map_flags, BPF_F_NO_PREALLOC);
109+
} map_of_pid_dst SEC(".maps");
110+
103111
/*
104112
* From v5.4, bpf_get_netns_cookie can be called for bpf cgroup hooks, from v5.15, it can be called for bpf sockops
105113
* hook. Therefore, ensure that function is correctly used.

bpf/include/map_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
#define map_of_nodeinfo km_nodeinfo
1313
#define map_of_tcp_probe km_tcp_probe
1414
#define map_of_orig_dst km_orig_dst
15+
#define map_of_pid_dst km_pid_dst
1516

1617
#endif // _MAP_CONFIG_H_

bpf/kmesh/ads/cgroup_sock.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ static inline int sock4_traffic_control(struct bpf_sock_addr *ctx)
5959
return 0;
6060
}
6161

62+
void manage_pid_sk(struct bpf_sock *sk){
63+
int pid_tgid = bpf_get_current_pid_tgid();
64+
bpf_printk("pid_tgid:%d\n", pid_tgid);
65+
int ret = bpf_map_update_elem(&map_of_pid_dst, &pid_tgid, sk, BPF_ANY);
66+
if (ret != 0) {
67+
BPF_LOG(ERR, KMESH, "manage_pid_sk failed\n");
68+
}
69+
}
70+
6271
SEC("cgroup/connect4")
6372
int cgroup_connect4_prog(struct bpf_sock_addr *ctx)
6473
{
@@ -71,6 +80,7 @@ int cgroup_connect4_prog(struct bpf_sock_addr *ctx)
7180
if (handle_kmesh_manage_process(&kmesh_ctx) || !is_kmesh_enabled(ctx)) {
7281
return CGROUP_SOCK_OK;
7382
}
83+
manage_pid_sk(ctx->sk);
7484
observe_on_pre_connect(ctx->sk);
7585
int ret = sock4_traffic_control(ctx);
7686

bpf/kmesh/ads/sockops.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,30 @@
1010
#if KMESH_ENABLE_IPV4
1111
#if KMESH_ENABLE_HTTP
1212

13+
void delete_manage_pid_sk(struct bpf_sock *sk){
14+
if (!is_monitoring_enable()) {
15+
return;
16+
}
17+
18+
struct bpf_tcp_sock *tcp_sock = NULL;
19+
struct sock_storage_data *storage = NULL;
20+
21+
if (!sk)
22+
return;
23+
storage = bpf_sk_storage_get(&map_of_sock_storage, sk, 0, BPF_LOCAL_STORAGE_GET_F_CREATE);
24+
if (!storage) {
25+
BPF_LOG(ERR, PROBE, "on connect: bpf_sk_storage_get failed\n");
26+
return;
27+
}
28+
29+
int pid_tgid = storage->pid_tgid;
30+
bpf_printk("pid_tgid:%d\n", pid_tgid);
31+
int ret = bpf_map_delete_elem(&map_of_pid_dst, &pid_tgid);
32+
if (ret != 0) {
33+
BPF_LOG(ERR, KMESH, "manage_pid_sk failed\n");
34+
}
35+
}
36+
1337
SEC("sockops")
1438
int sockops_prog(struct bpf_sock_ops *skops)
1539
{
@@ -43,6 +67,7 @@ int sockops_prog(struct bpf_sock_ops *skops)
4367
break;
4468
case BPF_SOCK_OPS_STATE_CB:
4569
if (skops->args[1] == BPF_TCP_CLOSE) {
70+
delete_manage_pid_sk(skops->sk);
4671
observe_on_close(skops->sk);
4772
on_cluster_sock_close(skops);
4873
}

bpf/kmesh/ads/tracepoint.c

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
#include "bpf_log.h"
2+
#include "bpf_common.h"
3+
#include <bpf/bpf_helpers.h>
4+
#include <bpf/bpf_tracing.h>
5+
#include <bpf/bpf_core_read.h>
6+
7+
#define MAX_IOVEC 4
8+
#define __MAX_CONCURRENCY 1000
9+
#define INT_LEN 32
10+
11+
// direction
12+
enum {
13+
INVALID_DIRECTION = 0,
14+
INBOUND = 1,
15+
OUTBOUND = 2,
16+
};
17+
18+
typedef __u64 conn_ctx_t; // pid & tgid
19+
20+
struct user_msghdr {
21+
void *msg_name;
22+
int msg_namelen;
23+
struct iovec *msg_iov;
24+
__kernel_size_t msg_iovlen;
25+
void *msg_control;
26+
__kernel_size_t msg_controllen;
27+
unsigned int msg_flags;
28+
};
29+
30+
struct sys_enter_sendmsg_args {
31+
unsigned long long __unused__;
32+
long __syscall_nr;
33+
int fd;
34+
struct user_msghdr *msg;
35+
unsigned int flags;
36+
};
37+
38+
struct sys_connect_args_s {
39+
int fd;
40+
const struct sockaddr* addr;
41+
};
42+
43+
struct {
44+
__uint(type, BPF_MAP_TYPE_RINGBUF);
45+
__uint(max_entries, 256 * 1024 /* 256 KB */);
46+
} map_of_http_probe SEC(".maps");
47+
48+
struct http_probe_info {
49+
// For sendmsg()/recvmsg()/writev()/readv().
50+
__u32 type;
51+
struct bpf_sock_tuple tuple;
52+
uintptr_t iov;
53+
char dst_svc_name[BPF_DATA_MAX_LEN];
54+
55+
// unsigned int iovlen;
56+
// unsigned int iovlen2;
57+
};
58+
59+
static inline void construct_tuple(struct bpf_sock *sk, struct bpf_sock_tuple *tuple, __u8 direction)
60+
{
61+
if (direction == OUTBOUND) {
62+
if (sk->family == AF_INET) {
63+
tuple->ipv4.saddr = sk->src_ip4;
64+
tuple->ipv4.daddr = sk->dst_ip4;
65+
tuple->ipv4.sport = sk->src_port;
66+
tuple->ipv4.dport = bpf_ntohs(sk->dst_port);
67+
}
68+
if (sk->family == AF_INET6) {
69+
bpf_memcpy(tuple->ipv6.saddr, sk->src_ip6, IPV6_ADDR_LEN);
70+
bpf_memcpy(tuple->ipv6.daddr, sk->dst_ip6, IPV6_ADDR_LEN);
71+
tuple->ipv6.sport = sk->src_port;
72+
tuple->ipv6.dport = bpf_ntohs(sk->dst_port);
73+
}
74+
}
75+
if (direction == INBOUND) {
76+
if (sk->family == AF_INET) {
77+
tuple->ipv4.daddr = sk->src_ip4;
78+
tuple->ipv4.saddr = sk->dst_ip4;
79+
tuple->ipv4.dport = sk->src_port;
80+
tuple->ipv4.sport = bpf_ntohs(sk->dst_port);
81+
}
82+
if (sk->family == AF_INET6) {
83+
bpf_memcpy(tuple->ipv6.saddr, sk->dst_ip6, IPV6_ADDR_LEN);
84+
bpf_memcpy(tuple->ipv6.daddr, sk->src_ip6, IPV6_ADDR_LEN);
85+
tuple->ipv6.dport = sk->src_port;
86+
tuple->ipv6.sport = bpf_ntohs(sk->dst_port);
87+
}
88+
}
89+
90+
if (is_ipv4_mapped_addr(tuple->ipv6.daddr)) {
91+
tuple->ipv4.saddr = tuple->ipv6.saddr[3];
92+
tuple->ipv4.daddr = tuple->ipv6.daddr[3];
93+
tuple->ipv4.sport = tuple->ipv6.sport;
94+
tuple->ipv4.dport = tuple->ipv6.dport;
95+
}
96+
97+
return;
98+
}
99+
100+
// 1.根据pid_tgid查找map,获得sk
101+
// 2.根据sk查找map,获得其他信息
102+
// 3.将信息整合上报
103+
SEC("tracepoint/syscalls/sys_enter_sendmsg")
104+
int sendmsg_entry(struct sys_enter_sendmsg_args *ctx) {
105+
106+
struct bpf_tcp_sock *tcp_sock = NULL;
107+
struct sock_storage_data *storage = NULL;
108+
conn_ctx_t id = bpf_get_current_pid_tgid();
109+
int proc_id = (int)(id >> INT_LEN);
110+
111+
struct bpf_sock *sk = bpf_map_lookup_elem(&map_of_pid_dst, &id);
112+
if (sk == NULL) {
113+
bpf_printk("bpf_map_lookup_elem map_of_pid_dst failed!\n");
114+
return 1;
115+
//BPF_LOG(ERR, TRACEPOINT, "bpf_map_lookup_elem map_of_pid_dst failed!\n");
116+
}
117+
118+
storage = bpf_sk_storage_get(&map_of_sock_storage, sk, 0, BPF_LOCAL_STORAGE_GET_F_CREATE);
119+
if (!storage) {
120+
bpf_printk("sendmsg_entry bpf_sk_storage_get failed!\n");
121+
//BPF_LOG(ERR, PROBE, "pre_connect bpf_sk_storage_get failed\n");
122+
return 1;
123+
}
124+
125+
struct http_probe_info *info = bpf_ringbuf_reserve(&map_of_http_probe, sizeof(struct http_probe_info), 0);
126+
tcp_sock = bpf_tcp_sock(sk);
127+
if (!tcp_sock)
128+
return 1;
129+
construct_tuple(sk, &info->tuple, storage->direction);
130+
bpf_strncpy(storage->dst_svc_name, sizeof(storage->dst_svc_name), info->dst_svc_name);
131+
132+
int fd = ctx->fd;
133+
struct user_msghdr *msg = ctx->msg;
134+
void * msg_name = BPF_CORE_READ_USER(msg, msg_name);
135+
struct iovec* iov = BPF_CORE_READ_USER(msg, msg_iov);
136+
size_t iovlen = BPF_CORE_READ_USER(msg, msg_iovlen);
137+
bpf_printk("sys_enter_sendmsg\n");
138+
139+
if (msg_name) {
140+
struct sys_connect_args_s args = {0};
141+
args.fd = fd;
142+
args.addr = msg_name;
143+
bpf_printk("SENDMSG msg_name =%s \n", args.addr->sa_data);
144+
}
145+
146+
info->iov = (uintptr_t)iov;
147+
148+
// bpf_ringbuf_submit
149+
bpf_ringbuf_submit(info, 0);
150+
bpf_printk("SENDMSG msg_name =%s iov_len:%u\n", msg_name, iovlen);
151+
return 0;
152+
}
153+
154+
char _license[] SEC("license") = "GPL";

bpf/kmesh/bpf2go/bpf2go.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package bpf2go
2121
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir kernelnative/$ENHANCED_KERNEL --go-package $ENHANCED_KERNEL -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshCgroupSock ../ads/cgroup_sock.c -- -I../ads/include -I../../include -I../../../api/v2-c -I../probes -DCGROUP_SOCK_MANAGE -DKERNEL_VERSION_HIGHER_5_13_0=1
2222
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir dualengine --go-package dualengine -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshCgroupSockWorkload ../workload/cgroup_sock.c -- -I../workload/include -I../../include -I../probes -DKERNEL_VERSION_HIGHER_5_13_0=1
2323
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir kernelnative/$ENHANCED_KERNEL --go-package $ENHANCED_KERNEL -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshSockops ../ads/sockops.c -- -I../ads/include -I../../include -I../../../api/v2-c -I../probes -DKERNEL_VERSION_HIGHER_5_13_0=1
24+
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir kernelnative/$ENHANCED_KERNEL --go-package $ENHANCED_KERNEL -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshTracepoint ../ads/tracepoint.c -- -I../ads/include -I../../include -I../../../api/v2-c -I../probes -DKERNEL_VERSION_HIGHER_5_13_0=1
2425
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir dualengine --go-package dualengine -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshSockopsWorkload ../workload/sockops.c -- -I../workload/include -I../../include -I../probes -DKERNEL_VERSION_HIGHER_5_13_0=1
2526
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir dualengine --go-package dualengine -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshXDPAuth ../workload/xdp.c -- -I../workload/include -I../../include -I../../../api/v2-c -DKERNEL_VERSION_HIGHER_5_13_0=1
2627
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir dualengine --go-package dualengine -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshSendmsg ../workload/sendmsg.c -- -I../workload/include -I../../include -DKERNEL_VERSION_HIGHER_5_13_0=1
@@ -30,6 +31,7 @@ package bpf2go
3031
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir kernelnative/$ENHANCED_KERNEL --go-package $ENHANCED_KERNEL -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshCgroupSockCompat ../ads/cgroup_sock.c -- -I../ads/include -I../../include -I../../../api/v2-c -I../probes -DCGROUP_SOCK_MANAGE -DKERNEL_VERSION_HIGHER_5_13_0=0
3132
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir dualengine --go-package dualengine -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshCgroupSockWorkloadCompat ../workload/cgroup_sock.c -- -I../workload/include -I../../include -I../probes -DKERNEL_VERSION_HIGHER_5_13_0=0
3233
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir kernelnative/$ENHANCED_KERNEL --go-package $ENHANCED_KERNEL -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshSockopsCompat ../ads/sockops.c -- -I../ads/include -I../../include -I../../../api/v2-c -I../probes -DKERNEL_VERSION_HIGHER_5_13_0=0
34+
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir kernelnative/$ENHANCED_KERNEL --go-package $ENHANCED_KERNEL -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshTracepoint ../ads/tracepoint.c -- -I../ads/include -I../../include -I../../../api/v2-c -I../probes -DKERNEL_VERSION_HIGHER_5_13_0=0
3335
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir dualengine --go-package dualengine -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshSockopsWorkloadCompat ../workload/sockops.c -- -I../workload/include -I../../include -I../probes -DKERNEL_VERSION_HIGHER_5_13_0=0
3436
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir dualengine --go-package dualengine -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshXDPAuthCompat ../workload/xdp.c -- -I../workload/include -I../../include -I../../../api/v2-c -DKERNEL_VERSION_HIGHER_5_13_0=0
3537
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go --output-dir dualengine --go-package dualengine -cc clang --cflags $EXTRA_CFLAGS --cflags $EXTRA_CDEFINE KmeshSendmsgCompat ../workload/sendmsg.c -- -I../workload/include -I../../include -DKERNEL_VERSION_HIGHER_5_13_0=0

bpf/kmesh/bpf2go/dualengine/kmeshcgroupsockworkload_bpfeb.go

Lines changed: 23 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bpf/kmesh/bpf2go/dualengine/kmeshcgroupsockworkload_bpfel.go

Lines changed: 23 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)