summaryrefslogtreecommitdiff
path: root/src/service.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/service.c')
-rw-r--r--src/service.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/service.c b/src/service.c
index 890a3133..adcfb640 100644
--- a/src/service.c
+++ b/src/service.c
@@ -3608,6 +3608,29 @@ static connman_bool_t get_reconnect_state(struct connman_service *service)
return __connman_device_get_reconnect(device);
}
+static connman_bool_t is_interface_available(struct connman_service *service,
+ struct connman_service *other_service)
+{
+ unsigned int index = 0, other_index = 0;
+
+ if (service->ipconfig_ipv4 != NULL)
+ index = __connman_ipconfig_get_index(service->ipconfig_ipv4);
+ else if (service->ipconfig_ipv6 != NULL)
+ index = __connman_ipconfig_get_index(service->ipconfig_ipv6);
+
+ if (other_service->ipconfig_ipv4 != NULL)
+ other_index = __connman_ipconfig_get_index(
+ other_service->ipconfig_ipv4);
+ else if (other_service->ipconfig_ipv6 != NULL)
+ other_index = __connman_ipconfig_get_index(
+ other_service->ipconfig_ipv6);
+
+ if (index > 0 && other_index != index)
+ return TRUE;
+
+ return FALSE;
+}
+
static DBusMessage *connect_service(DBusConnection *conn,
DBusMessage *msg, void *user_data)
{
@@ -3625,7 +3648,15 @@ static DBusMessage *connect_service(DBusConnection *conn,
while (g_sequence_iter_is_end(iter) == FALSE) {
struct connman_service *temp = g_sequence_get(iter);
- if (service->type == temp->type && is_connecting(temp) == TRUE)
+ /*
+ * We should allow connection if there are available
+ * interfaces for a given technology type (like having
+ * more than one wifi card).
+ */
+ if (service->type == temp->type &&
+ is_connecting(temp) == TRUE &&
+ is_interface_available(service,
+ temp) == FALSE)
return __connman_error_in_progress(msg);
iter = g_sequence_iter_next(iter);