15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2001-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 main BNEP functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bnep_api.h" 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bnep_int.h" 445cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* G L O B A L B N E P D A T A */ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BNEP_DYNAMIC_MEMORY == FALSE 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_CB bnep_cb; 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT16 bnep_frame_hdr_sizes[] = {14, 1, 2, 8, 8}; 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 575738f83aeb59361a0a2eda2460113f6dc919427The 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 */ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_connect_cfm (UINT16 l2cap_cid, UINT16 result); 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed); 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_disconnect_cfm (UINT16 l2cap_cid, UINT16 result); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_congestion_ind (UINT16 lcid, BOOLEAN is_congested); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_read_addr_cb (void *p_bda); 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_register_with_l2cap 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function registers BNEP PSM with L2CAP 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT bnep_register_with_l2cap (void) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize the L2CAP configuration. We only care about MTU and flush */ 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&bnep_cb.l2cap_my_cfg, 0, sizeof(tL2CAP_CFG_INFO)); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.l2cap_my_cfg.mtu_present = TRUE; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.l2cap_my_cfg.mtu = BNEP_MTU_SIZE; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.l2cap_my_cfg.flush_to_present = TRUE; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.l2cap_my_cfg.flush_to = BNEP_FLUSH_TO; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.reg_info.pL2CA_ConnectInd_Cb = bnep_connect_ind; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.reg_info.pL2CA_ConnectCfm_Cb = bnep_connect_cfm; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.reg_info.pL2CA_ConfigInd_Cb = bnep_config_ind; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.reg_info.pL2CA_ConfigCfm_Cb = bnep_config_cfm; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.reg_info.pL2CA_DisconnectInd_Cb = bnep_disconnect_ind; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.reg_info.pL2CA_DisconnectCfm_Cb = bnep_disconnect_cfm; 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.reg_info.pL2CA_DataInd_Cb = bnep_data_ind; 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.reg_info.pL2CA_CongestionStatus_Cb = bnep_congestion_ind; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, register with L2CAP */ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!L2CA_Register (BT_PSM_BNEP, &bnep_cb.reg_info)) 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 102d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - Registration failed"); 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_SECURITY_FAIL; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_SUCCESS; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_connect_ind 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles an inbound connection indication 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from L2CAP. This is the case where we are acting as a 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server. 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id) 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb = bnepu_find_bcb_by_bd_addr (bd_addr); 1245cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(psm); 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are not acting as server, or already have a connection, or have */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no more resources to handle the connection, reject the connection. */ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(bnep_cb.profile_registered) || (p_bcb) 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((p_bcb = bnepu_allocate_bcb(bd_addr)) == NULL)) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_NO_PSM, 0); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Transition to the next appropriate state, waiting for config setup. */ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CFG_SETUP; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the L2CAP Channel ID. */ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->l2cap_cid = l2cap_cid; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send response to the L2CAP layer. */ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK); 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send a Configuration Request. */ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq (l2cap_cid, &bnep_cb.l2cap_my_cfg); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer waiting for config setup */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 150d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT("BNEP - Rcvd L2CAP conn ind, CID: 0x%x", p_bcb->l2cap_cid); 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_connect_cfm 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles the connect confirm events 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from L2CAP. This is the case when we are acting as a 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** client and have sent a connect request. 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_connect_cfm (UINT16 l2cap_cid, UINT16 result) 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *bcb; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 173d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_WARNING ("BNEP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid); 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the connection response contains success status, then */ 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Transition to the next state and startup the timer. */ 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((result == L2CAP_CONN_OK) && (bcb->con_state == BNEP_STATE_CONN_START)) 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bcb->con_state = BNEP_STATE_CFG_SETUP; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send a Configuration Request. */ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigReq (l2cap_cid, &bnep_cb.l2cap_my_cfg); 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer waiting for config results */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 189d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - got conn cnf, sent cfg req, CID: 0x%x", bcb->l2cap_cid); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 193d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_WARNING ("BNEP - Rcvd conn cnf with error: 0x%x CID 0x%x", result, bcb->l2cap_cid); 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the upper layer, if he has a callback */ 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb && 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bcb->con_flags & BNEP_FLAGS_IS_ORIG) 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (bcb->handle, bcb->rem_bda, BNEP_CONN_FAILED, FALSE); 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (bcb); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_config_ind 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes the L2CAP configuration indication 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result, mtu = 0; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL) 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 224d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid); 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 228d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - Rcvd cfg ind, CID: 0x%x", l2cap_cid); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remember the remote MTU size */ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!p_cfg->mtu_present) || (p_cfg->mtu < BNEP_MIN_MTU_SIZE)) 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = p_cfg->mtu; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->flush_to_present = FALSE; 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->mtu_present = TRUE; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->mtu = BNEP_MIN_MTU_SIZE; 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->result = result = L2CAP_CFG_UNACCEPTABLE_PARAMS; 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cfg->mtu > BNEP_MTU_SIZE) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rem_mtu_size = BNEP_MTU_SIZE; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->rem_mtu_size = p_cfg->mtu; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For now, always accept configuration from the other side */ 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->flush_to_present = FALSE; 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->mtu_present = FALSE; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->result = result = L2CAP_CFG_OK; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_ConfigRsp (l2cap_cid, p_cfg); 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != L2CAP_CFG_OK) 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 256d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - Rcvd cfg ind with bad MTU %d, CID: 0x%x", mtu, l2cap_cid); 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags |= BNEP_FLAGS_HIS_CFG_DONE; 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_MY_CFG_DONE) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_SEC_CHECKING; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer waiting for setup or response */ 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_HOST_TIMEOUT); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_IS_ORIG) 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_mx_access_request (p_bcb->rem_bda, BT_PSM_BNEP, TRUE, 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_PROTO_BNEP, 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_get_uuid32(&(p_bcb->src_uuid)), 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &bnep_sec_check_complete, p_bcb); 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_config_cfm 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes the L2CAP configuration confirmation 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 294d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, p_cfg->result); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 299d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid); 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For now, always accept configuration from the other side */ 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cfg->result == L2CAP_CFG_OK) 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags |= BNEP_FLAGS_MY_CFG_DONE; 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_HIS_CFG_DONE) 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_SEC_CHECKING; 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer waiting for setup or response */ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_HOST_TIMEOUT); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_IS_ORIG) 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_mx_access_request (p_bcb->rem_bda, BT_PSM_BNEP, TRUE, 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_PROTO_BNEP, 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_get_uuid32(&(p_bcb->src_uuid)), 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &bnep_sec_check_complete, p_bcb); 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the upper layer, if he has a callback */ 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_flags & BNEP_FLAGS_IS_ORIG) && (bnep_cb.p_conn_state_cb)) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED_CFG, FALSE); 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_disconnect_ind 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles a disconnect event from L2CAP. If 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** requested to, we ack the disconnect before dropping the CCB 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ack_needed) 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectRsp (l2cap_cid); 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL) 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 359d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid); 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 363d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid); 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the user if he has a callback */ 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state == BNEP_STATE_CONNECTED) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb) 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb)(p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_DISCONNECTED, FALSE); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_bcb->con_flags & BNEP_FLAGS_IS_ORIG) && (bnep_cb.p_conn_state_cb)) || 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED, FALSE); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_disconnect_cfm 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function gets the disconnect confirm event from L2CAP 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_disconnect_cfm (UINT16 l2cap_cid, UINT16 result) 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 394d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - Rcvd L2CAP disc cfm, CID: 0x%x, Result 0x%x", l2cap_cid, result); 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_congestion_ind 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is a callback function called by L2CAP when 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** congestion status changes 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_congestion_ind (UINT16 l2cap_cid, BOOLEAN is_congested) 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find BCB based on CID */ 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 414d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cong, unknown CID: 0x%x", l2cap_cid); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_congested) 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags |= BNEP_FLAGS_L2CAP_CONGESTED; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bnep_cb.p_tx_data_flow_cb) 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_tx_data_flow_cb(p_bcb->handle, BNEP_TX_FLOW_OFF); 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags &= ~BNEP_FLAGS_L2CAP_CONGESTED; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bnep_cb.p_tx_data_flow_cb) 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_tx_data_flow_cb(p_bcb->handle, BNEP_TX_FLOW_ON); 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* While not congested, send as many buffers as we can */ 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (!(p_bcb->con_flags & BNEP_FLAGS_L2CAP_CONGESTED)) 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf = (BT_HDR *)GKI_dequeue (&p_bcb->xmit_q); 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_buf) 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DataWrite (l2cap_cid, p_buf); 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_data_ind 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when data is received from L2CAP. 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if we are the originator of the connection, we are the SDP 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** client, and the received message is queued up for the client. 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If we are the destination of the connection, we are the SDP 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server, so the message is passed to the server processing 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function. 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_data_ind (UINT16 l2cap_cid, BT_HDR *p_buf) 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)(p_buf + 1) + p_buf->offset; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 rem_len = p_buf->len; 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 type, ctrl_type, ext_type = 0; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN extension_present, fw_ext_present; 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 protocol = 0; 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_src_addr, *p_dst_addr; 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find CCB based on CID */ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL) 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 479d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid); 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Get the type and extension bits */ 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = *p++; 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project extension_present = type >> 7; 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type &= 0x7f; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rem_len <= bnep_frame_hdr_sizes[type]) || (rem_len > BNEP_MTU_SIZE)) 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 490d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - rcvd frame, bad len: %d type: 0x%02x", p_buf->len, type); 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rem_len--; 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)) && 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (type != BNEP_FRAME_CONTROL)) 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 501d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_WARNING ("BNEP - Ignored L2CAP data while in state: %d, CID: 0x%x", 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state, l2cap_cid); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (extension_present) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** When there is no connection if a data packet is received 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** with unknown control extension headers then those should be processed 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** according to complain/ignore law 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ext, length, *p_data; 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 org_len, new_len; 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse the extension headers and process unknown control headers */ 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project org_len = rem_len; 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_len = 0; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = p; 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do { 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext = *p++; 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project length = *p++; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += length; 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!(ext & 0x7F)) && (*p > BNEP_FILTER_MULTI_ADDR_RESPONSE_MSG)) 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_command_not_understood (p_bcb, *p); 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_len += (length + 2); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_len > org_len) 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (ext & 0x80); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (type > BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY) 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 540d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - rcvd frame, unknown type: 0x%02x", type); 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_DEBUG ("BNEP - rcv frame, type: %d len: %d Ext: %d", type, p_buf->len, extension_present); 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize addresses to 'not supplied' */ 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_src_addr = p_dst_addr = NULL; 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (type) 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_GENERAL_ETHERNET: 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dst_addr = p; 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_src_addr = p; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (protocol, p); 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rem_len -= 14; 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_CONTROL: 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ctrl_type = *p; 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = bnep_process_control_packet (p_bcb, p, &rem_len, FALSE); 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ctrl_type == BNEP_SETUP_CONNECTION_REQUEST_MSG && 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state != BNEP_STATE_CONNECTED && 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project extension_present && p && rem_len) 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->p_pending_data = (BT_HDR *)GKI_getbuf (rem_len); 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->p_pending_data) 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)(p_bcb->p_pending_data + 1), p, rem_len); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->p_pending_data->len = rem_len; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->p_pending_data->offset = 0; 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (extension_present && p && rem_len) 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_type = *p++; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project extension_present = ext_type >> 7; 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_type &= 0x7F; 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if unknown extension present stop processing */ 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ext_type) 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = bnep_process_control_packet (p_bcb, p, &rem_len, TRUE); 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_COMPRESSED_ETHERNET: 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (protocol, p); 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rem_len -= 2; 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_COMPRESSED_ETHERNET_SRC_ONLY: 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_src_addr = p; 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (protocol, p); 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rem_len -= 8; 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY: 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dst_addr = p; 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (protocol, p); 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rem_len -= 8; 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process the header extension if there is one */ 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (extension_present && p && rem_len) 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_type = *p; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project extension_present = ext_type >> 7; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_type &= 0x7F; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if unknown extension present stop processing */ 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ext_type) 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 625d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("Data extension type 0x%x found", ext_type); 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p++; 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rem_len--; 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = bnep_process_control_packet (p_bcb, p, &rem_len, TRUE); 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset += p_buf->len - rem_len; 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = rem_len; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Always give the upper layer MAC addresses */ 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_src_addr) 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_src_addr = (UINT8 *) p_bcb->rem_bda; 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dst_addr) 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dst_addr = (UINT8 *) bnep_cb.my_bda; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check whether there are any extensions to be forwarded */ 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ext_type) 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fw_ext_present = TRUE; 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fw_ext_present = FALSE; 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_data_buf_cb) 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_data_buf_cb)(p_bcb->handle, p_src_addr, p_dst_addr, protocol, p_buf, fw_ext_present); 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (bnep_cb.p_data_ind_cb) 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_data_ind_cb)(p_bcb->handle, p_src_addr, p_dst_addr, protocol, p, rem_len, fw_ext_present); 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_process_timeout 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function processes a timeout. If it is a startup 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** timeout, we check for reading our BD address. If it 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is an L2CAP timeout, we send a disconnect req to L2CAP. 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_process_timeout (TIMER_LIST_ENT *p_tle) 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_tle->param) 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bnep_cb.got_my_bd_addr) 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_IsDeviceUp()) 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ReadLocalDeviceAddr (bnep_read_addr_cb); 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&bnep_cb.bnep_tle, BTU_TTYPE_BNEP, 2); 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = (tBNEP_CONN *)p_tle->param; 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 692d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d CID: 0x%x flags %x, re_transmit %d", 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state, p_bcb->l2cap_cid, p_bcb->con_flags, p_bcb->re_transmits); 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state == BNEP_STATE_CONN_SETUP) 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 697d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d CID: 0x%x", 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state, p_bcb->l2cap_cid); 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_bcb->con_flags & BNEP_FLAGS_IS_ORIG)) 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->re_transmits++ != BNEP_MAX_RETRANSMITS) 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_req (p_bcb); 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT); 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_flags & BNEP_FLAGS_IS_ORIG) && (bnep_cb.p_conn_state_cb)) 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED, FALSE); 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_bcb->con_state != BNEP_STATE_CONNECTED) 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 726d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d CID: 0x%x", 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state, p_bcb->l2cap_cid); 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the user if he has a callback */ 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_flags & BNEP_FLAGS_IS_ORIG) && (bnep_cb.p_conn_state_cb)) 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED, FALSE); 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE) 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_bcb->con_flags & BNEP_FLAGS_FILTER_RESP_PEND) 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->re_transmits++ != BNEP_MAX_RETRANSMITS) 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_our_filters (p_bcb); 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_FILTER_SET_TIMEOUT); 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the user if he has a callback */ 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb) 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_SET_FILTER_FAIL, FALSE); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE) 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_bcb->con_flags & BNEP_FLAGS_MULTI_RESP_PEND) 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->re_transmits++ != BNEP_MAX_RETRANSMITS) 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_our_multi_filters (p_bcb); 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_FILTER_SET_TIMEOUT); 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the user if he has a callback */ 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb) 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_SET_FILTER_FAIL, FALSE); 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_connected 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a connection is established 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (after config). 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_connected (tBNEP_CONN *p_bcb) 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_role_change; 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_role_change = TRUE; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_role_change = FALSE; 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CONNECTED; 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags |= BNEP_FLAGS_CONN_COMPLETED; 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD); 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure timer is stopped */ 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_bcb->conn_tle); 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->re_transmits = 0; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell the upper layer, if he has a callback */ 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb) 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_SUCCESS, is_role_change); 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bnep_read_addr_cb 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTM when the local BD address 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is read. It saves the BD address, and flags it as read. 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bnep_read_addr_cb (void *p_bda) 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *bda = (UINT8 *)p_bda; 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bda && 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[0] | bda[1] | bda[2] | bda[3] | bda[4] | bda[5]) != 0) 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save my BD address */ 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (bnep_cb.my_bda, p_bda, BD_ADDR_LEN); 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.got_my_bd_addr = TRUE; 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retry after a couple seconds */ 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&bnep_cb.bnep_tle, BTU_TTYPE_BNEP, 2); 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 841