
Hi Chris,
On Mon, Nov 9, 2015 at 1:38 AM, Chris Packham judge.packham@gmail.com wrote:
Create net6.c and add CONFIG_NET6 to Kconfig/Makefile. Also add support for the following environment variables:
- ip6addr
- gateway6
- serverip6
Signed-off-by: Chris Packham judge.packham@gmail.com
Changes in v2:
- Split environment variables from main implementation
- remove "prefixlength6" environment variable. The prefix length is now set when specifying the address i.e. setenv ip6addr 2001:db8::1/64.
include/env_callback.h | 8 +++++ include/env_flags.h | 9 +++++ net/Kconfig | 5 +++ net/Makefile | 1 + net/net6.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+) create mode 100644 net/net6.c
diff --git a/include/env_callback.h b/include/env_callback.h index 90b95b5..97e245b 100644 --- a/include/env_callback.h +++ b/include/env_callback.h @@ -60,6 +60,13 @@ #define NET_CALLBACKS #endif
+#ifdef CONFIG_NET6 +#define NET6_CALLBACKS \
"ip6addr:ip6addr," \
"serverip6:serverip6,"
Any reason why gateway6 is not in this list? Seems like an oversight since you define a handler for it below.
+#else +#define NET6_CALLBACKS +#endif /*
- This list of callback bindings is static, but may be overridden by defining
- a new association in the ".callbacks" environment variable.
@@ -68,6 +75,7 @@ ENV_DOT_ESCAPE ENV_FLAGS_VAR ":flags," \ "baudrate:baudrate," \ NET_CALLBACKS \
NET6_CALLBACKS \ "loadaddr:loadaddr," \ SILENT_CALLBACK \ SPLASHIMAGE_CALLBACK \
diff --git a/include/env_flags.h b/include/env_flags.h index 8823fb9..bf93f15 100644 --- a/include/env_flags.h +++ b/include/env_flags.h @@ -65,6 +65,14 @@ enum env_flags_varaccess { #define NET_FLAGS #endif
+#ifdef CONFIG_NET6 +#define NET6_FLAGS \
"ip6addr:s," \
"serverip6:s,"
+#else +#define NET6_FLAGS +#endif
#ifndef CONFIG_ENV_OVERWRITE #define SERIAL_FLAGS "serial#:so," #else @@ -74,6 +82,7 @@ enum env_flags_varaccess { #define ENV_FLAGS_LIST_STATIC \ ETHADDR_FLAGS \ NET_FLAGS \
NET6_FLAGS \ SERIAL_FLAGS \ CONFIG_ENV_FLAGS_LIST_STATIC
diff --git a/net/Kconfig b/net/Kconfig index a44a783..bacd914 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -32,4 +32,9 @@ config NET_TFTP_VARS If unset, timeout and maximum are hard-defined as 1 second and 10 timouts per TFTP transfer.
+config NET6
bool "IPv6 support"
help
Support for IPv6
endif # if NET diff --git a/net/Makefile b/net/Makefile index e9cc8ad..6da8019 100644 --- a/net/Makefile +++ b/net/Makefile @@ -20,3 +20,4 @@ obj-$(CONFIG_CMD_PING) += ping.o obj-$(CONFIG_CMD_RARP) += rarp.o obj-$(CONFIG_CMD_SNTP) += sntp.o obj-$(CONFIG_CMD_NET) += tftp.o +obj-$(CONFIG_NET6) += net6.o diff --git a/net/net6.c b/net/net6.c new file mode 100644 index 0000000..f778cef --- /dev/null +++ b/net/net6.c @@ -0,0 +1,89 @@ +/*
- Simple IPv6 network layer implementation.
- Based and/or adapted from the IPv4 network layer in net.[hc]
- (C) Copyright 2013 Allied Telesis Labs NZ
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <environment.h> +#include <malloc.h> +#include <net.h> +#include <net6.h> +#include "ndisc.h"
+/* Our gateway's IPv6 address */ +struct in6_addr net_gateway6 = ZERO_IPV6_ADDR; +/* Our IPv6 addr (0 = unknown) */ +struct in6_addr net_ip6 = ZERO_IPV6_ADDR; +/* set server IPv6 addr (0 = unknown) */ +struct in6_addr net_server_ip6 = ZERO_IPV6_ADDR; +/* The prefix length of our network */ +u_int32_t net_prefix_length;
+static int on_ip6addr(const char *name, const char *value, enum env_op op,
int flags)
+{
char *v, *s, *strcopy;
int i;
if (flags & H_PROGRAMMATIC)
return 0;
if (op == env_op_delete) {
net_prefix_length = 0;
net_copy_ip6(&net_ip6, &net_null_addr_ip6);
return 0;
}
strcopy = strdup(value);
if (strcopy == NULL)
return -1;
+ return -ENOMEM;
net_prefix_length = 128;
Does this imply that you are allowed to omit this part of the address now? I assume you are not allowed to omit it, hence the proposed code below.
i = 0;
s = strcopy;
--------------------
while (s) {
v = strsep(&s, "/");
if (!v)
break;
switch (i++) {
case 0:
string_to_ip6(v, &net_ip6);
break;
case 1:
net_prefix_length = simple_strtoul(v, NULL, 10);
break;
default:
break;
}
}
free(strcopy);
return 0;
+}
-------------------- This is a bit convoluted.
How about this: + int retval = 0; + + if (s) { + v = strsep(&s, "/"); + if (!v) { + retval = -EINVAL; + goto err_out; + } + + string_to_ip6(v, &net_ip6); + + v = strsep(&s, "/"); + if (!v) { + retval = -EINVAL; + goto err_out; + } + + net_prefix_length = simple_strtoul(v, NULL, 10); + } + err_out: + free(strcopy); + + return retval; +}
It is now linear and will return an error code when parsing fails, which will prevent the variable from being changed.
+U_BOOT_ENV_CALLBACK(ip6addr, on_ip6addr);
+static int on_gatewayip6(const char *name, const char *value, enum env_op op,
int flags)
+{
if (flags & H_PROGRAMMATIC)
return 0;
return string_to_ip6(value, &net_gateway6);
+} +U_BOOT_ENV_CALLBACK(gatewayip6, on_gatewayip6);
+static int on_serverip6(const char *name, const char *value, enum env_op op,
int flags)
+{
if (flags & H_PROGRAMMATIC)
return 0;
return string_to_ip6(value, &net_server_ip6);
+}
+U_BOOT_ENV_CALLBACK(serverip6, on_serverip6);
2.5.3
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot