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