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