diff --git a/src/.output/xdp_filter.o b/src/.output/xdp_filter.o index e9189a8..299ef42 100644 Binary files a/src/.output/xdp_filter.o and b/src/.output/xdp_filter.o differ diff --git a/src/bin/xdp_filter b/src/bin/xdp_filter index f744248..7720a05 100755 Binary files a/src/bin/xdp_filter and b/src/bin/xdp_filter differ diff --git a/src/user/include/modules/module_manager.h b/src/user/include/modules/module_manager.h index fcca51a..650492e 100644 --- a/src/user/include/modules/module_manager.h +++ b/src/user/include/modules/module_manager.h @@ -22,6 +22,4 @@ typedef struct module_config_t{ extern module_config_t module_config; - - #endif \ No newline at end of file diff --git a/src/user/include/modules/sched.h b/src/user/include/modules/sched.h index 2055857..4c7fe35 100644 --- a/src/user/include/modules/sched.h +++ b/src/user/include/modules/sched.h @@ -5,6 +5,7 @@ #include #include "xdp_filter.skel.h" +//Connections int attach_handle_sched_process_exec(struct xdp_filter_bpf *skel){ skel->links.handle_sched_process_exec = bpf_program__attach(skel->progs.handle_sched_process_exec); return libbpf_get_error(skel->links.handle_sched_process_exec); @@ -15,4 +16,17 @@ int attach_sched_all(struct xdp_filter_bpf *skel){ } +//Disconnections +int detach_link_generic(struct bpf_link *link){ + int ret = bpf_link__destroy(link); + if(ret!=0){ + return -1; + } + return 0; +} +int detach_sched_all(struct xdp_filter_bpf *skel){ + return detach_link_generic(skel->links.handle_sched_process_exec); +} + + #endif \ No newline at end of file diff --git a/src/user/include/modules/xdp.h b/src/user/include/modules/xdp.h index c7af5c6..b1afe77 100644 --- a/src/user/include/modules/xdp.h +++ b/src/user/include/modules/xdp.h @@ -46,9 +46,10 @@ int attach_xdp_all(struct xdp_filter_bpf *skel, __u32 ifindex, __u32 flags){ return 0; } -int detach_xdp_all(__u32 fd, __u32 ifindex, __u32 flags){ +int detach_xdp_all(__u32 ifindex, __u32 fd, __u32 flags){ int err = bpf_set_link_xdp_fd(ifindex, fd, flags); if(err<0){ + perror("j"); fprintf(stderr, "Failed to detach XDP program\n"); return -1; } diff --git a/src/user/xdp_filter.c b/src/user/xdp_filter.c index 5643462..ebe6e40 100644 --- a/src/user/xdp_filter.c +++ b/src/user/xdp_filter.c @@ -223,8 +223,46 @@ int main(int argc, char**argv){ } //Received signal to stop, detach program from network interface - detach_xdp_all(-1, ifindex, flags); + err = detach_sched_all(skel); + if(err<0){ + perror("ERR"); + goto cleanup; + } + printf("A:%i", err);fflush(stdout); + detach_xdp_all(ifindex, -1, flags); + + sleep(2); + err = attach_sched_all(skel); + if(err<0){ + perror("ERR"); + goto cleanup; + } + printf("B:%i", err);fflush(stdout); + + exiting = false; + while (!exiting) { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + + //Checking if a signal occured + if (err == -EINTR) { + err = 0; + break; + } + if (err < 0) { + printf("Error polling ring buffer: %d\n", err); + break; + } + } + + err = detach_sched_all(skel); + if(err<0){ + perror("ERR"); + goto cleanup; + } + printf("C:%i", err);fflush(stdout); + + sleep(2); cleanup: ring_buffer__free(rb);