diff options
Diffstat (limited to 'package/firewall/files/reflection.hotplug')
| -rw-r--r-- | package/firewall/files/reflection.hotplug | 36 | 
1 files changed, 33 insertions, 3 deletions
| diff --git a/package/firewall/files/reflection.hotplug b/package/firewall/files/reflection.hotplug index 1feb21075..73d9c61df 100644 --- a/package/firewall/files/reflection.hotplug +++ b/package/firewall/files/reflection.hotplug @@ -1,9 +1,38 @@  #!/bin/sh  . /etc/functions.sh +. /usr/share/libubox/jshn.sh + +find_iface_address() +{ +	local iface="$1" +	local ipaddr="$2" +	local prefix="$3" + +	local tmp="$(ubus call network.interface."$iface" status 2>/dev/null)" + +	json_load "${tmp:-{}}" +	json_get_type tmp address + +	if [ "$tmp" = array ]; then + +		json_select address +		json_get_type tmp 1 + +		if [ "$tmp" = object ]; then + +			json_select 1 +			[ -n "$ipaddr" ] && json_get_var "$ipaddr" address +			[ -n "$prefix" ] && json_get_var "$prefix" mask + +		fi +	fi +}  if [ "$ACTION" = "add" ] && [ "$INTERFACE" = "wan" ]; then -	local wanip=$(uci -P/var/state get network.wan.ipaddr) +	local wanip +	find_iface_address wan wanip +	[ -n "$wanip" ] || return  	iptables -t nat -F nat_reflection_in 2>/dev/null || {  		iptables -t nat -N nat_reflection_in @@ -60,8 +89,9 @@ if [ "$ACTION" = "add" ] && [ "$INTERFACE" = "wan" ]; then  			local net  			for net in $(find_networks "$dest"); do -				local lanip=$(uci -P/var/state get network.$net.ipaddr) -				local lanmk=$(uci -P/var/state get network.$net.netmask) +				local lanip lanmk +				find_iface_address "$net" lanip lanmk +				[ -n "$lanip" ] || return  				local proto  				config_get proto "$cfg" proto | 
