X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fdevice.c;h=a2b8f6f120da5f7b0ef5290a798bea68e36be064;hb=621adb59b0fc8d576e5372ae7221aae3e055b726;hp=74196b723057d91c22e4673564d70a547fe5944b;hpb=3b6dd9aa9030e27513a4635e7a718feb4eea5ba1;p=connman diff --git a/src/device.c b/src/device.c index 74196b7..a2b8f6f 100644 --- a/src/device.c +++ b/src/device.c @@ -36,6 +36,7 @@ struct connman_device { connman_bool_t powered; connman_bool_t carrier; connman_bool_t scanning; + connman_bool_t disconnected; connman_uint8_t priority; char *name; char *node; @@ -47,6 +48,8 @@ struct connman_device { connman_bool_t registered; + char *last_network; + struct connman_network *network; GHashTable *networks; }; @@ -295,7 +298,9 @@ static DBusMessage *get_properties(DBusConnection *conn, switch (device->mode) { case CONNMAN_DEVICE_MODE_UNKNOWN: + break; case CONNMAN_DEVICE_MODE_TRANSPORT_IP: + __connman_element_append_ipv4(&device->element, &dict); break; case CONNMAN_DEVICE_MODE_NETWORK_SINGLE: case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE: @@ -374,6 +379,17 @@ static DBusMessage *set_property(DBusConnection *conn, dbus_message_iter_get_basic(&value, &priority); device->priority = priority; + } else if (g_str_has_prefix(name, "IPv4") == TRUE) { + switch (device->mode) { + case CONNMAN_DEVICE_MODE_UNKNOWN: + case CONNMAN_DEVICE_MODE_NETWORK_SINGLE: + case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE: + return __connman_error_invalid_arguments(msg); + case CONNMAN_DEVICE_MODE_TRANSPORT_IP: + __connman_element_set_ipv4(&device->element, + name, &value); + break; + } } __connman_storage_save_device(device); @@ -695,6 +711,8 @@ static void device_destruct(struct connman_element *element) g_free(device->name); g_free(device->interface); + g_free(device->last_network); + g_hash_table_destroy(device->networks); device->networks = NULL; } @@ -732,9 +750,11 @@ struct connman_device *connman_device_create(const char *node, str = type2string(type); if (str != NULL) - connman_element_add_static_property(&device->element, + connman_element_set_static_property(&device->element, "Type", DBUS_TYPE_STRING, &str); + device->element.ipv4.method = CONNMAN_IPV4_METHOD_DHCP; + device->type = type; device->mode = CONNMAN_DEVICE_MODE_UNKNOWN; device->policy = CONNMAN_DEVICE_POLICY_AUTO; @@ -979,11 +999,24 @@ int connman_device_set_carrier(struct connman_device *device, device->carrier = carrier; if (carrier == TRUE) { + enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN; struct connman_element *element; + switch (device->element.ipv4.method) { + case CONNMAN_IPV4_METHOD_UNKNOWN: + case CONNMAN_IPV4_METHOD_OFF: + return 0; + case CONNMAN_IPV4_METHOD_STATIC: + type = CONNMAN_ELEMENT_TYPE_IPV4; + break; + case CONNMAN_IPV4_METHOD_DHCP: + type = CONNMAN_ELEMENT_TYPE_DHCP; + break; + } + element = connman_element_create(NULL); if (element != NULL) { - element->type = CONNMAN_ELEMENT_TYPE_DHCP; + element->type = type; element->index = device->element.index; if (connman_element_register(element, @@ -1003,15 +1036,15 @@ void __connman_device_disconnect(struct connman_device *device) 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_connected(network) == FALSE) - continue; - - __connman_network_disconnect(network); + if (connman_network_get_connected(network) == TRUE) + __connman_network_disconnect(network); } } @@ -1029,9 +1062,18 @@ static void connect_known_network(struct connman_device *device) while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { connman_uint8_t old_priority, new_priority; connman_uint8_t old_strength, new_strength; + const char *name; count++; + name = connman_network_get_string(value, "Name"); + if (name != NULL && device->last_network != NULL) { + if (g_str_equal(name, device->last_network) == TRUE) { + network = value; + break; + } + } + if (connman_network_get_remember(value) == FALSE) continue; @@ -1076,7 +1118,7 @@ static void mark_network_unavailable(gpointer key, gpointer value, { struct connman_network *network = value; - if (connman_network_get_remember(network) == TRUE) + if (connman_network_get_connected(network) == TRUE) return; connman_network_set_available(network, FALSE); @@ -1087,6 +1129,9 @@ static gboolean remove_unavailable_network(gpointer key, gpointer value, { struct connman_network *network = value; + if (connman_network_get_connected(network) == TRUE) + return FALSE; + if (connman_network_get_remember(network) == TRUE) return FALSE; @@ -1148,6 +1193,9 @@ int connman_device_set_scanning(struct connman_device *device, if (device->connections > 0) return 0; + if (device->disconnected == TRUE) + return 0; + if (device->policy != CONNMAN_DEVICE_POLICY_AUTO) return 0; @@ -1157,6 +1205,35 @@ int connman_device_set_scanning(struct connman_device *device, } /** + * connman_device_set_disconnected: + * @device: device structure + * @disconnected: disconnected state + * + * Change disconnected state of device (only for device with networks) + */ +int connman_device_set_disconnected(struct connman_device *device, + connman_bool_t disconnected) +{ + DBG("driver %p disconnected %d", device, disconnected); + + switch (device->mode) { + case CONNMAN_DEVICE_MODE_UNKNOWN: + case CONNMAN_DEVICE_MODE_TRANSPORT_IP: + return -EINVAL; + case CONNMAN_DEVICE_MODE_NETWORK_SINGLE: + case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE: + break; + } + + if (device->disconnected == disconnected) + return -EALREADY; + + device->disconnected = disconnected; + + return 0; +} + +/** * connman_device_set_string: * @device: device structure * @key: unique identifier @@ -1312,6 +1389,19 @@ int connman_device_remove_network(struct connman_device *device, return 0; } +void __connman_device_set_network(struct connman_device *device, + struct connman_network *network) +{ + const char *name; + + if (network != NULL) { + name = connman_network_get_string(network, "Name"); + device->last_network = g_strdup(name); + } + + device->network = network; +} + /** * connman_device_register: * @device: device structure @@ -1480,6 +1570,11 @@ static int device_load(struct connman_device *device) if (val > 0) device->priority = val; + str = g_key_file_get_string(keyfile, "Configuration", + "LastNetwork", NULL); + if (str != NULL) + device->last_network = str; + g_key_file_free(keyfile); return 0; @@ -1521,6 +1616,10 @@ update: g_key_file_set_integer(keyfile, "Configuration", "Priority", device->priority); + if (device->last_network != NULL) + g_key_file_set_string(keyfile, "Configuration", + "LastNetwork", device->last_network); + data = g_key_file_to_data(keyfile, &length, NULL); g_file_set_contents(pathname, data, length, NULL); @@ -1532,6 +1631,9 @@ done: g_free(pathname); + if (device->network != NULL) + __connman_storage_save_network(device->network); + return 0; }