summaryrefslogtreecommitdiff
path: root/cmd/net.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-12-05 13:28:22 -0500
committerTom Rini <trini@konsulko.com>2022-12-05 13:28:22 -0500
commit6616ddb0f09c4ef3e8a79b76b146dbbd9c8f8c3d (patch)
tree9df20918981d508e1c9f8b27533abce955073889 /cmd/net.c
parenta50622d78c5c6babd1853ae913f339df54fe532c (diff)
parenta72926257c1dbc456d1cd02fc6bd5ef6147e143f (diff)
Merge branch '2022-12-05-add-IPv6-support'
To quote the author: This patch set adds basic IPv6 support to U-boot. It is based on Chris's Packham patches (https://lists.denx.de/pipermail/u-boot/2017-January/279366.html) Chris's patches were taken as base. There were efforts to launch it on HiFive SiFive Unmatched board but the board didn't work well. The code was refactored, fixed some bugs as CRC for little-endian, some parts were implemented in our own way, something was taken from Linux. Finally we did manual tests and the board worked well. Testing was done on HiFive SiFive Unmatched board (RISC-V)
Diffstat (limited to 'cmd/net.c')
-rw-r--r--cmd/net.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/cmd/net.c b/cmd/net.c
index f6d9f5ea3ab..0e9f200ca97 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);
@@ -368,6 +403,32 @@ U_BOOT_CMD(
);
#endif
+#if IS_ENABLED(CONFIG_CMD_PING6)
+int do_ping6(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
+{
+ if (string_to_ip6(argv[1], strlen(argv[1]), &net_ping_ip6))
+ return CMD_RET_USAGE;
+
+ use_ip6 = true;
+ if (net_loop(PING6) < 0) {
+ use_ip6 = false;
+ printf("ping6 failed; host %pI6c is not alive\n",
+ &net_ping_ip6);
+ return 1;
+ }
+
+ use_ip6 = false;
+ printf("host %pI6c is alive\n", &net_ping_ip6);
+ return 0;
+}
+
+U_BOOT_CMD(
+ ping6, 2, 1, do_ping6,
+ "send ICMPv6 ECHO_REQUEST to network host",
+ "pingAddress"
+);
+#endif /* CONFIG_CMD_PING6 */
+
#if defined(CONFIG_CMD_CDP)
static void cdp_update_env(void)