|
@@ -49,6 +49,7 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
|
|
|
bool is_socket = strncmp(event, "socket", 6) == 0;
|
|
|
bool is_kprobe = strncmp(event, "kprobe/", 7) == 0;
|
|
|
bool is_kretprobe = strncmp(event, "kretprobe/", 10) == 0;
|
|
|
+ bool is_tracepoint = strncmp(event, "tracepoint/", 11) == 0;
|
|
|
enum bpf_prog_type prog_type;
|
|
|
char buf[256];
|
|
|
int fd, efd, err, id;
|
|
@@ -63,6 +64,8 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
|
|
|
prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
|
|
|
} else if (is_kprobe || is_kretprobe) {
|
|
|
prog_type = BPF_PROG_TYPE_KPROBE;
|
|
|
+ } else if (is_tracepoint) {
|
|
|
+ prog_type = BPF_PROG_TYPE_TRACEPOINT;
|
|
|
} else {
|
|
|
printf("Unknown event '%s'\n", event);
|
|
|
return -1;
|
|
@@ -111,12 +114,23 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
|
|
|
event, strerror(errno));
|
|
|
return -1;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- strcpy(buf, DEBUGFS);
|
|
|
- strcat(buf, "events/kprobes/");
|
|
|
- strcat(buf, event);
|
|
|
- strcat(buf, "/id");
|
|
|
+ strcpy(buf, DEBUGFS);
|
|
|
+ strcat(buf, "events/kprobes/");
|
|
|
+ strcat(buf, event);
|
|
|
+ strcat(buf, "/id");
|
|
|
+ } else if (is_tracepoint) {
|
|
|
+ event += 11;
|
|
|
+
|
|
|
+ if (*event == 0) {
|
|
|
+ printf("event name cannot be empty\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ strcpy(buf, DEBUGFS);
|
|
|
+ strcat(buf, "events/");
|
|
|
+ strcat(buf, event);
|
|
|
+ strcat(buf, "/id");
|
|
|
+ }
|
|
|
|
|
|
efd = open(buf, O_RDONLY, 0);
|
|
|
if (efd < 0) {
|
|
@@ -304,6 +318,7 @@ int load_bpf_file(char *path)
|
|
|
|
|
|
if (memcmp(shname_prog, "kprobe/", 7) == 0 ||
|
|
|
memcmp(shname_prog, "kretprobe/", 10) == 0 ||
|
|
|
+ memcmp(shname_prog, "tracepoint/", 11) == 0 ||
|
|
|
memcmp(shname_prog, "socket", 6) == 0)
|
|
|
load_and_attach(shname_prog, insns, data_prog->d_size);
|
|
|
}
|
|
@@ -320,6 +335,7 @@ int load_bpf_file(char *path)
|
|
|
|
|
|
if (memcmp(shname, "kprobe/", 7) == 0 ||
|
|
|
memcmp(shname, "kretprobe/", 10) == 0 ||
|
|
|
+ memcmp(shname, "tracepoint/", 11) == 0 ||
|
|
|
memcmp(shname, "socket", 6) == 0)
|
|
|
load_and_attach(shname, data->d_buf, data->d_size);
|
|
|
}
|