5 * Copyright (C) 2007-2014 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32 * How many times to send RS with the purpose of
33 * refreshing RDNSS entries before they actually expire.
34 * With a value of 1, one RS will be sent, with no retries.
36 #define RS_REFRESH_COUNT 1
39 * Value in seconds to wait for RA after RS was sent.
40 * After this time elapsed, we can send another RS.
42 #define RS_REFRESH_TIMEOUT 3
45 #define WIFI_ENCYPTION_MODE_LEN_MAX 6
46 #define WIFI_BSSID_LEN_MAX 6
49 static GSList *network_list = NULL;
50 static GSList *driver_list = NULL;
52 struct connman_network {
54 enum connman_network_type type;
66 int router_solicit_count;
67 int router_solicit_refresh_count;
69 struct connman_network_driver *driver;
75 struct connman_device *device;
81 unsigned short channel;
88 char *client_cert_path;
89 char *private_key_path;
90 char *private_key_passphrase;
96 char encryption_mode[WIFI_ENCYPTION_MODE_LEN_MAX];
97 unsigned char bssid[WIFI_BSSID_LEN_MAX];
99 unsigned int isHS20AP;
100 unsigned int keymgmt;
103 int disconnect_reason;
105 unsigned int wifi_vsie_len;
109 #if defined TIZEN_EXT
110 /* Multiple APN services and a default APN which a user selected */
111 bool default_internet;
116 static void autoconf_ipv6_set(struct connman_network *network);
118 static const char *type2string(enum connman_network_type type)
121 case CONNMAN_NETWORK_TYPE_UNKNOWN:
122 case CONNMAN_NETWORK_TYPE_VENDOR:
124 case CONNMAN_NETWORK_TYPE_ETHERNET:
126 case CONNMAN_NETWORK_TYPE_GADGET:
128 case CONNMAN_NETWORK_TYPE_WIFI:
130 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
131 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
133 case CONNMAN_NETWORK_TYPE_CELLULAR:
140 static bool match_driver(struct connman_network *network,
141 struct connman_network_driver *driver)
143 if (network->type == driver->type ||
144 driver->type == CONNMAN_NETWORK_TYPE_UNKNOWN)
150 static void set_configuration(struct connman_network *network,
151 enum connman_ipconfig_type type)
153 struct connman_service *service;
155 DBG("network %p", network);
157 if (!network->device)
160 __connman_device_set_network(network->device, network);
162 connman_device_set_disconnected(network->device, false);
164 service = connman_service_lookup_from_network(network);
165 __connman_service_ipconfig_indicate_state(service,
166 CONNMAN_SERVICE_STATE_CONFIGURATION,
170 static void dhcp_success(struct connman_network *network)
172 struct connman_service *service;
173 struct connman_ipconfig *ipconfig_ipv4;
176 service = connman_service_lookup_from_network(network);
180 ipconfig_ipv4 = __connman_service_get_ip4config(service);
182 DBG("lease acquired for ipconfig %p", ipconfig_ipv4);
187 err = __connman_ipconfig_address_add(ipconfig_ipv4);
191 #if defined TIZEN_EXT
192 err = __connman_ipconfig_gateway_add(ipconfig_ipv4, service);
194 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
202 connman_network_set_error(network,
203 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
206 static void dhcp_failure(struct connman_network *network)
208 struct connman_service *service;
209 struct connman_ipconfig *ipconfig_ipv4;
211 service = connman_service_lookup_from_network(network);
215 ipconfig_ipv4 = __connman_service_get_ip4config(service);
217 DBG("lease lost for ipconfig %p", ipconfig_ipv4);
222 __connman_ipconfig_address_remove(ipconfig_ipv4);
223 __connman_ipconfig_gateway_remove(ipconfig_ipv4);
226 static void dhcp_callback(struct connman_ipconfig *ipconfig,
227 struct connman_network *network,
228 bool success, gpointer data)
230 #if defined TIZEN_EXT
231 struct connman_service *service;
232 struct connman_ipconfig *ipconfig_ipv6;
235 network->connecting = false;
238 dhcp_success(network);
240 dhcp_failure(network);
242 #if defined TIZEN_EXT
243 service = connman_service_lookup_from_network(network);
244 ipconfig_ipv6 = __connman_service_get_ip6config(service);
245 if (__connman_ipconfig_get_method(ipconfig_ipv6) == CONNMAN_IPCONFIG_METHOD_AUTO) {
246 DBG("IPv6 autoconf start");
247 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV6);
248 autoconf_ipv6_set(network);
253 static int set_connected_manual(struct connman_network *network)
256 struct connman_service *service;
257 struct connman_ipconfig *ipconfig;
259 DBG("network %p", network);
261 network->connecting = false;
263 service = connman_service_lookup_from_network(network);
265 ipconfig = __connman_service_get_ip4config(service);
267 if (!__connman_ipconfig_get_local(ipconfig))
268 __connman_service_read_ip4config(service);
270 err = __connman_ipconfig_address_add(ipconfig);
274 #if defined TIZEN_EXT
275 err = __connman_ipconfig_gateway_add(ipconfig, service);
277 err = __connman_ipconfig_gateway_add(ipconfig);
286 static int set_connected_dhcp(struct connman_network *network)
288 struct connman_service *service;
289 struct connman_ipconfig *ipconfig_ipv4;
292 DBG("network %p", network);
294 service = connman_service_lookup_from_network(network);
295 ipconfig_ipv4 = __connman_service_get_ip4config(service);
297 err = __connman_dhcp_start(ipconfig_ipv4, network,
298 dhcp_callback, NULL);
300 connman_error("Can not request DHCP lease");
307 static int manual_ipv6_set(struct connman_network *network,
308 struct connman_ipconfig *ipconfig_ipv6)
310 struct connman_service *service;
313 DBG("network %p ipv6 %p", network, ipconfig_ipv6);
315 service = connman_service_lookup_from_network(network);
319 if (!__connman_ipconfig_get_local(ipconfig_ipv6))
320 __connman_service_read_ip6config(service);
322 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
324 err = __connman_ipconfig_address_add(ipconfig_ipv6);
326 connman_network_set_error(network,
327 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
331 #if defined TIZEN_EXT
332 err = __connman_ipconfig_gateway_add(ipconfig_ipv6, service);
334 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
339 __connman_connection_gateway_activate(service,
340 CONNMAN_IPCONFIG_TYPE_IPV6);
342 __connman_device_set_network(network->device, network);
344 connman_device_set_disconnected(network->device, false);
346 connman_network_set_associating(network, false);
348 network->connecting = false;
353 static void stop_dhcpv6(struct connman_network *network)
355 network->connecting = false;
357 __connman_dhcpv6_stop(network);
360 static void dhcpv6_release_callback(struct connman_network *network,
361 enum __connman_dhcpv6_status status,
364 DBG("status %d", status);
366 stop_dhcpv6(network);
369 static void release_dhcpv6(struct connman_network *network)
371 __connman_dhcpv6_start_release(network, dhcpv6_release_callback);
372 stop_dhcpv6(network);
375 static void dhcpv6_info_callback(struct connman_network *network,
376 enum __connman_dhcpv6_status status,
379 DBG("status %d", status);
381 stop_dhcpv6(network);
384 static int dhcpv6_set_addresses(struct connman_network *network)
386 struct connman_service *service;
387 struct connman_ipconfig *ipconfig_ipv6;
390 service = connman_service_lookup_from_network(network);
394 network->connecting = false;
396 ipconfig_ipv6 = __connman_service_get_ip6config(service);
397 err = __connman_ipconfig_address_add(ipconfig_ipv6);
404 connman_network_set_error(network,
405 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
409 static void dhcpv6_callback(struct connman_network *network,
410 enum __connman_dhcpv6_status status, gpointer data);
413 * Have a separate callback for renew so that we do not do autoconf
414 * in wrong phase as the dhcpv6_callback() is also called when doing
415 * DHCPv6 solicitation.
417 static void dhcpv6_renew_callback(struct connman_network *network,
418 enum __connman_dhcpv6_status status,
422 case CONNMAN_DHCPV6_STATUS_SUCCEED:
423 dhcpv6_callback(network, status, data);
425 case CONNMAN_DHCPV6_STATUS_FAIL:
426 case CONNMAN_DHCPV6_STATUS_RESTART:
427 stop_dhcpv6(network);
429 /* restart and do solicit again. */
430 autoconf_ipv6_set(network);
435 static void dhcpv6_callback(struct connman_network *network,
436 enum __connman_dhcpv6_status status, gpointer data)
438 DBG("status %d", status);
440 /* Start the renew process if necessary */
441 if (status == CONNMAN_DHCPV6_STATUS_SUCCEED) {
443 if (dhcpv6_set_addresses(network) < 0) {
444 stop_dhcpv6(network);
448 if (__connman_dhcpv6_start_renew(network,
449 dhcpv6_renew_callback) == -ETIMEDOUT)
450 dhcpv6_renew_callback(network,
451 CONNMAN_DHCPV6_STATUS_FAIL,
454 } else if (status == CONNMAN_DHCPV6_STATUS_RESTART) {
455 stop_dhcpv6(network);
456 autoconf_ipv6_set(network);
458 stop_dhcpv6(network);
461 static void check_dhcpv6(struct nd_router_advert *reply,
462 unsigned int length, void *user_data)
464 struct connman_network *network = user_data;
465 struct connman_service *service;
468 DBG("reply %p", reply);
472 * Router solicitation message seem to get lost easily so
473 * try to send it again.
475 if (network->router_solicit_count > 0) {
476 DBG("re-send router solicitation %d",
477 network->router_solicit_count);
478 network->router_solicit_count--;
479 __connman_inet_ipv6_send_rs(network->index, 1,
480 check_dhcpv6, network);
483 #if defined TIZEN_EXT
484 DBG("RA message is not received from server in reply of RS.");
486 connman_network_unref(network);
490 network->router_solicit_count = 0;
493 * If we were disconnected while waiting router advertisement,
494 * we just quit and do not start DHCPv6
496 if (!network->connected) {
497 connman_network_unref(network);
498 #if defined TIZEN_EXT
499 DBG("Network is not connected");
504 prefixes = __connman_inet_ipv6_get_prefixes(reply, length);
507 * If IPv6 config is missing from service, then create it.
508 * The ipconfig might be missing if we got a rtnl message
509 * that disabled IPv6 config and thus removed it. This
510 * can happen if we are switching from one service to
511 * another in the same interface. The only way to get IPv6
512 * config back is to re-create it here.
514 service = connman_service_lookup_from_network(network);
516 connman_service_create_ip6config(service, network->index);
518 connman_network_set_associating(network, false);
520 __connman_service_ipconfig_indicate_state(service,
521 CONNMAN_SERVICE_STATE_CONFIGURATION,
522 CONNMAN_IPCONFIG_TYPE_IPV6);
526 * We do stateful/stateless DHCPv6 if router advertisement says so.
528 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED) {
529 #if defined TIZEN_EXT
530 DBG("IPv6 ND_RA_FLAG_MANAGED");
532 __connman_dhcpv6_start(network, prefixes, dhcpv6_callback);
534 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
535 #if defined TIZEN_EXT
537 DBG("IPv6 ND_RA_FLAG_OTHER");
539 __connman_dhcpv6_start_info(network,
540 dhcpv6_info_callback);
541 #if defined TIZEN_EXT
545 g_slist_free_full(prefixes, g_free);
546 network->connecting = false;
549 connman_network_unref(network);
552 static void receive_refresh_rs_reply(struct nd_router_advert *reply,
553 unsigned int length, void *user_data)
555 struct connman_network *network = user_data;
557 DBG("reply %p", reply);
561 * Router solicitation message seem to get lost easily so
562 * try to send it again.
564 if (network->router_solicit_refresh_count > 1) {
565 network->router_solicit_refresh_count--;
566 DBG("re-send router solicitation %d",
567 network->router_solicit_refresh_count);
568 __connman_inet_ipv6_send_rs(network->index,
570 receive_refresh_rs_reply,
576 /* RS refresh not in progress anymore */
577 network->router_solicit_refresh_count = 0;
579 connman_network_unref(network);
583 int __connman_network_refresh_rs_ipv6(struct connman_network *network,
588 DBG("network %p index %d", network, index);
590 /* Send only one RS for all RDNSS entries which are about to expire */
591 if (network->router_solicit_refresh_count > 0) {
592 DBG("RS refresh already started");
596 network->router_solicit_refresh_count = RS_REFRESH_COUNT;
598 connman_network_ref(network);
600 ret = __connman_inet_ipv6_send_rs(index, RS_REFRESH_TIMEOUT,
601 receive_refresh_rs_reply, network);
605 static void autoconf_ipv6_set(struct connman_network *network)
607 struct connman_service *service;
608 struct connman_ipconfig *ipconfig;
611 DBG("network %p", network);
613 if (network->router_solicit_count > 0) {
615 * The autoconfiguration is already pending and we have sent
616 * router solicitation messages and are now waiting answers.
617 * There is no need to continue any further.
619 DBG("autoconfiguration already started");
623 __connman_device_set_network(network->device, network);
625 connman_device_set_disconnected(network->device, false);
627 #if defined TIZEN_EXT
628 if(network->type == CONNMAN_NETWORK_TYPE_CELLULAR)
632 service = connman_service_lookup_from_network(network);
636 ipconfig = __connman_service_get_ip6config(service);
640 __connman_ipconfig_enable_ipv6(ipconfig);
642 __connman_ipconfig_address_remove(ipconfig);
644 index = __connman_ipconfig_get_index(ipconfig);
646 connman_network_ref(network);
648 /* Try to get stateless DHCPv6 information, RFC 3736 */
649 network->router_solicit_count = 3;
650 __connman_inet_ipv6_send_rs(index, 1, check_dhcpv6, network);
653 static void set_connected(struct connman_network *network)
655 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
656 struct connman_service *service;
658 if (network->connected)
661 connman_network_set_associating(network, false);
663 network->connected = true;
665 service = connman_service_lookup_from_network(network);
667 ipconfig_ipv4 = __connman_service_get_ip4config(service);
668 ipconfig_ipv6 = __connman_service_get_ip6config(service);
670 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
673 __connman_network_enable_ipconfig(network, ipconfig_ipv4);
674 __connman_network_enable_ipconfig(network, ipconfig_ipv6);
677 static void set_disconnected(struct connman_network *network)
679 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
680 enum connman_ipconfig_method ipv4_method, ipv6_method;
681 enum connman_service_state state;
682 struct connman_service *service;
684 service = connman_service_lookup_from_network(network);
686 ipconfig_ipv4 = __connman_service_get_ip4config(service);
687 ipconfig_ipv6 = __connman_service_get_ip6config(service);
689 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
692 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
693 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
695 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
698 * Resetting solicit count here will prevent the RS resend loop
699 * from sending packets in check_dhcpv6()
701 network->router_solicit_count = 0;
703 __connman_device_set_network(network->device, NULL);
705 if (network->connected) {
706 switch (ipv6_method) {
707 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
708 case CONNMAN_IPCONFIG_METHOD_OFF:
709 case CONNMAN_IPCONFIG_METHOD_FIXED:
710 case CONNMAN_IPCONFIG_METHOD_MANUAL:
712 case CONNMAN_IPCONFIG_METHOD_DHCP:
713 case CONNMAN_IPCONFIG_METHOD_AUTO:
714 release_dhcpv6(network);
718 switch (ipv4_method) {
719 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
720 case CONNMAN_IPCONFIG_METHOD_OFF:
721 case CONNMAN_IPCONFIG_METHOD_AUTO:
722 case CONNMAN_IPCONFIG_METHOD_FIXED:
723 case CONNMAN_IPCONFIG_METHOD_MANUAL:
725 case CONNMAN_IPCONFIG_METHOD_DHCP:
726 __connman_dhcp_stop(ipconfig_ipv4);
732 * We only set the disconnect state if we were not in idle
733 * or in failure. It does not make sense to go to disconnect
734 * state if we were not connected.
736 state = __connman_service_ipconfig_get_state(service,
737 CONNMAN_IPCONFIG_TYPE_IPV4);
738 if (state != CONNMAN_SERVICE_STATE_IDLE &&
739 state != CONNMAN_SERVICE_STATE_FAILURE)
740 __connman_service_ipconfig_indicate_state(service,
741 CONNMAN_SERVICE_STATE_DISCONNECT,
742 CONNMAN_IPCONFIG_TYPE_IPV4);
744 state = __connman_service_ipconfig_get_state(service,
745 CONNMAN_IPCONFIG_TYPE_IPV6);
746 if (state != CONNMAN_SERVICE_STATE_IDLE &&
747 state != CONNMAN_SERVICE_STATE_FAILURE)
748 __connman_service_ipconfig_indicate_state(service,
749 CONNMAN_SERVICE_STATE_DISCONNECT,
750 CONNMAN_IPCONFIG_TYPE_IPV6);
752 if (network->connected) {
753 #if defined TIZEN_EXT
755 * Do not remove gateway and its address,
756 * if there are connected profiles that use same interface (multiple PDN)
758 if (connman_service_get_type(service) != CONNMAN_SERVICE_TYPE_CELLULAR ||
759 __connman_service_get_connected_count_of_iface(service) <= 0) {
761 __connman_connection_gateway_remove(service,
762 CONNMAN_IPCONFIG_TYPE_ALL);
764 __connman_ipconfig_address_unset(ipconfig_ipv4);
765 __connman_ipconfig_address_unset(ipconfig_ipv6);
766 #if defined TIZEN_EXT
770 * Special handling for IPv6 autoconfigured address.
771 * The simplest way to remove autoconfigured routes is to
772 * disable IPv6 temporarily so that kernel will do the cleanup
775 if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
776 __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
777 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
781 __connman_service_ipconfig_indicate_state(service,
782 CONNMAN_SERVICE_STATE_IDLE,
783 CONNMAN_IPCONFIG_TYPE_IPV4);
785 __connman_service_ipconfig_indicate_state(service,
786 CONNMAN_SERVICE_STATE_IDLE,
787 CONNMAN_IPCONFIG_TYPE_IPV6);
789 network->connecting = false;
790 network->connected = false;
792 connman_network_set_associating(network, false);
797 static int network_probe(struct connman_network *network)
800 struct connman_network_driver *driver = NULL;
802 DBG("network %p name %s", network, network->name);
807 for (list = driver_list; list; list = list->next) {
810 if (!match_driver(network, driver)) {
815 DBG("driver %p name %s", driver, driver->name);
817 if (driver->probe(network) == 0)
829 switch (network->type) {
830 case CONNMAN_NETWORK_TYPE_UNKNOWN:
831 case CONNMAN_NETWORK_TYPE_VENDOR:
833 case CONNMAN_NETWORK_TYPE_ETHERNET:
834 case CONNMAN_NETWORK_TYPE_GADGET:
835 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
836 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
837 case CONNMAN_NETWORK_TYPE_CELLULAR:
838 case CONNMAN_NETWORK_TYPE_WIFI:
839 network->driver = driver;
840 if (!__connman_service_create_from_network(network)) {
841 network->driver = NULL;
849 static void network_remove(struct connman_network *network)
851 DBG("network %p name %s", network, network->name);
853 if (!network->driver)
856 if (network->connected)
857 set_disconnected(network);
859 switch (network->type) {
860 case CONNMAN_NETWORK_TYPE_UNKNOWN:
861 case CONNMAN_NETWORK_TYPE_VENDOR:
863 case CONNMAN_NETWORK_TYPE_ETHERNET:
864 case CONNMAN_NETWORK_TYPE_GADGET:
865 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
866 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
867 case CONNMAN_NETWORK_TYPE_CELLULAR:
868 case CONNMAN_NETWORK_TYPE_WIFI:
869 if (network->group) {
870 __connman_service_remove_from_network(network);
872 g_free(network->group);
873 network->group = NULL;
878 if (network->driver->remove)
879 network->driver->remove(network);
881 network->driver = NULL;
884 static void probe_driver(struct connman_network_driver *driver)
888 DBG("driver %p name %s", driver, driver->name);
890 for (list = network_list; list; list = list->next) {
891 struct connman_network *network = list->data;
896 if (driver->type != network->type)
899 if (driver->probe(network) < 0)
902 network->driver = driver;
906 static void remove_driver(struct connman_network_driver *driver)
910 DBG("driver %p name %s", driver, driver->name);
912 for (list = network_list; list; list = list->next) {
913 struct connman_network *network = list->data;
915 if (network->driver == driver)
916 network_remove(network);
920 static gint compare_priority(gconstpointer a, gconstpointer b)
922 const struct connman_network_driver *driver1 = a;
923 const struct connman_network_driver *driver2 = b;
925 return driver2->priority - driver1->priority;
929 * connman_network_driver_register:
930 * @driver: network driver definition
932 * Register a new network driver
934 * Returns: %0 on success
936 int connman_network_driver_register(struct connman_network_driver *driver)
938 DBG("driver %p name %s", driver, driver->name);
940 driver_list = g_slist_insert_sorted(driver_list, driver,
943 probe_driver(driver);
949 * connman_network_driver_unregister:
950 * @driver: network driver definition
952 * Remove a previously registered network driver
954 void connman_network_driver_unregister(struct connman_network_driver *driver)
956 DBG("driver %p name %s", driver, driver->name);
958 driver_list = g_slist_remove(driver_list, driver);
960 remove_driver(driver);
963 static void network_destruct(struct connman_network *network)
965 DBG("network %p name %s", network, network->name);
967 g_free(network->wifi.ssid);
968 g_free(network->wifi.mode);
969 g_free(network->wifi.security);
970 g_free(network->wifi.passphrase);
971 g_free(network->wifi.eap);
972 g_free(network->wifi.identity);
973 g_free(network->wifi.agent_identity);
974 g_free(network->wifi.ca_cert_path);
975 g_free(network->wifi.client_cert_path);
976 g_free(network->wifi.private_key_path);
977 g_free(network->wifi.private_key_passphrase);
978 g_free(network->wifi.phase2_auth);
979 g_free(network->wifi.pin_wps);
980 #if defined TIZEN_EXT
981 g_free(network->wifi.wifi_vsie);
983 g_free(network->path);
984 g_free(network->group);
985 g_free(network->node);
986 g_free(network->name);
987 g_free(network->identifier);
989 network->device = NULL;
995 * connman_network_create:
996 * @identifier: network identifier (for example an unqiue name)
998 * Allocate a new network and assign the #identifier to it.
1000 * Returns: a newly-allocated #connman_network structure
1002 struct connman_network *connman_network_create(const char *identifier,
1003 enum connman_network_type type)
1005 struct connman_network *network;
1008 DBG("identifier %s type %d", identifier, type);
1010 network = g_try_new0(struct connman_network, 1);
1014 DBG("network %p", network);
1016 network->refcount = 1;
1018 ident = g_strdup(identifier);
1025 network->type = type;
1026 network->identifier = ident;
1028 network_list = g_slist_prepend(network_list, network);
1034 * connman_network_ref:
1035 * @network: network structure
1037 * Increase reference counter of network
1039 struct connman_network *
1040 connman_network_ref_debug(struct connman_network *network,
1041 const char *file, int line, const char *caller)
1043 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
1044 network->refcount + 1, file, line, caller);
1046 __sync_fetch_and_add(&network->refcount, 1);
1052 * connman_network_unref:
1053 * @network: network structure
1055 * Decrease reference counter of network
1057 void connman_network_unref_debug(struct connman_network *network,
1058 const char *file, int line, const char *caller)
1060 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
1061 network->refcount - 1, file, line, caller);
1063 if (__sync_fetch_and_sub(&network->refcount, 1) != 1)
1066 network_list = g_slist_remove(network_list, network);
1068 network_destruct(network);
1071 const char *__connman_network_get_type(struct connman_network *network)
1073 return type2string(network->type);
1077 * connman_network_get_type:
1078 * @network: network structure
1080 * Get type of network
1082 enum connman_network_type connman_network_get_type(
1083 struct connman_network *network)
1085 return network->type;
1089 * connman_network_get_identifier:
1090 * @network: network structure
1092 * Get identifier of network
1094 const char *connman_network_get_identifier(struct connman_network *network)
1096 return network->identifier;
1100 * connman_network_set_index:
1101 * @network: network structure
1102 * @index: index number
1104 * Set index number of network
1106 void connman_network_set_index(struct connman_network *network, int index)
1108 struct connman_service *service;
1109 struct connman_ipconfig *ipconfig;
1111 service = connman_service_lookup_from_network(network);
1115 ipconfig = __connman_service_get_ip4config(service);
1117 __connman_ipconfig_set_index(ipconfig, index);
1119 DBG("index %d service %p ip4config %p", network->index,
1123 ipconfig = __connman_service_get_ip6config(service);
1125 __connman_ipconfig_set_index(ipconfig, index);
1127 DBG("index %d service %p ip6config %p", network->index,
1132 network->index = index;
1136 * connman_network_get_index:
1137 * @network: network structure
1139 * Get index number of network
1141 int connman_network_get_index(struct connman_network *network)
1143 return network->index;
1147 * connman_network_set_group:
1148 * @network: network structure
1149 * @group: group name
1151 * Set group name for automatic clustering
1153 void connman_network_set_group(struct connman_network *network,
1156 switch (network->type) {
1157 case CONNMAN_NETWORK_TYPE_UNKNOWN:
1158 case CONNMAN_NETWORK_TYPE_VENDOR:
1160 case CONNMAN_NETWORK_TYPE_ETHERNET:
1161 case CONNMAN_NETWORK_TYPE_GADGET:
1162 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
1163 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
1164 case CONNMAN_NETWORK_TYPE_CELLULAR:
1165 case CONNMAN_NETWORK_TYPE_WIFI:
1169 if (g_strcmp0(network->group, group) == 0) {
1171 __connman_service_update_from_network(network);
1175 if (network->group) {
1176 __connman_service_remove_from_network(network);
1178 g_free(network->group);
1181 network->group = g_strdup(group);
1184 network_probe(network);
1188 * connman_network_get_group:
1189 * @network: network structure
1191 * Get group name for automatic clustering
1193 const char *connman_network_get_group(struct connman_network *network)
1195 return network->group;
1198 const char *__connman_network_get_ident(struct connman_network *network)
1200 if (!network->device)
1203 return connman_device_get_ident(network->device);
1206 bool __connman_network_get_weakness(struct connman_network *network)
1208 switch (network->type) {
1209 case CONNMAN_NETWORK_TYPE_UNKNOWN:
1210 case CONNMAN_NETWORK_TYPE_VENDOR:
1211 case CONNMAN_NETWORK_TYPE_ETHERNET:
1212 case CONNMAN_NETWORK_TYPE_GADGET:
1213 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
1214 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
1215 case CONNMAN_NETWORK_TYPE_CELLULAR:
1217 case CONNMAN_NETWORK_TYPE_WIFI:
1218 if (network->strength > 0 && network->strength < 20)
1226 #if defined TIZEN_EXT
1227 void connman_network_set_connecting(struct connman_network *network)
1229 DBG("set network connecting true");
1230 network->connecting = TRUE;
1235 bool connman_network_get_connecting(struct connman_network *network)
1237 return network->connecting;
1241 * connman_network_set_available:
1242 * @network: network structure
1243 * @available: availability state
1245 * Change availability state of network (in range)
1247 int connman_network_set_available(struct connman_network *network,
1250 #if !defined TIZEN_EXT
1251 DBG("network %p available %d", network, available);
1254 if (network->available == available)
1257 network->available = available;
1263 * connman_network_get_available:
1264 * @network: network structure
1266 * Get network available setting
1268 bool connman_network_get_available(struct connman_network *network)
1270 return network->available;
1273 #if defined TIZEN_EXT
1274 void connman_network_clear_associating(struct connman_network *network)
1276 struct connman_service *service;
1277 enum connman_service_state state;
1279 DBG("network %p", network);
1281 network->connecting = FALSE;
1282 network->associating = FALSE;
1284 service = connman_service_lookup_from_network(network);
1288 state = __connman_service_ipconfig_get_state(service,
1289 CONNMAN_IPCONFIG_TYPE_IPV4);
1290 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1291 state != CONNMAN_SERVICE_STATE_FAILURE)
1292 __connman_service_ipconfig_indicate_state(service,
1293 CONNMAN_SERVICE_STATE_DISCONNECT,
1294 CONNMAN_IPCONFIG_TYPE_IPV4);
1296 state = __connman_service_ipconfig_get_state(service,
1297 CONNMAN_IPCONFIG_TYPE_IPV6);
1298 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1299 state != CONNMAN_SERVICE_STATE_FAILURE)
1300 __connman_service_ipconfig_indicate_state(service,
1301 CONNMAN_SERVICE_STATE_DISCONNECT,
1302 CONNMAN_IPCONFIG_TYPE_IPV6);
1304 __connman_service_ipconfig_indicate_state(service,
1305 CONNMAN_SERVICE_STATE_IDLE,
1306 CONNMAN_IPCONFIG_TYPE_IPV4);
1308 __connman_service_ipconfig_indicate_state(service,
1309 CONNMAN_SERVICE_STATE_IDLE,
1310 CONNMAN_IPCONFIG_TYPE_IPV6);
1313 static gboolean __connman_network_clear_associating_delayed(gpointer user_data)
1316 gboolean found = FALSE;
1317 enum connman_service_state state_ipv4;
1318 enum connman_service_state state_ipv6;
1319 struct connman_service *service;
1320 struct connman_network *network = (struct connman_network *)user_data;
1322 for (list = network_list; list != NULL; list = list->next) {
1323 struct connman_network *item = list->data;
1325 if (item == network) {
1334 DBG("network %p name %s", network, network->name);
1335 service = connman_service_lookup_from_network(network);
1337 state_ipv4 = __connman_service_ipconfig_get_state(service,
1338 CONNMAN_IPCONFIG_TYPE_IPV4);
1339 state_ipv6 = __connman_service_ipconfig_get_state(service,
1340 CONNMAN_IPCONFIG_TYPE_IPV6);
1342 DBG("service %p state %d/%d", service, state_ipv4, state_ipv6);
1344 if (network->associating == FALSE &&
1345 state_ipv4 == CONNMAN_SERVICE_STATE_ASSOCIATION &&
1346 state_ipv6 == CONNMAN_SERVICE_STATE_ASSOCIATION) {
1347 __connman_service_ipconfig_indicate_state(service,
1348 CONNMAN_SERVICE_STATE_IDLE,
1349 CONNMAN_IPCONFIG_TYPE_IPV4);
1350 __connman_service_ipconfig_indicate_state(service,
1351 CONNMAN_SERVICE_STATE_IDLE,
1352 CONNMAN_IPCONFIG_TYPE_IPV6);
1354 if (network->associating == FALSE) {
1355 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
1356 enum connman_ipconfig_method ipv4_method, ipv6_method;
1358 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1359 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
1360 ipconfig_ipv6 = __connman_service_get_ip4config(service);
1361 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
1363 if((ipv4_method == CONNMAN_IPCONFIG_METHOD_UNKNOWN || ipv4_method == CONNMAN_IPCONFIG_METHOD_OFF) &&
1364 (state_ipv6 == CONNMAN_SERVICE_STATE_ASSOCIATION))
1365 __connman_service_ipconfig_indicate_state(service,
1366 CONNMAN_SERVICE_STATE_IDLE,
1367 CONNMAN_IPCONFIG_TYPE_IPV6);
1368 if((ipv6_method == CONNMAN_IPCONFIG_METHOD_UNKNOWN || ipv6_method == CONNMAN_IPCONFIG_METHOD_OFF) &&
1369 (state_ipv4 == CONNMAN_SERVICE_STATE_ASSOCIATION))
1370 __connman_service_ipconfig_indicate_state(service,
1371 CONNMAN_SERVICE_STATE_IDLE,
1372 CONNMAN_IPCONFIG_TYPE_IPV4);
1381 * connman_network_set_associating:
1382 * @network: network structure
1383 * @associating: associating state
1385 * Change associating state of network
1387 int connman_network_set_associating(struct connman_network *network,
1390 DBG("network %p associating %d", network, associating);
1392 if (network->associating == associating)
1395 network->associating = associating;
1398 struct connman_service *service;
1400 service = connman_service_lookup_from_network(network);
1401 __connman_service_ipconfig_indicate_state(service,
1402 CONNMAN_SERVICE_STATE_ASSOCIATION,
1403 CONNMAN_IPCONFIG_TYPE_IPV4);
1404 __connman_service_ipconfig_indicate_state(service,
1405 CONNMAN_SERVICE_STATE_ASSOCIATION,
1406 CONNMAN_IPCONFIG_TYPE_IPV6);
1409 #if defined TIZEN_EXT
1410 if (associating == FALSE &&
1411 connman_network_get_bool(network, "WiFi.UseWPS") == FALSE)
1412 g_timeout_add_seconds(1,
1413 __connman_network_clear_associating_delayed,
1420 static void set_associate_error(struct connman_network *network)
1422 struct connman_service *service;
1424 service = connman_service_lookup_from_network(network);
1426 #if defined TIZEN_EXT
1427 __connman_service_indicate_error(service,
1428 CONNMAN_SERVICE_ERROR_AUTH_FAILED);
1430 __connman_service_indicate_error(service,
1431 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1435 static void set_configure_error(struct connman_network *network)
1437 struct connman_service *service;
1439 service = connman_service_lookup_from_network(network);
1441 __connman_service_indicate_error(service,
1442 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1445 static void set_invalid_key_error(struct connman_network *network)
1447 struct connman_service *service;
1449 service = connman_service_lookup_from_network(network);
1451 #if defined TIZEN_EXT
1453 __connman_service_set_favorite(service, false);
1455 __connman_service_indicate_error(service,
1456 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1459 static void set_connect_error(struct connman_network *network)
1461 struct connman_service *service;
1463 service = connman_service_lookup_from_network(network);
1465 __connman_service_indicate_error(service,
1466 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1469 static void set_blocked_error(struct connman_network *network)
1471 struct connman_service *service;
1473 service = connman_service_lookup_from_network(network);
1475 __connman_service_indicate_error(service,
1476 CONNMAN_SERVICE_ERROR_BLOCKED);
1480 #if defined TIZEN_EXT
1481 static void set_dhcp_error(struct connman_network *network)
1483 struct connman_service *service;
1485 if (network->associating != FALSE)
1486 network->associating = FALSE;
1488 service = connman_service_lookup_from_network(network);
1490 __connman_service_indicate_error(service,
1491 CONNMAN_SERVICE_ERROR_DHCP_FAILED);
1495 void connman_network_set_ipv4_method(struct connman_network *network,
1496 enum connman_ipconfig_method method)
1498 struct connman_service *service;
1499 struct connman_ipconfig *ipconfig;
1501 service = connman_service_lookup_from_network(network);
1505 ipconfig = __connman_service_get_ip4config(service);
1509 __connman_ipconfig_set_method(ipconfig, method);
1512 void connman_network_set_ipv6_method(struct connman_network *network,
1513 enum connman_ipconfig_method method)
1515 struct connman_service *service;
1516 struct connman_ipconfig *ipconfig;
1518 service = connman_service_lookup_from_network(network);
1522 ipconfig = __connman_service_get_ip6config(service);
1526 __connman_ipconfig_set_method(ipconfig, method);
1529 void connman_network_set_error(struct connman_network *network,
1530 enum connman_network_error error)
1532 DBG("network %p error %d", network, error);
1535 case CONNMAN_NETWORK_ERROR_UNKNOWN:
1537 case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
1538 set_associate_error(network);
1540 case CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL:
1541 set_configure_error(network);
1543 case CONNMAN_NETWORK_ERROR_INVALID_KEY:
1544 set_invalid_key_error(network);
1546 case CONNMAN_NETWORK_ERROR_CONNECT_FAIL:
1547 set_connect_error(network);
1549 #if defined TIZEN_EXT
1550 case CONNMAN_NETWORK_ERROR_DHCP_FAIL:
1551 set_dhcp_error(network);
1555 case CONNMAN_NETWORK_ERROR_BLOCKED:
1556 set_blocked_error(network);
1561 __connman_network_disconnect(network);
1565 * connman_network_set_connected:
1566 * @network: network structure
1567 * @connected: connected state
1569 * Change connected state of network
1571 int connman_network_set_connected(struct connman_network *network,
1574 DBG("network %p connected %d/%d connecting %d associating %d",
1575 network, network->connected, connected, network->connecting,
1576 network->associating);
1578 if ((network->connecting || network->associating) &&
1580 connman_network_set_error(network,
1581 CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
1585 if (network->connected == connected)
1589 set_disconnected(network);
1591 set_connected(network);
1597 * connman_network_get_connected:
1598 * @network: network structure
1600 * Get network connection status
1602 bool connman_network_get_connected(struct connman_network *network)
1604 return network->connected;
1608 * connman_network_get_associating:
1609 * @network: network structure
1611 * Get network associating status
1613 bool connman_network_get_associating(struct connman_network *network)
1615 return network->associating;
1618 void connman_network_clear_hidden(void *user_data)
1623 DBG("user_data %p", user_data);
1626 * Hidden service does not have a connect timeout so
1627 * we do not need to remove it. We can just return
1628 * error to the caller telling that we could not find
1629 * any network that we could connect to.
1631 connman_dbus_reply_pending(user_data, EIO, NULL);
1634 int connman_network_connect_hidden(struct connman_network *network,
1635 char *identity, char *passphrase, void *user_data)
1638 struct connman_service *service;
1640 service = connman_service_lookup_from_network(network);
1642 DBG("network %p service %p user_data %p", network, service, user_data);
1648 __connman_service_set_agent_identity(service, identity);
1651 err = __connman_service_set_passphrase(service, passphrase);
1653 if (err == -ENOKEY) {
1654 __connman_service_indicate_error(service,
1655 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1658 __connman_service_set_hidden(service);
1659 __connman_service_set_hidden_data(service, user_data);
1660 return __connman_service_connect(service,
1661 CONNMAN_SERVICE_CONNECT_REASON_USER);
1665 __connman_service_return_error(service, -err, user_data);
1670 * __connman_network_connect:
1671 * @network: network structure
1675 int __connman_network_connect(struct connman_network *network)
1679 DBG("network %p", network);
1681 if (network->connected)
1684 if (network->connecting || network->associating)
1687 if (!network->driver)
1690 if (!network->driver->connect)
1693 if (!network->device)
1696 network->connecting = true;
1698 #if defined TIZEN_EXT
1699 if (network->type != CONNMAN_NETWORK_TYPE_CELLULAR)
1701 __connman_device_disconnect(network->device);
1702 #if defined TIZEN_EXT
1703 DBG("ConnMan, Connect Request [%s]", network->name);
1705 err = network->driver->connect(network);
1707 if (err == -EINPROGRESS) {
1708 #if defined TIZEN_EXT
1709 if (network->type != CONNMAN_NETWORK_TYPE_CELLULAR)
1711 connman_network_set_associating(network, true);
1713 network->connecting = false;
1718 set_connected(network);
1724 * __connman_network_disconnect:
1725 * @network: network structure
1727 * Disconnect network
1729 int __connman_network_disconnect(struct connman_network *network)
1733 DBG("network %p", network);
1735 if (!network->connected && !network->connecting &&
1736 !network->associating)
1739 if (!network->driver)
1742 network->connecting = false;
1743 #if defined TIZEN_EXT
1744 DBG("ConnMan, Disconnect request");
1746 if (network->driver->disconnect)
1747 err = network->driver->disconnect(network);
1749 if (err != -EINPROGRESS)
1750 set_disconnected(network);
1755 int __connman_network_clear_ipconfig(struct connman_network *network,
1756 struct connman_ipconfig *ipconfig)
1758 struct connman_service *service;
1759 struct connman_ipconfig *ipconfig_ipv4;
1760 enum connman_ipconfig_method method;
1761 enum connman_ipconfig_type type;
1763 service = connman_service_lookup_from_network(network);
1767 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1768 method = __connman_ipconfig_get_method(ipconfig);
1769 type = __connman_ipconfig_get_config_type(ipconfig);
1772 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1773 case CONNMAN_IPCONFIG_METHOD_OFF:
1774 case CONNMAN_IPCONFIG_METHOD_FIXED:
1776 case CONNMAN_IPCONFIG_METHOD_AUTO:
1777 release_dhcpv6(network);
1779 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1780 __connman_ipconfig_address_remove(ipconfig);
1782 case CONNMAN_IPCONFIG_METHOD_DHCP:
1783 __connman_dhcp_stop(ipconfig_ipv4);
1787 if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
1788 __connman_service_ipconfig_indicate_state(service,
1789 CONNMAN_SERVICE_STATE_CONFIGURATION,
1790 CONNMAN_IPCONFIG_TYPE_IPV6);
1791 else if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
1792 __connman_service_ipconfig_indicate_state(service,
1793 CONNMAN_SERVICE_STATE_CONFIGURATION,
1794 CONNMAN_IPCONFIG_TYPE_IPV4);
1799 #if defined TIZEN_EXT
1800 void __connman_network_set_auto_ipv6_gateway(char *gateway, void *user_data)
1804 struct connman_network *network = user_data;
1805 struct connman_service *service;
1806 struct connman_ipconfig *ipconfig = NULL;
1808 service = connman_service_lookup_from_network(network);
1809 if (service == NULL)
1812 ipconfig = __connman_service_get_ipconfig(service, AF_INET6);
1813 if (ipconfig == NULL)
1816 __connman_ipconfig_set_gateway(ipconfig, gateway);
1822 int __connman_network_enable_ipconfig(struct connman_network *network,
1823 struct connman_ipconfig *ipconfig)
1826 enum connman_ipconfig_type type;
1827 enum connman_ipconfig_method method;
1828 #if defined TIZEN_EXT
1829 struct connman_service *service;
1832 if (!network || !ipconfig)
1835 type = __connman_ipconfig_get_config_type(ipconfig);
1838 case CONNMAN_IPCONFIG_TYPE_UNKNOWN:
1839 case CONNMAN_IPCONFIG_TYPE_ALL:
1842 case CONNMAN_IPCONFIG_TYPE_IPV6:
1843 #if !defined TIZEN_EXT
1844 set_configuration(network, type);
1847 method = __connman_ipconfig_get_method(ipconfig);
1849 DBG("ipv6 ipconfig method %d", method);
1852 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1855 case CONNMAN_IPCONFIG_METHOD_OFF:
1856 __connman_ipconfig_disable_ipv6(ipconfig);
1859 case CONNMAN_IPCONFIG_METHOD_AUTO:
1860 #if defined TIZEN_EXT
1861 service = connman_service_lookup_from_network(network);
1863 if(network->type == CONNMAN_NETWORK_TYPE_CELLULAR)
1864 __connman_service_ipconfig_indicate_state(service,
1865 CONNMAN_SERVICE_STATE_CONFIGURATION,
1866 CONNMAN_IPCONFIG_TYPE_IPV6);
1868 #if !defined TIZEN_EXT
1869 autoconf_ipv6_set(network);
1873 case CONNMAN_IPCONFIG_METHOD_FIXED:
1874 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1875 #if defined TIZEN_EXT
1876 set_configuration(network, type);
1878 r = manual_ipv6_set(network, ipconfig);
1881 case CONNMAN_IPCONFIG_METHOD_DHCP:
1888 case CONNMAN_IPCONFIG_TYPE_IPV4:
1889 set_configuration(network, type);
1891 method = __connman_ipconfig_get_method(ipconfig);
1893 DBG("ipv4 ipconfig method %d", method);
1896 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1897 case CONNMAN_IPCONFIG_METHOD_OFF:
1900 case CONNMAN_IPCONFIG_METHOD_AUTO:
1904 case CONNMAN_IPCONFIG_METHOD_FIXED:
1905 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1906 r = set_connected_manual(network);
1909 case CONNMAN_IPCONFIG_METHOD_DHCP:
1910 r = set_connected_dhcp(network);
1918 connman_network_set_error(network,
1919 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1924 int connman_network_set_ipaddress(struct connman_network *network,
1925 struct connman_ipaddress *ipaddress)
1927 struct connman_service *service;
1928 struct connman_ipconfig *ipconfig = NULL;
1930 DBG("network %p", network);
1932 service = connman_service_lookup_from_network(network);
1936 ipconfig = __connman_service_get_ipconfig(service, ipaddress->family);
1940 __connman_ipconfig_set_local(ipconfig, ipaddress->local);
1941 __connman_ipconfig_set_peer(ipconfig, ipaddress->peer);
1942 __connman_ipconfig_set_broadcast(ipconfig, ipaddress->broadcast);
1943 __connman_ipconfig_set_prefixlen(ipconfig, ipaddress->prefixlen);
1944 __connman_ipconfig_set_gateway(ipconfig, ipaddress->gateway);
1949 #if defined TIZEN_EXT
1951 * Description: Network client requires additional wifi specific info
1953 int connman_network_set_bssid(struct connman_network *network,
1954 const unsigned char *bssid)
1961 DBG("network %p bssid %02x:%02x:%02x:%02x:%02x:%02x", network,
1962 bssid[0], bssid[1], bssid[2],
1963 bssid[3], bssid[4], bssid[5]);
1965 for (;i < WIFI_BSSID_LEN_MAX;i++)
1966 network->wifi.bssid[i] = bssid[i];
1971 unsigned char *connman_network_get_bssid(struct connman_network *network)
1973 return (unsigned char *)network->wifi.bssid;
1976 int connman_network_set_maxrate(struct connman_network *network,
1977 unsigned int maxrate)
1979 #if !defined TIZEN_EXT
1980 DBG("network %p maxrate %d", network, maxrate);
1983 network->wifi.maxrate = maxrate;
1988 unsigned int connman_network_get_maxrate(struct connman_network *network)
1990 return network->wifi.maxrate;
1993 int connman_network_set_enc_mode(struct connman_network *network,
1994 const char *encryption_mode)
1996 if (encryption_mode == NULL)
1999 DBG("network %p encryption mode %s", network, encryption_mode);
2001 g_strlcpy(network->wifi.encryption_mode, encryption_mode,
2002 WIFI_ENCYPTION_MODE_LEN_MAX);
2007 const char *connman_network_get_enc_mode(struct connman_network *network)
2009 return (const char *)network->wifi.encryption_mode;
2012 int connman_network_set_rsn_mode(struct connman_network *network,
2015 network->wifi.rsn_mode = rsn_mode;
2020 int connman_network_set_proxy(struct connman_network *network,
2021 const char *proxies)
2023 struct connman_service *service;
2025 DBG("network %p proxies %s", network, proxies);
2027 service = connman_service_lookup_from_network(network);
2028 if (service == NULL)
2031 __connman_service_set_proxy(service, proxies);
2033 connman_service_set_proxy_method(service,
2034 CONNMAN_SERVICE_PROXY_METHOD_MANUAL);
2039 int connman_network_set_is_hs20AP(struct connman_network *network,
2040 unsigned int isHS20AP)
2045 network->wifi.isHS20AP = isHS20AP;
2050 unsigned int connman_network_get_is_hs20AP(struct connman_network *network)
2055 return network->wifi.isHS20AP;
2058 int connman_network_set_keymgmt(struct connman_network *network,
2059 unsigned int keymgmt)
2061 if (network == NULL)
2064 network->wifi.keymgmt = keymgmt;
2069 unsigned int connman_network_get_keymgmt(struct connman_network *network)
2071 if (network == NULL)
2074 return network->wifi.keymgmt;
2077 int connman_network_set_disconnect_reason(struct connman_network *network,
2080 if (network == NULL)
2083 network->wifi.disconnect_reason = reason_code;
2088 int connman_network_get_disconnect_reason(struct connman_network *network)
2090 if (network == NULL)
2093 return network->wifi.disconnect_reason;
2097 int connman_network_set_nameservers(struct connman_network *network,
2098 const char *nameservers)
2100 struct connman_service *service;
2101 char **nameservers_array;
2104 DBG("network %p nameservers %s", network, nameservers);
2106 service = connman_service_lookup_from_network(network);
2110 __connman_service_nameserver_clear(service);
2115 nameservers_array = g_strsplit(nameservers, " ", 0);
2117 for (i = 0; nameservers_array[i]; i++) {
2118 #if defined TIZEN_EXT
2119 __connman_service_nameserver_append(service,
2120 nameservers_array[i], false,
2121 CONNMAN_IPCONFIG_TYPE_ALL);
2123 __connman_service_nameserver_append(service,
2124 nameservers_array[i], false);
2128 g_strfreev(nameservers_array);
2133 int connman_network_set_domain(struct connman_network *network,
2136 struct connman_service *service;
2138 DBG("network %p domain %s", network, domain);
2140 service = connman_service_lookup_from_network(network);
2144 __connman_service_set_domainname(service, domain);
2150 * connman_network_set_name:
2151 * @network: network structure
2154 * Set display name value for network
2156 int connman_network_set_name(struct connman_network *network,
2159 DBG("network %p name %s", network, name);
2161 g_free(network->name);
2162 network->name = g_strdup(name);
2168 * connman_network_set_strength:
2169 * @network: network structure
2170 * @strength: strength value
2172 * Set signal strength value for network
2175 int connman_network_set_strength(struct connman_network *network,
2178 #if !defined TIZEN_EXT
2179 DBG("network %p strengh %d", network, strength);
2182 network->strength = strength;
2187 uint8_t connman_network_get_strength(struct connman_network *network)
2189 return network->strength;
2192 int connman_network_set_frequency(struct connman_network *network,
2195 #if !defined TIZEN_EXT
2196 DBG("network %p frequency %d", network, frequency);
2199 network->frequency = frequency;
2204 uint16_t connman_network_get_frequency(struct connman_network *network)
2206 return network->frequency;
2209 int connman_network_set_wifi_channel(struct connman_network *network,
2212 DBG("network %p wifi channel %d", network, channel);
2214 network->wifi.channel = channel;
2219 uint16_t connman_network_get_wifi_channel(struct connman_network *network)
2221 return network->wifi.channel;
2225 * connman_network_set_string:
2226 * @network: network structure
2227 * @key: unique identifier
2228 * @value: string value
2230 * Set string value for specific key
2232 int connman_network_set_string(struct connman_network *network,
2233 const char *key, const char *value)
2235 #if !defined TIZEN_EXT
2236 DBG("network %p key %s value %s", network, key, value);
2239 if (g_strcmp0(key, "Name") == 0)
2240 return connman_network_set_name(network, value);
2242 if (g_str_equal(key, "Path")) {
2243 g_free(network->path);
2244 network->path = g_strdup(value);
2245 } else if (g_str_equal(key, "Node")) {
2246 g_free(network->node);
2247 network->node = g_strdup(value);
2248 } else if (g_str_equal(key, "WiFi.Mode")) {
2249 g_free(network->wifi.mode);
2250 network->wifi.mode = g_strdup(value);
2251 } else if (g_str_equal(key, "WiFi.Security")) {
2252 g_free(network->wifi.security);
2253 network->wifi.security = g_strdup(value);
2254 } else if (g_str_equal(key, "WiFi.Passphrase")) {
2255 #if defined TIZEN_EXT
2256 DBG("ConnMan, %p key %s", network, key);
2258 g_free(network->wifi.passphrase);
2259 network->wifi.passphrase = g_strdup(value);
2260 } else if (g_str_equal(key, "WiFi.EAP")) {
2261 g_free(network->wifi.eap);
2262 network->wifi.eap = g_strdup(value);
2263 } else if (g_str_equal(key, "WiFi.Identity")) {
2264 g_free(network->wifi.identity);
2265 network->wifi.identity = g_strdup(value);
2266 } else if (g_str_equal(key, "WiFi.AgentIdentity")) {
2267 g_free(network->wifi.agent_identity);
2268 network->wifi.agent_identity = g_strdup(value);
2269 } else if (g_str_equal(key, "WiFi.CACertFile")) {
2270 g_free(network->wifi.ca_cert_path);
2271 network->wifi.ca_cert_path = g_strdup(value);
2272 } else if (g_str_equal(key, "WiFi.ClientCertFile")) {
2273 g_free(network->wifi.client_cert_path);
2274 network->wifi.client_cert_path = g_strdup(value);
2275 } else if (g_str_equal(key, "WiFi.PrivateKeyFile")) {
2276 g_free(network->wifi.private_key_path);
2277 network->wifi.private_key_path = g_strdup(value);
2278 } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase")) {
2279 g_free(network->wifi.private_key_passphrase);
2280 network->wifi.private_key_passphrase = g_strdup(value);
2281 } else if (g_str_equal(key, "WiFi.Phase2")) {
2282 g_free(network->wifi.phase2_auth);
2283 network->wifi.phase2_auth = g_strdup(value);
2284 } else if (g_str_equal(key, "WiFi.PinWPS")) {
2285 g_free(network->wifi.pin_wps);
2286 network->wifi.pin_wps = g_strdup(value);
2295 * connman_network_get_string:
2296 * @network: network structure
2297 * @key: unique identifier
2299 * Get string value for specific key
2301 const char *connman_network_get_string(struct connman_network *network,
2304 #if !defined TIZEN_EXT
2305 DBG("network %p key %s", network, key);
2308 if (g_str_equal(key, "Path"))
2309 return network->path;
2310 else if (g_str_equal(key, "Name"))
2311 return network->name;
2312 else if (g_str_equal(key, "Node"))
2313 return network->node;
2314 else if (g_str_equal(key, "WiFi.Mode"))
2315 return network->wifi.mode;
2316 else if (g_str_equal(key, "WiFi.Security"))
2317 #if defined TIZEN_EXT
2318 if (network->wifi.rsn_mode != true ||
2319 g_str_equal(network->wifi.security, "ieee8021x"))
2320 return network->wifi.security;
2324 return network->wifi.security;
2326 else if (g_str_equal(key, "WiFi.Passphrase"))
2327 return network->wifi.passphrase;
2328 else if (g_str_equal(key, "WiFi.EAP"))
2329 return network->wifi.eap;
2330 else if (g_str_equal(key, "WiFi.Identity"))
2331 return network->wifi.identity;
2332 else if (g_str_equal(key, "WiFi.AgentIdentity"))
2333 return network->wifi.agent_identity;
2334 else if (g_str_equal(key, "WiFi.CACertFile"))
2335 return network->wifi.ca_cert_path;
2336 else if (g_str_equal(key, "WiFi.ClientCertFile"))
2337 return network->wifi.client_cert_path;
2338 else if (g_str_equal(key, "WiFi.PrivateKeyFile"))
2339 return network->wifi.private_key_path;
2340 else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase"))
2341 return network->wifi.private_key_passphrase;
2342 else if (g_str_equal(key, "WiFi.Phase2"))
2343 return network->wifi.phase2_auth;
2344 else if (g_str_equal(key, "WiFi.PinWPS"))
2345 return network->wifi.pin_wps;
2351 * connman_network_set_bool:
2352 * @network: network structure
2353 * @key: unique identifier
2354 * @value: boolean value
2356 * Set boolean value for specific key
2358 int connman_network_set_bool(struct connman_network *network,
2359 const char *key, bool value)
2361 #if !defined TIZEN_EXT
2362 DBG("network %p key %s value %d", network, key, value);
2365 if (g_strcmp0(key, "Roaming") == 0)
2366 network->roaming = value;
2367 else if (g_strcmp0(key, "WiFi.WPS") == 0)
2368 network->wifi.wps = value;
2369 else if (g_strcmp0(key, "WiFi.UseWPS") == 0)
2370 network->wifi.use_wps = value;
2371 #if defined TIZEN_EXT
2372 else if (g_strcmp0(key, "DefaultInternet") == 0)
2373 network->default_internet = value;
2380 * connman_network_get_bool:
2381 * @network: network structure
2382 * @key: unique identifier
2384 * Get boolean value for specific key
2386 bool connman_network_get_bool(struct connman_network *network,
2389 #if !defined TIZEN_EXT
2390 DBG("network %p key %s", network, key);
2393 if (g_str_equal(key, "Roaming"))
2394 return network->roaming;
2395 else if (g_str_equal(key, "WiFi.WPS"))
2396 return network->wifi.wps;
2397 else if (g_str_equal(key, "WiFi.UseWPS"))
2398 return network->wifi.use_wps;
2399 #if defined TIZEN_EXT
2400 else if (g_str_equal(key, "DefaultInternet"))
2401 return network->default_internet;
2408 * connman_network_set_blob:
2409 * @network: network structure
2410 * @key: unique identifier
2414 * Set binary blob value for specific key
2416 int connman_network_set_blob(struct connman_network *network,
2417 const char *key, const void *data, unsigned int size)
2419 #if !defined TIZEN_EXT
2420 DBG("network %p key %s size %d", network, key, size);
2423 if (g_str_equal(key, "WiFi.SSID")) {
2424 g_free(network->wifi.ssid);
2425 network->wifi.ssid = g_try_malloc(size);
2426 if (network->wifi.ssid) {
2427 memcpy(network->wifi.ssid, data, size);
2428 network->wifi.ssid_len = size;
2430 network->wifi.ssid_len = 0;
2431 #if defined TIZEN_EXT
2432 } else if (g_str_equal(key, "WiFi.Vsie")){
2433 g_free(network->wifi.wifi_vsie);
2434 network->wifi.wifi_vsie = g_try_malloc(size);
2435 if (network->wifi.wifi_vsie) {
2436 memcpy(network->wifi.wifi_vsie, data, size);
2437 network->wifi.wifi_vsie_len = size;
2439 network->wifi.wifi_vsie_len = 0;
2449 * connman_network_get_blob:
2450 * @network: network structure
2451 * @key: unique identifier
2452 * @size: pointer to blob size
2454 * Get binary blob value for specific key
2456 const void *connman_network_get_blob(struct connman_network *network,
2457 const char *key, unsigned int *size)
2459 DBG("network %p key %s", network, key);
2461 if (g_str_equal(key, "WiFi.SSID")) {
2463 *size = network->wifi.ssid_len;
2464 return network->wifi.ssid;
2467 #if defined TIZEN_EXT
2468 if (g_str_equal(key, "WiFi.Vsie")) {
2470 *size = network->wifi.wifi_vsie_len;
2471 DBG("network %p key %s size=%d", network, key, *size);
2474 return network->wifi.wifi_vsie;
2481 void __connman_network_set_device(struct connman_network *network,
2482 struct connman_device *device)
2484 if (network->device == device)
2487 if (network->device)
2488 network_remove(network);
2490 network->device = device;
2492 if (network->device)
2493 network_probe(network);
2497 * connman_network_get_device:
2498 * @network: network structure
2500 * Get parent device of network
2502 struct connman_device *connman_network_get_device(struct connman_network *network)
2504 return network->device;
2508 * connman_network_get_data:
2509 * @network: network structure
2511 * Get private network data pointer
2513 void *connman_network_get_data(struct connman_network *network)
2515 return network->driver_data;
2519 * connman_network_set_data:
2520 * @network: network structure
2521 * @data: data pointer
2523 * Set private network data pointer
2525 void connman_network_set_data(struct connman_network *network, void *data)
2527 network->driver_data = data;
2530 void connman_network_update(struct connman_network *network)
2532 switch (network->type) {
2533 case CONNMAN_NETWORK_TYPE_UNKNOWN:
2534 case CONNMAN_NETWORK_TYPE_VENDOR:
2536 case CONNMAN_NETWORK_TYPE_ETHERNET:
2537 case CONNMAN_NETWORK_TYPE_GADGET:
2538 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
2539 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
2540 case CONNMAN_NETWORK_TYPE_CELLULAR:
2541 case CONNMAN_NETWORK_TYPE_WIFI:
2546 __connman_service_update_from_network(network);
2549 int __connman_network_init(void)
2556 void __connman_network_cleanup(void)