projects
/
project
/
netifd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
interface: clean up l3 device reference on remove/reload
[project/netifd.git]
/
interface.c
diff --git
a/interface.c
b/interface.c
index
f474246
..
ea25208
100644
(file)
--- a/
interface.c
+++ b/
interface.c
@@
-319,7
+319,7
@@
interface_cb(struct device_user *dep, enum device_event ev)
new_state = true;
case DEV_EVENT_REMOVE:
interface_set_available(iface, new_state);
new_state = true;
case DEV_EVENT_REMOVE:
interface_set_available(iface, new_state);
- if (!new_state && dep->dev->external)
+ if (!new_state && dep->dev
&& dep->dev
->external)
interface_set_main_dev(iface, NULL);
break;
case DEV_EVENT_UP:
interface_set_main_dev(iface, NULL);
break;
case DEV_EVENT_UP:
@@
-329,7
+329,7
@@
interface_cb(struct device_user *dep, enum device_event ev)
break;
case DEV_EVENT_LINK_UP:
new_state = true;
break;
case DEV_EVENT_LINK_UP:
new_state = true;
-
case DEV_EVENT_LINK_DOWN:
+ case DEV_EVENT_LINK_DOWN:
interface_set_link_state(iface, new_state);
break;
case DEV_EVENT_TOPO_CHANGE:
interface_set_link_state(iface, new_state);
break;
case DEV_EVENT_TOPO_CHANGE:
@@
-509,8
+509,8
@@
interface_cleanup_state(struct interface *iface)
interface_clear_errors(iface);
interface_set_proto_state(iface, NULL);
interface_clear_errors(iface);
interface_set_proto_state(iface, NULL);
- i
f (iface->main_dev.dev)
-
interface_set_main
_dev(iface, NULL);
+ i
nterface_set_main_dev(iface, NULL);
+
interface_set_l3
_dev(iface, NULL);
}
static void
}
static void
@@
-766,8
+766,10
@@
interface_set_l3_dev(struct interface *iface, struct device *dev)
device_add_user(&iface->l3_dev, dev);
if (dev) {
device_add_user(&iface->l3_dev, dev);
if (dev) {
- if (claimed)
- device_claim(&iface->l3_dev);
+ if (claimed) {
+ if (device_claim(&iface->l3_dev) < 0)
+ return;
+ }
interface_ip_set_enabled(&iface->config_ip, enabled);
}
}
interface_ip_set_enabled(&iface->config_ip, enabled);
}
}
@@
-780,14
+782,17
@@
interface_set_main_dev(struct interface *iface, struct device *dev)
if (iface->main_dev.dev == dev)
return;
if (iface->main_dev.dev == dev)
return;
+ interface_set_available(iface, false);
device_add_user(&iface->main_dev, dev);
if (!dev) {
interface_set_link_state(iface, false);
return;
}
device_add_user(&iface->main_dev, dev);
if (!dev) {
interface_set_link_state(iface, false);
return;
}
- if (claimed)
- device_claim(&iface->l3_dev);
+ if (claimed) {
+ if (device_claim(&iface->l3_dev) < 0)
+ return;
+ }
if (!iface->l3_dev.dev)
interface_set_l3_dev(iface, dev);
if (!iface->l3_dev.dev)
interface_set_l3_dev(iface, dev);
@@
-807,7
+812,7
@@
interface_remove_link(struct interface *iface, struct device *dev)
if (dev != iface->main_dev.dev)
return UBUS_STATUS_INVALID_ARGUMENT;
if (dev != iface->main_dev.dev)
return UBUS_STATUS_INVALID_ARGUMENT;
-
device_remove_user(&iface->main_dev
);
+
interface_set_main_dev(iface, NULL
);
return 0;
}
return 0;
}
@@
-1019,7
+1024,8
@@
interface_change_config(struct interface *if_old, struct interface *if_new)
}
interface_write_resolv_conf();
}
interface_write_resolv_conf();
- interface_check_state(if_old);
+ if (if_old->main_dev.dev)
+ interface_check_state(if_old);
out:
if_new->config = NULL;
out:
if_new->config = NULL;