15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-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 SDP functions
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
305cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.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 "sdp_api.h"
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpint.h"
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*                       G L O B A L      S D P       D A T A                   */
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_DYNAMIC_MEMORY == FALSE
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSDP_CB  sdp_cb;
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
545738f83aeb59361a0a2eda2460113f6dc919427The 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            */
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_connect_ind (BD_ADDR  bd_addr, UINT16 l2cap_cid, UINT16 psm,
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             UINT8 l2cap_id);
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed);
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg);
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_connect_cfm (UINT16 l2cap_cid, UINT16 result);
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_disconnect_cfm (UINT16 l2cap_cid, UINT16 result);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define sdp_connect_cfm     NULL
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define sdp_disconnect_cfm  NULL
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_init
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function initializes the SDP unit.
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdp_init (void)
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Clears all structures and local SDP database (if Server is enabled) */
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&sdp_cb, 0, sizeof (tSDP_CB));
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize the L2CAP configuration. We only care about MTU and flush */
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.l2cap_my_cfg.mtu_present       = TRUE;
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.l2cap_my_cfg.mtu               = SDP_MTU_SIZE;
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.l2cap_my_cfg.flush_to_present  = TRUE;
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.l2cap_my_cfg.flush_to          = SDP_FLUSH_TO;
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.max_attr_list_size             = SDP_MTU_SIZE - 16;
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.max_recs_per_search            = SDP_MAX_DISC_SERVER_RECS;
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Register with Security Manager for the specific security level */
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SetSecurityLevel (FALSE, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER,
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               SDP_SECURITY_LEVEL, SDP_PSM, 0, 0))
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
100a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR ("Security Registration Server failed");
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Register with Security Manager for the specific security level */
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SetSecurityLevel (TRUE, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER,
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               SDP_SECURITY_LEVEL, SDP_PSM, 0, 0))
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
110a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR ("Security Registration for Client failed");
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(SDP_INITIAL_TRACE_LEVEL)
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.trace_level = SDP_INITIAL_TRACE_LEVEL;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.trace_level = BT_TRACE_LEVEL_NONE;    /* No traces */
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_ConnectInd_Cb = sdp_connect_ind;
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_ConnectCfm_Cb = sdp_connect_cfm;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_ConnectPnd_Cb = NULL;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_ConfigInd_Cb  = sdp_config_ind;
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_ConfigCfm_Cb  = sdp_config_cfm;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_DisconnectInd_Cb = sdp_disconnect_ind;
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_DisconnectCfm_Cb = sdp_disconnect_cfm;
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_QoSViolationInd_Cb = NULL;
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_DataInd_Cb = sdp_data_ind;
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_CongestionStatus_Cb = NULL;
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.reg_info.pL2CA_TxComplete_Cb       = NULL;
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Now, register with L2CAP */
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!L2CA_Register (SDP_PSM, &sdp_cb.reg_info))
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
136a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR ("SDP Registration failed");
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(SDP_DEBUG) && SDP_DEBUG == TRUE)
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_set_max_attr_list_size
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sets the max attribute list size to use
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 sdp_set_max_attr_list_size (UINT16 max_size)
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (max_size > (sdp_cb.l2cap_my_cfg.mtu - 16) )
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_size = sdp_cb.l2cap_my_cfg.mtu - 16;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_cb.max_attr_list_size  = max_size;
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return sdp_cb.max_attr_list_size;
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_connect_ind
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles an inbound connection indication
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from L2CAP. This is the case where we are acting as a
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  server.
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_connect_ind (BD_ADDR  bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id)
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1745cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(psm);
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_SERVER_ENABLED == TRUE
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB    *p_ccb;
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Allocate a new CCB. Return if none available. */
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = sdpu_allocate_ccb()) == NULL)
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Transition to the next appropriate state, waiting for config setup. */
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->con_state = SDP_STATE_CFG_SETUP;
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the BD Address and Channel ID. */
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (&p_ccb->device_address[0], bd_addr, sizeof (BD_ADDR));
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->connection_id = l2cap_cid;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send response to the L2CAP layer. */
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK);
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tL2CAP_CFG_INFO cfg = sdp_cb.l2cap_my_cfg;
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (cfg.fcr_present)
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
196a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_DEBUG("sdp_connect_ind:  mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit,
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        cfg.fcr.rtrans_tout,cfg.fcr.mon_tout, cfg.fcr.mps);
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((!L2CA_ConfigReq (l2cap_cid, &cfg)) && cfg.fcr_present
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             && cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* FCR not desired; try again in basic mode */
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cfg.fcr.mode = L2CAP_FCR_BASIC_MODE;
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cfg.fcr_present = FALSE;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_ConfigReq (l2cap_cid, &cfg);
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
211a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_EVENT ("SDP - Rcvd L2CAP conn ind, sent config req, CID 0x%x", p_ccb->connection_id);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* No server */
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Reject the connection */
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_NO_PSM, 0);
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_connect_cfm
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles the connect confirm events
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from L2CAP. This is the case when we are acting as a
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  client and have sent a connect request.
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_connect_cfm (UINT16 l2cap_cid, UINT16 result)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB    *p_ccb;
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CAP_CFG_INFO cfg;
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
238a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the connection response contains success status, then */
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Transition to the next state and startup the timer.      */
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == SDP_STATE_CONN_SETUP))
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->con_state = SDP_STATE_CFG_SETUP;
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cfg = sdp_cb.l2cap_my_cfg;
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (cfg.fcr_present)
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
252a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_DEBUG("sdp_connect_cfm:  mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit,
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        cfg.fcr.rtrans_tout,cfg.fcr.mon_tout, cfg.fcr.mps);
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((!L2CA_ConfigReq (l2cap_cid, &cfg)) && cfg.fcr_present
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             && cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* FCR not desired; try again in basic mode */
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cfg.fcr_present = FALSE;
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cfg.fcr.mode = L2CAP_FCR_BASIC_MODE;
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_ConfigReq (l2cap_cid, &cfg);
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
266a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_EVENT ("SDP - got conn cnf, sent cfg req, CID: 0x%x", p_ccb->connection_id);
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
270a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Rcvd conn cnf with error: 0x%x  CID 0x%x", result, p_ccb->connection_id);
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell the user if he has a callback */
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_cb || p_ccb->p_cb2)
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16 err = -1;
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((result == HCI_ERR_HOST_REJECT_SECURITY)
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (result == HCI_ERR_AUTH_FAILURE)
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (result == HCI_ERR_PAIRING_NOT_ALLOWED)
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (result == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED)
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (result == HCI_ERR_KEY_MISSING))
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                err = SDP_SECURITY_ERR;
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (result == HCI_ERR_HOST_REJECT_DEVICE)
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                err = SDP_CONN_REJECTED;
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                err = SDP_CONN_FAILED;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_ccb->p_cb)
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_ccb->p_cb)(err);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if(p_ccb->p_cb2)
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_ccb->p_cb2)(err, p_ccb->user_data);
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdpu_release_ccb (p_ccb);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* SDP_CLIENT_ENABLED == TRUE */
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_config_ind
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes the L2CAP configuration indication
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg)
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB    *p_ccb;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
315a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remember the remote MTU size */
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cfg->mtu_present)
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use min(L2CAP_DEFAULT_MTU,SDP_MTU_SIZE) for GKI buffer size reasons */
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->rem_mtu_size = (L2CAP_DEFAULT_MTU > SDP_MTU_SIZE)?SDP_MTU_SIZE:L2CAP_DEFAULT_MTU;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cfg->mtu > SDP_MTU_SIZE)
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->rem_mtu_size = SDP_MTU_SIZE;
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->rem_mtu_size = p_cfg->mtu;
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For now, always accept configuration from the other side */
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->flush_to_present = FALSE;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->mtu_present      = FALSE;
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->result           = L2CAP_CFG_OK;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check peer config request against our rfcomm configuration */
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->fcr_present)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Reject the window size if it is bigger than we want it to be */
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cfg->fcr.mode != L2CAP_FCR_BASIC_MODE)
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sdp_cb.l2cap_my_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && p_cfg->fcr.tx_win_sz > sdp_cb.l2cap_my_cfg.fcr.tx_win_sz)
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->fcr.tx_win_sz = sdp_cb.l2cap_my_cfg.fcr.tx_win_sz;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS;
349a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_DEBUG("sdp_config_ind(CONFIG) -> Please try again with SMALLER TX WINDOW");
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Reject if locally we want basic and they don't */
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sdp_cb.l2cap_my_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE)
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Ask for a new setup */
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS;
358a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_DEBUG("sdp_config_ind(CONFIG) -> Please try again with BASIC mode");
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Remain in configure state and give the peer our desired configuration */
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cfg->result != L2CAP_CFG_OK)
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
363a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                SDP_TRACE_WARNING ("SDP - Rcvd cfg ind, Unacceptable Parameters sent cfg cfm, CID: 0x%x", l2cap_cid);
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                L2CA_ConfigRsp (l2cap_cid, p_cfg);
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else    /* We agree with peer's request */
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cfg->fcr_present = FALSE;
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_ConfigRsp (l2cap_cid, p_cfg);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
374a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_EVENT ("SDP - Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->con_flags |= SDP_FLAGS_HIS_CFG_DONE;
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->con_flags & SDP_FLAGS_MY_CFG_DONE)
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->con_state = SDP_STATE_CONNECTED;
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG)
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sdp_disc_connected (p_ccb);
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Start inactivity timer */
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_SDP, SDP_INACT_TIMEOUT);
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_config_cfm
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes the L2CAP configuration confirmation
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg)
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB    *p_ccb;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
406a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_EVENT ("SDP - Rcvd cfg cfm, CID: 0x%x  Result: %d", l2cap_cid, p_cfg->result);
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
411a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For now, always accept configuration from the other side */
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->result == L2CAP_CFG_OK)
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->con_flags |= SDP_FLAGS_MY_CFG_DONE;
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->con_flags & SDP_FLAGS_HIS_CFG_DONE)
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->con_state = SDP_STATE_CONNECTED;
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG)
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_disc_connected (p_ccb);
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Start inactivity timer */
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_SDP, SDP_INACT_TIMEOUT);
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If peer has rejected FCR and suggested basic then try basic */
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cfg->fcr_present)
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tL2CAP_CFG_INFO cfg = sdp_cb.l2cap_my_cfg;
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cfg.fcr_present = FALSE;
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_ConfigReq (l2cap_cid, &cfg);
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Remain in configure state */
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_disconnect(p_ccb, SDP_CFG_FAILED);
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
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         sdp_disconnect_ind
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles a disconnect event from L2CAP. If
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  requested to, we ack the disconnect before dropping the CCB
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed)
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB    *p_ccb;
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
467a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ack_needed)
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectRsp (l2cap_cid);
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
474a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_EVENT ("SDP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell the user if he has a callback */
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_cb)
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_cb) ((UINT16) ((p_ccb->con_state == SDP_STATE_CONNECTED) ?
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        SDP_SUCCESS : SDP_CONN_FAILED));
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_ccb->p_cb2)
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_cb2) ((UINT16) ((p_ccb->con_state == SDP_STATE_CONNECTED) ?
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        SDP_SUCCESS : SDP_CONN_FAILED), p_ccb->user_data);
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdpu_release_ccb (p_ccb);
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_data_ind
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when data is received from L2CAP.
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if we are the originator of the connection, we are the SDP
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  client, and the received message is queued up for the client.
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If we are the destination of the connection, we are the SDP
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  server, so the message is passed to the server processing
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  function.
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg)
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB    *p_ccb;
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) != NULL)
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->con_state == SDP_STATE_CONNECTED)
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG)
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_disc_server_rsp (p_ccb, p_msg);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_server_handle_client_req (p_ccb, p_msg);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
519a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_WARNING ("SDP - Ignored L2CAP data while in state: %d, CID: 0x%x",
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                p_ccb->con_state, l2cap_cid);
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
525a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_freebuf (p_msg);
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_conn_originate
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called from the API to originate a
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection.
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB* sdp_conn_originate (UINT8 *p_bd_addr)
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB              *p_ccb;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                cid;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Allocate a new CCB. Return if none available. */
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = sdpu_allocate_ccb()) == NULL)
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
551a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - no spare CCB for orig");
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_EVENT ("SDP - Originate started");
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We are the originator of this connection */
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->con_flags |= SDP_FLAGS_IS_ORIG;
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the BD Address and Channel ID. */
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (&p_ccb->device_address[0], p_bd_addr, sizeof (BD_ADDR));
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Transition to the next appropriate state, waiting for connection confirm. */
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->con_state = SDP_STATE_CONN_SETUP;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef ANDROID_APP_INCLUDED  /* Skip for Android: Do not need to set out_service for sdp, since sdp does not use sec. Prevents over-writing service_rec of a connection already in progress */
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetOutService(p_bd_addr, BTM_SEC_SERVICE_SDP_SERVER, 0);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific --
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cid = L2CA_ConnectReq (SDP_PSM, p_bd_addr);
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if L2CAP started the connection process */
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (cid != 0)
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->connection_id = cid;
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p_ccb);
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
583a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Originate failed");
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdpu_release_ccb (p_ccb);
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_disconnect
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function disconnects a connection.
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdp_disconnect (tCONN_CB*p_ccb, UINT16 reason)
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(SDP_BROWSE_PLUS) && SDP_BROWSE_PLUS == TRUE)
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are browsing for multiple UUIDs ... */
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb->con_state == SDP_STATE_CONNECTED)
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     && (p_ccb->con_flags & SDP_FLAGS_IS_ORIG)
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     && ((reason == SDP_SUCCESS) || (reason == SDP_NO_RECS_MATCH)))
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the browse found something, do no more searching */
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ccb->cur_uuid_idx == 0) && (p_ccb->p_db->p_first_rec))
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->cur_uuid_idx = p_ccb->p_db->num_uuid_filters;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (++p_ccb->cur_uuid_idx < p_ccb->p_db->num_uuid_filters)
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check we have not already found the UUID (maybe through browse) */
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].len == 2)
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && (SDP_FindServiceInDb (p_ccb->p_db,
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].uu.uuid16,
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        NULL)))
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                continue;
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].len > 2)
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && (SDP_FindServiceUUIDInDb (p_ccb->p_db,
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], NULL)))
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                continue;
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->cur_handle = 0;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
627a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_EVENT ("SDP - looking for for more,  CID: 0x%x",
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_ccb->connection_id);
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sdp_disc_connected (p_ccb);
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((reason == SDP_NO_RECS_MATCH) && (p_ccb->p_db->p_first_rec))
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        reason = SDP_SUCCESS;
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
640a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_EVENT ("SDP - disconnect  CID: 0x%x", p_ccb->connection_id);
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we have a connection ID */
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->connection_id != 0)
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectReq (p_ccb->connection_id);
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->disconnect_reason = reason;
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If at setup state, we may not get callback ind from L2CAP */
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Call user callback immediately */
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->con_state == SDP_STATE_CONN_SETUP)
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Tell the user if he has a callback */
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_cb)
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_cb) (reason);
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_ccb->p_cb2)
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_ccb->p_cb2) (reason, p_ccb->user_data);
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdpu_release_ccb (p_ccb);
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**
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_disconnect_cfm
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles a disconnect confirm event from L2CAP.
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void sdp_disconnect_cfm (UINT16 l2cap_cid, UINT16 result)
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB    *p_ccb;
6765cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(result);
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
681a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
685a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_EVENT ("SDP - Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell the user if he has a callback */
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_cb)
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_cb) (p_ccb->disconnect_reason);
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_ccb->p_cb2)
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_cb2) (p_ccb->disconnect_reason, p_ccb->user_data);
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdpu_release_ccb (p_ccb);
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* SDP_CLIENT_ENABLED == TRUE */
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdp_conn_timeout
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes a timeout. Currently, we simply send
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a disconnect request to L2CAP.
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdp_conn_timeout (tCONN_CB*p_ccb)
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
711a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_EVENT ("SDP - CCB timeout in state: %d  CID: 0x%x",
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_ccb->con_state, p_ccb->connection_id);
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_DisconnectReq (p_ccb->connection_id);
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell the user if he has a callback */
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->p_cb)
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_cb) (SDP_CONN_FAILED);
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_ccb->p_cb2)
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_ccb->p_cb2) (SDP_CONN_FAILED, p_ccb->user_data);
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdpu_release_ccb (p_ccb);
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
728