• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *  MCAP for BlueZ - Bluetooth protocol stack for Linux
4  *
5  *  Copyright (C) 2010 GSyC/LibreSoft, Universidad Rey Juan Carlos.
6  *
7  *  Authors:
8  *  Santiago Carot-Nemesio <sancane at gmail.com>
9  *  Jose Antonio Santos-Cadenas <santoscadenas at gmail.com>
10  *
11  *  This program is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
24  *
25  */
26 
27 #ifndef __MCAP_INTERNAL_H
28 #define __MCAP_INTERNAL_H
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 typedef enum {
35 	MCL_CONNECTED,
36 	MCL_PENDING,
37 	MCL_ACTIVE,
38 	MCL_IDLE
39 } MCLState;
40 
41 typedef enum {
42 	MCL_ACCEPTOR,
43 	MCL_INITIATOR
44 } MCLRole;
45 
46 typedef enum {
47 	MCL_AVAILABLE,
48 	MCL_WAITING_RSP
49 } MCAPCtrl;
50 
51 typedef enum {
52 	MDL_WAITING,
53 	MDL_CONNECTED,
54 	MDL_DELETING,
55 	MDL_CLOSED
56 } MDLState;
57 
58 struct mcap_mdl_cb {
59 	mcap_mdl_event_cb		mdl_connected;	/* Remote device has created a MDL */
60 	mcap_mdl_event_cb		mdl_closed;	/* Remote device has closed a MDL */
61 	mcap_mdl_event_cb		mdl_deleted;	/* Remote device requested deleting a MDL */
62 	mcap_mdl_event_cb		mdl_aborted;	/* Remote device aborted the mdl creation */
63 	mcap_remote_mdl_conn_req_cb	mdl_conn_req;	/* Remote device requested creating a MDL */
64 	mcap_remote_mdl_reconn_req_cb	mdl_reconn_req;	/* Remote device requested reconnecting a MDL */
65 	gpointer			user_data;	/* User data */
66 };
67 
68 struct mcap_instance {
69 	bdaddr_t		src;			/* Source address */
70 	GIOChannel		*ccio;			/* Control Channel IO */
71 	GIOChannel		*dcio;			/* Data Channel IO */
72 	GSList			*mcls;			/* MCAP instance list */
73 	GSList			*cached;		/* List with all cached MCLs (MAX_CACHED macro) */
74 	BtIOSecLevel		sec;			/* Security level */
75 	mcap_mcl_event_cb	mcl_connected_cb;	/* New MCL connected */
76 	mcap_mcl_event_cb	mcl_reconnected_cb;	/* Old MCL has been reconnected */
77 	mcap_mcl_event_cb	mcl_disconnected_cb;	/* MCL disconnected */
78 	mcap_mcl_event_cb	mcl_uncached_cb;	/* MCL has been removed from MCAP cache */
79 	mcap_info_ind_event_cb	mcl_sync_infoind_cb;	/* (CSP Master) Received info indication */
80 	gpointer		user_data;		/* Data to be provided in callbacks */
81 	gint			ref;			/* Reference counter */
82 
83 	gboolean		csp_enabled;		/* CSP: functionality enabled */
84 };
85 
86 struct mcap_csp;
87 struct mcap_mdl_op_cb;
88 
89 struct mcap_mcl {
90 	struct mcap_instance	*mi;		/* MCAP instance where this MCL belongs */
91 	bdaddr_t		addr;		/* Device address */
92 	GIOChannel		*cc;		/* MCAP Control Channel IO */
93 	guint			wid;		/* MCL Watcher id */
94 	GSList			*mdls;		/* List of Data Channels shorted by mdlid */
95 	MCLState		state;		/* Current MCL State */
96 	MCLRole			role;		/* Initiator or acceptor of this MCL */
97 	MCAPCtrl		req;		/* Request control flag */
98 	struct mcap_mdl_op_cb	*priv_data;	/* Temporal data to manage responses */
99 	struct mcap_mdl_cb	*cb;		/* MDL callbacks */
100 	guint			tid;		/* Timer id for waiting for a response */
101 	uint8_t			*lcmd;		/* Last command sent */
102 	gint			ref;		/* References counter */
103 	uint8_t			ctrl;		/* MCL control flag */
104 	uint16_t		next_mdl;	/* id used to create next MDL */
105 	struct mcap_csp		*csp;		/* CSP control structure */
106 };
107 
108 #define	MCAP_CTRL_CACHED	0x01	/* MCL is cached */
109 #define	MCAP_CTRL_STD_OP	0x02	/* Support for standard op codes */
110 #define	MCAP_CTRL_SYNC_OP	0x04	/* Support for synchronization commands */
111 #define	MCAP_CTRL_CONN		0x08	/* MCL is in connecting process */
112 #define	MCAP_CTRL_FREE		0x10	/* MCL is marked as releasable */
113 #define	MCAP_CTRL_NOCACHE	0x20	/* MCL is marked as not cacheable */
114 
115 struct mcap_mdl {
116 	struct mcap_mcl		*mcl;		/* MCL where this MDL belongs */
117 	GIOChannel		*dc;		/* MCAP Data Channel IO */
118 	guint			wid;		/* MDL Watcher id */
119 	uint16_t		mdlid;		/* MDL id */
120 	uint8_t			mdep_id;	/* MCAP Data End Point */
121 	MDLState		state;		/* MDL state */
122 	gint			ref;		/* References counter */
123 };
124 
125 struct sync_info_ind_data {
126 	uint32_t	btclock;
127 	uint64_t	timestamp;
128 	uint16_t	accuracy;
129 };
130 
131 int mcap_send_data(int sock, const void *buf, uint32_t size);
132 
133 void proc_sync_cmd(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len);
134 void mcap_sync_init(struct mcap_mcl *mcl);
135 void mcap_sync_stop(struct mcap_mcl *mcl);
136 
137 #ifdef __cplusplus
138 }
139 #endif
140 
141 #endif /* __MCAP_INTERNAL_H */
142