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