16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 2001-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains the BNEP API code 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bnep_api.h" 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bnep_int.h" 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_Init 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function initializes the BNEP unit. It should be called 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** before accessing any other APIs to initialize the control block 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid BNEP_Init (void) 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (&bnep_cb, 0, sizeof (tBNEP_CB)); 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BNEP_INITIAL_TRACE_LEVEL) 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.trace_level = BNEP_INITIAL_TRACE_LEVEL; 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Start a timer to read our BD address */ 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btu_start_timer (&bnep_cb.bnep_tle, BTU_TTYPE_BNEP, 2); 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_Register 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the upper layer to register 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** its callbacks with BNEP 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: p_reg_info - contains all callback function pointers 626ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BNEP_SUCCESS if registered successfully 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_FAILURE if connection state callback is missing 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 68e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_Register (tBNEP_REGISTER *p_reg_info) 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* There should be connection state call back registered */ 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!p_reg_info) || (!(p_reg_info->p_conn_state_cb))) 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_SECURITY_FAIL; 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_conn_ind_cb = p_reg_info->p_conn_ind_cb; 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_conn_state_cb = p_reg_info->p_conn_state_cb; 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_data_ind_cb = p_reg_info->p_data_ind_cb; 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_data_buf_cb = p_reg_info->p_data_buf_cb; 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_filter_ind_cb = p_reg_info->p_filter_ind_cb; 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_mfilter_ind_cb = p_reg_info->p_mfilter_ind_cb; 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_tx_data_flow_cb = p_reg_info->p_tx_data_flow_cb; 816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bnep_register_with_l2cap ()) 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_SECURITY_FAIL; 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.profile_registered = TRUE; 868e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy BTM_GetLocalDeviceAddr (bnep_cb.my_bda); 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_SUCCESS; 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_Deregister 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the upper layer to de-register 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** its callbacks. 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: void 996ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid BNEP_Deregister (void) 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Clear all the call backs registered */ 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_conn_ind_cb = NULL; 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_conn_state_cb = NULL; 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_data_ind_cb = NULL; 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_data_buf_cb = NULL; 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_filter_ind_cb = NULL; 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.p_mfilter_ind_cb = NULL; 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.profile_registered = FALSE; 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_Deregister (BT_PSM_BNEP); 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_Connect 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function creates a BNEP connection to a remote 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** device. 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: p_rem_addr - BD_ADDR of the peer 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** src_uuid - source uuid for the connection 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** dst_uuid - destination uuid for the connection 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_handle - pointer to return the handle for the connection 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BNEP_SUCCESS if connection started 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_NO_RESOURCES if no resources 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 135e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_Connect (BD_ADDR p_rem_bda, 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_UUID *src_uuid, 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_UUID *dst_uuid, 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 *p_handle) 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 cid; 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBNEP_CONN *p_bcb = bnepu_find_bcb_by_bd_addr (p_rem_bda); 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_TRACE_API6 ("BNEP_Connect() BDA: %02x-%02x-%02x-%02x-%02x-%02x", 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_rem_bda[0], p_rem_bda[1], p_rem_bda[2], 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_rem_bda[3], p_rem_bda[4], p_rem_bda[5]); 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bnep_cb.profile_registered) 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_WRONG_STATE; 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Both source and destination UUID lengths should be same */ 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (src_uuid->len != dst_uuid->len) 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_CONN_FAILED_UUID_SIZE; 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (!defined (BNEP_SUPPORTS_ALL_UUID_LENGTHS) || BNEP_SUPPORTS_ALL_UUID_LENGTHS == FALSE) 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (src_uuid->len != 2) 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_CONN_FAILED_UUID_SIZE; 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_bcb) 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_bcb = bnepu_allocate_bcb (p_rem_bda)) == NULL) 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_NO_RESOURCES); 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (p_bcb->con_state != BNEP_STATE_CONNECTED) 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_WRONG_STATE; 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Backup current UUID values to restore if role change fails */ 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy ((UINT8 *)&(p_bcb->prv_src_uuid), (UINT8 *)&(p_bcb->src_uuid), sizeof (tBT_UUID)); 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy ((UINT8 *)&(p_bcb->prv_dst_uuid), (UINT8 *)&(p_bcb->dst_uuid), sizeof (tBT_UUID)); 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* We are the originator of this connection */ 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->con_flags |= BNEP_FLAGS_IS_ORIG; 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)src_uuid, sizeof (tBT_UUID)); 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)dst_uuid, sizeof (tBT_UUID)); 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_bcb->con_state == BNEP_STATE_CONNECTED) 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Transition to the next appropriate state, waiting for connection confirm. */ 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->con_state = BNEP_STATE_SEC_CHECKING; 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_TRACE_API1 ("BNEP initiating security procedures for src uuid 0x%x", 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->src_uuid.uu.uuid16); 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) && BNEP_DO_AUTH_FOR_ROLE_SWITCH == TRUE) 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_sec_mx_access_request (p_bcb->rem_bda, BT_PSM_BNEP, TRUE, 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_PROTO_BNEP, 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_get_uuid32(src_uuid), 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bnep_sec_check_complete, p_bcb); 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_sec_check_complete (p_bcb->rem_bda, p_bcb, BTM_SUCCESS); 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Transition to the next appropriate state, waiting for connection confirm. */ 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->con_state = BNEP_STATE_CONN_START; 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((cid = L2CA_ConnectReq (BT_PSM_BNEP, p_bcb->rem_bda)) != 0) 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->l2cap_cid = cid; 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_TRACE_ERROR0 ("BNEP - Originate failed"); 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bnep_cb.p_conn_state_cb) 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED, FALSE); 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnepu_release_bcb (p_bcb); 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_CONN_FAILED; 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Start timer waiting for connect */ 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT); 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *p_handle = p_bcb->handle; 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SUCCESS); 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_ConnectResp 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called in responce to connection indication 2306ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: handle - handle given in the connection indication 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** resp - responce for the connection indication 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BNEP_SUCCESS if connection started 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_WRONG_HANDLE if the connection is not found 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_WRONG_STATE if the responce is not expected 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 240e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_ConnectResp (UINT16 handle, tBNEP_RESULT resp) 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBNEP_CONN *p_bcb; 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 resp_code = BNEP_SETUP_CONN_OK; 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_HANDLE); 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb = &(bnep_cb.bcb[handle - 1]); 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_bcb->con_state != BNEP_STATE_CONN_SETUP || 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD))) 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_STATE); 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_TRACE_API2 ("BNEP_ConnectResp() for handle %d, responce %d", handle, resp); 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Form appropriate responce based on profile responce */ 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (resp == BNEP_CONN_FAILED_SRC_UUID) resp_code = BNEP_SETUP_INVALID_SRC_UUID; 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (resp == BNEP_CONN_FAILED_DST_UUID) resp_code = BNEP_SETUP_INVALID_DEST_UUID; 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (resp == BNEP_CONN_FAILED_UUID_SIZE) resp_code = BNEP_SETUP_INVALID_UUID_SIZE; 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (resp == BNEP_SUCCESS) resp_code = BNEP_SETUP_CONN_OK; 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else resp_code = BNEP_SETUP_CONN_NOT_ALLOWED; 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_send_conn_responce (p_bcb, resp_code); 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD); 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (resp == BNEP_SUCCESS) 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_connected (p_bcb); 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED) 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Restore the original parameters */ 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->con_state = BNEP_STATE_CONNECTED; 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD); 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID)); 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID)); 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Process remaining part of the setup message (extension headers) */ 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_bcb->p_pending_data) 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 extension_present = TRUE, *p, ext_type; 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 rem_len; 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rem_len = p_bcb->p_pending_data->len; 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = (UINT8 *)(p_bcb->p_pending_data + 1) + p_bcb->p_pending_data->offset; 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while (extension_present && p && rem_len) 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ext_type = *p++; 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach extension_present = ext_type >> 7; 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ext_type &= 0x7F; 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if unknown extension present stop processing */ 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (ext_type) 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = bnep_process_control_packet (p_bcb, p, &rem_len, TRUE); 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf (p_bcb->p_pending_data); 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->p_pending_data = NULL; 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SUCCESS); 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_Disconnect 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called to close the specified connection. 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: handle - handle of the connection 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BNEP_SUCCESS if connection is disconnected 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_WRONG_HANDLE if no connection is not found 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 318e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_Disconnect (UINT16 handle) 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBNEP_CONN *p_bcb; 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_HANDLE); 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb = &(bnep_cb.bcb[handle - 1]); 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_bcb->con_state == BNEP_STATE_IDLE) 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_HANDLE); 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_TRACE_API1 ("BNEP_Disconnect() for handle %d", handle); 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_DisconnectReq (p_bcb->l2cap_cid); 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnepu_release_bcb (p_bcb); 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SUCCESS); 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_WriteBuf 343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function sends data in a GKI buffer on BNEP connection 345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: handle - handle of the connection to write 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_dest_addr - BD_ADDR/Ethernet addr of the destination 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_buf - pointer to address of buffer with data 349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** protocol - protocol type of the packet 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_src_addr - (optional) BD_ADDR/ethernet address of the source 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** (should be NULL if it is local BD Addr) 352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** fw_ext_present - forwarded extensions present 353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns: BNEP_WRONG_HANDLE - if passed handle is not valid 355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_MTU_EXCEDED - If the data length is greater than MTU 356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_IGNORE_CMD - If the packet is filtered out 357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_Q_SIZE_EXCEEDED - If the Tx Q is full 358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_SUCCESS - If written successfully 359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 361e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_WriteBuf (UINT16 handle, 362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_dest_addr, 363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_buf, 364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 protocol, 365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_src_addr, 366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN fw_ext_present) 367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBNEP_CONN *p_bcb; 369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_data; 370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf (p_buf); 374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_HANDLE); 375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb = &(bnep_cb.bcb[handle - 1]); 378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check MTU size */ 379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_buf->len > BNEP_MTU_SIZE) 380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_TRACE_ERROR2 ("BNEP_Write() length %d exceeded MTU %d", p_buf->len, BNEP_MTU_SIZE); 382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf (p_buf); 383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_MTU_EXCEDED); 384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check if the packet should be filtered out */ 387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data = (UINT8 *)(p_buf + 1) + p_buf->offset; 388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bnep_is_packet_allowed (p_bcb, p_dest_addr, protocol, fw_ext_present, p_data) != BNEP_SUCCESS) 389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* 391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ** If packet is filtered and ext headers are present 392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ** drop the data and forward the ext headers 393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach */ 394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (fw_ext_present) 395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 ext, length; 397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 org_len, new_len; 398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* parse the extension headers and findout the new packet len */ 399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach org_len = p_buf->len; 400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_len = 0; 401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach do { 402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ext = *p_data++; 404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach length = *p_data++; 405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data += length; 406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_len += (length + 2); 408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (new_len > org_len) 410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf (p_buf); 412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_IGNORE_CMD; 413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } while (ext & 0x80); 416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (protocol != BNEP_802_1_P_PROTOCOL) 418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach protocol = 0; 419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_len += 4; 422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data[2] = 0; 423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data[3] = 0; 424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->len = new_len; 426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf (p_buf); 430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_IGNORE_CMD; 431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check transmit queue */ 435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_bcb->xmit_q.count >= BNEP_MAX_XMITQ_DEPTH) 436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf (p_buf); 438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_Q_SIZE_EXCEEDED); 439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Build the BNEP header */ 442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnepu_build_bnep_hdr (p_bcb, p_buf, protocol, p_src_addr, p_dest_addr, fw_ext_present); 443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Send the data or queue it up */ 445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnepu_check_send_packet (p_bcb, p_buf); 446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SUCCESS); 448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_Write 454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function sends data over a BNEP connection 456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: handle - handle of the connection to write 458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_dest_addr - BD_ADDR/Ethernet addr of the destination 459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_data - pointer to data start 460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** protocol - protocol type of the packet 461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_src_addr - (optional) BD_ADDR/ethernet address of the source 462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** (should be NULL if it is local BD Addr) 463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** fw_ext_present - forwarded extensions present 464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns: BNEP_WRONG_HANDLE - if passed handle is not valid 466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_MTU_EXCEDED - If the data length is greater than MTU 467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_IGNORE_CMD - If the packet is filtered out 468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_Q_SIZE_EXCEEDED - If the Tx Q is full 469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_NO_RESOURCES - If not able to allocate a buffer 470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_SUCCESS - If written successfully 471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 473e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_Write (UINT16 handle, 474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_dest_addr, 475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_data, 476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 len, 477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 protocol, 478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_src_addr, 479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN fw_ext_present) 480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_buf; 482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBNEP_CONN *p_bcb; 483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p; 484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check MTU size. Consider the possibility of having extension headers */ 486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (len > BNEP_MTU_SIZE) 487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_TRACE_ERROR2 ("BNEP_Write() length %d exceeded MTU %d", len, BNEP_MTU_SIZE); 489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_MTU_EXCEDED); 490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_HANDLE); 494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb = &(bnep_cb.bcb[handle - 1]); 496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check if the packet should be filtered out */ 498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bnep_is_packet_allowed (p_bcb, p_dest_addr, protocol, fw_ext_present, p_data) != BNEP_SUCCESS) 499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* 501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ** If packet is filtered and ext headers are present 502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ** drop the data and forward the ext headers 503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach */ 504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (fw_ext_present) 505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 ext, length; 507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 org_len, new_len; 508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* parse the extension headers and findout the new packet len */ 509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach org_len = len; 510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_len = 0; 511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = p_data; 512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach do { 513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ext = *p_data++; 515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach length = *p_data++; 516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data += length; 517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_len += (length + 2); 519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (new_len > org_len) 521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_IGNORE_CMD; 522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } while (ext & 0x80); 524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (protocol != BNEP_802_1_P_PROTOCOL) 526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach protocol = 0; 527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach new_len += 4; 530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data[2] = 0; 531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data[3] = 0; 532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach len = new_len; 534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data = p; 535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_IGNORE_CMD; 538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check transmit queue */ 541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_bcb->xmit_q.count >= BNEP_MAX_XMITQ_DEPTH) 542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_Q_SIZE_EXCEEDED); 543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Get a buffer to copy teh data into */ 545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL) 546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_TRACE_ERROR0 ("BNEP_Write() not able to get buffer"); 548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_NO_RESOURCES); 549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->len = len; 552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->offset = BNEP_MINIMUM_OFFSET; 553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = (UINT8 *)(p_buf + 1) + BNEP_MINIMUM_OFFSET; 554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p, p_data, len); 556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Build the BNEP header */ 558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnepu_build_bnep_hdr (p_bcb, p_buf, protocol, p_src_addr, p_dest_addr, fw_ext_present); 559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Send the data or queue it up */ 561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnepu_check_send_packet (p_bcb, p_buf); 562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SUCCESS); 564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_SetProtocolFilters 570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function sets the protocol filters on peer device 572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: handle - Handle for the connection 574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** num_filters - total number of filter ranges 575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_start_array - Array of beginings of all protocol ranges 576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_end_array - Array of ends of all protocol ranges 577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BNEP_WRONG_HANDLE - if the connection handle is not valid 579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_SET_FILTER_FAIL - if the connection is in wrong state 580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_TOO_MANY_FILTERS - if too many filters 581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_SUCCESS - if request sent successfully 582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 584e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_SetProtocolFilters (UINT16 handle, 585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 num_filters, 586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 *p_start_array, 587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 *p_end_array) 588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE) 590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 xx; 591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBNEP_CONN *p_bcb; 592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_HANDLE); 595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb = &(bnep_cb.bcb[handle - 1]); 597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check the connection state */ 599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_STATE); 602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Validate the parameters */ 604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (num_filters && (!p_start_array || !p_end_array)) 605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SET_FILTER_FAIL); 606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (num_filters > BNEP_MAX_PROT_FILTERS) 608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_TOO_MANY_FILTERS); 609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Fill the filter values in connnection block */ 611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (xx = 0; xx < num_filters; xx++) 612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->sent_prot_filter_start[xx] = *p_start_array++; 614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->sent_prot_filter_end[xx] = *p_end_array++; 615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->sent_num_filters = num_filters; 618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnepu_send_peer_our_filters (p_bcb); 620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SUCCESS); 622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SET_FILTER_FAIL); 624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_SetMulticastFilters 631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function sets the filters for multicast addresses for BNEP. 633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: handle - Handle for the connection 635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** num_filters - total number of filter ranges 636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_start_array - Pointer to sequence of beginings of all 637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** multicast address ranges 638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_end_array - Pointer to sequence of ends of all 639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** multicast address ranges 640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BNEP_WRONG_HANDLE - if the connection handle is not valid 642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_SET_FILTER_FAIL - if the connection is in wrong state 643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_TOO_MANY_FILTERS - if too many filters 644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_SUCCESS - if request sent successfully 645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 647e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_SetMulticastFilters (UINT16 handle, 648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 num_filters, 649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_start_array, 650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_end_array) 651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE) 653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 xx; 654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBNEP_CONN *p_bcb; 655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_HANDLE); 658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb = &(bnep_cb.bcb[handle - 1]); 660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check the connection state */ 662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_STATE); 665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Validate the parameters */ 667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (num_filters && (!p_start_array || !p_end_array)) 668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SET_FILTER_FAIL); 669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (num_filters > BNEP_MAX_MULTI_FILTERS) 671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_TOO_MANY_FILTERS); 672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Fill the multicast filter values in connnection block */ 674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (xx = 0; xx < num_filters; xx++) 675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_bcb->sent_mcast_filter_start[xx], p_start_array, BD_ADDR_LEN); 677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_bcb->sent_mcast_filter_end[xx], p_end_array, BD_ADDR_LEN); 678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_start_array += BD_ADDR_LEN; 680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_end_array += BD_ADDR_LEN; 681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb->sent_mcast_filters = num_filters; 684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnepu_send_peer_our_multi_filters (p_bcb); 686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SUCCESS); 688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_SET_FILTER_FAIL); 690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_GetMyBdAddr 697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function returns a pointer to the local device BD address. 699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** If the BD address has not been read yet, it returns NULL. 700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns the BD address 702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 704e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 *BNEP_GetMyBdAddr (void) 705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bnep_cb.got_my_bd_addr) 707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (bnep_cb.my_bda); 708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (NULL); 710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_SetTraceLevel 715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function sets the trace level for BNEP. If called with 717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** a value of 0xFF, it simply reads the current trace level. 718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns the new (current) trace level 720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 722e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 BNEP_SetTraceLevel (UINT8 new_level) 723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (new_level != 0xFF) 725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bnep_cb.trace_level = new_level; 726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (bnep_cb.trace_level); 728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BNEP_GetStatus 734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function gets the status information for BNEP connection 736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BNEP_SUCCESS - if the status is available 738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_NO_RESOURCES - if no structure is passed for output 739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_WRONG_HANDLE - if the handle is invalid 740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BNEP_WRONG_STATE - if not in connected state 741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 743e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_GetStatus (UINT16 handle, tBNEP_STATUS *p_status) 744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (BNEP_SUPPORTS_STATUS_API) && BNEP_SUPPORTS_STATUS_API == TRUE) 746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBNEP_CONN *p_bcb; 747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_status) 749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_NO_RESOURCES; 750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!handle) || (handle > BNEP_MAX_CONNECTIONS)) 752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_WRONG_HANDLE); 753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bcb = &(bnep_cb.bcb[handle - 1]); 755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (p_status, 0, sizeof (tBNEP_STATUS)); 757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_bcb->con_state != BNEP_STATE_CONNECTED) && 758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED))) 759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_WRONG_STATE; 760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Read the status parameters from the connection control block */ 762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_status->con_status = BNEP_STATUS_CONNECTED; 763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_status->l2cap_cid = p_bcb->l2cap_cid; 764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_status->rem_mtu_size = p_bcb->rem_mtu_size; 765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_status->xmit_q_depth = p_bcb->xmit_q.count; 766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_status->sent_num_filters = p_bcb->sent_num_filters; 767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_status->sent_mcast_filters = p_bcb->sent_mcast_filters; 768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_status->rcvd_num_filters = p_bcb->rcvd_num_filters; 769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_status->rcvd_mcast_filters = p_bcb->rcvd_mcast_filters; 770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_status->rem_bda, p_bcb->rem_bda, BD_ADDR_LEN); 772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (&(p_status->src_uuid), &(p_bcb->src_uuid), sizeof (tBT_UUID)); 773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (&(p_status->dst_uuid), &(p_bcb->dst_uuid), sizeof (tBT_UUID)); 774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BNEP_SUCCESS; 776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (BNEP_IGNORE_CMD); 778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 782