1 /****************************************************************************** 2 * 3 * Copyright (C) 1999-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /***************************************************************************** 20 * 21 * This file contains definitions internal to the PORT unit 22 * 23 *****************************************************************************/ 24 25 #ifndef PORT_INT_H 26 #define PORT_INT_H 27 28 #include "bt_target.h" 29 #include "osi/include/alarm.h" 30 #include "osi/include/fixed_queue.h" 31 #include "bt_common.h" 32 #include "rfcdefs.h" 33 #include "port_api.h" 34 35 /* Local events passed when application event is sent from the api to PORT */ 36 /* ???*/ 37 #define PORT_EVENT_OPEN (1 | BT_EVT_TO_BTU_SP_EVT) 38 #define PORT_EVENT_CONTROL (2 | BT_EVT_TO_BTU_SP_EVT) 39 #define PORT_EVENT_SET_STATE (3 | BT_EVT_TO_BTU_SP_EVT) 40 #define PORT_EVENT_SET_CALLBACK (5 | BT_EVT_TO_BTU_SP_EVT) 41 #define PORT_EVENT_WRITE (6 | BT_EVT_TO_BTU_SP_EVT) 42 #define PORT_EVENT_PURGE (7 | BT_EVT_TO_BTU_SP_EVT) 43 #define PORT_EVENT_SEND_ERROR (8 | BT_EVT_TO_BTU_SP_EVT) 44 #define PORT_EVENT_FLOW_CONTROL (9 | BT_EVT_TO_BTU_SP_EVT) 45 46 /* 47 ** Flow control configuration values for the mux 48 */ 49 #define PORT_FC_UNDEFINED 0 /* mux flow control mechanism not defined yet */ 50 #define PORT_FC_TS710 1 /* use TS 07.10 flow control */ 51 #define PORT_FC_CREDIT 2 /* use RFCOMM credit based flow control */ 52 53 /* 54 ** Define Port Data Transfere control block 55 */ 56 typedef struct 57 { 58 fixed_queue_t *queue; /* Queue of buffers waiting to be sent */ 59 BOOLEAN peer_fc; /* TRUE if flow control is set based on peer's request */ 60 BOOLEAN user_fc; /* TRUE if flow control is set based on user's request */ 61 UINT32 queue_size; /* Number of data bytes in the queue */ 62 tPORT_CALLBACK *p_callback; /* Address of the callback function */ 63 } tPORT_DATA; 64 65 /* 66 ** Port control structure used to pass modem info 67 */ 68 typedef struct 69 { 70 #define MODEM_SIGNAL_DTRDSR 0x01 71 #define MODEM_SIGNAL_RTSCTS 0x02 72 #define MODEM_SIGNAL_RI 0x04 73 #define MODEM_SIGNAL_DCD 0x08 74 75 UINT8 modem_signal; /* [DTR/DSR | RTS/CTS | RI | DCD ] */ 76 77 UINT8 break_signal; /* 0-3 s in steps of 200 ms */ 78 79 UINT8 discard_buffers; /* 0 - do not discard, 1 - discard */ 80 81 #define RFCOMM_CTRL_BREAK_ASAP 0 82 #define RFCOMM_CTRL_BREAK_IN_SEQ 1 83 84 UINT8 break_signal_seq; /* as soon as possible | in sequence (default) */ 85 86 BOOLEAN fc; /* TRUE when the device is unable to accept frames */ 87 } tPORT_CTRL; 88 89 90 /* 91 ** RFCOMM multiplexer Control Block 92 */ 93 typedef struct 94 { 95 alarm_t *mcb_timer; /* MCB timer */ 96 fixed_queue_t *cmd_q; /* Queue for command messages on this mux */ 97 UINT8 port_inx[RFCOMM_MAX_DLCI + 1]; /* Array for quick access to */ 98 /* tPORT based on dlci */ 99 BD_ADDR bd_addr; /* BD ADDR of the peer if initiator */ 100 UINT16 lcid; /* Local cid used for this channel */ 101 UINT16 peer_l2cap_mtu; /* Max frame that can be sent to peer L2CAP */ 102 UINT8 state; /* Current multiplexer channel state */ 103 UINT8 is_initiator; /* TRUE if this side sends SABME (dlci=0) */ 104 BOOLEAN local_cfg_sent; 105 BOOLEAN peer_cfg_rcvd; 106 BOOLEAN restart_required; /* TRUE if has to restart channel after disc */ 107 BOOLEAN peer_ready; /* True if other side can accept frames */ 108 UINT8 flow; /* flow control mechanism for this mux */ 109 BOOLEAN l2cap_congested; /* TRUE if L2CAP is congested */ 110 BOOLEAN is_disc_initiator; /* TRUE if initiated disc of port */ 111 UINT16 pending_lcid; /* store LCID for incoming connection while connecting */ 112 UINT8 pending_id; /* store l2cap ID for incoming connection while connecting */ 113 } tRFC_MCB; 114 115 116 /* 117 ** RFCOMM Port Connection Control Block 118 */ 119 typedef struct { 120 #define RFC_PORT_STATE_IDLE 0 121 #define RFC_PORT_STATE_WAIT_START 1 122 #define RFC_PORT_STATE_OPENING 2 123 #define RFC_PORT_STATE_OPENED 3 124 #define RFC_PORT_STATE_CLOSING 4 125 126 UINT8 state; /* Current state of the connection */ 127 128 #define RFC_RSP_PN 0x01 129 #define RFC_RSP_RPN_REPLY 0x02 130 #define RFC_RSP_RPN 0x04 131 #define RFC_RSP_MSC 0x08 132 #define RFC_RSP_RLS 0x10 133 134 UINT8 expected_rsp; 135 136 tRFC_MCB *p_mcb; 137 138 alarm_t *port_timer; 139 } tRFC_PORT; 140 141 142 /* 143 ** Define control block containing information about PORT connection 144 */ 145 typedef struct 146 { 147 UINT8 inx; /* Index of this control block in the port_info array */ 148 BOOLEAN in_use; /* True when structure is allocated */ 149 150 #define PORT_STATE_CLOSED 0 151 #define PORT_STATE_OPENING 1 152 #define PORT_STATE_OPENED 2 153 #define PORT_STATE_CLOSING 3 154 155 UINT8 state; /* State of the application */ 156 157 UINT8 scn; /* Service channel number */ 158 UINT16 uuid; /* Service UUID */ 159 160 BD_ADDR bd_addr; /* BD ADDR of the device for the multiplexer channel */ 161 BOOLEAN is_server; /* TRUE if the server application */ 162 UINT8 dlci; /* DLCI of the connection */ 163 164 UINT8 error; /* Last error detected */ 165 166 UINT8 line_status; /* Line status as reported by peer */ 167 168 UINT8 default_signal_state; /* Initial signal state depending on uuid */ 169 170 UINT16 mtu; /* Max MTU that port can receive */ 171 UINT16 peer_mtu; /* Max MTU that port can send */ 172 173 tPORT_DATA tx; /* Control block for data from app to peer */ 174 tPORT_DATA rx; /* Control block for data from peer to app */ 175 176 tPORT_STATE user_port_pars; /* Port parameters for user connection */ 177 tPORT_STATE peer_port_pars; /* Port parameters for user connection */ 178 179 tPORT_CTRL local_ctrl; 180 tPORT_CTRL peer_ctrl; 181 182 #define PORT_CTRL_REQ_SENT 0x01 183 #define PORT_CTRL_REQ_CONFIRMED 0x02 184 #define PORT_CTRL_IND_RECEIVED 0x04 185 #define PORT_CTRL_IND_RESPONDED 0x08 186 187 UINT8 port_ctrl; /* Modem Status Command */ 188 189 BOOLEAN rx_flag_ev_pending; /* RXFLAG Character is received */ 190 191 tRFC_PORT rfc; /* RFCOMM port control block */ 192 193 UINT32 ev_mask; /* Event mask for the callback */ 194 tPORT_CALLBACK *p_callback; /* Pointer to users callback function */ 195 tPORT_CALLBACK *p_mgmt_callback; /* Callback function to receive connection up/down */ 196 tPORT_DATA_CALLBACK *p_data_callback; /* Callback function to receive data indications */ 197 tPORT_DATA_CO_CALLBACK *p_data_co_callback; /* Callback function with callouts and flowctrl */ 198 UINT16 credit_tx; /* Flow control credits for tx path */ 199 UINT16 credit_rx; /* Flow control credits for rx path, this is */ 200 /* number of buffers peer is allowed to sent */ 201 UINT16 credit_rx_max; /* Max number of credits we will allow this guy to sent */ 202 UINT16 credit_rx_low; /* Number of credits when we send credit update */ 203 UINT16 rx_buf_critical; /* port receive queue critical watermark level */ 204 BOOLEAN keep_port_handle; /* TRUE if port is not deallocated when closing */ 205 /* it is set to TRUE for server when allocating port */ 206 UINT16 keep_mtu; /* Max MTU that port can receive by server */ 207 } tPORT; 208 209 210 /* Define the PORT/RFCOMM control structure 211 */ 212 typedef struct 213 { 214 tPORT port[MAX_RFC_PORTS]; /* Port info pool */ 215 tRFC_MCB rfc_mcb[MAX_BD_CONNECTIONS]; /* RFCOMM bd_connections pool */ 216 } tPORT_CB; 217 218 #ifdef __cplusplus 219 extern "C" { 220 #endif 221 222 /* 223 ** Functions provided by the port_utils.c 224 */ 225 extern tPORT *port_allocate_port (UINT8 dlci, BD_ADDR bd_addr); 226 extern void port_set_defaults (tPORT *p_port); 227 extern void port_select_mtu (tPORT *p_port); 228 extern void port_release_port (tPORT *p_port); 229 extern tPORT *port_find_mcb_dlci_port (tRFC_MCB *p_mcb, UINT8 dlci); 230 extern tRFC_MCB *port_find_mcb (BD_ADDR bd_addr); 231 extern tPORT *port_find_dlci_port (UINT8 dlci); 232 extern tPORT *port_find_port (UINT8 dlci, BD_ADDR bd_addr); 233 extern UINT32 port_get_signal_changes (tPORT *p_port, UINT8 old_signals, UINT8 signal); 234 extern UINT32 port_flow_control_user (tPORT *p_port); 235 extern void port_flow_control_peer(tPORT *p_port, BOOLEAN enable, UINT16 count); 236 237 /* 238 ** Functions provided by the port_rfc.c 239 */ 240 extern int port_open_continue (tPORT *p_port); 241 extern void port_start_port_open (tPORT *p_port); 242 extern void port_start_par_neg (tPORT *p_port); 243 extern void port_start_control (tPORT *p_port); 244 extern void port_start_close (tPORT *p_port); 245 extern void port_rfc_closed (tPORT *p_port, UINT8 res); 246 247 #ifdef __cplusplus 248 } 249 #endif 250 251 #endif 252