diff options
author | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2011-08-11 16:56:18 +0200 |
---|---|---|
committer | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2011-08-11 17:40:52 +0200 |
commit | 4250ca086f6550db46b85dffe081f9f19b4ab04c (patch) | |
tree | af9e39f3d02648923812ff2f310b30cb46b63718 /src/session.c | |
parent | e69fc2a493e118637d951c0ad2b5c508764fd69e (diff) | |
download | connman-4250ca086f6550db46b85dffe081f9f19b4ab04c.tar.gz connman-4250ca086f6550db46b85dffe081f9f19b4ab04c.tar.bz2 connman-4250ca086f6550db46b85dffe081f9f19b4ab04c.zip |
session: Track reason on a session level
We need to track the Connect()/Disconnect() on a global session level
and not only in the info. This is needed when we were not able to
select and connect to a matching service in the first place. It might
happen that a valid service is added in time and then we want to use
it.
Diffstat (limited to 'src/session.c')
-rw-r--r-- | src/session.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/session.c b/src/session.c index da9162c1..7d9fc8b4 100644 --- a/src/session.c +++ b/src/session.c @@ -84,6 +84,7 @@ struct session_info { unsigned int marker; struct service_entry *entry; + enum connman_session_reason reason; }; struct connman_session { @@ -760,6 +761,7 @@ static void test_and_disconnect(struct connman_session *session) entry = info->entry; info->online = FALSE; + info->reason = CONNMAN_SESSION_REASON_UNKNOWN; info->entry = NULL; if (disconnect == TRUE) { @@ -784,6 +786,8 @@ static void select_and_connect(struct connman_session *session, DBG("session %p reason %s", session, reason2string(reason)); + info->reason = reason; + iter = g_sequence_get_begin_iter(session->service_list); while (g_sequence_iter_is_end(iter) == FALSE) { @@ -902,6 +906,20 @@ static void session_changed(struct connman_session *session, break; } + if (info->reason == CONNMAN_SESSION_REASON_CONNECT) { + DBG("Retry to find a matching session"); + /* + * The user called Connect() but there was no + * matching session available at this point. + * Now there might be a new one. Let's retry + * to select and connect + */ + select_and_connect(session, + CONNMAN_SESSION_REASON_CONNECT); + + break; + } + if (info->stay_connected == TRUE) { DBG("StayConnected"); select_and_connect(session, |