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> 27258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_target.h" 29911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_utils.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "osi/include/osi.h" 32911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "port_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_int.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfc_int.h" 35911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "rfcdefs.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttRFC_CB rfc_cb; 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 40ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 41ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_StartReq 42ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function handles Start Request from the upper layer. 44ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If RFCOMM multiplexer channel can not be allocated 45ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * send start not accepted confirmation. Otherwise dispatch 46ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * start event to the state machine. 47ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 48ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_StartReq(tRFC_MCB* p_mcb) { 50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_mx_sm_execute(p_mcb, RFC_MX_EVENT_START_REQ, NULL); 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_StartRsp 56ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 57ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function handles Start Response from the upper layer. 58ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Save upper layer handle and result of the Start Indication 59ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * in the control block and dispatch event to the FSM. 60ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 61ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_StartRsp(tRFC_MCB* p_mcb, uint16_t result) { 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_mx_sm_execute(p_mcb, RFC_MX_EVENT_START_RSP, &result); 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 67ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_DlcEstablishReq 69ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 70ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the user app to establish 71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connection with the specific dlci on a specific bd device. 72ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * It will allocate RFCOMM connection control block if not 73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * allocated before and dispatch open event to the state 74ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * machine. 75ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 76ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_DlcEstablishReq(tRFC_MCB* p_mcb, uint8_t dlci, 78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UNUSED_ATTR uint16_t mtu) { 79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_mcb->state != RFC_MX_STATE_CONNECTED) { 80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PORT_DlcEstablishCnf(p_mcb, dlci, 0, RFCOMM_ERROR); 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPORT* p_port = port_find_mcb_dlci_port(p_mcb, dlci); 85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_port == NULL) { 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, dlci); 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_sm_execute(p_port, RFC_EVENT_OPEN, NULL); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 94ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 95ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_DlcEstablishRsp 96ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 97ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the port emulation entity 98ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * acks Establish Indication. 99ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 100ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_DlcEstablishRsp(tRFC_MCB* p_mcb, uint8_t dlci, 102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UNUSED_ATTR uint16_t mtu, uint16_t result) { 103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_mcb->state != RFC_MX_STATE_CONNECTED) && (result == RFCOMM_SUCCESS)) { 104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PORT_DlcReleaseInd(p_mcb, dlci); 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPORT* p_port = port_find_mcb_dlci_port(p_mcb, dlci); 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_port == NULL) { 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, dlci); 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_sm_execute(p_port, RFC_EVENT_ESTABLISH_RSP, &result); 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 117ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 118ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_ParNegReq 119ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 120ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the user app to start 121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * DLC parameter negotiation. Port emulation can send this 122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * request before actually establishing the DLC. In this 123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * case the function will allocate RFCOMM connection control 124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * block. 125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_ParNegReq(tRFC_MCB* p_mcb, uint8_t dlci, uint16_t mtu) { 128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t flow; 129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t cl; 130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t k; 131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPORT* p_port = port_find_mcb_dlci_port(p_mcb, dlci); 133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_port == NULL) { 134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, dlci); 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_mcb->state != RFC_MX_STATE_CONNECTED) { 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->error = PORT_PAR_NEG_FAILED; 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Negotiate the flow control mechanism. If flow control mechanism for */ 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* mux has not been set yet, use our default value. If it has been set, */ 145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* use that value. */ 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson flow = (p_mcb->flow == PORT_FC_UNDEFINED) ? PORT_FC_DEFAULT : p_mcb->flow; 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Set convergence layer and number of credits (k) */ 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (flow == PORT_FC_CREDIT) { 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cl = RFCOMM_PN_CONV_LAYER_CBFC_I; 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson k = (p_port->credit_rx_max < RFCOMM_K_MAX) ? p_port->credit_rx_max 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : RFCOMM_K_MAX; 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->credit_rx = k; 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cl = RFCOMM_PN_CONV_LAYER_TYPE_1; 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson k = 0; 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send Parameter Negotiation Command UIH frame */ 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->rfc.expected_rsp |= RFC_RSP_PN; 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_send_pn(p_mcb, dlci, true, mtu, cl, k); 163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_timer_start(p_port, RFC_T2_TIMEOUT); 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_ParNegRsp 170ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the user app to acknowledge 172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * DLC parameter negotiation. 173ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_ParNegRsp(tRFC_MCB* p_mcb, uint8_t dlci, uint16_t mtu, uint8_t cl, 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t k) { 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_mcb->state != RFC_MX_STATE_CONNECTED) return; 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send Parameter Negotiation Response UIH frame */ 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_send_pn(p_mcb, dlci, false, mtu, cl, k); 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 184ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 185ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_PortNegReq 186ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 187ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the user app to start 188ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Remote Port parameter negotiation. Port emulation can 189ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * send this request before actually establishing the DLC. 190ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * In this case the function will allocate RFCOMM connection 191ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * control block. 192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_PortNegReq(tRFC_MCB* p_mcb, uint8_t dlci, tPORT_STATE* p_pars) { 195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_mcb->state != RFC_MX_STATE_CONNECTED) { 196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PORT_PortNegCnf(p_mcb, dlci, NULL, RFCOMM_ERROR); 197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPORT* p_port = port_find_mcb_dlci_port(p_mcb, dlci); 201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_port == NULL) { 202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, dlci); 203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send Parameter Negotiation Command UIH frame */ 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_pars) 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->rfc.expected_rsp |= RFC_RSP_RPN_REPLY; 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->rfc.expected_rsp |= RFC_RSP_RPN; 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_send_rpn(p_mcb, dlci, true, p_pars, RFCOMM_RPN_PM_MASK); 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_timer_start(p_port, RFC_T2_TIMEOUT); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_PortNegRsp 219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the user app to acknowledge 221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Port parameters negotiation. 222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_PortNegRsp(tRFC_MCB* p_mcb, uint8_t dlci, tPORT_STATE* p_pars, 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t param_mask) { 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_mcb->state != RFC_MX_STATE_CONNECTED) return; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_send_rpn(p_mcb, dlci, false, p_pars, param_mask); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_ControlReq 234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the port entity to send control 236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * parameters to remote port emulation entity. 237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_ControlReq(tRFC_MCB* p_mcb, uint8_t dlci, tPORT_CTRL* p_pars) { 240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPORT* p_port = port_find_mcb_dlci_port(p_mcb, dlci); 241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_port == NULL) { 242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, dlci); 243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_port->state != PORT_STATE_OPENED) || 247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_port->rfc.state != RFC_STATE_OPENED)) 248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->port_ctrl |= PORT_CTRL_REQ_SENT; 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->rfc.expected_rsp |= RFC_RSP_MSC; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_send_msc(p_mcb, dlci, true, p_pars); 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_timer_start(p_port, RFC_T2_TIMEOUT); 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_FlowReq 261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 262ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the port entity when flow 263ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * control state has changed. Enable flag passed shows if 264ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * port can accept more data. 265ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 266ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_FlowReq(tRFC_MCB* p_mcb, uint8_t dlci, uint8_t enable) { 268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPORT* p_port = port_find_mcb_dlci_port(p_mcb, dlci); 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_port == NULL) { 270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, dlci); 271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_port->state != PORT_STATE_OPENED) || 275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_port->rfc.state != RFC_STATE_OPENED)) 276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->local_ctrl.fc = !enable; 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->rfc.expected_rsp |= RFC_RSP_MSC; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_send_msc(p_mcb, dlci, true, &p_port->local_ctrl); 283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_timer_start(p_port, RFC_T2_TIMEOUT); 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 287ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 288ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_LineStatusReq 289ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 290ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the port entity when line 291ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * status should be delivered to the peer. 292ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_LineStatusReq(tRFC_MCB* p_mcb, uint8_t dlci, uint8_t status) { 295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPORT* p_port = port_find_mcb_dlci_port(p_mcb, dlci); 296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_port == NULL) { 297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, dlci); 298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_port->state != PORT_STATE_OPENED) || 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_port->rfc.state != RFC_STATE_OPENED)) 303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_port->rfc.expected_rsp |= RFC_RSP_RLS; 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_send_rls(p_mcb, dlci, true, status); 308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_timer_start(p_port, RFC_T2_TIMEOUT); 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 312ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_DlcReleaseReq 314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 315ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the PORT unit to close DLC 316ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 317ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_DlcReleaseReq(tRFC_MCB* p_mcb, uint8_t dlci) { 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_sm_execute(port_find_mcb_dlci_port(p_mcb, dlci), RFC_EVENT_CLOSE, 0); 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function RFCOMM_DataReq 325ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 326ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the user app to send data buffer 327ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 328ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCOMM_DataReq(tRFC_MCB* p_mcb, uint8_t dlci, BT_HDR* p_buf) { 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rfc_port_sm_execute(port_find_mcb_dlci_port(p_mcb, dlci), RFC_EVENT_DATA, 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf); 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 333