From a9e848f1b73ec05528ca7c01603a80ff87faad97 Mon Sep 17 00:00:00 2001
From: cyrus <cyrus@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Tue, 15 Jan 2013 13:07:51 +0000
Subject: base-files: add support for ipv6-prefixes in connection with netifd

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35168 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/base-files/Makefile                        |  2 +-
 package/base-files/files/etc/sysctl.conf           |  2 ++
 .../base-files/files/etc/uci-defaults/generate-ula | 18 +++++++++++++
 package/base-files/files/lib/functions/network.sh  | 30 ++++++++++++++++++++++
 4 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 package/base-files/files/etc/uci-defaults/generate-ula

diff --git a/package/base-files/Makefile b/package/base-files/Makefile
index 5bb2e2565..7c9c14de9 100644
--- a/package/base-files/Makefile
+++ b/package/base-files/Makefile
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 include $(INCLUDE_DIR)/version.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=124
+PKG_RELEASE:=125
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_BUILD_DEPENDS:=opkg/host
diff --git a/package/base-files/files/etc/sysctl.conf b/package/base-files/files/etc/sysctl.conf
index ef3db4ec5..4ea01bb4c 100644
--- a/package/base-files/files/etc/sysctl.conf
+++ b/package/base-files/files/etc/sysctl.conf
@@ -12,6 +12,8 @@ net.ipv4.tcp_timestamps=1
 net.ipv4.tcp_sack=1
 net.ipv4.tcp_dsack=1
 
+net.ipv6.conf.all.forwarding=1
+
 net.netfilter.nf_conntrack_acct=1
 net.netfilter.nf_conntrack_checksum=0
 net.netfilter.nf_conntrack_max=16384
diff --git a/package/base-files/files/etc/uci-defaults/generate-ula b/package/base-files/files/etc/uci-defaults/generate-ula
new file mode 100644
index 000000000..f3e493145
--- /dev/null
+++ b/package/base-files/files/etc/uci-defaults/generate-ula
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+[ "$(uci get network.globals.ula_prefix)" != "auto" ] && exit 0
+# Sometimes results are empty, therefore try until it works...          
+local r1 r2 r3
+while [ -z "$r1" -o -z "$r2" -o -z "$r3" ]; do
+	r1=$(printf "%02x" $(($(</dev/urandom tr -dc 0-9 | dd bs=9 count=1) % 256)))
+	r2=$(printf "%01x" $(($(</dev/urandom tr -dc 0-9 | dd bs=9 count=1) % 65536)))
+	r3=$(printf "%01x" $(($(</dev/urandom tr -dc 0-9 | dd bs=9 count=1) % 65536)))
+done
+
+uci -q batch <<-EOF >/dev/null
+	set network.globals.ula_prefix=fd$r1:$r2:$r3::/48
+	commit network
+EOF
+
+exit 0
+
diff --git a/package/base-files/files/lib/functions/network.sh b/package/base-files/files/lib/functions/network.sh
index 424965acb..8f87d1d0b 100644
--- a/package/base-files/files/lib/functions/network.sh
+++ b/package/base-files/files/lib/functions/network.sh
@@ -57,6 +57,20 @@ __network_parse_ifstatus()
 			fi
 		done
 
+		# parse prefixes
+		if json_is_a "ipv6_prefix" array; then
+			json_select "ipv6_prefix"
+
+			if json_is_a 1 object; then
+				json_select 1
+				__network_set_cache "${__key}_prefix6_address"	address
+				__network_set_cache "${__key}_prefix6_mask"	mask
+				json_select ".."
+			fi
+
+			json_select ".."
+		fi
+
 		# parse routes
 		if json_is_a route array; then
 
@@ -170,6 +184,22 @@ network_get_subnet()  { __network_ipaddr "$1" "$2" 4 1; }
 # 2: interface
 network_get_subnet6() { __network_ipaddr "$1" "$2" 6 1; }
 
+# determine IPv6 prefix
+network_get_prefix6() {
+	local __prefix="$1"
+	local __iface="$2"
+	local __address
+	local __mask
+
+	__network_parse_ifstatus "$__iface" || return 1
+	__network_export __address "${__iface}_prefix6_address"
+	local return="$?"
+	[ "$return" -eq 0 ] || return $?
+	__network_export __mask "${__iface}_prefix6_mask"
+	eval "$__prefix=$__address/$__mask"
+	return 0
+}
+
 
 __network_gateway()
 {
-- 
cgit v1.2.3