Skip to content

Commit e1d2e03

Browse files
committed
fix(bt/bluedroid): Fix HID Host connection bugs
1. Fix is_orig value inconsistency for HIDH open event 2. Fix the error state for repeat connection of the same device
1 parent 2768d33 commit e1d2e03

File tree

6 files changed

+55
-21
lines changed

6 files changed

+55
-21
lines changed

components/bt/host/bluedroid/bta/hh/bta_hh_act.c

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ static void bta_hh_di_sdp_cback(UINT16 result)
276276
bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, di_rec.rec.version, 0);
277277
}
278278

279-
} else { /* no DI recrod available */
279+
} else { /* no DI record available */
280280
bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0);
281281
}
282282

@@ -358,7 +358,7 @@ void bta_hh_start_sdp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
358358

359359
return;
360360
}
361-
/* GetSDPRecord. at one time only one SDP precedure can be active */
361+
/* GetSDPRecord. at one time only one SDP procedure can be active */
362362
else if (!bta_hh_cb.p_disc_db) {
363363
bta_hh_cb.p_disc_db = (tSDP_DISCOVERY_DB *) osi_malloc(p_bta_hh_cfg->sdp_db_size);
364364

@@ -429,6 +429,7 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
429429
APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl: HID_HostOpenDev failed: \
430430
Status 0x%2X", ret);
431431
#endif
432+
conn_dat.is_orig = HID_HostConnectOrig(p_cb->hid_handle);
432433
/* open fail, remove device from management device list */
433434
HID_HostRemoveDev( p_cb->hid_handle);
434435
status = BTA_HH_ERR;
@@ -452,8 +453,6 @@ void bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
452453
HID_HostRemoveDev( p_cb->incoming_hid_handle);
453454
}
454455
conn_dat.status = status;
455-
/* check if host initiate the connection*/
456-
conn_dat.is_orig = !p_cb->incoming_conn;
457456
(* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
458457

459458
/* move state machine W4_CONN ->IDLE */
@@ -523,8 +522,7 @@ void bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
523522

524523
memset((void *)&conn, 0, sizeof (tBTA_HH_CONN));
525524
conn.handle = dev_handle;
526-
/* check if host initiate the connection*/
527-
conn.is_orig = !p_cb->incoming_conn;
525+
conn.is_orig = HID_HostConnectOrig(dev_handle);
528526
bdcpy(conn.bda, p_cb->addr);
529527

530528
/* increase connection number */
@@ -596,7 +594,7 @@ void bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
596594
if (p_cb->app_id != 0) {
597595
bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data);
598596
} else
599-
/* app_id == 0 indicates an incoming conenction request arrives without SDP
597+
/* app_id == 0 indicates an incoming connection request arrives without SDP
600598
performed, do it first */
601599
{
602600
/* store the handle here in case sdp fails - need to disconnect */
@@ -637,7 +635,7 @@ void bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
637635
**
638636
** Function bta_hh_handsk_act
639637
**
640-
** Description HID Host process a handshake acknoledgement.
638+
** Description HID Host process a handshake acknowledgement.
641639
**
642640
**
643641
** Returns void
@@ -674,7 +672,7 @@ void bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
674672
p_cb->w4_evt = 0;
675673
break;
676674

677-
/* acknoledgement from HID device for SET_ transaction */
675+
/* acknowledgement from HID device for SET_ transaction */
678676
case BTA_HH_SET_RPT_EVT:
679677
case BTA_HH_SET_PROTO_EVT:
680678
case BTA_HH_SET_IDLE_EVT :
@@ -693,8 +691,7 @@ void bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
693691
case BTA_HH_OPEN_EVT:
694692
conn.status = p_data->hid_cback.data ? BTA_HH_ERR_PROTO : BTA_HH_OK;
695693
conn.handle = p_cb->hid_handle;
696-
/* check if host initiate the connection*/
697-
conn.is_orig = !p_cb->incoming_conn;
694+
conn.is_orig = HID_HostConnectOrig(p_cb->hid_handle);
698695
bdcpy(conn.bda, p_cb->addr);
699696
(* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn);
700697
#if BTA_HH_DEBUG
@@ -704,12 +701,12 @@ void bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
704701
break;
705702

706703
default:
707-
/* unknow transaction handshake response */
704+
/* unknown transaction handshake response */
708705
APPL_TRACE_DEBUG("unknown transaction type");
709706
break;
710707
}
711708

712-
/* transaction achknoledgement received, inform PM for mode change */
709+
/* transaction acknowledgement received, inform PM for mode change */
713710
bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
714711
return;
715712
}
@@ -799,7 +796,7 @@ void bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
799796
conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ?
800797
BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
801798
/* check if host initiate the connection*/
802-
conn_dat.is_orig = !p_cb->incoming_conn;
799+
conn_dat.is_orig = HID_HostConnectOrig(p_cb->hid_handle);
803800
bdcpy(conn_dat.bda, p_cb->addr);
804801
HID_HostCloseDev(p_cb->hid_handle);
805802

@@ -844,13 +841,13 @@ void bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
844841

845842
/* Check reason for closing */
846843
if ((reason & (HID_L2CAP_CONN_FAIL | HID_L2CAP_REQ_FAIL)) || /* Failure to initialize connection (page timeout or l2cap error) */
847-
(reason == HID_ERR_AUTH_FAILED) || /* Authenication error (while initiating) */
844+
(reason == HID_ERR_AUTH_FAILED) || /* Authentication error (while initiating) */
848845
(reason == HID_ERR_L2CAP_FAILED)) { /* Failure creating l2cap connection */
849846
/* Failure in opening connection */
850847
conn_dat.handle = p_cb->hid_handle;
851848
conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
852849
/* check if host initiate the connection*/
853-
conn_dat.is_orig = !p_cb->incoming_conn;
850+
conn_dat.is_orig = HID_HostConnectOrig(p_cb->hid_handle);
854851
bdcpy(conn_dat.bda, p_cb->addr);
855852
HID_HostCloseDev(p_cb->hid_handle);
856853

components/bt/host/bluedroid/bta/hh/bta_hh_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ void bta_hh_sm_execute(tBTA_HH_DEV_CB *p_cb, UINT16 event, tBTA_HH_DATA *p_data)
293293
cback_data.conn.status = BTA_HH_ERR_DB_FULL;
294294
cback_data.conn.handle = BTA_HH_INVALID_HANDLE;
295295
/* check if host initiate the connection*/
296-
cback_data.conn.is_orig = !p_cb->incoming_conn;
296+
cback_data.conn.is_orig = TRUE;
297297
break;
298298
/* DB full, BTA_HhAddDev */
299299
case BTA_HH_API_MAINT_DEV_EVT:

components/bt/host/bluedroid/btc/profile/std/hid/btc_hh.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ static btc_hh_device_t *btc_hh_find_connected_dev_by_bda(BD_ADDR bd_addr)
189189
*
190190
* Function btc_hh_stop_vup_timer
191191
*
192-
* Description stop vitual unplug timer
192+
* Description stop virtual unplug timer
193193
*
194194
* Returns void
195195
******************************************************************************/
@@ -316,7 +316,7 @@ void btc_hh_remove_device(BD_ADDR bd_addr)
316316

317317
for (i = 0; i < BTC_HH_MAX_ADDED_DEV; i++) {
318318
p_added_dev = &btc_hh_cb.added_devices[i];
319-
if (p_added_dev->bd_addr == bd_addr) {
319+
if (memcmp(p_added_dev->bd_addr, bd_addr, BD_ADDR_LEN) == 0) {
320320
BTA_HhRemoveDev(p_added_dev->dev_handle);
321321
btc_storage_remove_hid_info((bt_bdaddr_t *)p_added_dev->bd_addr);
322322
memset(p_added_dev->bd_addr, 0, 6);
@@ -544,6 +544,11 @@ static void btc_hh_connect(btc_hidh_args_t *arg)
544544
BTC_TRACE_ERROR("%s exceeded the maximum supported HID device number %d!", __func__, BTC_HH_MAX_HID);
545545
ret = ESP_HIDH_ERR_NO_RES;
546546
break;
547+
} else if (dev && dev->dev_status == ESP_HIDH_CONN_STATE_CONNECTED) {
548+
BTC_TRACE_WARNING("%s Device[%s] already connected", __func__,
549+
bdaddr_to_string((const bt_bdaddr_t *)arg->connect.bd_addr, bdstr, sizeof(bdstr)));
550+
param.open.conn_status = ESP_HIDH_CONN_STATE_CONNECTED;
551+
break;
547552
}
548553

549554
for (int i = 0; i < BTC_HH_MAX_ADDED_DEV; i++) {
@@ -662,7 +667,7 @@ static void btc_hh_virtual_unplug(btc_hidh_args_t *arg)
662667
param.unplug.conn_status = ESP_HIDH_CONN_STATE_DISCONNECTING;
663668
param.unplug.handle = p_dev->dev_handle;
664669
} else if ((p_dev != NULL) && (p_dev->dev_status == ESP_HIDH_CONN_STATE_CONNECTED)) {
665-
BTC_TRACE_WARNING("%s: Virtual unplug not suported, disconnecting device", __func__);
670+
BTC_TRACE_WARNING("%s: Virtual unplug not supported, disconnecting device", __func__);
666671
/* start the timer */
667672
btc_hh_start_vup_timer(arg->unplug.bd_addr);
668673
p_dev->local_vup = true;

components/bt/host/bluedroid/stack/hid/hidh_api.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ tHID_STATUS HID_HostAddDev ( BD_ADDR addr, UINT16 attr_mask, UINT8 *handle )
379379
if (!hh_cb.devices[i].in_use) {
380380
hh_cb.devices[i].in_use = TRUE;
381381
hh_cb.devices[i].delay_remove = FALSE;
382+
hh_cb.devices[i].is_orig = FALSE;
382383
memcpy( hh_cb.devices[i].addr, addr, sizeof( BD_ADDR ) ) ;
383384
hh_cb.devices[i].state = HID_DEV_NO_CONN;
384385
hh_cb.devices[i].conn_tries = 0 ;
@@ -486,6 +487,7 @@ tHID_STATUS HID_HostOpenDev ( UINT8 dev_handle )
486487
}
487488

488489
hh_cb.devices[dev_handle].conn_tries = 1;
490+
hh_cb.devices[dev_handle].is_orig = TRUE;
489491
return hidh_conn_initiate( dev_handle );
490492
}
491493

@@ -651,4 +653,23 @@ BOOLEAN hid_known_hid_device (BD_ADDR bd_addr)
651653
return FALSE;
652654
}
653655

656+
BOOLEAN HID_HostConnectOrig(UINT8 dev_handle)
657+
{
658+
BOOLEAN ret = FALSE;
659+
660+
do {
661+
if (!hh_cb.reg_flag) {
662+
break;
663+
}
664+
665+
if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) {
666+
break;
667+
}
668+
669+
ret = hh_cb.devices[dev_handle].is_orig;
670+
} while (0);
671+
672+
return ret;
673+
}
674+
654675
#endif //HID_HOST_INCLUDED

components/bt/host/bluedroid/stack/hid/include/hid_int.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ enum { HID_DEV_NO_CONN, HID_DEV_CONNECTED };
3535
typedef struct per_device_ctb {
3636
BOOLEAN in_use;
3737
BOOLEAN delay_remove;
38+
BOOLEAN is_orig;
3839
BD_ADDR addr; /* BD-Addr of the host device */
3940
UINT16 attr_mask; /* 0x01- virtual_cable; 0x02- normally_connectable; 0x03- reconn_initiate;
4041
0x04- sdp_disable; */
4142
UINT8 state; /* Device state if in HOST-KNOWN mode */
42-
UINT8 conn_substate;
4343
UINT8 conn_tries; /* Remembers to the number of connection attempts while CONNECTING */
4444

4545
tHID_CONN conn; /* L2CAP channel info */

components/bt/host/bluedroid/stack/include/stack/hidh_api.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,17 @@ BOOLEAN hid_known_hid_device (BD_ADDR bd_addr);
249249
*******************************************************************************/
250250
extern UINT8 HID_HostSetTraceLevel (UINT8 new_level);
251251

252+
/*******************************************************************************
253+
**
254+
** Function HID_HostConnectOrig
255+
**
256+
** Description Check if the HID Host initiates the connection
257+
**
258+
** Returns TRUE if the HID Host initiates the connection else FALSE
259+
**
260+
*******************************************************************************/
261+
extern BOOLEAN HID_HostConnectOrig(UINT8 dev_handle);
262+
252263
#ifdef __cplusplus
253264
}
254265
#endif

0 commit comments

Comments
 (0)