コード例 #1
0
ファイル: device.c プロジェクト: roland-wilhelm/connman
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;
}
コード例 #2
0
ファイル: device.c プロジェクト: drgogeta86/connman
/**
 * 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;
}
コード例 #3
0
ファイル: device.c プロジェクト: roland-wilhelm/connman
/**
 * 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;
}
コード例 #4
0
ファイル: network.c プロジェクト: wenhann/chromiumos
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;
}
コード例 #5
0
ファイル: network.c プロジェクト: wenhann/chromiumos
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;
}
コード例 #6
0
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;
}
コード例 #7
0
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;
}
コード例 #8
0
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);
}
コード例 #9
0
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;
}
コード例 #10
0
ファイル: device.c プロジェクト: aldebaran/connman-stable
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;
}