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 BNEP API code 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bnep_api.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bnep_int.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 3078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue; 3178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_Init 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initializes the BNEP unit. It should be called 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** before accessing any other APIs to initialize the control block 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BNEP_Init (void) 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&bnep_cb, 0, sizeof (tBNEP_CB)); 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BNEP_INITIAL_TRACE_LEVEL) 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.trace_level = BNEP_INITIAL_TRACE_LEVEL; 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_Register 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the upper layer to register 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its callbacks with BNEP 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_reg_info - contains all callback function pointers 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BNEP_SUCCESS if registered successfully 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_FAILURE if connection state callback is missing 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_Register (tBNEP_REGISTER *p_reg_info) 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There should be connection state call back registered */ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!p_reg_info) || (!(p_reg_info->p_conn_state_cb))) 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_SECURITY_FAIL; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_conn_ind_cb = p_reg_info->p_conn_ind_cb; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_conn_state_cb = p_reg_info->p_conn_state_cb; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_data_ind_cb = p_reg_info->p_data_ind_cb; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_data_buf_cb = p_reg_info->p_data_buf_cb; 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_filter_ind_cb = p_reg_info->p_filter_ind_cb; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_mfilter_ind_cb = p_reg_info->p_mfilter_ind_cb; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_tx_data_flow_cb = p_reg_info->p_tx_data_flow_cb; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_register_with_l2cap ()) 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_SECURITY_FAIL; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.profile_registered = TRUE; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_SUCCESS; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_Deregister 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the upper layer to de-register 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its callbacks. 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BNEP_Deregister (void) 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear all the call backs registered */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_conn_ind_cb = NULL; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_conn_state_cb = NULL; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_data_ind_cb = NULL; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_data_buf_cb = NULL; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_filter_ind_cb = NULL; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.p_mfilter_ind_cb = NULL; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.profile_registered = FALSE; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Deregister (BT_PSM_BNEP); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_Connect 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function creates a BNEP connection to a remote 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device. 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_rem_addr - BD_ADDR of the peer 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** src_uuid - source uuid for the connection 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dst_uuid - destination uuid for the connection 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_handle - pointer to return the handle for the connection 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BNEP_SUCCESS if connection started 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_NO_RESOURCES if no resources 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_Connect (BD_ADDR p_rem_bda, 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *src_uuid, 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID *dst_uuid, 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 *p_handle) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 cid; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb = bnepu_find_bcb_by_bd_addr (p_rem_bda); 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 142d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_API ("BNEP_Connect() BDA: %02x-%02x-%02x-%02x-%02x-%02x", 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rem_bda[0], p_rem_bda[1], p_rem_bda[2], 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rem_bda[3], p_rem_bda[4], p_rem_bda[5]); 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bnep_cb.profile_registered) 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_WRONG_STATE; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both source and destination UUID lengths should be same */ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (src_uuid->len != dst_uuid->len) 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_CONN_FAILED_UUID_SIZE; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_bcb) 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb = bnepu_allocate_bcb (p_rem_bda)) == NULL) 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_NO_RESOURCES); 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_bcb->con_state != BNEP_STATE_CONNECTED) 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_WRONG_STATE; 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Backup current UUID values to restore if role change fails */ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->prv_src_uuid), (UINT8 *)&(p_bcb->src_uuid), sizeof (tBT_UUID)); 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->prv_dst_uuid), (UINT8 *)&(p_bcb->dst_uuid), sizeof (tBT_UUID)); 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We are the originator of this connection */ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags |= BNEP_FLAGS_IS_ORIG; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)src_uuid, sizeof (tBT_UUID)); 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)dst_uuid, sizeof (tBT_UUID)); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state == BNEP_STATE_CONNECTED) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Transition to the next appropriate state, waiting for connection confirm. */ 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_SEC_CHECKING; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 178d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_API ("BNEP initiating security procedures for src uuid 0x%x", 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->src_uuid.uu.uuid16); 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) && BNEP_DO_AUTH_FOR_ROLE_SWITCH == TRUE) 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_mx_access_request (p_bcb->rem_bda, BT_PSM_BNEP, TRUE, 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_PROTO_BNEP, 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_get_uuid32(src_uuid), 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &bnep_sec_check_complete, p_bcb); 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_sec_check_complete (p_bcb->rem_bda, p_bcb, BTM_SUCCESS); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Transition to the next appropriate state, waiting for connection confirm. */ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CONN_START; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((cid = L2CA_ConnectReq (BT_PSM_BNEP, p_bcb->rem_bda)) != 0) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->l2cap_cid = cid; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 203d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP - Originate failed"); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_cb.p_conn_state_cb) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED, FALSE); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_CONN_FAILED; 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer waiting for connect */ 21178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(p_bcb->conn_timer, BNEP_CONN_TIMEOUT_MS, 21278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bnep_conn_timer_timeout, p_bcb, 21378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_general_alarm_queue); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_handle = p_bcb->handle; 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SUCCESS); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_ConnectResp 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called in responce to connection indication 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle given in the connection indication 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** resp - responce for the connection indication 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BNEP_SUCCESS if connection started 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_WRONG_HANDLE if the connection is not found 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_WRONG_STATE if the responce is not expected 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_ConnectResp (UINT16 handle, tBNEP_RESULT resp) 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 resp_code = BNEP_SETUP_CONN_OK; 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_HANDLE); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = &(bnep_cb.bcb[handle - 1]); 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state != BNEP_STATE_CONN_SETUP || 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD))) 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_STATE); 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 250d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_API ("BNEP_ConnectResp() for handle %d, responce %d", handle, resp); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Form appropriate responce based on profile responce */ 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (resp == BNEP_CONN_FAILED_SRC_UUID) resp_code = BNEP_SETUP_INVALID_SRC_UUID; 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (resp == BNEP_CONN_FAILED_DST_UUID) resp_code = BNEP_SETUP_INVALID_DEST_UUID; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (resp == BNEP_CONN_FAILED_UUID_SIZE) resp_code = BNEP_SETUP_INVALID_UUID_SIZE; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (resp == BNEP_SUCCESS) resp_code = BNEP_SETUP_CONN_OK; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else resp_code = BNEP_SETUP_CONN_NOT_ALLOWED; 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_send_conn_responce (p_bcb, resp_code); 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (resp == BNEP_SUCCESS) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_connected (p_bcb); 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Restore the original parameters */ 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_state = BNEP_STATE_CONNECTED; 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD); 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID)); 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID)); 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process remaining part of the setup message (extension headers) */ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->p_pending_data) 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 extension_present = TRUE, *p, ext_type; 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 rem_len; 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rem_len = p_bcb->p_pending_data->len; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_bcb->p_pending_data + 1) + p_bcb->p_pending_data->offset; 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (extension_present && p && rem_len) 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_type = *p++; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project extension_present = ext_type >> 7; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext_type &= 0x7F; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if unknown extension present stop processing */ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ext_type) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = bnep_process_control_packet (p_bcb, p, &rem_len, TRUE); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_bcb->p_pending_data); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SUCCESS); 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_Disconnect 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to close the specified connection. 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle of the connection 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BNEP_SUCCESS if connection is disconnected 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_WRONG_HANDLE if no connection is not found 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_Disconnect (UINT16 handle) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_HANDLE); 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = &(bnep_cb.bcb[handle - 1]); 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bcb->con_state == BNEP_STATE_IDLE) 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_HANDLE); 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_API ("BNEP_Disconnect() for handle %d", handle); 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DisconnectReq (p_bcb->l2cap_cid); 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_release_bcb (p_bcb); 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SUCCESS); 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_WriteBuf 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends data in a GKI buffer on BNEP connection 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle of the connection to write 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_dest_addr - BD_ADDR/Ethernet addr of the destination 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_buf - pointer to address of buffer with data 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** protocol - protocol type of the packet 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_src_addr - (optional) BD_ADDR/ethernet address of the source 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (should be NULL if it is local BD Addr) 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** fw_ext_present - forwarded extensions present 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns: BNEP_WRONG_HANDLE - if passed handle is not valid 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_MTU_EXCEDED - If the data length is greater than MTU 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_IGNORE_CMD - If the packet is filtered out 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_Q_SIZE_EXCEEDED - If the Tx Q is full 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_SUCCESS - If written successfully 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_WriteBuf (UINT16 handle, 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_dest_addr, 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf, 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 protocol, 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_src_addr, 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN fw_ext_present) 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_data; 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 368abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_HANDLE); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = &(bnep_cb.bcb[handle - 1]); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check MTU size */ 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf->len > BNEP_MTU_SIZE) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 376d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP_Write() length %d exceeded MTU %d", p_buf->len, BNEP_MTU_SIZE); 377abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_MTU_EXCEDED); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the packet should be filtered out */ 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_is_packet_allowed (p_bcb, p_dest_addr, protocol, fw_ext_present, p_data) != BNEP_SUCCESS) 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** If packet is filtered and ext headers are present 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** drop the data and forward the ext headers 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (fw_ext_present) 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ext, length; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 org_len, new_len; 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse the extension headers and findout the new packet len */ 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project org_len = p_buf->len; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_len = 0; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do { 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext = *p_data++; 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project length = *p_data++; 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data += length; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_len += (length + 2); 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_len > org_len) 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 406abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_IGNORE_CMD; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (ext & 0x80); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (protocol != BNEP_802_1_P_PROTOCOL) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protocol = 0; 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_len += 4; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data[2] = 0; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data[3] = 0; 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = new_len; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 424abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_IGNORE_CMD; 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check transmit queue */ 4301a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (fixed_queue_length(p_bcb->xmit_q) >= BNEP_MAX_XMITQ_DEPTH) 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 432abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_Q_SIZE_EXCEEDED); 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Build the BNEP header */ 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_build_bnep_hdr (p_bcb, p_buf, protocol, p_src_addr, p_dest_addr, fw_ext_present); 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the data or queue it up */ 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SUCCESS); 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 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** Function BNEP_Write 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sends data over a BNEP connection 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle of the connection to write 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_dest_addr - BD_ADDR/Ethernet addr of the destination 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_data - pointer to data start 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** protocol - protocol type of the packet 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_src_addr - (optional) BD_ADDR/ethernet address of the source 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (should be NULL if it is local BD Addr) 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** fw_ext_present - forwarded extensions present 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns: BNEP_WRONG_HANDLE - if passed handle is not valid 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_MTU_EXCEDED - If the data length is greater than MTU 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_IGNORE_CMD - If the packet is filtered out 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_Q_SIZE_EXCEEDED - If the Tx Q is full 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_NO_RESOURCES - If not able to allocate a buffer 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_SUCCESS - If written successfully 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_Write (UINT16 handle, 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_dest_addr, 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_data, 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len, 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 protocol, 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_src_addr, 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN fw_ext_present) 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check MTU size. Consider the possibility of having extension headers */ 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len > BNEP_MTU_SIZE) 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 482d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati BNEP_TRACE_ERROR ("BNEP_Write() length %d exceeded MTU %d", len, BNEP_MTU_SIZE); 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_MTU_EXCEDED); 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_HANDLE); 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = &(bnep_cb.bcb[handle - 1]); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the packet should be filtered out */ 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bnep_is_packet_allowed (p_bcb, p_dest_addr, protocol, fw_ext_present, p_data) != BNEP_SUCCESS) 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** If packet is filtered and ext headers are present 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** drop the data and forward the ext headers 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (fw_ext_present) 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ext, length; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 org_len, new_len; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse the extension headers and findout the new packet len */ 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project org_len = len; 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_len = 0; 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_data; 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do { 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ext = *p_data++; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project length = *p_data++; 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data += length; 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_len += (length + 2); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_len > org_len) 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_IGNORE_CMD; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (ext & 0x80); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (protocol != BNEP_802_1_P_PROTOCOL) 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protocol = 0; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_len += 4; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data[2] = 0; 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data[3] = 0; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = new_len; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = p; 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_IGNORE_CMD; 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check transmit queue */ 5351a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (fixed_queue_length(p_bcb->xmit_q) >= BNEP_MAX_XMITQ_DEPTH) 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_Q_SIZE_EXCEEDED); 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5382e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov /* Get a buffer to copy the data into */ 5395fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = (BT_HDR *)osi_malloc(BNEP_BUF_SIZE); 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = len; 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = BNEP_MINIMUM_OFFSET; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + BNEP_MINIMUM_OFFSET; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p, p_data, len); 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Build the BNEP header */ 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_build_bnep_hdr (p_bcb, p_buf, protocol, p_src_addr, p_dest_addr, fw_ext_present); 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the data or queue it up */ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_check_send_packet (p_bcb, p_buf); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SUCCESS); 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_SetProtocolFilters 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets the protocol filters on peer device 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - Handle for the connection 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** num_filters - total number of filter ranges 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_start_array - Array of beginings of all protocol ranges 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_end_array - Array of ends of all protocol ranges 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BNEP_WRONG_HANDLE - if the connection handle is not valid 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_SET_FILTER_FAIL - if the connection is in wrong state 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_TOO_MANY_FILTERS - if too many filters 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_SUCCESS - if request sent successfully 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_SetProtocolFilters (UINT16 handle, 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_filters, 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 *p_start_array, 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 *p_end_array) 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_HANDLE); 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = &(bnep_cb.bcb[handle - 1]); 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the connection state */ 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_STATE); 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validate the parameters */ 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_filters && (!p_start_array || !p_end_array)) 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SET_FILTER_FAIL); 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_filters > BNEP_MAX_PROT_FILTERS) 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_TOO_MANY_FILTERS); 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Fill the filter values in connnection block */ 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < num_filters; xx++) 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->sent_prot_filter_start[xx] = *p_start_array++; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->sent_prot_filter_end[xx] = *p_end_array++; 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->sent_num_filters = num_filters; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_our_filters (p_bcb); 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SUCCESS); 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_SetMulticastFilters 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets the filters for multicast addresses for BNEP. 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - Handle for the connection 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** num_filters - total number of filter ranges 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_start_array - Pointer to sequence of beginings of all 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** multicast address ranges 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_end_array - Pointer to sequence of ends of all 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** multicast address ranges 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BNEP_WRONG_HANDLE - if the connection handle is not valid 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_SET_FILTER_FAIL - if the connection is in wrong state 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_TOO_MANY_FILTERS - if too many filters 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_SUCCESS - if request sent successfully 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_SetMulticastFilters (UINT16 handle, 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_filters, 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_start_array, 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_end_array) 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_HANDLE); 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = &(bnep_cb.bcb[handle - 1]); 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the connection state */ 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_STATE); 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validate the parameters */ 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_filters && (!p_start_array || !p_end_array)) 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SET_FILTER_FAIL); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_filters > BNEP_MAX_MULTI_FILTERS) 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_TOO_MANY_FILTERS); 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Fill the multicast filter values in connnection block */ 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < num_filters; xx++) 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_bcb->sent_mcast_filter_start[xx], p_start_array, BD_ADDR_LEN); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_bcb->sent_mcast_filter_end[xx], p_end_array, BD_ADDR_LEN); 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_start_array += BD_ADDR_LEN; 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_end_array += BD_ADDR_LEN; 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb->sent_mcast_filters = num_filters; 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnepu_send_peer_our_multi_filters (p_bcb); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_SUCCESS); 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_SetTraceLevel 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets the trace level for BNEP. If called with 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a value of 0xFF, it simply reads the current trace level. 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the new (current) trace level 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BNEP_SetTraceLevel (UINT8 new_level) 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_level != 0xFF) 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bnep_cb.trace_level = new_level; 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (bnep_cb.trace_level); 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BNEP_GetStatus 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function gets the status information for BNEP connection 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BNEP_SUCCESS - if the status is available 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_NO_RESOURCES - if no structure is passed for output 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_WRONG_HANDLE - if the handle is invalid 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BNEP_WRONG_STATE - if not in connected state 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT BNEP_GetStatus (UINT16 handle, tBNEP_STATUS *p_status) 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_STATUS_API) && BNEP_SUPPORTS_STATUS_API == TRUE) 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_CONN *p_bcb; 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_status) 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_NO_RESOURCES; 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_WRONG_HANDLE); 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bcb = &(bnep_cb.bcb[handle - 1]); 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_status, 0, sizeof (tBNEP_STATUS)); 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_WRONG_STATE; 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Read the status parameters from the connection control block */ 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_status->con_status = BNEP_STATUS_CONNECTED; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_status->l2cap_cid = p_bcb->l2cap_cid; 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_status->rem_mtu_size = p_bcb->rem_mtu_size; 7281a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov p_status->xmit_q_depth = fixed_queue_length(p_bcb->xmit_q); 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_status->sent_num_filters = p_bcb->sent_num_filters; 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_status->sent_mcast_filters = p_bcb->sent_mcast_filters; 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_status->rcvd_num_filters = p_bcb->rcvd_num_filters; 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_status->rcvd_mcast_filters = p_bcb->rcvd_mcast_filters; 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_status->rem_bda, p_bcb->rem_bda, BD_ADDR_LEN); 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&(p_status->src_uuid), &(p_bcb->src_uuid), sizeof (tBT_UUID)); 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&(p_status->dst_uuid), &(p_bcb->dst_uuid), sizeof (tBT_UUID)); 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BNEP_SUCCESS; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BNEP_IGNORE_CMD); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745