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 definitions internal to the RFC unit 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *****************************************************************************/ 246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#ifndef RFC_INT_H 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_INT_H 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2c_api.h" 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "port_int.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/* 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Define RFCOMM result codes 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_SUCCESS 0 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_ERROR 1 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_LOW_RESOURCES 2 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_TRY_LATER 3 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_USER_ERR 111 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_SECURITY_ERR 112 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* 436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Define max and min RFCOMM MTU (N1) 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#define RFCOMM_MIN_MTU 23 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_MAX_MTU 32767 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_StartReq (tRFC_MCB *p_mcb); 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_StartRsp (tRFC_MCB *p_mcb, UINT16 result); 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu); 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_DlcEstablishRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result); 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_DataReq (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf); 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_DlcReleaseReq (tRFC_MCB *p_mcb, UINT8 dlci); 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_ParNegReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu); 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_ParNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k); 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_TestReq (UINT8 *p_data, UINT16 len); 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_FLOW_STATE_DISABLE 0 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_FLOW_STATE_ENABLE 1 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_FlowReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 state); 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_PortNegReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars); 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_PortNegRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 param_mask); 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_ControlReq (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars); 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_ControlRsp (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars); 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void RFCOMM_LineStatusReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status); 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* 766ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Define logical struct used for sending and decoding MX frames 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 dlci; 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 type; 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 cr; 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 ea; 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 pf; 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 credit; 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach union 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach struct 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 dlci; 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 frame_type; 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 conv_layer; 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 priority; 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 t1; 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 mtu; 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 n2; 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 k; 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } pn; 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach struct 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_data; 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 data_len; 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } test; 1056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach struct 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 dlci; 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 signals; 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 break_present; 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 break_duration; 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } msc; 1126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach struct 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 ea; 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 cr; 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 type; 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } nsc; 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach struct 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 dlci; 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 is_request; 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 baud_rate; 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 byte_size; 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 stop_bits; 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 parity; 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 parity_type; 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 fc_type; 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 xon_char; 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 xoff_char; 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 param_mask; 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } rpn; 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach struct 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 dlci; 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 line_status; 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } rls; 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } u; 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} MX_FRAME; 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define LINE_STATUS_NO_ERROR 0x00 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define LINE_STATUS_OVERRUN 0x02 /* Receive Overrun Error */ 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define LINE_STATUS_RXPARITY 0x04 /* Receive Parity Error */ 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define LINE_STATUS_FRAME 0x08 /* Receive Framing error */ 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define LINE_STATUS_FAILED 0x10 /* Connection Failed */ 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Define states and events for the RFC multiplexer state machine 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_STATE_IDLE 0 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_STATE_WAIT_CONN_CNF 1 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_STATE_CONFIGURE 2 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_STATE_SABME_WAIT_UA 3 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_STATE_WAIT_SABME 4 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_STATE_CONNECTED 5 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_STATE_DISC_WAIT_UA 6 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* 1586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Define port states 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_STATE_CLOSED 0 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_STATE_SABME_WAIT_UA 1 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_STATE_ORIG_WAIT_SEC_CHECK 2 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_STATE_TERM_WAIT_SEC_CHECK 3 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_STATE_OPENED 4 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_STATE_DISC_WAIT_UA 5 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/* 1686ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Events that can be received by multiplexer as well as port state machines 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_SABME 0 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_UA 1 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_DM 2 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_DISC 3 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_UIH 4 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_TIMEOUT 5 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_BAD_FRAME 50 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Multiplexer events 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_START_REQ 6 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_START_RSP 7 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_CLOSE_REQ 8 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_CONN_CNF 9 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_CONN_IND 10 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_CONF_CNF 11 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_CONF_IND 12 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_QOS_VIOLATION_IND 13 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_DISC_IND 14 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_TEST_CMD 15 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_TEST_RSP 16 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_FCON_CMD 17 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_FCOFF_CMD 18 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_NSC 19 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MX_EVENT_NSC_RSP 20 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Port events 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_OPEN 9 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_ESTABLISH_RSP 11 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_CLOSE 12 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_CLEAR 13 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_DATA 14 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_EVENT_SEC_COMPLETE 15 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach// btla-specific ++ 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_T1_TIMEOUT 20 /* seconds to wait for reply with Poll bit */ 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_PORT_T1_TIMEOUT 60 /* seconds to wait for reply with Poll bit other than MX */ 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_T2_TIMEOUT 20 /* timeout to wait for Mx UIH */ 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach// btla-specific -- 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_DISC_TIMEOUT 3 /* If something goes wrong and we send DISC we should not wait for min */ 2126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#define RFC_CLOSE_TIMEOUT 10 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_CONN_TIMEOUT 120 /* first connection to be established on Mx */ 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Define RFComm control block 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MX_FRAME rx_frame; 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tL2CAP_APPL_INFO reg_info; /* L2CAP Registration info */ 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tRFC_MCB *p_rfc_lcid_mcb[MAX_L2CAP_CHANNELS]; /* MCB based on the L2CAP's lcid */ 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN peer_rx_disabled; /* If TRUE peer sent FCOFF */ 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 last_mux; /* Last mux allocated */ 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 last_port; /* Last port allocated */ 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} tRFCOMM_CB; 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Main Control Block for the RFCOMM Layer (PORT and RFC) */ 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tRFCOMM_CB rfc; 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT_CB port; 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 trace_level; 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} tRFC_CB; 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if RFC_DYNAMIC_MEMORY == FALSE 238e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachRFC_API extern tRFC_CB rfc_cb; 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 240e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachRFC_API extern tRFC_CB *rfc_cb_ptr; 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define rfc_cb (*rfc_cb_ptr) 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Timer running on the multiplexor channel while no DLCI connection is opened */ 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MCB_INIT_INACT_TIMER 60 /* in seconds */ 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Timer running on the multiplexor channel after last DLCI is released */ 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFC_MCB_RELEASE_INACT_TIMER 2 /* in seconds */ 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Define RFCOMM frame processing errors 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_ERR_BAD_SABME 1 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_ERR_BAD_UA 2 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_ERR_BAD_DM 3 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_ERR_BAD_DISC 4 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_ERR_BAD_UIH 5 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#ifdef RFCOMM_PRECALC_FCS 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_SABME_FCS(p_data, cr, dlci) rfc_sabme_fcs[cr][dlci] 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_UA_FCS(p_data, cr, dlci) rfc_ua_fcs[cr][dlci] 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_DM_FCS(p_data, cr, dlci) rfc_dm_fcs[cr][dlci] 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_DISC_FCS(p_data, cr, dlci) rfc_disc_fcs[cr][dlci] 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_UIH_FCS(p_data, dlci) rfc_uih_fcs[dlci] 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern UINT8 rfc_calc_fcs (UINT16 len, UINT8 *p); 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_SABME_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data) 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_UA_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data) 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_DM_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data) 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_DISC_FCS(p_data, cr, dlci) rfc_calc_fcs(3, p_data) 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define RFCOMM_UIH_FCS(p_data, dlci) rfc_calc_fcs(2, p_data) 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#ifdef __cplusplus 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern "C" { 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_mx_sm_execute (tRFC_MCB *p_mcb, UINT16 event, void *p_data); 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/* 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Functions provided by the rfc_port_fsm.c 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_port_sm_execute (tPORT *p_port, UINT16 event, void *p_data); 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_pn (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame); 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_msc (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame); 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_rpn (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, BOOLEAN is_request, MX_FRAME *p_frame); 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_rls (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, MX_FRAME *p_frame); 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_nsc (tRFC_MCB *p_rfc_mcb, MX_FRAME *p_frame); 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_test_rsp (tRFC_MCB *p_rfc_mcb, BT_HDR *p_buf); 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_fcon (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command); 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_fcoff (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command); 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_l2cap_congestion (tRFC_MCB *p_mcb, BOOLEAN is_congested); 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/* 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Functions provided by the rfc_utils.c 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 305e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtRFC_MCB *rfc_alloc_multiplexer_channel (BD_ADDR bd_addr, BOOLEAN is_initiator); 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_release_multiplexer_channel (tRFC_MCB *p_rfc_mcb); 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_timer_start (tRFC_MCB *p_rfc_mcb, UINT16 timeout); 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_timer_stop (tRFC_MCB *p_rfc_mcb); 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_port_timer_start (tPORT *p_port, UINT16 tout); 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_port_timer_stop (tPORT *p_port); 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 312e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN rfc_check_uih_fcs (UINT8 dlci, UINT8 received_fcs); 313e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN rfc_check_fcs (UINT16 len, UINT8 *p, UINT8 received_fcs); 314e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtRFC_MCB *rfc_find_lcid_mcb (UINT16 lcid); 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_save_lcid_mcb (tRFC_MCB *p_rfc_mcb, UINT16 lcid); 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_check_mcb_active (tRFC_MCB *p_mcb); 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_port_closed (tPORT *p_port); 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res); 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_inc_credit (tPORT *p_port, UINT8 credit); 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_dec_credit (tPORT *p_port); 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_check_send_cmd(tRFC_MCB *p_mcb, BT_HDR *p_buf); 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/* 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Functions provided by the rfc_ts_frames.c 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_sabme (tRFC_MCB *p_rfc_mcb, UINT8 dlci); 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_ua (tRFC_MCB *p_rfc_mcb, UINT8 dlci); 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_dm (tRFC_MCB *p_rfc_mcb, UINT8 dlci, BOOLEAN pf); 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_disc (tRFC_MCB *p_rfc_mcb, UINT8 dlci); 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_pn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT16 mtu, 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 cl, UINT8 k); 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_test (tRFC_MCB *p_rfc_mcb, BOOLEAN is_command, BT_HDR *p_buf); 3336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachextern void rfc_send_msc (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT_CTRL *p_pars); 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_rls (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, UINT8 status); 3366ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbachextern void rfc_send_rpn (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN is_command, 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPORT_STATE *p_pars, UINT16 mask); 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_fcon (tRFC_MCB *p_mcb, BOOLEAN is_command); 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_fcoff (tRFC_MCB *p_mcb, BOOLEAN is_command); 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_buf_uih (tRFC_MCB *p_rfc_mcb, UINT8 dlci, BT_HDR *p_buf); 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_send_credit(tRFC_MCB *p_mcb, UINT8 dlci, UINT8 credit); 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfc_process_mx_message (tRFC_MCB *p_rfc_mcb, BT_HDR *p_buf); 343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern UINT8 rfc_parse_data (tRFC_MCB *p_rfc_mcb, MX_FRAME *p_frame, BT_HDR *p_buf); 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/* 346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Functions provided by the rfc_disp.c 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Call back functions from RFCOMM */ 352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void rfcomm_l2cap_if_init (void); 353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_StartInd (tRFC_MCB *p_mcb); 355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_StartCnf (tRFC_MCB *p_mcb, UINT16 result); 356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_CloseInd (tRFC_MCB *p_mcb); 358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void Port_TimeOutCloseMux (tRFC_MCB *p_mcb); 359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_DlcEstablishInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu); 361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_DlcEstablishCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result); 362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf); 364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_DlcReleaseInd (tRFC_MCB *p_mcb, UINT8 dlci); 366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_ParNegInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k); 368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_ParNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k); 369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_TestCnf (tRFC_MCB *p_mcb, UINT8 *p_data, UINT16 len); 371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_FlowInd (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN fc); 373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_PortNegInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 param_mask); 375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_PortNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 result); 376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_ControlInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars); 378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_ControlCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars); 379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachextern void PORT_LineStatusInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status); 381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#ifdef __cplusplus 383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 388