On Mon, Oct 5, 2015 at 1:21 AM, Johan Hedberg <johan.hedberg@xxxxxxxxx> wrote: > Hi Jakub, > > On Wed, Sep 02, 2015, Jakub Pawlowski wrote: >> This patch adds handling of BT_HCI_CMD_LE_CREATE_CONN_CANCEL command. >> >> If btdev_set_le_noresp_conn_request is called on btdev, other devices that >> try to connect to it will stuck on BT_HCI_CMD_LE_CREATE_CONN, by not >> sending bt_hci_evt_le_conn_complete event back. Thanks to that, >> BT_HCI_CMD_LE_CREATE_CONN_CANCEL can be triggered to cancel connect >> attempt. >> --- >> emulator/btdev.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ >> emulator/btdev.h | 2 ++ >> emulator/hciemu.c | 8 ++++++++ >> emulator/hciemu.h | 3 +++ >> 4 files changed, 58 insertions(+) >> >> diff --git a/emulator/btdev.c b/emulator/btdev.c >> index 60e8e8c..1645776 100644 >> --- a/emulator/btdev.c >> +++ b/emulator/btdev.c >> @@ -145,6 +145,11 @@ struct btdev { >> uint16_t sync_train_interval; >> uint32_t sync_train_timeout; >> uint8_t sync_train_service_data; >> + >> + bool le_noresp_conn_request; >> + bool pending_le_conn; >> + uint8_t pending_le_conn_addr[6]; >> + uint8_t pending_le_conn_addr_type; >> }; >> >> struct inquiry_data { >> @@ -674,6 +679,11 @@ bool btdev_is_le_scan_enabled(struct btdev *btdev) >> return btdev->le_scan_enable; >> } >> >> +void btdev_set_le_noresp_conn_request(struct btdev *btdev, bool value) >> +{ >> + btdev->le_noresp_conn_request = value; >> +} >> + >> static bool use_ssp(struct btdev *btdev1, struct btdev *btdev2) >> { >> if (btdev1->auth_enable || btdev2->auth_enable) >> @@ -1134,6 +1144,9 @@ static void le_conn_complete(struct btdev *btdev, >> cc->handle = cpu_to_le16(42); >> } >> >> + if (btdev->pending_le_conn) >> + btdev->pending_le_conn = false; >> + >> cc->status = status; >> cc->peer_addr_type = bdaddr_type; >> memcpy(cc->peer_addr, bdaddr, 6); >> @@ -1183,6 +1196,13 @@ static void le_conn_request(struct btdev *btdev, const uint8_t *bdaddr, >> { >> struct btdev *remote = find_btdev_by_bdaddr_type(bdaddr, bdaddr_type); >> >> + if (remote && remote->le_noresp_conn_request) { >> + btdev->pending_le_conn = true; >> + memcpy(btdev->pending_le_conn_addr, bdaddr, 6); >> + btdev->pending_le_conn_addr_type = bdaddr_type; >> + return; >> + } > > btdev.c has a hooks mechanism to avoid adding test-specific complexity > from creeping in by letting the exception handling be in the test code > itself. In this case, couldn't you use command hooks to deal with the > le_create_conn & le_create_conn_cancel commands in the tester and > prevent the default handlers for them from running in btdev.c (by > returning 'false' from the hook callback)? Thanks for pointing me to hooks. It actually made this code shorter. > > Johan -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html