diff options
author | Bjoern Thorwirth <external.bjoern.thorwirth@de.bosch.com> | 2017-04-25 15:15:40 +0530 |
---|---|---|
committer | Daniel Wagner <wagi@monom.org> | 2017-05-03 22:39:59 +0200 |
commit | a8e371b646187a0d20b47a47c94811b87b247004 (patch) | |
tree | c0a1da91f0d82c3106edd8c85f9435e45d5ac8db | |
parent | 83206d503806d977f63b225d4bce813c29ba5ddc (diff) | |
download | connman-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.h | 2 | ||||
-rw-r--r-- | src/session.c | 34 |
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; |