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