}
evt_data.handle = handle;
- cc->p_cback(BTA_JV_L2CAP_CL_INIT_EVT, (tBTA_JV *)&evt_data, cc->user_data);
+ if(cc->p_cback)
+ cc->p_cback(BTA_JV_L2CAP_CL_INIT_EVT, (tBTA_JV *)&evt_data, cc->user_data);
}
p_cb->psm = ls->local_psm;
}
- ls->p_cback(BTA_JV_L2CAP_START_EVT, (tBTA_JV *)&evt_data, ls->user_data);
+ if(ls->p_cback)
+ ls->p_cback(BTA_JV_L2CAP_START_EVT, (tBTA_JV *)&evt_data, ls->user_data);
}
/*******************************************************************************
evt_data.handle = p_cb->handle;
evt_data.status = bta_jv_free_l2c_cb(p_cb);
evt_data.async = FALSE;
- p_cback(BTA_JV_L2CAP_CLOSE_EVT, (tBTA_JV *)&evt_data, user_data);
+ if(p_cback)
+ p_cback(BTA_JV_L2CAP_CLOSE_EVT, (tBTA_JV *)&evt_data, ls->user_data);
break;
}
}
********************************************************************************/
#define ASSERTC(cond, msg, val) if (!(cond)) { LOG_ERROR(LOG_TAG, \
- "### ASSERT : %s line %d %s (%d) ###", __FILE__, __LINE__, msg, val);}
+ "### ASSERT : %s %s line %d %s (%d) ###", __FILE__, __func__, __LINE__, msg, val);}
/* Calculate start of event enumeration; id is top 8 bits of event */
#define BTIF_SIG_START(id) ((id) << 8)
pairing_cb.state = state;
bdcpy(pairing_cb.bd_addr, bd_addr->address);
} else {
- if (!pairing_cb.sdp_attempts)
+ if ((!pairing_cb.sdp_attempts)&&
+ ((bdcmp(bd_addr->address, pairing_cb.bd_addr) == 0) ||
+ (bdcmp(bd_addr->address, pairing_cb.static_bdaddr.address) == 0)))
memset(&pairing_cb, 0, sizeof(pairing_cb));
else
BTIF_TRACE_DEBUG("%s: BR-EDR service discovery active", __func__);
bt_uuid_t uuid;
int i = 0;
int j = 15;
+ int num_properties = 0;
if (p_data->disc_ble_res.service.uu.uuid16 == UUID_SERVCLASS_LE_HID)
{
BTIF_TRACE_DEBUG("%s: Found HOGP UUID",__FUNCTION__);
- bt_property_t prop;
+ bt_property_t prop[2];
bt_bdaddr_t bd_addr;
char temp[256];
bt_status_t ret;
LOG_INFO(LOG_TAG, "%s uuid:%s", __func__, temp);
bdcpy(bd_addr.address, p_data->disc_ble_res.bd_addr);
- prop.type = BT_PROPERTY_UUIDS;
- prop.val = uuid.uu;
- prop.len = MAX_UUID_SIZE;
+ prop[0].type = BT_PROPERTY_UUIDS;
+ prop[0].val = uuid.uu;
+ prop[0].len = MAX_UUID_SIZE;
/* Also write this to the NVRAM */
- ret = btif_storage_set_remote_device_property(&bd_addr, &prop);
+ ret = btif_storage_set_remote_device_property(&bd_addr, &prop[0]);
ASSERTC(ret == BT_STATUS_SUCCESS, "storing remote services failed", ret);
+ num_properties++;
+
+ /* Remote name update */
+ if (strnlen((const char *) p_data->disc_ble_res.bd_name, BD_NAME_LEN))
+ {
+ prop[1].type = BT_PROPERTY_BDNAME;
+ prop[1].val = p_data->disc_ble_res.bd_name;
+ prop[1].len = strnlen((char *)p_data->disc_ble_res.bd_name, BD_NAME_LEN);
+
+ ret = btif_storage_set_remote_device_property(&bd_addr, &prop[1]);
+ ASSERTC(ret == BT_STATUS_SUCCESS, "failed to save remote device property", ret);
+ num_properties++;
+ }
/* Send the event to the BTIF */
HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
- BT_STATUS_SUCCESS, &bd_addr, 1, &prop);
+ BT_STATUS_SUCCESS, &bd_addr, num_properties, prop);
}
break;
else
{
// Only call if we are non server connections
- if (sock->handle && (sock->server == FALSE)) {
+ if ((sock->handle >= 0) && (sock->server == FALSE)) {
if (sock->fixed_chan)
BTA_JvL2capCloseLE(sock->handle);
else
BTA_JvFreeChannel(sock->channel, BTA_JV_CONN_TYPE_L2CAP_LE);
else
BTA_JvFreeChannel(sock->channel, BTA_JV_CONN_TYPE_L2CAP);
+
+ if (!sock->fixed_chan) {
+ APPL_TRACE_DEBUG("%s stopping L2CAP server channel %d", __func__, sock->channel);
+ BTA_JvL2capStopServer(sock->channel, UINT_TO_PTR(sock->id));
+ }
}
}
{
return(BTM_NO_RESOURCES);
}
-
+ if (!controller_get_interface()->get_is_ready())
+ {
+ BTM_TRACE_ERROR ("%s controller module is not ready", __func__);
+ return(BTM_NO_RESOURCES);
+ }
BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
/* Finished if connection is active and already paired */
if (p_lcb && (p_lcb->link_state == LST_CONNECTED || p_lcb->link_state == LST_CONNECTING))
{
BTM_TRACE_WARNING("%s Connection already exists", __func__);
+ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ);
return BTM_CMD_STARTED;
}
*******************************************************************************/
void l2c_csm_execute (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
{
+ if (!l2cu_is_ccb_active(p_ccb)) {
+ L2CAP_TRACE_WARNING("%s This ccb is not in use, the event(%d) can't be processed", __func__, event);
+ return;
+ }
+
switch (p_ccb->chnl_state)
{
case CST_CLOSED:
{
tL2C_CONN_INFO *p_ci = (tL2C_CONN_INFO *)p_data;
tL2CA_DISCONNECT_IND_CB *disconnect_ind = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
+ tL2CA_DISCONNECT_CFM_CB *disconnect_cfm = p_ccb->p_rcb->api.pL2CA_DisconnectCfm_Cb;
tL2CA_CONNECT_CFM_CB *connect_cfm = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
UINT16 local_cid = p_ccb->local_cid;
btu_general_alarm_queue);
}
else
+ {
l2cu_release_ccb (p_ccb);
+ if(disconnect_cfm)
+ {
+ L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
+ (*disconnect_cfm)(local_cid, L2CAP_CONN_NO_LINK);
+ }
+ }
break;
case L2CEVT_L2CA_DATA_WRITE: /* Upper layer data to send */
extern BOOLEAN l2cu_initialize_fixed_ccb (tL2C_LCB *p_lcb, UINT16 fixed_cid, tL2CAP_FCR_OPTS *p_fcr);
extern void l2cu_no_dynamic_ccbs (tL2C_LCB *p_lcb);
extern void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb);
+extern BOOLEAN l2cu_is_ccb_active (tL2C_CCB *p_ccb);
/* Functions provided by l2c_ucd.c
************************************
}
}
+/*******************************************************************************
+**
+** Function l2cu_is_ccb_active
+**
+** Description Check if Channel Control Block is in use or released
+**
+** Returns BOOLEAN - TRUE if Channel Control Block is in use
+** FALSE if p_ccb is null or is released.
+**
+*******************************************************************************/
+BOOLEAN l2cu_is_ccb_active (tL2C_CCB *p_ccb)
+{
+ return (p_ccb && p_ccb->in_use);
+}