summaryrefslogtreecommitdiff
path: root/internal/generate/kindregistry.go
blob: fc5fc52d15530b0ec2c90526d303038ce51583db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package generate

// kindMeta holds static metadata for a TracepointKind. Adding a new kind
// only requires registering an entry here — no switch statements need to be
// updated elsewhere (Open/Closed Principle).
type kindMeta struct {
	// structName is the C struct name used in generated BPF handlers, e.g. "fd_event".
	structName string
	// enterAccepted reports whether this kind is valid for a syscall-enter tracepoint.
	// Kinds that are exit-only (e.g. KindRet) must not appear on enter.
	enterAccepted bool
}

// kindRegistry maps every known TracepointKind to its static metadata.
// To add a new syscall classification, add a single entry here; the rest of
// the code (isEnterRejected, eventStructName, eventTypeConstant) picks it up
// automatically via lookupKind.
var kindRegistry = map[TracepointKind]kindMeta{
	KindFd:             {structName: "fd_event", enterAccepted: true},
	KindOpen:           {structName: "open_event", enterAccepted: true},
	KindMqOpen:         {structName: "open_event", enterAccepted: true},
	KindExec:           {structName: "exec_event", enterAccepted: true},
	KindPathname:       {structName: "path_event", enterAccepted: true},
	KindName:           {structName: "name_event", enterAccepted: true},
	KindRet:            {structName: "ret_event", enterAccepted: false},
	KindFcntl:          {structName: "fcntl_event", enterAccepted: true},
	KindNull:           {structName: "null_event", enterAccepted: true},
	KindDup3:           {structName: "dup3_event", enterAccepted: true},
	KindOpenByHandleAt: {structName: "open_by_handle_at_event", enterAccepted: true},
	KindSocket:         {structName: "socket_event", enterAccepted: true},
	KindSocketpair:     {structName: "socketpair_event", enterAccepted: true},
	KindAccept:         {structName: "accept_event", enterAccepted: true},
	KindPipe:           {structName: "pipe_event", enterAccepted: true},
	KindEventfd:        {structName: "eventfd_event", enterAccepted: true},
	KindPidfd:          {structName: "eventfd_event", enterAccepted: true},
	KindEpollCtl:       {structName: "epoll_ctl_event", enterAccepted: true},
	KindTwoFd:          {structName: "two_fd_event", enterAccepted: true},
	KindPoll:           {structName: "poll_event", enterAccepted: true},
	KindMem:            {structName: "mem_event", enterAccepted: true},
	KindSleep:          {structName: "sleep_event", enterAccepted: true},
	KindKeyctl:         {structName: "keyctl_event", enterAccepted: true},
	KindPtrace:         {structName: "ptrace_event", enterAccepted: true},
	KindPerfOpen:       {structName: "perf_open_event", enterAccepted: true},
	KindSeccomp:        {structName: "null_event", enterAccepted: true},
	KindModule:         {structName: "null_event", enterAccepted: true},
	KindSysVId:         {structName: "null_event", enterAccepted: true},
	KindSysVOp:         {structName: "null_event", enterAccepted: true},
	KindProc:           {structName: "null_event", enterAccepted: true},
	KindBpf:            {structName: "null_event", enterAccepted: true},
	KindFutex:          {structName: "null_event", enterAccepted: true},
	KindPrctl:          {structName: "null_event", enterAccepted: true},
	KindTimerObj:       {structName: "null_event", enterAccepted: true},
	// KindNone is intentionally absent: it represents "unclassified" and is
	// never enter-accepted. lookupKind returns the zero kindMeta (enterAccepted=false)
	// for any unregistered kind, so KindNone is implicitly rejected.
}

// lookupKind returns the metadata for kind. If kind is not registered (e.g.
// KindNone or an unknown value), it returns a zero kindMeta whose structName
// is "unknown_event" and enterAccepted is false.
func lookupKind(kind TracepointKind) kindMeta {
	if m, ok := kindRegistry[kind]; ok {
		return m
	}
	return kindMeta{structName: "unknown_event", enterAccepted: false}
}