summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--config.c5
-rw-r--r--interface.c13
-rw-r--r--interface.h2
-rw-r--r--netifd.h1
4 files changed, 20 insertions, 1 deletions
diff --git a/config.c b/config.c
index 66cee84..51e355c 100644
--- a/config.c
+++ b/config.c
@@ -6,6 +6,7 @@
#include "interface.h"
struct uci_context *uci_ctx;
+bool config_init = false;
static void config_parse_interface(struct uci_section *s)
{
@@ -40,6 +41,7 @@ void config_init_interfaces(const char *name)
return;
}
+ config_init = true;
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);
}
+ config_init = false;
+
+ start_pending_interfaces();
}
diff --git a/interface.c b/interface.c
index 823a06f..06a36ed 100644
--- a/interface.c
+++ b/interface.c
@@ -130,7 +130,7 @@ interface_cb(struct device_user *dep, enum device_event ev)
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);
@@ -277,3 +277,14 @@ set_interface_down(struct interface *iface)
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);
+ }
+}
diff --git a/interface.h b/interface.h
index 6bd8761..92bae5a 100644
--- a/interface.h
+++ b/interface.h
@@ -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);
+void start_pending_interfaces(void);
+
#endif
diff --git a/netifd.h b/netifd.h
index 17b839b..160ea3b 100644
--- a/netifd.h
+++ b/netifd.h
@@ -23,6 +23,7 @@ struct device;
struct interface;
extern struct uci_context *uci_ctx;
+extern bool config_init;
void config_init_interfaces(const char *name);