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:
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);
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);
}
{
DBG("device %p", device);
+ if (device->disconnected == FALSE)
+ return -EINVAL;
+
return 0;
}