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