prevent autostart of interfaces during config init
authorFelix Fietkau <nbd@openwrt.org>
Tue, 5 Apr 2011 00:35:29 +0000 (02:35 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 5 Apr 2011 00:35:29 +0000 (02:35 +0200)
config.c
interface.c
interface.h
netifd.h

index 66cee84..51e355c 100644 (file)
--- a/config.c
+++ b/config.c
@@ -6,6 +6,7 @@
 #include "interface.h"
 
 struct uci_context *uci_ctx;
 #include "interface.h"
 
 struct uci_context *uci_ctx;
+bool config_init = false;
 
 static void config_parse_interface(struct uci_section *s)
 {
 
 static void config_parse_interface(struct uci_section *s)
 {
@@ -40,6 +41,7 @@ void config_init_interfaces(const char *name)
                return;
        }
 
                return;
        }
 
+       config_init = true;
        uci_foreach_element(&p->sections, e) {
                struct uci_section *s = uci_to_section(e);
 
        uci_foreach_element(&p->sections, e) {
                struct uci_section *s = uci_to_section(e);
 
@@ -49,4 +51,7 @@ void config_init_interfaces(const char *name)
                if (!strcmp(s->type, "interface"))
                        config_parse_interface(s);
        }
                if (!strcmp(s->type, "interface"))
                        config_parse_interface(s);
        }
+       config_init = false;
+
+       start_pending_interfaces();
 }
 }
index 823a06f..06a36ed 100644 (file)
@@ -130,7 +130,7 @@ interface_cb(struct device_user *dep, enum device_event ev)
        iface->active = new_state;
 
        if (new_state) {
        iface->active = new_state;
 
        if (new_state) {
-               if (iface->autostart)
+               if (iface->autostart && !config_init)
                        set_interface_up(iface);
        } else
                __set_interface_down(iface, true);
                        set_interface_up(iface);
        } else
                __set_interface_down(iface, true);
@@ -277,3 +277,14 @@ set_interface_down(struct interface *iface)
 
        return 0;
 }
 
        return 0;
 }
+
+void
+start_pending_interfaces(void)
+{
+       struct interface *iface;
+
+       list_for_each_entry(iface, &interfaces, list) {
+               if (iface->active && iface->autostart)
+                       set_interface_up(iface);
+       }
+}
index 6bd8761..92bae5a 100644 (file)
@@ -69,4 +69,6 @@ void interface_add_error(struct interface *iface, const char *subsystem,
 
 int interface_attach_bridge(struct interface *iface, struct uci_section *s);
 
 
 int interface_attach_bridge(struct interface *iface, struct uci_section *s);
 
+void start_pending_interfaces(void);
+
 #endif
 #endif
index 17b839b..160ea3b 100644 (file)
--- a/netifd.h
+++ b/netifd.h
@@ -23,6 +23,7 @@ struct device;
 struct interface;
 
 extern struct uci_context *uci_ctx;
 struct interface;
 
 extern struct uci_context *uci_ctx;
+extern bool config_init;
 
 void config_init_interfaces(const char *name);
 
 
 void config_init_interfaces(const char *name);