X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fnetwork.c;h=44503c1ffd4574c6b775f4be38db52b6ac4d9bbe;hb=254c95953680203a984aee5cd43443958c506ea9;hp=7375d7f59b8cdca4041a0d2b839c77b03732928f;hpb=f6ba1ce230293171982ae107adc20e5a6a5d2a0e;p=connman diff --git a/src/network.c b/src/network.c index 7375d7f..44503c1 100644 --- a/src/network.c +++ b/src/network.c @@ -33,6 +33,8 @@ struct connman_network { struct connman_element element; enum connman_network_type type; enum connman_network_protocol protocol; + connman_bool_t associating; + connman_bool_t secondary; connman_bool_t available; connman_bool_t connected; connman_bool_t remember; @@ -238,7 +240,7 @@ static DBusMessage *do_connect(DBusConnection *conn, return __connman_error_permission_denied(msg); if (network->connected == TRUE) - return __connman_error_failed(msg); + return __connman_error_failed(msg, EALREADY); if (network->driver && network->driver->connect) { enum connman_device_mode mode; @@ -249,7 +251,7 @@ static DBusMessage *do_connect(DBusConnection *conn, err = network->driver->connect(network); if (err < 0 && err != -EINPROGRESS) - return __connman_error_failed(msg); + return __connman_error_failed(msg, -err); } else network->connected = TRUE; @@ -269,7 +271,7 @@ static DBusMessage *do_disconnect(DBusConnection *conn, return __connman_error_permission_denied(msg); if (network->connected == FALSE) - return __connman_error_failed(msg); + return __connman_error_failed(msg, EINVAL); connman_element_unregister_children(&network->element); @@ -278,7 +280,7 @@ static DBusMessage *do_disconnect(DBusConnection *conn, if (network->driver && network->driver->disconnect) { err = network->driver->disconnect(network); if (err < 0 && err != -EINPROGRESS) - return __connman_error_failed(msg); + return __connman_error_failed(msg, -err); } else network->connected = FALSE; @@ -486,7 +488,8 @@ struct connman_network *connman_network_create(const char *identifier, connman_element_set_uint8(&network->element, "Strength", strength); - network->type = type; + network->type = type; + network->secondary = FALSE; network->identifier = g_strdup(identifier); return network; @@ -610,6 +613,14 @@ const char *__connman_network_get_group(struct connman_network *network) return network->group; } +const char *__connman_network_get_ident(struct connman_network *network) +{ + if (network->device == NULL) + return NULL; + + return __connman_device_get_ident(network->device); +} + /** * connman_network_set_available: * @network: network structure @@ -673,6 +684,9 @@ connman_bool_t connman_network_get_available(struct connman_network *network) 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; @@ -703,8 +717,14 @@ static gboolean set_connected(gpointer user_data) if (connman_element_register(element, &network->element) < 0) connman_element_unref(element); + + __connman_service_indicate_state(service, + CONNMAN_SERVICE_STATE_CONFIGURATION); } } else { + __connman_service_indicate_state(service, + CONNMAN_SERVICE_STATE_IDLE); + connman_element_unregister_children(&network->element); __connman_device_set_network(network->device, NULL); @@ -716,6 +736,34 @@ static gboolean set_connected(gpointer user_data) } /** + * connman_network_set_associating: + * @network: network structure + * @associating: associating state + * + * Change associating state of network + */ +int connman_network_set_associating(struct connman_network *network, + connman_bool_t associating) +{ + DBG("network %p associating %d", network, associating); + + if (network->associating == associating) + return -EALREADY; + + network->associating = associating; + + if (associating == TRUE) { + struct connman_service *service; + + service = __connman_service_lookup_from_network(network); + __connman_service_indicate_state(service, + CONNMAN_SERVICE_STATE_ASSOCIATION); + } + + return 0; +} + +/** * connman_network_set_connected: * @network: network structure * @connected: connected state @@ -736,6 +784,9 @@ int connman_network_set_connected(struct connman_network *network, network->connected = connected; + if (connected == TRUE) + network->associating = FALSE; + if (network->registered == FALSE) { g_idle_add(set_connected, network); return 0; @@ -1100,6 +1151,8 @@ static int network_probe(struct connman_element *element) return err; } + network->secondary = connman_device_get_secondary(network->device); + switch (network->type) { case CONNMAN_NETWORK_TYPE_UNKNOWN: case CONNMAN_NETWORK_TYPE_VENDOR: @@ -1109,7 +1162,8 @@ static int network_probe(struct connman_element *element) break; case CONNMAN_NETWORK_TYPE_WIFI: case CONNMAN_NETWORK_TYPE_WIMAX: - __connman_profile_add_network(network); + if (network->secondary == FALSE) + __connman_profile_add_network(network); break; } @@ -1137,7 +1191,8 @@ static void network_remove(struct connman_element *element) break; case CONNMAN_NETWORK_TYPE_WIFI: case CONNMAN_NETWORK_TYPE_WIMAX: - __connman_profile_remove_network(network); + if (network->secondary == FALSE) + __connman_profile_remove_network(network); break; }