Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bt-embedded/acl.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ void bte_acl_disconnect(BteAcl *acl)
return;
}
bte_hci_disconnect(acl->hci, acl->conn_handle,
BTE_HCI_OTHER_END_TERMINATED_CONN_USER_ENDED,
BTE_HCI_OTHER_END_CLOSED_CONN_USER,
/* No callback, as there's nothing we should do in case
* of error */
NULL, NULL);
Expand Down
26 changes: 18 additions & 8 deletions bt-embedded/hci.c
Original file line number Diff line number Diff line change
Expand Up @@ -392,13 +392,15 @@ static void conn_complete_event_cb(BteBuffer *buffer)
void *userdata = pc->userdata;
_bte_hci_dev_free_command(pc);

create_connection_cb(hci, &reply, userdata);
if (create_connection_cb) {
create_connection_cb(hci, &reply, userdata);
}
}

static void create_connection_status_cb(
BteHci *hci, uint8_t status, BteHciPendingCommand *pc)
{
if (status != 0) goto error;
if (status != 0 || !hci) goto error;

struct _bte_hci_tmpdata_create_connection_t *tmpdata =
&hci->last_async_cmd_data.create_connection;
Expand Down Expand Up @@ -590,11 +592,13 @@ void bte_hci_reject_connection(BteHci *hci,
create_connection_status_cb, status_cb, userdata);
if (UNLIKELY(!b)) return;

/* In the status callback we read this and setup the event matcher */
struct _bte_hci_tmpdata_create_connection_t *tmpdata =
&hci->last_async_cmd_data.create_connection;
memcpy(&tmpdata->address, address, sizeof(*address));
tmpdata->client_cb = callback;
if (hci) {
/* In the status callback we read this and setup the event matcher */
struct _bte_hci_tmpdata_create_connection_t *tmpdata =
&hci->last_async_cmd_data.create_connection;
memcpy(&tmpdata->address, address, sizeof(*address));
tmpdata->client_cb = callback;
}

uint8_t *data = b->data + HCI_CMD_HDR_LEN;
memcpy(data, address, sizeof(*address));
Expand All @@ -617,7 +621,13 @@ static bool client_handle_connection_request(BteHci *hci, void *cb_data)
static void connection_request_event_cb(BteBuffer *buffer)
{
uint8_t *data = buffer->data + HCI_CMD_EVENT_POS_DATA;
_bte_hci_dev_foreach_hci_client(client_handle_connection_request, data);
bool handled =
_bte_hci_dev_foreach_hci_client(client_handle_connection_request, data);
if (!handled) {
const BteBdAddr *address = (void*)data;
bte_hci_reject_connection(NULL, address, BTE_HCI_HOST_REJECTED_BD_ADDR,
NULL, NULL, NULL);
}
}

void bte_hci_on_connection_request(BteHci *hci, BteHciConnectionRequestCb callback)
Expand Down
82 changes: 41 additions & 41 deletions bt-embedded/hci_proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,47 +23,47 @@ extern "C" {
/* Success code */
#define BTE_HCI_SUCCESS 0x00
/* Possible error codes */
#define BTE_HCI_UNKNOWN_BTE_HCI_COMMAND 0x01
#define BTE_HCI_NO_CONNECTION 0x02
#define BTE_HCI_HW_FAILURE 0x03
#define BTE_HCI_PAGE_TIMEOUT 0x04
#define BTE_HCI_AUTHENTICATION_FAILURE 0x05
#define BTE_HCI_KEY_MISSING 0x06
#define BTE_HCI_MEMORY_FULL 0x07
#define BTE_HCI_CONN_TIMEOUT 0x08
#define BTE_HCI_MAX_NUMBER_OF_CONNECTIONS 0x09
#define BTE_HCI_MAX_NUMBER_OF_SCO_CONNECTIONS_TO_DEVICE 0x0A
#define BTE_HCI_ACL_CONNECTION_EXISTS 0x0B
#define BTE_HCI_COMMAND_DISSALLOWED 0x0C
#define BTE_HCI_HOST_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D
#define BTE_HCI_HOST_REJECTED_DUE_TO_SECURITY_REASONS 0x0E
#define BTE_HCI_HOST_REJECTED_DUE_TO_REMOTE_DEVICE_ONLY_PERSONAL_SERVICE 0x0F
#define BTE_HCI_HOST_TIMEOUT 0x10
#define BTE_HCI_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE 0x11
#define BTE_HCI_INVALID_BTE_HCI_COMMAND_PARAMETERS 0x12
#define BTE_HCI_OTHER_END_TERMINATED_CONN_USER_ENDED 0x13
#define BTE_HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES 0x14
#define BTE_HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF 0x15
#define BTE_HCI_CONN_TERMINATED_BY_LOCAL_HOST 0x16
#define BTE_HCI_REPEATED_ATTEMPTS 0x17
#define BTE_HCI_PAIRING_NOT_ALLOWED 0x18
#define BTE_HCI_UNKNOWN_LMP_PDU 0x19
#define BTE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A
#define BTE_HCI_SCO_OFFSET_REJECTED 0x1B
#define BTE_HCI_SCO_INTERVAL_REJECTED 0x1C
#define BTE_HCI_SCO_AIR_MODE_REJECTED 0x1D
#define BTE_HCI_INVALID_LMP_PARAMETERS 0x1E
#define BTE_HCI_UNSPECIFIED_ERROR 0x1F
#define BTE_HCI_UNSUPPORTED_LMP_PARAMETER_VALUE 0x20
#define BTE_HCI_ROLE_CHANGE_NOT_ALLOWED 0x21
#define BTE_HCI_LMP_RESPONSE_TIMEOUT 0x22
#define BTE_HCI_LMP_ERROR_TRANSACTION_COLLISION 0x23
#define BTE_HCI_LMP_PDU_NOT_ALLOWED 0x24
#define BTE_HCI_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25
#define BTE_HCI_UNIT_KEY_USED 0x26
#define BTE_HCI_QOS_NOT_SUPPORTED 0x27
#define BTE_HCI_INSTANT_PASSED 0x28
#define BTE_HCI_PAIRING_UNIT_KEY_NOT_SUPPORTED 0x29
#define BTE_HCI_UNKNOWN_BTE_HCI_COMMAND 0x01
#define BTE_HCI_NO_CONNECTION 0x02
#define BTE_HCI_HW_FAILURE 0x03
#define BTE_HCI_PAGE_TIMEOUT 0x04
#define BTE_HCI_AUTHENTICATION_FAILURE 0x05
#define BTE_HCI_KEY_MISSING 0x06
#define BTE_HCI_MEMORY_FULL 0x07
#define BTE_HCI_CONN_TIMEOUT 0x08
#define BTE_HCI_MAX_NUMBER_OF_CONNECTIONS 0x09
#define BTE_HCI_MAX_NUMBER_OF_SCO_CONNECTIONS 0x0A
#define BTE_HCI_ACL_CONNECTION_EXISTS 0x0B
#define BTE_HCI_COMMAND_DISSALLOWED 0x0C
#define BTE_HCI_HOST_REJECTED_RESOURCES 0x0D
#define BTE_HCI_HOST_REJECTED_SECURITY 0x0E
#define BTE_HCI_HOST_REJECTED_BD_ADDR 0x0F
#define BTE_HCI_HOST_TIMEOUT 0x10
#define BTE_HCI_UNSUPPORTED_FEAT_OR_PARAM 0x11
#define BTE_HCI_INVALID_HCI_COMMAND_PARAMS 0x12
#define BTE_HCI_OTHER_END_CLOSED_CONN_USER 0x13
#define BTE_HCI_OTHER_END_CLOSED_CONN_RESOURCES 0x14
#define BTE_HCI_OTHER_END_CLOSED_CONN_POWER_OFF 0x15
#define BTE_HCI_CONN_TERMINATED_BY_LOCAL_HOST 0x16
#define BTE_HCI_REPEATED_ATTEMPTS 0x17
#define BTE_HCI_PAIRING_NOT_ALLOWED 0x18
#define BTE_HCI_UNKNOWN_LMP_PDU 0x19
#define BTE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A
#define BTE_HCI_SCO_OFFSET_REJECTED 0x1B
#define BTE_HCI_SCO_INTERVAL_REJECTED 0x1C
#define BTE_HCI_SCO_AIR_MODE_REJECTED 0x1D
#define BTE_HCI_INVALID_LMP_PARAMETERS 0x1E
#define BTE_HCI_UNSPECIFIED_ERROR 0x1F
#define BTE_HCI_UNSUPPORTED_LMP_PARAM 0x20
#define BTE_HCI_ROLE_CHANGE_NOT_ALLOWED 0x21
#define BTE_HCI_LMP_RESPONSE_TIMEOUT 0x22
#define BTE_HCI_LMP_ERROR_TRANSACTION_COLLISION 0x23
#define BTE_HCI_LMP_PDU_NOT_ALLOWED 0x24
#define BTE_HCI_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25
#define BTE_HCI_UNIT_KEY_USED 0x26
#define BTE_HCI_QOS_NOT_SUPPORTED 0x27
#define BTE_HCI_INSTANT_PASSED 0x28
#define BTE_HCI_PAIRING_UNIT_KEY_NOT_SUPPORTED 0x29

/* HCI Link manager feature masks */

Expand Down
2 changes: 1 addition & 1 deletion bt-embedded/l2cap.c
Original file line number Diff line number Diff line change
Expand Up @@ -1182,7 +1182,7 @@ static bool acl_l2cap_handle_disconnect_req(
l2cap_send_disconnect_resp(l2cap, id);
l2cap_set_state(l2cap, BTE_L2CAP_CLOSED);
if (l2cap->disconnect_cb) {
l2cap->disconnect_cb(l2cap, BTE_HCI_OTHER_END_TERMINATED_CONN_USER_ENDED,
l2cap->disconnect_cb(l2cap, BTE_HCI_OTHER_END_CLOSED_CONN_USER,
l2cap->disconnect_userdata);
}
return true;
Expand Down
33 changes: 33 additions & 0 deletions tests/test_events.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,39 @@ TEST(Events, testConnectionRequested)
ASSERT_EQ(calls, expectedCalls);
}

TEST(Events, testConnectionRequestedIgnored)
{
MockBackend backend;
Bte::Client client0, client1;
auto &hci0 = client0.hci();
auto &hci1 = client1.hci();

hci0.onConnectionRequest([&](const BteBdAddr &address,
const BteClassOfDevice &cod,
uint8_t link_type) {
return false;
});
hci1.onConnectionRequest([&](const BteBdAddr &address,
const BteClassOfDevice &cod,
uint8_t link_type) {
return false;
});

/* Emit the ConnectionRequest event */
BteBdAddr address = {1, 2, 3, 4, 5, 6};
BteClassOfDevice cod = {7, 8, 9};
uint8_t link_type = 2;
backend.sendEvent(
Buffer{ HCI_CONNECTION_REQUEST, 6 + 3 + 1 } + address + cod +
Buffer{link_type});
bte_handle_events();

/* We should have sent a rejection */
Buffer expectedCommand = Buffer{0xa, 0x4, 6 + 1} + address +
Buffer{BTE_HCI_HOST_REJECTED_BD_ADDR};
ASSERT_EQ(backend.lastCommand(), expectedCommand);
}

TEST(Events, testLinkKeyRequested)
{
MockBackend backend;
Expand Down
2 changes: 1 addition & 1 deletion tests/test_l2cap_disconnect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ TEST_F(TestL2capFixtureConnected, testRemoteDisconnects) {
bte_handle_events();

std::vector<uint8_t> expectedReasons {
BTE_HCI_OTHER_END_TERMINATED_CONN_USER_ENDED,
BTE_HCI_OTHER_END_CLOSED_CONN_USER,
};
ASSERT_EQ(disconnectReasons, expectedReasons);
ASSERT_EQ(state, BTE_L2CAP_CLOSED);
Expand Down