Thread (13 messages) 13 messages, 4 authors, 2015-08-24

Re: IdleTimeout behavior for Sony PS3 remote in Bluez 5

From: Mark A. Haun <hidden>
Date: 2015-08-20 05:02:31

Hi Luiz and the group,

I captured a debug log from bluetoothd while testing the PS3 remote.  I'm not
sure it sheds any light on what is happening though.  When the timeout occurs
and the input device goes away, there is no log output from bluetoothd or the
kernel.

Here is the same test sequence as in my original post, with the bluetoothd
lots interspersed:

Press a key (or two) on the remote when it is not connected:

Aug 19 21:04:13 kolonia bluetoothd[11186]: src/adapter.c:connected_callback() hci0 device 00:21:4F:48:D1:D2 connected eir_len 5
Aug 19 21:04:13 kolonia bluetoothd[11186]: profiles/input/server.c:connect_event_cb() Incoming connection from 00:21:4F:48:D1:D2 on PSM 17
Aug 19 21:04:13 kolonia bluetoothd[11186]: profiles/input/device.c:input_device_set_channel() idev 0x7ff49ff8 psm 17
Aug 19 21:04:13 kolonia bluetoothd[11186]: profiles/input/server.c:confirm_event_cb() 
Aug 19 21:04:13 kolonia bluetoothd[11186]: profiles/input/server.c:connect_event_cb() Incoming connection from 00:21:4F:48:D1:D2 on PSM 19
Aug 19 21:04:13 kolonia bluetoothd[11186]: profiles/input/device.c:input_device_set_channel() idev 0x7ff49ff8 psm 19
Aug 19 21:04:13 kolonia bluetoothd[11186]: src/service.c:change_state() 0x7ff484a8: device 00:21:4F:48:D1:D2 profile input-hid state changed: disconnected -> connected (0)
Aug 19 21:04:13 kolonia bluetoothd[11186]: src/service.c:btd_service_ref() 0x7ff484a8: ref=3
Aug 19 21:04:13 kolonia bluetoothd[11186]: plugins/policy.c:service_cb() Added input-hid reconnect 0
Aug 19 21:04:13 kolonia kernel: [1244066.144277] input: BD Remote Control as /devices/soc0/7d004000.usb/usb1/1-1/1-1:1.0/bluetooth/hci0/hci0:256/0005:054C:0306.0006/input/input8
Aug 19 21:04:13 kolonia kernel: [1244066.158238] sony 0005:054C:0306.0006: input,hidraw1: BLUETOOTH HID v1.00 Gamepad [BD Remote Control] on ac:fd:ce:76:f2:4a

Input device is created; can run evemu-record and watch keypress events on
the remote.  After one minute of inactivity, the remote is still sending
packets (which can be seen in the hciconfig packet counter), but the kernel
input device has gone away.  No new messages in dmesg or in the bluetoothd
log at this time :(

<Time passes...>

Remote is still connected.  Forcibly disconnect using "hcitool dc 00:21:4f:48:d1:d2":

Aug 19 21:17:46 kolonia bluetoothd[11186]: src/adapter.c:dev_disconnected() Device 00:21:4F:48:D1:D2 disconnected, reason 2
Aug 19 21:17:46 kolonia bluetoothd[11186]: src/adapter.c:adapter_remove_connection() 
Aug 19 21:17:46 kolonia bluetoothd[11186]: plugins/policy.c:disconnect_cb() reason 2
Aug 19 21:17:46 kolonia bluetoothd[11186]: src/adapter.c:bonding_attempt_complete() hci0 bdaddr 00:21:4F:48:D1:D2 type 0 status 0xe
Aug 19 21:17:46 kolonia bluetoothd[11186]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
Aug 19 21:17:46 kolonia bluetoothd[11186]: src/device.c:device_bonding_failed() status 14
Aug 19 21:17:46 kolonia bluetoothd[11186]: src/adapter.c:resume_discovery() 
Aug 19 21:17:46 kolonia bluetoothd[11186]: profiles/input/device.c:ctrl_watch_cb() Device 00:21:4F:48:D1:D2 disconnected
Aug 19 21:17:46 kolonia bluetoothd[11186]: profiles/input/device.c:intr_watch_cb() Device 00:21:4F:48:D1:D2 disconnected
Aug 19 21:17:46 kolonia bluetoothd[11186]: src/service.c:change_state() 0x7ff484a8: device 00:21:4F:48:D1:D2 profile input-hid state changed: connected -> disconnected (0)
Aug 19 21:17:46 kolonia bluetoothd[11186]: profiles/input/device.c:input_device_enter_reconnect_mode() path=/org/bluez/hci0/dev_00_21_4F_48_D1_D2 reconnect_mode=device

Now press keys on the remote, and it reconnects again:

Aug 19 21:19:22 kolonia bluetoothd[11186]: src/adapter.c:connected_callback() hci0 device 00:21:4F:48:D1:D2 connected eir_len 5
Aug 19 21:19:22 kolonia bluetoothd[11186]: profiles/input/server.c:connect_event_cb() Incoming connection from 00:21:4F:48:D1:D2 on PSM 17
Aug 19 21:19:22 kolonia bluetoothd[11186]: profiles/input/device.c:input_device_set_channel() idev 0x7ff49ff8 psm 17
Aug 19 21:19:22 kolonia bluetoothd[11186]: profiles/input/server.c:confirm_event_cb() 
Aug 19 21:19:22 kolonia bluetoothd[11186]: profiles/input/server.c:connect_event_cb() Incoming connection from 00:21:4F:48:D1:D2 on PSM 19
Aug 19 21:19:22 kolonia bluetoothd[11186]: profiles/input/device.c:input_device_set_channel() idev 0x7ff49ff8 psm 19
Aug 19 21:19:22 kolonia bluetoothd[11186]: src/service.c:change_state() 0x7ff484a8: device 00:21:4F:48:D1:D2 profile input-hid state changed: disconnected -> connected (0)
Aug 19 21:19:22 kolonia bluetoothd[11186]: plugins/policy.c:service_cb() Added input-hid reconnect 0
Aug 19 21:19:22 kolonia kernel: [1244975.379906] input: BD Remote Control as /devices/soc0/7d004000.usb/usb1/1-1/1-1:1.0/bluetooth/hci0/hci0:256/0005:054C:0306.0007/input/input9
Aug 19 21:19:22 kolonia kernel: [1244975.393392] sony 0005:054C:0306.0007: input,hidraw1: BLUETOOTH HID v1.00 Gamepad [BD Remote Control] on ac:fd:ce:76:f2:4a

and we can again see keypresses in evemu-record, until the next timeout.

About your other questions,
quoted
The PS3 remote is definitely one of those broken devices.  During
bluez 4.xx there were a set of unofficial patches maintained at
kitlaan.twinaxis.com (now defunct).
Patches to what exactly, BlueZ userspace, kernel?
They were patches to the bluez userspace distribution.  Much of it was
non-essential: timeout in seconds rather than minutes, and key-code
mapping for ease of integration with media software.  Details here:
https://www.mythtv.org/wiki/Sony_PS3_BD_Remote
 
Note that using IdleTimeout affects every single HID that you connect
over Bluetooth, which is why I think this is in the wrong place, it
should probably be up to the PS3 remote driver to implement such
policy to disconnect on idle. Either way I don't see another option
other then to set the socket err so userspace can cleanup it own
reference to the socket.
By "PS3 remote driver" you mean adding an exception for the Sony remote
in the evdev driver?  Because I don't think there is a PS3 remote driver
per se.  It's just a generic HID.

I agree that the blanket timeout is not a great solution but in my case
it would be sufficient, *if* it worked.  (I don't have any other
bluetooth HIDs to worry about.)
quoted
quoted
Apparently the following lines were removed in the commit
5205185d461d5902325e457ca80bd421127b7308:

-       /* Wakeup user-space polling for socket errors */
-       session->intr_sock->sk->sk_err = EUNATCH;
-       session->ctrl_sock->sk->sk_err = EUNATCH;

Without this I doubt the userspace will realize that it should
release the sockets which means this as been broken for over 2
years and probably nobody realized up until today, it is probably
only useful when IdleTimeout is set since it is the only case
where the module itself device to remove the device and disconnect.
I don't know enough to understand what this was doing, but I see that
the source was heavily reworked in kernel 3.10...  If someone could
craft a patch against recent kernels (4.2) I would be happy to test
it.  As bluez 5 rolls out to more distros, I imagine there will be
more users wanting to know why their remote is broken :)

Thanks,
Mark
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help