summaryrefslogtreecommitdiffstats
path: root/stack/gatt/gatt_main.c
diff options
context:
space:
mode:
authorGanesh Ganapathi Batta <ganeshg@broadcom.com>2013-02-05 15:22:31 -0800
committerMatthew Xie <mattx@google.com>2013-02-27 18:15:49 -0800
commitead3cde4bac0c3e32cd31f149093f004eef8ceeb (patch)
treef45b52e375e1a80e807dbbc864bb1da603965b0d /stack/gatt/gatt_main.c
parente17bf003d4eefdc8525e55894210e9ee494972b8 (diff)
downloadandroid_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.c63
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)