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 state machine and action routines for a port of the
226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  RFCOMM unit
236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h>
26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h"
27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h"
28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "rfcdefs.h"
29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_api.h"
30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_int.h"
31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "port_api.h"
32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "port_int.h"
33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "rfc_int.h"
34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/********************************************************************************/
36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/********************************************************************************/
38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void rfc_port_sm_state_closed (tPORT *p_port, UINT16 event, void *p_data);
39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void rfc_port_sm_sabme_wait_ua (tPORT *p_port, UINT16 event, void *p_data);
40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void rfc_port_sm_opened (tPORT *p_port, UINT16 event, void *p_data);
41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void rfc_port_sm_orig_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data);
42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void rfc_port_sm_term_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data);
43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void rfc_port_sm_disc_wait_ua (tPORT *p_port, UINT16 event, void *p_data);
44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void rfc_port_uplink_data (tPORT *p_port, BT_HDR *p_buf);
46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void rfc_set_port_state(tPORT_STATE *port_pars, MX_FRAME *p_frame);
48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_port_sm_execute
53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sends port events through the state
55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  machine.
56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_port_sm_execute (tPORT *p_port, UINT16 event, void *p_data)
61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_port)
63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_WARNING1 ("NULL port event %d", event);
65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (p_port->rfc.state)
69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_STATE_CLOSED:
71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_sm_state_closed (p_port, event, p_data);
72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_STATE_SABME_WAIT_UA:
75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_sm_sabme_wait_ua (p_port, event, p_data);
76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_STATE_ORIG_WAIT_SEC_CHECK:
79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_sm_orig_wait_sec_check (p_port, event, p_data);
80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_STATE_TERM_WAIT_SEC_CHECK:
83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_sm_term_wait_sec_check (p_port, event, p_data);
84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_STATE_OPENED:
87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_sm_opened (p_port, event, p_data);
88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_STATE_DISC_WAIT_UA:
91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_sm_disc_wait_ua (p_port, event, p_data);
92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_port_sm_state_closed
100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles events when the port is in
1026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  CLOSED state. This state exists when port is
103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  being initially established.
104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_port_sm_state_closed (tPORT *p_port, UINT16 event, void *p_data)
109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (event)
111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_OPEN:
113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_ORIG_WAIT_SEC_CHECK;
1146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        btm_sec_mx_access_request (p_port->rfc.p_mcb->bd_addr, BT_PSM_RFCOMM, TRUE,
115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   BTM_SEC_PROTO_RFCOMM, (UINT32)(p_port->dlci / 2),
116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   &rfc_sec_check_complete, p_port);
117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLOSE:
120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLEAR:
123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DATA:
126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_SABME:
130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* make sure the multiplexer disconnect timer is not running (reconnect case) */
131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_timer_stop(p_port->rfc.p_mcb );
132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Open will be continued after security checks are passed */
134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_TERM_WAIT_SEC_CHECK;
1356ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        btm_sec_mx_access_request (p_port->rfc.p_mcb->bd_addr, BT_PSM_RFCOMM, FALSE,
136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   BTM_SEC_PROTO_RFCOMM, (UINT32)(p_port->dlci / 2),
137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   &rfc_sec_check_complete, p_port);
138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UA:
141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DM:
144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UIH:
148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, FALSE);
150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DISC:
153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, FALSE);
154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_TIMEOUT:
157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        Port_TimeOutCloseMux( p_port->rfc.p_mcb ) ;
158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    RFCOMM_TRACE_WARNING1 ("Port state closed Event ignored %d", event);
163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return;
164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_port_sm_sabme_wait_ua
169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles events when SABME on the DLC was
171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  sent and SM is waiting for UA or DM.
172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_port_sm_sabme_wait_ua (tPORT *p_port, UINT16 event, void *p_data)
177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (event)
179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_OPEN:
181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_ESTABLISH_RSP:
182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLOSE:
186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_timer_start (p_port, RFC_DISC_TIMEOUT);
187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_disc (p_port->rfc.p_mcb, p_port->dlci);
188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.expected_rsp = 0;
189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_DISC_WAIT_UA;
190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLEAR:
193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DATA:
197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        break;
199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UA:
201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_timer_stop (p_port);
202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_OPENED;
2036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_SUCCESS);
204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DM:
207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.p_mcb->is_disc_initiator = TRUE;
2086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_ERROR);
209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DISC:
213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci);
2146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_ERROR);
215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_SABME:
219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Continue to wait for the UA the SABME this side sent */
220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci);
221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UIH:
224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_TIMEOUT:
228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_CLOSED;
2296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_ERROR);
230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    RFCOMM_TRACE_WARNING1 ("Port state sabme_wait_ua Event ignored %d", event);
233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_port_sm_term_wait_sec_check
239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
2406ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function handles events for the port in the
241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  WAIT_SEC_CHECK state.  SABME has been received from the
242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  peer and Security Manager verifes BD_ADDR, before we can
243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  send ESTABLISH_IND to the Port entity
244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_port_sm_term_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data)
249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (event)
251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_SEC_COMPLETE:
253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (*((UINT8 *)p_data) != BTM_SUCCESS)
254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Authentication/authorization failed.  If link is still  */
256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* up send DM and check if we need to start inactive timer */
257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_port->rfc.p_mcb)
258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, TRUE);
260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_port->rfc.p_mcb->is_disc_initiator = TRUE;
261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                port_rfc_closed (p_port, PORT_SEC_FAILED);
262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
2666ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            PORT_DlcEstablishInd (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu);
267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_OPEN:
271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLOSE:
272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLEAR:
276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_sec_abort_access_req (p_port->rfc.p_mcb->bd_addr);
277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DATA:
281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR0 ("Port error state Term Wait Sec event Data");
282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_SABME:
286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Ignore SABME retransmission if client dares to do so */
287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DISC:
290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_sec_abort_access_req (p_port->rfc.p_mcb->bd_addr);
291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_CLOSED;
292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci);
293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
2946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        PORT_DlcReleaseInd (p_port->rfc.p_mcb, p_port->dlci);
295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UIH:
298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_ESTABLISH_RSP:
302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (*((UINT8 *)p_data) != RFCOMM_SUCCESS)
303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_port->rfc.p_mcb)
305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, TRUE);
306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci);
310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_port->rfc.state = RFC_STATE_OPENED;
311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    RFCOMM_TRACE_WARNING1 ("Port state term_wait_sec_check Event ignored %d", event);
315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_port_sm_orig_wait_sec_check
321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
3226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function handles events for the port in the
323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  ORIG_WAIT_SEC_CHECK state.  RFCOMM is waiting for Security
324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  manager to finish before sending SABME to the peer
325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_port_sm_orig_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data)
330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (event)
332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_SEC_COMPLETE:
334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (*((UINT8 *)p_data) != BTM_SUCCESS)
335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_port->rfc.p_mcb->is_disc_initiator = TRUE;
3376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, 0, RFCOMM_SECURITY_ERR);
338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_port_closed (p_port);
339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_sabme (p_port->rfc.p_mcb, p_port->dlci);
342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_timer_start (p_port, RFC_PORT_T1_TIMEOUT);
343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_SABME_WAIT_UA;
344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_OPEN:
347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_SABME:       /* Peer should not use the same dlci */
348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLOSE:
352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_sec_abort_access_req (p_port->rfc.p_mcb->bd_addr);
353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DATA:
357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR0 ("Port error state Orig Wait Sec event Data");
358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UIH:
362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    RFCOMM_TRACE_WARNING1 ("Port state orig_wait_sec_check Event ignored %d", event);
366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_port_sm_opened
372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles events for the port in the OPENED
374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  state
375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_port_sm_opened (tPORT *p_port, UINT16 event, void *p_data)
380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (event)
382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_OPEN:
384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLOSE:
388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_timer_start (p_port, RFC_DISC_TIMEOUT);
389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_disc (p_port->rfc.p_mcb, p_port->dlci);
390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.expected_rsp = 0;
391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_DISC_WAIT_UA;
392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLEAR:
395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DATA:
399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Send credits in the frame.  Pass them in the layer specific member of the hdr. */
400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* There might be an initial case when we reduced rx_max and credit_rx is still */
401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* bigger.  Make sure that we do not send 255 */
402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((p_port->rfc.p_mcb->flow == PORT_FC_CREDIT)
403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         && (((BT_HDR *)p_data)->len < p_port->peer_mtu)
404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         && (!p_port->rx.user_fc)
405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         && (p_port->credit_rx_max > p_port->credit_rx))
406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ((BT_HDR *)p_data)->layer_specific = (UINT8) (p_port->credit_rx_max - p_port->credit_rx);
408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_port->credit_rx = p_port->credit_rx_max;
409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ((BT_HDR *)p_data)->layer_specific = 0;
413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_buf_uih (p_port->rfc.p_mcb, p_port->dlci, (BT_HDR *)p_data);
415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_dec_credit (p_port);
416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UA:
419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_SABME:
422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci);
423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DM:
4266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        PORT_DlcReleaseInd (p_port->rfc.p_mcb, p_port->dlci);
427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DISC:
431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.state = RFC_STATE_CLOSED;
432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci);
433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if(p_port->rx.queue.count)
434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* give a chance to upper stack to close port properly */
436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            RFCOMM_TRACE_DEBUG0("port queue is not empty");
437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_port_timer_start (p_port, RFC_DISC_TIMEOUT);
438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
4406ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            PORT_DlcReleaseInd (p_port->rfc.p_mcb, p_port->dlci);
441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UIH:
444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_uplink_data (p_port, (BT_HDR *)p_data);
445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_TIMEOUT:
448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        Port_TimeOutCloseMux( p_port->rfc.p_mcb ) ;
449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    RFCOMM_TRACE_WARNING1 ("Port state opened Event ignored %d", event);
453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_port_sm_disc_wait_ua
459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles events when DISC on the DLC was
461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  sent and SM is waiting for UA or DM.
462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_port_sm_disc_wait_ua (tPORT *p_port, UINT16 event, void *p_data)
467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (event)
469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_OPEN:
471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_ESTABLISH_RSP:
472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_CLEAR:
476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
4796ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    case RFC_EVENT_DATA:
4806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        GKI_freebuf (p_data);
4816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        return;
4826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UA:
484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.p_mcb->is_disc_initiator = TRUE;
485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Case falls through */
486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach   case RFC_EVENT_DM:
488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_SABME:
492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, TRUE);
493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_DISC:
496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, TRUE);
497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_UIH:
500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_data);
501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_dm (p_port->rfc.p_mcb, p_port->dlci, FALSE);
502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    case RFC_EVENT_TIMEOUT:
505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_closed (p_port);
506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    RFCOMM_TRACE_WARNING1 ("Port state disc_wait_ua Event ignored %d", event);
510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_port_uplink_data
516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles uplink information data frame.
518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_port_uplink_data (tPORT *p_port, BT_HDR *p_buf)
521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    PORT_DataInd (p_port->rfc.p_mcb, p_port->dlci, p_buf);
523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_pn
529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles DLC parameter negotiation frame.
531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Record MTU and pass indication to the upper layer.
532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_process_pn (tRFC_MCB *p_mcb, BOOLEAN is_command, MX_FRAME *p_frame)
535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tPORT *p_port;
537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 dlci = p_frame->dlci;
538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_command)
540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Ignore if Multiplexer is being shut down */
542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p_mcb->state != RFC_MX_STATE_DISC_WAIT_UA)
543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            PORT_ParNegInd (p_mcb, dlci, p_frame->u.pn.mtu,
545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        p_frame->u.pn.conv_layer, p_frame->u.pn.k);
546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_send_dm(p_mcb, dlci, FALSE);
550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            RFCOMM_TRACE_WARNING0("***** MX PN while disconnecting *****");
551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If we are not awaiting response just ignore it */
556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_port = port_find_mcb_dlci_port (p_mcb, dlci);
557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_port == NULL) || !(p_port->rfc.expected_rsp & RFC_RSP_PN))
558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_port->rfc.expected_rsp &= ~RFC_RSP_PN;
561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_port_timer_stop (p_port);
563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    PORT_ParNegCnf (p_mcb, dlci, p_frame->u.pn.mtu,
5656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach                    p_frame->u.pn.conv_layer, p_frame->u.pn.k);
566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_rpn
572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
5736ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function handles Remote DLC parameter negotiation
5746ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  command/response.  Pass command to the user.
575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
5776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachvoid rfc_process_rpn (tRFC_MCB *p_mcb, BOOLEAN is_command,
578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      BOOLEAN is_request, MX_FRAME *p_frame)
579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tPORT_STATE port_pars;
581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tPORT       *p_port;
582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
5836ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    if ((p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci)) == NULL)
584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* This is the first command on the port */
586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (is_command)
587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            memset(&port_pars, 0, sizeof(tPORT_STATE));
590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_set_port_state(&port_pars, p_frame);
5916ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            PORT_PortNegInd(p_mcb, p_frame->dlci, &port_pars, p_frame->u.rpn.param_mask);
593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_command && is_request)
598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* This is the special situation when peer just request local pars */
600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars = p_port->peer_port_pars;
601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_rpn (p_mcb, p_frame->dlci, FALSE, &p_port->peer_port_pars, 0);
602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    port_pars = p_port->peer_port_pars;
606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_set_port_state(&port_pars, p_frame);
608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_command)
610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        PORT_PortNegInd (p_mcb, p_frame->dlci, &port_pars, p_frame->u.rpn.param_mask);
612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If we are not awaiting response just ignore it */
616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci);
617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_port == NULL) || !(p_port->rfc.expected_rsp & (RFC_RSP_RPN | RFC_RSP_RPN_REPLY)))
618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If we sent a request for port parameters to the peer he is replying with */
621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* mask 0. */
622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_port_timer_stop (p_port);
623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_port->rfc.expected_rsp & RFC_RSP_RPN_REPLY)
625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.expected_rsp &= ~RFC_RSP_RPN_REPLY;
627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->peer_port_pars = port_pars;
629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((port_pars.fc_type == (RFCOMM_FC_RTR_ON_INPUT | RFCOMM_FC_RTR_ON_OUTPUT))
631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         || (port_pars.fc_type == (RFCOMM_FC_RTC_ON_INPUT | RFCOMM_FC_RTC_ON_OUTPUT)))
632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* This is satisfactory port parameters.  Set mask as it was Ok */
634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_frame->u.rpn.param_mask = RFCOMM_RPN_PM_MASK;
635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Current peer parameters are not good, try to fix them */
639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_port->peer_port_pars.fc_type = (RFCOMM_FC_RTR_ON_INPUT | RFCOMM_FC_RTR_ON_OUTPUT);
640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_port->rfc.expected_rsp |= RFC_RSP_RPN;
6426ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            rfc_send_rpn (p_mcb, p_frame->dlci, TRUE, &p_port->peer_port_pars,
643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          RFCOMM_RPN_PM_RTR_ON_INPUT | RFCOMM_RPN_PM_RTR_ON_OUTPUT);
644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ;
645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.expected_rsp &= ~RFC_RSP_RPN;
650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check if all suggested parameters were accepted */
6526ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    if (((p_frame->u.rpn.param_mask & (RFCOMM_RPN_PM_RTR_ON_INPUT | RFCOMM_RPN_PM_RTR_ON_OUTPUT)) ==
653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        (RFCOMM_RPN_PM_RTR_ON_INPUT | RFCOMM_RPN_PM_RTR_ON_OUTPUT))
6546ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach     || ((p_frame->u.rpn.param_mask & (RFCOMM_RPN_PM_RTC_ON_INPUT | RFCOMM_RPN_PM_RTC_ON_OUTPUT)) ==
655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        (RFCOMM_RPN_PM_RTC_ON_INPUT | RFCOMM_RPN_PM_RTC_ON_OUTPUT)))
656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        PORT_PortNegCnf (p_mcb, p_port->dlci, &port_pars, RFCOMM_SUCCESS);
658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If we were proposing RTR flow control try RTC flow control */
662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If we were proposing RTC flow control try no flow control */
663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* otherwise drop the connection */
664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_port->peer_port_pars.fc_type == (RFCOMM_FC_RTR_ON_INPUT | RFCOMM_FC_RTR_ON_OUTPUT))
665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Current peer parameters are not good, try to fix them */
667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->peer_port_pars.fc_type = (RFCOMM_FC_RTC_ON_INPUT | RFCOMM_FC_RTC_ON_OUTPUT);
668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.expected_rsp |= RFC_RSP_RPN;
670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
6716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        rfc_send_rpn (p_mcb, p_frame->dlci, TRUE, &p_port->peer_port_pars,
672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      RFCOMM_RPN_PM_RTC_ON_INPUT | RFCOMM_RPN_PM_RTC_ON_OUTPUT);
673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_timer_start (p_port, RFC_T2_TIMEOUT) ;
674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Other side does not support flow control */
678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_port->peer_port_pars.fc_type == (RFCOMM_FC_RTC_ON_INPUT | RFCOMM_FC_RTC_ON_OUTPUT))
679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->peer_port_pars.fc_type = RFCOMM_FC_OFF;
681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        PORT_PortNegCnf (p_mcb, p_port->dlci, &port_pars, RFCOMM_SUCCESS);
682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_msc
689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
6906ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function handles Modem Status Command.
6916ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  Pass command to the user.
692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_process_msc (tRFC_MCB *p_mcb, BOOLEAN is_command, MX_FRAME *p_frame)
695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tPORT_CTRL pars;
697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tPORT      *p_port;
698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8      modem_signals = p_frame->u.msc.signals;
699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BOOLEAN    new_peer_fc = FALSE;
700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci);
7026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    if (p_port == NULL)
703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    pars.modem_signal = 0;
706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (modem_signals & RFCOMM_MSC_RTC)
708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        pars.modem_signal |= MODEM_SIGNAL_DTRDSR;
709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (modem_signals & RFCOMM_MSC_RTR)
711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        pars.modem_signal |= MODEM_SIGNAL_RTSCTS;
712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (modem_signals & RFCOMM_MSC_IC)
714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        pars.modem_signal |= MODEM_SIGNAL_RI;
715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (modem_signals & RFCOMM_MSC_DV)
717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        pars.modem_signal |= MODEM_SIGNAL_DCD;
718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    pars.fc = ((modem_signals & RFCOMM_MSC_FC) == RFCOMM_MSC_FC);
7206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
7216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    pars.break_signal     = (p_frame->u.msc.break_present) ?
722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                             p_frame->u.msc.break_duration : 0;
723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    pars.discard_buffers  = 0;
724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    pars.break_signal_seq = RFCOMM_CTRL_BREAK_IN_SEQ;   /* this is default */
725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check if this command is passed only to indicate flow control */
727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_command)
728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_msc (p_mcb, p_frame->dlci, FALSE, &pars);
730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p_port->rfc.p_mcb->flow != PORT_FC_CREDIT)
732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Spec 1.1 indicates that only FC bit is used for flow control */
734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_port->peer_ctrl.fc = new_peer_fc = pars.fc;
735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (new_peer_fc != p_port->tx.peer_fc)
737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                PORT_FlowInd (p_mcb, p_frame->dlci, (BOOLEAN)!new_peer_fc);
738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        PORT_ControlInd (p_mcb, p_frame->dlci, &pars);
741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If we are not awaiting response just ignore it */
746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!(p_port->rfc.expected_rsp & RFC_RSP_MSC))
747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_port->rfc.expected_rsp &= ~RFC_RSP_MSC;
750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    rfc_port_timer_stop (p_port);
752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    PORT_ControlCnf (p_port->rfc.p_mcb, p_port->dlci, &pars);
754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_rls
760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
7616ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function handles Remote Line Status command.
7626ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  Pass command to the user.
763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_process_rls (tRFC_MCB *p_mcb, BOOLEAN is_command, MX_FRAME *p_frame)
766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tPORT *p_port;
768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_command)
770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        PORT_LineStatusInd (p_mcb, p_frame->dlci, p_frame->u.rls.line_status);
772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_rls (p_mcb, p_frame->dlci, FALSE, p_frame->u.rls.line_status);
773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port = port_find_mcb_dlci_port (p_mcb, p_frame->dlci);
777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* If we are not awaiting response just ignore it */
779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!p_port || !(p_port->rfc.expected_rsp & RFC_RSP_RLS))
780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_port->rfc.expected_rsp &= ~RFC_RSP_RLS;
783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_port_timer_stop (p_port);
785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_nsc
792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles None Supported Command frame.
794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_process_nsc (tRFC_MCB *p_mcb, MX_FRAME *p_frame)
797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_test
804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles Test frame.  If this is a command
8066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  reply to it.  Otherwise pass response to the user.
807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
809e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_process_test_rsp (tRFC_MCB *p_mcb, BT_HDR *p_buf)
810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    GKI_freebuf (p_buf);
812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_fcon
818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
8196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function handles FCON frame.  The peer entity is able
8206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  to receive new information
821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_process_fcon (tRFC_MCB *p_mcb, BOOLEAN is_command)
824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_command)
826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
827e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_cb.rfc.peer_rx_disabled = FALSE;
828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_fcon (p_mcb, FALSE);
830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!p_mcb->l2cap_congested)
832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            PORT_FlowInd (p_mcb, 0, TRUE);
833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_fcoff
839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
8406ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function handles FCOFF frame.  The peer entity is unable
8416ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  to receive new information
842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_process_fcoff (tRFC_MCB *p_mcb, BOOLEAN is_command)
845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_command)
847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_cb.rfc.peer_rx_disabled = TRUE;
849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!p_mcb->l2cap_congested)
851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            PORT_FlowInd (p_mcb, 0, FALSE);
852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_send_fcoff (p_mcb, FALSE);
854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_process_l2cap_congestion
861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function handles L2CAP congestion messages
863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_process_l2cap_congestion (tRFC_MCB *p_mcb, BOOLEAN is_congested)
866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_mcb->l2cap_congested = is_congested;
868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!is_congested)
870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rfc_check_send_cmd(p_mcb, NULL);
872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!rfc_cb.rfc.peer_rx_disabled)
875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!is_congested)
877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            PORT_FlowInd (p_mcb, 0, TRUE);
878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            PORT_FlowInd (p_mcb, 0, FALSE);
880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         rfc_set_port_pars
886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sets the tPORT_STATE structure given a p_frame.
888e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid rfc_set_port_state(tPORT_STATE *port_pars, MX_FRAME *p_frame)
892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_BIT_RATE)
894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars->baud_rate   = p_frame->u.rpn.baud_rate;
895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_DATA_BITS)
896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars->byte_size   = p_frame->u.rpn.byte_size;
897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_STOP_BITS)
898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars->stop_bits   = p_frame->u.rpn.stop_bits;
899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_PARITY)
900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars->parity      = p_frame->u.rpn.parity;
901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_PARITY_TYPE)
902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars->parity_type = p_frame->u.rpn.parity_type;
903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_frame->u.rpn.param_mask & (RFCOMM_RPN_PM_XONXOFF_ON_INPUT |
904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     RFCOMM_RPN_PM_XONXOFF_ON_OUTPUT |
905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     RFCOMM_RPN_PM_RTR_ON_INPUT |
906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     RFCOMM_RPN_PM_RTR_ON_OUTPUT |
907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     RFCOMM_RPN_PM_RTC_ON_INPUT |
908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     RFCOMM_RPN_PM_RTC_ON_OUTPUT))
909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars->fc_type     = p_frame->u.rpn.fc_type;
910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_XON_CHAR)
911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars->xon_char    = p_frame->u.rpn.xon_char;
912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_frame->u.rpn.param_mask & RFCOMM_RPN_PM_XOFF_CHAR)
913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        port_pars->xoff_char   = p_frame->u.rpn.xoff_char;
914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
916