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];
104 static const char *type2string(enum connman_network_type type)
107 case CONNMAN_NETWORK_TYPE_UNKNOWN:
108 case CONNMAN_NETWORK_TYPE_VENDOR:
110 case CONNMAN_NETWORK_TYPE_ETHERNET:
112 case CONNMAN_NETWORK_TYPE_GADGET:
114 case CONNMAN_NETWORK_TYPE_WIFI:
116 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
117 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
119 case CONNMAN_NETWORK_TYPE_CELLULAR:
126 static bool match_driver(struct connman_network *network,
127 struct connman_network_driver *driver)
129 if (network->type == driver->type ||
130 driver->type == CONNMAN_NETWORK_TYPE_UNKNOWN)
136 static void set_configuration(struct connman_network *network,
137 enum connman_ipconfig_type type)
139 struct connman_service *service;
141 DBG("network %p", network);
143 if (!network->device)
146 __connman_device_set_network(network->device, network);
148 connman_device_set_disconnected(network->device, false);
150 service = connman_service_lookup_from_network(network);
151 __connman_service_ipconfig_indicate_state(service,
152 CONNMAN_SERVICE_STATE_CONFIGURATION,
156 static void dhcp_success(struct connman_network *network)
158 struct connman_service *service;
159 struct connman_ipconfig *ipconfig_ipv4;
162 service = connman_service_lookup_from_network(network);
166 connman_network_set_associating(network, false);
168 network->connecting = false;
170 ipconfig_ipv4 = __connman_service_get_ip4config(service);
172 DBG("lease acquired for ipconfig %p", ipconfig_ipv4);
177 err = __connman_ipconfig_address_add(ipconfig_ipv4);
181 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
188 connman_network_set_error(network,
189 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
192 static void dhcp_failure(struct connman_network *network)
194 struct connman_service *service;
195 struct connman_ipconfig *ipconfig_ipv4;
197 service = connman_service_lookup_from_network(network);
201 connman_network_set_associating(network, false);
202 network->connecting = false;
204 ipconfig_ipv4 = __connman_service_get_ip4config(service);
206 DBG("lease lost for ipconfig %p", ipconfig_ipv4);
211 __connman_ipconfig_address_remove(ipconfig_ipv4);
212 __connman_ipconfig_gateway_remove(ipconfig_ipv4);
215 static void dhcp_callback(struct connman_ipconfig *ipconfig,
216 struct connman_network *network,
217 bool success, gpointer data)
220 dhcp_success(network);
222 dhcp_failure(network);
225 static int set_connected_fixed(struct connman_network *network)
227 struct connman_service *service;
228 struct connman_ipconfig *ipconfig_ipv4;
233 service = connman_service_lookup_from_network(network);
235 ipconfig_ipv4 = __connman_service_get_ip4config(service);
237 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
239 network->connecting = false;
241 connman_network_set_associating(network, false);
243 err = __connman_ipconfig_address_add(ipconfig_ipv4);
247 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
254 connman_network_set_error(network,
255 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
260 static void set_connected_manual(struct connman_network *network)
262 struct connman_service *service;
263 struct connman_ipconfig *ipconfig;
266 DBG("network %p", network);
268 service = connman_service_lookup_from_network(network);
270 ipconfig = __connman_service_get_ip4config(service);
272 if (!__connman_ipconfig_get_local(ipconfig))
273 __connman_service_read_ip4config(service);
275 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
277 err = __connman_ipconfig_address_add(ipconfig);
281 err = __connman_ipconfig_gateway_add(ipconfig);
285 network->connecting = false;
287 connman_network_set_associating(network, false);
292 connman_network_set_error(network,
293 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
297 static int set_connected_dhcp(struct connman_network *network)
299 struct connman_service *service;
300 struct connman_ipconfig *ipconfig_ipv4;
303 DBG("network %p", network);
305 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
307 service = connman_service_lookup_from_network(network);
308 ipconfig_ipv4 = __connman_service_get_ip4config(service);
310 err = __connman_dhcp_start(ipconfig_ipv4, network,
311 dhcp_callback, NULL);
313 connman_error("Can not request DHCP lease");
320 static int manual_ipv6_set(struct connman_network *network,
321 struct connman_ipconfig *ipconfig_ipv6)
323 struct connman_service *service;
326 DBG("network %p ipv6 %p", network, ipconfig_ipv6);
328 service = connman_service_lookup_from_network(network);
332 if (!__connman_ipconfig_get_local(ipconfig_ipv6))
333 __connman_service_read_ip6config(service);
335 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
337 err = __connman_ipconfig_address_add(ipconfig_ipv6);
339 connman_network_set_error(network,
340 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
344 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
348 __connman_connection_gateway_activate(service,
349 CONNMAN_IPCONFIG_TYPE_IPV6);
351 __connman_device_set_network(network->device, network);
353 connman_device_set_disconnected(network->device, false);
355 network->connecting = false;
360 static void stop_dhcpv6(struct connman_network *network)
362 __connman_dhcpv6_stop(network);
365 static void dhcpv6_release_callback(struct connman_network *network,
366 enum __connman_dhcpv6_status status,
369 DBG("status %d", status);
371 stop_dhcpv6(network);
374 static void release_dhcpv6(struct connman_network *network)
376 __connman_dhcpv6_start_release(network, dhcpv6_release_callback);
377 stop_dhcpv6(network);
380 static void dhcpv6_info_callback(struct connman_network *network,
381 enum __connman_dhcpv6_status status,
384 DBG("status %d", status);
386 stop_dhcpv6(network);
389 static int dhcpv6_set_addresses(struct connman_network *network)
391 struct connman_service *service;
392 struct connman_ipconfig *ipconfig_ipv6;
395 service = connman_service_lookup_from_network(network);
399 connman_network_set_associating(network, false);
401 network->connecting = false;
403 ipconfig_ipv6 = __connman_service_get_ip6config(service);
404 err = __connman_ipconfig_address_add(ipconfig_ipv6);
408 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
415 connman_network_set_error(network,
416 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
420 static void autoconf_ipv6_set(struct connman_network *network);
421 static void dhcpv6_callback(struct connman_network *network,
422 enum __connman_dhcpv6_status status, gpointer data);
425 * Have a separate callback for renew so that we do not do autoconf
426 * in wrong phase as the dhcpv6_callback() is also called when doing
427 * DHCPv6 solicitation.
429 static void dhcpv6_renew_callback(struct connman_network *network,
430 enum __connman_dhcpv6_status status,
434 case CONNMAN_DHCPV6_STATUS_SUCCEED:
435 dhcpv6_callback(network, status, data);
437 case CONNMAN_DHCPV6_STATUS_FAIL:
438 case CONNMAN_DHCPV6_STATUS_RESTART:
439 stop_dhcpv6(network);
441 /* restart and do solicit again. */
442 autoconf_ipv6_set(network);
447 static void dhcpv6_callback(struct connman_network *network,
448 enum __connman_dhcpv6_status status, gpointer data)
450 DBG("status %d", status);
452 /* Start the renew process if necessary */
453 if (status == CONNMAN_DHCPV6_STATUS_SUCCEED) {
455 if (dhcpv6_set_addresses(network) < 0) {
456 stop_dhcpv6(network);
460 if (__connman_dhcpv6_start_renew(network,
461 dhcpv6_renew_callback) == -ETIMEDOUT)
462 dhcpv6_renew_callback(network,
463 CONNMAN_DHCPV6_STATUS_FAIL,
466 } else if (status == CONNMAN_DHCPV6_STATUS_RESTART) {
467 stop_dhcpv6(network);
468 autoconf_ipv6_set(network);
470 stop_dhcpv6(network);
473 static void check_dhcpv6(struct nd_router_advert *reply,
474 unsigned int length, void *user_data)
476 struct connman_network *network = user_data;
477 struct connman_service *service;
480 DBG("reply %p", reply);
484 * Router solicitation message seem to get lost easily so
485 * try to send it again.
487 if (network->router_solicit_count > 0) {
488 DBG("re-send router solicitation %d",
489 network->router_solicit_count);
490 network->router_solicit_count--;
491 __connman_inet_ipv6_send_rs(network->index, 1,
492 check_dhcpv6, network);
495 connman_network_unref(network);
499 network->router_solicit_count = 0;
502 * If we were disconnected while waiting router advertisement,
503 * we just quit and do not start DHCPv6
505 if (!network->connected) {
506 connman_network_unref(network);
510 prefixes = __connman_inet_ipv6_get_prefixes(reply, length);
513 * If IPv6 config is missing from service, then create it.
514 * The ipconfig might be missing if we got a rtnl message
515 * that disabled IPv6 config and thus removed it. This
516 * can happen if we are switching from one service to
517 * another in the same interface. The only way to get IPv6
518 * config back is to re-create it here.
520 service = connman_service_lookup_from_network(network);
522 connman_service_create_ip6config(service, network->index);
524 __connman_service_ipconfig_indicate_state(service,
525 CONNMAN_SERVICE_STATE_CONFIGURATION,
526 CONNMAN_IPCONFIG_TYPE_IPV6);
530 * We do stateful/stateless DHCPv6 if router advertisement says so.
532 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED)
533 __connman_dhcpv6_start(network, prefixes, dhcpv6_callback);
534 else if (reply->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
535 __connman_dhcpv6_start_info(network, dhcpv6_info_callback);
537 connman_network_unref(network);
540 static void receive_refresh_rs_reply(struct nd_router_advert *reply,
541 unsigned int length, void *user_data)
543 struct connman_network *network = user_data;
545 DBG("reply %p", reply);
549 * Router solicitation message seem to get lost easily so
550 * try to send it again.
552 if (network->router_solicit_refresh_count > 1) {
553 network->router_solicit_refresh_count--;
554 DBG("re-send router solicitation %d",
555 network->router_solicit_refresh_count);
556 __connman_inet_ipv6_send_rs(network->index,
558 receive_refresh_rs_reply,
564 /* RS refresh not in progress anymore */
565 network->router_solicit_refresh_count = 0;
567 connman_network_unref(network);
571 int __connman_network_refresh_rs_ipv6(struct connman_network *network,
576 DBG("network %p index %d", network, index);
578 /* Send only one RS for all RDNSS entries which are about to expire */
579 if (network->router_solicit_refresh_count > 0) {
580 DBG("RS refresh already started");
584 network->router_solicit_refresh_count = RS_REFRESH_COUNT;
586 connman_network_ref(network);
588 ret = __connman_inet_ipv6_send_rs(index, RS_REFRESH_TIMEOUT,
589 receive_refresh_rs_reply, network);
593 static void autoconf_ipv6_set(struct connman_network *network)
595 struct connman_service *service;
596 struct connman_ipconfig *ipconfig;
599 DBG("network %p", network);
601 if (network->router_solicit_count > 0) {
603 * The autoconfiguration is already pending and we have sent
604 * router solicitation messages and are now waiting answers.
605 * There is no need to continue any further.
607 DBG("autoconfiguration already started");
611 __connman_device_set_network(network->device, network);
613 connman_device_set_disconnected(network->device, false);
615 network->connecting = false;
617 service = connman_service_lookup_from_network(network);
621 ipconfig = __connman_service_get_ip6config(service);
625 __connman_ipconfig_address_remove(ipconfig);
627 index = __connman_ipconfig_get_index(ipconfig);
629 connman_network_ref(network);
631 /* Try to get stateless DHCPv6 information, RFC 3736 */
632 network->router_solicit_count = 3;
633 __connman_inet_ipv6_send_rs(index, 1, check_dhcpv6, network);
636 static void set_connected(struct connman_network *network)
638 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
639 enum connman_ipconfig_method ipv4_method, ipv6_method;
640 struct connman_service *service;
643 if (network->connected)
646 network->connected = true;
648 service = connman_service_lookup_from_network(network);
650 ipconfig_ipv4 = __connman_service_get_ip4config(service);
651 ipconfig_ipv6 = __connman_service_get_ip6config(service);
653 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
656 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
657 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
659 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
661 switch (ipv6_method) {
662 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
663 case CONNMAN_IPCONFIG_METHOD_OFF:
665 case CONNMAN_IPCONFIG_METHOD_DHCP:
666 case CONNMAN_IPCONFIG_METHOD_AUTO:
667 autoconf_ipv6_set(network);
669 case CONNMAN_IPCONFIG_METHOD_FIXED:
670 case CONNMAN_IPCONFIG_METHOD_MANUAL:
671 ret = manual_ipv6_set(network, ipconfig_ipv6);
673 connman_network_set_error(network,
674 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
680 switch (ipv4_method) {
681 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
682 case CONNMAN_IPCONFIG_METHOD_OFF:
683 case CONNMAN_IPCONFIG_METHOD_AUTO:
685 case CONNMAN_IPCONFIG_METHOD_FIXED:
686 if (set_connected_fixed(network) < 0) {
687 connman_network_set_error(network,
688 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
692 case CONNMAN_IPCONFIG_METHOD_MANUAL:
693 set_connected_manual(network);
695 case CONNMAN_IPCONFIG_METHOD_DHCP:
696 if (set_connected_dhcp(network) < 0) {
697 connman_network_set_error(network,
698 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
703 network->connecting = false;
705 connman_network_set_associating(network, false);
708 static void set_disconnected(struct connman_network *network)
710 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
711 enum connman_ipconfig_method ipv4_method, ipv6_method;
712 enum connman_service_state state;
713 struct connman_service *service;
715 service = connman_service_lookup_from_network(network);
717 ipconfig_ipv4 = __connman_service_get_ip4config(service);
718 ipconfig_ipv6 = __connman_service_get_ip6config(service);
720 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
723 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
724 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
726 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
729 * Resetting solicit count here will prevent the RS resend loop
730 * from sending packets in check_dhcpv6()
732 network->router_solicit_count = 0;
734 __connman_device_set_network(network->device, NULL);
736 if (network->connected) {
737 switch (ipv6_method) {
738 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
739 case CONNMAN_IPCONFIG_METHOD_OFF:
740 case CONNMAN_IPCONFIG_METHOD_FIXED:
741 case CONNMAN_IPCONFIG_METHOD_MANUAL:
743 case CONNMAN_IPCONFIG_METHOD_DHCP:
744 case CONNMAN_IPCONFIG_METHOD_AUTO:
745 release_dhcpv6(network);
749 switch (ipv4_method) {
750 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
751 case CONNMAN_IPCONFIG_METHOD_OFF:
752 case CONNMAN_IPCONFIG_METHOD_AUTO:
753 case CONNMAN_IPCONFIG_METHOD_FIXED:
754 case CONNMAN_IPCONFIG_METHOD_MANUAL:
756 case CONNMAN_IPCONFIG_METHOD_DHCP:
757 __connman_dhcp_stop(ipconfig_ipv4);
763 * We only set the disconnect state if we were not in idle
764 * or in failure. It does not make sense to go to disconnect
765 * state if we were not connected.
767 state = __connman_service_ipconfig_get_state(service,
768 CONNMAN_IPCONFIG_TYPE_IPV4);
769 if (state != CONNMAN_SERVICE_STATE_IDLE &&
770 state != CONNMAN_SERVICE_STATE_FAILURE)
771 __connman_service_ipconfig_indicate_state(service,
772 CONNMAN_SERVICE_STATE_DISCONNECT,
773 CONNMAN_IPCONFIG_TYPE_IPV4);
775 state = __connman_service_ipconfig_get_state(service,
776 CONNMAN_IPCONFIG_TYPE_IPV6);
777 if (state != CONNMAN_SERVICE_STATE_IDLE &&
778 state != CONNMAN_SERVICE_STATE_FAILURE)
779 __connman_service_ipconfig_indicate_state(service,
780 CONNMAN_SERVICE_STATE_DISCONNECT,
781 CONNMAN_IPCONFIG_TYPE_IPV6);
783 if (network->connected) {
784 __connman_connection_gateway_remove(service,
785 CONNMAN_IPCONFIG_TYPE_ALL);
787 __connman_ipconfig_address_unset(ipconfig_ipv4);
788 __connman_ipconfig_address_unset(ipconfig_ipv6);
791 * Special handling for IPv6 autoconfigured address.
792 * The simplest way to remove autoconfigured routes is to
793 * disable IPv6 temporarily so that kernel will do the cleanup
796 if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
797 __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
798 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
802 __connman_service_ipconfig_indicate_state(service,
803 CONNMAN_SERVICE_STATE_IDLE,
804 CONNMAN_IPCONFIG_TYPE_IPV4);
806 __connman_service_ipconfig_indicate_state(service,
807 CONNMAN_SERVICE_STATE_IDLE,
808 CONNMAN_IPCONFIG_TYPE_IPV6);
810 network->connecting = false;
811 network->connected = false;
813 connman_network_set_associating(network, false);
818 static int network_probe(struct connman_network *network)
821 struct connman_network_driver *driver = NULL;
823 DBG("network %p name %s", network, network->name);
828 for (list = driver_list; list; list = list->next) {
831 if (!match_driver(network, driver)) {
836 DBG("driver %p name %s", driver, driver->name);
838 if (driver->probe(network) == 0)
850 switch (network->type) {
851 case CONNMAN_NETWORK_TYPE_UNKNOWN:
852 case CONNMAN_NETWORK_TYPE_VENDOR:
854 case CONNMAN_NETWORK_TYPE_ETHERNET:
855 case CONNMAN_NETWORK_TYPE_GADGET:
856 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
857 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
858 case CONNMAN_NETWORK_TYPE_CELLULAR:
859 case CONNMAN_NETWORK_TYPE_WIFI:
860 network->driver = driver;
861 if (!__connman_service_create_from_network(network)) {
862 network->driver = NULL;
870 static void network_remove(struct connman_network *network)
872 DBG("network %p name %s", network, network->name);
874 if (!network->driver)
877 if (network->connected)
878 set_disconnected(network);
880 switch (network->type) {
881 case CONNMAN_NETWORK_TYPE_UNKNOWN:
882 case CONNMAN_NETWORK_TYPE_VENDOR:
884 case CONNMAN_NETWORK_TYPE_ETHERNET:
885 case CONNMAN_NETWORK_TYPE_GADGET:
886 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
887 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
888 case CONNMAN_NETWORK_TYPE_CELLULAR:
889 case CONNMAN_NETWORK_TYPE_WIFI:
890 if (network->group) {
891 __connman_service_remove_from_network(network);
893 g_free(network->group);
894 network->group = NULL;
899 if (network->driver->remove)
900 network->driver->remove(network);
902 network->driver = NULL;
905 static void network_change(struct connman_network *network)
907 DBG("network %p name %s", network, network->name);
909 if (!network->connected)
912 connman_device_set_disconnected(network->device, true);
914 if (network->driver && network->driver->disconnect) {
915 network->driver->disconnect(network);
919 network->connected = false;
922 static void probe_driver(struct connman_network_driver *driver)
926 DBG("driver %p name %s", driver, driver->name);
928 for (list = network_list; list; list = list->next) {
929 struct connman_network *network = list->data;
934 if (driver->type != network->type)
937 if (driver->probe(network) < 0)
940 network->driver = driver;
944 static void remove_driver(struct connman_network_driver *driver)
948 DBG("driver %p name %s", driver, driver->name);
950 for (list = network_list; list; list = list->next) {
951 struct connman_network *network = list->data;
953 if (network->driver == driver)
954 network_remove(network);
958 static gint compare_priority(gconstpointer a, gconstpointer b)
960 const struct connman_network_driver *driver1 = a;
961 const struct connman_network_driver *driver2 = b;
963 return driver2->priority - driver1->priority;
967 * connman_network_driver_register:
968 * @driver: network driver definition
970 * Register a new network driver
972 * Returns: %0 on success
974 int connman_network_driver_register(struct connman_network_driver *driver)
976 DBG("driver %p name %s", driver, driver->name);
978 driver_list = g_slist_insert_sorted(driver_list, driver,
981 probe_driver(driver);
987 * connman_network_driver_unregister:
988 * @driver: network driver definition
990 * Remove a previously registered network driver
992 void connman_network_driver_unregister(struct connman_network_driver *driver)
994 DBG("driver %p name %s", driver, driver->name);
996 driver_list = g_slist_remove(driver_list, driver);
998 remove_driver(driver);
1001 static void network_destruct(struct connman_network *network)
1003 DBG("network %p name %s", network, network->name);
1005 g_free(network->wifi.ssid);
1006 g_free(network->wifi.mode);
1007 g_free(network->wifi.security);
1008 g_free(network->wifi.passphrase);
1009 g_free(network->wifi.eap);
1010 g_free(network->wifi.identity);
1011 g_free(network->wifi.agent_identity);
1012 g_free(network->wifi.ca_cert_path);
1013 g_free(network->wifi.client_cert_path);
1014 g_free(network->wifi.private_key_path);
1015 g_free(network->wifi.private_key_passphrase);
1016 g_free(network->wifi.phase2_auth);
1017 g_free(network->wifi.pin_wps);
1019 g_free(network->path);
1020 g_free(network->group);
1021 g_free(network->node);
1022 g_free(network->name);
1023 g_free(network->identifier);
1025 network->device = NULL;
1031 * connman_network_create:
1032 * @identifier: network identifier (for example an unqiue name)
1034 * Allocate a new network and assign the #identifier to it.
1036 * Returns: a newly-allocated #connman_network structure
1038 struct connman_network *connman_network_create(const char *identifier,
1039 enum connman_network_type type)
1041 struct connman_network *network;
1044 DBG("identifier %s type %d", identifier, type);
1046 network = g_try_new0(struct connman_network, 1);
1050 DBG("network %p", network);
1052 network->refcount = 1;
1054 ident = g_strdup(identifier);
1061 network->type = type;
1062 network->identifier = ident;
1064 network_list = g_slist_prepend(network_list, network);
1070 * connman_network_ref:
1071 * @network: network structure
1073 * Increase reference counter of network
1075 struct connman_network *
1076 connman_network_ref_debug(struct connman_network *network,
1077 const char *file, int line, const char *caller)
1079 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
1080 network->refcount + 1, file, line, caller);
1082 __sync_fetch_and_add(&network->refcount, 1);
1088 * connman_network_unref:
1089 * @network: network structure
1091 * Decrease reference counter of network
1093 void connman_network_unref_debug(struct connman_network *network,
1094 const char *file, int line, const char *caller)
1096 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
1097 network->refcount - 1, file, line, caller);
1099 if (__sync_fetch_and_sub(&network->refcount, 1) != 1)
1102 network_list = g_slist_remove(network_list, network);
1104 network_destruct(network);
1107 const char *__connman_network_get_type(struct connman_network *network)
1109 return type2string(network->type);
1113 * connman_network_get_type:
1114 * @network: network structure
1116 * Get type of network
1118 enum connman_network_type connman_network_get_type(
1119 struct connman_network *network)
1121 return network->type;
1125 * connman_network_get_identifier:
1126 * @network: network structure
1128 * Get identifier of network
1130 const char *connman_network_get_identifier(struct connman_network *network)
1132 return network->identifier;
1136 * connman_network_set_index:
1137 * @network: network structure
1138 * @index: index number
1140 * Set index number of network
1142 void connman_network_set_index(struct connman_network *network, int index)
1144 struct connman_service *service;
1145 struct connman_ipconfig *ipconfig;
1147 service = connman_service_lookup_from_network(network);
1151 ipconfig = __connman_service_get_ip4config(service);
1155 /* If index changed, the index of ipconfig must be reset. */
1156 __connman_ipconfig_set_index(ipconfig, index);
1158 DBG("index %d service %p ip4config %p", network->index,
1161 network->index = index;
1165 * connman_network_get_index:
1166 * @network: network structure
1168 * Get index number of network
1170 int connman_network_get_index(struct connman_network *network)
1172 return network->index;
1176 * connman_network_set_group:
1177 * @network: network structure
1178 * @group: group name
1180 * Set group name for automatic clustering
1182 void connman_network_set_group(struct connman_network *network,
1185 switch (network->type) {
1186 case CONNMAN_NETWORK_TYPE_UNKNOWN:
1187 case CONNMAN_NETWORK_TYPE_VENDOR:
1189 case CONNMAN_NETWORK_TYPE_ETHERNET:
1190 case CONNMAN_NETWORK_TYPE_GADGET:
1191 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
1192 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
1193 case CONNMAN_NETWORK_TYPE_CELLULAR:
1194 case CONNMAN_NETWORK_TYPE_WIFI:
1198 if (g_strcmp0(network->group, group) == 0) {
1200 __connman_service_update_from_network(network);
1204 if (network->group) {
1205 __connman_service_remove_from_network(network);
1207 g_free(network->group);
1210 network->group = g_strdup(group);
1213 network_probe(network);
1217 * connman_network_get_group:
1218 * @network: network structure
1220 * Get group name for automatic clustering
1222 const char *connman_network_get_group(struct connman_network *network)
1224 return network->group;
1227 const char *__connman_network_get_ident(struct connman_network *network)
1229 if (!network->device)
1232 return connman_device_get_ident(network->device);
1235 bool __connman_network_get_weakness(struct connman_network *network)
1237 switch (network->type) {
1238 case CONNMAN_NETWORK_TYPE_UNKNOWN:
1239 case CONNMAN_NETWORK_TYPE_VENDOR:
1240 case CONNMAN_NETWORK_TYPE_ETHERNET:
1241 case CONNMAN_NETWORK_TYPE_GADGET:
1242 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
1243 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
1244 case CONNMAN_NETWORK_TYPE_CELLULAR:
1246 case CONNMAN_NETWORK_TYPE_WIFI:
1247 if (network->strength > 0 && network->strength < 20)
1255 bool connman_network_get_connecting(struct connman_network *network)
1257 return network->connecting;
1261 * connman_network_set_available:
1262 * @network: network structure
1263 * @available: availability state
1265 * Change availability state of network (in range)
1267 int connman_network_set_available(struct connman_network *network,
1270 DBG("network %p available %d", network, available);
1272 if (network->available == available)
1275 network->available = available;
1281 * connman_network_get_available:
1282 * @network: network structure
1284 * Get network available setting
1286 bool connman_network_get_available(struct connman_network *network)
1288 return network->available;
1292 * connman_network_set_associating:
1293 * @network: network structure
1294 * @associating: associating state
1296 * Change associating state of network
1298 int connman_network_set_associating(struct connman_network *network,
1301 DBG("network %p associating %d", network, associating);
1303 if (network->associating == associating)
1306 network->associating = associating;
1309 struct connman_service *service;
1311 service = connman_service_lookup_from_network(network);
1312 __connman_service_ipconfig_indicate_state(service,
1313 CONNMAN_SERVICE_STATE_ASSOCIATION,
1314 CONNMAN_IPCONFIG_TYPE_IPV4);
1315 __connman_service_ipconfig_indicate_state(service,
1316 CONNMAN_SERVICE_STATE_ASSOCIATION,
1317 CONNMAN_IPCONFIG_TYPE_IPV6);
1323 static void set_associate_error(struct connman_network *network)
1325 struct connman_service *service;
1327 service = connman_service_lookup_from_network(network);
1329 __connman_service_indicate_error(service,
1330 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1333 static void set_configure_error(struct connman_network *network)
1335 struct connman_service *service;
1337 service = connman_service_lookup_from_network(network);
1339 __connman_service_indicate_error(service,
1340 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1343 static void set_invalid_key_error(struct connman_network *network)
1345 struct connman_service *service;
1347 service = connman_service_lookup_from_network(network);
1349 __connman_service_indicate_error(service,
1350 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1353 static void set_connect_error(struct connman_network *network)
1355 struct connman_service *service;
1357 service = connman_service_lookup_from_network(network);
1359 __connman_service_indicate_error(service,
1360 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1363 void connman_network_set_ipv4_method(struct connman_network *network,
1364 enum connman_ipconfig_method method)
1366 struct connman_service *service;
1367 struct connman_ipconfig *ipconfig;
1369 service = connman_service_lookup_from_network(network);
1373 ipconfig = __connman_service_get_ip4config(service);
1377 __connman_ipconfig_set_method(ipconfig, method);
1380 void connman_network_set_ipv6_method(struct connman_network *network,
1381 enum connman_ipconfig_method method)
1383 struct connman_service *service;
1384 struct connman_ipconfig *ipconfig;
1386 service = connman_service_lookup_from_network(network);
1390 ipconfig = __connman_service_get_ip6config(service);
1394 __connman_ipconfig_set_method(ipconfig, method);
1397 void connman_network_set_error(struct connman_network *network,
1398 enum connman_network_error error)
1400 DBG("network %p error %d", network, error);
1402 network->connecting = false;
1403 network->associating = false;
1406 case CONNMAN_NETWORK_ERROR_UNKNOWN:
1408 case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
1409 set_associate_error(network);
1411 case CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL:
1412 set_configure_error(network);
1414 case CONNMAN_NETWORK_ERROR_INVALID_KEY:
1415 set_invalid_key_error(network);
1417 case CONNMAN_NETWORK_ERROR_CONNECT_FAIL:
1418 set_connect_error(network);
1422 network_change(network);
1426 * connman_network_set_connected:
1427 * @network: network structure
1428 * @connected: connected state
1430 * Change connected state of network
1432 int connman_network_set_connected(struct connman_network *network,
1435 DBG("network %p connected %d/%d connecting %d associating %d",
1436 network, network->connected, connected, network->connecting,
1437 network->associating);
1439 if ((network->connecting || network->associating) &&
1441 connman_network_set_error(network,
1442 CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
1443 if (__connman_network_disconnect(network) == 0)
1447 if (network->connected == connected)
1451 set_disconnected(network);
1453 set_connected(network);
1459 * connman_network_get_connected:
1460 * @network: network structure
1462 * Get network connection status
1464 bool connman_network_get_connected(struct connman_network *network)
1466 return network->connected;
1470 * connman_network_get_associating:
1471 * @network: network structure
1473 * Get network associating status
1475 bool connman_network_get_associating(struct connman_network *network)
1477 return network->associating;
1480 void connman_network_clear_hidden(void *user_data)
1485 DBG("user_data %p", user_data);
1488 * Hidden service does not have a connect timeout so
1489 * we do not need to remove it. We can just return
1490 * error to the caller telling that we could not find
1491 * any network that we could connect to.
1493 connman_dbus_reply_pending(user_data, EIO, NULL);
1496 int connman_network_connect_hidden(struct connman_network *network,
1497 char *identity, char *passphrase, void *user_data)
1500 struct connman_service *service;
1502 service = connman_service_lookup_from_network(network);
1504 DBG("network %p service %p user_data %p", network, service, user_data);
1510 __connman_service_set_agent_identity(service, identity);
1513 err = __connman_service_set_passphrase(service, passphrase);
1515 if (err == -ENOKEY) {
1516 __connman_service_indicate_error(service,
1517 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1520 __connman_service_set_hidden(service);
1521 __connman_service_set_hidden_data(service, user_data);
1522 return __connman_service_connect(service,
1523 CONNMAN_SERVICE_CONNECT_REASON_USER);
1527 __connman_service_return_error(service, -err, user_data);
1532 * __connman_network_connect:
1533 * @network: network structure
1537 int __connman_network_connect(struct connman_network *network)
1541 DBG("network %p", network);
1543 if (network->connected)
1546 if (network->connecting || network->associating)
1549 if (!network->driver)
1552 if (!network->driver->connect)
1555 if (!network->device)
1558 network->connecting = true;
1560 __connman_device_disconnect(network->device);
1562 err = network->driver->connect(network);
1564 if (err == -EINPROGRESS)
1565 connman_network_set_associating(network, true);
1567 network->connecting = false;
1572 set_connected(network);
1578 * __connman_network_disconnect:
1579 * @network: network structure
1581 * Disconnect network
1583 int __connman_network_disconnect(struct connman_network *network)
1587 DBG("network %p", network);
1589 if (!network->connected && !network->connecting &&
1590 !network->associating)
1593 if (!network->driver)
1596 network->connecting = false;
1598 if (network->driver->disconnect)
1599 err = network->driver->disconnect(network);
1601 if (err != -EINPROGRESS)
1602 set_disconnected(network);
1607 static int manual_ipv4_set(struct connman_network *network,
1608 struct connman_ipconfig *ipconfig)
1610 struct connman_service *service;
1613 service = connman_service_lookup_from_network(network);
1617 err = __connman_ipconfig_address_add(ipconfig);
1619 connman_network_set_error(network,
1620 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1624 return __connman_ipconfig_gateway_add(ipconfig);
1627 int __connman_network_clear_ipconfig(struct connman_network *network,
1628 struct connman_ipconfig *ipconfig)
1630 struct connman_service *service;
1631 struct connman_ipconfig *ipconfig_ipv4;
1632 enum connman_ipconfig_method method;
1633 enum connman_ipconfig_type type;
1635 service = connman_service_lookup_from_network(network);
1639 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1640 method = __connman_ipconfig_get_method(ipconfig);
1641 type = __connman_ipconfig_get_config_type(ipconfig);
1644 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1645 case CONNMAN_IPCONFIG_METHOD_OFF:
1646 case CONNMAN_IPCONFIG_METHOD_FIXED:
1648 case CONNMAN_IPCONFIG_METHOD_AUTO:
1649 release_dhcpv6(network);
1651 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1652 __connman_ipconfig_address_remove(ipconfig);
1654 case CONNMAN_IPCONFIG_METHOD_DHCP:
1655 __connman_dhcp_stop(ipconfig_ipv4);
1659 if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
1660 __connman_service_ipconfig_indicate_state(service,
1661 CONNMAN_SERVICE_STATE_CONFIGURATION,
1662 CONNMAN_IPCONFIG_TYPE_IPV6);
1663 else if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
1664 __connman_service_ipconfig_indicate_state(service,
1665 CONNMAN_SERVICE_STATE_CONFIGURATION,
1666 CONNMAN_IPCONFIG_TYPE_IPV4);
1671 int __connman_network_set_ipconfig(struct connman_network *network,
1672 struct connman_ipconfig *ipconfig_ipv4,
1673 struct connman_ipconfig *ipconfig_ipv6)
1675 enum connman_ipconfig_method method;
1681 if (ipconfig_ipv6) {
1682 method = __connman_ipconfig_get_method(ipconfig_ipv6);
1685 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1686 case CONNMAN_IPCONFIG_METHOD_OFF:
1688 case CONNMAN_IPCONFIG_METHOD_AUTO:
1689 autoconf_ipv6_set(network);
1691 case CONNMAN_IPCONFIG_METHOD_FIXED:
1692 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1693 ret = manual_ipv6_set(network, ipconfig_ipv6);
1695 connman_network_set_error(network,
1696 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1700 case CONNMAN_IPCONFIG_METHOD_DHCP:
1705 if (ipconfig_ipv4) {
1706 method = __connman_ipconfig_get_method(ipconfig_ipv4);
1709 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1710 case CONNMAN_IPCONFIG_METHOD_OFF:
1711 case CONNMAN_IPCONFIG_METHOD_FIXED:
1712 case CONNMAN_IPCONFIG_METHOD_AUTO:
1714 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1715 return manual_ipv4_set(network, ipconfig_ipv4);
1716 case CONNMAN_IPCONFIG_METHOD_DHCP:
1717 return __connman_dhcp_start(ipconfig_ipv4,
1718 network, dhcp_callback, NULL);
1725 int connman_network_set_ipaddress(struct connman_network *network,
1726 struct connman_ipaddress *ipaddress)
1728 struct connman_service *service;
1729 struct connman_ipconfig *ipconfig = NULL;
1731 DBG("network %p", network);
1733 service = connman_service_lookup_from_network(network);
1737 ipconfig = __connman_service_get_ipconfig(service, ipaddress->family);
1741 __connman_ipconfig_set_local(ipconfig, ipaddress->local);
1742 __connman_ipconfig_set_peer(ipconfig, ipaddress->peer);
1743 __connman_ipconfig_set_broadcast(ipconfig, ipaddress->broadcast);
1744 __connman_ipconfig_set_prefixlen(ipconfig, ipaddress->prefixlen);
1745 __connman_ipconfig_set_gateway(ipconfig, ipaddress->gateway);
1750 #if defined TIZEN_EXT
1752 * Description: Network client requires additional wifi specific info
1754 int connman_network_set_bssid(struct connman_network *network,
1755 const unsigned char *bssid)
1762 DBG("network %p bssid %02x:%02x:%02x:%02x:%02x:%02x", network,
1763 bssid[0], bssid[1], bssid[2],
1764 bssid[3], bssid[4], bssid[5]);
1766 for (;i < WIFI_BSSID_LEN_MAX;i++)
1767 network->wifi.bssid[i] = bssid[i];
1772 unsigned char *connman_network_get_bssid(struct connman_network *network)
1774 return (unsigned char *)network->wifi.bssid;
1777 int connman_network_set_maxrate(struct connman_network *network,
1778 unsigned int maxrate)
1780 DBG("network %p maxrate %d", network, maxrate);
1782 network->wifi.maxrate = maxrate;
1787 unsigned int connman_network_get_maxrate(struct connman_network *network)
1789 return network->wifi.maxrate;
1792 int connman_network_set_enc_mode(struct connman_network *network,
1793 const char *encryption_mode)
1795 if (encryption_mode == NULL)
1798 DBG("network %p encryption mode %s", network, encryption_mode);
1800 g_strlcpy(network->wifi.encryption_mode, encryption_mode,
1801 WIFI_ENCYPTION_MODE_LEN_MAX);
1806 const char *connman_network_get_enc_mode(struct connman_network *network)
1808 return (const char *)network->wifi.encryption_mode;
1813 int connman_network_set_nameservers(struct connman_network *network,
1814 const char *nameservers)
1816 struct connman_service *service;
1817 char **nameservers_array;
1820 DBG("network %p nameservers %s", network, nameservers);
1822 service = connman_service_lookup_from_network(network);
1826 __connman_service_nameserver_clear(service);
1831 nameservers_array = g_strsplit(nameservers, " ", 0);
1833 for (i = 0; nameservers_array[i]; i++) {
1834 __connman_service_nameserver_append(service,
1835 nameservers_array[i], false);
1838 g_strfreev(nameservers_array);
1843 int connman_network_set_domain(struct connman_network *network,
1846 struct connman_service *service;
1848 DBG("network %p domain %s", network, domain);
1850 service = connman_service_lookup_from_network(network);
1854 __connman_service_set_domainname(service, domain);
1860 * connman_network_set_name:
1861 * @network: network structure
1864 * Set display name value for network
1866 int connman_network_set_name(struct connman_network *network,
1869 DBG("network %p name %s", network, name);
1871 g_free(network->name);
1872 network->name = g_strdup(name);
1878 * connman_network_set_strength:
1879 * @network: network structure
1880 * @strength: strength value
1882 * Set signal strength value for network
1885 int connman_network_set_strength(struct connman_network *network,
1888 DBG("network %p strengh %d", network, strength);
1890 network->strength = strength;
1895 uint8_t connman_network_get_strength(struct connman_network *network)
1897 return network->strength;
1900 int connman_network_set_frequency(struct connman_network *network,
1903 DBG("network %p frequency %d", network, frequency);
1905 network->frequency = frequency;
1910 uint16_t connman_network_get_frequency(struct connman_network *network)
1912 return network->frequency;
1915 int connman_network_set_wifi_channel(struct connman_network *network,
1918 DBG("network %p wifi channel %d", network, channel);
1920 network->wifi.channel = channel;
1925 uint16_t connman_network_get_wifi_channel(struct connman_network *network)
1927 return network->wifi.channel;
1931 * connman_network_set_string:
1932 * @network: network structure
1933 * @key: unique identifier
1934 * @value: string value
1936 * Set string value for specific key
1938 int connman_network_set_string(struct connman_network *network,
1939 const char *key, const char *value)
1941 DBG("network %p key %s value %s", network, key, value);
1943 if (g_strcmp0(key, "Name") == 0)
1944 return connman_network_set_name(network, value);
1946 if (g_str_equal(key, "Path")) {
1947 g_free(network->path);
1948 network->path = g_strdup(value);
1949 } else if (g_str_equal(key, "Node")) {
1950 g_free(network->node);
1951 network->node = g_strdup(value);
1952 } else if (g_str_equal(key, "WiFi.Mode")) {
1953 g_free(network->wifi.mode);
1954 network->wifi.mode = g_strdup(value);
1955 } else if (g_str_equal(key, "WiFi.Security")) {
1956 g_free(network->wifi.security);
1957 network->wifi.security = g_strdup(value);
1958 } else if (g_str_equal(key, "WiFi.Passphrase")) {
1959 g_free(network->wifi.passphrase);
1960 network->wifi.passphrase = g_strdup(value);
1961 } else if (g_str_equal(key, "WiFi.EAP")) {
1962 g_free(network->wifi.eap);
1963 network->wifi.eap = g_strdup(value);
1964 } else if (g_str_equal(key, "WiFi.Identity")) {
1965 g_free(network->wifi.identity);
1966 network->wifi.identity = g_strdup(value);
1967 } else if (g_str_equal(key, "WiFi.AgentIdentity")) {
1968 g_free(network->wifi.agent_identity);
1969 network->wifi.agent_identity = g_strdup(value);
1970 } else if (g_str_equal(key, "WiFi.CACertFile")) {
1971 g_free(network->wifi.ca_cert_path);
1972 network->wifi.ca_cert_path = g_strdup(value);
1973 } else if (g_str_equal(key, "WiFi.ClientCertFile")) {
1974 g_free(network->wifi.client_cert_path);
1975 network->wifi.client_cert_path = g_strdup(value);
1976 } else if (g_str_equal(key, "WiFi.PrivateKeyFile")) {
1977 g_free(network->wifi.private_key_path);
1978 network->wifi.private_key_path = g_strdup(value);
1979 } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase")) {
1980 g_free(network->wifi.private_key_passphrase);
1981 network->wifi.private_key_passphrase = g_strdup(value);
1982 } else if (g_str_equal(key, "WiFi.Phase2")) {
1983 g_free(network->wifi.phase2_auth);
1984 network->wifi.phase2_auth = g_strdup(value);
1985 } else if (g_str_equal(key, "WiFi.PinWPS")) {
1986 g_free(network->wifi.pin_wps);
1987 network->wifi.pin_wps = g_strdup(value);
1996 * connman_network_get_string:
1997 * @network: network structure
1998 * @key: unique identifier
2000 * Get string value for specific key
2002 const char *connman_network_get_string(struct connman_network *network,
2005 DBG("network %p key %s", network, key);
2007 if (g_str_equal(key, "Path"))
2008 return network->path;
2009 else if (g_str_equal(key, "Name"))
2010 return network->name;
2011 else if (g_str_equal(key, "Node"))
2012 return network->node;
2013 else if (g_str_equal(key, "WiFi.Mode"))
2014 return network->wifi.mode;
2015 else if (g_str_equal(key, "WiFi.Security"))
2016 return network->wifi.security;
2017 else if (g_str_equal(key, "WiFi.Passphrase"))
2018 return network->wifi.passphrase;
2019 else if (g_str_equal(key, "WiFi.EAP"))
2020 return network->wifi.eap;
2021 else if (g_str_equal(key, "WiFi.Identity"))
2022 return network->wifi.identity;
2023 else if (g_str_equal(key, "WiFi.AgentIdentity"))
2024 return network->wifi.agent_identity;
2025 else if (g_str_equal(key, "WiFi.CACertFile"))
2026 return network->wifi.ca_cert_path;
2027 else if (g_str_equal(key, "WiFi.ClientCertFile"))
2028 return network->wifi.client_cert_path;
2029 else if (g_str_equal(key, "WiFi.PrivateKeyFile"))
2030 return network->wifi.private_key_path;
2031 else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase"))
2032 return network->wifi.private_key_passphrase;
2033 else if (g_str_equal(key, "WiFi.Phase2"))
2034 return network->wifi.phase2_auth;
2035 else if (g_str_equal(key, "WiFi.PinWPS"))
2036 return network->wifi.pin_wps;
2042 * connman_network_set_bool:
2043 * @network: network structure
2044 * @key: unique identifier
2045 * @value: boolean value
2047 * Set boolean value for specific key
2049 int connman_network_set_bool(struct connman_network *network,
2050 const char *key, bool value)
2052 DBG("network %p key %s value %d", network, key, value);
2054 if (g_strcmp0(key, "Roaming") == 0)
2055 network->roaming = value;
2056 else if (g_strcmp0(key, "WiFi.WPS") == 0)
2057 network->wifi.wps = value;
2058 else if (g_strcmp0(key, "WiFi.UseWPS") == 0)
2059 network->wifi.use_wps = value;
2065 * connman_network_get_bool:
2066 * @network: network structure
2067 * @key: unique identifier
2069 * Get boolean value for specific key
2071 bool connman_network_get_bool(struct connman_network *network,
2074 DBG("network %p key %s", network, key);
2076 if (g_str_equal(key, "Roaming"))
2077 return network->roaming;
2078 else if (g_str_equal(key, "WiFi.WPS"))
2079 return network->wifi.wps;
2080 else if (g_str_equal(key, "WiFi.UseWPS"))
2081 return network->wifi.use_wps;
2087 * connman_network_set_blob:
2088 * @network: network structure
2089 * @key: unique identifier
2093 * Set binary blob value for specific key
2095 int connman_network_set_blob(struct connman_network *network,
2096 const char *key, const void *data, unsigned int size)
2098 DBG("network %p key %s size %d", network, key, size);
2100 if (g_str_equal(key, "WiFi.SSID")) {
2101 g_free(network->wifi.ssid);
2102 network->wifi.ssid = g_try_malloc(size);
2103 if (network->wifi.ssid) {
2104 memcpy(network->wifi.ssid, data, size);
2105 network->wifi.ssid_len = size;
2107 network->wifi.ssid_len = 0;
2116 * connman_network_get_blob:
2117 * @network: network structure
2118 * @key: unique identifier
2119 * @size: pointer to blob size
2121 * Get binary blob value for specific key
2123 const void *connman_network_get_blob(struct connman_network *network,
2124 const char *key, unsigned int *size)
2126 DBG("network %p key %s", network, key);
2128 if (g_str_equal(key, "WiFi.SSID")) {
2130 *size = network->wifi.ssid_len;
2131 return network->wifi.ssid;
2137 void __connman_network_set_device(struct connman_network *network,
2138 struct connman_device *device)
2140 if (network->device == device)
2143 if (network->device)
2144 network_remove(network);
2146 network->device = device;
2148 if (network->device)
2149 network_probe(network);
2153 * connman_network_get_device:
2154 * @network: network structure
2156 * Get parent device of network
2158 struct connman_device *connman_network_get_device(struct connman_network *network)
2160 return network->device;
2164 * connman_network_get_data:
2165 * @network: network structure
2167 * Get private network data pointer
2169 void *connman_network_get_data(struct connman_network *network)
2171 return network->driver_data;
2175 * connman_network_set_data:
2176 * @network: network structure
2177 * @data: data pointer
2179 * Set private network data pointer
2181 void connman_network_set_data(struct connman_network *network, void *data)
2183 network->driver_data = data;
2186 void connman_network_update(struct connman_network *network)
2188 switch (network->type) {
2189 case CONNMAN_NETWORK_TYPE_UNKNOWN:
2190 case CONNMAN_NETWORK_TYPE_VENDOR:
2192 case CONNMAN_NETWORK_TYPE_ETHERNET:
2193 case CONNMAN_NETWORK_TYPE_GADGET:
2194 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
2195 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
2196 case CONNMAN_NETWORK_TYPE_CELLULAR:
2197 case CONNMAN_NETWORK_TYPE_WIFI:
2202 __connman_service_update_from_network(network);
2205 int __connman_network_init(void)
2212 void __connman_network_cleanup(void)