int __connman_device_disconnect(struct connman_device *device) { GHashTableIter iter; gpointer key, value; DBG("device %p", device); connman_device_set_disconnected(device, TRUE); g_hash_table_iter_init(&iter, device->networks); while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { struct connman_network *network = value; if (connman_network_get_connecting(network) == TRUE) { /* * Skip network in the process of connecting. * This is a workaround for WiFi networks serviced * by the supplicant plugin that hold a reference * to the network. If we disconnect the network * here then the referenced object will not be * registered and usage (like launching DHCP client) * will fail. There is nothing to be gained by * removing the network here anyway. */ connman_warn("Skipping disconnect of %s, network is connecting.", connman_network_get_identifier(network)); continue; } __connman_network_disconnect(network); } return 0; }
/** * connman_device_set_powered: * @device: device structure * @powered: powered state * * Change power state of device */ int connman_device_set_powered(struct connman_device *device, bool powered) { enum connman_service_type type; DBG("driver %p powered %d", device, powered); if (device->powered == powered) return -EALREADY; clear_pending_trigger(device); device->powered_pending = PENDING_NONE; device->powered = powered; type = __connman_device_get_service_type(device); if (!device->powered) { __connman_technology_disabled(type); return 0; } __connman_technology_enabled(type); connman_device_set_disconnected(device, false); device->scanning = false; if (device->driver && device->driver->scan) device->driver->scan(CONNMAN_SERVICE_TYPE_UNKNOWN, device, NULL, 0, NULL, NULL, NULL, NULL); return 0; }
/** * connman_device_set_powered: * @device: device structure * @powered: powered state * * Change power state of device */ int connman_device_set_powered(struct connman_device *device, connman_bool_t powered) { enum connman_service_type type; DBG("driver %p powered %d", device, powered); if (device->powered == powered) return -EALREADY; clear_pending_trigger(device); device->powered_pending = PENDING_NONE; device->powered = powered; type = __connman_device_get_service_type(device); if (device->powered == FALSE) { __connman_technology_disabled(type); return 0; } __connman_technology_enabled(type); connman_device_set_disconnected(device, FALSE); device->scanning = FALSE; if (device->driver && device->driver->scan) device->driver->scan(device, NULL, 0, NULL, NULL, NULL); return 0; }
static void network_change(struct connman_element *element) { struct connman_network *network = element->network; _DBG_NETWORK("element %p name %s", element, element->name); if (element->state != CONNMAN_ELEMENT_STATE_ERROR) return; if (element->error != CONNMAN_ELEMENT_ERROR_DHCP_FAILED) return; if (network->connected == FALSE) return; connman_element_unregister_children(element); connman_device_set_disconnected(network->device, TRUE); if (network->driver && network->driver->disconnect) { network->driver->disconnect(network); return; } network->connected = FALSE; }
static gboolean set_connected(gpointer user_data) { struct connman_network *network = user_data; struct connman_service *service; service = __connman_service_lookup_from_network(network); if (network->connected == TRUE) { struct connman_element *element; enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN; switch (network->protocol) { case CONNMAN_NETWORK_PROTOCOL_UNKNOWN: connman_warn("%s: unknown protocol", __func__); return 0; case CONNMAN_NETWORK_PROTOCOL_IP: type = CONNMAN_ELEMENT_TYPE_DHCP; break; case CONNMAN_NETWORK_PROTOCOL_PPP: type = CONNMAN_ELEMENT_TYPE_PPP; break; } __connman_device_increase_connections(network->device); __connman_device_set_network(network->device, network); connman_device_set_disconnected(network->device, FALSE); element = connman_element_create(NULL); if (element != NULL) { element->type = type; element->index = network->element.index; if (connman_element_register(element, &network->element) < 0) connman_element_unref(element); __connman_service_indicate_state(service, CONNMAN_SERVICE_STATE_CONFIGURATION); } } else { connman_element_unregister_children(&network->element); __connman_device_set_network(network->device, NULL); network->hidden = FALSE; __connman_device_decrease_connections(network->device); __connman_service_indicate_state(service, CONNMAN_SERVICE_STATE_IDLE); } network->connecting = FALSE; connman_network_set_associating(network, FALSE); return FALSE; }
static void autoconf_ipv6_set(struct connman_network *network) { DBG("network %p", network); __connman_device_set_network(network->device, network); connman_device_set_disconnected(network->device, FALSE); /* XXX: Append IPv6 nameservers here */ network->connecting = FALSE; }
static void network_change(struct connman_network *network) { DBG("network %p name %s", network, network->name); if (network->connected == FALSE) return; connman_device_set_disconnected(network->device, TRUE); if (network->driver && network->driver->disconnect) { network->driver->disconnect(network); return; } network->connected = FALSE; }
static void set_configuration(struct connman_network *network) { struct connman_service *service; DBG("network %p", network); if (network->device == NULL) return; __connman_device_set_network(network->device, network); connman_device_set_disconnected(network->device, FALSE); service = __connman_service_lookup_from_network(network); __connman_service_ipconfig_indicate_state(service, CONNMAN_SERVICE_STATE_CONFIGURATION, CONNMAN_IPCONFIG_TYPE_IPV4); }
static int manual_ipv6_set(struct connman_network *network, struct connman_ipconfig *ipconfig_ipv6) { struct connman_service *service; int err; DBG("network %p ipv6 %p", network, ipconfig_ipv6); service = __connman_service_lookup_from_network(network); if (service == NULL) return -EINVAL; if (__connman_ipconfig_get_local(ipconfig_ipv6) == NULL) __connman_service_read_ip6config(service); err = __connman_ipconfig_address_add(ipconfig_ipv6); if (err < 0) { connman_network_set_error(network, CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL); return err; } #if defined TIZEN_EXT /* * Description: __connman_service_lookup_from_index cannot find correct service */ err = __connman_ipconfig_gateway_add(ipconfig_ipv6, service); #else err = __connman_ipconfig_gateway_add(ipconfig_ipv6); #endif if (err < 0) return err; __connman_connection_gateway_activate(service, CONNMAN_IPCONFIG_TYPE_IPV6); __connman_device_set_network(network->device, network); connman_device_set_disconnected(network->device, FALSE); network->connecting = FALSE; return 0; }
int __connman_device_enable(struct connman_device *device) { int err; enum connman_service_type type; DBG("device %p %d", device, device->blocked); if (!device->driver || !device->driver->enable) return -EOPNOTSUPP; if (device->powered_pending == TRUE) return -EALREADY; if (device->blocked == TRUE) return -ENOLINK; connman_device_set_disconnected(device, FALSE); device->scanning = FALSE; err = device->driver->enable(device); if (err < 0 && err != -EALREADY) { if (err == -EINPROGRESS) { device->powered_pending = TRUE; device->offlinemode = FALSE; if (__connman_profile_get_offlinemode() == TRUE) __connman_profile_set_offlinemode(FALSE, FALSE); } return err; } device->powered_pending = TRUE; device->powered = TRUE; device->offlinemode = FALSE; if (__connman_profile_get_offlinemode() == TRUE) __connman_profile_set_offlinemode(FALSE, FALSE); type = __connman_device_get_service_type(device); __connman_technology_enable(type); return 0; }