summaryrefslogtreecommitdiffstats
path: root/stack/rfcomm/port_int.h
blob: 2313ace2a5fa8fbef7e6c5b22a7f6d395b7496cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
/******************************************************************************
 *
 *  Copyright (C) 1999-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/*****************************************************************************
 *
 *  This file contains definitions internal to the PORT unit
 *
 *****************************************************************************/

#ifndef PORT_INT_H
#define PORT_INT_H

#include "bt_target.h"
#include "gki.h"
#include "rfcdefs.h"
#include "port_api.h"

/* Local events passed when application event is sent from the api to PORT */
/* ???*/
#define PORT_EVENT_OPEN         (1  | BT_EVT_TO_BTU_SP_EVT)
#define PORT_EVENT_CONTROL      (2  | BT_EVT_TO_BTU_SP_EVT)
#define PORT_EVENT_SET_STATE    (3  | BT_EVT_TO_BTU_SP_EVT)
#define PORT_EVENT_SET_CALLBACK (5  | BT_EVT_TO_BTU_SP_EVT)
#define PORT_EVENT_WRITE        (6  | BT_EVT_TO_BTU_SP_EVT)
#define PORT_EVENT_PURGE        (7  | BT_EVT_TO_BTU_SP_EVT)
#define PORT_EVENT_SEND_ERROR   (8  | BT_EVT_TO_BTU_SP_EVT)
#define PORT_EVENT_FLOW_CONTROL (9  | BT_EVT_TO_BTU_SP_EVT)

/*
** Flow control configuration values for the mux
*/
#define PORT_FC_UNDEFINED       0   /* mux flow control mechanism not defined yet */
#define PORT_FC_TS710           1   /* use TS 07.10 flow control  */
#define PORT_FC_CREDIT          2   /* use RFCOMM credit based flow control */

/*
** Define Port Data Transfere control block
*/
typedef struct
{
    BUFFER_Q queue;         /* Queue of buffers waiting to be sent */
    BOOLEAN  peer_fc;       /* TRUE if flow control is set based on peer's request */
    BOOLEAN  user_fc;       /* TRUE if flow control is set based on user's request  */
    UINT32   queue_size;    /* Number of data bytes in the queue */
    tPORT_CALLBACK *p_callback;  /* Address of the callback function */
} tPORT_DATA;

/*
** Port control structure used to pass modem info
*/
typedef struct
{
#define MODEM_SIGNAL_DTRDSR        0x01
#define MODEM_SIGNAL_RTSCTS        0x02
#define MODEM_SIGNAL_RI            0x04
#define MODEM_SIGNAL_DCD           0x08

    UINT8   modem_signal;       /* [DTR/DSR | RTS/CTS | RI | DCD ] */

    UINT8   break_signal;       /* 0-3 s in steps of 200 ms */

    UINT8   discard_buffers;    /* 0 - do not discard, 1 - discard */

#define RFCOMM_CTRL_BREAK_ASAP      0
#define RFCOMM_CTRL_BREAK_IN_SEQ    1

    UINT8   break_signal_seq;   /* as soon as possible | in sequence (default) */

    BOOLEAN fc;                 /* TRUE when the device is unable to accept frames */
} tPORT_CTRL;


/*
** RFCOMM multiplexer Control Block
*/
typedef struct
{
    TIMER_LIST_ENT tle;       /* Timer list entry */
    BUFFER_Q  cmd_q;          /* Queue for command messages on this mux */
    UINT8     port_inx[RFCOMM_MAX_DLCI + 1];  /* Array for quick access to  */
                                              /* tPORT based on dlci        */
    BD_ADDR   bd_addr;        /* BD ADDR of the peer if initiator */
    UINT16    lcid;           /* Local cid used for this channel */
    UINT16    peer_l2cap_mtu; /* Max frame that can be sent to peer L2CAP */
    UINT8     state;          /* Current multiplexer channel state */
    UINT8     is_initiator;   /* TRUE if this side sends SABME (dlci=0) */
    BOOLEAN   local_cfg_sent;
    BOOLEAN   peer_cfg_rcvd;
    BOOLEAN   restart_required; /* TRUE if has to restart channel after disc */
    BOOLEAN   peer_ready;      /* True if other side can accept frames */
    UINT8     flow;            /* flow control mechanism for this mux */
    BOOLEAN   l2cap_congested; /* TRUE if L2CAP is congested */
    BOOLEAN   is_disc_initiator; /* TRUE if initiated disc of port */
    UINT16    pending_lcid;    /* store LCID for incoming connection while connecting */
    UINT8     pending_id;      /* store l2cap ID for incoming connection while connecting */
} tRFC_MCB;


/*
** RFCOMM Port Connection Control Block
*/
struct t_rfc_port
{
#define RFC_PORT_STATE_IDLE          0
#define RFC_PORT_STATE_WAIT_START    1
#define RFC_PORT_STATE_OPENING       2
#define RFC_PORT_STATE_OPENED        3
#define RFC_PORT_STATE_CLOSING       4

    UINT8     state;          /* Current state of the connection */

#define RFC_RSP_PN                  0x01
#define RFC_RSP_RPN_REPLY           0x02
#define RFC_RSP_RPN                 0x04
#define RFC_RSP_MSC                 0x08
#define RFC_RSP_RLS                 0x10

    UINT8    expected_rsp;

    tRFC_MCB *p_mcb;

    TIMER_LIST_ENT tle;       /* Timer list entry */
};
typedef struct t_rfc_port tRFC_PORT;


/*
** Define control block containing information about PORT connection
*/
struct t_port_info
{
    UINT8   inx;            /* Index of this control block in the port_info array */
    BOOLEAN in_use;         /* True when structure is allocated */

#define PORT_STATE_CLOSED   0
#define PORT_STATE_OPENING  1
#define PORT_STATE_OPENED   2
#define PORT_STATE_CLOSING  3

    UINT8   state;          /* State of the application */

    UINT8   scn;            /* Service channel number */
    UINT16  uuid;           /* Service UUID */

    BD_ADDR bd_addr;        /* BD ADDR of the device for the multiplexer channel */
    BOOLEAN is_server;      /* TRUE if the server application */
    UINT8   dlci;           /* DLCI of the connection */

    UINT8   error;          /* Last error detected */

    UINT8   line_status;    /* Line status as reported by peer */

    UINT8   default_signal_state; /* Initial signal state depending on uuid */

    UINT16  mtu;            /* Max MTU that port can receive */
    UINT16  peer_mtu;       /* Max MTU that port can send */

    tPORT_DATA tx;          /* Control block for data from app to peer */
    tPORT_DATA rx;          /* Control block for data from peer to app */

    tPORT_STATE user_port_pars;  /* Port parameters for user connection */
    tPORT_STATE peer_port_pars;  /* Port parameters for user connection */

    tPORT_CTRL  local_ctrl;
    tPORT_CTRL  peer_ctrl;

#define PORT_CTRL_REQ_SENT          0x01
#define PORT_CTRL_REQ_CONFIRMED     0x02
#define PORT_CTRL_IND_RECEIVED      0x04
#define PORT_CTRL_IND_RESPONDED     0x08

    UINT8       port_ctrl;                  /* Modem Status Command  */

    BOOLEAN     rx_flag_ev_pending;         /* RXFLAG Character is received */

    tRFC_PORT   rfc;                        /* RFCOMM port control block */

    UINT32      ev_mask;                    /* Event mask for the callback */
    tPORT_CALLBACK      *p_callback;        /* Pointer to users callback function */
    tPORT_CALLBACK      *p_mgmt_callback;   /* Callback function to receive connection up/down */
    tPORT_DATA_CALLBACK *p_data_callback;   /* Callback function to receive data indications */
    tPORT_DATA_CO_CALLBACK *p_data_co_callback;   /* Callback function with callouts and flowctrl */
    UINT16      credit_tx;                  /* Flow control credits for tx path */
    UINT16      credit_rx;                  /* Flow control credits for rx path, this is */
                                            /* number of buffers peer is allowed to sent */
    UINT16      credit_rx_max;              /* Max number of credits we will allow this guy to sent */
    UINT16      credit_rx_low;              /* Number of credits when we send credit update */
    UINT16      rx_buf_critical;            /* port receive queue critical watermark level */
    BOOLEAN     keep_port_handle;           /* TRUE if port is not deallocated when closing */
                                            /* it is set to TRUE for server when allocating port */
    UINT16      keep_mtu;                   /* Max MTU that port can receive by server */
};
typedef struct t_port_info tPORT;


/* Define the PORT/RFCOMM control structure
*/
typedef struct
{
    tPORT        port[MAX_RFC_PORTS];            /* Port info pool */
    tRFC_MCB     rfc_mcb[MAX_BD_CONNECTIONS];    /* RFCOMM bd_connections pool */
} tPORT_CB;

#ifdef __cplusplus
extern "C" {
#endif

/*
** Functions provided by the port_utils.c
*/
extern tPORT    *port_allocate_port (UINT8 dlci, BD_ADDR bd_addr);
extern void     port_set_defaults (tPORT *p_port);
extern void     port_select_mtu (tPORT *p_port);
extern void     port_release_port (tPORT *p_port);
extern tPORT    *port_find_mcb_dlci_port (tRFC_MCB *p_mcb, UINT8 dlci);
extern tRFC_MCB *port_find_mcb (BD_ADDR bd_addr);
extern tPORT    *port_find_dlci_port (UINT8 dlci);
extern tPORT    *port_find_port (UINT8 dlci, BD_ADDR bd_addr);
extern UINT32   port_get_signal_changes (tPORT *p_port, UINT8 old_signals, UINT8 signal);
extern UINT32   port_flow_control_user (tPORT *p_port);
extern void     port_flow_control_peer(tPORT *p_port, BOOLEAN enable, UINT16 count);

/*
** Functions provided by the port_rfc.c
*/
extern int  port_open_continue (tPORT *p_port);
extern void port_start_port_open (tPORT *p_port);
extern void port_start_par_neg (tPORT *p_port);
extern void port_start_control (tPORT *p_port);
extern void port_start_close (tPORT *p_port);
extern void port_rfc_closed (tPORT *p_port, UINT8 res);

#ifdef __cplusplus
}
#endif

#endif