This is an automated email from the ASF dual-hosted git repository.
liuhan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-rover.git
The following commit(s) were added to refs/heads/main by this push:
new 6997e66 Fix context structs parameters for tracepoint programs (#157)
6997e66 is described below
commit 6997e660af50f5a74d14e9a468fb3b0f962b002b
Author: david <[email protected]>
AuthorDate: Thu Nov 21 13:06:11 2024 +0800
Fix context structs parameters for tracepoint programs (#157)
---
bpf/accesslog/l24/read_l2.c | 11 ++-
bpf/accesslog/l24/write_l2.c | 27 ++---
bpf/accesslog/l24/write_l4.c | 15 ++-
bpf/accesslog/process/process.c | 20 ++--
bpf/accesslog/syscalls/close.c | 21 +---
bpf/accesslog/syscalls/connect.c | 42 ++------
bpf/accesslog/syscalls/transfer.c | 203 ++++++++++++--------------------------
bpf/include/api.h | 17 ++++
8 files changed, 127 insertions(+), 229 deletions(-)
diff --git a/bpf/accesslog/l24/read_l2.c b/bpf/accesslog/l24/read_l2.c
index 0896eeb..e05bd7b 100644
--- a/bpf/accesslog/l24/read_l2.c
+++ b/bpf/accesslog/l24/read_l2.c
@@ -17,14 +17,15 @@
#include "l24.h"
#include "../common/data_args.h"
+#include "api.h"
-struct netif_receive_skb {
- unsigned long long pad;
- void * skbaddr;
-};
+struct trace_event_raw_net_dev_template {
+ struct trace_entry ent;
+ void *skbaddr;
+} __attribute__((preserve_access_index)) ;
SEC("tracepoint/net/netif_receive_skb")
-int tracepoint_netif_receive_skb(struct netif_receive_skb *ctx) {
+int tracepoint_netif_receive_skb(struct trace_event_raw_net_dev_template *ctx)
{
struct sk_buff * skb = (struct sk_buff *)ctx->skbaddr;
struct net_device *device = _(skb->dev);
diff --git a/bpf/accesslog/l24/write_l2.c b/bpf/accesslog/l24/write_l2.c
index 2f477df..094be3a 100644
--- a/bpf/accesslog/l24/write_l2.c
+++ b/bpf/accesslog/l24/write_l2.c
@@ -18,18 +18,19 @@
#include "l24.h"
#include "../common/data_args.h"
-struct net_dev_start_xmit_args {
- unsigned long pad0;
- unsigned long pad1;
+struct trace_event_raw_net_dev_start_xmit {
+ struct trace_entry ent;
+ __u32 __data_loc_name;
+ __u16 queue_mapping;
+ const void *skbaddr;
+} __attribute__((aligned(8))) __attribute__((preserve_access_index)) ;
- void *skb;
-};
-struct net_dev_xmit_args {
- unsigned long pad0;
+struct trace_event_raw_net_dev_xmit {
+ struct trace_entry ent;
+ void *skbaddr;
+} __attribute__((preserve_access_index));
- void *skb;
-};
SEC("kprobe/__dev_queue_xmit")
int dev_queue_emit(struct pt_regs * ctx){
@@ -52,8 +53,8 @@ int dev_queue_emit_ret(struct pt_regs * ctx){
}
SEC("tracepoint/net/net_dev_start_xmit")
-int tracepoint_net_dev_start_xmit(struct net_dev_start_xmit_args *args) {
- struct sk_buff * skb = args->skb;
+int tracepoint_net_dev_start_xmit(struct trace_event_raw_net_dev_start_xmit
*args) {
+ struct sk_buff * skb = (struct sk_buff *)args->skbaddr;
struct skb_transmit_detail *detail =
bpf_map_lookup_elem(&sk_buff_transmit_detail_map, &skb);
if (detail != NULL) {
detail->l2_start_xmit_time = bpf_ktime_get_ns();
@@ -62,8 +63,8 @@ int tracepoint_net_dev_start_xmit(struct
net_dev_start_xmit_args *args) {
}
SEC("tracepoint/net/net_dev_xmit")
-int tracepoint_net_dev_xmit(struct net_dev_xmit_args *args) {
- struct sk_buff * skb = args->skb;
+int tracepoint_net_dev_xmit(struct trace_event_raw_net_dev_xmit *args) {
+ struct sk_buff * skb = (struct sk_buff *)args->skbaddr;
struct skb_transmit_detail *detail =
bpf_map_lookup_elem(&sk_buff_transmit_detail_map, &skb);
if (detail != NULL) {
detail->l2_finish_xmit_time = bpf_ktime_get_ns();
diff --git a/bpf/accesslog/l24/write_l4.c b/bpf/accesslog/l24/write_l4.c
index c38ecc6..2d0a1a7 100644
--- a/bpf/accesslog/l24/write_l4.c
+++ b/bpf/accesslog/l24/write_l4.c
@@ -19,12 +19,11 @@
#include "../common/data_args.h"
#include "../common/sock.h"
-struct kfree_skb_args {
- unsigned long pad;
-
- void *skb;
- void *location;
-};
+struct trace_event_raw_kfree_skb {
+ struct trace_entry ent;
+ void *skbaddr;
+ void *location;
+} __attribute__((preserve_access_index));
SEC("kprobe/tcp_sendmsg")
int tcp_sendmsg(struct pt_regs* ctx) {
@@ -83,8 +82,8 @@ int tracepoint_tcp_retransmit_skb() {
}
SEC("tracepoint/skb/kfree_skb")
-int kfree_skb(struct kfree_skb_args *args) {
- struct sk_buff *skb = args->skb;
+int kfree_skb(struct trace_event_raw_kfree_skb *args) {
+ struct sk_buff *skb = (struct sk_buff *)args->skbaddr;
if (skb == NULL) {
return 0;
}
diff --git a/bpf/accesslog/process/process.c b/bpf/accesslog/process/process.c
index 7ad6723..ae58740 100644
--- a/bpf/accesslog/process/process.c
+++ b/bpf/accesslog/process/process.c
@@ -26,19 +26,17 @@ struct process_execute_event {
__u32 pid;
};
-struct sched_comm_fork_ctx {
- unsigned short common_type;
- unsigned char common_flags;
- unsigned char common_preempt_count;
- int common_pid;
- char parent_comm[16];
- pid_t parent_pid;
- char child_comm[16];
- pid_t child_pid;
-};
+struct trace_event_raw_sched_process_fork {
+ struct trace_entry ent;
+ char parent_comm[16];
+ __u32 parent_pid;
+ char child_comm[16];
+ __u32 child_pid;
+ char __data[0];
+} __attribute__((preserve_access_index)) ;
SEC("tracepoint/sched/sched_process_fork")
-int tracepoint_sched_process_fork(struct sched_comm_fork_ctx* ctx) {
+int tracepoint_sched_process_fork(struct trace_event_raw_sched_process_fork*
ctx) {
__u32 tgid = ctx->parent_pid;
// adding to the monitor
__u32 v = 1;
diff --git a/bpf/accesslog/syscalls/close.c b/bpf/accesslog/syscalls/close.c
index d4539c6..a1bc953 100644
--- a/bpf/accesslog/syscalls/close.c
+++ b/bpf/accesslog/syscalls/close.c
@@ -21,19 +21,6 @@
#include "../process/process.h"
#include "../common/connection.h"
-struct trace_point_enter_close {
- __u64 pad_0;
- int __syscall_nr;
- __u32 pad_1;
- int fd;
-};
-struct trace_point_exit_close {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- __u64 ret;
-};
-
static __inline void process_close_sock(void* ctx, __u64 id, struct
sock_close_args_t *args, int ret) {
__u32 tgid = (__u32)(id >> 32);
if (args->fd < 0) {
@@ -44,25 +31,25 @@ static __inline void process_close_sock(void* ctx, __u64
id, struct sock_close_a
}
SEC("tracepoint/syscalls/sys_enter_close")
-int tracepoint_enter_close(struct trace_point_enter_close *ctx) {
+int tracepoint_enter_close(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
struct sock_close_args_t close_args = {};
- close_args.fd = ctx->fd;
+ close_args.fd = (__u32)ctx->args[0];
close_args.start_nacs = bpf_ktime_get_ns();
bpf_map_update_elem(&closing_args, &id, &close_args, 0);
return 0;
}
SEC("tracepoint/syscalls/sys_exit_close")
-int tracepoint_exit_close(struct trace_point_exit_close *ctx) {
+int tracepoint_exit_close(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
struct sock_close_args_t *close_args = bpf_map_lookup_elem(&closing_args,
&id);
if (close_args) {
- process_close_sock(ctx, id, close_args, ctx->ret);
+ process_close_sock(ctx, id, close_args, (int)ctx->ret);
}
bpf_map_delete_elem(&closing_args, &id);
diff --git a/bpf/accesslog/syscalls/connect.c b/bpf/accesslog/syscalls/connect.c
index d1441f7..061a4ee 100644
--- a/bpf/accesslog/syscalls/connect.c
+++ b/bpf/accesslog/syscalls/connect.c
@@ -21,34 +21,6 @@
#include "../process/process.h"
#include "../common/connection.h"
-struct trace_point_enter_connect {
- __u64 pad_0;
- int __syscall_nr;
- __u32 pad_1;
- int fd;
- struct sockaddr * uservaddr;
-};
-struct trace_point_exit_connect {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- __u64 ret;
-};
-
-struct trace_point_enter_accept {
- __u64 pad_0;
- int __syscall_nr;
- __u32 pad_1;
- int fd;
- struct sockaddr * upeer_sockaddr;
-};
-struct trace_point_exit_accept {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- long ret;
-};
-
static __inline void process_connect(void *ctx, __u64 id, struct
connect_args_t *connect_args, long ret) {
bool success = true;
if (ret < 0 && ret != -EINPROGRESS) {
@@ -71,22 +43,22 @@ static __inline void process_accept(void *ctx, __u64 id,
struct accept_args_t *a
}
SEC("tracepoint/syscalls/sys_enter_connect")
-int tracepoint_enter_connect(struct trace_point_enter_connect *ctx) {
+int tracepoint_enter_connect(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
struct connect_args_t connect_args = {};
- connect_args.fd = ctx->fd;
- connect_args.addr = ctx->uservaddr;
+ connect_args.fd = (__u32)ctx->args[0];
+ connect_args.addr = (struct sockaddr *)ctx->args[1];
connect_args.start_nacs = bpf_ktime_get_ns();
bpf_map_update_elem(&conecting_args, &id, &connect_args, 0);
return 0;
}
SEC("tracepoint/syscalls/sys_exit_connect")
-int tracepoint_exit_connect(struct trace_point_exit_connect *ctx) {
+int tracepoint_exit_connect(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
struct connect_args_t *connect_args;
@@ -110,21 +82,21 @@ int tcp_connect(struct pt_regs *ctx) {
}
SEC("tracepoint/syscalls/sys_enter_accept")
-int tracepoint_enter_accept(struct trace_point_enter_accept *ctx) {
+int tracepoint_enter_accept(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
struct accept_args_t accept_args = {};
- accept_args.addr = ctx->upeer_sockaddr;
+ accept_args.addr = (struct sockaddr *)ctx->args[1];
accept_args.start_nacs = bpf_ktime_get_ns();
bpf_map_update_elem(&accepting_args, &id, &accept_args, 0);
return 0;
}
SEC("tracepoint/syscalls/sys_exit_accept")
-int tracepoint_exit_accept(struct trace_point_exit_accept *ctx) {
+int tracepoint_exit_accept(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
struct accept_args_t *accept_args = bpf_map_lookup_elem(&accepting_args,
&id);
if (accept_args) {
diff --git a/bpf/accesslog/syscalls/transfer.c
b/bpf/accesslog/syscalls/transfer.c
index f3a2608..bed6be3 100644
--- a/bpf/accesslog/syscalls/transfer.c
+++ b/bpf/accesslog/syscalls/transfer.c
@@ -23,103 +23,26 @@
#include "../l24/l24.h"
#include "transfer.h"
-struct trace_point_common_exit {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- __u64 ret;
-};
-struct trace_point_common_write {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- char * buf;
- size_t count;
-};
-struct trace_point_common_writev {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- struct iovec * vec;
- size_t count;
-};
-struct trace_point_common_readv {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- struct iovec * vec;
- size_t count;
-};
-struct trace_point_common_sendmsg {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- struct user_msghdr * msg;
-};
-struct trace_point_common_sendmmsg {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- struct mmsghdr * mmsg;
- unsigned int vlen;
-};
-struct trace_point_enter_sendto {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- char * buf;
- size_t count;
- unsigned int flags;
- struct sockaddr * addr;
-};
-struct trace_point_enter_recvfrom {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- char * buf;
- size_t count;
- unsigned int flags;
- struct sockaddr * addr;
-};
-struct trace_point_common_recvmsg {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- struct user_msghdr * msg;
-};
-struct trace_point_common_recvmmsg {
- __u64 pad_0;
- __u32 __syscall_nr;
- __u32 pad_1;
- int fd;
- struct mmsghdr * mmsg;
- unsigned int vlen;
-};
-struct trace_point_skb_copy_datagram_iovec {
- __u64 pad_0;
- void *skb;
-};
+
+struct trace_event_raw_skb_copy_datagram_iovec {
+ struct trace_entry ent;
+ const void *skbaddr;
+ int len;
+ char __data[0];
+} __attribute__((preserve_access_index));
#define BPF_PROBE_READ_VAR(value, ptr) bpf_probe_read(&value, sizeof(value),
ptr)
SEC("tracepoint/syscalls/sys_enter_write")
-int tracepoint_enter_write(struct trace_point_common_write *ctx) {
+int tracepoint_enter_write(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
- data_args.buf = ctx->buf;
+ data_args.fd = (__u32)ctx->args[0];
+ data_args.buf = (char *)ctx->args[1];
data_args.start_nacs = bpf_ktime_get_ns();
data_args.data_id = generate_socket_data_id(id, data_args.fd,
SOCKET_OPTS_TYPE_WRITE, false);
bpf_map_update_elem(&socket_data_args, &id, &data_args, 0);
@@ -127,7 +50,7 @@ int tracepoint_enter_write(struct trace_point_common_write
*ctx) {
}
SEC("tracepoint/syscalls/sys_exit_write")
-int tracepoint_exit_write(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_write(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
struct sock_data_args_t *data_args =
bpf_map_lookup_elem(&socket_data_args, &id);
if (data_args && data_args->is_sock_event) {
@@ -140,22 +63,22 @@ int tracepoint_exit_write(struct trace_point_common_exit
*ctx) {
}
SEC("tracepoint/syscalls/sendto")
-int tracepoint_enter_sendto(struct trace_point_enter_sendto *ctx) {
+int tracepoint_enter_sendto(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
- if (ctx->addr != NULL) {
+ if ((struct sockaddr *)ctx->args[4] != NULL) {
struct connect_args_t connect_args = {};
- connect_args.addr = ctx->addr;
- connect_args.fd = ctx->fd;
+ connect_args.addr = (struct sockaddr *)ctx->args[4];
+ connect_args.fd = (__u32)ctx->args[0];
bpf_map_update_elem(&conecting_args, &id, &connect_args, 0);
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
- data_args.buf = ctx->buf;
+ data_args.fd = (__u32)ctx->args[0];
+ data_args.buf = (char *)ctx->args[1];
data_args.start_nacs = bpf_ktime_get_ns();
data_args.data_id = generate_socket_data_id(id, data_args.fd,
SOCKET_OPTS_TYPE_SENDTO, false);
bpf_map_update_elem(&socket_data_args, &id, &data_args, 0);
@@ -163,7 +86,7 @@ int tracepoint_enter_sendto(struct trace_point_enter_sendto
*ctx) {
}
SEC("tracepoint/syscalls/sys_exit_sendto")
-int tracepoint_exit_sendto(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_sendto(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
ssize_t bytes_count = ctx->ret;
@@ -184,16 +107,16 @@ int tracepoint_exit_sendto(struct trace_point_common_exit
*ctx) {
}
SEC("tracepoint/syscalls/sys_enter_writev")
-int tracepoint_enter_writev(struct trace_point_common_writev *ctx) {
+int tracepoint_enter_writev(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
- data_args.iovec = ctx->vec;
- data_args.iovlen = ctx->count;
+ data_args.fd = (__u32)ctx->args[0];
+ data_args.iovec = (struct iovec *)ctx->args[1];
+ data_args.iovlen = (size_t)ctx->args[2];
data_args.start_nacs = bpf_ktime_get_ns();
data_args.data_id = generate_socket_data_id(id, data_args.fd,
SOCKET_OPTS_TYPE_WRITE, false);
bpf_map_update_elem(&socket_data_args, &id, &data_args, 0);
@@ -201,7 +124,7 @@ int tracepoint_enter_writev(struct
trace_point_common_writev *ctx) {
}
SEC("tracepoint/syscalls/sys_exit_writev")
-int tracepoint_exit_writev(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_writev(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
struct sock_data_args_t *data_args =
bpf_map_lookup_elem(&socket_data_args, &id);
if (data_args && data_args->is_sock_event) {
@@ -214,12 +137,12 @@ int tracepoint_exit_writev(struct trace_point_common_exit
*ctx) {
}
SEC("tracepoint/syscalls/sys_enter_sendmsg")
-int tracepoint_enter_sendmsg(struct trace_point_common_sendmsg *ctx) {
+int tracepoint_enter_sendmsg(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
- struct user_msghdr* msghdr = ctx->msg;
+ struct user_msghdr* msghdr = (struct user_msghdr*)ctx->args[1];
if (msghdr == NULL) {
return 0;
}
@@ -228,13 +151,13 @@ int tracepoint_enter_sendmsg(struct
trace_point_common_sendmsg *ctx) {
if (addr != NULL) {
struct connect_args_t connect_args = {};
connect_args.addr = addr;
- connect_args.fd = ctx->fd;
+ connect_args.fd = (__u32)ctx->args[0];
connect_args.start_nacs = bpf_ktime_get_ns();
bpf_map_update_elem(&conecting_args, &id, &connect_args, 0);
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
+ data_args.fd = (__u32)ctx->args[0];
data_args.iovec = _(msghdr->msg_iov);
data_args.iovlen = _(msghdr->msg_iovlen);
data_args.start_nacs = bpf_ktime_get_ns();
@@ -244,7 +167,7 @@ int tracepoint_enter_sendmsg(struct
trace_point_common_sendmsg *ctx) {
}
SEC("tracepoint/syscalls/sys_exit_sendmsg")
-int tracepoint_exit_sendmsg(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_sendmsg(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
ssize_t bytes_count = ctx->ret;
@@ -265,13 +188,13 @@ int tracepoint_exit_sendmsg(struct
trace_point_common_exit *ctx) {
}
SEC("tracepoint/syscalls/sys_enter_sendmmsg")
-int tracepoint_enter_sendmmsg(struct trace_point_common_sendmmsg *ctx) {
+int tracepoint_enter_sendmmsg(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
- struct mmsghdr* mmsghdr = ctx->mmsg;
- __u32 vlen = ctx->vlen;
+ struct mmsghdr* mmsghdr = (struct mmsghdr*)ctx->args[1];
+ __u32 vlen = (__u32)ctx->args[2];
if (mmsghdr == NULL || vlen <= 0) {
return 0;
}
@@ -280,13 +203,13 @@ int tracepoint_enter_sendmmsg(struct
trace_point_common_sendmmsg *ctx) {
if (addr != NULL) {
struct connect_args_t connect_args = {};
connect_args.addr = addr;
- connect_args.fd = ctx->fd;
+ connect_args.fd = (__u32)ctx->args[0];
connect_args.start_nacs = bpf_ktime_get_ns();
bpf_map_update_elem(&conecting_args, &id, &connect_args, 0);
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
+ data_args.fd = (__u32)ctx->args[0];
struct iovec *msg_iov = _(mmsghdr->msg_hdr.msg_iov);
data_args.iovec = msg_iov;
size_t msg_iovlen = _(mmsghdr->msg_hdr.msg_iovlen);
@@ -299,7 +222,7 @@ int tracepoint_enter_sendmmsg(struct
trace_point_common_sendmmsg *ctx) {
}
SEC("tracepoint/syscalls/sys_exit_sendmmsg")
-int tracepoint_exit_sendmmsg(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_sendmmsg(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
ssize_t bytes_count = ctx->ret;
@@ -322,15 +245,15 @@ int tracepoint_exit_sendmmsg(struct
trace_point_common_exit *ctx) {
}
SEC("tracepoint/syscalls/sys_enter_read")
-int tracepoint_enter_read(struct trace_point_common_write *ctx) {
+int tracepoint_enter_read(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
- data_args.buf = ctx->buf;
+ data_args.fd = (__u32)ctx->args[0];
+ data_args.buf = (char *)ctx->args[1];
data_args.start_nacs = bpf_ktime_get_ns();
data_args.data_id = generate_socket_data_id(id, data_args.fd,
SOCKET_OPTS_TYPE_READ, false);
bpf_map_update_elem(&socket_data_args, &id, &data_args, 0);
@@ -338,7 +261,7 @@ int tracepoint_enter_read(struct trace_point_common_write
*ctx) {
}
SEC("tracepoint/syscalls/sys_exit_read")
-int tracepoint_exit_read(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_read(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
struct sock_data_args_t *data_args =
bpf_map_lookup_elem(&socket_data_args, &id);
if (data_args && data_args->is_sock_event) {
@@ -351,16 +274,16 @@ int tracepoint_exit_read(struct trace_point_common_exit
*ctx) {
}
SEC("tracepoint/syscalls/sys_enter_readv")
-int tracepoint_enter_readv(struct trace_point_common_readv *ctx) {
+int tracepoint_enter_readv(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
- data_args.iovec = ctx->vec;
- data_args.iovlen = ctx->count;
+ data_args.fd = (__u32)ctx->args[0];
+ data_args.iovec = (struct iovec *)ctx->args[1];
+ data_args.iovlen = (size_t)ctx->args[2];
data_args.start_nacs = bpf_ktime_get_ns();
data_args.data_id = generate_socket_data_id(id, data_args.fd,
SOCKET_OPTS_TYPE_READV, false);
bpf_map_update_elem(&socket_data_args, &id, &data_args, 0);
@@ -368,7 +291,7 @@ int tracepoint_enter_readv(struct trace_point_common_readv
*ctx) {
}
SEC("tracepoint/syscalls/sys_exit_readv")
-int tracepoint_exit_readv(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_readv(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
struct sock_data_args_t *data_args =
bpf_map_lookup_elem(&socket_data_args, &id);
if (data_args && data_args->is_sock_event) {
@@ -411,22 +334,22 @@ int sys_recv_ret(struct pt_regs* ctx) {
}
SEC("tracepoint/syscalls/sys_enter_recvfrom")
-int tracepoint_enter_recvfrom(struct trace_point_enter_recvfrom *ctx) {
+int tracepoint_enter_recvfrom(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
- if (ctx->addr != NULL) {
+ if ((struct sockaddr *)ctx->args[4] != NULL) {
struct connect_args_t connect_args = {};
- connect_args.addr = ctx->addr;
- connect_args.fd = ctx->fd;
+ connect_args.addr = (struct sockaddr *)ctx->args[4];
+ connect_args.fd = (__u32)ctx->args[0];
bpf_map_update_elem(&conecting_args, &id, &connect_args, 0);
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
- data_args.buf = ctx->buf;
+ data_args.fd = (__u32)ctx->args[0];
+ data_args.buf = (char *)ctx->args[1];
data_args.start_nacs = bpf_ktime_get_ns();
data_args.data_id = generate_socket_data_id(id, data_args.fd,
SOCKET_OPTS_TYPE_RECVFROM, false);
bpf_map_update_elem(&socket_data_args, &id, &data_args, 0);
@@ -434,7 +357,7 @@ int tracepoint_enter_recvfrom(struct
trace_point_enter_recvfrom *ctx) {
}
SEC("tracepoint/syscalls/sys_exit_recvfrom")
-int tracepoint_exit_recvfrom(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_recvfrom(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
ssize_t bytes_count = ctx->ret;
@@ -455,12 +378,12 @@ int tracepoint_exit_recvfrom(struct
trace_point_common_exit *ctx) {
}
SEC("tracepoint/syscalls/sys_enter_recvmsg")
-int tracepoint_enter_recvmsg(struct trace_point_common_recvmsg *ctx) {
+int tracepoint_enter_recvmsg(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
- struct user_msghdr* msghdr = ctx->msg;
+ struct user_msghdr* msghdr = (struct user_msghdr*)ctx->args[1];
if (msghdr == NULL) {
return 0;
}
@@ -469,13 +392,13 @@ int tracepoint_enter_recvmsg(struct
trace_point_common_recvmsg *ctx) {
if (addr != NULL) {
struct connect_args_t connect_args = {};
connect_args.addr = addr;
- connect_args.fd = ctx->fd;
+ connect_args.fd = (__u32)ctx->args[0];
connect_args.start_nacs = bpf_ktime_get_ns();
bpf_map_update_elem(&conecting_args, &id, &connect_args, 0);
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
+ data_args.fd = (__u32)ctx->args[0];
data_args.iovec = _(msghdr->msg_iov);
data_args.iovlen = _(msghdr->msg_iovlen);
data_args.start_nacs = bpf_ktime_get_ns();
@@ -485,7 +408,7 @@ int tracepoint_enter_recvmsg(struct
trace_point_common_recvmsg *ctx) {
}
SEC("tracepoint/syscalls/sys_exit_recvmsg")
-int tracepoint_exit_recvmsg(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_recvmsg(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
ssize_t bytes_count = ctx->ret;
@@ -506,13 +429,13 @@ int tracepoint_exit_recvmsg(struct
trace_point_common_exit *ctx) {
}
SEC("tracepoint/syscalls/sys_enter_recvmmsg")
-int tracepoint_enter_recvmmsg(struct trace_point_common_recvmmsg *ctx) {
+int tracepoint_enter_recvmmsg(struct syscall_trace_enter *ctx) {
uint64_t id = bpf_get_current_pid_tgid();
if (tgid_should_trace(id >> 32) == false) {
return 0;
}
- struct mmsghdr* mmsghdr = ctx->mmsg;
- __u32 vlen = ctx->vlen;
+ struct mmsghdr* mmsghdr = (struct mmsghdr*)ctx->args[1];
+ __u32 vlen = (__u32)ctx->args[2];
if (mmsghdr == NULL || vlen <= 0) {
return 0;
}
@@ -521,13 +444,13 @@ int tracepoint_enter_recvmmsg(struct
trace_point_common_recvmmsg *ctx) {
if (addr != NULL) {
struct connect_args_t connect_args = {};
connect_args.addr = addr;
- connect_args.fd = ctx->fd;
+ connect_args.fd = (__u32)ctx->args[0];
connect_args.start_nacs = bpf_ktime_get_ns();
bpf_map_update_elem(&conecting_args, &id, &connect_args, 0);
}
struct sock_data_args_t data_args = {};
- data_args.fd = ctx->fd;
+ data_args.fd = (__u32)ctx->args[0];
struct iovec *msg_iov = _(mmsghdr->msg_hdr.msg_iov);
data_args.iovec = msg_iov;
size_t msg_iovlen = _(mmsghdr->msg_hdr.msg_iovlen);
@@ -540,7 +463,7 @@ int tracepoint_enter_recvmmsg(struct
trace_point_common_recvmmsg *ctx) {
}
SEC("tracepoint/syscalls/sys_exit_recvmmsg")
-int tracepoint_exit_recvmmsg(struct trace_point_common_exit *ctx) {
+int tracepoint_exit_recvmmsg(struct syscall_trace_exit *ctx) {
__u64 id = bpf_get_current_pid_tgid();
ssize_t bytes_count = ctx->ret;
@@ -563,9 +486,9 @@ int tracepoint_exit_recvmmsg(struct trace_point_common_exit
*ctx) {
}
SEC("tracepoint/skb/skb_copy_datagram_iovec")
-int tracepoint_skb_copy_datagram_iovec(struct
trace_point_skb_copy_datagram_iovec* ctx) {
+int tracepoint_skb_copy_datagram_iovec(struct
trace_event_raw_skb_copy_datagram_iovec* ctx) {
__u64 id = bpf_get_current_pid_tgid();
- struct sk_buff *buff = ctx->skb;
+ struct sk_buff *buff = (struct sk_buff *)ctx->skbaddr;
struct sock_data_args_t *data_args =
bpf_map_lookup_elem(&socket_data_args, &id);
if (data_args == NULL) {
bpf_map_delete_elem(&sk_buff_receive_detail_map, &buff);
diff --git a/bpf/include/api.h b/bpf/include/api.h
index be139bf..f27dd1c 100644
--- a/bpf/include/api.h
+++ b/bpf/include/api.h
@@ -46,6 +46,23 @@ typedef enum
true=1, false=0
} bool;
+struct trace_entry {
+ short unsigned int type;
+ unsigned char flags;
+ unsigned char preempt_count;
+ int pid;
+} __attribute__((preserve_access_index));
+struct syscall_trace_enter {
+ struct trace_entry ent;
+ int nr;
+ long unsigned int args[0];
+} __attribute__((preserve_access_index));
+struct syscall_trace_exit {
+ struct trace_entry ent;
+ int nr;
+ long int ret;
+}__attribute__((preserve_access_index));
+
struct thread_struct {
// x86_64
long unsigned int fsbase;