16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 1999-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/***************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains functions callable by an application 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * running on top of RFCOMM 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *****************************************************************************/ 256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h" 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h" 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "rfcdefs.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "port_api.h" 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2c_api.h" 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "port_int.h" 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "rfc_int.h" 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if RFC_DYNAMIC_MEMORY == FALSE 37e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtRFC_CB rfc_cb; 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_StartReq 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function handles Start Request from the upper layer. 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** If RFCOMM multiplexer channel can not be allocated 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** send start not accepted confirmation. Otherwise dispatch 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** start event to the state machine. 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_StartReq (tRFC_MCB *p_mcb) 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_START_REQ, NULL); 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_StartRsp 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function handles Start Response from the upper layer. 616ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Save upper layer handle and result of the Start Indication 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** in the control block and dispatch event to the FSM. 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_StartRsp (tRFC_MCB *p_mcb, UINT16 result) 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_START_RSP, &result); 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_DlcEstablishReq 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 756ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function is called by the user app to establish 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** connection with the specific dlci on a specific bd device. 776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** It will allocate RFCOMM connection control block if not 786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** allocated before and dispatch open event to the state 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** machine. 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 856ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (p_mcb->state != RFC_MX_STATE_CONNECTED) 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PORT_DlcEstablishCnf (p_mcb, dlci, 0, RFCOMM_ERROR); 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_sm_execute(p_port, RFC_EVENT_OPEN, NULL); 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_DlcEstablishRsp 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the port emulation entity 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** acks Establish Indication. 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_DlcEstablishRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result) 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 1076ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_mcb->state != RFC_MX_STATE_CONNECTED) && (result == RFCOMM_SUCCESS)) 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PORT_DlcReleaseInd (p_mcb, dlci); 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_sm_execute(p_port, RFC_EVENT_ESTABLISH_RSP, &result); 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_ParNegReq 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the user app to start 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** DLC parameter negotiation. Port emulation can send this 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** request before actually establishing the DLC. In this 1256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** case the function will allocate RFCOMM connection control 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** block. 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_ParNegReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 flow; 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 cl; 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 k; 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1366ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (p_mcb->state != RFC_MX_STATE_CONNECTED) 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->error = PORT_PAR_NEG_FAILED; 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Negotiate the flow control mechanism. If flow control mechanism for */ 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* mux has not been set yet, use our default value. If it has been set, */ 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* use that value. */ 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach flow = (p_mcb->flow == PORT_FC_UNDEFINED) ? PORT_FC_DEFAULT : p_mcb->flow; 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Set convergence layer and number of credits (k) */ 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (flow == PORT_FC_CREDIT) 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cl = RFCOMM_PN_CONV_LAYER_CBFC_I; 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach k = (p_port->credit_rx_max < RFCOMM_K_MAX) ? p_port->credit_rx_max : RFCOMM_K_MAX; 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->credit_rx = k; 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach cl = RFCOMM_PN_CONV_LAYER_TYPE_1; 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach k = 0; 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Send Parameter Negotiation Command UIH frame */ 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->rfc.expected_rsp |= RFC_RSP_PN; 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_send_pn (p_mcb, dlci, TRUE, mtu, cl, k); 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_ParNegRsp 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the user app to acknowledge 1746ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** DLC parameter negotiation. 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_ParNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_mcb->state != RFC_MX_STATE_CONNECTED) 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Send Parameter Negotiation Response UIH frame */ 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_send_pn (p_mcb, dlci, FALSE, mtu, cl, k); 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_PortNegReq 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the user app to start 1926ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Remote Port parameter negotiation. Port emulation can 1936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** send this request before actually establishing the DLC. 1946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** In this case the function will allocate RFCOMM connection 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** control block. 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_PortNegReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars) 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 2016ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (p_mcb->state != RFC_MX_STATE_CONNECTED) 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PORT_PortNegCnf (p_mcb, dlci, NULL, RFCOMM_ERROR); 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Send Parameter Negotiation Command UIH frame */ 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_pars) 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->rfc.expected_rsp |= RFC_RSP_RPN_REPLY; 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->rfc.expected_rsp |= RFC_RSP_RPN; 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_send_rpn (p_mcb, dlci, TRUE, p_pars, RFCOMM_RPN_PM_MASK); 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_PortNegRsp 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the user app to acknowledge 2256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Port parameters negotiation. 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2286ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachvoid RFCOMM_PortNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 param_mask) 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (p_mcb->state != RFC_MX_STATE_CONNECTED) 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_send_rpn (p_mcb, dlci, FALSE, p_pars, param_mask); 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_ControlReq 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the port entity to send control 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** parameters to remote port emulation entity. 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_ControlReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars) 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((p_port->state != PORT_STATE_OPENED) 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || (p_port->rfc.state != RFC_STATE_OPENED)) 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->port_ctrl |= PORT_CTRL_REQ_SENT; 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->rfc.expected_rsp |= RFC_RSP_MSC; 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_send_msc (p_mcb, dlci, TRUE, p_pars); 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_FlowReq 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2686ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function is called by the port entity when flow 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** control state has changed. Enable flag passed shows if 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** port can accept more data. 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_FlowReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 enable) 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((p_port->state != PORT_STATE_OPENED) 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || (p_port->rfc.state != RFC_STATE_OPENED)) 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->local_ctrl.fc = !enable; 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->rfc.expected_rsp |= RFC_RSP_MSC; 2846ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_send_msc (p_mcb, dlci, TRUE, &p_port->local_ctrl); 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ; 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_LineStatusReq 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the port entity when line 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** status should be delivered to the peer. 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_LineStatusReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 status) 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((p_port->state != PORT_STATE_OPENED) 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || (p_port->rfc.state != RFC_STATE_OPENED)) 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_port->rfc.expected_rsp |= RFC_RSP_RLS; 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_send_rls (p_mcb, dlci, TRUE, status); 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_timer_start (p_port, RFC_T2_TIMEOUT); 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_DlcReleaseReq 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function is called by the PORT unit to close DLC 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_DlcReleaseReq (tRFC_MCB *p_mcb, UINT8 dlci) 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_sm_execute(port_find_mcb_dlci_port (p_mcb, dlci), RFC_EVENT_CLOSE, 0); 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function RFCOMM_DataReq 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the user app to send data buffer 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid RFCOMM_DataReq (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rfc_port_sm_execute(port_find_mcb_dlci_port (p_mcb, dlci), RFC_EVENT_DATA, p_buf); 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 340