};
static void
-clear_interface_errors(struct interface *iface)
+interface_clear_errors(struct interface *iface)
{
struct interface_error *error, *tmp;
static void
__interface_set_down(struct interface *iface, bool force)
{
- clear_interface_errors(iface);
+ interface_clear_errors(iface);
if (iface->state == IFS_DOWN ||
iface->state == IFS_TEARDOWN)
if (iface->available == new_state)
return;
+ D(INTERFACE, "Interface '%s', available=%d\n", iface->name, new_state);
iface->available = new_state;
if (new_state) {
static void
interface_cleanup(struct interface *iface)
{
+ interface_clear_errors(iface);
if (iface->main_dev.dev)
device_remove_user(&iface->main_dev);
interface_set_proto_state(iface, NULL);
blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb,
blob_data(config), blob_len(config));
- if ((cur = tb[IFACE_ATTR_IFNAME])) {
+ if ((cur = tb[IFACE_ATTR_IFNAME]))
iface->ifname = blobmsg_data(cur);
- }
-
iface->config = config;
vlist_add(&interfaces, &iface->node);
}
if (iface->state == IFS_DOWN)
interface_handle_config_change(iface);
else
- interface_set_down(iface);
+ __interface_set_down(iface, false);
}
static void
{
struct blob_attr *old_config = if_old->config;
+ interface_clear_errors(if_old);
if_old->config = if_new->config;
if (!if_old->config_autostart && if_new->config_autostart)
if_old->autostart = true;