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 functions callable by an application 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * running on top of RFCOMM 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfcdefs.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_int.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#if RFC_DYNAMIC_MEMORY == FALSE 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttRFC_CB rfc_cb; 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_StartReq 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles Start Request from the upper layer. 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If RFCOMM multiplexer channel can not be allocated 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** send start not accepted confirmation. Otherwise dispatch 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** start event to the state machine. 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_StartReq (tRFC_MCB *p_mcb) 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_START_REQ, NULL); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 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** Function RFCOMM_StartRsp 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function handles Start Response from the upper layer. 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Save upper layer handle and result of the Start Indication 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in the control block and dispatch event to the FSM. 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_StartRsp (tRFC_MCB *p_mcb, UINT16 result) 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_START_RSP, &result); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_DlcEstablishReq 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the user app to establish 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection with the specific dlci on a specific bd device. 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It will allocate RFCOMM connection control block if not 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allocated before and dispatch open event to the state 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** machine. 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 855cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(mtu); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->state != RFC_MX_STATE_CONNECTED) 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_DlcEstablishCnf (p_mcb, dlci, 0, RFCOMM_ERROR); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_sm_execute(p_port, RFC_EVENT_OPEN, NULL); 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_DlcEstablishRsp 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the port emulation entity 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** acks Establish Indication. 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_DlcEstablishRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result) 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 1085cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(mtu); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_mcb->state != RFC_MX_STATE_CONNECTED) && (result == RFCOMM_SUCCESS)) 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_DlcReleaseInd (p_mcb, dlci); 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_sm_execute(p_port, RFC_EVENT_ESTABLISH_RSP, &result); 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_ParNegReq 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the user app to start 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** DLC parameter negotiation. Port emulation can send this 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** request before actually establishing the DLC. In this 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** case the function will allocate RFCOMM connection control 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** block. 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_ParNegReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 flow; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cl; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 k; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->state != RFC_MX_STATE_CONNECTED) 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->error = PORT_PAR_NEG_FAILED; 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Negotiate the flow control mechanism. If flow control mechanism for */ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mux has not been set yet, use our default value. If it has been set, */ 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use that value. */ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flow = (p_mcb->flow == PORT_FC_UNDEFINED) ? PORT_FC_DEFAULT : p_mcb->flow; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set convergence layer and number of credits (k) */ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (flow == PORT_FC_CREDIT) 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cl = RFCOMM_PN_CONV_LAYER_CBFC_I; 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project k = (p_port->credit_rx_max < RFCOMM_K_MAX) ? p_port->credit_rx_max : RFCOMM_K_MAX; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->credit_rx = k; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cl = RFCOMM_PN_CONV_LAYER_TYPE_1; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project k = 0; 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send Parameter Negotiation Command UIH frame */ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.expected_rsp |= RFC_RSP_PN; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_pn (p_mcb, dlci, TRUE, mtu, cl, k); 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; 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 RFCOMM_ParNegRsp 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the user app to acknowledge 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** DLC parameter negotiation. 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_ParNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->state != RFC_MX_STATE_CONNECTED) 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send Parameter Negotiation Response UIH frame */ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_pn (p_mcb, dlci, FALSE, mtu, cl, k); 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_PortNegReq 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the user app to start 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Remote Port parameter negotiation. Port emulation can 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** send this request before actually establishing the DLC. 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** In this case the function will allocate RFCOMM connection 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** control block. 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_PortNegReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->state != RFC_MX_STATE_CONNECTED) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_PortNegCnf (p_mcb, dlci, NULL, RFCOMM_ERROR); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send Parameter Negotiation Command UIH frame */ 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_pars) 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.expected_rsp |= RFC_RSP_RPN_REPLY; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.expected_rsp |= RFC_RSP_RPN; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_rpn (p_mcb, dlci, TRUE, p_pars, RFCOMM_RPN_PM_MASK); 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_PortNegRsp 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the user app to acknowledge 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Port parameters negotiation. 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_PortNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 param_mask) 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->state != RFC_MX_STATE_CONNECTED) 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_rpn (p_mcb, dlci, FALSE, p_pars, param_mask); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_ControlReq 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the port entity to send control 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** parameters to remote port emulation entity. 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_ControlReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars) 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->state != PORT_STATE_OPENED) 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_port->rfc.state != RFC_STATE_OPENED)) 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->port_ctrl |= PORT_CTRL_REQ_SENT; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.expected_rsp |= RFC_RSP_MSC; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_msc (p_mcb, dlci, TRUE, p_pars); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_FlowReq 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the port entity when flow 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** control state has changed. Enable flag passed shows if 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** port can accept more data. 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_FlowReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 enable) 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->state != PORT_STATE_OPENED) 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_port->rfc.state != RFC_STATE_OPENED)) 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->local_ctrl.fc = !enable; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.expected_rsp |= RFC_RSP_MSC; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_msc (p_mcb, dlci, TRUE, &p_port->local_ctrl); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_LineStatusReq 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the port entity when line 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** status should be delivered to the peer. 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_LineStatusReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 status) 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->state != PORT_STATE_OPENED) 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_port->rfc.state != RFC_STATE_OPENED)) 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.expected_rsp |= RFC_RSP_RLS; 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_rls (p_mcb, dlci, TRUE, status); 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_timer_start (p_port, RFC_T2_TIMEOUT); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_DlcReleaseReq 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the PORT unit to close DLC 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_DlcReleaseReq (tRFC_MCB *p_mcb, UINT8 dlci) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_sm_execute(port_find_mcb_dlci_port (p_mcb, dlci), RFC_EVENT_CLOSE, 0); 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function RFCOMM_DataReq 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the user app to send data buffer 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid RFCOMM_DataReq (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_sm_execute(port_find_mcb_dlci_port (p_mcb, dlci), RFC_EVENT_DATA, p_buf); 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 342