1 #include <bpf/libbpf.h> 2 #include <linux/if_link.h> 3 #include <net/if.h> 4 #include <string.h> 5 #include <bpf/bpf.h> 6 #include "l3lb.h" 7 8 9 int main(int argc, char **argv) { 10 __u32 curr_prog_fd=0; 11 int prog_fd; 12 if (argc != 4) { 13 printf("Usage: %s [in_inf] [out_inf] [tx_addr]\n", argv[0]); 14 return 1; 15 } 16 int if1 = if_nametoindex(argv[1]); 17 if (!if1) { perror("Fail to get inf index"); return 1; } 18 if (bpf_get_link_xdp_id(if1, &curr_prog_fd, XDP_FLAGS_UPDATE_IF_NOEXIST)) { perror("bpf_get_link_xdp_id failed\n"); return 1; } 19 if (curr_prog_fd) { 20 printf("xdp prog id(%d) already linked to %s, removing it now..\n", curr_prog_fd, argv[1]); 21 bpf_set_link_xdp_fd(if1, -1, XDP_FLAGS_UPDATE_IF_NOEXIST); 22 } 23 int if2 = if_nametoindex(argv[2]); 24 if (!if2) { perror("Fail to get inf index"); return 1; } 25 if (bpf_get_link_xdp_id(if2, &curr_prog_fd, XDP_FLAGS_UPDATE_IF_NOEXIST)) { perror("bpf_get_link_xdp_id failed\n"); return 1; } 26 if (curr_prog_fd) { 27 printf("xdp prog id(%d) already linked to %s, removing it now..\n", curr_prog_fd, argv[2]); 28 bpf_set_link_xdp_fd(if2, -1, XDP_FLAGS_UPDATE_IF_NOEXIST); 29 } 30 unsigned int tx_addr = parse_ip(argv[3]); 31 if (tx_addr==0) { printf("invalid tx ip address %s\n", argv[3]); return 1; } 32 // load bpf object 33 struct bpf_prog_load_attr prog_load_attr = { 34 .prog_type = BPF_PROG_TYPE_XDP, 35 .file = "./l3lb_kern.o", 36 }; 37 struct bpf_object *obj; 38 if (bpf_prog_load_xattr(&prog_load_attr, &obj, &prog_fd)) { 39 perror("Fail to load bpf object"); 40 return 1; 41 } 42 int map_fd = bpf_object__find_map_fd_by_name(obj, "tx_addr"); 43 if (map_fd<0) { perror("Fail to locate tx addr map"); return 1; } 44 int key = 0; 45 int ret = bpf_map_update_elem(map_fd, &key, &tx_addr, 0); 46 if (ret) { perror("Fail to update tx addr"); return 1; } 47 48 if (bpf_set_link_xdp_fd(if1, prog_fd, XDP_FLAGS_UPDATE_IF_NOEXIST) < 0) { 49 printf("fail to link if1\n"); return 1; 50 } 51 if (bpf_set_link_xdp_fd(if2, prog_fd, XDP_FLAGS_UPDATE_IF_NOEXIST) < 0) { 52 printf("fail to link if2\n"); return 1; 53 } 54 return 0; 55 } 56