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