2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include "net_wifi_private.h"
23 static __thread bool is_init = false;
24 static __thread GSList *ap_handle_list = NULL;
27 wifi_device_state_changed_cb device_state_cb;
28 void *device_state_user_data;
29 wifi_scan_finished_cb bg_scan_cb;
30 void *bg_scan_user_data;
31 wifi_scan_finished_cb scan_request_cb;
32 void *scan_request_user_data;
33 wifi_scan_finished_cb scan_hidden_ap_cb;
34 void *scan_hidden_ap_user_data;
35 wifi_connection_state_changed_cb connection_state_cb;
36 void *connection_state_user_data;
37 wifi_activated_cb activated_cb;
38 void *activated_user_data;
39 wifi_deactivated_cb deactivated_cb;
40 void *deactivated_user_data;
41 wifi_connected_cb connected_cb;
42 void *connected_user_data;
43 wifi_disconnected_cb disconnected_cb;
44 void *disconnected_user_data;
47 struct _profile_list_s {
49 net_profile_info_t *profiles;
52 struct _wifi_state_notify {
53 net_profile_info_t *ap_info;
54 wifi_connection_state_e state;
57 struct managed_idle_data {
63 static __thread struct _wifi_cb_s wifi_callbacks = { 0, };
64 static __thread struct _profile_list_s profile_iterator = { 0, NULL };
65 static __thread GSList *managed_idler_list = NULL;
66 static __thread struct _profile_list_s hidden_profile_iterator = {0, NULL};
68 bool _wifi_is_init(void)
73 static void __wifi_set_init(bool tag)
78 static wifi_error_e __libnet_convert_to_ap_error_type(net_err_t err_type)
82 return WIFI_ERROR_NONE;
83 case NET_ERR_APP_ALREADY_REGISTERED:
84 return WIFI_ERROR_INVALID_OPERATION;
85 case NET_ERR_APP_NOT_REGISTERED:
86 return WIFI_ERROR_INVALID_OPERATION;
87 case NET_ERR_NO_ACTIVE_CONNECTIONS:
88 return WIFI_ERROR_NO_CONNECTION;
89 case NET_ERR_ACTIVE_CONNECTION_EXISTS:
90 return WIFI_ERROR_ALREADY_EXISTS;
91 case NET_ERR_CONNECTION_DHCP_FAILED:
92 return WIFI_ERROR_DHCP_FAILED;
93 case NET_ERR_CONNECTION_INVALID_KEY:
94 return WIFI_ERROR_INVALID_KEY;
95 case NET_ERR_IN_PROGRESS:
96 return WIFI_ERROR_NOW_IN_PROGRESS;
97 case NET_ERR_OPERATION_ABORTED:
98 return WIFI_ERROR_OPERATION_ABORTED;
99 case NET_ERR_TIME_OUT:
100 return WIFI_ERROR_NO_REPLY;
101 case NET_ERR_ACCESS_DENIED:
102 return WIFI_ERROR_PERMISSION_DENIED;
104 return WIFI_ERROR_OPERATION_FAILED;
108 static const char *__libnet_convert_ap_error_type_to_string(wifi_error_e err_type)
111 case WIFI_ERROR_NONE:
113 case WIFI_ERROR_INVALID_PARAMETER:
114 return "INVALID_PARAMETER";
115 case WIFI_ERROR_OUT_OF_MEMORY:
116 return "OUT_OF_MEMORY";
117 case WIFI_ERROR_INVALID_OPERATION:
118 return "INVALID_OPERATION";
119 case WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED:
120 return "ADDRESS_FAMILY_NOT_SUPPORTED";
121 case WIFI_ERROR_OPERATION_FAILED:
122 return "OPERATION_FAILED";
123 case WIFI_ERROR_NO_CONNECTION:
124 return "NO_CONNECTION";
125 case WIFI_ERROR_NOW_IN_PROGRESS:
126 return "NOW_IN_PROGRESS";
127 case WIFI_ERROR_ALREADY_EXISTS:
128 return "ALREADY_EXISTS";
129 case WIFI_ERROR_OPERATION_ABORTED:
130 return "OPERATION_ABORTED";
131 case WIFI_ERROR_DHCP_FAILED:
132 return "DHCP_FAILED";
133 case WIFI_ERROR_INVALID_KEY:
134 return "INVALID_KEY";
135 case WIFI_ERROR_NO_REPLY:
137 case WIFI_ERROR_SECURITY_RESTRICTED:
138 return "SECURITY_RESTRICTED";
139 case WIFI_ERROR_PERMISSION_DENIED:
140 return "PERMISSION_DENIED";
141 case WIFI_ERROR_NOT_SUPPORTED:
142 return "NOT_SUPPROTED";
148 static const char *__libnet_convert_ap_state_to_string(wifi_connection_state_e state)
151 case WIFI_CONNECTION_STATE_FAILURE:
153 case WIFI_CONNECTION_STATE_DISCONNECTED:
154 return "DISCONNECTED";
155 case WIFI_CONNECTION_STATE_ASSOCIATION:
156 return "ASSOCIATION";
157 case WIFI_CONNECTION_STATE_CONFIGURATION:
158 return "CONFIGURATION";
159 case WIFI_CONNECTION_STATE_CONNECTED:
166 static void __libnet_clear_profile_list(struct _profile_list_s *profile_list)
168 if (profile_list->count > 0)
169 g_free(profile_list->profiles);
171 profile_list->count = 0;
172 profile_list->profiles = NULL;
175 static int __libnet_update_profile_iterator(void)
178 struct _profile_list_s wifi_profiles = { 0, NULL };
180 __libnet_clear_profile_list(&profile_iterator);
182 rv = net_get_profile_list(NET_DEVICE_WIFI, &wifi_profiles.profiles, &wifi_profiles.count);
183 WIFI_LOG(WIFI_INFO, "Wi-Fi profile count: %d", wifi_profiles.count);
185 if (rv == NET_ERR_ACCESS_DENIED) {
186 WIFI_LOG(WIFI_ERROR, "Access denied");
187 return WIFI_ERROR_PERMISSION_DENIED;
190 if (wifi_profiles.count == 0)
191 return WIFI_ERROR_NONE;
193 profile_iterator.count = wifi_profiles.count;
194 profile_iterator.profiles = wifi_profiles.profiles;
196 return WIFI_ERROR_NONE;
199 static void __libnet_update_hidden_profile_iterator(GSList *ap_list)
202 GSList *list = ap_list;
204 for (count = 0; list; list = list->next)
208 WIFI_LOG(WIFI_INFO, "No hidden AP found\n");
212 hidden_profile_iterator.count = count;
213 hidden_profile_iterator.profiles = g_try_new0(net_profile_info_t, count);
216 for (count = 0; list; list = list->next) {
217 net_wifi_connection_info_t *ap = list->data;
218 net_profile_info_t *profile = &hidden_profile_iterator.profiles[count];
220 g_strlcpy(profile->ProfileInfo.Wlan.essid, ap->essid, NET_WLAN_ESSID_LEN+1);
221 profile->ProfileInfo.Wlan.security_info.sec_mode = ap->security_info.sec_mode;
225 WIFI_LOG(WIFI_INFO, "Hidden AP count : %d\n", count);
228 static void __libnet_convert_profile_info_to_wifi_info(net_wifi_connection_info_t *wifi_info,
229 net_profile_info_t *ap_info)
231 g_strlcpy(wifi_info->essid, ap_info->ProfileInfo.Wlan.essid, NET_WLAN_ESSID_LEN+1);
232 wifi_info->wlan_mode = ap_info->ProfileInfo.Wlan.wlan_mode;
233 memcpy(&wifi_info->security_info, &ap_info->ProfileInfo.Wlan.security_info, sizeof(wlan_security_info_t));
236 static int __libnet_connect_with_wifi_info(net_profile_info_t *ap_info)
239 net_wifi_connection_info_t wifi_info;
240 memset(&wifi_info, 0, sizeof(net_wifi_connection_info_t));
242 __libnet_convert_profile_info_to_wifi_info(&wifi_info, ap_info);
244 rv = net_open_connection_with_wifi_info(&wifi_info);
245 if (rv == NET_ERR_ACCESS_DENIED) {
246 WIFI_LOG(WIFI_ERROR, "Access denied");
247 return WIFI_ERROR_PERMISSION_DENIED;
248 } else if (rv != NET_ERR_NONE)
249 return WIFI_ERROR_OPERATION_FAILED;
251 return WIFI_ERROR_NONE;
254 static void __libnet_state_changed_cb(char *profile_name, net_profile_info_t *profile_info,
255 wifi_connection_state_e state)
257 if (profile_name == NULL)
260 if (profile_info == NULL) {
261 WIFI_LOG(WIFI_ERROR, "Error!! Profile info not found! : %s\n", profile_name);
265 ap_handle_list = g_slist_append(ap_handle_list, (wifi_ap_h)profile_info);
267 if (wifi_callbacks.connection_state_cb)
268 wifi_callbacks.connection_state_cb(state, (wifi_ap_h)profile_info,
269 wifi_callbacks.connection_state_user_data);
271 ap_handle_list = g_slist_remove(ap_handle_list, (wifi_ap_h)profile_info);
274 static void __libnet_set_activated_cb(wifi_activated_cb user_cb, void *user_data)
277 wifi_callbacks.activated_cb = user_cb;
278 wifi_callbacks.activated_user_data = user_data;
282 static void __libnet_activated_cb(wifi_error_e result)
284 if (wifi_callbacks.activated_cb)
285 wifi_callbacks.activated_cb(result, wifi_callbacks.activated_user_data);
287 wifi_callbacks.activated_cb = NULL;
288 wifi_callbacks.activated_user_data = NULL;
291 static void __libnet_set_deactivated_cb(wifi_disconnected_cb user_cb, void *user_data)
293 if (user_cb != NULL) {
294 wifi_callbacks.deactivated_cb = user_cb;
295 wifi_callbacks.deactivated_user_data = user_data;
299 static void __libnet_deactivated_cb(wifi_error_e result)
301 if (wifi_callbacks.deactivated_cb)
302 wifi_callbacks.deactivated_cb(result, wifi_callbacks.deactivated_user_data);
304 wifi_callbacks.deactivated_cb = NULL;
305 wifi_callbacks.deactivated_user_data = NULL;
308 static void __libnet_power_on_off_cb(net_event_info_t *event_cb, bool is_requested)
310 if (_wifi_is_init() != true) {
311 WIFI_LOG(WIFI_ERROR, "Application is not registered"
312 "If multi-threaded, thread integrity be broken.");
316 if (wifi_callbacks.device_state_cb == NULL &&
317 wifi_callbacks.activated_cb == NULL &&
318 wifi_callbacks.deactivated_cb == NULL)
321 wifi_error_e error_code = WIFI_ERROR_NONE;
322 wifi_device_state_e state = WIFI_DEVICE_STATE_DEACTIVATED;
323 net_wifi_state_t *wifi_state = (net_wifi_state_t *)event_cb->Data;
325 if (event_cb->Error == NET_ERR_NONE &&
326 event_cb->Datalength == sizeof(net_wifi_state_t)) {
327 if (*wifi_state == WIFI_ON) {
328 WIFI_LOG(WIFI_INFO, "Wi-Fi power on");
329 state = WIFI_DEVICE_STATE_ACTIVATED;
330 } else if (*wifi_state == WIFI_OFF) {
331 WIFI_LOG(WIFI_INFO, "Wi-Fi power off");
332 state = WIFI_DEVICE_STATE_DEACTIVATED;
333 __libnet_clear_profile_list(&profile_iterator);
334 __libnet_clear_profile_list(&hidden_profile_iterator);
336 WIFI_LOG(WIFI_ERROR, "Error Wi-Fi state %d", *wifi_state);
337 error_code = WIFI_ERROR_OPERATION_FAILED;
338 state = WIFI_DEVICE_STATE_DEACTIVATED;
341 WIFI_LOG(WIFI_ERROR, "Wi-Fi power request failed(%d)", event_cb->Error);
343 if (event_cb->Error == NET_ERR_SECURITY_RESTRICTED)
344 error_code = WIFI_ERROR_SECURITY_RESTRICTED;
346 error_code = WIFI_ERROR_OPERATION_FAILED;
348 state = WIFI_DEVICE_STATE_DEACTIVATED;
351 __libnet_activated_cb(error_code);
352 __libnet_deactivated_cb(error_code);
354 if (wifi_callbacks.device_state_cb)
355 wifi_callbacks.device_state_cb(state, wifi_callbacks.device_state_user_data);
358 static void __libnet_scan_cb(net_event_info_t *event_cb)
360 wifi_error_e error_code = WIFI_ERROR_NONE;
362 if (event_cb->Error != NET_ERR_NONE) {
363 WIFI_LOG(WIFI_ERROR, "Scan failed!, Error [%d]\n", event_cb->Error);
364 error_code = WIFI_ERROR_OPERATION_FAILED;
367 if (wifi_callbacks.scan_request_cb) {
368 wifi_callbacks.scan_request_cb(error_code, wifi_callbacks.scan_request_user_data);
369 wifi_callbacks.scan_request_cb = NULL;
370 wifi_callbacks.scan_request_user_data = NULL;
374 if (wifi_callbacks.bg_scan_cb != NULL)
375 wifi_callbacks.bg_scan_cb(error_code, wifi_callbacks.bg_scan_user_data);
378 static void __libnet_hidden_scan_cb(net_event_info_t *event_cb)
380 wifi_error_e error_code = WIFI_ERROR_NONE;
382 __libnet_clear_profile_list(&hidden_profile_iterator);
384 if (event_cb->Error != NET_ERR_NONE) {
385 WIFI_LOG(WIFI_ERROR, "Hidden scan failed!, Error [%d]\n", event_cb->Error);
386 error_code = WIFI_ERROR_OPERATION_FAILED;
387 } else if (event_cb->Data) {
388 GSList *ap_list = event_cb->Data;
389 __libnet_update_hidden_profile_iterator(ap_list);
392 if (wifi_callbacks.scan_hidden_ap_cb) {
393 wifi_callbacks.scan_hidden_ap_cb(error_code, wifi_callbacks.scan_hidden_ap_user_data);
394 wifi_callbacks.scan_hidden_ap_cb = NULL;
395 wifi_callbacks.scan_hidden_ap_user_data = NULL;
399 static void __libnet_set_connected_cb(wifi_connected_cb user_cb, void *user_data)
402 wifi_callbacks.connected_cb = user_cb;
403 wifi_callbacks.connected_user_data = user_data;
407 static void __libnet_connected_cb(wifi_error_e result)
409 if (wifi_callbacks.connected_cb)
410 wifi_callbacks.connected_cb(result, wifi_callbacks.connected_user_data);
412 wifi_callbacks.connected_cb = NULL;
413 wifi_callbacks.connected_user_data = NULL;
416 static void __libnet_set_disconnected_cb(wifi_disconnected_cb user_cb, void *user_data)
419 wifi_callbacks.disconnected_cb = user_cb;
420 wifi_callbacks.disconnected_user_data = user_data;
424 static void __libnet_disconnected_cb(wifi_error_e result)
426 if (wifi_callbacks.disconnected_cb)
427 wifi_callbacks.disconnected_cb(result, wifi_callbacks.disconnected_user_data);
429 wifi_callbacks.disconnected_cb = NULL;
430 wifi_callbacks.disconnected_user_data = NULL;
433 static void __libnet_evt_cb(net_event_info_t *event_cb, void *user_data)
435 bool is_requested = false;
436 net_profile_info_t *prof_info_p = NULL;
437 net_profile_info_t prof_info;
438 wifi_error_e result = WIFI_ERROR_NONE;
440 switch (event_cb->Event) {
441 case NET_EVENT_OPEN_RSP:
442 case NET_EVENT_WIFI_WPS_RSP:
445 case NET_EVENT_OPEN_IND:
446 if (_wifi_libnet_check_profile_name_validity(event_cb->ProfileName) != true)
449 result = __libnet_convert_to_ap_error_type(event_cb->Error);
450 WIFI_LOG(WIFI_INFO, "Got Open RSP/IND : %s\n",
451 __libnet_convert_ap_error_type_to_string(result));
454 __libnet_connected_cb(result);
456 switch (event_cb->Error) {
458 if (event_cb->Datalength == sizeof(net_profile_info_t))
459 prof_info_p = (net_profile_info_t *)event_cb->Data;
461 __libnet_state_changed_cb(event_cb->ProfileName, prof_info_p,
462 WIFI_CONNECTION_STATE_CONNECTED);
464 case NET_ERR_ACTIVE_CONNECTION_EXISTS:
470 if (net_get_profile_info(event_cb->ProfileName, &prof_info) == NET_ERR_NONE)
471 __libnet_state_changed_cb(event_cb->ProfileName, &prof_info,
472 WIFI_CONNECTION_STATE_DISCONNECTED);
474 __libnet_state_changed_cb(event_cb->ProfileName, NULL,
475 WIFI_CONNECTION_STATE_DISCONNECTED);
478 case NET_EVENT_CLOSE_RSP:
481 case NET_EVENT_CLOSE_IND:
482 if (_wifi_libnet_check_profile_name_validity(event_cb->ProfileName) != true)
485 result = __libnet_convert_to_ap_error_type(event_cb->Error);
486 WIFI_LOG(WIFI_INFO, "Got Close RSP/IND : %s\n",
487 __libnet_convert_ap_error_type_to_string(result));
490 __libnet_disconnected_cb(result);
492 switch (event_cb->Error) {
494 if (net_get_profile_info(event_cb->ProfileName, &prof_info) == NET_ERR_NONE)
495 __libnet_state_changed_cb(event_cb->ProfileName, &prof_info,
496 WIFI_CONNECTION_STATE_DISCONNECTED);
498 __libnet_state_changed_cb(event_cb->ProfileName, NULL,
499 WIFI_CONNECTION_STATE_DISCONNECTED);
506 case NET_EVENT_NET_STATE_IND:
507 if (_wifi_libnet_check_profile_name_validity(event_cb->ProfileName) != true)
510 if (event_cb->Datalength != sizeof(net_state_type_t))
513 net_state_type_t *profile_state = (net_state_type_t *)event_cb->Data;
514 wifi_connection_state_e ap_state = _wifi_convert_to_ap_state(*profile_state);
517 "Profile State : %s, profile name : %s\n",
518 __libnet_convert_ap_state_to_string(ap_state),
519 event_cb->ProfileName);
521 if (net_get_profile_info(event_cb->ProfileName, &prof_info) == NET_ERR_NONE)
522 __libnet_state_changed_cb(event_cb->ProfileName, &prof_info, ap_state);
524 __libnet_state_changed_cb(event_cb->ProfileName, NULL, ap_state);
527 case NET_EVENT_WIFI_SCAN_RSP:
528 case NET_EVENT_WIFI_SCAN_IND:
529 WIFI_LOG(WIFI_INFO, "Got Wi-Fi scan IND\n");
530 __libnet_scan_cb(event_cb);
532 case NET_EVENT_SPECIFIC_SCAN_RSP:
533 WIFI_LOG(WIFI_INFO, "Got Wi-Fi hidden scan RSP\n");
535 case NET_EVENT_SPECIFIC_SCAN_IND:
536 WIFI_LOG(WIFI_INFO, "Got Wi-Fi hidden scan IND\n");
537 __libnet_hidden_scan_cb(event_cb);
539 case NET_EVENT_WIFI_POWER_RSP:
542 case NET_EVENT_WIFI_POWER_IND:
543 __libnet_power_on_off_cb(event_cb, is_requested);
550 int _wifi_libnet_init(void)
554 rv = net_register_client_ext((net_event_cb_t)__libnet_evt_cb, NET_DEVICE_WIFI, NULL);
555 if (rv != NET_ERR_NONE)
558 __wifi_set_init(true);
563 bool _wifi_libnet_deinit(void)
565 if (net_deregister_client_ext(NET_DEVICE_WIFI) != NET_ERR_NONE)
568 __libnet_clear_profile_list(&profile_iterator);
569 __libnet_clear_profile_list(&hidden_profile_iterator);
570 g_slist_free_full(ap_handle_list, g_free);
571 ap_handle_list = NULL;
572 memset(&wifi_callbacks, 0, sizeof(struct _wifi_cb_s));
574 __wifi_set_init(false);
579 int _wifi_activate(wifi_activated_cb callback, gboolean wifi_picker_test,
582 int rv = NET_ERR_NONE;
584 rv = net_wifi_power_on();
585 if (rv == NET_ERR_NONE) {
586 __libnet_set_activated_cb(callback, user_data);
587 return WIFI_ERROR_NONE;
588 } else if (rv == NET_ERR_ACCESS_DENIED) {
589 WIFI_LOG(WIFI_ERROR, "Access denied");
590 return WIFI_ERROR_PERMISSION_DENIED;
591 } else if (rv == NET_ERR_INVALID_OPERATION)
592 return WIFI_ERROR_INVALID_OPERATION;
593 else if (rv == NET_ERR_ALREADY_EXISTS)
594 return WIFI_ERROR_ALREADY_EXISTS;
595 else if (rv == NET_ERR_IN_PROGRESS)
596 return WIFI_ERROR_NOW_IN_PROGRESS;
597 else if (rv == NET_ERR_SECURITY_RESTRICTED)
598 return WIFI_ERROR_SECURITY_RESTRICTED;
600 return WIFI_ERROR_OPERATION_FAILED;
603 int _wifi_deactivate(wifi_deactivated_cb callback, void *user_data)
605 int rv = NET_ERR_NONE;
607 rv = net_wifi_power_off();
608 if (rv == NET_ERR_NONE) {
609 __libnet_set_deactivated_cb(callback, user_data);
610 return WIFI_ERROR_NONE;
611 } else if (rv == NET_ERR_ACCESS_DENIED) {
612 WIFI_LOG(WIFI_ERROR, "Access denied");
613 return WIFI_ERROR_PERMISSION_DENIED;
614 } else if (rv == NET_ERR_INVALID_OPERATION)
615 return WIFI_ERROR_INVALID_OPERATION;
616 else if (rv == NET_ERR_ALREADY_EXISTS)
617 return WIFI_ERROR_ALREADY_EXISTS;
618 else if (rv == NET_ERR_IN_PROGRESS)
619 return WIFI_ERROR_NOW_IN_PROGRESS;
620 else if (rv == NET_ERR_SECURITY_RESTRICTED)
621 return WIFI_ERROR_SECURITY_RESTRICTED;
623 return WIFI_ERROR_OPERATION_FAILED;
626 bool _wifi_libnet_check_ap_validity(wifi_ap_h ap_h)
634 for (list = ap_handle_list; list; list = list->next)
635 if (ap_h == list->data) return true;
637 for (i = 0; i < profile_iterator.count; i++)
638 if (ap_h == &profile_iterator.profiles[i]) return true;
640 for (i = 0; i < hidden_profile_iterator.count; i++)
641 if (ap_h == &hidden_profile_iterator.profiles[i]) return true;
646 void _wifi_libnet_add_to_ap_list(wifi_ap_h ap_h)
648 ap_handle_list = g_slist_append(ap_handle_list, ap_h);
651 void _wifi_libnet_remove_from_ap_list(wifi_ap_h ap_h)
653 ap_handle_list = g_slist_remove(ap_handle_list, ap_h);
657 bool _wifi_libnet_check_profile_name_validity(const char *profile_name)
659 const char *profile_prefix = "/net/connman/service/wifi_";
662 if (profile_name == NULL ||
663 g_str_has_prefix(profile_name, profile_prefix) != TRUE) {
664 WIFI_LOG(WIFI_INFO, "The profile is a hidden or not a regular Wi-Fi profile");
668 while (profile_name[i] != '\0') {
669 if (isgraph(profile_name[i]) == 0) {
670 WIFI_LOG(WIFI_INFO, "Invalid format: %s", profile_name);
679 int _wifi_libnet_get_wifi_device_state(wifi_device_state_e *device_state)
681 net_tech_info_t tech_info;
683 int rv = NET_ERR_NONE;
684 rv = net_get_technology_properties(NET_DEVICE_WIFI, &tech_info);
685 if (rv == NET_ERR_ACCESS_DENIED) {
686 WIFI_LOG(WIFI_ERROR, "Access denied");
687 return WIFI_ERROR_PERMISSION_DENIED;
688 } else if (rv != NET_ERR_NONE) {
689 WIFI_LOG(WIFI_ERROR, "Failed to get technology properties");
690 return WIFI_ERROR_OPERATION_FAILED;
693 if (tech_info.powered)
694 *device_state = WIFI_DEVICE_STATE_ACTIVATED;
696 *device_state = WIFI_DEVICE_STATE_DEACTIVATED;
698 return WIFI_ERROR_NONE;
701 int _wifi_libnet_get_wifi_state(wifi_connection_state_e* connection_state)
704 net_wifi_state_t wlan_state = 0;
705 net_profile_name_t profile_name;
707 rv = net_get_wifi_state(&wlan_state, &profile_name);
708 if (rv == NET_ERR_ACCESS_DENIED) {
709 WIFI_LOG(WIFI_ERROR, "Access denied");
710 return WIFI_ERROR_PERMISSION_DENIED;
711 } else if (rv != NET_ERR_NONE) {
712 WIFI_LOG(WIFI_ERROR, "Failed to get Wi-Fi state");
713 return WIFI_ERROR_OPERATION_FAILED;
716 switch (wlan_state) {
719 *connection_state = WIFI_CONNECTION_STATE_DISCONNECTED;
722 *connection_state = WIFI_CONNECTION_STATE_CONNECTED;
724 case WIFI_DISCONNECTING:
725 *connection_state = WIFI_CONNECTION_STATE_CONNECTED;
728 WIFI_LOG(WIFI_ERROR, "Unknown state");
729 return WIFI_ERROR_OPERATION_FAILED;
732 return WIFI_ERROR_NONE;
735 int _wifi_libnet_get_intf_name(char** name)
739 if (profile_iterator.count == 0) {
740 rv = __libnet_update_profile_iterator();
741 if (rv == NET_ERR_ACCESS_DENIED) {
742 WIFI_LOG(WIFI_ERROR, "Access denied");
743 return WIFI_ERROR_PERMISSION_DENIED;
747 if (profile_iterator.count == 0) {
748 WIFI_LOG(WIFI_ERROR, "There is no AP");
749 return WIFI_ERROR_OPERATION_FAILED;
752 *name = g_strdup(profile_iterator.profiles->ProfileInfo.Wlan.net_info.DevName);
754 return WIFI_ERROR_OUT_OF_MEMORY;
756 return WIFI_ERROR_NONE;
759 int _wifi_libnet_scan_request(wifi_scan_finished_cb callback, void *user_data)
762 rv = net_scan_wifi();
764 if (rv == NET_ERR_NONE) {
765 wifi_callbacks.scan_request_cb = callback;
766 wifi_callbacks.scan_request_user_data = user_data;
767 return WIFI_ERROR_NONE;
768 } else if (rv == NET_ERR_ACCESS_DENIED) {
769 WIFI_LOG(WIFI_ERROR, "Access denied");
770 return WIFI_ERROR_PERMISSION_DENIED;
771 } else if (rv == NET_ERR_INVALID_OPERATION)
772 return WIFI_ERROR_INVALID_OPERATION;
774 return WIFI_ERROR_OPERATION_FAILED;
777 int _wifi_libnet_scan_hidden_ap(const char *essid,
778 wifi_scan_finished_cb callback, void *user_data)
781 rv = net_specific_scan_wifi(essid);
783 if (rv == NET_ERR_NONE) {
784 wifi_callbacks.scan_hidden_ap_cb = callback;
785 wifi_callbacks.scan_hidden_ap_user_data = user_data;
786 return WIFI_ERROR_NONE;
787 } else if (rv == NET_ERR_INVALID_OPERATION)
788 return WIFI_ERROR_INVALID_OPERATION;
790 return WIFI_ERROR_OPERATION_FAILED;
793 int _wifi_libnet_get_connected_profile(wifi_ap_h *ap)
796 wifi_ap_h ap_h = NULL;
798 rv = __libnet_update_profile_iterator();
799 if (rv == NET_ERR_ACCESS_DENIED) {
800 WIFI_LOG(WIFI_ERROR, "Access denied");
801 return WIFI_ERROR_PERMISSION_DENIED;
804 for (i = 0; i < profile_iterator.count; i++) {
805 if (profile_iterator.profiles[i].ProfileState == NET_STATE_TYPE_ONLINE ||
806 profile_iterator.profiles[i].ProfileState == NET_STATE_TYPE_READY) {
807 ap_h = (wifi_ap_h)(&profile_iterator.profiles[i]);
813 WIFI_LOG(WIFI_ERROR, "There is no connected AP");
814 return WIFI_ERROR_NO_CONNECTION;
817 *ap = g_try_malloc0(sizeof(net_profile_info_t));
819 return WIFI_ERROR_OUT_OF_MEMORY;
821 memcpy(*ap, ap_h, sizeof(net_profile_info_t));
823 _wifi_libnet_add_to_ap_list(*ap);
825 return WIFI_ERROR_NONE;
828 int _wifi_libnet_foreach_found_aps(wifi_found_ap_cb callback, void *user_data)
832 rv = __libnet_update_profile_iterator();
833 if (rv == NET_ERR_ACCESS_DENIED) {
834 WIFI_LOG(WIFI_ERROR, "Access denied");
835 return WIFI_ERROR_PERMISSION_DENIED;
838 if (profile_iterator.count == 0) {
839 WIFI_LOG(WIFI_WARN, "There is no AP");
840 return WIFI_ERROR_NONE;
843 for (i = 0; i < profile_iterator.count; i++) {
844 rv = callback((wifi_ap_h)(&profile_iterator.profiles[i]), user_data);
845 if (rv == false) break;
848 return WIFI_ERROR_NONE;
851 int _wifi_libnet_foreach_found_hidden_aps(wifi_found_ap_cb callback, void *user_data)
855 if (hidden_profile_iterator.count == 0) {
856 WIFI_LOG(WIFI_INFO, "There is no hidden APs.");
857 return WIFI_ERROR_NONE;
860 for (i =0; i < hidden_profile_iterator.count; i++) {
861 rv = callback((wifi_ap_h)(&hidden_profile_iterator.profiles[i]), user_data);
866 return WIFI_ERROR_NONE;
869 int _wifi_libnet_open_profile(wifi_ap_h ap_h, wifi_connected_cb callback, void *user_data)
873 net_profile_info_t *ap_info = ap_h;
876 _wifi_libnet_check_profile_name_validity(ap_info->ProfileName);
878 if (valid_profile == true && ap_info->Favourite)
879 rv = net_open_connection_with_profile(ap_info->ProfileName);
880 else if (valid_profile == true &&
881 ap_info->ProfileInfo.Wlan.security_info.sec_mode == WLAN_SEC_MODE_NONE)
882 rv = net_open_connection_with_profile(ap_info->ProfileName);
884 rv = __libnet_connect_with_wifi_info(ap_info);
886 rv = __libnet_convert_to_ap_error_type(rv);
887 if (rv == WIFI_ERROR_NONE)
888 __libnet_set_connected_cb(callback, user_data);
893 int _wifi_libnet_close_profile(wifi_ap_h ap_h, wifi_disconnected_cb callback, void *user_data)
896 net_profile_info_t *ap_info = ap_h;
898 rv = net_close_connection(ap_info->ProfileName);
899 if (rv == NET_ERR_ACCESS_DENIED) {
900 WIFI_LOG(WIFI_ERROR, "Access denied");
901 return WIFI_ERROR_PERMISSION_DENIED;
902 } else if (rv != NET_ERR_NONE)
903 return WIFI_ERROR_OPERATION_FAILED;
905 __libnet_set_disconnected_cb(callback, user_data);
907 return WIFI_ERROR_NONE;
910 int _wifi_libnet_connect_with_wps_pbc(wifi_ap_h ap_h, wifi_connected_cb callback, void *user_data)
913 net_profile_info_t *ap_info = ap_h;
914 net_wifi_wps_info_t wps_info;
915 memset(&wps_info, 0, sizeof(net_wifi_wps_info_t));
917 wps_info.type = WIFI_WPS_PBC;
919 rv = net_wifi_enroll_wps(ap_info->ProfileName, &wps_info);
920 if (rv == NET_ERR_ACCESS_DENIED) {
921 WIFI_LOG(WIFI_ERROR, "Access denied");
922 return WIFI_ERROR_PERMISSION_DENIED;
923 } else if (rv != NET_ERR_NONE)
924 return WIFI_ERROR_OPERATION_FAILED;
926 __libnet_set_connected_cb(callback, user_data);
928 return WIFI_ERROR_NONE;
931 int _wifi_libnet_connect_with_wps_pin(wifi_ap_h ap_h, const char *pin,
932 wifi_connected_cb callback, void *user_data)
935 net_profile_info_t *ap_info = ap_h;
936 net_wifi_wps_info_t wps_info;
938 if (ap_info == NULL) {
939 WIFI_LOG(WIFI_ERROR, "Invalid parameter");
940 return WIFI_ERROR_INVALID_PARAMETER;
943 wps_info.type = WIFI_WPS_PIN;
944 g_strlcpy(wps_info.pin, pin, NET_WLAN_MAX_WPSPIN_LEN + 1);
946 rv = net_wifi_enroll_wps(ap_info->ProfileName, &wps_info);
947 if (rv == NET_ERR_ACCESS_DENIED) {
948 WIFI_LOG(WIFI_ERROR, "Access denied");
949 return WIFI_ERROR_PERMISSION_DENIED;
950 } else if (rv != NET_ERR_NONE)
951 return WIFI_ERROR_OPERATION_FAILED;
953 __libnet_set_connected_cb(callback, user_data);
955 return WIFI_ERROR_NONE;
958 int _wifi_libnet_forget_ap(wifi_ap_h ap)
961 net_profile_info_t *ap_info = ap;
963 if (ap_info == NULL) {
964 WIFI_LOG(WIFI_ERROR, "Invalid parameter");
965 return WIFI_ERROR_INVALID_PARAMETER;
968 rv = net_delete_profile(ap_info->ProfileName);
969 if (rv == NET_ERR_ACCESS_DENIED) {
970 WIFI_LOG(WIFI_ERROR, "Access denied");
971 return WIFI_ERROR_PERMISSION_DENIED;
972 } else if (rv != NET_ERR_NONE)
973 return WIFI_ERROR_OPERATION_FAILED;
975 ap_info->Favourite = (char)FALSE;
977 return WIFI_ERROR_NONE;
980 int _wifi_set_power_on_off_cb(wifi_device_state_changed_cb callback, void *user_data)
982 if (wifi_callbacks.device_state_cb != NULL)
983 return WIFI_ERROR_INVALID_OPERATION;
985 wifi_callbacks.device_state_cb = callback;
986 wifi_callbacks.device_state_user_data = user_data;
988 WIFI_LOG(WIFI_INFO, "Wi-Fi registered device state changed callback");
990 return WIFI_ERROR_NONE;
993 int _wifi_unset_power_on_off_cb(void)
995 if (wifi_callbacks.device_state_cb == NULL)
996 return WIFI_ERROR_INVALID_OPERATION;
998 wifi_callbacks.device_state_cb = NULL;
999 wifi_callbacks.device_state_user_data = NULL;
1001 return WIFI_ERROR_NONE;
1004 int _wifi_set_background_scan_cb(wifi_scan_finished_cb callback, void *user_data)
1006 if (wifi_callbacks.bg_scan_cb != NULL)
1007 return WIFI_ERROR_INVALID_OPERATION;
1009 wifi_callbacks.bg_scan_cb = callback;
1010 wifi_callbacks.bg_scan_user_data = user_data;
1012 return WIFI_ERROR_NONE;
1015 int _wifi_unset_background_scan_cb(void)
1017 if (wifi_callbacks.bg_scan_cb == NULL)
1018 return WIFI_ERROR_INVALID_OPERATION;
1020 wifi_callbacks.bg_scan_cb = NULL;
1021 wifi_callbacks.bg_scan_user_data = NULL;
1023 return WIFI_ERROR_NONE;
1026 int _wifi_set_connection_state_cb(wifi_connection_state_changed_cb callback, void *user_data)
1028 if (wifi_callbacks.connection_state_cb != NULL)
1029 return WIFI_ERROR_INVALID_OPERATION;
1031 wifi_callbacks.connection_state_cb = callback;
1032 wifi_callbacks.connection_state_user_data = user_data;
1034 return WIFI_ERROR_NONE;
1037 int _wifi_unset_connection_state_cb()
1039 if (wifi_callbacks.connection_state_cb == NULL)
1040 return WIFI_ERROR_INVALID_OPERATION;
1042 wifi_callbacks.connection_state_cb = NULL;
1043 wifi_callbacks.connection_state_user_data = NULL;
1045 return WIFI_ERROR_NONE;
1048 int _wifi_update_ap_info(net_profile_info_t *ap_info)
1050 int rv = NET_ERR_NONE;
1051 rv = net_modify_profile(ap_info->ProfileName, ap_info);
1053 if (rv == NET_ERR_ACCESS_DENIED) {
1054 WIFI_LOG(WIFI_ERROR, "Access denied");
1055 return WIFI_ERROR_PERMISSION_DENIED;
1056 } else if (rv != NET_ERR_NONE)
1057 return WIFI_ERROR_OPERATION_FAILED;
1059 return WIFI_ERROR_NONE;
1062 void _wifi_callback_cleanup(void)
1064 GSList *cur = managed_idler_list;
1066 struct managed_idle_data *data;
1069 GSList *next = cur->next;
1070 data = (struct managed_idle_data *)cur->data;
1072 src = g_main_context_find_source_by_id(g_main_context_default(), data->id);
1074 g_source_destroy(src);
1075 cur = managed_idler_list;
1080 g_slist_free(managed_idler_list);
1081 managed_idler_list = NULL;