2 * Network Client Library
4 * Copyright 2012 Samsung Electronics Co., Ltd
6 * Licensed under the Flora License, Version 1.1 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.tizenopensource.org/license
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include "network-info.h"
21 #include "network-internal.h"
22 #include "network-dbus-request.h"
23 #include "network-signal-handler.h"
25 static net_wifi_state_t net_wifi_state = WIFI_UNKNOWN;
26 static int net_service_error = NET_ERR_NONE;
27 static int net_dpm_wifi_state = -1;
28 static int net_dpm_wifi_profile_state = -1;
32 guint subscribe_id_connman_state;
33 guint subscribe_id_connman_error;
34 guint subscribe_id_netconfig_wifi;
35 guint subscribe_id_netconfig;
38 static GSList *cs_tid_list = NULL;
41 static void __net_trigger_event_callback(network_info_t *network_info,
42 net_event_info_t *event_data)
44 if (!network_info || !event_data || !_network_info_is_ref(network_info))
47 if (network_info->event_callback)
48 network_info->event_callback(event_data, network_info->user_data);
51 static int __net_handle_wifi_power_rsp(gboolean value, network_info_t *network_info)
53 __NETWORK_FUNC_ENTER__;
55 net_event_info_t *event_data = NULL;
57 if (network_info == NULL) {
58 __NETWORK_FUNC_EXIT__;
59 return NET_ERR_INVALID_PARAM;
62 event_data = g_try_new0(net_event_info_t, 1);
63 if (event_data == NULL) {
64 __NETWORK_FUNC_EXIT__;
65 return NET_ERR_OUT_OF_MEMORY;
69 net_wifi_state = WIFI_ON;
70 event_data->Error = NET_ERR_NONE;
72 net_wifi_state = WIFI_OFF;
73 event_data->Error = NET_ERR_NONE;
75 if (network_info->request_table[NETWORK_REQUEST_TYPE_SCAN].flag == TRUE)
76 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_SCAN]),
77 0, sizeof(network_request_table_t));
80 if (network_info->request_table[NETWORK_REQUEST_TYPE_WIFI_POWER].flag == TRUE) {
81 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_WIFI_POWER]),
82 0, sizeof(network_request_table_t));
84 event_data->Event = NET_EVENT_WIFI_POWER_RSP;
85 NETWORK_LOG(NETWORK_LOW, "NET_EVENT_WIFI_POWER_RSP wifi state: %d",
88 event_data->Event = NET_EVENT_WIFI_POWER_IND;
89 NETWORK_LOG(NETWORK_LOW, "NET_EVENT_WIFI_POWER_IND wifi state: %d",
93 event_data->Datalength = sizeof(net_wifi_state_t);
94 event_data->Data = &(net_wifi_state);
96 __net_trigger_event_callback(network_info, event_data);
99 __NETWORK_FUNC_EXIT__;
103 static void __net_handle_state_ind(network_info_t *network_info,
104 const char *profile_name, net_state_type_t profile_state)
106 __NETWORK_FUNC_ENTER__;
108 net_event_info_t *event_data = NULL;
110 if (network_info == NULL ||
111 network_info->event_callback == NULL) {
112 __NETWORK_FUNC_EXIT__;
116 event_data = g_try_new0(net_event_info_t, 1);
117 if (event_data == NULL) {
118 __NETWORK_FUNC_EXIT__;
122 event_data->Error = NET_ERR_NONE;
123 event_data->Event = NET_EVENT_NET_STATE_IND;
125 g_strlcpy(event_data->ProfileName, profile_name, sizeof(event_data->ProfileName));
127 event_data->Datalength = sizeof(net_state_type_t);
128 event_data->Data = &profile_state;
130 NETWORK_LOG(NETWORK_LOW,
131 "Sending NET_EVENT_NET_STATE_IND, state: %d, profile name: %s",
132 profile_state, event_data->ProfileName);
134 __net_trigger_event_callback(network_info, event_data);
137 __NETWORK_FUNC_EXIT__;
140 static void __net_handle_internet_state_ind(network_info_t *network_info,
141 net_device_t device_type, int is_online)
143 __NETWORK_FUNC_ENTER__;
145 net_event_info_t *event_data = NULL;
147 if (network_info == NULL ||
148 network_info->event_callback == NULL) {
149 __NETWORK_FUNC_EXIT__;
153 event_data = g_try_new0(net_event_info_t, 1);
154 if (event_data == NULL) {
155 __NETWORK_FUNC_EXIT__;
159 event_data->Error = NET_ERR_NONE;
161 event_data->Event = NET_EVENT_INTERNET_ONLINE_IND;
163 event_data->Event = NET_EVENT_INTERNET_OFFLINE_IND;
165 event_data->Datalength = sizeof(net_device_t);
166 event_data->Data = &device_type;
168 NETWORK_LOG(NETWORK_LOW,
169 "Sending NET_EVENT_INTERNET_%s_IND", is_online ? "ONLINE" : "OFFLINE");
171 __net_trigger_event_callback(network_info, event_data);
174 __NETWORK_FUNC_EXIT__;
177 static void __net_handle_failure_ind(network_info_t *network_info,
178 const char *profile_name, net_device_t device_type)
180 __NETWORK_FUNC_ENTER__;
182 net_event_info_t *event_data = NULL;
184 const char *svc_name1 = NULL;
185 const char *svc_name2 = NULL;
186 const char *svc_name3 = NULL;
188 if (network_info == NULL) {
189 __NETWORK_FUNC_EXIT__;
193 event_data = g_try_new0(net_event_info_t, 1);
194 if (event_data == NULL) {
195 __NETWORK_FUNC_EXIT__;
199 svc_name1 = network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION].ProfileName;
200 svc_name2 = network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS].ProfileName;
201 svc_name3 = network_info->request_table[NETWORK_REQUEST_TYPE_CLOSE_CONNECTION].ProfileName;
203 if (network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION].flag == TRUE &&
204 strstr(profile_name, svc_name1) != NULL) {
205 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION]), 0,
206 sizeof(network_request_table_t));
208 event_data->Event = NET_EVENT_OPEN_RSP;
209 } else if (network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS].flag == TRUE &&
210 g_strcmp0(profile_name, svc_name2) == 0) {
211 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS]), 0,
212 sizeof(network_request_table_t));
214 event_data->Event = NET_EVENT_WIFI_WPS_RSP;
216 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_CLOSE_CONNECTION]), 0,
217 sizeof(network_request_table_t));
218 } else if (network_info->request_table[NETWORK_REQUEST_TYPE_CLOSE_CONNECTION].flag == TRUE &&
219 g_strcmp0(profile_name, svc_name3) == 0) {
220 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_CLOSE_CONNECTION]), 0,
221 sizeof(network_request_table_t));
223 event_data->Event = NET_EVENT_CLOSE_RSP;
225 __net_handle_state_ind(network_info, profile_name, NET_STATE_TYPE_FAILURE);
228 __NETWORK_FUNC_EXIT__;
232 g_strlcpy(event_data->ProfileName,
233 profile_name, NET_PROFILE_NAME_LEN_MAX+1);
235 if (net_service_error != NET_ERR_NONE)
236 event_data->Error = net_service_error;
238 event_data->Error = NET_ERR_CONNECTION_CONNECT_FAILED;
239 NETWORK_LOG(NETWORK_ERROR, "Event error defined %d", event_data->Error);
241 event_data->Datalength = 0;
242 event_data->Data = NULL;
244 net_service_error = NET_ERR_NONE;
246 NETWORK_LOG(NETWORK_ERROR, "State failure %d", event_data->Error);
248 __net_trigger_event_callback(network_info, event_data);
251 /* Reseting the state back in case of failure state */
252 network_info->state_table[device_type] = NET_STATE_TYPE_IDLE;
254 __NETWORK_FUNC_EXIT__;
257 static int string2state(const char *state)
259 if (g_strcmp0(state, "idle") == 0)
260 return NET_STATE_TYPE_IDLE;
261 else if (g_strcmp0(state, "association") == 0)
262 return NET_STATE_TYPE_ASSOCIATION;
263 else if (g_strcmp0(state, "configuration") == 0)
264 return NET_STATE_TYPE_CONFIGURATION;
265 else if (g_strcmp0(state, "ready") == 0)
266 return NET_STATE_TYPE_READY;
267 else if (g_strcmp0(state, "online") == 0)
268 return NET_STATE_TYPE_ONLINE;
269 else if (g_strcmp0(state, "disconnect") == 0)
270 return NET_STATE_TYPE_DISCONNECT;
271 else if (g_strcmp0(state, "failure") == 0)
272 return NET_STATE_TYPE_FAILURE;
274 return NET_STATE_TYPE_UNKNOWN;
277 static int __net_handle_service_state_changed(network_info_t *network_info,
278 const gchar *sig_path, const char *key, const char *state)
280 net_err_t Error = NET_ERR_NONE;
281 net_state_type_t old_state, new_state;
283 net_event_info_t *event_data = NULL;
284 net_device_t device_type = NET_DEVICE_UNKNOWN;
286 if (network_info == NULL)
287 return NET_ERR_INVALID_PARAM;
289 if (sig_path == NULL)
292 event_data = g_try_new0(net_event_info_t, 1);
293 if (event_data == NULL)
296 device_type = _net_get_tech_type_from_path(sig_path);
297 if (device_type == NET_DEVICE_UNKNOWN) {
302 NETWORK_LOG(NETWORK_LOW, "[%s] %s", state, sig_path);
304 if (device_type == NET_DEVICE_WIFI && net_wifi_state == WIFI_OFF) {
305 NETWORK_LOG(NETWORK_LOW, "Wi-Fi is off");
310 old_state = network_info->state_table[device_type];
311 new_state = string2state(state);
313 NETWORK_LOG(NETWORK_LOW, "old state[%d] new state[%d]", old_state, new_state);
315 if (old_state == new_state) {
320 network_info->state_table[device_type] = new_state;
322 if (old_state != NET_STATE_TYPE_ONLINE && new_state == NET_STATE_TYPE_ONLINE)
323 __net_handle_internet_state_ind(network_info, device_type, 1);
324 else if (old_state == NET_STATE_TYPE_ONLINE && new_state != NET_STATE_TYPE_ONLINE)
325 __net_handle_internet_state_ind(network_info, device_type, 0);
328 case NET_STATE_TYPE_IDLE:
329 if (device_type == NET_DEVICE_WIFI &&
330 net_wifi_state == WIFI_CONNECTED) {
331 net_wifi_state = WIFI_ON;
333 if (old_state == NET_STATE_TYPE_DISCONNECT)
335 case NET_STATE_TYPE_ASSOCIATION:
336 case NET_STATE_TYPE_CONFIGURATION:
337 __net_handle_state_ind(network_info, sig_path, new_state);
340 case NET_STATE_TYPE_READY:
341 case NET_STATE_TYPE_ONLINE:
343 if (old_state != NET_STATE_TYPE_READY &&
344 old_state != NET_STATE_TYPE_ONLINE) {
345 const char *svc_name1 =
346 network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION].ProfileName;
347 const char *svc_name2 =
348 network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS].ProfileName;
350 if (network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION].flag == TRUE &&
351 strstr(sig_path, svc_name1) != NULL) {
352 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION]), 0,
353 sizeof(network_request_table_t));
355 event_data->Event = NET_EVENT_OPEN_RSP;
357 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_OPEN_RSP");
358 } else if (network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS].flag == TRUE &&
359 g_strcmp0(sig_path, svc_name2) == 0) {
360 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS]), 0,
361 sizeof(network_request_table_t));
363 event_data->Event = NET_EVENT_WIFI_WPS_RSP;
365 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_WIFI_WPS_RSP");
367 event_data->Event = NET_EVENT_OPEN_IND;
369 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_OPEN_IND");
372 net_profile_info_t prof_info;
373 if ((Error = net_get_profile_info(network_info, sig_path, &prof_info)) != NET_ERR_NONE) {
374 NETWORK_LOG(NETWORK_ERROR, "net_get_profile_info() failed [%s]",
375 _net_print_error(Error));
377 event_data->Datalength = 0;
378 event_data->Data = NULL;
380 event_data->Datalength = sizeof(net_profile_info_t);
381 event_data->Data = &prof_info;
384 event_data->Error = Error;
385 g_strlcpy(event_data->ProfileName, sig_path, NET_PROFILE_NAME_LEN_MAX+1);
387 __net_trigger_event_callback(network_info, event_data);
392 case NET_STATE_TYPE_DISCONNECT:
394 const char *svc_name1 =
395 network_info->request_table[NETWORK_REQUEST_TYPE_CLOSE_CONNECTION].ProfileName;
396 const char *svc_name2 =
397 network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION].ProfileName;
398 const char *svc_name3 =
399 network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS].ProfileName;
401 if (network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION].flag == TRUE &&
402 strstr(sig_path, svc_name2) != NULL) {
403 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION]), 0,
404 sizeof(network_request_table_t));
406 /** Send Open Resp */
407 event_data->Error = NET_ERR_OPERATION_ABORTED;
408 event_data->Event = NET_EVENT_OPEN_RSP;
409 g_strlcpy(event_data->ProfileName, sig_path, NET_PROFILE_NAME_LEN_MAX+1);
411 event_data->Datalength = 0;
412 event_data->Data = NULL;
414 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_OPEN_RSP");
416 __net_trigger_event_callback(network_info, event_data);
421 if (network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS].flag == TRUE &&
422 g_strcmp0(sig_path, svc_name3) == 0) {
423 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS]), 0,
424 sizeof(network_request_table_t));
427 event_data->Error = NET_ERR_OPERATION_ABORTED;
428 event_data->Event = NET_EVENT_WIFI_WPS_RSP;
429 g_strlcpy(event_data->ProfileName, sig_path, NET_PROFILE_NAME_LEN_MAX+1);
431 event_data->Datalength = 0;
432 event_data->Data = NULL;
434 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_WIFI_WPS_RSP");
436 __net_trigger_event_callback(network_info, event_data);
441 if (network_info->request_table[NETWORK_REQUEST_TYPE_CLOSE_CONNECTION].flag == TRUE &&
442 g_strcmp0(sig_path, svc_name1) == 0) {
443 memset(&(network_info->request_table[NETWORK_REQUEST_TYPE_CLOSE_CONNECTION]), 0,
444 sizeof(network_request_table_t));
446 /** Send Close Resp */
447 event_data->Error = Error;
448 event_data->Event = NET_EVENT_CLOSE_RSP;
449 g_strlcpy(event_data->ProfileName, sig_path, NET_PROFILE_NAME_LEN_MAX+1);
451 event_data->Datalength = 0;
452 event_data->Data = NULL;
454 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_CLOSE_RSP");
456 __net_trigger_event_callback(network_info, event_data);
461 /** Send Close Ind */
462 event_data->Error = Error;
463 event_data->Event = NET_EVENT_CLOSE_IND;
464 g_strlcpy(event_data->ProfileName, sig_path, NET_PROFILE_NAME_LEN_MAX+1);
466 event_data->Datalength = 0;
467 event_data->Data = NULL;
469 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_CLOSE_IND");
471 __net_trigger_event_callback(network_info, event_data);
475 case NET_STATE_TYPE_FAILURE:
476 __net_handle_failure_ind(network_info, sig_path, device_type);
480 Error = NET_ERR_UNKNOWN_METHOD;
488 static int string2error(const char *error)
490 if (g_strcmp0(error, "out-of-range") == 0)
491 return NET_ERR_CONNECTION_OUT_OF_RANGE;
492 else if (g_strcmp0(error, "pin-missing") == 0)
493 return NET_ERR_CONNECTION_PIN_MISSING;
494 else if (g_strcmp0(error, "dhcp-failed") == 0)
495 return NET_ERR_CONNECTION_DHCP_FAILED;
496 else if (g_strcmp0(error, "connect-failed") == 0)
497 return NET_ERR_CONNECTION_CONNECT_FAILED;
498 else if (g_strcmp0(error, "login-failed") == 0)
499 return NET_ERR_CONNECTION_LOGIN_FAILED;
500 else if (g_strcmp0(error, "auth-failed") == 0)
501 return NET_ERR_CONNECTION_AUTH_FAILED;
502 else if (g_strcmp0(error, "invalid-key") == 0)
503 return NET_ERR_CONNECTION_INVALID_KEY;
505 return NET_ERR_UNKNOWN;
508 static int __net_handle_service_set_error(const char *key, const char *error)
510 if (error == NULL || *error == '\0')
513 NETWORK_LOG(NETWORK_ERROR, "[%s] %s", key, error);
515 net_service_error = string2error(error);
520 static int __net_handle_ethernet_cable_state_rsp(GVariant *param,
521 network_info_t *network_info)
523 GVariantIter *iter = NULL;
524 GVariant *value = NULL;
525 const char *key = NULL;
526 const gchar *sig_value = NULL;
527 net_event_info_t *event_data = NULL;
529 if (network_info == NULL ||
530 network_info->event_callback == NULL) {
531 __NETWORK_FUNC_EXIT__;
532 return NET_ERR_INVALID_PARAM;
535 g_variant_get(param, "(a{sv})", &iter);
537 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
538 if (g_strcmp0(key, "key") == 0) {
539 sig_value = g_variant_get_string(value, NULL);
540 NETWORK_LOG(NETWORK_LOW, "Check Ethernet Monitor Result: %s",
544 g_variant_iter_free(iter);
546 event_data = g_try_new0(net_event_info_t, 1);
547 if (event_data == NULL) {
548 __NETWORK_FUNC_EXIT__;
549 return NET_ERR_OUT_OF_MEMORY;
552 if (g_strcmp0(sig_value, "ATTACHED") == 0) {
553 event_data->Event = NET_EVENT_ETHERNET_CABLE_ATTACHED;
554 event_data->Error = NET_ERR_NONE;
556 event_data->Event = NET_EVENT_ETHERNET_CABLE_DETACHED;
557 event_data->Error = NET_ERR_NONE;
559 event_data->Datalength = 0;
560 event_data->Data = NULL;
562 __net_trigger_event_callback(network_info, event_data);
568 static int __net_handle_network_dpm_wifi_event(GVariant *param,
569 network_info_t *network_info)
571 __NETWORK_FUNC_ENTER__;
573 GVariantIter *iter = NULL;
574 GVariant *value = NULL;
575 const char *key = NULL;
576 const gchar *sig_value = NULL;
578 g_variant_get(param, "(a{sv})", &iter);
580 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
581 if (g_strcmp0(key, "key") == 0) {
582 sig_value = g_variant_get_string(value, NULL);
583 NETWORK_LOG(NETWORK_LOW, "Wifi device policy : %s",
585 if (g_strcmp0(sig_value, "allowed") == 0)
586 net_dpm_wifi_state = TRUE;
588 net_dpm_wifi_state = FALSE;
591 g_variant_iter_free(iter);
593 __NETWORK_FUNC_EXIT__;
597 static int __net_handle_network_dpm_wifi_profile_event(GVariant *param,
598 network_info_t *network_info)
600 __NETWORK_FUNC_ENTER__;
602 GVariantIter *iter = NULL;
603 GVariant *value = NULL;
604 const char *key = NULL;
605 const gchar *sig_value = NULL;
607 g_variant_get(param, "(a{sv})", &iter);
609 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
610 if (g_strcmp0(key, "key") == 0) {
611 sig_value = g_variant_get_string(value, NULL);
612 NETWORK_LOG(NETWORK_LOW, "Wifi profile device policy : %s",
614 if (g_strcmp0(sig_value, "allowed") == 0)
615 net_dpm_wifi_profile_state = TRUE;
617 net_dpm_wifi_profile_state = FALSE;
620 g_variant_iter_free(iter);
622 __NETWORK_FUNC_EXIT__;
626 static int __net_handle_network_config_changed_event(GVariant *param,
627 network_info_t *network_info)
629 __NETWORK_FUNC_ENTER__;
631 GVariantIter *iter = NULL;
632 GVariant *value = NULL;
633 const char *key = NULL;
634 const gchar *sig_value = NULL;
636 gchar *params_str = NULL;
638 if (network_info == NULL ||
639 network_info->event_callback == NULL) {
640 __NETWORK_FUNC_EXIT__;
641 return NET_ERR_INVALID_PARAM;
644 params_str = g_variant_print(param, TRUE);
645 NETWORK_LOG(NETWORK_LOW, "params %s", params_str);
646 g_variant_get(param, "(a{sv})", &iter);
648 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
649 if (g_strcmp0(key, "NetworkStatus") == 0) {
650 net_event_info_t *event_data = NULL;
651 event_data = g_try_new0(net_event_info_t, 1);
653 network_status = g_variant_get_int32(value);
655 event_data->Event = NET_EVENT_NETWORK_TYPE_CHANGED;
656 event_data->Error = NET_ERR_NONE;
657 event_data->Datalength = sizeof(int);
658 event_data->Data = &network_status;
660 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_NETWORK_TYPE_CHANGED");
662 __net_trigger_event_callback(network_info, event_data);
665 } else if (g_strcmp0(key, "IPv4Address") == 0) {
666 net_event_info_t *event_data = NULL;
667 event_data = g_try_new0(net_event_info_t, 1);
669 sig_value = g_variant_get_string(value, NULL);
671 event_data->Event = NET_EVENT_IPV4_ADDRESS_CHANGED;
672 event_data->Error = NET_ERR_NONE;
673 event_data->Data = g_strdup(sig_value);
675 if (event_data->Data)
676 event_data->Datalength = strlen(event_data->Data) + 1;
678 event_data->Datalength = 0;
680 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_IPV4_ADDRESS_CHANGED");
682 __net_trigger_event_callback(network_info, event_data);
683 g_free(event_data->Data);
686 } else if (g_strcmp0(key, "IPv6Address") == 0) {
687 net_event_info_t *event_data = NULL;
688 event_data = g_try_new0(net_event_info_t, 1);
690 sig_value = g_variant_get_string(value, NULL);
692 event_data->Event = NET_EVENT_IPV6_ADDRESS_CHANGED;
693 event_data->Error = NET_ERR_NONE;
694 event_data->Data = g_strdup(sig_value);
696 if (event_data->Data)
697 event_data->Datalength = strlen(event_data->Data) + 1;
699 event_data->Datalength = 0;
701 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_IPV6_ADDRESS_CHANGED");
703 __net_trigger_event_callback(network_info, event_data);
704 g_free(event_data->Data);
707 } else if (g_strcmp0(key, "ProxyAddress") == 0) {
708 net_event_info_t *event_data = NULL;
709 event_data = g_try_new0(net_event_info_t, 1);
711 sig_value = g_variant_get_string(value, NULL);
713 event_data->Event = NET_EVENT_PROXY_ADDRESS_CHANGED;
714 event_data->Error = NET_ERR_NONE;
715 event_data->Data = g_strdup(sig_value);
717 if (event_data->Data)
718 event_data->Datalength = strlen(event_data->Data) + 1;
720 event_data->Datalength = 0;
722 NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_PROXY_ADDRESS_CHANGED");
724 __net_trigger_event_callback(network_info, event_data);
725 g_free(event_data->Data);
730 g_variant_iter_free(iter);
732 __NETWORK_FUNC_EXIT__;
736 static void __net_connman_service_signal_filter(GDBusConnection *conn,
737 const gchar *name, const gchar *path, const gchar *interface,
738 const gchar *sig, GVariant *param, gpointer user_data)
740 __NETWORK_FUNC_ENTER__;
742 const char *key = NULL;
743 const char *value = NULL;
745 network_info_t *network_info = (network_info_t *)user_data;
747 if (g_strcmp0(sig, SIGNAL_PROPERTY_CHANGED) == 0) {
748 g_variant_get(param, "(sv)", &key, &var);
750 if (g_strcmp0(key, "State") == 0) {
751 g_variant_get(var, "s", &value);
753 __net_handle_service_state_changed(network_info, path, key, value);
754 } else if (g_strcmp0(key, "Error") == 0) {
755 g_variant_get(var, "s", &value);
757 __net_handle_service_set_error(key, value);
760 g_free((gchar *)value);
761 g_free((gchar *)key);
763 g_variant_unref(var);
766 __NETWORK_FUNC_EXIT__;
769 static int __net_handle_wifi_connect_fail_event(GVariant *param, network_info_t *network_info)
771 __NETWORK_FUNC_ENTER__;
773 net_event_info_t *event_data = NULL;
774 network_request_table_t *open_info = NULL;
775 network_request_table_t *wps_info = NULL;
777 if (network_info == NULL ||
778 network_info->event_callback == NULL) {
779 __NETWORK_FUNC_EXIT__;
780 return NET_ERR_INVALID_PARAM;
783 open_info = &(network_info->request_table[NETWORK_REQUEST_TYPE_OPEN_CONNECTION]);
784 wps_info = &(network_info->request_table[NETWORK_REQUEST_TYPE_ENROLL_WPS]);
786 event_data = g_try_new0(net_event_info_t, 1);
787 if (event_data == NULL) {
788 __NETWORK_FUNC_EXIT__;
789 return NET_ERR_OUT_OF_MEMORY;
792 event_data->Datalength = 0;
793 event_data->Data = NULL;
795 NETWORK_LOG(NETWORK_HIGH, "Failed to connect WiFi");
796 g_strlcpy(event_data->ProfileName, open_info->ProfileName,
797 NET_PROFILE_NAME_LEN_MAX+1);
799 if (open_info->flag == TRUE) {
800 memset(open_info, 0, sizeof(network_request_table_t));
801 event_data->Error = NET_ERR_CONNECTION_CONNECT_FAILED;
802 event_data->Event = NET_EVENT_OPEN_RSP;
803 NETWORK_LOG(NETWORK_HIGH, "Sending NET_EVENT_OPEN_RSP");
804 } else if (wps_info->flag == TRUE) {
805 memset(wps_info, 0, sizeof(network_request_table_t));
806 event_data->Error = NET_ERR_CONNECTION_CONNECT_FAILED;
807 event_data->Event = NET_EVENT_WIFI_WPS_RSP;
808 NETWORK_LOG(NETWORK_HIGH, "Sending NET_EVENT_WIFI_WPS_RSP");
810 NETWORK_LOG(NETWORK_LOW, "WiFi Connection flag not set");
812 __NETWORK_FUNC_EXIT__;
816 __net_trigger_event_callback(network_info, event_data);
819 __NETWORK_FUNC_EXIT__;
823 static void __net_netconfig_signal_filter(GDBusConnection *conn,
824 const gchar *name, const gchar *path, const gchar *interface,
825 const gchar *sig, GVariant *param, gpointer user_data)
827 network_info_t *network_info = (network_info_t *)user_data;
829 if (g_strcmp0(sig, NETCONFIG_SIGNAL_POWERON_COMPLETED) == 0)
830 __net_handle_wifi_power_rsp(TRUE, network_info);
831 else if (g_strcmp0(sig, NETCONFIG_SIGNAL_POWEROFF_COMPLETED) == 0)
832 __net_handle_wifi_power_rsp(FALSE, network_info);
833 else if (g_strcmp0(sig, NETCONFIG_SIGNAL_WIFI_CONNECT_FAIL) == 0)
834 __net_handle_wifi_connect_fail_event(param, network_info);
837 static void __net_netconfig_network_signal_filter(GDBusConnection *conn,
838 const gchar *name, const gchar *path, const gchar *interface,
839 const gchar *sig, GVariant *param, gpointer user_data)
841 network_info_t *network_info = (network_info_t *)user_data;
843 if (g_strcmp0(sig, NETCONFIG_SIGNAL_ETHERNET_CABLE_STATE) == 0)
844 __net_handle_ethernet_cable_state_rsp(param, network_info);
845 else if (g_strcmp0(sig, NETCONFIG_SIGNAL_DPM_WIFI) == 0)
846 __net_handle_network_dpm_wifi_event(param, network_info);
847 else if (g_strcmp0(sig, NETCONFIG_SIGNAL_DPM_WIFI_PROFILE) == 0)
848 __net_handle_network_dpm_wifi_profile_event(param, network_info);
849 else if (g_strcmp0(sig, NETCONFIG_SIGNAL_NETWORK_CONFIGURATION_CHANGED) == 0)
850 __net_handle_network_config_changed_event(param, network_info);
854 /*****************************************************************************
856 *****************************************************************************/
858 net_wifi_state_t _net_get_wifi_state(void)
860 return net_wifi_state;
863 void _net_set_wifi_state(net_wifi_state_t state)
865 net_wifi_state = state;
868 /* LCOV_EXCL_START */
869 void _net_set_dpm_wifi_profile_state(int state)
871 net_dpm_wifi_profile_state = state;
874 void _net_set_cs_tid(int tid, network_info_t *network_info)
877 struct cs_tid_info *tid_info = NULL;
878 struct cs_tid_info *data = NULL;
881 for (list = cs_tid_list; list; list = list->next) {
882 data = (struct cs_tid_info *)list->data;
883 if (tid == data->tid) {
891 tid_info = (struct cs_tid_info *)g_try_malloc0(sizeof(struct cs_tid_info));
893 NETWORK_LOG(NETWORK_ERROR, "Out of memory, tid %d", tid);
898 cs_tid_list = g_slist_prepend(cs_tid_list, tid_info);
902 tid_info->subscribe_id_connman_state = network_info->subscribe_id_connman_state;
903 tid_info->subscribe_id_connman_error = network_info->subscribe_id_connman_error;
904 tid_info->subscribe_id_netconfig_wifi = network_info->subscribe_id_netconfig_wifi;
905 tid_info->subscribe_id_netconfig = network_info->subscribe_id_netconfig;
908 NETWORK_LOG(NETWORK_HIGH, "tid %d, tid_info %p", tid, tid_info);
911 void _net_unset_cs_tid(int tid, network_info_t *network_info)
914 struct cs_tid_info *tid_info = NULL;
915 struct cs_tid_info *data = NULL;
918 for (list = cs_tid_list; list; list = list->next) {
919 data = (struct cs_tid_info *)list->data;
920 if (tid == data->tid) {
928 NETWORK_LOG(NETWORK_ERROR, "No tid_info, tid %d", tid);
933 _net_dbus_unsubscribe_signal(network_info,
934 tid_info->subscribe_id_connman_state);
935 _net_dbus_unsubscribe_signal(network_info,
936 tid_info->subscribe_id_connman_error);
937 _net_dbus_unsubscribe_signal(network_info,
938 tid_info->subscribe_id_netconfig_wifi);
939 _net_dbus_unsubscribe_signal(network_info,
940 tid_info->subscribe_id_netconfig);
943 NETWORK_LOG(NETWORK_HIGH, "tid %d, tid_info %p", tid, tid_info);
945 cs_tid_list = g_slist_remove(cs_tid_list, tid_info);
950 void _net_deregister_signal(network_info_t *network_info)
952 __NETWORK_FUNC_ENTER__;
955 _net_dbus_unsubscribe_signal(network_info,
956 network_info->subscribe_id_connman_state);
957 _net_dbus_unsubscribe_signal(network_info,
958 network_info->subscribe_id_mesh_state);
959 _net_dbus_unsubscribe_signal(network_info,
960 network_info->subscribe_id_connman_error);
961 _net_dbus_unsubscribe_signal(network_info,
962 network_info->subscribe_id_netconfig_wifi);
963 _net_dbus_unsubscribe_signal(network_info,
964 network_info->subscribe_id_netconfig);
967 __NETWORK_FUNC_EXIT__;
970 int _net_register_signal(network_info_t *network_info)
972 __NETWORK_FUNC_ENTER__;
974 if (network_info == NULL) {
975 __NETWORK_FUNC_EXIT__;
976 return NET_ERR_INVALID_PARAM;
979 /* Create connman service state connection */
980 network_info->subscribe_id_connman_state = _net_dbus_subscribe_signal(
983 CONNMAN_SERVICE_INTERFACE,
984 SIGNAL_PROPERTY_CHANGED,
987 __net_connman_service_signal_filter);
989 /* Create connman mesh state connection */
990 network_info->subscribe_id_mesh_state = _net_dbus_subscribe_signal(
993 CONNMAN_MESH_INTERFACE,
994 SIGNAL_PROPERTY_CHANGED,
997 __net_connman_service_signal_filter);
999 /* Create connman service error connection */
1000 network_info->subscribe_id_connman_error = _net_dbus_subscribe_signal(
1003 CONNMAN_SERVICE_INTERFACE,
1004 SIGNAL_PROPERTY_CHANGED,
1007 __net_connman_service_signal_filter);
1009 /* Create net-config service connection for network */
1010 network_info->subscribe_id_netconfig = _net_dbus_subscribe_signal(
1013 NETCONFIG_NETWORK_INTERFACE,
1015 NETCONFIG_NETWORK_PATH,
1017 __net_netconfig_network_signal_filter);
1019 /* Create net-config service connection for wifi */
1020 network_info->subscribe_id_netconfig_wifi = _net_dbus_subscribe_signal(
1023 NETCONFIG_WIFI_INTERFACE,
1025 NETCONFIG_WIFI_PATH,
1027 __net_netconfig_signal_filter);
1029 __NETWORK_FUNC_EXIT__;
1030 return NET_ERR_NONE;
1033 static int __net_get_all_tech_states(GVariant *msg, net_state_type_t *state_table)
1035 __NETWORK_FUNC_ENTER__;
1037 net_err_t Error = NET_ERR_NONE;
1038 GVariantIter *iter_main = NULL;
1039 GVariantIter *var = NULL;
1040 GVariant *value = NULL;
1045 g_variant_get(msg, "(a(oa{sv}))", &iter_main);
1046 while (g_variant_iter_loop(iter_main, "(oa{sv})", &path, &var)) {
1049 continue; //LCOV_EXCL_LINE
1051 while (g_variant_iter_loop(var, "{sv}", &key, &value)) {
1052 if (g_strcmp0(key, "Connected") == 0) {
1053 data = g_variant_get_boolean(value);
1057 /* LCOV_EXCL_START */
1058 if (g_strcmp0(path, CONNMAN_WIFI_TECHNOLOGY_PREFIX) == 0) {
1059 *(state_table + NET_DEVICE_WIFI) = NET_STATE_TYPE_READY;
1060 net_wifi_state = WIFI_CONNECTED;
1061 } else if (g_strcmp0(path, CONNMAN_CELLULAR_TECHNOLOGY_PREFIX) == 0)
1062 *(state_table + NET_DEVICE_CELLULAR) = NET_STATE_TYPE_READY;
1063 else if (g_strcmp0(path, CONNMAN_ETHERNET_TECHNOLOGY_PREFIX) == 0)
1064 *(state_table + NET_DEVICE_ETHERNET) = NET_STATE_TYPE_READY;
1065 else if (g_strcmp0(path, CONNMAN_BLUETOOTH_TECHNOLOGY_PREFIX) == 0)
1066 *(state_table + NET_DEVICE_BLUETOOTH) = NET_STATE_TYPE_READY;
1067 else if (g_strcmp0(path, CONNMAN_MESH_TECHNOLOGY_PREFIX) == 0)
1068 *(state_table + NET_DEVICE_MESH) = NET_STATE_TYPE_READY;
1070 NETWORK_LOG(NETWORK_ERROR, "Invalid technology type");
1071 } else if (g_strcmp0(path, CONNMAN_WIFI_TECHNOLOGY_PREFIX) == 0 &&
1072 g_strcmp0(key, "Powered") == 0) {
1073 data = g_variant_get_boolean(value);
1075 net_wifi_state = WIFI_OFF;
1076 else if (data == TRUE && net_wifi_state < WIFI_ON)
1077 net_wifi_state = WIFI_ON;
1081 /* LCOV_EXCL_STOP */
1082 g_variant_iter_free(iter_main);
1084 __NETWORK_FUNC_EXIT__;
1088 static int __net_dbus_get_all_technology_states(network_info_t *network_info)
1090 __NETWORK_FUNC_ENTER__;
1092 net_err_t Error = NET_ERR_NONE;
1093 GVariant *message = NULL;
1095 message = _net_invoke_dbus_method(network_info, CONNMAN_SERVICE,
1096 CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
1097 "GetTechnologies", NULL, &Error);
1098 if (message == NULL) {
1099 NETWORK_LOG(NETWORK_ERROR, "Failed to get technology info"); //LCOV_EXCL_LINE
1103 Error = __net_get_all_tech_states(message, network_info->state_table);
1105 g_variant_unref(message);
1108 __NETWORK_FUNC_EXIT__;
1112 int _net_init_service_state_table(network_info_t *network_info)
1114 __NETWORK_FUNC_ENTER__;
1116 net_err_t Error = NET_ERR_NONE;
1118 Error = __net_dbus_get_all_technology_states(network_info);
1119 if (Error != NET_ERR_NONE) {
1120 __NETWORK_FUNC_EXIT__;
1124 NETWORK_LOG(NETWORK_HIGH, "init service state table. "
1125 "wifi:%d, cellular:%d, ethernet:%d, bluetooth:%d, mesh:%d",
1126 network_info->state_table[NET_DEVICE_WIFI],
1127 network_info->state_table[NET_DEVICE_CELLULAR],
1128 network_info->state_table[NET_DEVICE_ETHERNET],
1129 network_info->state_table[NET_DEVICE_BLUETOOTH],
1130 network_info->state_table[NET_DEVICE_MESH]);
1132 __NETWORK_FUNC_EXIT__;
1133 return NET_ERR_NONE;
1136 int _net_get_wifi_service_state(network_info_t *network_info)
1138 __NETWORK_FUNC_ENTER__;
1140 if (net_wifi_state == WIFI_ON) {
1141 __NETWORK_FUNC_EXIT__;
1142 return NET_STATE_TYPE_DISCONNECT;
1145 __NETWORK_FUNC_EXIT__;
1146 return network_info->state_table[NET_DEVICE_WIFI];