From e1a37a01ac716264b013cec5440c34c4497d15aa Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Fri, 23 Jun 2017 19:39:02 +0200 Subject: [PATCH] shell: commands: extend nib shell command for forwarding table --- sys/shell/commands/sc_gnrc_ipv6_nib.c | 68 ++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/sys/shell/commands/sc_gnrc_ipv6_nib.c b/sys/shell/commands/sc_gnrc_ipv6_nib.c index 0ec222a70..4c7c2f34b 100644 --- a/sys/shell/commands/sc_gnrc_ipv6_nib.c +++ b/sys/shell/commands/sc_gnrc_ipv6_nib.c @@ -22,6 +22,7 @@ static void _usage(char **argv); static int _nib_neigh(int argc, char **argv); static int _nib_prefix(int argc, char **argv); +static int _nib_route(int argc, char **argv); int _gnrc_ipv6_nib(int argc, char **argv) { @@ -37,6 +38,9 @@ int _gnrc_ipv6_nib(int argc, char **argv) else if (strcmp(argv[1], "prefix") == 0) { res = _nib_prefix(argc, argv); } + else if (strcmp(argv[1], "route") == 0) { + res = _nib_route(argc, argv); + } else { _usage(argv); } @@ -45,7 +49,7 @@ int _gnrc_ipv6_nib(int argc, char **argv) static void _usage(char **argv) { - printf("usage: %s {neigh|prefix|help} ...\n", argv[0]); + printf("usage: %s {neigh|prefix|route|help} ...\n", argv[0]); } static void _usage_nib_neigh(char **argv) @@ -65,6 +69,15 @@ static void _usage_nib_prefix(char **argv) printf(" %s %s show \n", argv[0], argv[1]); } +static void _usage_nib_route(char **argv) +{ + printf("usage: %s %s [show|add|del|help]\n", argv[0], argv[1]); + printf(" %s %s add [/] \n", + argv[0], argv[1]); + printf(" %s %s del [/]\n", argv[0], argv[1]); + printf(" %s %s show \n", argv[0], argv[1]); +} + static int _nib_neigh(int argc, char **argv) { if ((argc == 2) || (strcmp(argv[2], "show") == 0)) { @@ -169,4 +182,57 @@ static int _nib_prefix(int argc, char **argv) return 0; } +static int _nib_route(int argc, char **argv) +{ + if ((argc == 2) || (strcmp(argv[2], "show") == 0)) { + gnrc_ipv6_nib_ft_t entry; + void *state = NULL; + unsigned iface = 0U; + + if (argc > 3) { + iface = atoi(argv[3]); + } + while (gnrc_ipv6_nib_ft_iter(NULL, iface, &state, &entry)) { + gnrc_ipv6_nib_ft_print(&entry); + } + } + else if ((argc > 2) && (strcmp(argv[2], "help") == 0)) { + _usage_nib_route(argv); + } + else if ((argc > 5) && (strcmp(argv[2], "add") == 0)) { + ipv6_addr_t pfx = IPV6_ADDR_UNSPECIFIED, next_hop; + unsigned iface = atoi(argv[3]); + unsigned pfx_len = ipv6_addr_split_prefix(argv[4]); + + if (ipv6_addr_from_str(&pfx, argv[4]) == NULL) { + /* check if string equals "default" + * => keep pfx as unspecified address == default route */ + if (strcmp(argv[4], "default") != 0) { + _usage_nib_route(argv); + return 1; + } + } + if (ipv6_addr_from_str(&next_hop, argv[5]) == NULL) { + _usage_nib_route(argv); + return 1; + } + gnrc_ipv6_nib_ft_add(&pfx, pfx_len, &next_hop, iface); + } + else if ((argc > 4) && (strcmp(argv[2], "del") == 0)) { + ipv6_addr_t pfx; + unsigned pfx_len = ipv6_addr_split_prefix(argv[4]); + + if (ipv6_addr_from_str(&pfx, argv[4]) == NULL) { + _usage_nib_route(argv); + return 1; + } + gnrc_ipv6_nib_ft_del(&pfx, pfx_len); + } + else { + _usage_nib_route(argv); + return 1; + } + return 0; +} + /** @} */