+ list_add_tail(&error->list, &iface->errors);
+ error->subsystem = subsystem;
+ error->code = code;
+
+ dest = (char *) &error->data[n_data + 1];
+ for (i = 0; i < n_data; i++) {
+ error->data[i] = dest;
+ memcpy(dest, data[i], datalen[i]);
+ dest += datalen[i];
+ }
+ error->data[n_data] = NULL;
+}
+
+static void
+interface_event(struct interface *iface, enum interface_event ev)
+{
+ /* TODO */
+}
+
+static void
+mark_interface_down(struct interface *iface)
+{
+ interface_del_all_routes(iface);
+ interface_del_ctx_addr(iface, NULL);
+ device_release(&iface->main_dev);
+ iface->state = IFS_DOWN;
+}
+
+static int
+__interface_set_up(struct interface *iface)
+{
+ int ret;
+
+ if (iface->state != IFS_DOWN)
+ return 0;
+
+ ret = device_claim(&iface->main_dev);
+ if (ret)
+ return ret;
+
+ iface->state = IFS_SETUP;
+ ret = interface_proto_event(iface->proto, PROTO_CMD_SETUP, false);
+ if (ret) {
+ mark_interface_down(iface);
+ return ret;