1 /****************************************************************************** 2 * 3 * Copyright (C) 2009-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 interfaces which are internal to MCAP. 22 * 23 ******************************************************************************/ 24 #ifndef MCA_INT_H 25 #define MCA_INT_H 26 #include "bt_common.h" 27 #include "mca_api.h" 28 #include "osi/include/alarm.h" 29 30 /***************************************************************************** 31 * constants 32 ****************************************************************************/ 33 34 /* INT initiates the L2CAP channel */ 35 #define MCA_ACP 0 36 #define MCA_INT 1 37 38 /***************************************************************************** 39 * Type Definitions 40 ****************************************************************************/ 41 42 /* Header structure for api/received request/response. */ 43 typedef struct { 44 BT_HDR hdr; /* layer specific information */ 45 uint8_t op_code; /* the request/response opcode */ 46 uint8_t rsp_code; /* valid only if op_code is a response */ 47 uint16_t mdl_id; /* the MDL ID associated with this request/response */ 48 uint8_t param; /* other parameter */ 49 uint8_t mdep_id; /* the MDEP ID associated with this request/response */ 50 /* tMCA_HANDLE rcb_idx; For internal use only */ 51 /* tMCA_CL ccb_idx; For internal use only */ 52 tMCA_DL dcb_idx; /* For internal use only */ 53 } tMCA_CCB_MSG; 54 55 /* This data structure is for AVDT_OPEN_IND_EVT and AVDT_OPEN_CFM_EVT. */ 56 typedef struct { 57 BT_HDR hdr; /* Event header */ 58 uint16_t peer_mtu; /* Transport channel L2CAP MTU of the peer */ 59 uint16_t lcid; /* L2CAP LCID */ 60 uint8_t param; 61 } tMCA_OPEN; 62 63 typedef struct { 64 uint16_t reason; /* disconnect reason from L2CAP */ 65 uint8_t param; /* MCA_INT or MCA_ACP */ 66 uint16_t lcid; /* L2CAP LCID */ 67 } tMCA_CLOSE; 68 69 /* Header structure for state machine event parameters. */ 70 typedef union { 71 BT_HDR hdr; /* layer specific information */ 72 tMCA_CCB_MSG api; 73 bool llcong; 74 uint8_t param; 75 tMCA_OPEN open; 76 tMCA_CLOSE close; 77 } tMCA_CCB_EVT; 78 79 /* control channel states */ 80 enum { 81 MCA_CCB_NULL_ST, /* not allocated */ 82 MCA_CCB_OPENING_ST, 83 MCA_CCB_OPEN_ST, /* open */ 84 MCA_CCB_CLOSING_ST, /* disconnecting */ 85 MCA_CCB_MAX_ST 86 }; 87 typedef uint8_t tMCA_CCB_STATE; 88 89 /* control channel events */ 90 enum { 91 MCA_CCB_API_CONNECT_EVT, /* application initiates a connect request. */ 92 MCA_CCB_API_DISCONNECT_EVT, /* application initiates a disconnect request. */ 93 MCA_CCB_API_REQ_EVT, /* application initiates a request. The request may be 94 create_mdl, delete_mdl, reconnect_mdl or abort_mdl. */ 95 MCA_CCB_API_RSP_EVT, /* application initiates a create_mdl or reconnect_mdl 96 response. */ 97 MCA_CCB_MSG_REQ_EVT, /* a create_mdl, delete_mdl, reconnect_mdl or abort_mdl 98 request message is received from the peer. */ 99 MCA_CCB_MSG_RSP_EVT, /* Response received event. This event is sent whenever 100 a response message is received for an outstanding 101 request message. */ 102 MCA_CCB_DL_OPEN_EVT, /* data channel open. */ 103 MCA_CCB_LL_OPEN_EVT, /* Lower layer open. This event is sent when the lower 104 layer channel is open. */ 105 MCA_CCB_LL_CLOSE_EVT, /* Lower layer close. This event is sent when the lower 106 layer channel is closed. */ 107 MCA_CCB_LL_CONG_EVT, /* Lower layer congestion. This event is sent when the 108 lower layer is congested. */ 109 MCA_CCB_RSP_TOUT_EVT /* time out for waiting the message response on the 110 control channel */ 111 }; 112 113 /* Header structure for callback event parameters. */ 114 typedef union { 115 tMCA_OPEN open; 116 tMCA_CLOSE close; 117 BT_HDR hdr; /* layer specific information */ 118 BT_HDR* p_pkt; 119 bool llcong; 120 uint16_t mdl_id; /* the MDL ID associated with this request/response */ 121 122 /* tMCA_HANDLE rcb_idx; For internal use only */ 123 /* tMCA_CL ccb_idx; For internal use only */ 124 /* tMCA_DL dcb_idx; For internal use only */ 125 } tMCA_DCB_EVT; 126 127 /* data channel states */ 128 enum { 129 MCA_DCB_NULL_ST, /* not allocated */ 130 MCA_DCB_OPENING_ST, /* create/reconnect sequence is successful, waiting for 131 data channel connection */ 132 MCA_DCB_OPEN_ST, /* open */ 133 MCA_DCB_CLOSING_ST, /* disconnecting */ 134 MCA_DCB_MAX_ST 135 }; 136 typedef uint8_t tMCA_DCB_STATE; 137 138 /* data channel events */ 139 enum { 140 MCA_DCB_API_CLOSE_EVT, /* This event is sent when the application wants to 141 disconnect the data channel.*/ 142 MCA_DCB_API_WRITE_EVT, /* This event is sent when the application wants to 143 send a data packet to the peer.*/ 144 MCA_DCB_TC_OPEN_EVT, /* Transport Channel open. This event is sent when the 145 channel is open.*/ 146 MCA_DCB_TC_CLOSE_EVT, /* Transport Channel close.*/ 147 MCA_DCB_TC_CONG_EVT, /* Transport Channel congestion status.*/ 148 MCA_DCB_TC_DATA_EVT /* This event is sent when a data packet is received from 149 the peer.*/ 150 }; 151 152 /* "states" used in transport channel table */ 153 #define MCA_TC_ST_UNUSED 0 /* Unused - unallocated */ 154 #define MCA_TC_ST_IDLE 1 /* No connection */ 155 #define MCA_TC_ST_ACP 2 /* Waiting to accept a connection */ 156 #define MCA_TC_ST_INT 3 /* Initiating a connection */ 157 #define MCA_TC_ST_CONN 4 /* Waiting for connection confirm */ 158 #define MCA_TC_ST_CFG 5 /* Waiting for configuration complete */ 159 #define MCA_TC_ST_OPEN 6 /* Channel opened */ 160 #define MCA_TC_ST_SEC_INT 7 /* Security process as INT */ 161 #define MCA_TC_ST_SEC_ACP 8 /* Security process as ACP */ 162 163 /* Configuration flags. tMCA_TC_TBL.cfg_flags */ 164 #define MCA_L2C_CFG_IND_DONE (1 << 0) 165 #define MCA_L2C_CFG_CFM_DONE (1 << 1) 166 #define MCA_L2C_CFG_CONN_INT (1 << 2) 167 #define MCA_L2C_CFG_CONN_ACP (1 << 3) 168 #define MCA_L2C_CFG_DISCN_INT (1 << 4) 169 #define MCA_L2C_CFG_DISCN_ACP (1 << 5) 170 171 #define MCA_CTRL_TCID 0 /* to identify control channel by tMCA_TC_TBL.tcid */ 172 173 /* transport channel table */ 174 typedef struct { 175 uint16_t peer_mtu; /* L2CAP mtu of the peer device */ 176 uint16_t my_mtu; /* Our MTU for this channel */ 177 uint16_t lcid; /* L2CAP LCID */ 178 uint8_t tcid; /* transport channel id (0, for control channel. (MDEP ID + 1) 179 for data channel) */ 180 tMCA_DL cb_idx; /* 1-based index to ccb or dcb */ 181 uint8_t state; /* transport channel state */ 182 uint8_t cfg_flags; /* L2CAP configuration flags */ 183 uint8_t id; /* L2CAP id sent by peer device (need this to handle security 184 pending) */ 185 } tMCA_TC_TBL; 186 187 /* transport control block */ 188 typedef struct { 189 tMCA_TC_TBL tc_tbl[MCA_NUM_TC_TBL]; 190 uint8_t lcid_tbl[MAX_L2CAP_CHANNELS]; /* map LCID to tc_tbl index */ 191 } tMCA_TC; 192 193 /* registration control block */ 194 typedef struct { 195 tMCA_REG reg; /* the parameter at register */ 196 tMCA_CS dep[MCA_NUM_DEPS]; /* the registration info for each MDEP */ 197 tMCA_CTRL_CBACK* p_cback; /* control callback function */ 198 } tMCA_RCB; 199 200 enum { 201 MCA_CCB_STAT_NORM, /* normal operation (based on ccb state) */ 202 MCA_CCB_STAT_PENDING, /* waiting for data channel */ 203 MCA_CCB_STAT_RECONN, /* reinitiate connection after transitioning from CLOSING 204 to IDLE state */ 205 MCA_CCB_STAT_DISC /* MCA_DisconnectReq or MCA_Deregister is called. waiting 206 for all associated CL and DL to detach */ 207 }; 208 typedef uint8_t tMCA_CCB_STAT; 209 210 /* control channel control block */ 211 /* the ccbs association with the rcbs 212 * ccb[0] ...ccb[MCA_NUM_LINKS*1-1] -> rcb[0] 213 * ccb[MCA_NUM_LINKS*1]...ccb[MCA_NUM_LINKS*2-1] -> rcb[1] 214 * ccb[MCA_NUM_LINKS*2]...ccb[MCA_NUM_LINKS*3-1] -> rcb[2] 215 */ 216 typedef struct { 217 tMCA_RCB* p_rcb; /* the associated registration control block */ 218 alarm_t* mca_ccb_timer; /* MCA CCB timer entry */ 219 tMCA_CCB_MSG* p_tx_req; /* Current request being sent/awaiting response */ 220 tMCA_CCB_MSG* p_rx_msg; /* Current message received/being processed */ 221 RawAddress peer_addr; /* BD address of peer */ 222 uint16_t sec_mask; /* Security mask for connections as initiator */ 223 uint16_t ctrl_vpsm; /* The virtual PSM that peer is listening for control 224 channel */ 225 uint16_t 226 data_vpsm; /* The virtual PSM that peer is listening for data channel. */ 227 uint16_t lcid; /* L2CAP lcid for this control channel */ 228 uint8_t state; /* The CCB state machine state */ 229 bool cong; /* Whether control channel is congested */ 230 tMCA_CCB_STAT status; /* see tMCA_CCB_STAT */ 231 } tMCA_CCB; 232 typedef void (*tMCA_CCB_ACTION)(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 233 234 enum { 235 MCA_DCB_STAT_NORM, /* normal operation (based on dcb state) */ 236 MCA_DCB_STAT_DEL, /* MCA_Delete is called. waiting for the DL to detach */ 237 MCA_DCB_STAT_DISC /* MCA_CloseReq is called. waiting for the DL to detach */ 238 }; 239 typedef uint8_t tMCA_DCB_STAT; 240 241 /* data channel control block */ 242 /* the dcbs association with the ccbs 243 * dcb[0] ...dcb[MCA_NUM_MDLS*1-1] -> ccb[0] 244 * dcb[MCA_NUM_MDLS*1]...dcb[MCA_NUM_MDLS*2-1] -> ccb[1] 245 * dcb[MCA_NUM_MDLS*2]...dcb[MCA_NUM_MDLS*3-1] -> ccb[2] 246 * 247 * the dcbs association with the rcbs 248 * dcb[0] 249 * ...dcb[MCA_NUM_MDLS*1*MCA_NUM_LINKS*1-1] -> rcb[0] 250 * dcb[MCA_NUM_MDLS*1*MCA_NUM_LINKS*1] 251 * ...dcb[MCA_NUM_MDLS*2*MCA_NUM_LINKS*2-1] -> rcb[1] 252 * dcb[MCA_NUM_MDLS*2*MCA_NUM_LINKS*2] 253 * ...dcb[MCA_NUM_MDLS*3*MCA_NUM_LINKS*3-1] -> rcb[2] 254 */ 255 typedef struct { 256 tMCA_CCB* p_ccb; /* the associated control control block */ 257 BT_HDR* p_data; /* data packet held due to L2CAP channel congestion */ 258 tMCA_CS* p_cs; /* the associated MDEP info. p_cs->type is the mdep id(internal 259 use) */ 260 const tMCA_CHNL_CFG* p_chnl_cfg; /* cfg params for L2CAP channel */ 261 uint16_t mdl_id; /* the MDL ID for this data channel */ 262 uint16_t lcid; /* L2CAP lcid */ 263 uint8_t state; /* The DCB state machine state */ 264 bool cong; /* Whether data channel is congested */ 265 tMCA_DCB_STAT status; /* see tMCA_DCB_STAT */ 266 } tMCA_DCB; 267 268 typedef void (*tMCA_DCB_ACTION)(tMCA_DCB* p_ccb, tMCA_DCB_EVT* p_data); 269 270 /* Control block for MCA */ 271 typedef struct { 272 tMCA_RCB rcb[MCA_NUM_REGS]; /* registration control block */ 273 tMCA_CCB ccb[MCA_NUM_CCBS]; /* control channel control blocks */ 274 tMCA_DCB dcb[MCA_NUM_DCBS]; /* data channel control blocks */ 275 tMCA_TC tc; /* transport control block */ 276 uint8_t trace_level; /* trace level */ 277 } tMCA_CB; 278 279 /* csm functions */ 280 extern void mca_ccb_event(tMCA_CCB* p_ccb, uint8_t event, tMCA_CCB_EVT* p_data); 281 extern tMCA_CCB* mca_ccb_by_bd(tMCA_HANDLE handle, const RawAddress& bd_addr); 282 extern tMCA_CCB* mca_ccb_alloc(tMCA_HANDLE handle, const RawAddress& bd_addr); 283 extern void mca_ccb_rsp_tout(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 284 extern void mca_ccb_dealloc(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 285 extern tMCA_CL mca_ccb_to_hdl(tMCA_CCB* p_ccb); 286 extern tMCA_CCB* mca_ccb_by_hdl(tMCA_CL mcl); 287 extern bool mca_ccb_uses_mdl_id(tMCA_CCB* p_ccb, uint16_t mdl_id); 288 289 /* cact functions */ 290 extern void mca_ccb_report_event(tMCA_CCB* p_ccb, uint8_t event, 291 tMCA_CTRL* p_data); 292 extern void mca_ccb_free_msg(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 293 extern void mca_ccb_snd_req(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 294 extern void mca_ccb_snd_rsp(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 295 extern void mca_ccb_do_disconn(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 296 extern void mca_ccb_cong(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 297 extern void mca_ccb_hdl_req(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 298 extern void mca_ccb_hdl_rsp(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 299 extern void mca_ccb_ll_open(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 300 extern void mca_ccb_dl_open(tMCA_CCB* p_ccb, tMCA_CCB_EVT* p_data); 301 302 /* dsm functions */ 303 extern void mca_dcb_event(tMCA_DCB* p_dcb, uint8_t event, tMCA_DCB_EVT* p_data); 304 extern tMCA_DCB* mca_dcb_alloc(tMCA_CCB* p_ccb, tMCA_DEP dep); 305 extern uint8_t mca_dep_free_mdl(tMCA_CCB* p_ccb, tMCA_DEP dep); 306 extern void mca_dcb_dealloc(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data); 307 extern tMCA_DL mca_dcb_to_hdl(tMCA_DCB* p_dcb); 308 extern tMCA_DCB* mca_dcb_by_hdl(tMCA_DL hdl); 309 extern void mca_dcb_close_by_mdl_id(tMCA_CCB* p_ccb, uint16_t mdl_id); 310 311 /* dact functions */ 312 extern void mca_dcb_tc_open(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data); 313 extern void mca_dcb_cong(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data); 314 extern void mca_dcb_free_data(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data); 315 extern void mca_dcb_do_disconn(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data); 316 extern void mca_dcb_snd_data(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data); 317 extern void mca_dcb_hdl_data(tMCA_DCB* p_dcb, tMCA_DCB_EVT* p_data); 318 319 /* main/utils functions */ 320 extern tMCA_HANDLE mca_handle_by_cpsm(uint16_t psm); 321 extern tMCA_HANDLE mca_handle_by_dpsm(uint16_t psm); 322 extern tMCA_TC_TBL* mca_tc_tbl_calloc(tMCA_CCB* p_ccb); 323 extern tMCA_TC_TBL* mca_tc_tbl_dalloc(tMCA_DCB* p_dcb); 324 extern tMCA_TC_TBL* mca_tc_tbl_by_lcid(uint16_t lcid); 325 extern void mca_free_tc_tbl_by_lcid(uint16_t lcid); 326 extern void mca_set_cfg_by_tbl(tL2CAP_CFG_INFO* p_cfg, tMCA_TC_TBL* p_tbl); 327 extern void mca_tc_close_ind(tMCA_TC_TBL* p_tbl, uint16_t reason); 328 extern void mca_tc_open_ind(tMCA_TC_TBL* p_tbl); 329 extern void mca_tc_cong_ind(tMCA_TC_TBL* p_tbl, bool is_congested); 330 extern void mca_tc_data_ind(tMCA_TC_TBL* p_tbl, BT_HDR* p_buf); 331 extern tMCA_RCB* mca_rcb_alloc(tMCA_REG* p_reg); 332 extern void mca_rcb_dealloc(tMCA_HANDLE handle); 333 extern tMCA_HANDLE mca_rcb_to_handle(tMCA_RCB* p_rcb); 334 extern tMCA_RCB* mca_rcb_by_handle(tMCA_HANDLE handle); 335 extern bool mca_is_valid_dep_id(tMCA_RCB* p_rcb, tMCA_DEP dep); 336 extern void mca_ccb_timer_timeout(void* data); 337 extern void mca_stop_timer(tMCA_CCB* p_ccb); 338 339 /* l2c functions */ 340 extern uint16_t mca_l2c_open_req(const RawAddress& bd_addr, uint16_t PSM, 341 const tMCA_CHNL_CFG* p_chnl_cfg); 342 343 /* callback function declarations */ 344 extern void mca_l2c_cconn_ind_cback(const RawAddress& bd_addr, uint16_t lcid, 345 uint16_t psm, uint8_t id); 346 extern void mca_l2c_dconn_ind_cback(const RawAddress& bd_addr, uint16_t lcid, 347 uint16_t psm, uint8_t id); 348 extern void mca_l2c_connect_cfm_cback(uint16_t lcid, uint16_t result); 349 extern void mca_l2c_config_cfm_cback(uint16_t lcid, tL2CAP_CFG_INFO* p_cfg); 350 extern void mca_l2c_config_ind_cback(uint16_t lcid, tL2CAP_CFG_INFO* p_cfg); 351 extern void mca_l2c_disconnect_ind_cback(uint16_t lcid, bool ack_needed); 352 extern void mca_l2c_disconnect_cfm_cback(uint16_t lcid, uint16_t result); 353 extern void mca_l2c_congestion_ind_cback(uint16_t lcid, bool is_congested); 354 extern void mca_l2c_data_ind_cback(uint16_t lcid, BT_HDR* p_buf); 355 356 /***************************************************************************** 357 * global data 358 ****************************************************************************/ 359 360 /****************************************************************************** 361 * Main Control Block 362 ******************************************************************************/ 363 extern tMCA_CB mca_cb; 364 365 /* L2CAP callback registration structure */ 366 extern const tL2CAP_APPL_INFO mca_l2c_int_appl; 367 extern const tL2CAP_FCR_OPTS mca_l2c_fcr_opts_def; 368 extern const uint8_t mca_std_msg_len[]; 369 370 #endif /* MCA_INT_H */ 371