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