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