Fix the coding rule
[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_gdbus_get_system_gconn(), 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", 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         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_LE_DISCOVERY,
104                 in_param1, in_param2, in_param3, in_param4, &out_param);
105
106         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
107
108         if (result == BLUETOOTH_ERROR_NONE)
109                 _bt_set_le_scan_status(TRUE);
110
111         return result;
112 }
113
114 BT_EXPORT_API int bluetooth_stop_le_discovery(void)
115 {
116         int result;
117
118         BT_CHECK_ENABLED_ANY(return);
119
120         BT_INIT_PARAMS();
121         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
122
123         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_STOP_LE_DISCOVERY,
124                 in_param1, in_param2, in_param3, in_param4, &out_param);
125
126         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
127
128         if (result == BLUETOOTH_ERROR_NONE)
129                 _bt_set_le_scan_status(FALSE);
130
131         return result;
132 }
133
134 BT_EXPORT_API int bluetooth_is_le_discovering(void)
135 {
136         int result;
137         int is_discovering = FALSE;
138
139         BT_CHECK_ENABLED_ANY(return);
140
141         BT_INIT_PARAMS();
142         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
143
144         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_DISCOVERYING,
145                 in_param1, in_param2, in_param3, in_param4, &out_param);
146
147         if (result == BLUETOOTH_ERROR_NONE) {
148                 is_discovering = g_array_index(out_param,
149                                 int, 0);
150         } else {
151                 BT_ERR("Fail to send request");
152         }
153
154         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
155
156         return is_discovering;
157 }
158
159 BT_EXPORT_API gboolean bluetooth_is_scan_filter_supported(void)
160 {
161         int result;
162
163         if (is_scan_filter_supported == -1) {
164                 BT_INIT_PARAMS();
165                 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
166
167                 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SCAN_FILTER_SUPPORTED,
168                         in_param1, in_param2, in_param3, in_param4, &out_param);
169
170                 if (result == BLUETOOTH_ERROR_NONE)
171                         is_scan_filter_supported = g_array_index(out_param, int, 0);
172                 else
173                         BT_ERR("Fail to send request");
174
175                 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
176         }
177
178         if (is_scan_filter_supported == 1)
179                 return TRUE;
180
181         return FALSE;
182 }
183
184 BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
185 {
186         int result;
187
188         BT_CHECK_ENABLED_ANY(return);
189
190         BT_INIT_PARAMS();
191         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
192
193         g_array_append_vals(in_param1, filter, sizeof(bluetooth_le_scan_filter_t));
194
195         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
196                 in_param1, in_param2, in_param3, in_param4, &out_param);
197
198         if (result == BLUETOOTH_ERROR_NONE)
199                 *slot_id = g_array_index(out_param, int, 0);
200         else
201                 BT_ERR("Fail to send request");
202
203         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
204
205         return result;
206 }
207
208 BT_EXPORT_API int bluetooth_unregister_scan_filter(int slot_id)
209 {
210         int result;
211
212         BT_CHECK_ENABLED_ANY(return);
213
214         BT_INIT_PARAMS();
215         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
216
217         g_array_append_vals(in_param1, &slot_id, sizeof(int));
218
219         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER,
220                 in_param1, in_param2, in_param3, in_param4, &out_param);
221
222         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
223
224         return result;
225 }
226
227 BT_EXPORT_API int bluetooth_unregister_all_scan_filters(void)
228 {
229         int result;
230
231         BT_CHECK_ENABLED_ANY(return);
232
233         BT_INIT_PARAMS();
234         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
235
236         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS,
237                 in_param1, in_param2, in_param3, in_param4, &out_param);
238
239         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
240
241         return result;
242 }
243
244 #ifdef TIZEN_PROFILE_WEARABLE
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 #endif
267
268 BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable)
269 {
270         int result;
271         gboolean use_reserved_slot = FALSE;
272
273         BT_CHECK_ENABLED_ANY(return);
274
275 #ifdef TIZEN_PROFILE_WEARABLE
276         use_reserved_slot = __bluetooth_is_privileged_process();
277 #endif
278
279         BT_INIT_PARAMS();
280         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
281
282         g_array_append_vals(in_param1, &handle, sizeof(int));
283         g_array_append_vals(in_param2, &enable, sizeof(gboolean));
284         g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean));
285
286         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING,
287                 in_param1, in_param2, in_param3, in_param4, &out_param);
288
289         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
290
291         return result;
292 }
293
294 BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable,
295                                                 bluetooth_advertising_params_t *params)
296 {
297         int result;
298         gboolean use_reserved_slot = FALSE;
299
300         BT_CHECK_ENABLED_ANY(return);
301
302 #ifdef TIZEN_PROFILE_WEARABLE
303         use_reserved_slot = __bluetooth_is_privileged_process();
304 #endif
305
306         BT_INIT_PARAMS();
307         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
308
309         g_array_append_vals(in_param1, &handle, sizeof(int));
310         g_array_append_vals(in_param2, &enable, sizeof(gboolean));
311         g_array_append_vals(in_param3, params, sizeof(bluetooth_advertising_params_t));
312         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
313
314         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING,
315                 in_param1, in_param2, in_param3, in_param4, &out_param);
316
317         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
318
319         return result;
320 }
321
322 BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *adv_data, int *length)
323 {
324         int result;
325         guint8 *data;
326
327         BT_CHECK_PARAMETER(adv_data, return);
328         BT_CHECK_PARAMETER(length, return);
329         BT_CHECK_ENABLED_ANY(return);
330
331         BT_INIT_PARAMS();
332         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
333
334         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_ADVERTISING_DATA,
335                 in_param1, in_param2, in_param3, in_param4, &out_param);
336
337         if (result == BLUETOOTH_ERROR_NONE) {
338                 data = &g_array_index(out_param, guint8, 0);
339                 *length = out_param->len;
340
341                 memset(adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
342                 memcpy(adv_data->data, data, *length);
343         }
344
345         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
346
347         return result;
348 }
349
350 BT_EXPORT_API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length)
351 {
352         int result;
353         gboolean use_reserved_slot = FALSE;
354
355         BT_CHECK_PARAMETER(value, return);
356         BT_CHECK_ENABLED_ANY(return);
357
358         if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3)
359                 return BLUETOOTH_ERROR_INVALID_PARAM;
360
361 #ifdef TIZEN_PROFILE_WEARABLE
362         use_reserved_slot = __bluetooth_is_privileged_process();
363 #endif
364
365         BT_INIT_PARAMS();
366         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
367
368         g_array_append_vals(in_param1, &handle, sizeof(int));
369         g_array_append_vals(in_param2, value, sizeof(bluetooth_advertising_data_t));
370         g_array_append_vals(in_param3, &length, sizeof(int));
371         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
372
373         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA,
374                 in_param1, in_param2, in_param3, in_param4, &out_param);
375
376         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
377
378         return result;
379 }
380
381 BT_EXPORT_API int bluetooth_get_scan_response_data(bluetooth_scan_resp_data_t *value, int *length)
382 {
383         int result;
384         guint8 *data;
385
386         BT_CHECK_PARAMETER(value, return);
387         BT_CHECK_PARAMETER(length, return);
388         BT_CHECK_ENABLED_ANY(return);
389
390         BT_INIT_PARAMS();
391         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
392
393         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GET_SCAN_RESPONSE_DATA,
394                 in_param1, in_param2, in_param3, in_param4, &out_param);
395
396         if (result == BLUETOOTH_ERROR_NONE) {
397                 data = &g_array_index(out_param, guint8, 0);
398                 *length = out_param->len;
399
400                 memset(value, 0x00, sizeof(bluetooth_scan_resp_data_t));
401                 memcpy(value->data, data, *length);
402         }
403
404         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
405
406         return result;
407 }
408
409 BT_EXPORT_API int bluetooth_set_scan_response_data(int handle,
410                         const bluetooth_scan_resp_data_t *value, int length)
411 {
412         int result;
413         gboolean use_reserved_slot = FALSE;
414
415         BT_CHECK_PARAMETER(value, return);
416         BT_CHECK_ENABLED_ANY(return);
417
418         if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX)
419                 return BLUETOOTH_ERROR_INVALID_PARAM;
420
421 #ifdef TIZEN_PROFILE_WEARABLE
422         use_reserved_slot = __bluetooth_is_privileged_process();
423 #endif
424
425         BT_INIT_PARAMS();
426         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
427
428         g_array_append_vals(in_param1, &handle, sizeof(int));
429         g_array_append_vals(in_param2, value, length);
430         g_array_append_vals(in_param3, &length, sizeof(int));
431         g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean));
432
433         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA,
434                 in_param1, in_param2, in_param3, in_param4, &out_param);
435
436         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
437
438         return result;
439 }
440
441 BT_EXPORT_API int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params)
442 {
443         int result;
444
445         BT_CHECK_ENABLED_ANY(return);
446
447         BT_INIT_PARAMS();
448         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
449
450         g_array_append_vals(in_param1, params, sizeof(bluetooth_le_scan_params_t));
451
452         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_PARAMETERS,
453                 in_param1, in_param2, in_param3, in_param4, &out_param);
454
455         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
456
457         return result;
458 }
459
460 BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising)
461 {
462         int result;
463
464         BT_CHECK_ENABLED_ANY(return);
465
466         BT_INIT_PARAMS();
467         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
468
469         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING,
470                 in_param1, in_param2, in_param3, in_param4, &out_param);
471
472         if (result == BLUETOOTH_ERROR_NONE)
473                 *is_advertising = g_array_index(out_param, int, 0);
474         else
475                 BT_ERR("Fail to send request");
476
477         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
478
479         return result;
480 }
481
482 BT_EXPORT_API int bluetooth_add_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
483 {
484         int result;
485
486         BT_CHECK_PARAMETER(address, return);
487         BT_CHECK_ENABLED_ANY(return);
488
489         BT_INIT_PARAMS();
490         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
491
492         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
493         g_array_append_vals(in_param2, &address_type, sizeof(int));
494
495         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_ADD_WHITE_LIST,
496                 in_param1, in_param2, in_param3, in_param4, &out_param);
497
498         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
499
500         return result;
501 }
502
503 BT_EXPORT_API int bluetooth_remove_white_list(bluetooth_device_address_t *address, bluetooth_device_address_type_t address_type)
504 {
505         int result;
506
507         BT_CHECK_PARAMETER(address, return);
508         BT_CHECK_ENABLED_ANY(return);
509
510         BT_INIT_PARAMS();
511         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
512
513         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
514         g_array_append_vals(in_param2, &address_type, sizeof(int));
515
516         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REMOVE_WHITE_LIST,
517                 in_param1, in_param2, in_param3, in_param4, &out_param);
518
519         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
520
521         return result;
522 }
523
524 BT_EXPORT_API int bluetooth_clear_white_list(void)
525 {
526         int result;
527
528         BT_CHECK_ENABLED_ANY(return);
529
530         BT_INIT_PARAMS();
531         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
532
533         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_CLEAR_WHITE_LIST,
534                 in_param1, in_param2, in_param3, in_param4, &out_param);
535
536         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
537
538         return result;
539 }
540
541 BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy)
542 {
543         int result;
544
545         BT_CHECK_ENABLED_ANY(return);
546
547         BT_INIT_PARAMS();
548         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
549
550         g_array_append_vals(in_param1, &enable_privacy, sizeof(gboolean));
551
552         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_PRIVACY,
553                 in_param1, in_param2, in_param3, in_param4, &out_param);
554
555         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
556
557         return result;
558 }
559
560 BT_EXPORT_API int bluetooth_set_le_static_random_address(gboolean enable)
561 {
562         int result;
563
564         BT_CHECK_ENABLED_ANY(return);
565
566         BT_INIT_PARAMS();
567         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
568
569         g_array_append_vals(in_param1, &enable, sizeof(gboolean));
570
571         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_STATIC_RANDOM_ADDRESS,
572                 in_param1, in_param2, in_param3, in_param4, &out_param);
573
574         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
575
576         return result;
577 }
578
579 BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void)
580 {
581         if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS)
582                      == BLUETOOTH_ERROR_PERMISSION_DEINED) {
583                 BT_ERR("Don't have a privilege to use this API");
584                 return BLUETOOTH_ERROR_PERMISSION_DEINED;
585         }
586
587         return BLUETOOTH_ERROR_NONE;
588 }
589
590 BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data)
591 {
592         int ret;
593
594         ret = _bt_register_event(BT_LE_ADAPTER_EVENT, (void *)callback_ptr, user_data);
595         if (ret != BLUETOOTH_ERROR_NONE &&
596             ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
597                 BT_ERR("Fail to register BT_LE_ADAPTER_EVENT event : %d", ret);
598                 return ret;
599         }
600
601         return BLUETOOTH_ERROR_NONE;
602 }
603
604 BT_EXPORT_API int bluetooth_le_unregister_callback(void)
605 {
606         _bt_unregister_event(BT_LE_ADAPTER_EVENT);
607
608         return BLUETOOTH_ERROR_NONE;
609 }
610
611 BT_EXPORT_API int bluetooth_le_read_maximum_data_length(
612                         bluetooth_le_read_maximum_data_length_t *max_le_datalength)
613 {
614         BT_CHECK_ENABLED_ANY(return);
615         BT_INIT_PARAMS();
616         int result;
617         bluetooth_le_read_maximum_data_length_t *datalength = NULL;
618
619         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
620
621         result = _bt_send_request(BT_BLUEZ_SERVICE,
622                 BT_LE_READ_MAXIMUM_DATA_LENGTH,
623                 in_param1, in_param2, in_param3, in_param4, &out_param);
624
625         if (result == BLUETOOTH_ERROR_NONE) {
626                 datalength = &g_array_index(out_param,
627                         bluetooth_le_read_maximum_data_length_t, 0);
628                 max_le_datalength->max_tx_octets  = datalength->max_tx_octets;
629                 max_le_datalength->max_tx_time = datalength->max_tx_time;
630                 max_le_datalength->max_rx_octets = datalength->max_rx_octets;
631                 max_le_datalength->max_rx_time = datalength->max_rx_time;
632         }
633
634         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
635
636         return result;
637 }
638
639 BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length(
640         const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
641 {
642         BT_CHECK_ENABLED_ANY(return);
643         BT_INIT_PARAMS();
644
645         int result;
646
647         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
648
649         g_array_append_vals(in_param1, &def_tx_Octets, sizeof(guint));
650         g_array_append_vals(in_param2, &def_tx_Time, sizeof(guint));
651
652         result = _bt_send_request(BT_BLUEZ_SERVICE,
653                 BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
654                 in_param1, in_param2, in_param3, in_param4, &out_param);
655
656         if (result != BLUETOOTH_ERROR_NONE)
657                 BT_ERR("Failed to Write the host suggested default data length values : %d", result);
658
659         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
660
661         return result;
662 }
663
664 BT_EXPORT_API int bluetooth_le_read_suggested_default_data_length(
665         bluetooth_le_read_host_suggested_data_length_t *le_data_length)
666 {
667         BT_CHECK_ENABLED_ANY(return);
668         BT_INIT_PARAMS();
669
670         int result;
671         bluetooth_le_read_host_suggested_data_length_t *data_values = NULL;
672         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
673
674         result = _bt_send_request(BT_BLUEZ_SERVICE,
675                 BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
676                 in_param1, in_param2, in_param3, in_param4, &out_param);
677
678         if (result == BLUETOOTH_ERROR_NONE) {
679                 data_values = &g_array_index(out_param,
680                         bluetooth_le_read_host_suggested_data_length_t, 0);
681
682                 le_data_length->def_tx_octets = data_values->def_tx_octets;
683                 le_data_length->def_tx_time = data_values->def_tx_time;
684         }
685
686         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
687
688         return result;
689 }
690
691 BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *address,
692         const unsigned int max_tx_octets, const unsigned int max_tx_time)
693 {
694         BT_CHECK_ENABLED_ANY(return);
695         BT_INIT_PARAMS();
696
697         int result;
698
699         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
700
701         g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t));
702         g_array_append_vals(in_param2, &max_tx_octets, sizeof(guint));
703         g_array_append_vals(in_param3, &max_tx_time, sizeof(guint));
704
705         result = _bt_send_request(BT_BLUEZ_SERVICE,
706                 BT_LE_SET_DATA_LENGTH,
707                 in_param1, in_param2, in_param3, in_param4, &out_param);
708
709         if (result != BLUETOOTH_ERROR_NONE)
710                 BT_ERR("Failed to Set data length values : %d", result);
711
712         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
713
714         return result;
715 }