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