diff options
Diffstat (limited to 'src/xdp/xdp_prog_user.c')
-rw-r--r-- | src/xdp/xdp_prog_user.c | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/src/xdp/xdp_prog_user.c b/src/xdp/xdp_prog_user.c index d91610791..c47d2977d 100644 --- a/src/xdp/xdp_prog_user.c +++ b/src/xdp/xdp_prog_user.c @@ -50,10 +50,34 @@ static const struct option_wrapper long_options[] = { {{0, 0, NULL, 0 }, NULL, false} }; +static int parse_u8(char *str, unsigned char *x) +{ + unsigned long z; + + z = strtoul(str, 0, 16); + if (z > 0xff) + return -1; + + if (x) + *x = z; + + return 0; +} + static int parse_mac(char *str, unsigned char mac[ETH_ALEN]) { - /* Assignment 3: parse a MAC address in this function and place the - * result in the mac array */ + if (parse_u8(str, &mac[0]) < 0) + return -1; + if (parse_u8(str + 3, &mac[1]) < 0) + return -1; + if (parse_u8(str + 6, &mac[2]) < 0) + return -1; + if (parse_u8(str + 9, &mac[3]) < 0) + return -1; + if (parse_u8(str + 12, &mac[4]) < 0) + return -1; + if (parse_u8(str + 15, &mac[5]) < 0) + return -1; return 0; } @@ -123,9 +147,11 @@ int main(int argc, char **argv) return EXIT_FAIL_OPTION; } - - /* Assignment 3: open the tx_port map corresponding to the cfg.ifname interface */ - map_fd = -1; + /* Open the tx_port map corresponding to the cfg.ifname interface */ + map_fd = open_bpf_map_file(pin_dir, "tx_port", NULL); + if (map_fd < 0) { + return EXIT_FAIL_BPF; + } printf("map dir: %s\n", pin_dir); @@ -135,8 +161,11 @@ int main(int argc, char **argv) bpf_map_update_elem(map_fd, &i, &cfg.redirect_ifindex, 0); printf("redirect from ifnum=%d to ifnum=%d\n", cfg.ifindex, cfg.redirect_ifindex); - /* Assignment 3: open the redirect_params map corresponding to the cfg.ifname interface */ - map_fd = -1; + /* Open the redirect_params map */ + map_fd = open_bpf_map_file(pin_dir, "redirect_params", NULL); + if (map_fd < 0) { + return EXIT_FAIL_BPF; + } /* Setup the mapping containing MAC addresses */ if (write_iface_params(map_fd, src, dest) < 0) { @@ -144,7 +173,9 @@ int main(int argc, char **argv) return 1; } } else { - /* Assignment 4: setup 1-1 mapping for the dynamic router */ + /* setup 1-1 mapping for the dynamic router */ + for (i = 1; i < 256; ++i) + bpf_map_update_elem(map_fd, &i, &i, 0); } return EXIT_OK; |