15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2002-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this file contains the connection interface functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hiddefs.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hidh_api.h" 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hidh_int.h" 445cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray#include "osi/include/osi.h" 47bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray 4878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 4978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue; 5078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 find_conn_by_cid (UINT16 cid); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_conn_retry (UINT8 dhandle); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L O C A L F U N C T I O N P R O T O T Y P E S */ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 psm, UINT8 l2cap_id); 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_connect_cfm (UINT16 l2cap_cid, UINT16 result); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg); 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_disconnect_cfm (UINT16 l2cap_cid, UINT16 result); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_cong_ind (UINT16 l2cap_cid, BOOLEAN congested); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tL2CAP_APPL_INFO hst_reg_info = 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_l2cif_connect_ind, 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_l2cif_connect_cfm, 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_l2cif_config_ind, 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_l2cif_config_cfm, 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_l2cif_disconnect_ind, 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_l2cif_disconnect_cfm, 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_l2cif_data_ind, 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_l2cif_cong_ind, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL /* tL2CA_TX_COMPLETE_CB */ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_reg 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initializes the SDP unit. 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS hidh_conn_reg (void) 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int xx; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize the L2CAP configuration. We only care about MTU and flush */ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&hh_cb.l2cap_cfg, 0, sizeof(tL2CAP_CFG_INFO)); 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.l2cap_cfg.mtu_present = TRUE; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.l2cap_cfg.mtu = HID_HOST_MTU; 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.l2cap_cfg.flush_to_present = TRUE; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.l2cap_cfg.flush_to = HID_HOST_FLUSH_TO; 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, register with L2CAP */ 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!L2CA_Register (HID_PSM_CONTROL, (tL2CAP_APPL_INFO *) &hst_reg_info)) 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 106d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_ERROR ("HID-Host Control Registration failed"); 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (HID_ERR_L2CAP_FAILED) ; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!L2CA_Register (HID_PSM_INTERRUPT, (tL2CAP_APPL_INFO *) &hst_reg_info)) 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Deregister( HID_PSM_CONTROL ) ; 112d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_ERROR ("HID-Host Interrupt Registration failed"); 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (HID_ERR_L2CAP_FAILED) ; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < HID_HOST_MAX_DEVICES; xx++) 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.devices[xx].in_use = FALSE ; 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.devices[xx].conn.conn_state = HID_CONN_STATE_UNUSED; 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (HID_SUCCESS); 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_conn_disconnect 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function disconnects a connection. 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if disconnect started, FALSE if already disconnected 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS hidh_conn_disconnect (UINT8 dhandle) 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = &hh_cb.devices[dhandle].conn; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 138d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host disconnect"); 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_hcon->ctrl_cid != 0) || (p_hcon->intr_cid != 0)) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING; 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1441747956ba052b1538c29fe7793403dc4f13ba525Hemant Gupta /* Set l2cap idle timeout to 0 (so ACL link is disconnected 1451747956ba052b1538c29fe7793403dc4f13ba525Hemant Gupta * immediately after last channel is closed) */ 146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji L2CA_SetIdleTimeoutByBdAddr(hh_cb.devices[dhandle].addr, 0, BT_TRANSPORT_BR_EDR); 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Disconnect both interrupt and control channels */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon->intr_cid) 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_hcon->intr_cid); 150bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta else if (p_hcon->ctrl_cid) 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_hcon->ctrl_cid); 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_UNUSED; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (HID_SUCCESS); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_sec_check_complete_term 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description HID security check complete callback function. 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Send L2CA_ConnectRsp OK if secutiry check succeed; otherwise 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** send security block L2C connection response. 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1718fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid hidh_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_HOST_DEV_CTB *p_dev= (tHID_HOST_DEV_CTB *) p_ref_data; 1745cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(bd_addr); 1758fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UNUSED (transport); 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( res == BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY ) 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.disc_reason = HID_SUCCESS; /* Authentication passed. Reset disc_reason (from HID_ERR_AUTH_FAILED) */ 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.conn_state = HID_CONN_STATE_CONNECTING_INTR; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send response to the L2CAP layer. */ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (p_dev->addr, p_dev->conn.ctrl_id, p_dev->conn.ctrl_cid, L2CAP_CONN_OK, L2CAP_CONN_OK); 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send a Configuration Request. */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq (p_dev->conn.ctrl_cid, &hh_cb.l2cap_cfg); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* security check fail */ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (res != BTM_SUCCESS) 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.disc_reason = HID_ERR_AUTH_FAILED; /* Save reason for disconnecting */ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.conn_state = HID_CONN_STATE_UNUSED; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (p_dev->addr, p_dev->conn.ctrl_id, p_dev->conn.ctrl_cid, L2CAP_CONN_SECURITY_BLOCK, L2CAP_CONN_OK); 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_connect_ind 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles an inbound connection indication 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from L2CAP. This is the case where we are acting as a 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server. 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN bAccept = TRUE; 2142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 i = HID_HOST_MAX_DEVICES; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_HOST_DEV_CTB *p_dev; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 217d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP conn ind, PSM: 0x%04x CID 0x%x", psm, l2cap_cid); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach /* always add incoming connection device into HID database by default */ 2202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach if (HID_HostAddDev(bd_addr, HID_SEC_REQUIRED, &i) != HID_SUCCESS) 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_SECURITY_BLOCK, 0); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon = &hh_cb.devices[i].conn; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = &hh_cb.devices[i]; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check we are in the correct state for this */ 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (psm == HID_PSM_INTERRUPT) 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon->ctrl_cid == 0) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 234d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd INTR L2CAP conn ind, but no CTL channel"); 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bAccept = FALSE; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR) 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 239d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd INTR L2CAP conn ind, wrong state: %d", 2402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_hcon->conn_state); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bAccept = FALSE; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* CTRL channel */ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(HID_HOST_ACPT_NEW_CONN) && (HID_HOST_ACPT_NEW_CONN == TRUE) 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->ctrl_cid = p_hcon->intr_cid = 0; 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_UNUSED; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon->conn_state != HID_CONN_STATE_UNUSED) 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 252d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host - Rcvd CTL L2CAP conn ind, wrong state: %d", 2532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach p_hcon->conn_state); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bAccept = FALSE; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bAccept) 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_NO_RESOURCES, 0); 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (psm == HID_PSM_CONTROL) 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_flags = 0; 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->ctrl_cid = l2cap_cid; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->ctrl_id = l2cap_id; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->disc_reason = HID_L2CAP_CONN_FAIL; /* In case disconnection occurs before security is completed, then set CLOSE_EVT reason code to 'connection failure' */ 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_SECURITY; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(btm_sec_mx_access_request (p_dev->addr, HID_PSM_CONTROL, 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FALSE, BTM_SEC_PROTO_HID, 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev->attr_mask & HID_SEC_REQUIRED) ? HID_SEC_CHN : HID_NOSEC_CHN, 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &hidh_sec_check_complete_term, p_dev) == BTM_CMD_STARTED) 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_PENDING, L2CAP_CONN_OK); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Transition to the next appropriate state, configuration */ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_CONFIG; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->intr_cid = l2cap_cid; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send response to the L2CAP layer. */ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send a Configuration Request. */ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 294d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP conn ind, sent config req, PSM: 0x%04x CID 0x%x", 2952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach psm, l2cap_cid); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid hidh_process_repage_timer_timeout(void *data) 29978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov{ 30078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov uint8_t dhandle = PTR_TO_UINT(data); 30178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov hidh_try_repage(dhandle); 30278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 30378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Function hidh_try_repage 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Description This function processes timeout (to page device). 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 31378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid hidh_try_repage(UINT8 dhandle) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 315bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray tHID_HOST_DEV_CTB *device; 316bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray 317bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray hidh_conn_initiate(dhandle); 318bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray 319bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray device = &hh_cb.devices[dhandle]; 320bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray device->conn_tries++; 321bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray 322bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray hh_cb.callback(dhandle, device->addr, HID_HDEV_EVT_RETRYING, 323bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray device->conn_tries, NULL ) ; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_sec_check_complete_orig 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function checks to see if security procedures are being 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** carried out or not.. 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3368fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid hidh_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res) 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_HOST_DEV_CTB *p_dev = (tHID_HOST_DEV_CTB *) p_ref_data; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dhandle; 3405cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(bd_addr); 3418fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta UNUSED (transport); 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 343bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray // TODO(armansito): This kind of math to determine a device handle is way 344bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray // too dirty and unnecessary. Why can't |p_dev| store it's handle? 345bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray dhandle = (PTR_TO_UINT(p_dev) - PTR_TO_UINT(&(hh_cb.devices[0])))/ sizeof(tHID_HOST_DEV_CTB); 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( res == BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY ) 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 348d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Originator security pass."); 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.disc_reason = HID_SUCCESS; /* Authentication passed. Reset disc_reason (from HID_ERR_AUTH_FAILED) */ 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3517f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta /* Transition to the next appropriate state, configuration */ 3527f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta p_dev->conn.conn_state = HID_CONN_STATE_CONFIG; 3537f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta L2CA_ConfigReq (p_dev->conn.ctrl_cid, &hh_cb.l2cap_cfg); 354d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Got Control conn cnf, sent cfg req, CID: 0x%x", p_dev->conn.ctrl_cid); 3557f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( res != BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY ) 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (HID_HOST_MAX_CONN_RETRY > 0) 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( res == BTM_DEVICE_TIMEOUT ) 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( p_dev->conn_tries <= HID_HOST_MAX_CONN_RETRY ) 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_conn_retry (dhandle); 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.disc_reason = HID_ERR_AUTH_FAILED; /* Save reason for disconnecting */ 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_conn_disconnect(dhandle); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_connect_cfm 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles the connect confirm events 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from L2CAP. This is the case when we are acting as a 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** client and have sent a connect request. 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_connect_cfm (UINT16 l2cap_cid, UINT16 result) 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dhandle; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = NULL; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 reason; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_HOST_DEV_CTB *p_dev = NULL; 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID, and verify we are in a state to accept this message */ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES ) 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = &hh_cb.devices[dhandle]; 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon = &hh_cb.devices[dhandle].conn; 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_hcon == NULL) 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!(p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG)) 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((l2cap_cid == p_hcon->ctrl_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_CTRL)) 404742d9fa575cd1ea12c7d4413f1bec62863b07cabHemant Gupta || ((l2cap_cid == p_hcon->intr_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR) 405742d9fa575cd1ea12c7d4413f1bec62863b07cabHemant Gupta && (p_hcon->conn_state != HID_CONN_STATE_DISCONNECTING))) 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 407d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd unexpected conn cnf, CID 0x%x ", l2cap_cid); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != L2CAP_CONN_OK) 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2cap_cid == p_hcon->ctrl_cid) 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->ctrl_cid = 0; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->intr_cid = 0; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_conn_disconnect(dhandle); 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (HID_HOST_MAX_CONN_RETRY > 0) 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (hh_cb.devices[dhandle].conn_tries <= HID_HOST_MAX_CONN_RETRY) && 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (result == HCI_ERR_CONNECTION_TOUT || result == HCI_ERR_UNSPECIFIED || 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result == HCI_ERR_PAGE_TIMEOUT) ) 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_conn_retry(dhandle); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = HID_L2CAP_CONN_FAIL | (UINT32) result ; 4312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ; 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* receive Control Channel connect confirmation */ 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2cap_cid == p_hcon->ctrl_cid) 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check security requirement */ 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_SECURITY; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->disc_reason = HID_L2CAP_CONN_FAIL; /* In case disconnection occurs before security is completed, then set CLOSE_EVT reason code to "connection failure" */ 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_mx_access_request (p_dev->addr, HID_PSM_CONTROL, 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TRUE, BTM_SEC_PROTO_HID, 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev->attr_mask & HID_SEC_REQUIRED) ? HID_SEC_CHN : HID_NOSEC_CHN, 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &hidh_sec_check_complete_orig, p_dev); 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_CONFIG; 4507f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta /* Send a Configuration Request. */ 4517f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg); 452d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host got Interrupt conn cnf, sent cfg req, CID: 0x%x", l2cap_cid); 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_config_ind 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes the L2CAP configuration indication 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dhandle; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = NULL; 4727f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta UINT32 reason; 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES ) 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon = &hh_cb.devices[dhandle].conn; 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon == NULL) 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 482d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid); 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 486d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid); 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remember the remote MTU size */ 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!p_cfg->mtu_present) || (p_cfg->mtu > HID_HOST_MTU)) 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->rem_mtu_size = HID_HOST_MTU; 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->rem_mtu_size = p_cfg->mtu; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For now, always accept configuration from the other side */ 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->flush_to_present = FALSE; 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->mtu_present = FALSE; 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->result = L2CAP_CFG_OK; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigRsp (l2cap_cid, p_cfg); 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2cap_cid == p_hcon->ctrl_cid) 5027f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta { 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_flags |= HID_CONN_FLAGS_HIS_CTRL_CFG_DONE; 5047f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta if ((p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG) && 5057f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta (p_hcon->conn_flags & HID_CONN_FLAGS_MY_CTRL_CFG_DONE)) 5067f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta { 5077f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta /* Connect interrupt channel */ 5087f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta p_hcon->disc_reason = HID_L2CAP_CONN_FAIL; /* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */ 5097f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta if ((p_hcon->intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0) 5107f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta { 511d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host INTR Originate failed"); 5127f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta reason = HID_L2CAP_REQ_FAIL ; 5137f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta p_hcon->conn_state = HID_CONN_STATE_UNUSED; 5147f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta hidh_conn_disconnect (dhandle); 5157f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ; 5167f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta return; 5177f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta } 5187f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta else 5197f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta { 5207f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta /* Transition to the next appropriate state, waiting for connection confirm on interrupt channel. */ 5217f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta p_hcon->conn_state = HID_CONN_STATE_CONNECTING_INTR; 5227f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta } 5237f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta } 5247f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta } 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_flags |= HID_CONN_FLAGS_HIS_INTR_CFG_DONE; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If all configuration is complete, change state and tell management we are up */ 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_hcon->conn_flags & HID_CONN_FLAGS_ALL_CONFIGURED) == HID_CONN_FLAGS_ALL_CONFIGURED) 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_hcon->conn_state == HID_CONN_STATE_CONFIG)) 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_CONNECTED; 5338f322bfe42a57902e7c45713a5c6215dfbe2494aHemant Gupta /* Reset disconnect reason to success, as connection successful */ 5348f322bfe42a57902e7c45713a5c6215dfbe2494aHemant Gupta p_hcon->disc_reason = HID_SUCCESS; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.devices[dhandle].state = HID_DEV_CONNECTED; 5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_OPEN, 0, NULL ) ; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_config_cfm 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes the L2CAP configuration confirmation 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dhandle; 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = NULL; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 reason; 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 558d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, p_cfg->result); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES ) 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon = &hh_cb.devices[dhandle].conn; 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon == NULL) 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 566d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid); 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If configuration failed, disconnect the channel(s) */ 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cfg->result != L2CAP_CFG_OK) 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_conn_disconnect (dhandle); 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = HID_L2CAP_CFG_FAIL | (UINT32) p_cfg->result ; 5752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ; 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2cap_cid == p_hcon->ctrl_cid) 5807f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta { 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_flags |= HID_CONN_FLAGS_MY_CTRL_CFG_DONE; 5827f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta if ((p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG) && 5837f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta (p_hcon->conn_flags & HID_CONN_FLAGS_HIS_CTRL_CFG_DONE)) 5847f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta { 5857f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta /* Connect interrupt channel */ 5867f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta p_hcon->disc_reason = HID_L2CAP_CONN_FAIL; /* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */ 5877f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta if ((p_hcon->intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0) 5887f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta { 589d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host INTR Originate failed"); 5907f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta reason = HID_L2CAP_REQ_FAIL ; 5917f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta p_hcon->conn_state = HID_CONN_STATE_UNUSED; 5927f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta hidh_conn_disconnect (dhandle); 5937f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ; 5947f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta return; 5957f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta } 5967f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta else 5977f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta { 5987f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta /* Transition to the next appropriate state, waiting for connection confirm on interrupt channel. */ 5997f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta p_hcon->conn_state = HID_CONN_STATE_CONNECTING_INTR; 6007f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta } 6017f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta } 6027f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta } 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_flags |= HID_CONN_FLAGS_MY_INTR_CFG_DONE; 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If all configuration is complete, change state and tell management we are up */ 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_hcon->conn_flags & HID_CONN_FLAGS_ALL_CONFIGURED) == HID_CONN_FLAGS_ALL_CONFIGURED) 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_hcon->conn_state == HID_CONN_STATE_CONFIG)) 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_CONNECTED; 6118f322bfe42a57902e7c45713a5c6215dfbe2494aHemant Gupta /* Reset disconnect reason to success, as connection successful */ 6128f322bfe42a57902e7c45713a5c6215dfbe2494aHemant Gupta p_hcon->disc_reason = HID_SUCCESS; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.devices[dhandle].state = HID_DEV_CONNECTED; 6152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_OPEN, 0, NULL ) ; 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_disconnect_ind 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles a disconnect event from L2CAP. If 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** requested to, we ack the disconnect before dropping the CCB 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed) 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dhandle; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = NULL; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 disc_res = HCI_SUCCESS; 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 hid_close_evt_reason; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES ) 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon = &hh_cb.devices[dhandle].conn; 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon == NULL) 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 643d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid); 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ack_needed) 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectRsp (l2cap_cid); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 650d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP disc, CID: 0x%x", l2cap_cid); 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING; 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2cap_cid == p_hcon->ctrl_cid) 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->ctrl_cid = 0; 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->intr_cid = 0; 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_hcon->ctrl_cid == 0) && (p_hcon->intr_cid == 0)) 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.devices[dhandle].state = HID_DEV_NO_CONN; 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_UNUSED; 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( !ack_needed ) 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc_res = btm_get_acl_disc_reason_code(); 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (HID_HOST_MAX_CONN_RETRY > 0) 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (disc_res == HCI_ERR_CONNECTION_TOUT || disc_res == HCI_ERR_UNSPECIFIED) && 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(hh_cb.devices[dhandle].attr_mask & HID_RECONN_INIT)) && 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (hh_cb.devices[dhandle].attr_mask & HID_NORMALLY_CONNECTABLE)) 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.devices[dhandle].conn_tries = 0; 67378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov period_ms_t interval_ms = HID_HOST_REPAGE_WIN * 1000; 67478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(hh_cb.devices[dhandle].conn.process_repage_timer, 67578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov interval_ms, hidh_process_repage_timer_timeout, 67678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov UINT_TO_PTR(dhandle), btu_general_alarm_queue); 6770ab408fe6f6cb698ba1fcd8492d117c0d3574c7dHemant Gupta hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, disc_res, NULL); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set reason code for HID_HDEV_EVT_CLOSE */ 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hid_close_evt_reason = p_hcon->disc_reason; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we got baseband sent HCI_DISCONNECT_COMPLETE_EVT due to security failure, then set reason to HID_ERR_AUTH_FAILED */ 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((disc_res == HCI_ERR_AUTH_FAILURE) || 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_res == HCI_ERR_KEY_MISSING) || 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_res == HCI_ERR_HOST_REJECT_SECURITY) || 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_res == HCI_ERR_PAIRING_NOT_ALLOWED) || 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_res == HCI_ERR_UNIT_KEY_USED) || 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_res == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_res == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (disc_res == HCI_ERR_REPEATED_ATTEMPTS)) 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hid_close_evt_reason = HID_ERR_AUTH_FAILED; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, hid_close_evt_reason, NULL ) ; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_disconnect_cfm 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles a disconnect confirm event from L2CAP. 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_disconnect_cfm (UINT16 l2cap_cid, UINT16 result) 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dhandle; 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = NULL; 7175cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(result); 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES ) 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon = &hh_cb.devices[dhandle].conn; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon == NULL) 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 725d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid); 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 729d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid); 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2cap_cid == p_hcon->ctrl_cid) 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->ctrl_cid = 0; 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 734bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta { 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->intr_cid = 0; 736bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta if (p_hcon->ctrl_cid) 737bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta { 738d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Initiating L2CAP Ctrl disconnection"); 739bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta L2CA_DisconnectReq (p_hcon->ctrl_cid); 740bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta } 741bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta } 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_hcon->ctrl_cid == 0) && (p_hcon->intr_cid == 0)) 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hh_cb.devices[dhandle].state = HID_DEV_NO_CONN; 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_state = HID_CONN_STATE_UNUSED; 7472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, p_hcon->disc_reason, NULL ) ; 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_cong_ind 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles a congestion status event from L2CAP. 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_cong_ind (UINT16 l2cap_cid, BOOLEAN congested) 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dhandle; 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = NULL; 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES ) 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon = &hh_cb.devices[dhandle].conn; 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon == NULL) 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 772d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP congestion status, unknown CID: 0x%x", l2cap_cid); 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 776d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP congestion status, CID: 0x%x Cong: %d", l2cap_cid, congested); 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (congested) 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_flags |= HID_CONN_FLAGS_CONGESTED; 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon->conn_flags &= ~HID_CONN_FLAGS_CONGESTED; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_l2cif_data_ind 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when data is received from L2CAP. 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if we are the originator of the connection, we are the SDP 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** client, and the received message is queued up for the client. 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If we are the destination of the connection, we are the SDP 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server, so the message is passed to the server processing 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function. 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg) 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_data = (UINT8 *)(p_msg + 1) + p_msg->offset; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ttype, param, rep_type, evt; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 dhandle; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = NULL; 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 810d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_DEBUG ("HID-Host hidh_l2cif_data_ind [l2cap_cid=0x%04x]", l2cap_cid); 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES) 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_hcon = &hh_cb.devices[dhandle].conn; 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon == NULL) 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 818d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid); 819abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_msg); 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ttype = HID_GET_TRANS_FROM_HDR(*p_data); 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param = HID_GET_PARAM_FROM_HDR(*p_data); 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rep_type = param & HID_PAR_REP_TYPE_MASK; 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data++; 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Get rid of the data type */ 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->len--; 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->offset++; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (ttype) 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_HANDSHAKE: 8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback(dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_HANDSHAKE, param, NULL); 837abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_msg); 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_CONTROL: 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (param) 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_PAR_CONTROL_VIRTUAL_CABLE_UNPLUG: 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hidh_conn_disconnect( dhandle ) ; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Device is unplugging from us. Tell USB */ 8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback(dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_VC_UNPLUG, 0, NULL); 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 852abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_msg); 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATA: 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt = (hh_cb.devices[dhandle].conn.intr_cid == l2cap_cid) ? 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HDEV_EVT_INTR_DATA : HID_HDEV_EVT_CTRL_DATA; 8592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback(dhandle, hh_cb.devices[dhandle].addr, evt, rep_type, p_msg); 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATAC: 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt = (hh_cb.devices[dhandle].conn.intr_cid == l2cap_cid) ? 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HID_HDEV_EVT_INTR_DATC : HID_HDEV_EVT_CTRL_DATC; 8652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback(dhandle, hh_cb.devices[dhandle].addr, evt, rep_type, p_msg); 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 869abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_msg); 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_conn_snd_data 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is sends out data. 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tHID_STATUS 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS hidh_conn_snd_data (UINT8 dhandle, UINT8 trans_type, UINT8 param, 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 data, UINT8 report_id, BT_HDR *buf) 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_CONN *p_hcon = &hh_cb.devices[dhandle].conn; 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_out; 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 bytes_copied; 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN seg_req = FALSE; 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 data_size; 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 cid; 8932e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov UINT16 buf_size; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 use_data = 0 ; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN blank_datc = FALSE; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8978fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (!BTM_IsAclConnectionUp(hh_cb.devices[dhandle].addr, BT_TRANSPORT_BR_EDR)) 8988fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta { 899abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(buf); 90020524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov return HID_ERR_NO_CONNECTION; 9018fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta } 9028fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 905abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(buf); 90620524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov return HID_ERR_CONGESTED; 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch( trans_type ) 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_CONTROL: 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_REPORT: 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_REPORT: 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_PROTOCOL: 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_PROTOCOL: 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_GET_IDLE: 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_SET_IDLE: 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cid = p_hcon->ctrl_cid; 9192e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov buf_size = HID_CONTROL_BUF_SIZE; 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HID_TRANS_DATA: 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cid = p_hcon->intr_cid; 9232e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov buf_size = HID_INTERRUPT_BUF_SIZE; 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (HID_ERR_INVALID_PARAM) ; 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( trans_type == HID_TRANS_SET_IDLE ) 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project use_data = 1; 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if( (trans_type == HID_TRANS_GET_REPORT) && (param & 0x08) ) 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project use_data = 2; 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( buf == NULL || blank_datc ) 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 938abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov p_buf = (BT_HDR *)osi_malloc(buf_size); 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project seg_req = FALSE; 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data_size = 0; 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bytes_copied = 0; 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project blank_datc = FALSE; 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( (buf->len > (p_hcon->rem_mtu_size - 1))) 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 948abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov p_buf = (BT_HDR *)osi_malloc(buf_size); 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project seg_req = TRUE; 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data_size = buf->len; 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bytes_copied = p_hcon->rem_mtu_size - 1; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = buf ; 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset -= 1; 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project seg_req = FALSE; 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data_size = buf->len; 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bytes_copied = buf->len; 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out = (UINT8 *)(p_buf + 1) + p_buf->offset; 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_out++ = HID_BUILD_HDR(trans_type, param); 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If report ID required for this device */ 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (trans_type == HID_TRANS_GET_REPORT) && (report_id != 0) ) 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_out = report_id; 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data_size = bytes_copied = 1; 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (seg_req) 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_out, (((UINT8 *)(buf+1)) + buf->offset), bytes_copied); 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf->offset += bytes_copied; 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf->len -= bytes_copied; 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if( use_data == 1) 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(p_out+bytes_copied) = data & 0xff; 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if( use_data == 2 ) 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(p_out+bytes_copied) = data & 0xff; 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(p_out+bytes_copied+1) = (data >> 8) & 0xff ; 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = bytes_copied + 1 + use_data; 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data_size -= bytes_copied; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the buffer through L2CAP */ 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) || (!L2CA_DataWrite (cid, p_buf))) 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (HID_ERR_CONGESTED); 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (data_size) 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_type = HID_TRANS_DATAC; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if( bytes_copied == (p_hcon->rem_mtu_size - 1) ) 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project trans_type = HID_TRANS_DATAC; 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project blank_datc = TRUE; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while ((data_size != 0) || blank_datc ) ; 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (HID_SUCCESS); 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_conn_initiate 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the management to create a connection. 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS hidh_conn_initiate (UINT8 dhandle) 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach UINT8 service_id = BTM_SEC_SERVICE_HIDH_NOSEC_CTRL; 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id = HID_NOSEC_CHN; 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_HOST_DEV_CTB *p_dev = &hh_cb.devices[dhandle]; 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( p_dev->conn.conn_state != HID_CONN_STATE_UNUSED ) 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return( HID_ERR_CONN_IN_PROCESS ); 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.ctrl_cid = 0; 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.intr_cid = 0; 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.disc_reason = HID_L2CAP_CONN_FAIL; /* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */ 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We are the originator of this connection */ 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.conn_flags = HID_CONN_FLAGS_IS_ORIG; 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_dev->attr_mask & HID_SEC_REQUIRED) 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach service_id = BTM_SEC_SERVICE_HIDH_SEC_CTRL; 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mx_chan_id = HID_SEC_CHN; 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetOutService (p_dev->addr, service_id, mx_chan_id); 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if L2CAP started the connection process */ 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev->conn.ctrl_cid = L2CA_ConnectReq (HID_PSM_CONTROL, p_dev->addr)) == 0) 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1046d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati HIDH_TRACE_WARNING ("HID-Host Originate failed"); 10472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, 10482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach HID_ERR_L2CAP_FAILED, NULL ) ; 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Transition to the next appropriate state, waiting for connection confirm on control channel. */ 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.conn_state = HID_CONN_STATE_CONNECTING_CTRL; 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return( HID_SUCCESS ); 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function find_conn_by_cid 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function finds a connection control block based on CID 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns address of control block, or NULL if not found 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 find_conn_by_cid (UINT16 cid) 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < HID_HOST_MAX_DEVICES; xx++) 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((hh_cb.devices[xx].in_use) && (hh_cb.devices[xx].conn.conn_state != HID_CONN_STATE_UNUSED) 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((hh_cb.devices[xx].conn.ctrl_cid == cid) || (hh_cb.devices[xx].conn.intr_cid == cid))) 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (xx); 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid hidh_conn_dereg( void ) 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Deregister (HID_PSM_CONTROL); 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Deregister (HID_PSM_INTERRUPT); 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function hidh_conn_retry 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to retry a failed connection. 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_conn_retry( UINT8 dhandle ) 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tHID_HOST_DEV_CTB *p_dev = &hh_cb.devices[dhandle]; 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->conn.conn_state = HID_CONN_STATE_UNUSED; 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (HID_HOST_REPAGE_WIN > 0) 110478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov period_ms_t interval_ms = HID_HOST_REPAGE_WIN * 1000; 110578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(p_dev->conn.process_repage_timer, 110678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov interval_ms, hidh_process_repage_timer_timeout, 110778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov UINT_TO_PTR(dhandle), btu_general_alarm_queue); 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 110978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov hidh_process_repage_process(dhandle); 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1112