From f6113588706628f09282a00205f901baf0c72a20 Mon Sep 17 00:00:00 2001
From: Jo-Philipp Wich <jow@openwrt.org>
Date: Thu, 3 Dec 2015 22:27:06 +0000
Subject: [PATCH] base-files: board.d: support specifiying the protocol of lan
 and wan

Some boards, e.g. the Sheeva Plug, require the lan interface to be set
to DHCP instead of a static address, therfore support that.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>

SVN-Revision: 47732
---
 package/base-files/files/bin/config_generate  | 32 +++++++++++------
 .../files/lib/functions/uci-defaults-new.sh   | 36 +++++++++++++------
 2 files changed, 47 insertions(+), 21 deletions(-)

diff --git a/package/base-files/files/bin/config_generate b/package/base-files/files/bin/config_generate
index 264f7d3ed17..02f6998c84d 100755
--- a/package/base-files/files/bin/config_generate
+++ b/package/base-files/files/bin/config_generate
@@ -20,12 +20,13 @@ generate_static_network() {
 	EOF
 }
 
+addr_offset=2
 generate_network() {
-	local ifname macaddr type
+	local ifname macaddr protocol type
 
 	json_select network
 		json_select "$1"
-			json_get_vars ifname macaddr
+			json_get_vars ifname macaddr protocol
 		json_select ..
 	json_select ..
 
@@ -45,23 +46,32 @@ generate_network() {
 		set network.$1.macaddr='$macaddr'
 	EOF
 
-	case "$1" in
-		lan)
+	case "$protocol" in
+		static)
+			local ipaddr
+			case "$1" in
+				lan) ipaddr="192.168.1.1" ;;
+				*) ipaddr="192.168.$((addr_offset++)).1" ;;
+			esac
+
 			uci -q batch <<-EOF
 				set network.$1.proto='static'
-				set network.$1.ipaddr='192.168.1.1'
+				set network.$1.ipaddr='$ipaddr'
 				set network.$1.netmask='255.255.255.0'
 				set network.$1.ip6assign='60'
 			EOF
 		;;
-		wan)
+
+		dhcp)
+			# fixup IPv6 slave interface if parent is a bridge
+			[ "$type" = "bridge" ] && ifname="br-$1"
+
 			uci -q batch <<-EOF
 				set network.$1.proto='dhcp'
-				delete network.wan6
-				set network.wan6='interface'
-				set network.wan6.type='$type'
-				set network.wan6.ifname='$ifname'
-				set network.wan6.proto='dhcpv6'
+				delete network.${1}6
+				set network.${1}6='interface'
+				set network.${1}6.ifname='$ifname'
+				set network.${1}6.proto='dhcpv6'
 			EOF
 		;;
 	esac
diff --git a/package/base-files/files/lib/functions/uci-defaults-new.sh b/package/base-files/files/lib/functions/uci-defaults-new.sh
index 9fa3fa204ec..b350549b344 100755
--- a/package/base-files/files/lib/functions/uci-defaults-new.sh
+++ b/package/base-files/files/lib/functions/uci-defaults-new.sh
@@ -32,9 +32,26 @@ json_select_object() {
 _ucidef_set_interface() {
 	local name="$1"
 	local iface="$2"
+	local proto="$3"
 
 	json_select_object "$name"
 	json_add_string ifname "$iface"
+
+	if ! json_is_a protocol string; then
+		case "$proto" in
+			static|dhcp|none) : ;;
+			*)
+				case "$name" in
+					lan) proto="static" ;;
+					wan) proto="dhcp" ;;
+					*) proto="none" ;;
+				esac
+			;;
+		esac
+
+		json_add_string protocol "$proto"
+	fi
+
 	json_select ..
 }
 
@@ -57,19 +74,15 @@ ucidef_set_interface_loopback()
 }
 
 ucidef_set_interface_lan() {
-	local lan_if="$1"
-
 	json_select_object network
-	_ucidef_set_interface lan "$lan_if"
+	_ucidef_set_interface lan "$@"
 	json_select ..
 }
 
 ucidef_set_interface_wan() {
-        local wan_if="$1"
-
-        json_select_object network
-        _ucidef_set_interface wan "$wan_if"
-        json_select ..
+	json_select_object network
+	_ucidef_set_interface wan "$@"
+	json_select ..
 }
 
 ucidef_set_interfaces_lan_wan() {
@@ -164,14 +177,17 @@ _ucidef_finish_switch_roles() {
 		json_select ..
 
 		json_select_object network
+			local devices
+
 			json_select_object "$role"
 				# attach previous interfaces (for multi-switch devices)
-				local devices; json_get_var devices ifname
+				json_get_var devices ifname
 				if ! list_contains devices "$device"; then
 					devices="${devices:+$devices }$device"
 				fi
-				json_add_string ifname "$devices"
 			json_select ..
+
+			_ucidef_set_interface "$role" "$devices"
 		json_select ..
 	done
 }
-- 
GitLab