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*/ 56typedef 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*/ 68typedef 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*/ 93typedef 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*/ 119typedef 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*/ 145typedef 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*/ 212typedef 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 219extern "C" { 220#endif 221 222/* 223** Functions provided by the port_utils.c 224*/ 225extern tPORT *port_allocate_port (UINT8 dlci, BD_ADDR bd_addr); 226extern void port_set_defaults (tPORT *p_port); 227extern void port_select_mtu (tPORT *p_port); 228extern void port_release_port (tPORT *p_port); 229extern tPORT *port_find_mcb_dlci_port (tRFC_MCB *p_mcb, UINT8 dlci); 230extern tRFC_MCB *port_find_mcb (BD_ADDR bd_addr); 231extern tPORT *port_find_dlci_port (UINT8 dlci); 232extern tPORT *port_find_port (UINT8 dlci, BD_ADDR bd_addr); 233extern UINT32 port_get_signal_changes (tPORT *p_port, UINT8 old_signals, UINT8 signal); 234extern UINT32 port_flow_control_user (tPORT *p_port); 235extern void port_flow_control_peer(tPORT *p_port, BOOLEAN enable, UINT16 count); 236 237/* 238** Functions provided by the port_rfc.c 239*/ 240extern int port_open_continue (tPORT *p_port); 241extern void port_start_port_open (tPORT *p_port); 242extern void port_start_par_neg (tPORT *p_port); 243extern void port_start_control (tPORT *p_port); 244extern void port_start_close (tPORT *p_port); 245extern void port_rfc_closed (tPORT *p_port, UINT8 res); 246 247#ifdef __cplusplus 248} 249#endif 250 251#endif 252