Hi Viacheslav, On Tue, 30 Aug 2022 at 07:02, Viacheslav Mitrofanov <v.v.mitrofa...@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.mitrofa...@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