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 state machine and action routines for multiplexer
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  channel of the RFCOMM unit
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfcdefs.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_int.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfc_int.h"
345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define L2CAP_SUCCESS   0
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define L2CAP_ERROR     1
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
415738f83aeb59361a0a2eda2460113f6dc919427The 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            */
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_sm_state_idle (tRFC_MCB *p_mcb, UINT16 event, void *p_data);
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data);
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_sm_state_configure (tRFC_MCB *p_mcb, UINT16 event, void *p_data);
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_sm_sabme_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data);
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_sm_state_wait_sabme (tRFC_MCB *p_mcb, UINT16 event, void *p_data);
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_sm_state_connected (tRFC_MCB *p_mcb, UINT16 event, void *p_data);
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_sm_state_disc_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data);
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_send_config_req (tRFC_MCB *p_mcb);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_conf_ind (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg);
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_conf_cnf (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_sm_execute
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends multiplexor events through the state
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  machine.
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_mx_sm_execute (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_mcb->state)
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_STATE_IDLE:
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_state_idle (p_mcb, event, p_data);
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_STATE_WAIT_CONN_CNF:
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_state_wait_conn_cnf (p_mcb, event, p_data);
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_STATE_CONFIGURE:
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_state_configure (p_mcb, event, p_data);
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_STATE_SABME_WAIT_UA:
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_sabme_wait_ua (p_mcb, event, p_data);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_STATE_WAIT_SABME:
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_state_wait_sabme (p_mcb, event, p_data);
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_STATE_CONNECTED:
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_state_connected (p_mcb, event, p_data);
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_STATE_DISC_WAIT_UA:
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_state_disc_wait_ua (p_mcb, event, p_data);
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_sm_state_idle
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the multiplexer is in
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  IDLE state. This state exists when connection is being
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  initially established.
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_mx_sm_state_idle (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
116d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_idle - evt:%d", event);
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_START_REQ:
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Initialize L2CAP MTU */
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->peer_l2cap_mtu = L2CAP_DEFAULT_MTU - RFCOMM_MIN_OFFSET - 1;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_mcb->lcid = L2CA_ConnectReq (BT_PSM_RFCOMM, p_mcb->bd_addr)) == 0)
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PORT_StartCnf (p_mcb, RFCOMM_ERROR);
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Save entry for quicker access to mcb based on the LCID */
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_save_lcid_mcb (p_mcb, p_mcb->lcid);
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_WAIT_CONN_CNF;
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_START_RSP:
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONN_CNF:
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_IND:
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_CNF:
139d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati        RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONN_IND:
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_timer_start (p_mcb, RFCOMM_CONN_TIMEOUT);
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_ConnectRsp (p_mcb->bd_addr, *((UINT8 *)p_data), p_mcb->lcid, L2CAP_CONN_OK, 0);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_send_config_req (p_mcb);
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_CONFIGURE;
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_SABME:
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_UA:
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_DM:
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_DISC:
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_send_dm (p_mcb, RFCOMM_MX_DLCI, TRUE);
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_UIH:
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_send_dm (p_mcb, RFCOMM_MX_DLCI, FALSE);
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
167d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_sm_state_wait_conn_cnf
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the multiplexer is
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  waiting for Connection Confirm from L2CAP.
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
183d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_wait_conn_cnf - evt:%d", event);
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_START_REQ:
187d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati        RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is some new timing so that Config Ind comes before security is completed
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       so we are still waiting fo the confirmation. */
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_IND:
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_conf_ind (p_mcb, (tL2CAP_CFG_INFO *)p_data);
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONN_CNF:
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*((UINT16 *)p_data) != L2CAP_SUCCESS)
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->state = RFC_MX_STATE_IDLE;
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PORT_StartCnf (p_mcb, *((UINT16 *)p_data));
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_CONFIGURE;
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_send_config_req (p_mcb);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_DISC_IND:
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_CloseInd (p_mcb);
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_TIMEOUT:
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectReq (p_mcb->lcid);
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we gave up outgoing connection request then try peer's request */
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mcb->pending_lcid)
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16 i;
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8  idx;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
223d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati            RFCOMM_TRACE_DEBUG ("RFCOMM MX retry as acceptor in collision case - evt:%d in state:%d", event, p_mcb->state);
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_save_lcid_mcb (NULL, p_mcb->lcid);
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->lcid = p_mcb->pending_lcid;
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_save_lcid_mcb (p_mcb, p_mcb->lcid);
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->is_initiator = FALSE;
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* update direction bit */
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0; i < RFCOMM_MAX_DLCI; i += 2)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((idx = p_mcb->port_inx[i]) != 0)
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_mcb->port_inx[i] = 0;
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_mcb->port_inx[i+1] = idx;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rfc_cb.port.port[idx - 1].dlci += 1;
239d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati                    RFCOMM_TRACE_DEBUG ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CONN_IND, &(p_mcb->pending_id));
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PORT_CloseInd (p_mcb);
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
251d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_sm_state_configure
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the multiplexer in the
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  configuration state.
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_mx_sm_state_configure (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
267d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_configure - evt:%d", event);
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_START_REQ:
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONN_CNF:
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
273d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati        RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_IND:
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_conf_ind (p_mcb, (tL2CAP_CFG_INFO *)p_data);
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_CNF:
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_conf_cnf (p_mcb, (tL2CAP_CFG_INFO *)p_data);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_DISC_IND:
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_CloseInd (p_mcb);
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_TIMEOUT:
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectReq (p_mcb->lcid);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_StartCnf (p_mcb, RFCOMM_ERROR);
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
296d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_sm_sabme_wait_ua
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the multiplexer sent
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  SABME and is waiting for UA reply.
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_mx_sm_sabme_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3125cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
3135cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
314d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_sm_sabme_wait_ua - evt:%d", event);
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_START_REQ:
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONN_CNF:
319d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati        RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* workaround: we don't support reconfig */
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* commented out until we support reconfig
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_IND:
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_conf_ind (p_mcb, (tL2CAP_CFG_INFO *)p_data);
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_CNF:
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_conf_cnf (p_mcb, (tL2CAP_CFG_INFO *)p_data);
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_DISC_IND:
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_CloseInd (p_mcb);
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_UA:
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_timer_stop (p_mcb);
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state      = RFC_MX_STATE_CONNECTED;
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->peer_ready = TRUE;
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_StartCnf (p_mcb, RFCOMM_SUCCESS);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_DM:
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_timer_stop (p_mcb);
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Case falls through */
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_IND: /* workaround: we don't support reconfig */
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_CNF: /* workaround: we don't support reconfig */
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_TIMEOUT:
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectReq (p_mcb->lcid);
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_StartCnf (p_mcb, RFCOMM_ERROR);
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
360d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_sm_state_wait_sabme
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the multiplexer is
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  waiting for SABME on the acceptor side after configuration
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_mx_sm_state_wait_sabme (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
375d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_wait_sabme - evt:%d", event);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_DISC_IND:
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_CloseInd (p_mcb);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_SABME:
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we gave up outgoing connection request */
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mcb->pending_lcid)
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->pending_lcid = 0;
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_send_ua (p_mcb, RFCOMM_MX_DLCI);
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_timer_stop (p_mcb);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->state      = RFC_MX_STATE_CONNECTED;
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->peer_ready = TRUE;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* MX channel collision has been resolved, continue to open ports */
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PORT_StartCnf (p_mcb, RFCOMM_SUCCESS);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_timer_stop (p_mcb);
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PORT_StartInd (p_mcb);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_START_RSP:
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*((UINT16 *)p_data) != RFCOMM_SUCCESS)
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_send_dm (p_mcb, RFCOMM_MX_DLCI, TRUE);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_send_ua (p_mcb, RFCOMM_MX_DLCI);
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->state      = RFC_MX_STATE_CONNECTED;
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->peer_ready = TRUE;
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_IND: /* workaround: we don't support reconfig */
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CONF_CNF: /* workaround: we don't support reconfig */
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_TIMEOUT:
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectReq (p_mcb->lcid);
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_CloseInd (p_mcb);
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
426d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_sm_state_connected
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the multiplexer is
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  in the CONNECTED state
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_mx_sm_state_connected (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4425cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
4435cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
444d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_connected - evt:%d", event);
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_TIMEOUT:
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CLOSE_REQ:
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_timer_start (p_mcb, RFC_DISC_TIMEOUT);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_DISC_WAIT_UA;
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_send_disc (p_mcb, RFCOMM_MX_DLCI);
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_DISC_IND:
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_CloseInd (p_mcb);
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_DISC:
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Reply with UA.  If initiator bring down L2CAP connection */
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If server wait for some time if client decide to reinitiate channel */
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_send_ua (p_mcb, RFCOMM_MX_DLCI);
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mcb->is_initiator)
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_DisconnectReq (p_mcb->lcid);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* notify all ports that connection is gone */
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_CloseInd (p_mcb);
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
472d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_sm_state_disc_wait_ua
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles events when the multiplexer sent
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  DISC and is waiting for UA reply.
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_mx_sm_state_disc_wait_ua (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
490d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_disc_wait_ua - evt:%d", event);
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_UA:
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_DM:
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_TIMEOUT:
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectReq (p_mcb->lcid);
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mcb->restart_required)
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Start Request was received while disconnecting.  Execute it again */
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_mcb->lcid = L2CA_ConnectReq (BT_PSM_RFCOMM, p_mcb->bd_addr)) == 0)
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                PORT_StartCnf (p_mcb, RFCOMM_ERROR);
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Save entry for quicker access to mcb based on the LCID */
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_save_lcid_mcb (p_mcb, p_mcb->lcid);
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* clean up before reuse it */
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while ((p_buf = (BT_HDR *)GKI_dequeue(&p_mcb->cmd_q)) != NULL)
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf(p_buf);
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_timer_start (p_mcb, RFC_MCB_INIT_INACT_TIMER);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->is_initiator     = TRUE;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->restart_required = FALSE;
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->local_cfg_sent   = FALSE;
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->peer_cfg_rcvd    = FALSE;
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->state = RFC_MX_STATE_WAIT_CONN_CNF;
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_release_multiplexer_channel (p_mcb);
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_DISC:
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_send_ua (p_mcb, RFCOMM_MX_DLCI);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_EVENT_UIH:
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_data);
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_send_dm (p_mcb, RFCOMM_MX_DLCI, FALSE);
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_START_REQ:
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->restart_required = TRUE;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_DISC_IND:
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->state = RFC_MX_STATE_IDLE;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PORT_CloseInd (p_mcb);
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_CLOSE_REQ:
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case RFC_MX_EVENT_QOS_VIOLATION_IND:
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
550d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_send_config_req
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles L2CA_ConnectInd message from the
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  L2CAP.  Accept connection.
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_send_config_req (tRFC_MCB *p_mcb)
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2CAP_CFG_INFO cfg;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
566d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_send_config_req");
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&cfg, 0, sizeof (tL2CAP_CFG_INFO));
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.mtu_present      = TRUE;
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.mtu              = L2CAP_MTU_SIZE;
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Defaults set by memset
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.flush_to_present = FALSE;
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.qos_present      = FALSE;
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.fcr_present      = FALSE;
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.fcr.mode         = L2CAP_FCR_BASIC_MODE;
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.fcs_present      = FALSE;
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.fcs              = N/A when fcs_present is FALSE;
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_ConfigReq (p_mcb->lcid, &cfg);
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_conf_cnf
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles L2CA_ConfigCnf message from the
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  L2CAP.  If result is not success tell upper layer that
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  start has not been accepted.  If initiator send SABME
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on DLCI 0.  T1 is still running.
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_conf_cnf (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg)
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
597d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati    RFCOMM_TRACE_EVENT ("rfc_mx_conf_cnf p_cfg:%08x res:%d ", p_cfg, (p_cfg) ? p_cfg->result : 0);
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->result != L2CAP_CFG_OK)
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mcb->is_initiator)
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PORT_StartCnf (p_mcb, p_cfg->result);
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_DisconnectReq (p_mcb->lcid);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_release_multiplexer_channel (p_mcb);
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_mcb->local_cfg_sent = TRUE;
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_mcb->state == RFC_MX_STATE_CONFIGURE) && p_mcb->peer_cfg_rcvd)
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mcb->is_initiator)
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->state = RFC_MX_STATE_SABME_WAIT_UA;
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_send_sabme (p_mcb, RFCOMM_MX_DLCI);
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_timer_start (p_mcb, RFC_T1_TIMEOUT);
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->state = RFC_MX_STATE_WAIT_SABME;
6225acd502368d1eb3fc445d6787a1d7d64d45d0a5ckschulz            rfc_timer_start (p_mcb, RFCOMM_CONN_TIMEOUT); /* - increased from T2=20 to CONN=120
6235acd502368d1eb3fc445d6787a1d7d64d45d0a5ckschulz                                                to allow the user more than 10 sec to type in the
6245acd502368d1eb3fc445d6787a1d7d64d45d0a5ckschulz                                                pin which can be e.g. 16 digits */
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_mx_conf_ind
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles L2CA_ConfigInd message from the
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  L2CAP.  Send the L2CA_ConfigRsp message.
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void rfc_mx_conf_ind (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg)
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save peer L2CAP MTU if present */
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* RFCOMM adds 3-4 bytes in the beginning and 1 bytes FCS */
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->mtu_present)
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->peer_l2cap_mtu = p_cfg->mtu - RFCOMM_MIN_OFFSET - 1;
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->peer_l2cap_mtu = L2CAP_DEFAULT_MTU - RFCOMM_MIN_OFFSET - 1;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->mtu_present      = FALSE;
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->flush_to_present = FALSE;
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->qos_present      = FALSE;
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->result = L2CAP_CFG_OK;
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_ConfigRsp (p_mcb->lcid, p_cfg);
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_mcb->peer_cfg_rcvd = TRUE;
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_mcb->state == RFC_MX_STATE_CONFIGURE) && p_mcb->local_cfg_sent)
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mcb->is_initiator)
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->state = RFC_MX_STATE_SABME_WAIT_UA;
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_send_sabme (p_mcb, RFCOMM_MX_DLCI);
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_timer_start (p_mcb, RFC_T1_TIMEOUT);
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->state = RFC_MX_STATE_WAIT_SABME;
6675acd502368d1eb3fc445d6787a1d7d64d45d0a5ckschulz            rfc_timer_start (p_mcb, RFCOMM_CONN_TIMEOUT); /* - increased from T2=20 to CONN=120
6685acd502368d1eb3fc445d6787a1d7d64d45d0a5ckschulz                                                to allow the user more than 10 sec to type in the
6695acd502368d1eb3fc445d6787a1d7d64d45d0a5ckschulz                                                pin which can be e.g. 16 digits */
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
673