
Hi Viacheslav,
On Tue, 30 Aug 2022 at 07:02, Viacheslav Mitrofanov v.v.mitrofanov@yadro.com wrote:
The command tftpboot uses IPv4 by default. Add the possibility to use IPv6 instead. If an address in the command is an IPv6 address it will use IPv6 to boot or if there is a suffix -ipv6 in the end of the command it also force using IPv6. All other tftpboot features and parameters are left the same.
Signed-off-by: Viacheslav Mitrofanov v.v.mitrofanov@yadro.com
cmd/net.c | 22 +++++++++++++++++++ net/net.c | 34 ++++++++++++++++++++++++++++-- net/tftp.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 108 insertions(+), 10 deletions(-)
diff --git a/cmd/net.c b/cmd/net.c index 3619c843d8..0225f9ce3e 100644 --- a/cmd/net.c +++ b/cmd/net.c @@ -14,6 +14,7 @@ #include <env.h> #include <image.h> #include <net.h> +#include <net6.h> #include <net/udp.h> #include <net/sntp.h>
@@ -44,12 +45,22 @@ int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return ret; }
+#if IS_ENABLED(CONFIG_IPV6) +U_BOOT_CMD(
tftpboot, 4, 1, do_tftpb,
"boot image via network using TFTP protocol\n"
"To use IPv6 add -ipv6 parameter or use IPv6 hostIPaddr framed "
"with [] brackets",
"[loadAddress] [[hostIPaddr:]bootfilename] [" USE_IP6_CMD_PARAM "]"
+); +#else U_BOOT_CMD( tftpboot, 3, 1, do_tftpb, "boot image via network using TFTP protocol", "[loadAddress] [[hostIPaddr:]bootfilename]" ); #endif +#endif
#ifdef CONFIG_CMD_TFTPPUT static int do_tftpput(struct cmd_tbl *cmdtp, int flag, int argc, @@ -205,6 +216,17 @@ static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc, if (s != NULL) image_load_addr = hextoul(s, NULL);
if (IS_ENABLED(CONFIG_IPV6)) {
use_ip6 = false;
/* IPv6 parameter has to be always *last* */
if (!strcmp(argv[argc - 1], USE_IP6_CMD_PARAM)) {
use_ip6 = true;
/* It is a hack not to break switch/case code */
--argc;
}
}
switch (argc) { case 1: /* refresh bootfile name from env */
diff --git a/net/net.c b/net/net.c index f818170930..77f42d1d59 100644 --- a/net/net.c +++ b/net/net.c @@ -449,6 +449,23 @@ restart: debug_cond(DEBUG_INT_STATE, "--- net_loop Init\n"); net_init_loop();
/* Find out what protocol to use */
if (IS_ENABLED(CONFIG_IPV6) && !use_ip6) {
char *s, *e;
char str_ip6[16];
s = strchr(net_boot_file_name, '[');
e = strchr(net_boot_file_name, ']');
if (s && e) {
size_t len = e - s;
memcpy(str_ip6, s + 1, len);
str_ip6[len - 1] = '\0';
if (!string_to_ip6(str_ip6, &net_server_ip6))
Should string_to_ip6 take a length param so the string does not need to be nul-terminated?
use_ip6 = true;
}
}
[..]
Regards, Simon