[package] base-files: properly handle vlans on top of wireless interfaces
[openwrt/svn-archive/archive.git] / package / base-files / files / etc / hotplug.d / net / 10-net
index 77eb6da9d4352a27abb400471e21f29efb97c970..013ece39ce954acdf5e1611c87fb1c21f1e7c586 100644 (file)
@@ -3,21 +3,32 @@
 include /lib/network
 
 addif() {
+       # Ensure that ipv6 is loaded, autoloading happens later but ipv6 might be
+       # required now for interface setup.
+       [ -d /proc/sys/net/ipv6 ] || {
+               grep -q '^ipv6' /etc/modules.d/* && insmod ipv6
+       }
+
        # PPP devices are configured by pppd, no need to run setup_interface here
        case "$INTERFACE" in
-               ppp*) return 0;;
+               3g-*|ppp-*|pppoa-*|pppoe-*|pptp-*) return 0;;
        esac
 
        scan_interfaces
        local cfg="$(find_config "$INTERFACE")"
 
-       # check the autoload setting
-       config_get auto "$cfg" auto
-       case "$auto" in
-               1|on|enabled) setup_interface "$INTERFACE";;
+       case "$INTERFACE" in
+               # Skip wireless parent interfaces
+               ath[0-9]|wlan[0-9]) ;;
+               *)
+                       # check the autoload setting
+                       config_get auto "$cfg" auto
+                       case "$auto" in
+                               1|on|enabled) setup_interface "$INTERFACE";;
+                       esac
+               ;;
        esac
 
-
        # find all vlan configurations for this interface and set them up as well
        for ifc in $interfaces; do
                config_get iftype "$ifc" type
@@ -30,6 +41,24 @@ addif() {
        done
 }
 
+
+delif() {
+       scan_interfaces
+
+       # find all vlan configurations for this interface and nuke 'em
+       for ifc in $interfaces; do
+               config_get iftype "$ifc" type
+               config_get ifs "$ifc" device
+               confdevs="$(uci_get network.$ifc.ifname)"
+               for dev in $ifs; do
+                       [ "${dev%%\.*}" = "$INTERFACE" ] && {
+                               list_contains confdevs "$dev" || list_remove ifs "$dev"
+                       }
+               done
+               uci_set_state "network" "$ifc" device "$ifs"
+       done
+}
+
 case "$ACTION" in
        add|register)
                case "$PHYSDEVDRIVER" in
@@ -37,4 +66,7 @@ case "$ACTION" in
                esac
                addif
        ;;
+       remove|unregister)
+               delif
+       ;;
 esac