X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/796dcb6b2ea7bc246b6e31024ab2f0f8c14338ca..c170bb0a1a542c590e339c5bb022d2e0be10f89b:/package/base-files/files/lib/network/config.sh diff --git a/package/base-files/files/lib/network/config.sh b/package/base-files/files/lib/network/config.sh index 2ca04faeb..d285da23a 100755 --- a/package/base-files/files/lib/network/config.sh +++ b/package/base-files/files/lib/network/config.sh @@ -164,6 +164,15 @@ prepare_interface() { local macaddr config_get macaddr "$config" macaddr [ -x /usr/sbin/brctl ] && { + # Remove IPv6 link local addr before adding the iface to the bridge + local llv6="$(ifconfig "$iface")" + case "$llv6" in + *fe80:*/64*) + llv6="${llv6#* fe80:}" + ifconfig "$iface" del "fe80:${llv6%% *}" + ;; + esac + ifconfig "br-$config" 2>/dev/null >/dev/null && { local newdevs devices config_get devices "$config" device @@ -316,11 +325,12 @@ setup_interface() { # Interface settings grep "$iface:" /proc/net/dev > /dev/null && { - local mtu macaddr + local mtu macaddr txqueuelen config_get mtu "$config" mtu config_get macaddr "$config" macaddr + config_get txqueuelen "$config" txqueuelen [ -n "$macaddr" ] && $DEBUG ifconfig "$iface" down - $DEBUG ifconfig "$iface" ${macaddr:+hw ether "$macaddr"} ${mtu:+mtu $mtu} up + $DEBUG ifconfig "$iface" ${macaddr:+hw ether "$macaddr"} ${mtu:+mtu $mtu} ${txqueuelen:+txqueuelen $txqueuelen} up } set_interface_ifname "$config" "$iface" @@ -330,31 +340,34 @@ 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 - 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 - - [ -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" - $DEBUG eval udhcpc -t 0 -i "$iface" ${ipaddr:+-r $ipaddr} ${hostname:+-H $hostname} ${clientid:+-c $clientid} -b -p "$pidfile" ${dhcpopts:- -O rootpath -R &} - lock -u "$lockfile" - fi + service_kill udhcpc "$pidfile" + + local ipaddr netmask hostname proto1 clientid vendorid 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 vendorid "$config" vendorid + 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} \ + ${vendorid:+-V $vendorid} \ + -b -p "$pidfile" $broadcast \ + ${dhcpopts:- -O rootpath -R &} ;; none) setup_interface_none "$iface" "$config" @@ -382,12 +395,7 @@ stop_interface_dhcp() { remove_dns "$config" local pidfile="/var/run/dhcp-${ifname}.pid" - local pid="$(cat "$pidfile" 2>/dev/null)" - [ -d "/proc/$pid" ] && { - grep -qs udhcpc "/proc/$pid/cmdline" && kill -TERM $pid && \ - while grep -qs udhcpc "/proc/$pid/cmdline"; do sleep 1; done - rm -f "$pidfile" - } + service_kill udhcpc "$pidfile" uci -P /var/state revert "network.$config" }