#include
#include
#include
#include
#include
#include
#include
#include "../omega.skel.h"
#include "../include/omega.h"
static volatile int stop = 0;
static void bump_memlock_rlimit(void) {
struct rlimit rlim_new = {
.rlim_cur = RLIM_INFINITY,
.rlim_max = RLIM_INFINITY,
};
if (setrlimit(RLIMIT_MEMLOCK, &rlim_new)) {
fprintf(stderr, "Failed to increase RLIMIT_MEMLOCK limit!\n");
exit(1);
}
}
void handle_signal(int sig) {
stop = 1;
}
static int handle_evt(void *ctx, void *data, size_t sz) {
const struct packet_evt *evt = data;
fprintf(stdout, "Received Event: SRC IP: %u DST IP: %u SRC PORT: %u DST PORT: %u\n",
evt->src_ip, evt->dst_ip, evt->src_port, evt->dst_port);
fflush(stdout);
return 0;
}
int main(void) {
struct omega *skel = NULL;
struct ring_buffer *rb = NULL;
signal(SIGINT, handle_signal);
signal(SIGTERM, handle_signal);
// Increase rlimit for BPF memory lock
bump_memlock_rlimit();
skel = omega__open();
if (!skel) {
fprintf(stderr, "Failed to open BPF skeleton\n");
return 1;
}
if (omega__load(skel)) {
fprintf(stderr, "Failed to load BPF skeleton\n");
omega__destroy(skel);
return 1;
}
if (omega__attach(skel)) {
fprintf(stderr, "Failed to attach BPF skeleton\n");
omega__destroy(skel);
return 1;
}
// Set up ring buffer
int rb_fd = bpf_map__fd(skel->maps.rb);
if (rb_fd < 0) {
fprintf(stderr, "Failed to get ring buffer FD\n");
omega__destroy(skel);
return 1;
}
rb = ring_buffer__new(rb_fd, handle_evt, NULL, NULL);
if (!rb) {
fprintf(stderr, "Failed to create ring buffer\n");
omega__destroy(skel);
return 1;
}
printf("Ring buffer successfully created. Waiting for events...\n");
while (!stop) {
int err = ring_buffer__poll(rb, 1000);
if (err < 0) {
fprintf(stderr, "Error polling ring buffer: %d\n", err);
break;
}
}
printf("Cleaning up...\n");
ring_buffer__free(rb);
omega__destroy(skel);
return 0;
}
Когда я кошка/sys/kernel/debug/tracing/trace_pipe
bpf_trace_printk: Событие отправки: SRC IP: 108CA203 DST IP: 6D00A8C0 SRC Port: 443 DST Port: 55938 < /p>
Также, когда я запускаю погрузчик, я получаю.
Ring Buffer успешно создан. В ожидании событий ... < /p>
Также он печатает EVT отправить! Таким образом, код наверняка приходит в Rinbuf_submit. < /p>
Я не уверен, что может быть потенциальным исправлением или следующими шагами отладки. Я предполагаю, что harder_evt не может быть вызван, но опять же, очень сомневаюсь в этом. есть.
У меня есть следующая структура программы: src/main.bpf.c: [code]#include "../vmlinux.h" #include #include #include #include #include "../include/omega.h"
#define ETH_P_IP 0x0800
/* * NOTES: * __builtin_memcpy HAS TO BE USED BEFORE bpf_ringbuf_submit otherwise it will generate an error! */
// Increase rlimit for BPF memory lock bump_memlock_rlimit();
skel = omega__open(); if (!skel) { fprintf(stderr, "Failed to open BPF skeleton\n"); return 1; }
if (omega__load(skel)) { fprintf(stderr, "Failed to load BPF skeleton\n"); omega__destroy(skel); return 1; }
if (omega__attach(skel)) { fprintf(stderr, "Failed to attach BPF skeleton\n"); omega__destroy(skel); return 1; }
// Set up ring buffer int rb_fd = bpf_map__fd(skel->maps.rb); if (rb_fd < 0) { fprintf(stderr, "Failed to get ring buffer FD\n"); omega__destroy(skel); return 1; }
rb = ring_buffer__new(rb_fd, handle_evt, NULL, NULL); if (!rb) { fprintf(stderr, "Failed to create ring buffer\n"); omega__destroy(skel); return 1; }
printf("Ring buffer successfully created. Waiting for events...\n");
while (!stop) { int err = ring_buffer__poll(rb, 1000); if (err < 0) { fprintf(stderr, "Error polling ring buffer: %d\n", err); break; } }
[/code] Когда я кошка/sys/kernel/debug/tracing/trace_pipe bpf_trace_printk: Событие отправки: SRC IP: 108CA203 DST IP: 6D00A8C0 SRC Port: 443 DST Port: 55938 < /p> Также, когда я запускаю погрузчик, я получаю. Ring Buffer успешно создан. В ожидании событий ... < /p> Также он печатает EVT отправить! Таким образом, код наверняка приходит в Rinbuf_submit. < /p> Я не уверен, что может быть потенциальным исправлением или следующими шагами отладки. Я предполагаю, что harder_evt не может быть вызван, но опять же, очень сомневаюсь в этом. есть.