summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjoern Thorwirth <external.bjoern.thorwirth@de.bosch.com>2017-04-25 15:15:40 +0530
committerDaniel Wagner <wagi@monom.org>2017-05-03 22:39:59 +0200
commita8e371b646187a0d20b47a47c94811b87b247004 (patch)
treec0a1da91f0d82c3106edd8c85f9435e45d5ac8db
parent83206d503806d977f63b225d4bce813c29ba5ddc (diff)
downloadconnman-a8e371b646187a0d20b47a47c94811b87b247004.tar.gz
session: Callback hook for policy plugin to return service of session
Returns the allowed service for a session based on a provided list of available services.
-rw-r--r--include/session.h2
-rw-r--r--src/session.c34
2 files changed, 36 insertions, 0 deletions
diff --git a/include/session.h b/include/session.h
index 25a5e58d..0d66f489 100644
--- a/include/session.h
+++ b/include/session.h
@@ -93,6 +93,8 @@ struct connman_session_policy {
struct connman_service *service);
void (*update_session_state)(struct connman_session* session,
enum connman_session_state state);
+ struct connman_service* (*get_service_for_session)(struct connman_session* session,
+ GSList* services);
};
int connman_session_policy_register(struct connman_session_policy *config);
diff --git a/src/session.c b/src/session.c
index 570b6a69..92781dfc 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1751,6 +1751,40 @@ static void session_activate(struct connman_session *session)
if (!service_hash)
return;
+ if (policy && policy->get_service_for_session) {
+ struct connman_service *service;
+ struct connman_service_info *info;
+ GSList *service_list = NULL;
+ enum connman_service_state state = CONNMAN_SESSION_STATE_DISCONNECTED;
+
+ g_hash_table_iter_init(&iter, service_hash);
+
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ struct connman_service_info *info = value;
+ state = __connman_service_get_state(info->service);
+
+ if (is_session_connected(session, state))
+ service_list = g_slist_prepend(service_list,
+ info->service);
+ }
+
+ service_list = g_slist_reverse(service_list);
+ service = policy->get_service_for_session(session, service_list);
+
+ if (service) {
+ info = g_hash_table_lookup(service_hash, service);
+ DBG("session %p add service %p", session, info->service);
+
+ info->sessions = g_slist_prepend(info->sessions,
+ session);
+ session->service = info->service;
+ update_session_state(session);
+ }
+
+ g_slist_free(service_list);
+ return;
+ }
+
g_hash_table_iter_init(&iter, service_hash);
while (g_hash_table_iter_next(&iter, &key, &value)) {
struct connman_service_info *info = value;