aboutsummaryrefslogtreecommitdiff
path: root/cmd/net.c
diff options
context:
space:
mode:
authorViacheslav Mitrofanov2022-12-02 12:18:07 +0300
committerTom Rini2022-12-05 12:47:16 -0500
commit7fbf230d79ad531e680475529191e2ec08099c7d (patch)
tree722c1c3563f4e773312d6f758d9b826759136e22 /cmd/net.c
parentffdbf3bad5f3f2dd8320dc5628104d6c559cd36c (diff)
net: tftp: Add IPv6 support for tftpboot
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> Reviewed-by: Ramon Fried <rfried.dev@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'cmd/net.c')
-rw-r--r--cmd/net.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/cmd/net.c b/cmd/net.c
index f6d9f5ea3ab..221b3525caa 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>
#include <net/ncsi.h>
@@ -45,12 +46,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,
"load file 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,
@@ -306,6 +317,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;
+ }
+ }
+
if (parse_args(proto, argc, argv)) {
bootstage_error(BOOTSTAGE_ID_NET_START);
return CMD_RET_USAGE;
@@ -313,6 +335,19 @@ static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc,
bootstage_mark(BOOTSTAGE_ID_NET_START);
+ if (IS_ENABLED(CONFIG_IPV6) && !use_ip6) {
+ char *s, *e;
+ size_t len;
+
+ s = strchr(net_boot_file_name, '[');
+ e = strchr(net_boot_file_name, ']');
+ if (s && e) {
+ len = e - s;
+ if (!string_to_ip6(s + 1, len - 1, &net_server_ip6))
+ use_ip6 = true;
+ }
+ }
+
size = net_loop(proto);
if (size < 0) {
bootstage_error(BOOTSTAGE_ID_NET_NETLOOP_OK);