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