/******************************************************************************* ** ** Function bta_ag_colli_timer_cback ** ** Description AG connection collision timer callback ** ** ** Returns void ** *******************************************************************************/ static void bta_ag_colli_timer_cback (TIMER_LIST_ENT *p_tle) { tBTA_AG_SCB *p_scb; APPL_TRACE_DEBUG ("bta_ag_colli_timer_cback"); if (p_tle) { p_scb = (tBTA_AG_SCB *)p_tle->param; if (p_scb) { p_scb->colli_tmr_on = FALSE; /* If the peer haven't opened AG connection */ /* we will restart opening process. */ bta_ag_resume_open (p_scb); } } }
/******************************************************************************* ** ** Function bta_ag_rfc_acp_open ** ** Description Handle RFCOMM channel open when accepting connection. ** ** ** Returns void ** *******************************************************************************/ void bta_ag_rfc_acp_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) { UINT16 lcid; int i; tBTA_AG_SCB *ag_scb, *other_scb; BD_ADDR dev_addr; int status; /* set role */ p_scb->role = BTA_AG_ACP; APPL_TRACE_IMP ("bta_ag_rfc_acp_open: serv_handle0 = %d serv_handle1 = %d", p_scb->serv_handle[0], p_scb->serv_handle[1]); /* get bd addr of peer */ if (PORT_SUCCESS != (status=PORT_CheckConnection(p_data->rfc.port_handle, dev_addr, &lcid))) { APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open error PORT_CheckConnection returned status %d", status); } /* Collision Handling */ for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++) { if ((ag_scb->in_use) && (ag_scb->colli_tmr_on)) { /* stop collision timer */ ag_scb->colli_tmr_on = FALSE; bta_sys_stop_timer (&ag_scb->colli_timer); if (bdcmp (dev_addr, ag_scb->peer_addr) == 0) { /* If incoming and outgoing device are same, nothing more to do. */ /* Outgoing conn will be aborted because we have successful incoming conn. */ } else { /* Resume outgoing connection. */ other_scb = bta_ag_get_other_idle_scb (p_scb); if (other_scb) { bdcpy(other_scb->peer_addr, ag_scb->peer_addr); other_scb->open_services = ag_scb->open_services; other_scb->cli_sec_mask = ag_scb->cli_sec_mask; bta_ag_resume_open (other_scb); } } break; } } bdcpy (p_scb->peer_addr, dev_addr); /* determine connected service from port handle */ for (i = 0; i < BTA_AG_NUM_IDX; i++) { APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open: i = %d serv_handle = %d port_handle = %d", i, p_scb->serv_handle[i], p_data->rfc.port_handle); if (p_scb->serv_handle[i] == p_data->rfc.port_handle) { p_scb->conn_service = i; p_scb->conn_handle = p_data->rfc.port_handle; break; } } APPL_TRACE_IMP ("bta_ag_rfc_acp_open: conn_service = %d conn_handle = %d", p_scb->conn_service, p_scb->conn_handle); /* close any unopened server */ bta_ag_close_servers(p_scb, (p_scb->reg_services & ~bta_ag_svc_mask[p_scb->conn_service])); /* do service discovery to get features */ bta_ag_do_disc(p_scb, bta_ag_svc_mask[p_scb->conn_service]); /* continue with common open processing */ bta_ag_rfc_open(p_scb, p_data); }