diff options
author | Ganesh Ganapathi Batta <ganeshg@broadcom.com> | 2013-02-05 15:22:31 -0800 |
---|---|---|
committer | Matthew Xie <mattx@google.com> | 2013-02-27 18:15:49 -0800 |
commit | ead3cde4bac0c3e32cd31f149093f004eef8ceeb (patch) | |
tree | f45b52e375e1a80e807dbbc864bb1da603965b0d /stack/gatt/gatt_main.c | |
parent | e17bf003d4eefdc8525e55894210e9ee494972b8 (diff) | |
download | android_system_bt-ead3cde4bac0c3e32cd31f149093f004eef8ceeb.tar.gz android_system_bt-ead3cde4bac0c3e32cd31f149093f004eef8ceeb.tar.bz2 android_system_bt-ead3cde4bac0c3e32cd31f149093f004eef8ceeb.zip |
Initial version of BLE support for Bluedroid
Change-Id: I9825a5cef9be2559c34c2a529b211b7d471147cf
Diffstat (limited to 'stack/gatt/gatt_main.c')
-rw-r--r-- | stack/gatt/gatt_main.c | 63 |
1 files changed, 42 insertions, 21 deletions
diff --git a/stack/gatt/gatt_main.c b/stack/gatt/gatt_main.c index 06d87bb24..dcd939840 100644 --- a/stack/gatt/gatt_main.c +++ b/stack/gatt/gatt_main.c @@ -49,7 +49,7 @@ static void gatt_l2cif_config_cfm_cback (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cf static void gatt_l2cif_disconnect_ind_cback (UINT16 l2cap_cid, BOOLEAN ack_needed); static void gatt_l2cif_disconnect_cfm_cback (UINT16 l2cap_cid, UINT16 result); static void gatt_l2cif_data_ind_cback (UINT16 l2cap_cid, BT_HDR *p_msg); -static void gatt_send_conn_cback (BOOLEAN is_bg_conn, tGATT_TCB *p_tcb); +static void gatt_send_conn_cback (tGATT_TCB *p_tcb); static const tL2CAP_APPL_INFO dyn_info = { @@ -145,7 +145,8 @@ BOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb) BTM_ReadDevInfo(rem_bda, &dev_type, &addr_type); - gatt_set_ch_state(p_tcb, GATT_CH_CONN); + if (gatt_get_ch_state(p_tcb) != GATT_CH_OPEN) + gatt_set_ch_state(p_tcb, GATT_CH_CONN); if (dev_type == BT_DEVICE_TYPE_BLE) { @@ -188,8 +189,10 @@ BOOLEAN gatt_disconnect (BD_ADDR rem_bda) if (p_tcb->att_lcid == L2CAP_ATT_CID) { if (ch_state == GATT_CH_OPEN) + { /* only LCB exist between remote device and local */ ret = L2CA_RemoveFixedChnl (L2CAP_ATT_CID, rem_bda); + } else { gatt_set_ch_state(p_tcb, GATT_CH_CLOSING); @@ -315,13 +318,22 @@ BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr) { BOOLEAN ret = FALSE; tGATT_TCB *p_tcb; + UINT8 st; GATT_TRACE_DEBUG0("gatt_act_connect"); if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) != NULL) { ret = TRUE; - if(gatt_get_ch_state(p_tcb) == GATT_CH_CLOSING ) + st = gatt_get_ch_state(p_tcb); + + /* before link down, another app try to open a GATT connection */ + if(st == GATT_CH_OPEN && gatt_num_apps_hold_link(p_tcb) == 0 ) + { + if (!gatt_connect(bd_addr, p_tcb)) + ret = FALSE; + } + else if(st == GATT_CH_CLOSING) { /* need to complete the closing first */ ret = FALSE; @@ -370,8 +382,6 @@ static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 re BOOLEAN check_srv_chg = FALSE; tGATTS_SRV_CHG *p_srv_chg_clt=NULL; - BOOLEAN is_bg_conn = FALSE; - GATT_TRACE_DEBUG3 ("GATT ATT protocol channel with BDA: %08x%04x is %s", (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3], @@ -407,7 +417,7 @@ static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 re gatt_set_ch_state(p_tcb, GATT_CH_OPEN); p_tcb->payload_size = GATT_DEF_BLE_MTU_SIZE; - gatt_send_conn_cback(FALSE, p_tcb); + gatt_send_conn_cback(p_tcb); } else /* there was an exisiting link, ignore the callback */ { @@ -425,11 +435,8 @@ static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 re gatt_set_ch_state(p_tcb, GATT_CH_OPEN); p_tcb->payload_size = GATT_DEF_BLE_MTU_SIZE; - if (L2CA_GetBleConnRole(p_tcb->peer_bda)== HCI_ROLE_MASTER) - { - is_bg_conn = TRUE; - } - gatt_send_conn_cback (is_bg_conn, p_tcb); + + gatt_send_conn_cback (p_tcb); if (check_srv_chg) { gatt_chk_srv_chg (p_srv_chg_clt); @@ -630,12 +637,15 @@ void gatt_l2cif_config_cfm_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) } else { - if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) + if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) && + btm_sec_is_le_capable_dev(p_tcb->peer_bda)) + { gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); + } } /* send callback */ - gatt_send_conn_cback(FALSE, p_tcb); + gatt_send_conn_cback(p_tcb); } } /* else failure */ @@ -692,12 +702,15 @@ void gatt_l2cif_config_ind_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) } else { - if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) + if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) && + btm_sec_is_le_capable_dev(p_tcb->peer_bda)) + { gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); + } } /* send callback */ - gatt_send_conn_cback(FALSE, p_tcb); + gatt_send_conn_cback(p_tcb); } } } @@ -726,8 +739,13 @@ void gatt_l2cif_disconnect_ind_cback(UINT16 lcid, BOOLEAN ack_needed) /* send L2CAP disconnect response */ L2CA_DisconnectRsp(lcid); } - if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) + + if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) && + btm_sec_is_le_capable_dev(p_tcb->peer_bda)) + { gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); + } + /* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */ if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda)) == 0) reason = GATT_CONN_TERMINATE_PEER_USER; @@ -755,8 +773,12 @@ void gatt_l2cif_disconnect_cfm_cback(UINT16 lcid, UINT16 result) /* look up clcb for this channel */ if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL) { - if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda)) + if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) && + btm_sec_is_le_capable_dev(p_tcb->peer_bda)) + { gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda); + } + /* send disconnect callback */ /* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */ if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda)) == 0) @@ -801,15 +823,14 @@ void gatt_l2cif_data_ind_cback(UINT16 lcid, BT_HDR *p_buf) ** Returns void ** *******************************************************************************/ -static void gatt_send_conn_cback(BOOLEAN is_bg_conn, tGATT_TCB *p_tcb) +static void gatt_send_conn_cback(tGATT_TCB *p_tcb) { UINT8 i; tGATT_REG *p_reg; tGATT_BG_CONN_DEV *p_bg_dev=NULL; UINT16 conn_id; - if (is_bg_conn) - p_bg_dev = gatt_find_bg_dev(p_tcb->peer_bda); + p_bg_dev = gatt_find_bg_dev(p_tcb->peer_bda); /* notifying all applications for the connection up event */ for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++) @@ -1015,7 +1036,7 @@ void gatt_init_srv_chg (void) while ((i <= num_clients) && status) { req.client_read_index = i; - if ((status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_CLENT, &req, &rsp))) + if ((status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_CLENT, &req, &rsp)) == TRUE) { memcpy(&srv_chg_clt, &rsp.srv_chg ,sizeof(tGATTS_SRV_CHG)); if (gatt_add_srv_chg_clt(&srv_chg_clt) == NULL) |