+ enum interface_state state = iface->state;
+ switch (state) {
+ case IFS_UP:
+ case IFS_SETUP:
+ iface->state = IFS_TEARDOWN;
+ if (state == IFS_UP)
+ interface_event(iface, IFEV_DOWN);
+
+ interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, force);
+ if (force)
+ interface_flush_state(iface);
+
+ if (iface->dynamic)
+ vlist_delete(&interfaces, &iface->node);
+ break;
+
+ case IFS_DOWN:
+ if (iface->main_dev.dev)
+ device_release(&iface->main_dev);
+ case IFS_TEARDOWN:
+ default:
+ break;
+ }
+}
+
+static int
+__interface_set_up(struct interface *iface)
+{
+ int ret;
+
+ netifd_log_message(L_NOTICE, "Interface '%s' is setting up now\n", iface->name);
+
+ iface->state = IFS_SETUP;
+ ret = interface_proto_event(iface->proto, PROTO_CMD_SETUP, false);
+ if (ret)
+ mark_interface_down(iface);
+
+ return ret;
+}
+
+static void
+interface_check_state(struct interface *iface)
+{
+ bool link_state = iface->link_state || iface->force_link;
+
+ switch (iface->state) {
+ case IFS_UP:
+ if (!iface->enabled || !link_state) {
+ interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, false);
+ mark_interface_down(iface);
+ }
+ break;
+ case IFS_DOWN:
+ if (!iface->available)
+ return;
+
+ if (iface->autostart && iface->enabled && link_state && !config_init)
+ __interface_set_up(iface);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+interface_set_enabled(struct interface *iface, bool new_state)
+{
+ if (iface->enabled == new_state)