+interface_event(struct interface *iface, enum interface_event ev)
+{
+ struct interface_user *dep, *tmp;
+ struct device *adev = NULL;
+
+ list_for_each_entry_safe(dep, tmp, &iface->users, list)
+ dep->cb(dep, iface, ev);
+
+ list_for_each_entry_safe(dep, tmp, &iface_all_users, list)
+ dep->cb(dep, iface, ev);
+
+ switch (ev) {
+ case IFEV_UP:
+ adev = iface->main_dev.dev;
+ /* fall through */
+ case IFEV_DOWN:
+ alias_notify_device(iface->name, adev);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+interface_flush_state(struct interface *iface)
+{
+ if (iface->main_dev.dev)
+ device_release(&iface->main_dev);
+ if (iface->l3_dev.dev)
+ device_release(&iface->l3_dev);
+ interface_data_flush(iface);
+}
+
+static void
+mark_interface_down(struct interface *iface)
+{
+ enum interface_state state = iface->state;
+
+ iface->state = IFS_DOWN;
+ if (state == IFS_UP)
+ interface_event(iface, IFEV_DOWN);
+ interface_ip_set_enabled(&iface->config_ip, false);
+ interface_ip_flush(&iface->proto_ip);
+ interface_flush_state(iface);
+ system_flush_routes();
+}
+
+void