if (!blobmsg_check_attr(data, true))
return UBUS_STATUS_INVALID_ARGUMENT;
- n = calloc(1, sizeof(*n) + blob_pad_len(data));
- memcpy(n->data, data, blob_pad_len(data));
- n->node.key = blobmsg_name(n->data);
+ const char *name = blobmsg_name(data);
+ unsigned len = blob_pad_len(data);
+
+ o = avl_find_element(&iface->data, name, o, node);
+ if (o) {
+ if (blob_pad_len(o->data) == len && !memcmp(o->data, data, len))
+ return 0;
- o = avl_find_element(&iface->data, n->node.key, o, node);
- if (o)
interface_data_del(iface, o);
+ }
+ n = calloc(1, sizeof(*n) + len);
+ memcpy(n->data, data, len);
+ n->node.key = blobmsg_name(n->data);
avl_insert(&iface->data, &n->node);
+
+ iface->updated |= IUF_DATA;
return 0;
}
}
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;
void
interface_update_start(struct interface *iface)
{
+ iface->updated = 0;
interface_ip_update_start(&iface->proto_ip);
}
#undef UPDATE
if (reload) {
- D(INTERFACE, "Reload interface '%s because of config changes\n",
+ D(INTERFACE, "Reload interface '%s' because of config changes\n",
if_old->name);
interface_clear_errors(if_old);
set_config_state(if_old, IFC_RELOAD);