A wireless interface in station mode with DHCP enabled loses it's IP
address whenever you run "wifi". This is because the existing udhcpc
instance keeps running, while the wireless interface is deleted and
recreated, so the IP configuration is lost but the udhcpc instance does
not send a new DHCP request.

Solve this problem by killing the existing DHCP instance and starting a
new one rather than keeping the old one.

Signed-off-by: Stijn Tintel <st...@linux-ipv6.be>
---
 package/base-files/files/lib/network/config.sh |   55 +++++++++++-------------
 1 files changed, 25 insertions(+), 30 deletions(-)

diff --git a/package/base-files/files/lib/network/config.sh 
b/package/base-files/files/lib/network/config.sh
index 8321b19..10bd08b 100755
--- a/package/base-files/files/lib/network/config.sh
+++ b/package/base-files/files/lib/network/config.sh
@@ -339,40 +339,35 @@ setup_interface() {
                        setup_interface_static "$iface" "$config"
                ;;
                dhcp)
-                       local lockfile="/var/lock/dhcp-$iface"
-                       lock "$lockfile"
-
-                       # prevent udhcpc from starting more than once
+                       # kill running udhcpc instance
                        local pidfile="/var/run/dhcp-${iface}.pid"
                        local pid="$(cat "$pidfile" 2>/dev/null)"
                        if [ -d "/proc/$pid" ] && grep -qs udhcpc 
"/proc/${pid}/cmdline"; then
-                               lock -u "$lockfile"
-                       else
-                               local ipaddr netmask hostname proto1 clientid 
broadcast
-                               config_get ipaddr "$config" ipaddr
-                               config_get netmask "$config" netmask
-                               config_get hostname "$config" hostname
-                               config_get proto1 "$config" proto
-                               config_get clientid "$config" clientid
-                               config_get_bool broadcast "$config" broadcast 0
-
-                               [ -z "$ipaddr" ] || \
-                                       $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"
-                               [ "$broadcast" = 1 ] && broadcast="-O 
broadcast" || broadcast=
-
-                               $DEBUG eval udhcpc -t 0 -i "$iface" \
-                                       ${ipaddr:+-r $ipaddr} \
-                                       ${hostname:+-H $hostname} \
-                                       ${clientid:+-c $clientid} \
-                                       -b -p "$pidfile" $broadcast \
-                                       ${dhcpopts:- -O rootpath -R &}
-
-                               lock -u "$lockfile"
+                               kill $pid
                        fi
+
+                       local ipaddr netmask hostname proto1 clientid broadcast
+                       config_get ipaddr "$config" ipaddr
+                       config_get netmask "$config" netmask
+                       config_get hostname "$config" hostname
+                       config_get proto1 "$config" proto
+                       config_get clientid "$config" clientid
+                       config_get_bool broadcast "$config" broadcast 0
+
+                       [ -z "$ipaddr" ] || \
+                               $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"
+                       [ "$broadcast" = 1 ] && broadcast="-O broadcast" || 
broadcast=
+
+                       $DEBUG eval udhcpc -t 0 -i "$iface" \
+                               ${ipaddr:+-r $ipaddr} \
+                               ${hostname:+-H $hostname} \
+                               ${clientid:+-c $clientid} \
+                               -b -p "$pidfile" $broadcast \
+                               ${dhcpopts:- -O rootpath -R &}
                ;;
                none)
                        setup_interface_none "$iface" "$config"
-- 
1.7.1

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to