diff options
Diffstat (limited to 'package/base-files/files/lib/network')
| -rwxr-xr-x | package/base-files/files/lib/network/config.sh | 63 | 
1 files changed, 38 insertions, 25 deletions
diff --git a/package/base-files/files/lib/network/config.sh b/package/base-files/files/lib/network/config.sh index 1bbe6232e..a5cadf61b 100755 --- a/package/base-files/files/lib/network/config.sh +++ b/package/base-files/files/lib/network/config.sh @@ -24,8 +24,7 @@ find_config() {  }  scan_interfaces() { -	local cfgfile="$1" -	local mode iftype iface ifname device +	local cfgfile="${1:-network}"  	interfaces=  	config_cb() {  		case "$1" in @@ -33,18 +32,19 @@ scan_interfaces() {  				config_set "$2" auto 1  			;;  		esac +		local iftype ifname device proto  		config_get iftype "$CONFIG_SECTION" TYPE  		case "$iftype" in  			interface) -				config_get proto "$CONFIG_SECTION" proto  				append interfaces "$CONFIG_SECTION" +				config_get proto "$CONFIG_SECTION" proto  				config_get iftype "$CONFIG_SECTION" type  				config_get ifname "$CONFIG_SECTION" ifname -				config_get device "$CONFIG_SECTION" device -				config_set "$CONFIG_SECTION" device "${device:-$ifname}" +				config_get device "$CONFIG_SECTION" device "$ifname" +				config_set "$CONFIG_SECTION" device "$device"  				case "$iftype" in  					bridge) -						config_set "$CONFIG_SECTION" ifnames "${device:-$ifname}" +						config_set "$CONFIG_SECTION" ifnames "$device"  						config_set "$CONFIG_SECTION" ifname br-"$CONFIG_SECTION"  					;;  				esac @@ -52,7 +52,7 @@ scan_interfaces() {  			;;  		esac  	} -	config_load "${cfgfile:-network}" +	config_load "${cfgfile}"  }  add_vlan() { @@ -84,7 +84,6 @@ prepare_interface() {  	local iface="$1"  	local config="$2"  	local vifmac="$3" -	local proto  	# if we're called for the bridge interface itself, don't bother trying  	# to create any interfaces here. The scripts have already done that, otherwise @@ -92,6 +91,7 @@ prepare_interface() {  	[ "br-$config" = "$iface" -o -e "$iface" ] && return 0;  	ifconfig "$iface" 2>/dev/null >/dev/null && { +		local proto  		config_get proto "$config" proto  		# make sure the interface is removed from any existing bridge and deconfigured, @@ -111,14 +111,13 @@ prepare_interface() {  	ifconfig "$iface" 2>/dev/null >/dev/null || return 0  	# Setup bridging +	local iftype  	config_get iftype "$config" type -	config_get stp "$config" stp  	case "$iftype" in  		bridge)  			[ -x /usr/sbin/brctl ] && {  				ifconfig "br-$config" 2>/dev/null >/dev/null && { -					local newdevs= - +					local newdevs devices  					config_get devices "$config" device  					for dev in $(sort_list "$devices" "$iface"); do  						append newdevs "$dev" @@ -127,11 +126,13 @@ prepare_interface() {  					$DEBUG brctl addif "br-$config" "$iface"  					# Bridge existed already. No further processing necesary  				} || { +					local stp +					config_get_bool stp "$config" stp 0  					$DEBUG brctl addbr "br-$config"  					$DEBUG brctl setfd "br-$config" 0  					$DEBUG ifconfig "br-$config" up  					$DEBUG brctl addif "br-$config" "$iface" -					$DEBUG brctl stp "br-$config" ${stp:-0} +					$DEBUG brctl stp "br-$config" $stp  					# Creating the bridge here will have triggered a hotplug event, which will  					# result in another setup_interface() call, so we simply stop processing  					# the current event at this point. @@ -148,6 +149,7 @@ set_interface_ifname() {  	local config="$1"  	local ifname="$2" +	local device  	config_get device "$1" device  	uci_set_state network "$config" ifname "$ifname"  	uci_set_state network "$config" device "$device" @@ -161,11 +163,13 @@ setup_interface_static() {  	local iface="$1"  	local config="$2" +	local ipaddr netmask ip6addr  	config_get ipaddr "$config" ipaddr  	config_get netmask "$config" netmask  	config_get ip6addr "$config" ip6addr  	[ -z "$ipaddr" -o -z "$netmask" ] && [ -z "$ip6addr" ] && return 1 +	local gateway ip6gw dns bcast  	config_get gateway "$config" gateway  	config_get ip6gw "$config" ip6gw  	config_get dns "$config" dns @@ -194,24 +198,30 @@ setup_interface_alias() {  	local parent="$2"  	local iface="$3" +	local cfg  	config_get cfg "$config" interface  	[ "$parent" == "$cfg" ] || return 0  	# alias counter -	config_get ctr "$parent" alias_count +	local ctr +	config_get ctr "$parent" alias_count 0  	ctr="$(($ctr + 1))"  	config_set "$parent" alias_count "$ctr"  	# alias list +	local list  	config_get list "$parent" aliases  	append list "$config"  	config_set "$parent" aliases "$list" -	set_interface_ifname "$config" "$iface:$ctr" -	config_get proto "$config" proto -	case "${proto:-static}" in +	iface="$iface:$ctr" +	set_interface_ifname "$config" "$iface" + +	local proto +	config_get proto "$config" proto "static" +	case "${proto}" in  		static) -			setup_interface_static "$iface:$ctr" "$config" +			setup_interface_static "$iface" "$config"  		;;  		*)  			echo "Unsupported type '$proto' for alias config '$config'" @@ -223,16 +233,13 @@ setup_interface_alias() {  setup_interface() {  	local iface="$1"  	local config="$2" +	local proto="$3"  	local vifmac="$4" -	local proto -	local macaddr -	local hasipv6  	[ -n "$config" ] || {  		config=$(find_config "$iface")  		[ "$?" = 0 ] || return 1  	} -	proto="${3:-$(config_get "$config" proto)}"  	prepare_interface "$iface" "$config" "$vifmac" || return 0 @@ -247,21 +254,24 @@ setup_interface() {  	# Check whether this interface has an IPv6 address  	# defined and ensure that the kmod is loaded since  	# ifup could be triggered before modules are loaded. +	local hasipv6  	config_get hasipv6 "$config" ip6addr  	[ -n "$hasipv6" ] && [ ! -d /proc/sys/net/ipv6 ] && {  		grep -q '^ipv6' /etc/modules.d/* && insmod ipv6  	}  	# Interface settings -	config_get mtu "$config" mtu -	config_get macaddr "$config" macaddr  	grep "$iface:" /proc/net/dev > /dev/null && { +		local mtu macaddr +		config_get mtu "$config" mtu +		config_get macaddr "$config" macaddr  		[ -n "$macaddr" ] && $DEBUG ifconfig "$iface" down  		$DEBUG ifconfig "$iface" ${macaddr:+hw ether "$macaddr"} ${mtu:+mtu $mtu} up  	}  	set_interface_ifname "$config" "$iface"  	pidfile="/var/run/$iface.pid" +	[ -n "$proto" ] || config_get proto "$config" proto  	case "$proto" in  		static)  			setup_interface_static "$iface" "$config" @@ -269,11 +279,11 @@ setup_interface() {  		dhcp)  			# prevent udhcpc from starting more than once  			lock "/var/lock/dhcp-$iface" -			pid="$(cat "$pidfile" 2>/dev/null)" +			local pid="$(cat "$pidfile" 2>/dev/null)"  			if [ -d "/proc/$pid" ] && grep udhcpc "/proc/${pid}/cmdline" >/dev/null 2>/dev/null; then  				lock -u "/var/lock/dhcp-$iface"  			else - +				local ipaddr netmask hostname proto1 clientid  				config_get ipaddr "$config" ipaddr  				config_get netmask "$config" netmask  				config_get hostname "$config" hostname @@ -284,6 +294,7 @@ setup_interface() {  					$DEBUG ifconfig "$iface" "$ipaddr" ${netmask:+netmask "$netmask"}  				# don't stay running in background if dhcp is not the main proto on the interface (e.g. when using pptp) +				local dhcpopts  				[ ."$proto1" != ."$proto" ] && dhcpopts="-n -q"  				$DEBUG eval udhcpc -t 0 -i "$iface" ${ipaddr:+-r $ipaddr} ${hostname:+-H $hostname} ${clientid:+-c $clientid} -b -p "$pidfile" ${dhcpopts:- -R &}  				lock -u "/var/lock/dhcp-$iface" @@ -306,6 +317,8 @@ setup_interface() {  			ifconfig "$ifn" down  		done  	} + +	local aliases  	config_set "$config" aliases ""  	config_set "$config" alias_count 0  	config_foreach setup_interface_alias alias "$config" "$iface"  | 
