diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-18 18:47:02 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-18 18:47:02 +0300 |
| commit | 5c13a7321502c4a5767be17ed48e7cdb576deab3 (patch) | |
| tree | fe155a1f8492471165762f8cf22796947149020a /internal | |
| parent | 7fb497c435596a36c0fb0bd0ecae2a84793bcc70 (diff) | |
j6: defer mmsg byte classification
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/c/generated_tracepoints.c | 8 | ||||
| -rw-r--r-- | internal/c/generated_tracepoints_result.txt | 4 | ||||
| -rw-r--r-- | internal/generate/classify.go | 2 | ||||
| -rw-r--r-- | internal/generate/classify_test.go | 18 | ||||
| -rw-r--r-- | internal/generate/retclassify_test.go | 17 |
5 files changed, 37 insertions, 12 deletions
diff --git a/internal/c/generated_tracepoints.c b/internal/c/generated_tracepoints.c index be6606d..980f91d 100644 --- a/internal/c/generated_tracepoints.c +++ b/internal/c/generated_tracepoints.c @@ -1431,7 +1431,7 @@ int handle_sys_enter_sendmmsg(struct syscall_trace_enter *ctx) { return 0; } -/// sys_exit_sendmmsg is a struct ret_event (WRITE_CLASSIFIED) +/// sys_exit_sendmmsg is a struct ret_event (UNCLASSIFIED) SEC("tracepoint/syscalls/sys_exit_sendmmsg") int handle_sys_exit_sendmmsg(struct syscall_trace_exit *ctx) { __u32 pid, tid; @@ -1448,7 +1448,7 @@ int handle_sys_exit_sendmmsg(struct syscall_trace_exit *ctx) { ev->tid = tid; ev->time = bpf_ktime_get_boot_ns(); ev->ret = ctx->ret; - ev->ret_type = WRITE_CLASSIFIED; + ev->ret_type = UNCLASSIFIED; bpf_ringbuf_submit(ev, 0); return 0; @@ -1521,7 +1521,7 @@ int handle_sys_enter_recvmmsg(struct syscall_trace_enter *ctx) { return 0; } -/// sys_exit_recvmmsg is a struct ret_event (READ_CLASSIFIED) +/// sys_exit_recvmmsg is a struct ret_event (UNCLASSIFIED) SEC("tracepoint/syscalls/sys_exit_recvmmsg") int handle_sys_exit_recvmmsg(struct syscall_trace_exit *ctx) { __u32 pid, tid; @@ -1538,7 +1538,7 @@ int handle_sys_exit_recvmmsg(struct syscall_trace_exit *ctx) { ev->tid = tid; ev->time = bpf_ktime_get_boot_ns(); ev->ret = ctx->ret; - ev->ret_type = READ_CLASSIFIED; + ev->ret_type = UNCLASSIFIED; bpf_ringbuf_submit(ev, 0); return 0; diff --git a/internal/c/generated_tracepoints_result.txt b/internal/c/generated_tracepoints_result.txt index 2cc1e52..ea4f2d1 100644 --- a/internal/c/generated_tracepoints_result.txt +++ b/internal/c/generated_tracepoints_result.txt @@ -608,7 +608,7 @@ sys_exit_readlinkat is a struct ret_event (READ_CLASSIFIED) sys_exit_readv is a struct ret_event (READ_CLASSIFIED) sys_exit_reboot is a struct ret_event (UNCLASSIFIED) sys_exit_recvfrom is a struct ret_event (READ_CLASSIFIED) -sys_exit_recvmmsg is a struct ret_event (READ_CLASSIFIED) +sys_exit_recvmmsg is a struct ret_event (UNCLASSIFIED) sys_exit_recvmsg is a struct ret_event (READ_CLASSIFIED) sys_exit_remap_file_pages is a struct ret_event (UNCLASSIFIED) sys_exit_removexattr is a struct ret_event (UNCLASSIFIED) @@ -647,7 +647,7 @@ sys_exit_semget is a struct ret_event (UNCLASSIFIED) sys_exit_semop is a struct ret_event (UNCLASSIFIED) sys_exit_semtimedop is a struct ret_event (UNCLASSIFIED) sys_exit_sendfile64 is a struct ret_event (TRANSFER_CLASSIFIED) -sys_exit_sendmmsg is a struct ret_event (WRITE_CLASSIFIED) +sys_exit_sendmmsg is a struct ret_event (UNCLASSIFIED) sys_exit_sendmsg is a struct ret_event (WRITE_CLASSIFIED) sys_exit_sendto is a struct ret_event (WRITE_CLASSIFIED) sys_exit_set_mempolicy is a struct ret_event (UNCLASSIFIED) diff --git a/internal/generate/classify.go b/internal/generate/classify.go index b96ee0d..7768ea7 100644 --- a/internal/generate/classify.go +++ b/internal/generate/classify.go @@ -169,7 +169,6 @@ var retClassifications = map[string]RetClassification{ "readlink": ReadClassified, "readlinkat": ReadClassified, "readv": ReadClassified, - "recvmmsg": ReadClassified, "recvmsg": ReadClassified, "recvfrom": ReadClassified, "syslog": ReadClassified, @@ -184,7 +183,6 @@ var retClassifications = map[string]RetClassification{ "pwrite64": WriteClassified, "pwritev": WriteClassified, "pwritev2": WriteClassified, - "sendmmsg": WriteClassified, "sendmsg": WriteClassified, "sendto": WriteClassified, "write": WriteClassified, diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go index 4dd216e..ea7d662 100644 --- a/internal/generate/classify_test.go +++ b/internal/generate/classify_test.go @@ -372,11 +372,27 @@ func TestClassifyPhaseAByteSyscallPairsAccepted(t *testing.T) { } } +func TestBatchMessageSyscallPairsDeferByteClassification(t *testing.T) { + tests := []string{"sendmmsg", "recvmmsg"} + for i, name := range tests { + t.Run(name, func(t *testing.T) { + output := GenerateTracepointsC(phaseAFormats(name, 9100+i*2)) + if strings.Contains(output, "Ignoring") || strings.Contains(output, "Skipping") { + t.Fatalf("syscall %s was not accepted:\n%s", name, output) + } + if !strings.Contains(output, "/// sys_exit_"+name+" is a struct ret_event (UNCLASSIFIED)") { + t.Fatalf("sys_exit_%s should be generated without byte classification:\n%s", name, output) + } + }) + } +} + func phaseAFormats(name string, enterID int) []Format { enterFields := []Field{ {Type: "long", Name: "__syscall_nr"}, } - if name == "sendto" || name == "recvfrom" || name == "sendmsg" || name == "recvmsg" { + if name == "sendto" || name == "recvfrom" || name == "sendmsg" || name == "recvmsg" || + name == "sendmmsg" || name == "recvmmsg" { enterFields = append(enterFields, Field{Type: "int", Name: "fd"}) } diff --git a/internal/generate/retclassify_test.go b/internal/generate/retclassify_test.go index 9a75a15..1c5b2ac 100644 --- a/internal/generate/retclassify_test.go +++ b/internal/generate/retclassify_test.go @@ -7,7 +7,7 @@ func TestClassifyRetRead(t *testing.T) { "fgetxattr", "flistxattr", "getdents", "getdents64", "getxattr", "lgetxattr", "listxattr", "llistxattr", "pread64", "preadv", "preadv2", "process_vm_readv", "read", "readlink", "readlinkat", - "readv", "recvmmsg", "recvmsg", "recvfrom", "syslog", + "readv", "recvmsg", "recvfrom", "syslog", } for _, name := range reads { if got := ClassifyRet("sys_exit_" + name); got != ReadClassified { @@ -19,7 +19,7 @@ func TestClassifyRetRead(t *testing.T) { func TestClassifyRetWrite(t *testing.T) { writes := []string{ "process_vm_writev", "pwrite64", "pwritev", "pwritev2", - "sendmmsg", "sendmsg", "sendto", "write", "writev", + "sendmsg", "sendto", "write", "writev", } for _, name := range writes { if got := ClassifyRet("sys_exit_" + name); got != WriteClassified { @@ -43,7 +43,7 @@ func TestClassifyRetUnclassified(t *testing.T) { unclassified := []string{ "openat", "close", "rename", "unlink", "fcntl", "dup", "dup2", "dup3", "mkdir", "rmdir", "chmod", "chown", "chdir", "stat", "lseek", - "truncate", "fallocate", "mmap", "fsync", "flock", + "truncate", "fallocate", "mmap", "fsync", "flock", "recvmmsg", "sendmmsg", } for _, name := range unclassified { if got := ClassifyRet("sys_exit_" + name); got != Unclassified { @@ -52,6 +52,17 @@ func TestClassifyRetUnclassified(t *testing.T) { } } +func TestBatchMessageSyscallsDeferredFromRetByteClassification(t *testing.T) { + tests := []string{"recvmmsg", "sendmmsg"} + for _, name := range tests { + t.Run(name, func(t *testing.T) { + if got := ClassifyRet("sys_exit_" + name); got != Unclassified { + t.Fatalf("ClassifyRet(sys_exit_%s) = %q, want %q", name, got, Unclassified) + } + }) + } +} + func TestClassifyRetCaseInsensitive(t *testing.T) { if got := ClassifyRet("sys_exit_READ"); got != ReadClassified { t.Errorf("ClassifyRet(sys_exit_READ) = %q, want READ_CLASSIFIED", got) |
