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/Kconfig | 10 ++++++ commands/Makefile | 1 + commands/ip-route-get.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 commands/ip-route-get.c diff --git a/commands/Kconfig b/commands/Kconfig index ae2dc4b094..eee4b6aee8 100644 --- a/commands/Kconfig +++ b/commands/Kconfig @@ -1200,6 +1200,16 @@ config CMD_TFTP Options: -p push to TFTP server +config CMD_IP_ROUTE_GET + tristate + prompt "ip-route-get" + default y + help + The ip-route-get command is used to retrieve the network interface + which is used to reach the specified IP address. Information can + be shown on the command line or alternatively a variable is set to + the result. + # end Network commands endmenu diff --git a/commands/Makefile b/commands/Makefile index 582175f631..eb4796389e 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -122,3 +122,4 @@ obj-$(CONFIG_CMD_SPD_DECODE) += spd_decode.o obj-$(CONFIG_CMD_MMC_EXTCSD) += mmc_extcsd.o obj-$(CONFIG_CMD_NAND_BITFLIP) += nand-bitflip.o obj-$(CONFIG_CMD_SEED) += seed.o +obj-$(CONFIG_CMD_IP_ROUTE_GET) += ip-route-get.o 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