bridge: fix stray semicolon, fixes a bug in bridge primary port reset
[project/netifd.git] / interface.c
index 18322d7..23c7032 100644 (file)
@@ -536,15 +536,17 @@ void interface_set_proto_state(struct interface *iface, struct interface_proto_s
        state->iface = iface;
 }
 
-void
-interface_init(struct interface *iface, const char *name,
-              struct blob_attr *config)
+struct interface *
+interface_alloc(const char *name, struct blob_attr *config)
 {
+       struct interface *iface;
        struct blob_attr *tb[IFACE_ATTR_MAX];
        struct blob_attr *cur;
        const char *proto_name = NULL;
+       char *iface_name;
 
-       strncpy(iface->name, name, sizeof(iface->name) - 1);
+       iface = calloc_a(sizeof(*iface), &iface_name, strlen(name) + 1);
+       iface->name = strcpy(iface_name, name);
        INIT_LIST_HEAD(&iface->errors);
        INIT_LIST_HEAD(&iface->users);
        INIT_LIST_HEAD(&iface->hotplug_list);
@@ -610,6 +612,7 @@ interface_init(struct interface *iface, const char *name,
        iface->proto_ip.no_delegation = !blobmsg_get_bool_default(tb[IFACE_ATTR_DELEGATE], true);
 
        iface->config_autostart = iface->autostart;
+       return iface;
 }
 
 void interface_set_dynamic(struct interface *iface)
@@ -743,6 +746,37 @@ interface_add_link(struct interface *iface, struct device *dev)
 }
 
 int
+interface_handle_link(struct interface *iface, const char *name, bool add)
+{
+       struct device *dev;
+       int ret;
+
+       device_lock();
+
+       dev = device_get(name, add ? 2 : 0);
+       if (!dev) {
+               ret = UBUS_STATUS_NOT_FOUND;
+               goto out;
+       }
+
+       if (add) {
+               device_set_present(dev, true);
+               if (iface->device_config)
+                       device_set_config(dev, &simple_device_type, iface->config);
+
+               system_if_apply_settings(dev, &dev->settings);
+               ret = interface_add_link(iface, dev);
+       } else {
+               ret = interface_remove_link(iface, dev);
+       }
+
+out:
+       device_unlock();
+
+       return ret;
+}
+
+int
 interface_set_up(struct interface *iface)
 {
        int ret;