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