[U-Boot] [RFC PATCH v2 06/11] net: IPv6 skeleton and environment variables
Joe Hershberger
joe.hershberger at gmail.com
Tue Nov 24 02:06:35 CET 2015
Hi Chris,
On Mon, Nov 9, 2015 at 1:38 AM, Chris Packham <judge.packham at 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 at 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 at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
More information about the U-Boot
mailing list