48c1e5104bda6cf93c4d531cc795093194a4cf75
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-adapter-le.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *              http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <stdio.h>
19 #include <vconf.h>
20
21 #include "bluetooth-api.h"
22 #include "bt-internal-types.h"
23
24 #include "bt-common.h"
25 #include "bt-request-sender.h"
26 #include "bt-event-handler.h"
27
28 static gboolean is_le_scanning = FALSE;
29 static int is_scan_filter_supported = -1;
30
31 BT_EXPORT_API int bluetooth_check_adapter_le(void)
32 {
33         int ret;
34         int value;
35
36         ret = _bt_get_adapter_path(_bt_get_system_private_conn(), NULL);
37
38         if (ret != BLUETOOTH_ERROR_NONE)
39                 return BLUETOOTH_ADAPTER_LE_DISABLED;
40
41         ret = vconf_get_int(VCONFKEY_BT_LE_STATUS, &value);
42         if (ret != 0) {
43                 BT_ERR("fail to get vconf key!");
44                 return ret;
45         }
46
47         BT_DBG("value : %d", value);
48         return value == VCONFKEY_BT_LE_STATUS_ON ? BLUETOOTH_ADAPTER_LE_ENABLED :
49                                                 BLUETOOTH_ADAPTER_LE_DISABLED;
50 }
51
52 BT_EXPORT_API int bluetooth_enable_adapter_le(void)
53 {
54         int result;
55
56         BT_INIT_PARAMS();
57         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
58
59         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ENABLE_ADAPTER_LE,
60                 in_param1, in_param2, in_param3, in_param4, &out_param);
61
62         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
63         return result;
64 }
65
66 BT_EXPORT_API int bluetooth_disable_adapter_le(void)
67 {
68         int result;
69         retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_DISABLED,
70                                 BLUETOOTH_ERROR_DEVICE_NOT_ENABLED);
71
72         BT_INIT_PARAMS();
73         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
74
75         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_DISABLE_ADAPTER_LE,
76                 in_param1, in_param2, in_param3, in_param4, &out_param);
77
78         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
79
80         return result;
81 }
82
83 void _bt_set_le_scan_status(gboolean mode)
84 {
85         BT_DBG("set LE scan mode : %d -> %d", is_le_scanning, mode);
86         is_le_scanning = mode;
87 }
88
89 BT_EXPORT_API gboolean bluetooth_is_le_scanning(void)
90 {
91         return is_le_scanning;
92 }
93
94 BT_EXPORT_API int bluetooth_start_le_discovery(void)
95 {
96         int result;
97
98         BT_CHECK_ENABLED_ANY(return);
99
100         BT_INIT_PARAMS();
101         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
102
103         BT_INFO_C("### Start LE scan");
104         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_LE_DISCOVERY,
105                 in_param1, in_param2, in_param3, in_param4, &out_param);
106
107         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
108
109         if (result == BLUETOOTH_ERROR_NONE)
110                 _bt_set_le_scan_status(TRUE);
111
112         return result;
113 }
114
115 BT_EXPORT_API int bluetooth_stop_le_discovery(void)
116 {
117         int result;
118
119         BT_CHECK_ENABLED_ANY(return);
120
121         BT_INIT_PARAMS();
122         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
123
124         BT_INFO_C("### Stop LE scan");
125         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_STOP_LE_DISCOVERY,
126                 in_param1, in_param2, in_param3, in_param4, &out_param);
127
128         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
129
130         _bt_set_le_scan_status(FALSE);
131
132         return result;
133 }
134
135 BT_EXPORT_API int bluetooth_is_le_discovering(void)
136 {
137         int result;
138         int is_discovering = FALSE;
139
140         BT_CHECK_ENABLED_ANY(return);
141
142         BT_INIT_PARAMS();
143         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
144
145         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_DISCOVERYING,
146                 in_param1, in_param2, in_param3, in_param4, &out_param);
147
148         if (result == BLUETOOTH_ERROR_NONE) {
149                 is_discovering = g_array_index(out_param,
150                                 int, 0);
151         } else {
152                 BT_ERR("Fail to send request");
153         }
154
155         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
156
157         return is_discovering;
158 }
159
160 BT_EXPORT_API gboolean bluetooth_is_scan_filter_supported(void)
161 {
162         int result;
163
164         if (is_scan_filter_supported == -1) {
165                 BT_INIT_PARAMS();
166                 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
167
168                 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SCAN_FILTER_SUPPORTED,
169                         in_param1, in_param2, in_param3, in_param4, &out_param);
170
171                 if (result == BLUETOOTH_ERROR_NONE)
172                         is_scan_filter_supported = g_array_index(out_param, int, 0);
173                 else
174                         BT_ERR("Fail to send request");
175
176                 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
177         }
178
179         if (is_scan_filter_supported == 1)
180                 return TRUE;
181
182         return FALSE;
183 }
184
185 BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
186 {
187         int result;
188
189         BT_CHECK_ENABLED_ANY(return);
190
191         BT_INIT_PARAMS();
192         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
193
194         g_array_append_vals(in_param1, filter, sizeof(bluetooth_le_scan_filter_t));
195
196         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
197                 in_param1, in_param2, in_param3, in_param4, &out_param);
198
199         if (result == BLUETOOTH_ERROR_NONE)
200                 *slot_id = g_array_index(out_param, int, 0);
201         else
202                 BT_ERR("Fail to send request");
203
204         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
205
206         return result;
207 }
208
209 BT_EXPORT_API int bluetooth_unregister_scan_filter(int slot_id)
210 {
211         int result;
212
213         BT_CHECK_ENABLED_ANY(return);
214
215         BT_INIT_PARAMS();
216         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
217
218         g_array_append_vals(in_param1, &slot_id, sizeof(int));
219
220         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER,
221                 in_param1, in_param2, in_param3, in_param4, &out_param);
222
223         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
224
225         return result;
226 }
227
228 BT_EXPORT_API int bluetooth_unregister_all_scan_filters(void)
229 {
230         int result;
231
232         BT_CHECK_ENABLED_ANY(return);
233
234         BT_INIT_PARAMS();
235         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
236
237         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS,
238                 in_param1, in_param2, in_param3, in_param4, &out_param);
239
240         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
241
242         return result;
243 }
244
245 gboolean __bluetooth_is_privileged_process(void)
246 {
247         FILE *fp = NULL;
248         char path[30] = {0, };
249         char buf[256] = {0, };
250
251         snprintf(path, sizeof(path), "/proc/%d/cmdline", getpid());
252         fp = fopen(path, "r");
253         if (fp == NULL)
254                 return FALSE;
255
256         if (fgets(buf, 256, fp) != NULL) {
257                 if (strstr(buf, "weconnd") != NULL) {
258                         fclose(fp);
259                         return TRUE;
260                 }
261         }
262
263         fclose(fp);
264         return FALSE;
265 }
266
267 BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable)
268 {
269         int result;
270         gboolean use_reserved_slot = TRUE;
271
272         BT_CHECK_ENABLED_ANY(return);
273
274         if (TIZEN_PROFILE_WEARABLE)
275                 use_reserved_slot = __bluetooth_is_privileged_process();
276
277         BT_INIT_PARAMS();
278         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
279
280         g_array_append_vals(in_param1, &handle, sizeof(int));
281         g_array_append_vals(in_param2, &enable, sizeof(gboolean));
282         g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
283
284         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING,
285                 in_param1, in_param2, in_param3, in_param4, &out_param);
286
287         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
288
289         return result;
290 }
291
292 BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable,
293                                                 bluetooth_advertising_params_t *params)
294 {
295         int result;
296         gboolean use_reserved_slot = TRUE;
297
298         BT_CHECK_ENABLED_ANY(return);
299
300         if (TIZEN_PROFILE_WEARABLE)
301         use_reserved_slot = __bluetooth_is_privileged_process();
302
303         BT_INIT_PARAMS();
304         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
305
306         g_array_append_vals(in_param1, &handle, sizeof(int));
307         g_array_append_vals(in_param2, &enable, sizeof(gboolean));
308         g_array_append_vals(in_param3, params, sizeof(bluetooth_advertising_params_t));
309         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
310
311         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING,
312                 in_param1, in_param2, in_param3, in_param4, &out_param);
313
314         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
315
316         return result;
317 }
318
319 BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *adv_data, int *length)
320 {
321         int result;
322         guint8 *data;
323
324         BT_CHECK_PARAMETER(adv_data, return);
325         BT_CHECK_PARAMETER(length, return);
326         BT_CHECK_ENABLED_ANY(return);
327
328         BT_INIT_PARAMS();
329         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
330
331         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ADVERTISING_DATA,
332                 in_param1, in_param2, in_param3, in_param4, &out_param);
333
334         if (result == BLUETOOTH_ERROR_NONE) {
335                 data = &g_array_index(out_param, guint8, 0);
336                 *length = out_param->len;
337
338                 memset(adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
339                 memcpy(adv_data->data, data, *length);
340         }
341
342         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
343
344         return result;
345 }
346
347 BT_EXPORT_API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length)
348 {
349         int result;
350         gboolean use_reserved_slot = TRUE;
351
352         BT_CHECK_PARAMETER(value, return);
353         BT_CHECK_ENABLED_ANY(return);
354
355         if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
356                 return BLUETOOTH_ERROR_INVALID_PARAM;
357
358         if (TIZEN_PROFILE_WEARABLE)
359                 use_reserved_slot = __bluetooth_is_privileged_process();
360
361         BT_INIT_PARAMS();
362         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
363
364         g_array_append_vals(in_param1, &handle, sizeof(int));
365         g_array_append_vals(in_param2, value, sizeof(bluetooth_advertising_data_t));
366         g_array_append_vals(in_param3, &length, sizeof(int));
367         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
368
369         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA,
370                 in_param1, in_param2, in_param3, in_param4, &out_param);
371
372         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
373
374         return result;
375 }
376
377 BT_EXPORT_API int bluetooth_get_scan_response_data(bluetooth_scan_resp_data_t *value, int *length)
378 {
379         int result;
380         guint8 *data;
381
382         BT_CHECK_PARAMETER(value, return);
383         BT_CHECK_PARAMETER(length, return);
384         BT_CHECK_ENABLED_ANY(return);
385
386         BT_INIT_PARAMS();
387         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
388
389         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SCAN_RESPONSE_DATA,
390                 in_param1, in_param2, in_param3, in_param4, &out_param);
391
392         if (result == BLUETOOTH_ERROR_NONE) {
393                 data = &g_array_index(out_param, guint8, 0);
394                 *length = out_param->len;
395
396                 memset(value, 0x00, sizeof(bluetooth_scan_resp_data_t));
397                 memcpy(value->data, data, *length);
398         }
399
400         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
401
402         return result;
403 }
404
405 BT_EXPORT_API int bluetooth_set_scan_response_data(int handle,
406                         const bluetooth_scan_resp_data_t *value, int length)
407 {
408         int result;
409         gboolean use_reserved_slot = TRUE;
410
411         BT_CHECK_PARAMETER(value, return);
412         BT_CHECK_ENABLED_ANY(return);
413
414         if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
415                 return BLUETOOTH_ERROR_INVALID_PARAM;
416
417         if (TIZEN_PROFILE_WEARABLE)
418                 use_reserved_slot = __bluetooth_is_privileged_process();
419
420         BT_INIT_PARAMS();
421         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
422
423         g_array_append_vals(in_param1, &handle, sizeof(int));
424         g_array_append_vals(in_param2, value, length);
425         g_array_append_vals(in_param3, &length, sizeof(int));
426         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
427
428         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA,
429                 in_param1, in_param2, in_param3, in_param4, &out_param);
430
431         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
432
433         return result;
434 }
435
436 BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params)
437 {
438         int result;
439
440         BT_CHECK_ENABLED_ANY(return);
441
442         BT_INIT_PARAMS();
443         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
444
445         g_array_append_vals(in_param1, params, sizeof(bluetooth_le_scan_params_t));
446
447         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_PARAMETERS,
448                 in_param1, in_param2, in_param3, in_param4, &out_param);
449
450         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
451
452         return result;
453 }
454
455 BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
456 {
457         int result;
458
459         BT_CHECK_ENABLED_ANY(return);
460
461         BT_INIT_PARAMS();
462         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
463
464         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
465                 in_param1, in_param2, in_param3, in_param4, &out_param);
466
467         if (result == BLUETOOTH_ERROR_NONE)
468                 *is_advertising = g_array_index(out_param, int, 0);
469         else
470                 BT_ERR("Fail to send request");
471
472         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
473
474         return result;
475 }
476
477 BT_EXPORT_API int bluetooth_add_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
478 {
479         int result;
480
481         BT_CHECK_PARAMETER(address, return);
482         BT_CHECK_ENABLED_ANY(return);
483
484         BT_INIT_PARAMS();
485         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
486
487         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
488         g_array_append_vals(in_param2, &address_type, sizeof(int));
489
490         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ADD_WHITE_LIST,
491                 in_param1, in_param2, in_param3, in_param4, &out_param);
492
493         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
494
495         return result;
496 }
497
498 BT_EXPORT_API int bluetooth_remove_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
499 {
500         int result;
501
502         BT_CHECK_PARAMETER(address, return);
503         BT_CHECK_ENABLED_ANY(return);
504
505         BT_INIT_PARAMS();
506         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
507
508         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
509         g_array_append_vals(in_param2, &address_type, sizeof(int));
510
511         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REMOVE_WHITE_LIST,
512                 in_param1, in_param2, in_param3, in_param4, &out_param);
513
514         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
515
516         return result;
517 }
518
519 BT_EXPORT_API int bluetooth_clear_white_list(void)
520 {
521         int result;
522
523         BT_CHECK_ENABLED_ANY(return);
524
525         BT_INIT_PARAMS();
526         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
527
528         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CLEAR_WHITE_LIST,
529                 in_param1, in_param2, in_param3, in_param4, &out_param);
530
531         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
532
533         return result;
534 }
535
536 BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy)
537 {
538         int result;
539
540         BT_CHECK_ENABLED_ANY(return);
541
542         BT_INIT_PARAMS();
543         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
544
545         g_array_append_vals(in_param1, &enable_privacy, sizeof(gboolean));
546
547         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_PRIVACY,
548                 in_param1, in_param2, in_param3, in_param4, &out_param);
549
550         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
551
552         return result;
553 }
554
555 BT_EXPORT_API int bluetooth_set_le_static_random_address(gboolean enable)
556 {
557         int result;
558
559         BT_CHECK_ENABLED_ANY(return);
560
561         BT_INIT_PARAMS();
562         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
563
564         g_array_append_vals(in_param1, &enable, sizeof(gboolean));
565
566         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_STATIC_RANDOM_ADDRESS,
567                 in_param1, in_param2, in_param3, in_param4, &out_param);
568
569         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
570
571         return result;
572 }
573
574 BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void)
575 {
576         if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS)
577                      == BLUETOOTH_ERROR_PERMISSION_DEINED) {
578                 BT_ERR("Don't have a privilege to use this API");
579                 return BLUETOOTH_ERROR_PERMISSION_DEINED;
580         }
581
582         return BLUETOOTH_ERROR_NONE;
583 }
584
585 BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data)
586 {
587         int ret;
588
589         ret = _bt_register_event(BT_LE_ADAPTER_EVENT, (void *)callback_ptr, user_data);
590         if (ret != BLUETOOTH_ERROR_NONE &&
591             ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
592                 BT_ERR("Fail to register BT_LE_ADAPTER_EVENT event : %d", ret);
593                 return ret;
594         }
595
596         return BLUETOOTH_ERROR_NONE;
597 }
598
599 BT_EXPORT_API int bluetooth_le_unregister_callback(void)
600 {
601         _bt_unregister_event(BT_LE_ADAPTER_EVENT);
602
603         return BLUETOOTH_ERROR_NONE;
604 }
605
606 BT_EXPORT_API int bluetooth_le_read_maximum_data_length(
607                         bluetooth_le_read_maximum_data_length_t *max_le_datalength)
608 {
609         BT_CHECK_ENABLED_ANY(return);
610         BT_INIT_PARAMS();
611         int result;
612         bluetooth_le_read_maximum_data_length_t *datalength = NULL;
613
614         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
615
616         result = _bt_send_request(BT_BLUEZ_SERVICE,
617                 BT_LE_READ_MAXIMUM_DATA_LENGTH,
618                 in_param1, in_param2, in_param3, in_param4, &out_param);
619
620         if (result == BLUETOOTH_ERROR_NONE) {
621                 datalength = &g_array_index(out_param,
622                         bluetooth_le_read_maximum_data_length_t, 0);
623                 max_le_datalength->max_tx_octets  = datalength->max_tx_octets;
624                 max_le_datalength->max_tx_time = datalength->max_tx_time;
625                 max_le_datalength->max_rx_octets = datalength->max_rx_octets;
626                 max_le_datalength->max_rx_time = datalength->max_rx_time;
627         }
628
629         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
630
631         return result;
632 }
633
634 BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length(
635         const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
636 {
637         BT_CHECK_ENABLED_ANY(return);
638         BT_INIT_PARAMS();
639
640         int result;
641
642         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
643
644         g_array_append_vals(in_param1, &def_tx_Octets, sizeof(guint));
645         g_array_append_vals(in_param2, &def_tx_Time, sizeof(guint));
646
647         result = _bt_send_request(BT_BLUEZ_SERVICE,
648                 BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
649                 in_param1, in_param2, in_param3, in_param4, &out_param);
650
651         if (result != BLUETOOTH_ERROR_NONE)
652                 BT_ERR("Failed to Write the host suggested default data length values : %d", result);
653
654         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
655
656         return result;
657 }
658
659 BT_EXPORT_API int bluetooth_le_read_suggested_default_data_length(
660         bluetooth_le_read_host_suggested_data_length_t *le_data_length)
661 {
662         BT_CHECK_ENABLED_ANY(return);
663         BT_INIT_PARAMS();
664
665         int result;
666         bluetooth_le_read_host_suggested_data_length_t *data_values = NULL;
667         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
668
669         result = _bt_send_request(BT_BLUEZ_SERVICE,
670                 BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
671                 in_param1, in_param2, in_param3, in_param4, &out_param);
672
673         if (result == BLUETOOTH_ERROR_NONE) {
674                 data_values = &g_array_index(out_param,
675                         bluetooth_le_read_host_suggested_data_length_t, 0);
676
677                 le_data_length->def_tx_octets = data_values->def_tx_octets;
678                 le_data_length->def_tx_time = data_values->def_tx_time;
679         }
680
681         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
682
683         return result;
684 }
685
686 BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *address,
687         const unsigned int max_tx_octets, const unsigned int max_tx_time)
688 {
689         BT_CHECK_ENABLED_ANY(return);
690         BT_INIT_PARAMS();
691
692         int result;
693
694         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
695
696         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
697         g_array_append_vals(in_param2, &max_tx_octets, sizeof(guint));
698         g_array_append_vals(in_param3, &max_tx_time, sizeof(guint));
699
700         result = _bt_send_request(BT_BLUEZ_SERVICE,
701                 BT_LE_SET_DATA_LENGTH,
702                 in_param1, in_param2, in_param3, in_param4, &out_param);
703
704         if (result != BLUETOOTH_ERROR_NONE)
705                 BT_ERR("Failed to Set data length values : %d", result);
706
707         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
708
709         return result;
710 }
711
712 BT_EXPORT_API int bluetooth_is_le_2m_phy_supported(gboolean *is_supported)
713 {
714         int result;
715
716         BT_CHECK_PARAMETER(is_supported, return);
717         BT_CHECK_ENABLED_ANY(return);
718
719         BT_INIT_PARAMS();
720         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
721
722         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_2M_PHY_SUPPORTED,
723                         in_param1, in_param2, in_param3, in_param4, &out_param);
724
725         if (result == BLUETOOTH_ERROR_NONE) {
726                 *is_supported = g_array_index(out_param, int, 0);
727         } else {
728                 BT_ERR("Fail to send request");
729         }
730
731         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
732
733         BT_INFO("LE 2M PHY Support[%s]", *is_supported ? "TRUE" : "FALSE");
734         return result;
735 }
736
737 BT_EXPORT_API int bluetooth_is_le_coded_phy_supported(gboolean *is_supported)
738 {
739         int result;
740
741         BT_CHECK_PARAMETER(is_supported, return);
742         BT_CHECK_ENABLED_ANY(return);
743
744         BT_INIT_PARAMS();
745         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
746
747         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_CODED_PHY_SUPPORTED,
748                         in_param1, in_param2, in_param3, in_param4, &out_param);
749
750         if (result == BLUETOOTH_ERROR_NONE) {
751                 *is_supported = g_array_index(out_param, int, 0);
752         } else {
753                 BT_ERR("Fail to send request");
754         }
755
756         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
757
758         BT_INFO("LE CODED PHY Support[%s]", *is_supported ? "TRUE" : "FALSE");
759         return result;
760 }