From 183515b67a757d51f538af3dc6dcd2c889ddd3af Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Tue, 28 Nov 2017 12:31:50 +0100 Subject: commands: Add ip_route_add command The ip_route_get command is used to retrieve the network device used to reach a given IP address. This is useful for informational purposes and also for the network boot which wants to get the linux.bootargs parameter of the network device used for nfsroot. Signed-off-by: Sascha Hauer --- commands/ip-route-get.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 commands/ip-route-get.c (limited to 'commands/ip-route-get.c') diff --git a/commands/ip-route-get.c b/commands/ip-route-get.c new file mode 100644 index 0000000000..d393218188 --- /dev/null +++ b/commands/ip-route-get.c @@ -0,0 +1,96 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include + +static int do_ip_route_get(int argc, char *argv[]) +{ + struct eth_device *edev; + IPaddr_t ip, gw = 0; + const char *variable = NULL; + int opt, ret; + bool bootarg = false; + + while ((opt = getopt(argc, argv, "b")) > 0) { + switch (opt) { + case 'b': + bootarg = true; + break; + default: + return COMMAND_ERROR_USAGE; + } + } + + if (argc == optind) + return COMMAND_ERROR_USAGE; + + if (argc == optind + 2) + variable = argv[optind + 1]; + + ret = string_to_ip(argv[optind], &ip); + if (ret) { + printf("Cannot convert %s into a IP address: %s\n", + argv[1], strerror(-ret)); + return 1; + } + + edev = net_route(ip); + if (!edev) { + gw = net_get_gateway(); + if (gw) + edev = net_route(gw); + } + + if (!edev) { + printf("IP %pI4 is not reachable\n", &ip); + return 1; + } + + if (variable) { + if (bootarg) + setenv(variable, edev->bootarg); + else + setenv(variable, edev->devname); + return 0; + } + + if (bootarg) { + printf("%s\n", edev->bootarg); + } else { + if (gw) + printf("%pI4 via %pI4 dev %s\n", &ip, &gw, + edev->devname); + else + printf("%pI4 dev %s\n", &ip, edev->devname); + } + + return 0; +} + +BAREBOX_CMD_HELP_START(ip_route_get) +BAREBOX_CMD_HELP_TEXT("get ethernet device used to reach given IP address") +BAREBOX_CMD_HELP_TEXT("") +BAREBOX_CMD_HELP_TEXT("Options:") +BAREBOX_CMD_HELP_OPT("-b", "Instead of ethernet device, show linux bootargs for that device") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(ip_route_get) + .cmd = do_ip_route_get, + BAREBOX_CMD_DESC("get ethernet device name for an IP address") + BAREBOX_CMD_OPTS("[-b] [variable]") + BAREBOX_CMD_GROUP(CMD_GRP_MISC) + BAREBOX_CMD_COMPLETE(empty_complete) +BAREBOX_CMD_END -- cgit v1.2.3