diff mbox series

[Bluez,v1] input: Disconnect ctrl chan only if intr chan was disconnected by us

Message ID 20200610230423.Bluez.v1.1.Id3fa4e63f104f100648140f38d0fc40919b24c69@changeid
State New
Headers show
Series [Bluez,v1] input: Disconnect ctrl chan only if intr chan was disconnected by us | expand

Commit Message

Archie Pusaka June 10, 2020, 3:04 p.m. UTC
From: Archie Pusaka <apusaka@chromium.org>

If the intr channel was disconnected by the other party, then they
are also responsible to close the ctrl channel. Such disconnection
message would have the G_IO_ERR flag set, as opposed to it being
unset if the disconnection is initiated by us.

There doesn't seem to be an explicit rule in the specification
about this behavior, but this is enforced in the PTS qualification
tool.
---

 profiles/input/device.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/profiles/input/device.c b/profiles/input/device.c
index d89da2d7c..a858bbb19 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -333,8 +333,10 @@  static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
 		idev->intr_io = NULL;
 	}
 
-	/* Close control channel */
-	if (idev->ctrl_io && !(cond & G_IO_NVAL))
+	/* Close control channel if the closing of interrupt channel is not
+	 * initiated by the other party
+	 */
+	if (idev->ctrl_io && !(cond & (G_IO_NVAL | G_IO_ERR)))
 		g_io_channel_shutdown(idev->ctrl_io, TRUE, NULL);
 
 	btd_service_disconnecting_complete(idev->service, 0);