If a device is indexed (for example, a wired ethernet connection), it can be successfully enabled by calling connman_inet_ifup(). This means that the call to device->driver->enable() lower down in __connman_device_enable() will fail with EALREADY. Squash that error, since the overall operation has been a success.
This can be reproduced on a system with a wired connection using
connmanctl:
$ connmanctl technologies
/net/connman/technology/ethernet
Name = Wired
Type = ethernet
Powered = True
Connected = True
Tethering = False
$ connmanctl disable ethernet
Disabled ethernet
$ connmanctl technologies
/net/connman/technology/ethernet
Powered = False
…
$ connmanctl enable ethernet
Error ethernet: Already enabled
With the patch applied, the final call succeeds as expected.
---
src/device.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/src/device.c b/src/device.c
index c0683ab..c9e9b8b 100644
--- a/src/device.c
+++ b/src/device.c
@@ -168,7 +168,7 @@ static gboolean device_pending_reset(gpointer user_data)
int __connman_device_enable(struct connman_device *device)
{
- int err;
+ int err, index_err = -EOPNOTSUPP;
DBG("device %p", device);
@@ -186,9 +186,9 @@ int __connman_device_enable(struct connman_device *device)
return -EALREADY;
if (device->index > 0) {
- err = connman_inet_ifup(device->index);
- if (err < 0 && err != -EALREADY)
- return err;
+ index_err = connman_inet_ifup(device->index);
+ if (index_err < 0 && index_err != -EALREADY)
+ return index_err;
}
device->powered_pending = PENDING_ENABLE;
@@ -197,9 +197,14 @@ int __connman_device_enable(struct connman_device *device)
/*
* device gets enabled right away.
* Invoke the callback
+ *
+ * If device->driver->enable() returned EALREADY but the earlier
+ * connman_inet_ifup() call did not, then the interface came up
+ * with the earlier call and we should not report an error.
*/
- if (err == 0) {
+ if (err == 0 || (err == -EALREADY && index_err == 0)) {
connman_device_set_powered(device, true);
+ err = 0;
goto done;
}
--
1.9.3
signature.asc
Description: This is a digitally signed message part
_______________________________________________ connman mailing list [email protected] https://lists.connman.net/mailman/listinfo/connman
