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
|
/*
*
* MCAP for BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2010 GSyC/LibreSoft, Universidad Rey Juan Carlos.
*
* Authors:
* Santiago Carot-Nemesio <sancane at gmail.com>
* Jose Antonio Santos-Cadenas <santoscadenas at gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef __MCAP_INTERNAL_H
#define __MCAP_INTERNAL_H
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
MCL_CONNECTED,
MCL_PENDING,
MCL_ACTIVE,
MCL_IDLE
} MCLState;
typedef enum {
MCL_ACCEPTOR,
MCL_INITIATOR
} MCLRole;
typedef enum {
MCL_AVAILABLE,
MCL_WAITING_RSP
} MCAPCtrl;
typedef enum {
MDL_WAITING,
MDL_CONNECTED,
MDL_DELETING,
MDL_CLOSED
} MDLState;
struct mcap_mdl_cb {
mcap_mdl_event_cb mdl_connected; /* Remote device has created a MDL */
mcap_mdl_event_cb mdl_closed; /* Remote device has closed a MDL */
mcap_mdl_event_cb mdl_deleted; /* Remote device requested deleting a MDL */
mcap_mdl_event_cb mdl_aborted; /* Remote device aborted the mdl creation */
mcap_remote_mdl_conn_req_cb mdl_conn_req; /* Remote device requested creating a MDL */
mcap_remote_mdl_reconn_req_cb mdl_reconn_req; /* Remote device requested reconnecting a MDL */
gpointer user_data; /* User data */
};
struct mcap_instance {
bdaddr_t src; /* Source address */
GIOChannel *ccio; /* Control Channel IO */
GIOChannel *dcio; /* Data Channel IO */
GSList *mcls; /* MCAP instance list */
GSList *cached; /* List with all cached MCLs (MAX_CACHED macro) */
BtIOSecLevel sec; /* Security level */
mcap_mcl_event_cb mcl_connected_cb; /* New MCL connected */
mcap_mcl_event_cb mcl_reconnected_cb; /* Old MCL has been reconnected */
mcap_mcl_event_cb mcl_disconnected_cb; /* MCL disconnected */
mcap_mcl_event_cb mcl_uncached_cb; /* MCL has been removed from MCAP cache */
mcap_info_ind_event_cb mcl_sync_infoind_cb; /* (CSP Master) Received info indication */
gpointer user_data; /* Data to be provided in callbacks */
gint ref; /* Reference counter */
gboolean csp_enabled; /* CSP: functionality enabled */
};
struct mcap_csp;
struct mcap_mdl_op_cb;
struct mcap_mcl {
struct mcap_instance *mi; /* MCAP instance where this MCL belongs */
bdaddr_t addr; /* Device address */
GIOChannel *cc; /* MCAP Control Channel IO */
guint wid; /* MCL Watcher id */
GSList *mdls; /* List of Data Channels shorted by mdlid */
MCLState state; /* Current MCL State */
MCLRole role; /* Initiator or acceptor of this MCL */
MCAPCtrl req; /* Request control flag */
struct mcap_mdl_op_cb *priv_data; /* Temporal data to manage responses */
struct mcap_mdl_cb *cb; /* MDL callbacks */
guint tid; /* Timer id for waiting for a response */
uint8_t *lcmd; /* Last command sent */
gint ref; /* References counter */
uint8_t ctrl; /* MCL control flag */
uint16_t next_mdl; /* id used to create next MDL */
struct mcap_csp *csp; /* CSP control structure */
};
#define MCAP_CTRL_CACHED 0x01 /* MCL is cached */
#define MCAP_CTRL_STD_OP 0x02 /* Support for standard op codes */
#define MCAP_CTRL_SYNC_OP 0x04 /* Support for synchronization commands */
#define MCAP_CTRL_CONN 0x08 /* MCL is in connecting process */
#define MCAP_CTRL_FREE 0x10 /* MCL is marked as releasable */
#define MCAP_CTRL_NOCACHE 0x20 /* MCL is marked as not cacheable */
struct mcap_mdl {
struct mcap_mcl *mcl; /* MCL where this MDL belongs */
GIOChannel *dc; /* MCAP Data Channel IO */
guint wid; /* MDL Watcher id */
uint16_t mdlid; /* MDL id */
uint8_t mdep_id; /* MCAP Data End Point */
MDLState state; /* MDL state */
gint ref; /* References counter */
};
struct sync_info_ind_data {
uint32_t btclock;
uint64_t timestamp;
uint16_t accuracy;
};
int mcap_send_data(int sock, const void *buf, uint32_t size);
void proc_sync_cmd(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len);
void mcap_sync_init(struct mcap_mcl *mcl);
void mcap_sync_stop(struct mcap_mcl *mcl);
#ifdef __cplusplus
}
#endif
#endif /* __MCAP_INTERNAL_H */
|