int bytes;
};
-BPF_HASH(g_message, struct data_t, unsigned long *)
-BPF_HASH(msg_size, struct data_t, struct bytes_t)
-BPF_HISTOGRAM(msg_size_hist)
+BPF_HASH(g_message, struct data_t, unsigned long *);
+BPF_HASH(msg_size, struct data_t, struct bytes_t);
+BPF_HISTOGRAM(msg_size_hist);
static int get_process_data(struct data_t *data) {
data->pid = bpf_get_current_pid_tgid();
if (ptr_gsize == 0) {
return 0;
}
- unsigned long *gsize = *ptr_gsize;
+ unsigned long *gsize = 0;
+ bpf_probe_read(&gsize, sizeof(gsize), ptr_gsize);
unsigned long size = 0;
bpf_probe_read(&size, sizeof(size), gsize);
if(size > 0 && size < 1000000) {
int dbus_message_size(struct pt_regs *ctx, void *conn, struct DBusMessage *message) {
unsigned long size = 0;
- if (message->header.data.len > 0) {
- size += message->header.data.len;
+ int header_len = 0;
+ int body_len = 0;
+
+ bpf_probe_read(&header_len, sizeof(header_len), (char*)message + offsetof(struct DBusMessage, header.data.len));
+ if (header_len > 0) {
+ size += header_len;
}
- if (message->body.len > 0) {
- size += message->body.len;
+ bpf_probe_read(&body_len, sizeof(body_len), (char*)message + offsetof(struct DBusMessage, body.len));
+ if (body_len > 0) {
+ size += body_len;
}
if (size != 0) {
message_size(size);
struct data_t {
int pid;
char comm[TASK_COMM_LEN];
- u32 ts;
+ u64 ts;
};
struct header_data {
int max;
};
-BPF_HASH(msg_sent_addr, u32 , struct data_t)
-BPF_HASH(msg_latency, struct data_t , struct stats_t)
-BPF_HASH(g_serial_addr, struct data_t, struct GDBusMessage *)
-BPF_HISTOGRAM(latency_histo)
+BPF_HASH(msg_sent_addr, u32 , struct data_t);
+BPF_HASH(msg_latency, struct data_t , struct stats_t);
+BPF_HASH(g_serial_addr, struct data_t, struct GDBusMessage *);
+BPF_HISTOGRAM(latency_histo);
static void get_process_data(struct data_t *data) {
data->pid = bpf_get_current_pid_tgid();
int get_msg_addr(struct pt_regs *ctx, struct DBusConnection *conn, struct DBusMessage *msg){
struct data_t data = {};
get_process_data(&data);
- struct header_data *header = msg->header.data.str;
- u32 serial = header->serial;
+ struct header_data *header = 0;
+ bpf_probe_read(&header, sizeof(header), (char*)msg + offsetof(struct DBusMessage, header.data.str));
+ u32 serial = 0;
+ bpf_probe_read(&serial, sizeof(serial), (char*)header + offsetof(struct header_data, serial));
msg_sent_addr.update(&serial,&data);
return 0;
}
int get_msg_latency(struct pt_regs *ctx, struct DBusConnection *conn) {
struct data_t receiver_data = {};
- struct DBusMessage *msg;
- struct header_data *header;
- int serial;
- struct DBusList *link = conn->incoming_messages;
+ struct DBusMessage *msg = 0;
+ struct header_data *header = 0;
+ int serial = 0;
+ struct DBusList *link = 0;
+
+ bpf_probe_read(&link, sizeof(link), (char *)conn + offsetof(struct DBusConnection, incoming_messages));
if (link == 0) {
return 0;
}
get_process_data(&receiver_data);
- msg = conn->incoming_messages->data;
- header = msg->header.data.str;
- serial = header->serial;
+ bpf_probe_read(&msg, sizeof(msg), (char *)link + offsetof(struct DBusList, data));
+ bpf_probe_read(&header, sizeof(header), (char*)msg + offsetof(struct DBusMessage, header.data.str));
+ bpf_probe_read(&serial, sizeof(serial), (char*)header + offsetof(struct header_data, serial));
get_delay(serial, receiver_data);
return 0;
}
char comm[TASK_COMM_LEN];
};
-BPF_HASH(message, struct data_t, int)
-BPF_HISTOGRAM(msg_type, int)
+BPF_HASH(message, struct data_t, int);
+BPF_HISTOGRAM(msg_type, int);
int g_get_message_type(struct pt_regs *ctx, void *conn, struct GDBusMessage *message) {
msg_type.increment(message->type);
}
int message_type(struct pt_regs *ctx, void *conn, struct DBusMessage *message) {
- const char *c = message->header.data.str;
- c++;
- msg_type.increment(*c);
+ char *addr = 0;
+ bpf_probe_read(&addr, sizeof(addr), (char*)message + offsetof(struct DBusMessage, header.data.str));
+ char type;
+ bpf_probe_read(&type, sizeof(type), addr + 1);
+ msg_type.increment(type);
return 0;
}