From patchwork Wed Jan 25 09:56:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Packham X-Patchwork-Id: 719612 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3v7gTg5Y6Hz9ryZ for ; Wed, 25 Jan 2017 20:57:59 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AoopEQfo"; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 1034FA762D; Wed, 25 Jan 2017 10:57:53 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id RrGclezbg2PQ; Wed, 25 Jan 2017 10:57:52 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 6E841A75CA; Wed, 25 Jan 2017 10:57:34 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 604C8B3867 for ; Wed, 25 Jan 2017 10:57:16 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id t4J7QtmvD6Ow for ; Wed, 25 Jan 2017 10:57:16 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-pg0-f67.google.com (mail-pg0-f67.google.com [74.125.83.67]) by theia.denx.de (Postfix) with ESMTPS id 49B84A75D7 for ; Wed, 25 Jan 2017 10:57:08 +0100 (CET) Received: by mail-pg0-f67.google.com with SMTP id 194so19295124pgd.0 for ; Wed, 25 Jan 2017 01:57:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=w0PTl4VCm/hGtErKVrDrRezydAvTLQbecoCgOZwkwJs=; b=AoopEQfovNJtnMZdy9TiobyYjPyFEaFcNGuEH7EVqvWJwRb2pyAORTvAlof5PuvAyN 886CrYw4yAQFi/09TQFksZElx9RhEmYIdtnd36fmGDxrZmj1qRs6G5c8ztjO0LdSJRKl cpmv/Efpst7AqpCpROLPGAmWdJURTq9iSWbkt7oEEWnizb+75k77lMG9WuCk82+Ny0JU EvZyXvjDypiRiTu4PX7Nr9F26jRirXGC0eyDbqVOyM3/BDt1M40d2H74KTPV9kr27taB SlJVpkbbh9aYeyR2d/o7P8T4gz1xuy03uTGPaPqohYffLe6++zDrh9H29Jmd1DmsMV3v 3mIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=w0PTl4VCm/hGtErKVrDrRezydAvTLQbecoCgOZwkwJs=; b=JoLpmViUGsgdRzUR3E9a/4mh/HMWzD43uH2YzzzqAbpNDrCDDLMJYvF+txjcqroaKm y6WtjvFFi4g6yzsgj/k1iDGS9PljAaoH6J5ibIiI7F+qcu5di2R+4dQEntdrmFfr1tYu rsns6aXR0a+WRAR9lBZ8fFZYThk/0kkiJOk/fv44OTje0KV4ZoCyTHpO7c7nPGrq+OVy FnJ1lzQ0dLnUro4UDcXWaM/VMuOBMbmyAMYTQEytuPHy7/XAZlhtBeXvJj8JMyXDR7kN tLRe+I2PZmx/Zxz7rKctqp1VFRW0GqTjv7iLAwqcC8PoV7X8I6OrwWBf5fK2grjMFC3w AOEg== X-Gm-Message-State: AIkVDXIXOL2v1zqhan+SdHt3JT+aMZqEgEjq3QOAdynMcmpFB6/lofbsoRqvVV8fLT6sbg== X-Received: by 10.84.231.142 with SMTP id g14mr2309487plk.13.1485338226884; Wed, 25 Jan 2017 01:57:06 -0800 (PST) Received: from chrisp-dl.atlnz.lc ([2001:df5:b000:22:8d2c:469e:c0fc:f3ee]) by smtp.gmail.com with ESMTPSA id t87sm50980162pfe.59.2017.01.25.01.57.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 25 Jan 2017 01:57:06 -0800 (PST) From: Chris Packham To: u-boot@lists.denx.de, Joe Hershberger Date: Wed, 25 Jan 2017 22:56:16 +1300 Message-Id: <20170125095622.20326-6-judge.packham@gmail.com> X-Mailer: git-send-email 2.11.0.24.ge6920cf In-Reply-To: <20170125095622.20326-1-judge.packham@gmail.com> References: <20170125095622.20326-1-judge.packham@gmail.com> Cc: Angga , hannah@marvell.com, jp.tosoni@acksys.fr, luka.kovacica@gmail.com, reed@fb.com, Chris Packham Subject: [U-Boot] [RFC PATCH v3 05/11] net: IPv6 skeleton and environment variables X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" 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 --- Changes in v3: None 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 | 6 +++- net/Makefile | 1 + net/net6.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 net/net6.c diff --git a/include/env_callback.h b/include/env_callback.h index 90b95b5e6676..97e245bff09d 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," +#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 0dcec0689b19..916e4bec394f 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 414c5497c758..bc70cc59defd 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -32,6 +32,11 @@ 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 + config BOOTP_PXE_CLIENTARCH hex default 0x16 if ARM64 @@ -44,5 +49,4 @@ config BOOTP_VCI_STRING default "U-Boot.armv8" if ARM64 default "U-Boot.arm" if ARM default "U-Boot" - endif # if NET diff --git a/net/Makefile b/net/Makefile index f03d6083268f..b5e8c5c758c9 100644 --- a/net/Makefile +++ b/net/Makefile @@ -25,3 +25,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 000000000000..f778cef5ada9 --- /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 +#include +#include +#include +#include +#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; + + net_prefix_length = 128; + 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; +} +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);