summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/ioriotng.bpf.c37
-rw-r--r--internal/ioriotng.go32
-rw-r--r--internal/types/types.bpf.h4
-rw-r--r--internal/types/types.go12
4 files changed, 73 insertions, 12 deletions
diff --git a/internal/ioriotng.bpf.c b/internal/ioriotng.bpf.c
index ce06d8a..3948529 100644
--- a/internal/ioriotng.bpf.c
+++ b/internal/ioriotng.bpf.c
@@ -96,4 +96,41 @@ int handle_exit_close(struct trace_event_raw_sys_enter *ctx) {
return 0;
}
+SEC("tracepoint/syscalls/sys_enter_write")
+int handle_enter_write(struct trace_event_raw_sys_enter *ctx) {
+ if (filter())
+ return 0;
+
+ struct fd_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct fd_event), 0);
+ if (!ev)
+ return 0;
+
+ ev->op_id = WRITE_ENTER_OP_ID;
+ ev->pid_tgid = bpf_get_current_pid_tgid();
+ ev->time = bpf_ktime_get_ns();
+ ev->fd = (int)ctx->args[0];
+
+ bpf_ringbuf_submit(ev, 0);
+ return 0;
+}
+
+SEC("tracepoint/syscalls/sys_exit_write")
+int handle_exit_write(struct trace_event_raw_sys_enter *ctx) {
+ if (filter())
+ return 0;
+
+ struct null_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct null_event), 0);
+ if (!ev)
+ return 0;
+
+ ev->op_id = WRITE_EXIT_OP_ID;
+ ev->pid_tgid = bpf_get_current_pid_tgid();
+ ev->time = bpf_ktime_get_ns();
+
+ bpf_ringbuf_submit(ev, 0);
+
+ return 0;
+}
+
+
char LICENSE[] SEC("license") = "Dual BSD/GPL";
diff --git a/internal/ioriotng.go b/internal/ioriotng.go
index 2892431..97b46ea 100644
--- a/internal/ioriotng.go
+++ b/internal/ioriotng.go
@@ -11,7 +11,7 @@ import (
"ioriotng/internal/flags"
"ioriotng/internal/syncpool"
"ioriotng/internal/tracepoints"
- "ioriotng/internal/types"
+ . "ioriotng/internal/types"
bpf "github.com/aquasecurity/libbpfgo"
)
@@ -54,19 +54,19 @@ func Run(flags flags.Flags) {
}
rb.Poll(300)
- enterOpen := make(map[uint32]*types.OpenatEnterEvent)
- enterFd := make(map[uint32]*types.FdEvent)
+ enterOpen := make(map[uint32]*OpenatEnterEvent)
+ enterFd := make(map[uint32]*FdEvent)
// To do this, extract the PID from the TID (pid_tid >> 32)
// openFiles := make(map[
for raw := range ch {
- switch types.OpId(raw[0]) {
- case types.OPENAT_ENTER_OP_ID:
- ev := readRaw(raw, syncpool.OpenEnterEvent.Get().(*types.OpenatEnterEvent))
+ switch OpId(raw[0]) {
+ case OPENAT_ENTER_OP_ID:
+ ev := readRaw(raw, syncpool.OpenEnterEvent.Get().(*OpenatEnterEvent))
enterOpen[ev.PidTGid] = ev
- case types.OPENAT_EXIT_OP_ID:
- ev := readRaw(raw, syncpool.FdEvent.Get().(*types.FdEvent))
+ case OPENAT_EXIT_OP_ID:
+ ev := readRaw(raw, syncpool.FdEvent.Get().(*FdEvent))
enterEv, ok := enterOpen[ev.PidTGid]
if !ok {
fmt.Println("Dropping", ev)
@@ -80,12 +80,20 @@ func Run(flags flags.Flags) {
syncpool.FdEvent.Put(ev)
syncpool.OpenEnterEvent.Put(enterEv)
- case types.CLOSE_ENTER_OP_ID:
- ev := readRaw(raw, syncpool.FdEvent.Get().(*types.FdEvent))
+ case CLOSE_ENTER_OP_ID:
+ fallthrough
+ case WRITE_ENTER_OP_ID:
+ fallthrough
+ case WRITEV_ENTER_OP_ID:
+ ev := readRaw(raw, syncpool.FdEvent.Get().(*FdEvent))
enterFd[ev.PidTGid] = ev
- case types.CLOSE_EXIT_OP_ID:
- ev := readRaw(raw, syncpool.NullEvent.Get().(*types.NullEvent))
+ case CLOSE_EXIT_OP_ID:
+ fallthrough
+ case WRITE_EXIT_OP_ID:
+ fallthrough
+ case WRITEV_EXIT_OP_ID:
+ ev := readRaw(raw, syncpool.NullEvent.Get().(*NullEvent))
enterEv, ok := enterFd[ev.PidTGid]
if !ok {
fmt.Println("Dropping", ev)
diff --git a/internal/types/types.bpf.h b/internal/types/types.bpf.h
index 35c5311..25cfcd8 100644
--- a/internal/types/types.bpf.h
+++ b/internal/types/types.bpf.h
@@ -9,6 +9,10 @@
#define OPENAT_EXIT_OP_ID 2
#define CLOSE_ENTER_OP_ID 3
#define CLOSE_EXIT_OP_ID 4
+#define WRITE_ENTER_OP_ID 5
+#define WRITE_EXIT_OP_ID 6
+#define WRITEV_ENTER_OP_ID 7
+#define WRITEV_EXIT_OP_ID 8
struct null_event {
__u32 op_id;
diff --git a/internal/types/types.go b/internal/types/types.go
index 1d151dd..a662b4b 100644
--- a/internal/types/types.go
+++ b/internal/types/types.go
@@ -17,6 +17,10 @@ const (
OPENAT_EXIT_OP_ID
CLOSE_ENTER_OP_ID
CLOSE_EXIT_OP_ID
+ WRITE_ENTER_OP_ID
+ WRITE_EXIT_OP_ID
+ WRITEV_ENTER_OP_ID
+ WRITEV_EXIT_OP_ID
)
func (id OpId) String() string {
@@ -29,6 +33,14 @@ func (id OpId) String() string {
return "close:enter"
case CLOSE_EXIT_OP_ID:
return "close:exit"
+ case WRITE_ENTER_OP_ID:
+ return "write:enter"
+ case WRITE_EXIT_OP_ID:
+ return "write:exit"
+ case WRITEV_ENTER_OP_ID:
+ return "write:enter"
+ case WRITEV_EXIT_OP_ID:
+ return "write:exit"
default:
panic(fmt.Sprintf("Unknown OpId %d", uint32(id)))
}