.params = iface_attrs,
};
+static void
+set_config_state(struct interface *iface, enum interface_config_state s);
+static void
+interface_event(struct interface *iface, enum interface_event ev);
+
static void
interface_error_flush(struct interface *iface)
{
}
n = calloc(1, sizeof(*n) + len);
+ if (!n)
+ return UBUS_STATUS_UNKNOWN_ERROR;
+
memcpy(n->data, data, len);
n->node.key = blobmsg_name(n->data);
avl_insert(&iface->data, &n->node);
return 0;
}
+int interface_parse_data(struct interface *iface, const struct blob_attr *attr)
+{
+ struct blob_attr *cur;
+ int rem, ret;
+
+ iface->updated = 0;
+
+ blob_for_each_attr(cur, attr, rem) {
+ ret = interface_add_data(iface, cur);
+ if (ret)
+ return ret;
+ }
+
+ if (iface->updated && iface->state == IFS_UP)
+ interface_event(iface, IFEV_UPDATE);
+
+ return 0;
+}
+
static void
interface_event(struct interface *iface, enum interface_event ev)
{
if (state == IFS_UP)
interface_event(iface, IFEV_DOWN);
interface_ip_set_enabled(&iface->config_ip, false);
+ interface_ip_set_enabled(&iface->proto_ip, false);
interface_ip_flush(&iface->proto_ip);
interface_flush_state(iface);
system_flush_routes();
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->autostart && iface->available)
interface_set_up(iface);
+ else if (iface->dynamic)
+ set_config_state(iface, IFC_REMOVE);
}
static void
-interface_proto_cb(struct interface_proto_state *state, enum interface_proto_event ev)
+interface_proto_event_cb(struct interface_proto_state *state, enum interface_proto_event ev)
{
struct interface *iface = state->iface;
interface_set_l3_dev(iface, iface->main_dev.dev);
interface_ip_set_enabled(&iface->config_ip, true);
+ interface_ip_set_enabled(&iface->proto_ip, true);
system_flush_routes();
iface->state = IFS_UP;
iface->start_time = system_get_rtime();
if (!state)
return;
- state->proto_event = interface_proto_cb;
+ state->proto_event = interface_proto_event_cb;
state->iface = iface;
}
return;
interface_ip_set_enabled(&iface->config_ip, false);
+ interface_ip_set_enabled(&iface->proto_ip, false);
interface_ip_flush(&iface->proto_ip);
device_add_user(&iface->l3_dev, dev);
return;
}
interface_ip_set_enabled(&iface->config_ip, enabled);
+ interface_ip_set_enabled(&iface->proto_ip, enabled);
}
}