From: Daniel Wagner <[email protected]>

Since session.c maintains a map between Services and Sessions
there is little point in having service.c. doing the same
thing. The auto connect algorithm is just interested if
there is a session active and if a given Service type
matches a Session configuration.

Therefore let's add two functions for service.c which allows
service.c to ask session.c if there is any session and if
there is a session which is active for given service.
---
 src/connman.h |   4 ++-
 src/service.c |  58 ++++----------------------------
 src/session.c | 104 +++++++++++++++++++++++++++++++++++++++++++++-------------
 3 files changed, 92 insertions(+), 74 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index bf59dbf..dd9fa97 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -697,7 +697,6 @@ int __connman_service_indicate_default(struct 
connman_service *service);
 int __connman_service_connect(struct connman_service *service);
 int __connman_service_disconnect(struct connman_service *service);
 int __connman_service_disconnect_all(void);
-void __connman_service_set_active_session(bool enable, GSList *list);
 void __connman_service_auto_connect(void);
 bool __connman_service_remove(struct connman_service *service);
 bool __connman_service_is_provider_pending(struct connman_service *service);
@@ -825,6 +824,9 @@ void __connman_session_set_mode(bool enable);
 int __connman_session_create(DBusMessage *msg);
 int __connman_session_destroy(DBusMessage *msg);
 
+bool __connman_session_active_sessions(struct connman_service *service);
+bool __connman_session_running(void);
+
 int __connman_session_init(void);
 void __connman_session_cleanup(void);
 
diff --git a/src/service.c b/src/service.c
index 33cce14..446b145 100644
--- a/src/service.c
+++ b/src/service.c
@@ -3454,52 +3454,6 @@ static bool is_ignore(struct connman_service *service)
        return false;
 }
 
-static int active_sessions[MAX_CONNMAN_SERVICE_TYPES] = {};
-static int active_count = 0;
-
-void __connman_service_set_active_session(bool enable, GSList *list)
-{
-       if (!list)
-               return;
-
-       if (enable)
-               active_count++;
-       else
-               active_count--;
-
-       while (list != NULL) {
-               enum connman_service_type type = GPOINTER_TO_INT(list->data);
-
-               switch (type) {
-               case CONNMAN_SERVICE_TYPE_ETHERNET:
-               case CONNMAN_SERVICE_TYPE_WIFI:
-               case CONNMAN_SERVICE_TYPE_BLUETOOTH:
-               case CONNMAN_SERVICE_TYPE_CELLULAR:
-                       if (enable)
-                               active_sessions[type]++;
-                       else
-                               active_sessions[type]--;
-                       break;
-
-               case CONNMAN_SERVICE_TYPE_UNKNOWN:
-               case CONNMAN_SERVICE_TYPE_SYSTEM:
-               case CONNMAN_SERVICE_TYPE_GPS:
-               case CONNMAN_SERVICE_TYPE_VPN:
-               case CONNMAN_SERVICE_TYPE_GADGET:
-                       break;
-               }
-
-               list = g_slist_next(list);
-       }
-
-       DBG("eth %d wifi %d bt %d cellular %d sessions %d",
-                       active_sessions[CONNMAN_SERVICE_TYPE_ETHERNET],
-                       active_sessions[CONNMAN_SERVICE_TYPE_WIFI],
-                       active_sessions[CONNMAN_SERVICE_TYPE_BLUETOOTH],
-                       active_sessions[CONNMAN_SERVICE_TYPE_CELLULAR],
-                       active_count);
-}
-
 struct preferred_tech_data {
        GList *preferred_list;
        enum connman_service_type type;
@@ -3559,9 +3513,10 @@ static bool auto_connect_service(GList *services, bool 
preferred)
        struct connman_service *service = NULL;
        bool ignore[MAX_CONNMAN_SERVICE_TYPES] = { };
        bool autoconnecting = false;
+       bool active_session;
        GList *list;
 
-       DBG("preferred %d sessions %d", preferred, active_count);
+       DBG("preferred %d sessions %d", preferred, __connman_session_running());
 
        ignore[CONNMAN_SERVICE_TYPE_VPN] = true;
 
@@ -3577,7 +3532,7 @@ static bool auto_connect_service(GList *services, bool 
preferred)
                if (service->pending ||
                                is_connecting(service) ||
                                is_connected(service)) {
-                       if (!active_count)
+                       if (!__connman_session_running())
                                return true;
 
                        ignore[service->type] = true;
@@ -3600,7 +3555,8 @@ static bool auto_connect_service(GList *services, bool 
preferred)
                                CONNMAN_SERVICE_STATE_IDLE)
                        continue;
 
-               if (autoconnecting && !active_sessions[service->type]) {
+               active_session = __connman_session_active_sessions(service);
+               if (autoconnecting && !active_session) {
                        DBG("service %p type %s has no users", service,
                                __connman_service_type2string(service->type));
                        continue;
@@ -3612,7 +3568,7 @@ static bool auto_connect_service(GList *services, bool 
preferred)
                service->userconnect = false;
                __connman_service_connect(service);
 
-               if (!active_count)
+               if (!__connman_session_running())
                        return true;
 
                ignore[service->type] = true;
@@ -3636,7 +3592,7 @@ static gboolean run_auto_connect(gpointer data)
                g_list_free(preferred_tech);
        }
 
-       if (!autoconnecting || active_count)
+       if (!autoconnecting || __connman_session_running())
                auto_connect_service(service_list, false);
 
        return FALSE;
diff --git a/src/session.c b/src/session.c
index e027eec..3f6b936 100644
--- a/src/session.c
+++ b/src/session.c
@@ -65,6 +65,7 @@ struct connman_session {
        struct connman_session_policy *policy;
 
        bool append_all;
+       bool active;
        struct session_info *info;
        struct session_info *info_last;
        struct connman_service *service;
@@ -728,15 +729,54 @@ static bool match_session(struct connman_session *session,
        return false;
 }
 
-static void cleanup_session_final(struct connman_session *session)
+static void session_set_active(struct connman_session *session, bool enable)
 {
-       struct session_info *info = session->info;
+       struct service_data *service_data;
+       struct connman_service *service;
+       enum connman_service_state state;
+       GHashTableIter iter;
+       gpointer key, value;
+
+       session->active = enable;
+
+       if (!service_hash)
+               return;
+
+       g_hash_table_iter_init(&iter, service_hash);
+
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               service = key;
+               service_data = value;
+
+               if (!match_session(session, service))
+                       continue;
 
+               state = __connman_service_get_state(service);
+
+               if (enable) {
+                       service_data->sessions =
+                               g_slist_prepend(service_data->sessions,
+                                               session);
+
+                       if (!session->service &&
+                                       is_session_connected(session, state))
+                               add_service_to_session(session, service);
+               } else {
+                       service_data->sessions =
+                               g_slist_remove(service_data->sessions,
+                                               session);
+
+                       if (session->service == service)
+                               remove_service_from_session(session, service);
+               }
+       }
+}
+
+static void cleanup_session_final(struct connman_session *session)
+{
        DBG("remove %s", session->session_path);
 
-       if (info->connect)
-               __connman_service_set_active_session(false,
-                               session->info->config.allowed_bearers);
+       session_set_active(session, false);
 
        g_slist_free(session->user_allowed_bearers);
 
@@ -1053,11 +1093,12 @@ static void trigger_disconnect(struct connman_session 
*session)
        if (!info->connect)
                return;
 
-       __connman_service_set_active_session(false,
-                               info->config.allowed_bearers);
+       session_set_active(session, false);
 
        info->connect = false;
        info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
+
+       __connman_service_auto_connect();
 }
 
 static void trigger_connect(struct connman_session *session)
@@ -1068,8 +1109,7 @@ static void trigger_connect(struct connman_session 
*session)
                return;
 
        info->connect = true;
-       __connman_service_set_active_session(true,
-                               info->config.allowed_bearers);
+       session_set_active(session, true);
 
        __connman_service_auto_connect();
 }
@@ -1105,16 +1145,12 @@ int connman_session_config_update(struct 
connman_session *session)
        if (err < 0)
                return err;
 
-       if (info->connect)
-               __connman_service_set_active_session(false,
-                               info->config.allowed_bearers);
+       session_set_active(session, false);
 
        g_slist_free(info->config.allowed_bearers);
        info->config.allowed_bearers = allowed_bearers;
 
-       if (info->connect)
-               __connman_service_set_active_session(true,
-                               info->config.allowed_bearers);
+       session_set_active(session, true);
 
        info->config.type = apply_policy_on_type(
                                session->policy_config->type,
@@ -1130,6 +1166,8 @@ int connman_session_config_update(struct connman_session 
*session)
 
        session_notify(session);
 
+       __connman_service_auto_connect();
+
        return 0;
 }
 
@@ -1204,9 +1242,7 @@ static DBusMessage *change_session(DBusConnection *conn,
                        if (err < 0)
                                return __connman_error_failed(msg, -err);
 
-                       if (info->connect)
-                               __connman_service_set_active_session(false,
-                                               info->config.allowed_bearers);
+                       session_set_active(session, false);
 
                        g_slist_free(info->config.allowed_bearers);
                        session->user_allowed_bearers = allowed_bearers;
@@ -1219,10 +1255,7 @@ static DBusMessage *change_session(DBusConnection *conn,
                        if (err < 0)
                                return __connman_error_failed(msg, -err);
 
-                       if (info->connect)
-                               __connman_service_set_active_session(true,
-                                               info->config.allowed_bearers);
-
+                       session_set_active(session, true);
                } else {
                        goto err;
                }
@@ -1398,6 +1431,8 @@ static int session_create_final(struct creation_data 
*creation_data,
 
        session_notify(session);
 
+       session_set_active(session, true);
+
        cleanup_creation_data(creation_data);
 
 err:
@@ -1819,6 +1854,31 @@ static void notify_ipconfig_changed(struct 
connman_service *service,
        }
 }
 
+bool __connman_session_active_sessions(struct connman_service *service)
+{
+       struct service_data *service_data;
+       struct connman_session *session;
+       GSList *list;
+
+       service_data = g_hash_table_lookup(service_hash, service);
+       if (!service_data)
+               return false;
+
+       for (list = service_data->sessions; list; list = list->next) {
+               session = list->data;
+
+               if (session->active)
+                       return true;
+       }
+
+       return false;
+}
+
+bool __connman_session_running(void)
+{
+       return g_hash_table_size(session_hash) > 0;
+}
+
 static struct connman_notifier session_notifier = {
        .name                   = "session",
        .service_add            = notify_service_add,
-- 
1.8.4.474.g128a96c

_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman

Reply via email to