diff options
Diffstat (limited to 'stack/gap/gap_ble.c')
-rw-r--r-- | stack/gap/gap_ble.c | 251 |
1 files changed, 54 insertions, 197 deletions
diff --git a/stack/gap/gap_ble.c b/stack/gap/gap_ble.c index d44577dc0..d67bf5a8a 100644 --- a/stack/gap/gap_ble.c +++ b/stack/gap/gap_ble.c @@ -57,7 +57,8 @@ static void gap_ble_s_attr_request_cback (UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE op_code, tGATTS_DATA *p_data); /* client connection callback */ -static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason); +static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, + tGATT_DISCONN_REASON reason, tGATT_TRANSPORT transport); static void gap_ble_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data); static tGATT_CBACK gap_cback = @@ -213,65 +214,6 @@ UINT16 gap_get_conn_id_if_connected (BD_ADDR bd_addr) return(GATT_INVALID_CONN_ID); } -/******************************************************************************* -** -** Function gap_ble_enqueue_op -** -** Description enqueue a GAP operation when GAP client is busy -** -** Returns void -** -*******************************************************************************/ -void gap_ble_enqueue_op( tGAP_CLCB * p_clcb, UINT8 op, BD_ADDR reconn_addr, UINT8 privacy_flag, void *p_cback) -{ - tGAP_BLE_PENDING_OP *p_op = (tGAP_BLE_PENDING_OP *)GKI_getbuf(sizeof(tGAP_BLE_PENDING_OP)); - - if (p_op != NULL) - { - p_op->op = op; - p_op->p_pending_cback = p_cback; - - if (op == GATT_SET_GAP_PRIVACY_FLAG) - p_op->pending_data.privacy_flag = privacy_flag; - else if (op == GATT_UPDATE_RECONN_ADDR) - memcpy(p_op->pending_data.reconn_addr, reconn_addr, BD_ADDR_LEN); - - GKI_enqueue(&p_clcb->pending_op_q, p_op); - } -} - -/******************************************************************************* -** -** Function gap_ble_process_pending_op -** -** Description get next pending operation and process it -** -** Returns void -** -*******************************************************************************/ -static BOOLEAN gap_ble_process_pending_op(tGAP_CLCB *p_clcb) -{ - tGAP_BLE_PENDING_OP *p_pending_op = (tGAP_BLE_PENDING_OP *)GKI_dequeue(&p_clcb->pending_op_q); - BOOLEAN started = FALSE; - - if (p_pending_op != NULL) - { - if (p_pending_op->op == GATT_UPDATE_RECONN_ADDR) - { - GAP_BleUpdateReconnectAddr( p_clcb->bda, - p_pending_op->pending_data.reconn_addr, - (tGAP_BLE_RECONN_ADDR_CBACK *)p_pending_op->p_pending_cback); - started = TRUE; - } - GKI_freebuf(p_pending_op); - } - else - { - GAP_TRACE_EVENT0("No pending operation"); - } - - return started; -} /******************************************************************************* ** GAP Attributes Database Request callback @@ -316,16 +258,6 @@ tGATT_STATUS gap_read_attr_value (UINT16 handle, tGATT_VALUE *p_value, BOOLEAN i p_value->len = 2; break; - case GATT_UUID_GAP_PRIVACY_FLAG: - UINT8_TO_STREAM(p, p_db_attr->attr_value.privacy); - p_value->len = 1; - break; - - case GATT_UUID_GAP_RECONN_ADDR: - p_value->len = BD_ADDR_LEN; - BDADDR_TO_STREAM(p, p_db_attr->attr_value.reconn_bda); - break; - case GATT_UUID_GAP_PREF_CONN_PARAM: UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_min); /* int_min */ UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_max); /* int_max */ @@ -357,18 +289,6 @@ tGATT_STATUS gap_proc_read (tGATTS_REQ_TYPE type, tGATT_READ_REQ *p_data, tGATTS return status; } -BOOLEAN gap_read_local_reconn_addr(BD_ADDR_PTR reconn_bda) -{ - BD_ADDR dummy_bda = {0}; - - if (memcmp(gap_cb.reconn_bda, dummy_bda, BD_ADDR_LEN) != 0) - { - memcpy(reconn_bda, gap_cb.reconn_bda, BD_ADDR_LEN); - return TRUE; - } - else - return FALSE; -} /****************************************************************************** ** @@ -389,26 +309,7 @@ UINT8 gap_proc_write_req( tGATTS_REQ_TYPE type, tGATT_WRITE_REQ *p_data) { if (p_data-> handle == p_db_attr->handle) { - if (p_data->offset != 0) return GATT_NOT_LONG; - if (p_data->is_prep) return GATT_REQ_NOT_SUPPORTED; - -/* DO NOT SUPPORT RECONNECTION ADDRESS FOR NOW - - if (p_db_attr->uuid == GATT_UUID_GAP_RECONN_ADDR) - { - if (!btm_cb.ble_ctr_cb.privacy) - return GATT_WRITE_NOT_PERMIT; - if (p_data->len != BD_ADDR_LEN) return GATT_INVALID_ATTR_LEN; - - STREAM_TO_BDADDR(p_db_attr->attr_value.reconn_bda, p); - // write direct connection address - memcpy(&gap_cb.reconn_bda, p_db_attr->attr_value.reconn_bda, BD_ADDR_LEN); - - return GATT_SUCCESS; - } - else -*/ - return GATT_WRITE_NOT_PERMIT; + return GATT_WRITE_NOT_PERMIT; } } return GATT_NOT_FOUND; @@ -513,6 +414,21 @@ void gap_attr_db_init(void) GATT_CHAR_PROP_BIT_READ); p_db_attr ++; +#if BTM_PERIPHERAL_ENABLED == TRUE /* Only needed for peripheral testing */ + /* add preferred connection parameter characteristic + */ + uuid.uu.uuid16 = p_db_attr->uuid = GATT_UUID_GAP_PREF_CONN_PARAM; + p_db_attr->attr_value.conn_param.int_max = GAP_PREFER_CONN_INT_MAX; /* 6 */ + p_db_attr->attr_value.conn_param.int_min = GAP_PREFER_CONN_INT_MIN; /* 0 */ + p_db_attr->attr_value.conn_param.latency = GAP_PREFER_CONN_LATENCY; /* 0 */ + p_db_attr->attr_value.conn_param.sp_tout = GAP_PREFER_CONN_SP_TOUT; /* 2000 */ + p_db_attr->handle = GATTS_AddCharacteristic(service_handle, + &uuid, + GATT_PERM_READ, + GATT_CHAR_PROP_BIT_READ); + p_db_attr ++; +#endif + /* start service now */ memset (&app_uuid.uu.uuid128, 0x81, LEN_UUID_128); @@ -596,8 +512,6 @@ void gap_ble_cl_op_cmpl(tGAP_CLCB *p_clcb, BOOLEAN status, UINT16 len, UINT8 *p_ (* p_dev_name_cback)(status, p_clcb->bda, len, (char *)p_name); } - if (!gap_ble_process_pending_op(p_clcb) && - p_clcb->cl_op_uuid == 0) GATT_Disconnect(p_clcb->conn_id); } @@ -612,11 +526,14 @@ void gap_ble_cl_op_cmpl(tGAP_CLCB *p_clcb, BOOLEAN status, UINT16 len, UINT8 *p_ ** *******************************************************************************/ static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, - BOOLEAN connected, tGATT_DISCONN_REASON reason) + BOOLEAN connected, tGATT_DISCONN_REASON reason, + tGATT_TRANSPORT transport) { tGAP_CLCB *p_clcb = gap_find_clcb_by_bd_addr (bda); UINT16 cl_op_uuid; + UNUSED(gatt_if); + UNUSED(transport); GAP_TRACE_EVENT5 ("gap_ble_c_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x", (bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3], @@ -636,9 +553,6 @@ static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_ p_clcb->conn_id = conn_id; p_clcb->connected = TRUE; - /* Do not use reconnection address for now --> - check privacy enabled? set reconnect address - btm_ble_update_reconnect_address(bda);*/ } else { @@ -659,6 +573,10 @@ static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_ { GAP_BleReadPeerDevName (bda, (tGAP_BLE_DEV_NAME_CBACK *)p_clcb->p_cback); } + else if (cl_op_uuid == GATT_UUID_GAP_PREF_CONN_PARAM) + { + GAP_BleReadPeerPrefConnParams(bda); + } } /* current link disconnect */ else @@ -695,7 +613,7 @@ static void gap_ble_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS GAP_TRACE_EVENT3 ("gap_ble_c_cmpl_cback() - op_code: 0x%02x status: 0x%02x read_type: 0x%04x", op, status, op_type); /* Currently we only issue read commands */ - if (op != GATTC_OPTYPE_READ && op != GATTC_OPTYPE_WRITE) + if (op != GATTC_OPTYPE_READ) return; if (status != GATT_SUCCESS) @@ -731,7 +649,6 @@ static void gap_ble_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS break; case GATT_UUID_GAP_ICON: break; - } } @@ -806,18 +723,20 @@ BOOLEAN GAP_BleReadPeerPrefConnParams (BD_ADDR peer_bda) return(FALSE); /* hold the link here */ - GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE); - - if (p_clcb->connected) + if (GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE, BT_TRANSPORT_LE)) { - return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_PREF_CONN_PARAM, NULL); - } - /* Mark currently active operation */ - p_clcb->cl_op_uuid = GATT_UUID_GAP_PREF_CONN_PARAM; - - return(TRUE); + if (p_clcb->connected) + { + return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_PREF_CONN_PARAM, NULL); + } + /* Mark currently active operation */ + p_clcb->cl_op_uuid = GATT_UUID_GAP_PREF_CONN_PARAM; + return(TRUE); + } + else + return FALSE; } /******************************************************************************* @@ -839,10 +758,10 @@ BOOLEAN GAP_BleReadPeerDevName (BD_ADDR peer_bda, tGAP_BLE_DEV_NAME_CBACK *p_cba if ((p_clcb = gap_find_clcb_by_bd_addr (peer_bda)) == NULL) { if ((p_clcb = gap_clcb_alloc(0, peer_bda)) == NULL) - { - GAP_TRACE_ERROR0("GAP_BleReadPeerDevName max connection reached"); + { + GAP_TRACE_ERROR0("GAP_BleReadPeerDevName max connection reached"); return FALSE; - } + } p_clcb->connected = FALSE; } @@ -855,21 +774,26 @@ BOOLEAN GAP_BleReadPeerDevName (BD_ADDR peer_bda, tGAP_BLE_DEV_NAME_CBACK *p_cba return(FALSE); /* hold the link here */ - GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE); - if (p_clcb->connected) + if (GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE, BT_TRANSPORT_LE)) { - return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_DEVICE_NAME, (void *)p_cback); - } + if (p_clcb->connected) + { + return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_DEVICE_NAME, (void *)p_cback); + } - p_clcb->p_cback = (void *)p_cback; - /* Mark currently active operation */ - p_clcb->cl_op_uuid = GATT_UUID_GAP_DEVICE_NAME; + p_clcb->p_cback = (void *)p_cback; + /* Mark currently active operation */ + p_clcb->cl_op_uuid = GATT_UUID_GAP_DEVICE_NAME; - return(TRUE); + return(TRUE); + } + else + return FALSE; } + /******************************************************************************* ** ** Function GAP_BleCancelReadPeerDevName @@ -907,73 +831,6 @@ BOOLEAN GAP_BleCancelReadPeerDevName (BD_ADDR peer_bda) return(TRUE); } -/******************************************************************************* -** -** Function GAP_BleUpdateReconnectAddr -** -** Description Start a process to udpate the reconnect address if remote devive -** has privacy enabled. -** -** Returns TRUE if read started, else FALSE if GAP is busy -** -*******************************************************************************/ -BOOLEAN GAP_BleUpdateReconnectAddr (BD_ADDR peer_bda, BD_ADDR reconn_addr, - tGAP_BLE_RECONN_ADDR_CBACK *p_cback) -{ - tGAP_CLCB *p_clcb; - tGATT_DISC_PARAM param; - - if (p_cback == NULL) - return(FALSE); - - /* This function should only be called if there is a connection to */ - /* the peer. Get a client handle for that connection. */ - if ((p_clcb = gap_find_clcb_by_bd_addr (peer_bda)) == NULL || - !p_clcb->connected) - { - GAP_TRACE_ERROR0("No connection, can not update reconnect address"); - return(FALSE); - } - - GAP_TRACE_API3 ("GAP_BleUpdateReconnectAddr() - BDA: %08x%04x cl_op_uuid: 0x%04x", - (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3], - (peer_bda[4]<<8)+peer_bda[5], p_clcb->cl_op_uuid); - - /* For now we only handle one at a time */ - if (p_clcb->cl_op_uuid != 0) - { - gap_ble_enqueue_op(p_clcb, GATT_UPDATE_RECONN_ADDR, reconn_addr, 0, (void *)p_cback); - return(FALSE); - } - - /* hold the link here */ - GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE); - - memset(¶m, 0, sizeof(tGATT_DISC_PARAM)); - - param.service.len = LEN_UUID_16; - param.service.uu.uuid16 = GATT_UUID_GAP_RECONN_ADDR; - param.s_handle = 1; - param.e_handle = 0xFFFF; - - if (GATTC_Discover(p_clcb->conn_id, GATT_DISC_CHAR, ¶m) != GATT_SUCCESS) - { - GAP_TRACE_ERROR0 ("GAP_BleReadPeerPrefConnParams: GATT_Read Failed"); - /* release the link here */ - GATT_Disconnect(p_clcb->conn_id); - return(FALSE); - } - else - { - p_clcb->p_cback = (void *)p_cback; - memcpy(p_clcb->reconn_addr, reconn_addr, BD_ADDR_LEN); - p_clcb->cl_op_uuid = GATT_UUID_GAP_RECONN_ADDR; - } - - return TRUE; - -} - #endif /* BLE_INCLUDED */ |