Package: ifupdown Version: 0.8.10 Severity: normal Tags: patch -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
There appears to be a bit of a chicken-n-egg problem with "wpa-roam" type interfaces, and any other type of interface which need ifup before a carrier can be detected: "/etc/init.d/networking start" will only call ifup on hotplug class interfaces with a carrier. A "wpa-roam" type interface will not be able to detect a carrier until wpa_supplicaant has been started, which is supposed to happen in the pre-up phase. But there won't be any pre-up phase unless ifup is called... catch 22. This is the relevant part if my /etc/network/interfaces: # use wpa_action to control this interface allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf # 'default' is used by wpa_cli as the fallback mapping target iface default inet dhcp Note that the udev hotplug script /lib/udev/ifupdown-hotplug works fine - unconditionally calling ifup on any new hotplug interface. So "hotplugging" wlan0 after the system is up will bring up the interface and start wpa_supplicant. The problem lies in the hotplug fallback code in /etc/init.d/networking, which AFAIU is supposed to catch interfaces hotplugged/detected *before* the system was fully operational. It makes ifup_hotplug depend on carrier by testing for [ "$(cat /sys/class/net/$link/operstate)" = up ] This code has been like that "forever", and I cannot explain why it suddenly has become a problem. I assume this might be related to udevadm "settle" support, or some other unrelated boot process change. The main point is that this code now has become a problem by preventing wlan interfaces from automatically coming up on boot. The simple attached patch fixes the problem for me. But I must admit that I do not understand the intentions of the original code. It seems completely illogical to avoid ifup unless the link is up, but I assume there is a reason this was found necessary. In any case, I don't think that reason can be valid anymore since the /lib/udev/ifupdown-hotplug behaves differently. (yes, I know I should probably give up and use networkd or whatever, but FWIW the simple patch here does allow my to continue using my existin ifupdown+wpa_supplicant config) Bjørn - -- System Information: Debian Release: 8.3 APT prefers stable APT policy: (700, 'stable'), (600, 'unstable'), (500, 'stable-updates') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 4.5.0-rc4+ (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: sysvinit (via /sbin/init) Versions of packages ifupdown depends on: ii adduser 3.113+nmu3 ii init-system-helpers 1.28 ii iproute2 4.3.0-1git ii libc6 2.21-7 ii lsb-base 4.1+Debian13+nmu1 Versions of packages ifupdown recommends: ii isc-dhcp-client [dhcp-client] 4.3.1-6+deb8u2 Versions of packages ifupdown suggests: ii ppp 2.4.6-3.1 pn rdnssd <none> - -- Configuration Files: /etc/default/networking changed: VERBOSE=yes /etc/init.d/networking changed: PATH="/sbin:/bin" RUN_DIR="/run/network" IFSTATE="$RUN_DIR/ifstate" STATEDIR="$RUN_DIR/state" [ -x /sbin/ifup ] || exit 0 [ -x /sbin/ifdown ] || exit 0 . /lib/lsb/init-functions CONFIGURE_INTERFACES=yes EXCLUDE_INTERFACES= VERBOSE=no [ -f /etc/default/networking ] && . /etc/default/networking verbose="" [ "$VERBOSE" = yes ] && verbose=-v process_exclusions() { set -- $EXCLUDE_INTERFACES exclusions="" for d do exclusions="-X $d $exclusions" done echo $exclusions } process_options() { [ -e /etc/network/options ] || return 0 log_warning_msg "/etc/network/options still exists and it will be IGNORED! Please use /etc/sysctl.conf instead." } check_ifstate() { if [ ! -d "$RUN_DIR" ] ; then if ! mkdir -p "$RUN_DIR" ; then log_failure_msg "can't create $RUN_DIR" exit 1 fi if ! chown root:netdev "$RUN_DIR" ; then log_warning_msg "can't chown $RUN_DIR" fi fi if [ ! -r "$IFSTATE" ] ; then if ! :> "$IFSTATE" ; then log_failure_msg "can't initialise $IFSTATE" exit 1 fi fi } check_network_file_systems() { [ -e /proc/mounts ] || return 0 if [ -e /etc/iscsi/iscsi.initramfs ]; then log_warning_msg "not deconfiguring network interfaces: iSCSI root is mounted." exit 0 fi while read DEV MTPT FSTYPE REST; do case $DEV in /dev/nbd*|/dev/nd[a-z]*|/dev/etherd/e*|curlftpfs*) log_warning_msg "not deconfiguring network interfaces: network devices still mounted." exit 0 ;; esac case $FSTYPE in nfs|nfs4|smbfs|ncp|ncpfs|cifs|coda|ocfs2|gfs|pvfs|pvfs2|fuse.httpfs|fuse.curlftpfs) log_warning_msg "not deconfiguring network interfaces: network file systems still mounted." exit 0 ;; esac done < /proc/mounts } check_network_swap() { [ -e /proc/swaps ] || return 0 while read DEV MTPT FSTYPE REST; do case $DEV in /dev/nbd*|/dev/nd[a-z]*|/dev/etherd/e*) log_warning_msg "not deconfiguring network interfaces: network swap still mounted." exit 0 ;; esac done < /proc/swaps } ifup_hotplug () { if [ -d /sys/class/net ] then ifaces=$(for iface in $(ifquery --list --allow=hotplug) do link=${iface##:*} link=${link##.*} if [ -e "/sys/class/net/$link" ] then echo "$iface" fi done) if [ -n "$ifaces" ] then ifup $ifaces "$@" || true fi fi } case "$1" in start) if init_is_upstart; then exit 1 fi process_options check_ifstate if [ "$CONFIGURE_INTERFACES" = no ] then log_action_msg "Not configuring network interfaces, see /etc/default/networking" exit 0 fi set -f exclusions=$(process_exclusions) log_action_begin_msg "Configuring network interfaces" if [ -x /sbin/udevadm ]; then if [ -n "$(ifquery --list --exclude=lo)" ] || [ -n "$(ifquery --list --allow=hotplug)" ]; then udevadm settle || true fi fi if ifup -a $exclusions $verbose && ifup_hotplug $exclusions $verbose then log_action_end_msg $? else log_action_end_msg $? fi ;; stop) if init_is_upstart; then exit 0 fi check_network_file_systems check_network_swap log_action_begin_msg "Deconfiguring network interfaces" if ifdown -a --exclude=lo $verbose; then log_action_end_msg $? else log_action_end_msg $? fi ;; reload) if init_is_upstart; then exit 1 fi process_options log_action_begin_msg "Reloading network interfaces configuration" state=$(ifquery --state) ifdown -a --exclude=lo $verbose || true if ifup --exclude=lo $state $verbose ; then log_action_end_msg $? else log_action_end_msg $? fi ;; force-reload|restart) if init_is_upstart; then exit 1 fi process_options log_warning_msg "Running $0 $1 is deprecated because it may not re-enable some interfaces" log_action_begin_msg "Reconfiguring network interfaces" ifdown -a --exclude=lo $verbose || true set -f exclusions=$(process_exclusions) if ifup -a --exclude=lo $exclusions $verbose && ifup_hotplug $exclusions $verbose then log_action_end_msg $? else log_action_end_msg $? fi ;; *) echo "Usage: /etc/init.d/networking {start|stop|reload|restart|force-reload}" exit 1 ;; esac exit 0 - -- no debconf information -----BEGIN PGP SIGNATURE----- iEYEARECAAYFAlbBuHMACgkQ10rqkowbIskXPgCeNrqnFEGhMNEwWGPLh3NGFWa7 jFQAnRHFTXnvO9ZekQOxb188vmkGiZaK =mxBr -----END PGP SIGNATURE-----
--- /etc/init.d/networking.OLD 2015-07-19 23:45:52.000000000 +0200 +++ /etc/init.d/networking 2016-02-15 12:00:54.600641776 +0100 @@ -107,12 +107,7 @@ link=${link##.*} if [ -e "/sys/class/net/$link" ] then - # link detection does not work unless we up the link - ip link set "$iface" up || true - if [ "$(cat /sys/class/net/$link/operstate)" = up ] - then - echo "$iface" - fi + echo "$iface" fi done) if [ -n "$ifaces" ]