1 /******************************************************************************
2  *
3  *  Copyright (C) 2003-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 is the private file for the BTA GATT server.
22  *
23  ******************************************************************************/
24 #ifndef BTA_GATTS_INT_H
25 #define BTA_GATTS_INT_H
26 
27 #include "common/bt_target.h"
28 #include "bta/bta_sys.h"
29 #include "bta/bta_gatt_api.h"
30 #include "stack/gatt_api.h"
31 
32 
33 /*****************************************************************************
34 **  Constants and data types
35 *****************************************************************************/
36 enum {
37     BTA_GATTS_API_REG_EVT  = BTA_SYS_EVT_START(BTA_ID_GATTS),
38     BTA_GATTS_INT_START_IF_EVT,
39     BTA_GATTS_API_DEREG_EVT,
40     BTA_GATTS_API_CREATE_SRVC_EVT,
41     BTA_GATTS_API_INDICATION_EVT,
42 
43     BTA_GATTS_API_ADD_INCL_SRVC_EVT,
44     BTA_GATTS_API_ADD_CHAR_EVT,
45     BTA_GATTS_API_ADD_DESCR_EVT,
46     BTA_GATTS_API_DEL_SRVC_EVT,
47     BTA_GATTS_API_START_SRVC_EVT,
48     BTA_GATTS_API_STOP_SRVC_EVT,
49     BTA_GATTS_API_RSP_EVT,
50     BTA_GATTS_API_SET_ATTR_VAL_EVT,
51     BTA_GATTS_API_OPEN_EVT,
52     BTA_GATTS_API_CANCEL_OPEN_EVT,
53     BTA_GATTS_API_CLOSE_EVT,
54     BTA_GATTS_API_LISTEN_EVT,
55     BTA_GATTS_API_DISABLE_EVT,
56     BTA_GATTS_API_SEND_SERVICE_CHANGE_EVT
57 };
58 typedef UINT16 tBTA_GATTS_INT_EVT;
59 
60 /* max number of application allowed on device */
61 #define BTA_GATTS_MAX_APP_NUM   GATT_MAX_SR_PROFILES
62 
63 /* max number of services allowed in the device */
64 #define BTA_GATTS_MAX_SRVC_NUM   GATT_MAX_SR_PROFILES
65 
66 /* internal strucutre for GATTC register API  */
67 typedef struct {
68     BT_HDR                  hdr;
69     tBT_UUID                app_uuid;
70     tBTA_GATTS_CBACK        *p_cback;
71 } tBTA_GATTS_API_REG;
72 
73 typedef struct {
74     BT_HDR                  hdr;
75     tBTA_GATTS_IF           server_if;
76 } tBTA_GATTS_INT_START_IF;
77 
78 typedef tBTA_GATTS_INT_START_IF tBTA_GATTS_API_DEREG;
79 
80 typedef struct {
81     BT_HDR                  hdr;
82     tBTA_GATTS_IF           server_if;
83     tBT_UUID                service_uuid;
84     UINT16                  num_handle;
85     UINT8                   inst;
86     BOOLEAN                 is_pri;
87 
88 } tBTA_GATTS_API_CREATE_SRVC;
89 
90 typedef struct {
91     BT_HDR                  hdr;
92     tBT_UUID                char_uuid;
93     tBTA_GATT_PERM          perm;
94     tBTA_GATT_CHAR_PROP     property;
95     tBTA_GATTS_ATTR_CONTROL control;
96     tBTA_GATT_ATTR_VAL      attr_val;
97 } tBTA_GATTS_API_ADD_CHAR;
98 
99 typedef struct {
100     BT_HDR                  hdr;
101     UINT16                  included_service_id;
102 } tBTA_GATTS_API_ADD_INCL_SRVC;
103 
104 typedef struct {
105     BT_HDR                  hdr;
106     tBT_UUID                descr_uuid;
107     tBTA_GATT_PERM          perm;
108     tBTA_GATTS_ATTR_CONTROL control;
109     tBTA_GATT_ATTR_VAL      attr_val;
110 } tBTA_GATTS_API_ADD_DESCR;
111 
112 typedef struct {
113     BT_HDR  hdr;
114     UINT16  attr_id;
115     UINT16  len;
116     BOOLEAN need_confirm;
117     UINT8   value[BTA_GATT_MAX_ATTR_LEN];
118 } tBTA_GATTS_API_INDICATION;
119 
120 typedef struct {
121     BT_HDR              hdr;
122     UINT32              trans_id;
123     tBTA_GATT_STATUS    status;
124     tBTA_GATTS_RSP      *p_rsp;
125 } tBTA_GATTS_API_RSP;
126 
127 typedef struct{
128     BT_HDR              hdr;
129     UINT16 length;
130     UINT8 *value;
131 }tBTA_GATTS_API_SET_ATTR_VAL;
132 
133 typedef struct {
134     BT_HDR                  hdr;
135     tBTA_GATT_TRANSPORT     transport;
136 } tBTA_GATTS_API_START;
137 
138 
139 typedef struct {
140     BT_HDR                  hdr;
141     BD_ADDR                 remote_bda;
142     tBTA_GATTS_IF           server_if;
143     BOOLEAN                 is_direct;
144     tBTA_GATT_TRANSPORT     transport;
145 
146 } tBTA_GATTS_API_OPEN;
147 
148 typedef tBTA_GATTS_API_OPEN tBTA_GATTS_API_CANCEL_OPEN;
149 
150 typedef struct {
151     BT_HDR                  hdr;
152     BD_ADDR_PTR             remote_bda;
153     tBTA_GATTS_IF           server_if;
154     BOOLEAN                 start;
155 } tBTA_GATTS_API_LISTEN;
156 
157 typedef struct {
158     BT_HDR                  hdr;
159     tBTA_GATTS_IF           server_if;
160     BD_ADDR                 remote_bda;
161 } tBTA_GATTS_API_SEND_SERVICE_CHANGE;
162 
163 typedef union {
164     BT_HDR                          hdr;
165     tBTA_GATTS_API_REG              api_reg;
166     tBTA_GATTS_API_DEREG            api_dereg;
167     tBTA_GATTS_API_CREATE_SRVC      api_create_svc;
168     tBTA_GATTS_API_ADD_INCL_SRVC    api_add_incl_srvc;
169     tBTA_GATTS_API_ADD_CHAR         api_add_char;
170     tBTA_GATTS_API_ADD_DESCR        api_add_char_descr;
171     tBTA_GATTS_API_START            api_start;
172     tBTA_GATTS_API_INDICATION       api_indicate;
173     tBTA_GATTS_API_RSP              api_rsp;
174     tBTA_GATTS_API_SET_ATTR_VAL     api_set_val;
175     tBTA_GATTS_API_OPEN             api_open;
176     tBTA_GATTS_API_CANCEL_OPEN      api_cancel_open;
177 
178     tBTA_GATTS_INT_START_IF         int_start_if;
179     /* if peripheral role is supported */
180     tBTA_GATTS_API_LISTEN           api_listen;
181     tBTA_GATTS_API_SEND_SERVICE_CHANGE api_send_service_change;
182 } tBTA_GATTS_DATA;
183 
184 /* application registration control block */
185 typedef struct {
186     BOOLEAN             in_use;
187     tBT_UUID            app_uuid;
188     tBTA_GATTS_CBACK    *p_cback;
189     tBTA_GATTS_IF       gatt_if;
190 } tBTA_GATTS_RCB;
191 
192 /* service registration control block */
193 typedef struct {
194     tBT_UUID    service_uuid;   /* service UUID */
195     UINT16      service_id;     /* service handle */
196     UINT8       inst_num;       /* instance ID */
197     UINT8       rcb_idx;
198     UINT8       idx;            /* self index of serviec CB */
199     BOOLEAN     in_use;
200 
201 } tBTA_GATTS_SRVC_CB;
202 
203 
204 /* GATT server control block */
205 typedef struct {
206     BOOLEAN             enabled;
207     tBTA_GATTS_RCB      rcb[BTA_GATTS_MAX_APP_NUM];
208     tBTA_GATTS_SRVC_CB  srvc_cb[BTA_GATTS_MAX_SRVC_NUM];
209 } tBTA_GATTS_CB;
210 
211 
212 
213 /*****************************************************************************
214 **  Global data
215 *****************************************************************************/
216 
217 /* GATTC control block */
218 #if BTA_DYNAMIC_MEMORY == FALSE
219 extern tBTA_GATTS_CB  bta_gatts_cb;
220 #else
221 extern tBTA_GATTS_CB *bta_gatts_cb_ptr;
222 #define bta_gatts_cb (*bta_gatts_cb_ptr)
223 #endif
224 
225 /*****************************************************************************
226 **  Function prototypes
227 *****************************************************************************/
228 extern BOOLEAN bta_gatts_hdl_event(BT_HDR *p_msg);
229 
230 extern void bta_gatts_api_disable(tBTA_GATTS_CB *p_cb);
231 extern void bta_gatts_api_enable(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_data);
232 extern void bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
233 extern void bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
234 extern void bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
235 extern void bta_gatts_create_srvc(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
236 extern void bta_gatts_add_include_srvc(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg);
237 extern void bta_gatts_add_char(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg);
238 extern void bta_gatts_add_char_descr(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg);
239 extern void bta_gatts_set_attr_value(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg);
240 extern tGATT_STATUS bta_gatts_get_attr_value(UINT16 attr_handle, UINT16 *length, UINT8 **value);
241 extern void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg);
242 extern void bta_gatts_start_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg);
243 extern void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA *p_msg);
244 
245 extern void bta_gatts_send_rsp(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
246 extern void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
247 
248 
249 extern void bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
250 extern void bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
251 extern void bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
252 extern void bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg);
253 extern void bta_gatts_send_service_change_indication (tBTA_GATTS_DATA *p_msg);
254 
255 extern BOOLEAN bta_gatts_uuid_compare(tBT_UUID tar, tBT_UUID src);
256 extern tBTA_GATTS_RCB *bta_gatts_find_app_rcb_by_app_if(tBTA_GATTS_IF server_if);
257 extern UINT8 bta_gatts_find_app_rcb_idx_by_app_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_IF server_if);
258 extern UINT8 bta_gatts_alloc_srvc_cb(tBTA_GATTS_CB *p_cb, UINT8 rcb_idx);
259 extern tBTA_GATTS_SRVC_CB *bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB *p_cb, UINT16 service_id);
260 extern tBTA_GATTS_SRVC_CB *bta_gatts_find_srvc_cb_by_attr_id(tBTA_GATTS_CB *p_cb, UINT16 attr_id);
261 extern void bta_gatts_deinit(void);
262 
263 #endif /* BTA_GATTS_INT_H */
264