diff options
author | Lukasz Rymanowski <lukasz.rymanowski@tieto.com> | 2014-09-09 11:02:09 +0200 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2014-09-09 16:29:48 -0700 |
commit | 99d97aa842c8aac525b9fb9a90417b9bf154410e (patch) | |
tree | 072d481d4ef4050b2b8350a3662ee493eb3e6650 /src/sdp-client.c | |
parent | 7bc5ee49e8303280dfe102d1324dd4f2c35e5625 (diff) | |
download | bluez-99d97aa842c8aac525b9fb9a90417b9bf154410e.tar.gz |
sdp-client: Add disconnect watch for cached session
SDP client keeps sdp session alive for 2 more second after usage in case
there is need for reuse it. However, if ACL is disconnected and
reconnected during that time, sdp session becomes outdated. This patch
makes sure that cached sdp session will be cleaned up on ACL disconnect
Diffstat (limited to 'src/sdp-client.c')
-rw-r--r-- | src/sdp-client.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/sdp-client.c b/src/sdp-client.c index b6a3663cf..f9412f0bb 100644 --- a/src/sdp-client.c +++ b/src/sdp-client.c @@ -45,6 +45,7 @@ struct cached_sdp_session { bdaddr_t dst; sdp_session_t *session; guint timer; + guint io_id; }; static GSList *cached_sdp_sessions = NULL; @@ -60,6 +61,7 @@ static gboolean cached_session_expired(gpointer user_data) { struct cached_sdp_session *cached = user_data; + g_source_remove(cached->io_id); cleanup_cached_session(cached); return FALSE; @@ -77,6 +79,7 @@ static sdp_session_t *get_cached_sdp_session(const bdaddr_t *src, const bdaddr_t continue; g_source_remove(c->timer); + g_source_remove(c->io_id); session = c->session; @@ -89,10 +92,23 @@ static sdp_session_t *get_cached_sdp_session(const bdaddr_t *src, const bdaddr_t return NULL; } +static gboolean disconnect_watch(GIOChannel *chan, GIOCondition cond, + gpointer user_data) +{ + struct cached_sdp_session *cached = user_data; + + g_source_remove(cached->timer); + cleanup_cached_session(cached); + + return FALSE; +} + static void cache_sdp_session(bdaddr_t *src, bdaddr_t *dst, sdp_session_t *session) { struct cached_sdp_session *cached; + int sk; + GIOChannel *chan; cached = g_new0(struct cached_sdp_session, 1); @@ -106,6 +122,13 @@ static void cache_sdp_session(bdaddr_t *src, bdaddr_t *dst, cached->timer = g_timeout_add_seconds(CACHE_TIMEOUT, cached_session_expired, cached); + + /* Watch the connection state during cache timeout */ + sk = sdp_get_socket(session); + chan = g_io_channel_unix_new(sk); + + cached->io_id = g_io_add_watch(chan, G_IO_HUP | G_IO_ERR | G_IO_NVAL, + disconnect_watch, cached); } struct search_context { |