diff options
author | Sven Gothel <[email protected]> | 2020-06-24 06:00:26 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2020-06-24 06:00:26 +0200 |
commit | 9900ef4b93c191c0ac4fa8f941e06a5a8045257c (patch) | |
tree | 8687ff62336123079f1e02b1b1059fbc6e12bb32 /java/jni | |
parent | 66a29b048bbcde73dbcf7b7dfe654348c1bc33cf (diff) |
HCIHandler: Use async event mechanism for delayed replies, commands shall return immediately (1/2)
It has been observed that under certain circumstances a command like 'le_create_conn'
will timeout after having received the CMD_STATUS message while waiting for the
final completion reply LE_CONN_COMPLETE.
Such delay may even cause a disconnect in case the application is blocked
until command returns.
Here, under BlueZ Kernel, the HCI implementation issues a disconnect
and adds the device to the white-list for the adapter to complete the pending connection.
This is not desired!
Therefor, the only correct methodology is to utilize asynchronous reply
on delayed commands, i.e. commands with replies other than CMD_STATUS or CMD_COMPLETED.
Here we issue the command request and only wait for the immediate CMD_STATUS reply,
which HCIStatusCode will be returned.
The newly added MgmtEventCallback facility is utilized to forward received pending
(completion) events to added listeners.
This implementation benefits from HCIHandler's already existing reader thread.
Even in case HCIHandler won't receive the (completion) event due to
BlueZ Kernel Mgmt interception and handling,
the application will succeed as it will receive the event via callback
either from DBTManager or HCIHandler.
MgmtEventCallback has been chosen because:
- Enable existing DBTManager callback listener
- Allowing to receive the event either by DBTManager or HCIHandler
- Potential reimplementation of DBTManager using HCIHandler
- MgmtEvent types are easier to digest semantically
- MgmtEvent::Opcode value range is limited and more suitable for an array
Further details:
- HCIHandler translates supported HCIEvent to MgmtEvent.
- MgmtEvtDeviceConnected holds optional hci_conn_handle (manual creation)
- MgmtEvtDeviceConnectFailed holds optional HCIStatusCode (manual creation)
- DBTManager reader: Use mutex and reference instead of MgmtAdapterEventCallbackList copy.
Diffstat (limited to 'java/jni')
0 files changed, 0 insertions, 0 deletions