Fix carrier and disconnected interaction
[connman] / src / device.c
index c75e331..13684ee 100644 (file)
@@ -161,12 +161,27 @@ static enum connman_device_policy string2policy(const char *policy)
 
 static int set_carrier(struct connman_device *device, connman_bool_t carrier)
 {
-       __connman_profile_set_carrier(device, carrier);
+       struct connman_service *service;
+
+       service = __connman_service_lookup_from_device(device);
+       __connman_service_set_carrier(service, carrier);
 
        if (carrier == TRUE) {
                enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN;
                struct connman_element *element;
 
+               device->disconnected = TRUE;
+
+               switch (device->policy) {
+               case CONNMAN_DEVICE_POLICY_UNKNOWN:
+               case CONNMAN_DEVICE_POLICY_IGNORE:
+               case CONNMAN_DEVICE_POLICY_OFF:
+               case CONNMAN_DEVICE_POLICY_MANUAL:
+                       return 0;
+               case CONNMAN_DEVICE_POLICY_AUTO:
+                       break;
+               }
+
                switch (device->element.ipv4.method) {
                case CONNMAN_IPV4_METHOD_UNKNOWN:
                case CONNMAN_IPV4_METHOD_OFF:
@@ -187,6 +202,10 @@ static int set_carrier(struct connman_device *device, connman_bool_t carrier)
                        if (connman_element_register(element,
                                                        &device->element) < 0)
                                connman_element_unref(element);
+
+                       device->disconnected = FALSE;
+
+                       __connman_service_indicate_configuration(service);
                }
        } else
                connman_element_unregister_children(&device->element);
@@ -1253,16 +1272,6 @@ int connman_device_set_carrier(struct connman_device *device,
 
        device->carrier = carrier;
 
-       switch (device->policy) {
-       case CONNMAN_DEVICE_POLICY_UNKNOWN:
-       case CONNMAN_DEVICE_POLICY_IGNORE:
-       case CONNMAN_DEVICE_POLICY_OFF:
-               return 0;
-       case CONNMAN_DEVICE_POLICY_AUTO:
-       case CONNMAN_DEVICE_POLICY_MANUAL:
-               break;
-       }
-
        return set_carrier(device, device->carrier);
 }
 
@@ -1270,6 +1279,9 @@ int __connman_device_connect(struct connman_device *device)
 {
        DBG("device %p", device);
 
+       if (device->disconnected == FALSE)
+               return -EINVAL;
+
        return 0;
 }