[package] firewall: run ifdown hotplug events synchronized, fixes a racecondition...
[openwrt/svn-archive/archive.git] / package / firewall / files / lib / core.sh
index f37b1e69612b03c4c794b43b58aa52f817387ff1..c350e8f0f61b76931d542235c2ca415285387563 100644 (file)
@@ -8,14 +8,13 @@ include /lib/network
 fw_start() {
        fw_init
 
-       lock /var/lock/firewall.start
-
        FW_DEFAULTS_APPLIED=
 
        fw_is_loaded && {
                echo "firewall already loaded" >&2
                exit 1
        }
+
        uci_set_state firewall core "" firewall_state
 
        fw_clear DROP
@@ -40,7 +39,7 @@ fw_start() {
        echo "Loading includes"
        config_foreach fw_load_include include
 
-       [ -n "$FW_NOTRACK_DISABLED" ] && {
+       [ -z "$FW_NOTRACK_DISABLED" ] && {
                echo "Optimizing conntrack"
                config_foreach fw_load_notrack_zone zone
        }
@@ -50,9 +49,8 @@ fw_start() {
 
        fw_callback post core
 
+       uci_set_state firewall core zones "$FW_ZONES"
        uci_set_state firewall core loaded 1
-
-       lock -u /var/lock/firewall.start
 }
 
 fw_stop() {
@@ -60,6 +58,17 @@ fw_stop() {
 
        fw_callback pre stop
 
+       local z n i
+       config_get z core zones
+       for z in $z; do
+               config_get n core "${z}_networks"
+               for n in $n; do
+                       config_get i core "${n}_ifname"
+                       [ -n "$i" ] && env -i ACTION=remove ZONE="$z" \
+                               INTERFACE="$n" DEVICE="$i" /sbin/hotplug-call firewall
+               done
+       done
+
        fw_clear ACCEPT
 
        fw_callback post stop
@@ -84,7 +93,7 @@ fw_reload() {
 }
 
 fw_is_loaded() {
-       local bool=$(uci -q -P /var/state get firewall.core.loaded)
+       local bool=$(uci_get_state firewall.core.loaded)
        return $((! ${bool:-0}))
 }