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
44 static GSList *network_list = NULL;
45 static GSList *driver_list = NULL;
47 struct connman_network {
49 enum connman_network_type type;
61 int router_solicit_count;
62 int router_solicit_refresh_count;
64 struct connman_network_driver *driver;
70 struct connman_device *device;
76 unsigned short channel;
83 char *client_cert_path;
84 char *private_key_path;
85 char *private_key_passphrase;
94 static const char *type2string(enum connman_network_type type)
97 case CONNMAN_NETWORK_TYPE_UNKNOWN:
98 case CONNMAN_NETWORK_TYPE_VENDOR:
100 case CONNMAN_NETWORK_TYPE_ETHERNET:
102 case CONNMAN_NETWORK_TYPE_GADGET:
104 case CONNMAN_NETWORK_TYPE_WIFI:
106 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
107 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
109 case CONNMAN_NETWORK_TYPE_CELLULAR:
116 static bool match_driver(struct connman_network *network,
117 struct connman_network_driver *driver)
119 if (network->type == driver->type ||
120 driver->type == CONNMAN_NETWORK_TYPE_UNKNOWN)
126 static void set_configuration(struct connman_network *network,
127 enum connman_ipconfig_type type)
129 struct connman_service *service;
131 DBG("network %p", network);
133 if (!network->device)
136 __connman_device_set_network(network->device, network);
138 connman_device_set_disconnected(network->device, false);
140 service = connman_service_lookup_from_network(network);
141 __connman_service_ipconfig_indicate_state(service,
142 CONNMAN_SERVICE_STATE_CONFIGURATION,
146 static void dhcp_success(struct connman_network *network)
148 struct connman_service *service;
149 struct connman_ipconfig *ipconfig_ipv4;
152 service = connman_service_lookup_from_network(network);
156 connman_network_set_associating(network, false);
158 network->connecting = false;
160 ipconfig_ipv4 = __connman_service_get_ip4config(service);
162 DBG("lease acquired for ipconfig %p", ipconfig_ipv4);
167 err = __connman_ipconfig_address_add(ipconfig_ipv4);
171 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
178 connman_network_set_error(network,
179 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
182 static void dhcp_failure(struct connman_network *network)
184 struct connman_service *service;
185 struct connman_ipconfig *ipconfig_ipv4;
187 service = connman_service_lookup_from_network(network);
191 connman_network_set_associating(network, false);
192 network->connecting = false;
194 ipconfig_ipv4 = __connman_service_get_ip4config(service);
196 DBG("lease lost for ipconfig %p", ipconfig_ipv4);
201 __connman_ipconfig_address_remove(ipconfig_ipv4);
202 __connman_ipconfig_gateway_remove(ipconfig_ipv4);
205 static void dhcp_callback(struct connman_ipconfig *ipconfig,
206 struct connman_network *network,
207 bool success, gpointer data)
210 dhcp_success(network);
212 dhcp_failure(network);
215 static int set_connected_fixed(struct connman_network *network)
217 struct connman_service *service;
218 struct connman_ipconfig *ipconfig_ipv4;
223 service = connman_service_lookup_from_network(network);
225 ipconfig_ipv4 = __connman_service_get_ip4config(service);
227 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
229 network->connecting = false;
231 connman_network_set_associating(network, false);
233 err = __connman_ipconfig_address_add(ipconfig_ipv4);
237 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
244 connman_network_set_error(network,
245 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
250 static void set_connected_manual(struct connman_network *network)
252 struct connman_service *service;
253 struct connman_ipconfig *ipconfig;
256 DBG("network %p", network);
258 service = connman_service_lookup_from_network(network);
260 ipconfig = __connman_service_get_ip4config(service);
262 if (!__connman_ipconfig_get_local(ipconfig))
263 __connman_service_read_ip4config(service);
265 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
267 err = __connman_ipconfig_address_add(ipconfig);
271 err = __connman_ipconfig_gateway_add(ipconfig);
275 network->connecting = false;
277 connman_network_set_associating(network, false);
282 connman_network_set_error(network,
283 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
287 static int set_connected_dhcp(struct connman_network *network)
289 struct connman_service *service;
290 struct connman_ipconfig *ipconfig_ipv4;
293 DBG("network %p", network);
295 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
297 service = connman_service_lookup_from_network(network);
298 ipconfig_ipv4 = __connman_service_get_ip4config(service);
300 err = __connman_dhcp_start(ipconfig_ipv4, network,
301 dhcp_callback, NULL);
303 connman_error("Can not request DHCP lease");
310 static int manual_ipv6_set(struct connman_network *network,
311 struct connman_ipconfig *ipconfig_ipv6)
313 struct connman_service *service;
316 DBG("network %p ipv6 %p", network, ipconfig_ipv6);
318 service = connman_service_lookup_from_network(network);
322 if (!__connman_ipconfig_get_local(ipconfig_ipv6))
323 __connman_service_read_ip6config(service);
325 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
327 err = __connman_ipconfig_address_add(ipconfig_ipv6);
329 connman_network_set_error(network,
330 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
334 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
338 __connman_connection_gateway_activate(service,
339 CONNMAN_IPCONFIG_TYPE_IPV6);
341 __connman_device_set_network(network->device, network);
343 connman_device_set_disconnected(network->device, false);
345 network->connecting = false;
350 static void stop_dhcpv6(struct connman_network *network)
352 __connman_dhcpv6_stop(network);
355 static void dhcpv6_release_callback(struct connman_network *network,
356 enum __connman_dhcpv6_status status,
359 DBG("status %d", status);
361 stop_dhcpv6(network);
364 static void release_dhcpv6(struct connman_network *network)
366 __connman_dhcpv6_start_release(network, dhcpv6_release_callback);
367 stop_dhcpv6(network);
370 static void dhcpv6_info_callback(struct connman_network *network,
371 enum __connman_dhcpv6_status status,
374 DBG("status %d", status);
376 stop_dhcpv6(network);
379 static int dhcpv6_set_addresses(struct connman_network *network)
381 struct connman_service *service;
382 struct connman_ipconfig *ipconfig_ipv6;
385 service = connman_service_lookup_from_network(network);
389 connman_network_set_associating(network, false);
391 network->connecting = false;
393 ipconfig_ipv6 = __connman_service_get_ip6config(service);
394 err = __connman_ipconfig_address_add(ipconfig_ipv6);
398 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
405 connman_network_set_error(network,
406 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
410 static void autoconf_ipv6_set(struct connman_network *network);
411 static void dhcpv6_callback(struct connman_network *network,
412 enum __connman_dhcpv6_status status, gpointer data);
415 * Have a separate callback for renew so that we do not do autoconf
416 * in wrong phase as the dhcpv6_callback() is also called when doing
417 * DHCPv6 solicitation.
419 static void dhcpv6_renew_callback(struct connman_network *network,
420 enum __connman_dhcpv6_status status,
424 case CONNMAN_DHCPV6_STATUS_SUCCEED:
425 dhcpv6_callback(network, status, data);
427 case CONNMAN_DHCPV6_STATUS_FAIL:
428 case CONNMAN_DHCPV6_STATUS_RESTART:
429 stop_dhcpv6(network);
431 /* restart and do solicit again. */
432 autoconf_ipv6_set(network);
437 static void dhcpv6_callback(struct connman_network *network,
438 enum __connman_dhcpv6_status status, gpointer data)
440 DBG("status %d", status);
442 /* Start the renew process if necessary */
443 if (status == CONNMAN_DHCPV6_STATUS_SUCCEED) {
445 if (dhcpv6_set_addresses(network) < 0) {
446 stop_dhcpv6(network);
450 if (__connman_dhcpv6_start_renew(network,
451 dhcpv6_renew_callback) == -ETIMEDOUT)
452 dhcpv6_renew_callback(network,
453 CONNMAN_DHCPV6_STATUS_FAIL,
456 } else if (status == CONNMAN_DHCPV6_STATUS_RESTART) {
457 stop_dhcpv6(network);
458 autoconf_ipv6_set(network);
460 stop_dhcpv6(network);
463 static void check_dhcpv6(struct nd_router_advert *reply,
464 unsigned int length, void *user_data)
466 struct connman_network *network = user_data;
467 struct connman_service *service;
470 DBG("reply %p", reply);
474 * Router solicitation message seem to get lost easily so
475 * try to send it again.
477 if (network->router_solicit_count > 0) {
478 DBG("re-send router solicitation %d",
479 network->router_solicit_count);
480 network->router_solicit_count--;
481 __connman_inet_ipv6_send_rs(network->index, 1,
482 check_dhcpv6, network);
485 connman_network_unref(network);
489 network->router_solicit_count = 0;
492 * If we were disconnected while waiting router advertisement,
493 * we just quit and do not start DHCPv6
495 if (!network->connected) {
496 connman_network_unref(network);
500 prefixes = __connman_inet_ipv6_get_prefixes(reply, length);
503 * If IPv6 config is missing from service, then create it.
504 * The ipconfig might be missing if we got a rtnl message
505 * that disabled IPv6 config and thus removed it. This
506 * can happen if we are switching from one service to
507 * another in the same interface. The only way to get IPv6
508 * config back is to re-create it here.
510 service = connman_service_lookup_from_network(network);
512 connman_service_create_ip6config(service, network->index);
514 __connman_service_ipconfig_indicate_state(service,
515 CONNMAN_SERVICE_STATE_CONFIGURATION,
516 CONNMAN_IPCONFIG_TYPE_IPV6);
520 * We do stateful/stateless DHCPv6 if router advertisement says so.
522 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED)
523 __connman_dhcpv6_start(network, prefixes, dhcpv6_callback);
524 else if (reply->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
525 __connman_dhcpv6_start_info(network, dhcpv6_info_callback);
527 connman_network_unref(network);
530 static void receive_refresh_rs_reply(struct nd_router_advert *reply,
531 unsigned int length, void *user_data)
533 struct connman_network *network = user_data;
535 DBG("reply %p", reply);
539 * Router solicitation message seem to get lost easily so
540 * try to send it again.
542 if (network->router_solicit_refresh_count > 1) {
543 network->router_solicit_refresh_count--;
544 DBG("re-send router solicitation %d",
545 network->router_solicit_refresh_count);
546 __connman_inet_ipv6_send_rs(network->index,
548 receive_refresh_rs_reply,
554 /* RS refresh not in progress anymore */
555 network->router_solicit_refresh_count = 0;
557 connman_network_unref(network);
561 int __connman_network_refresh_rs_ipv6(struct connman_network *network,
566 DBG("network %p index %d", network, index);
568 /* Send only one RS for all RDNSS entries which are about to expire */
569 if (network->router_solicit_refresh_count > 0) {
570 DBG("RS refresh already started");
574 network->router_solicit_refresh_count = RS_REFRESH_COUNT;
576 connman_network_ref(network);
578 ret = __connman_inet_ipv6_send_rs(index, RS_REFRESH_TIMEOUT,
579 receive_refresh_rs_reply, network);
583 static void autoconf_ipv6_set(struct connman_network *network)
585 struct connman_service *service;
586 struct connman_ipconfig *ipconfig;
589 DBG("network %p", network);
591 if (network->router_solicit_count > 0) {
593 * The autoconfiguration is already pending and we have sent
594 * router solicitation messages and are now waiting answers.
595 * There is no need to continue any further.
597 DBG("autoconfiguration already started");
601 __connman_device_set_network(network->device, network);
603 connman_device_set_disconnected(network->device, false);
605 network->connecting = false;
607 service = connman_service_lookup_from_network(network);
611 ipconfig = __connman_service_get_ip6config(service);
615 __connman_ipconfig_address_remove(ipconfig);
617 index = __connman_ipconfig_get_index(ipconfig);
619 connman_network_ref(network);
621 /* Try to get stateless DHCPv6 information, RFC 3736 */
622 network->router_solicit_count = 3;
623 __connman_inet_ipv6_send_rs(index, 1, check_dhcpv6, network);
626 static void set_connected(struct connman_network *network)
628 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
629 enum connman_ipconfig_method ipv4_method, ipv6_method;
630 struct connman_service *service;
633 if (network->connected)
636 network->connected = true;
638 service = connman_service_lookup_from_network(network);
640 ipconfig_ipv4 = __connman_service_get_ip4config(service);
641 ipconfig_ipv6 = __connman_service_get_ip6config(service);
643 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
646 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
647 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
649 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
651 switch (ipv6_method) {
652 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
653 case CONNMAN_IPCONFIG_METHOD_OFF:
655 case CONNMAN_IPCONFIG_METHOD_DHCP:
656 case CONNMAN_IPCONFIG_METHOD_AUTO:
657 autoconf_ipv6_set(network);
659 case CONNMAN_IPCONFIG_METHOD_FIXED:
660 case CONNMAN_IPCONFIG_METHOD_MANUAL:
661 ret = manual_ipv6_set(network, ipconfig_ipv6);
663 connman_network_set_error(network,
664 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
670 switch (ipv4_method) {
671 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
672 case CONNMAN_IPCONFIG_METHOD_OFF:
673 case CONNMAN_IPCONFIG_METHOD_AUTO:
675 case CONNMAN_IPCONFIG_METHOD_FIXED:
676 if (set_connected_fixed(network) < 0) {
677 connman_network_set_error(network,
678 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
682 case CONNMAN_IPCONFIG_METHOD_MANUAL:
683 set_connected_manual(network);
685 case CONNMAN_IPCONFIG_METHOD_DHCP:
686 if (set_connected_dhcp(network) < 0) {
687 connman_network_set_error(network,
688 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
693 network->connecting = false;
695 connman_network_set_associating(network, false);
698 static void set_disconnected(struct connman_network *network)
700 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
701 enum connman_ipconfig_method ipv4_method, ipv6_method;
702 enum connman_service_state state;
703 struct connman_service *service;
705 service = connman_service_lookup_from_network(network);
707 ipconfig_ipv4 = __connman_service_get_ip4config(service);
708 ipconfig_ipv6 = __connman_service_get_ip6config(service);
710 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
713 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
714 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
716 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
719 * Resetting solicit count here will prevent the RS resend loop
720 * from sending packets in check_dhcpv6()
722 network->router_solicit_count = 0;
724 __connman_device_set_network(network->device, NULL);
726 if (network->connected) {
727 switch (ipv6_method) {
728 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
729 case CONNMAN_IPCONFIG_METHOD_OFF:
730 case CONNMAN_IPCONFIG_METHOD_FIXED:
731 case CONNMAN_IPCONFIG_METHOD_MANUAL:
733 case CONNMAN_IPCONFIG_METHOD_DHCP:
734 case CONNMAN_IPCONFIG_METHOD_AUTO:
735 release_dhcpv6(network);
739 switch (ipv4_method) {
740 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
741 case CONNMAN_IPCONFIG_METHOD_OFF:
742 case CONNMAN_IPCONFIG_METHOD_AUTO:
743 case CONNMAN_IPCONFIG_METHOD_FIXED:
744 case CONNMAN_IPCONFIG_METHOD_MANUAL:
746 case CONNMAN_IPCONFIG_METHOD_DHCP:
747 __connman_dhcp_stop(ipconfig_ipv4);
753 * We only set the disconnect state if we were not in idle
754 * or in failure. It does not make sense to go to disconnect
755 * state if we were not connected.
757 state = __connman_service_ipconfig_get_state(service,
758 CONNMAN_IPCONFIG_TYPE_IPV4);
759 if (state != CONNMAN_SERVICE_STATE_IDLE &&
760 state != CONNMAN_SERVICE_STATE_FAILURE)
761 __connman_service_ipconfig_indicate_state(service,
762 CONNMAN_SERVICE_STATE_DISCONNECT,
763 CONNMAN_IPCONFIG_TYPE_IPV4);
765 state = __connman_service_ipconfig_get_state(service,
766 CONNMAN_IPCONFIG_TYPE_IPV6);
767 if (state != CONNMAN_SERVICE_STATE_IDLE &&
768 state != CONNMAN_SERVICE_STATE_FAILURE)
769 __connman_service_ipconfig_indicate_state(service,
770 CONNMAN_SERVICE_STATE_DISCONNECT,
771 CONNMAN_IPCONFIG_TYPE_IPV6);
773 if (network->connected) {
774 __connman_connection_gateway_remove(service,
775 CONNMAN_IPCONFIG_TYPE_ALL);
777 __connman_ipconfig_address_unset(ipconfig_ipv4);
778 __connman_ipconfig_address_unset(ipconfig_ipv6);
781 * Special handling for IPv6 autoconfigured address.
782 * The simplest way to remove autoconfigured routes is to
783 * disable IPv6 temporarily so that kernel will do the cleanup
786 if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
787 __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
788 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
792 __connman_service_ipconfig_indicate_state(service,
793 CONNMAN_SERVICE_STATE_IDLE,
794 CONNMAN_IPCONFIG_TYPE_IPV4);
796 __connman_service_ipconfig_indicate_state(service,
797 CONNMAN_SERVICE_STATE_IDLE,
798 CONNMAN_IPCONFIG_TYPE_IPV6);
800 network->connecting = false;
801 network->connected = false;
803 connman_network_set_associating(network, false);
808 static int network_probe(struct connman_network *network)
811 struct connman_network_driver *driver = NULL;
813 DBG("network %p name %s", network, network->name);
818 for (list = driver_list; list; list = list->next) {
821 if (!match_driver(network, driver)) {
826 DBG("driver %p name %s", driver, driver->name);
828 if (driver->probe(network) == 0)
840 switch (network->type) {
841 case CONNMAN_NETWORK_TYPE_UNKNOWN:
842 case CONNMAN_NETWORK_TYPE_VENDOR:
844 case CONNMAN_NETWORK_TYPE_ETHERNET:
845 case CONNMAN_NETWORK_TYPE_GADGET:
846 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
847 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
848 case CONNMAN_NETWORK_TYPE_CELLULAR:
849 case CONNMAN_NETWORK_TYPE_WIFI:
850 network->driver = driver;
851 if (!__connman_service_create_from_network(network)) {
852 network->driver = NULL;
860 static void network_remove(struct connman_network *network)
862 DBG("network %p name %s", network, network->name);
864 if (!network->driver)
867 if (network->connected)
868 set_disconnected(network);
870 switch (network->type) {
871 case CONNMAN_NETWORK_TYPE_UNKNOWN:
872 case CONNMAN_NETWORK_TYPE_VENDOR:
874 case CONNMAN_NETWORK_TYPE_ETHERNET:
875 case CONNMAN_NETWORK_TYPE_GADGET:
876 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
877 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
878 case CONNMAN_NETWORK_TYPE_CELLULAR:
879 case CONNMAN_NETWORK_TYPE_WIFI:
880 if (network->group) {
881 __connman_service_remove_from_network(network);
883 g_free(network->group);
884 network->group = NULL;
889 if (network->driver->remove)
890 network->driver->remove(network);
892 network->driver = NULL;
895 static void network_change(struct connman_network *network)
897 DBG("network %p name %s", network, network->name);
899 if (!network->connected)
902 connman_device_set_disconnected(network->device, true);
904 if (network->driver && network->driver->disconnect) {
905 network->driver->disconnect(network);
909 network->connected = false;
912 static void probe_driver(struct connman_network_driver *driver)
916 DBG("driver %p name %s", driver, driver->name);
918 for (list = network_list; list; list = list->next) {
919 struct connman_network *network = list->data;
924 if (driver->type != network->type)
927 if (driver->probe(network) < 0)
930 network->driver = driver;
934 static void remove_driver(struct connman_network_driver *driver)
938 DBG("driver %p name %s", driver, driver->name);
940 for (list = network_list; list; list = list->next) {
941 struct connman_network *network = list->data;
943 if (network->driver == driver)
944 network_remove(network);
948 static gint compare_priority(gconstpointer a, gconstpointer b)
950 const struct connman_network_driver *driver1 = a;
951 const struct connman_network_driver *driver2 = b;
953 return driver2->priority - driver1->priority;
957 * connman_network_driver_register:
958 * @driver: network driver definition
960 * Register a new network driver
962 * Returns: %0 on success
964 int connman_network_driver_register(struct connman_network_driver *driver)
966 DBG("driver %p name %s", driver, driver->name);
968 driver_list = g_slist_insert_sorted(driver_list, driver,
971 probe_driver(driver);
977 * connman_network_driver_unregister:
978 * @driver: network driver definition
980 * Remove a previously registered network driver
982 void connman_network_driver_unregister(struct connman_network_driver *driver)
984 DBG("driver %p name %s", driver, driver->name);
986 driver_list = g_slist_remove(driver_list, driver);
988 remove_driver(driver);
991 static void network_destruct(struct connman_network *network)
993 DBG("network %p name %s", network, network->name);
995 g_free(network->wifi.ssid);
996 g_free(network->wifi.mode);
997 g_free(network->wifi.security);
998 g_free(network->wifi.passphrase);
999 g_free(network->wifi.eap);
1000 g_free(network->wifi.identity);
1001 g_free(network->wifi.agent_identity);
1002 g_free(network->wifi.ca_cert_path);
1003 g_free(network->wifi.client_cert_path);
1004 g_free(network->wifi.private_key_path);
1005 g_free(network->wifi.private_key_passphrase);
1006 g_free(network->wifi.phase2_auth);
1007 g_free(network->wifi.pin_wps);
1009 g_free(network->path);
1010 g_free(network->group);
1011 g_free(network->node);
1012 g_free(network->name);
1013 g_free(network->identifier);
1015 network->device = NULL;
1021 * connman_network_create:
1022 * @identifier: network identifier (for example an unqiue name)
1024 * Allocate a new network and assign the #identifier to it.
1026 * Returns: a newly-allocated #connman_network structure
1028 struct connman_network *connman_network_create(const char *identifier,
1029 enum connman_network_type type)
1031 struct connman_network *network;
1034 DBG("identifier %s type %d", identifier, type);
1036 network = g_try_new0(struct connman_network, 1);
1040 DBG("network %p", network);
1042 network->refcount = 1;
1044 ident = g_strdup(identifier);
1051 network->type = type;
1052 network->identifier = ident;
1054 network_list = g_slist_prepend(network_list, network);
1060 * connman_network_ref:
1061 * @network: network structure
1063 * Increase reference counter of network
1065 struct connman_network *
1066 connman_network_ref_debug(struct connman_network *network,
1067 const char *file, int line, const char *caller)
1069 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
1070 network->refcount + 1, file, line, caller);
1072 __sync_fetch_and_add(&network->refcount, 1);
1078 * connman_network_unref:
1079 * @network: network structure
1081 * Decrease reference counter of network
1083 void connman_network_unref_debug(struct connman_network *network,
1084 const char *file, int line, const char *caller)
1086 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
1087 network->refcount - 1, file, line, caller);
1089 if (__sync_fetch_and_sub(&network->refcount, 1) != 1)
1092 network_list = g_slist_remove(network_list, network);
1094 network_destruct(network);
1097 const char *__connman_network_get_type(struct connman_network *network)
1099 return type2string(network->type);
1103 * connman_network_get_type:
1104 * @network: network structure
1106 * Get type of network
1108 enum connman_network_type connman_network_get_type(
1109 struct connman_network *network)
1111 return network->type;
1115 * connman_network_get_identifier:
1116 * @network: network structure
1118 * Get identifier of network
1120 const char *connman_network_get_identifier(struct connman_network *network)
1122 return network->identifier;
1126 * connman_network_set_index:
1127 * @network: network structure
1128 * @index: index number
1130 * Set index number of network
1132 void connman_network_set_index(struct connman_network *network, int index)
1134 struct connman_service *service;
1135 struct connman_ipconfig *ipconfig;
1137 service = connman_service_lookup_from_network(network);
1141 ipconfig = __connman_service_get_ip4config(service);
1145 /* If index changed, the index of ipconfig must be reset. */
1146 __connman_ipconfig_set_index(ipconfig, index);
1148 DBG("index %d service %p ip4config %p", network->index,
1151 network->index = index;
1155 * connman_network_get_index:
1156 * @network: network structure
1158 * Get index number of network
1160 int connman_network_get_index(struct connman_network *network)
1162 return network->index;
1166 * connman_network_set_group:
1167 * @network: network structure
1168 * @group: group name
1170 * Set group name for automatic clustering
1172 void connman_network_set_group(struct connman_network *network,
1175 switch (network->type) {
1176 case CONNMAN_NETWORK_TYPE_UNKNOWN:
1177 case CONNMAN_NETWORK_TYPE_VENDOR:
1179 case CONNMAN_NETWORK_TYPE_ETHERNET:
1180 case CONNMAN_NETWORK_TYPE_GADGET:
1181 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
1182 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
1183 case CONNMAN_NETWORK_TYPE_CELLULAR:
1184 case CONNMAN_NETWORK_TYPE_WIFI:
1188 if (g_strcmp0(network->group, group) == 0) {
1190 __connman_service_update_from_network(network);
1194 if (network->group) {
1195 __connman_service_remove_from_network(network);
1197 g_free(network->group);
1200 network->group = g_strdup(group);
1203 network_probe(network);
1207 * connman_network_get_group:
1208 * @network: network structure
1210 * Get group name for automatic clustering
1212 const char *connman_network_get_group(struct connman_network *network)
1214 return network->group;
1217 const char *__connman_network_get_ident(struct connman_network *network)
1219 if (!network->device)
1222 return connman_device_get_ident(network->device);
1225 bool __connman_network_get_weakness(struct connman_network *network)
1227 switch (network->type) {
1228 case CONNMAN_NETWORK_TYPE_UNKNOWN:
1229 case CONNMAN_NETWORK_TYPE_VENDOR:
1230 case CONNMAN_NETWORK_TYPE_ETHERNET:
1231 case CONNMAN_NETWORK_TYPE_GADGET:
1232 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
1233 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
1234 case CONNMAN_NETWORK_TYPE_CELLULAR:
1236 case CONNMAN_NETWORK_TYPE_WIFI:
1237 if (network->strength > 0 && network->strength < 20)
1245 bool connman_network_get_connecting(struct connman_network *network)
1247 return network->connecting;
1251 * connman_network_set_available:
1252 * @network: network structure
1253 * @available: availability state
1255 * Change availability state of network (in range)
1257 int connman_network_set_available(struct connman_network *network,
1260 DBG("network %p available %d", network, available);
1262 if (network->available == available)
1265 network->available = available;
1271 * connman_network_get_available:
1272 * @network: network structure
1274 * Get network available setting
1276 bool connman_network_get_available(struct connman_network *network)
1278 return network->available;
1282 * connman_network_set_associating:
1283 * @network: network structure
1284 * @associating: associating state
1286 * Change associating state of network
1288 int connman_network_set_associating(struct connman_network *network,
1291 DBG("network %p associating %d", network, associating);
1293 if (network->associating == associating)
1296 network->associating = associating;
1299 struct connman_service *service;
1301 service = connman_service_lookup_from_network(network);
1302 __connman_service_ipconfig_indicate_state(service,
1303 CONNMAN_SERVICE_STATE_ASSOCIATION,
1304 CONNMAN_IPCONFIG_TYPE_IPV4);
1305 __connman_service_ipconfig_indicate_state(service,
1306 CONNMAN_SERVICE_STATE_ASSOCIATION,
1307 CONNMAN_IPCONFIG_TYPE_IPV6);
1313 static void set_associate_error(struct connman_network *network)
1315 struct connman_service *service;
1317 service = connman_service_lookup_from_network(network);
1319 __connman_service_indicate_error(service,
1320 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1323 static void set_configure_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_invalid_key_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_INVALID_KEY);
1343 static void set_connect_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_CONNECT_FAILED);
1353 void connman_network_set_ipv4_method(struct connman_network *network,
1354 enum connman_ipconfig_method method)
1356 struct connman_service *service;
1357 struct connman_ipconfig *ipconfig;
1359 service = connman_service_lookup_from_network(network);
1363 ipconfig = __connman_service_get_ip4config(service);
1367 __connman_ipconfig_set_method(ipconfig, method);
1370 void connman_network_set_ipv6_method(struct connman_network *network,
1371 enum connman_ipconfig_method method)
1373 struct connman_service *service;
1374 struct connman_ipconfig *ipconfig;
1376 service = connman_service_lookup_from_network(network);
1380 ipconfig = __connman_service_get_ip6config(service);
1384 __connman_ipconfig_set_method(ipconfig, method);
1387 void connman_network_set_error(struct connman_network *network,
1388 enum connman_network_error error)
1390 DBG("network %p error %d", network, error);
1392 network->connecting = false;
1393 network->associating = false;
1396 case CONNMAN_NETWORK_ERROR_UNKNOWN:
1398 case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
1399 set_associate_error(network);
1401 case CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL:
1402 set_configure_error(network);
1404 case CONNMAN_NETWORK_ERROR_INVALID_KEY:
1405 set_invalid_key_error(network);
1407 case CONNMAN_NETWORK_ERROR_CONNECT_FAIL:
1408 set_connect_error(network);
1412 network_change(network);
1416 * connman_network_set_connected:
1417 * @network: network structure
1418 * @connected: connected state
1420 * Change connected state of network
1422 int connman_network_set_connected(struct connman_network *network,
1425 DBG("network %p connected %d/%d connecting %d associating %d",
1426 network, network->connected, connected, network->connecting,
1427 network->associating);
1429 if ((network->connecting || network->associating) &&
1431 connman_network_set_error(network,
1432 CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
1433 if (__connman_network_disconnect(network) == 0)
1437 if (network->connected == connected)
1441 set_disconnected(network);
1443 set_connected(network);
1449 * connman_network_get_connected:
1450 * @network: network structure
1452 * Get network connection status
1454 bool connman_network_get_connected(struct connman_network *network)
1456 return network->connected;
1460 * connman_network_get_associating:
1461 * @network: network structure
1463 * Get network associating status
1465 bool connman_network_get_associating(struct connman_network *network)
1467 return network->associating;
1470 void connman_network_clear_hidden(void *user_data)
1475 DBG("user_data %p", user_data);
1478 * Hidden service does not have a connect timeout so
1479 * we do not need to remove it. We can just return
1480 * error to the caller telling that we could not find
1481 * any network that we could connect to.
1483 connman_dbus_reply_pending(user_data, EIO, NULL);
1486 int connman_network_connect_hidden(struct connman_network *network,
1487 char *identity, char *passphrase, void *user_data)
1490 struct connman_service *service;
1492 service = connman_service_lookup_from_network(network);
1494 DBG("network %p service %p user_data %p", network, service, user_data);
1500 __connman_service_set_agent_identity(service, identity);
1503 err = __connman_service_set_passphrase(service, passphrase);
1505 if (err == -ENOKEY) {
1506 __connman_service_indicate_error(service,
1507 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1510 __connman_service_set_hidden(service);
1511 __connman_service_set_hidden_data(service, user_data);
1512 return __connman_service_connect(service,
1513 CONNMAN_SERVICE_CONNECT_REASON_USER);
1517 __connman_service_return_error(service, -err, user_data);
1522 * __connman_network_connect:
1523 * @network: network structure
1527 int __connman_network_connect(struct connman_network *network)
1531 DBG("network %p", network);
1533 if (network->connected)
1536 if (network->connecting || network->associating)
1539 if (!network->driver)
1542 if (!network->driver->connect)
1545 if (!network->device)
1548 network->connecting = true;
1550 __connman_device_disconnect(network->device);
1552 err = network->driver->connect(network);
1554 if (err == -EINPROGRESS)
1555 connman_network_set_associating(network, true);
1557 network->connecting = false;
1562 set_connected(network);
1568 * __connman_network_disconnect:
1569 * @network: network structure
1571 * Disconnect network
1573 int __connman_network_disconnect(struct connman_network *network)
1577 DBG("network %p", network);
1579 if (!network->connected && !network->connecting &&
1580 !network->associating)
1583 if (!network->driver)
1586 network->connecting = false;
1588 if (network->driver->disconnect)
1589 err = network->driver->disconnect(network);
1591 if (err != -EINPROGRESS)
1592 set_disconnected(network);
1597 static int manual_ipv4_set(struct connman_network *network,
1598 struct connman_ipconfig *ipconfig)
1600 struct connman_service *service;
1603 service = connman_service_lookup_from_network(network);
1607 err = __connman_ipconfig_address_add(ipconfig);
1609 connman_network_set_error(network,
1610 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1614 return __connman_ipconfig_gateway_add(ipconfig);
1617 int __connman_network_clear_ipconfig(struct connman_network *network,
1618 struct connman_ipconfig *ipconfig)
1620 struct connman_service *service;
1621 struct connman_ipconfig *ipconfig_ipv4;
1622 enum connman_ipconfig_method method;
1623 enum connman_ipconfig_type type;
1625 service = connman_service_lookup_from_network(network);
1629 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1630 method = __connman_ipconfig_get_method(ipconfig);
1631 type = __connman_ipconfig_get_config_type(ipconfig);
1634 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1635 case CONNMAN_IPCONFIG_METHOD_OFF:
1636 case CONNMAN_IPCONFIG_METHOD_FIXED:
1638 case CONNMAN_IPCONFIG_METHOD_AUTO:
1639 release_dhcpv6(network);
1641 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1642 __connman_ipconfig_address_remove(ipconfig);
1644 case CONNMAN_IPCONFIG_METHOD_DHCP:
1645 __connman_dhcp_stop(ipconfig_ipv4);
1649 if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
1650 __connman_service_ipconfig_indicate_state(service,
1651 CONNMAN_SERVICE_STATE_CONFIGURATION,
1652 CONNMAN_IPCONFIG_TYPE_IPV6);
1653 else if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
1654 __connman_service_ipconfig_indicate_state(service,
1655 CONNMAN_SERVICE_STATE_CONFIGURATION,
1656 CONNMAN_IPCONFIG_TYPE_IPV4);
1661 int __connman_network_set_ipconfig(struct connman_network *network,
1662 struct connman_ipconfig *ipconfig_ipv4,
1663 struct connman_ipconfig *ipconfig_ipv6)
1665 enum connman_ipconfig_method method;
1671 if (ipconfig_ipv6) {
1672 method = __connman_ipconfig_get_method(ipconfig_ipv6);
1675 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1676 case CONNMAN_IPCONFIG_METHOD_OFF:
1678 case CONNMAN_IPCONFIG_METHOD_AUTO:
1679 autoconf_ipv6_set(network);
1681 case CONNMAN_IPCONFIG_METHOD_FIXED:
1682 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1683 ret = manual_ipv6_set(network, ipconfig_ipv6);
1685 connman_network_set_error(network,
1686 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1690 case CONNMAN_IPCONFIG_METHOD_DHCP:
1695 if (ipconfig_ipv4) {
1696 method = __connman_ipconfig_get_method(ipconfig_ipv4);
1699 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1700 case CONNMAN_IPCONFIG_METHOD_OFF:
1701 case CONNMAN_IPCONFIG_METHOD_FIXED:
1702 case CONNMAN_IPCONFIG_METHOD_AUTO:
1704 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1705 return manual_ipv4_set(network, ipconfig_ipv4);
1706 case CONNMAN_IPCONFIG_METHOD_DHCP:
1707 return __connman_dhcp_start(ipconfig_ipv4,
1708 network, dhcp_callback, NULL);
1715 int connman_network_set_ipaddress(struct connman_network *network,
1716 struct connman_ipaddress *ipaddress)
1718 struct connman_service *service;
1719 struct connman_ipconfig *ipconfig = NULL;
1721 DBG("network %p", network);
1723 service = connman_service_lookup_from_network(network);
1727 ipconfig = __connman_service_get_ipconfig(service, ipaddress->family);
1731 __connman_ipconfig_set_local(ipconfig, ipaddress->local);
1732 __connman_ipconfig_set_peer(ipconfig, ipaddress->peer);
1733 __connman_ipconfig_set_broadcast(ipconfig, ipaddress->broadcast);
1734 __connman_ipconfig_set_prefixlen(ipconfig, ipaddress->prefixlen);
1735 __connman_ipconfig_set_gateway(ipconfig, ipaddress->gateway);
1740 int connman_network_set_nameservers(struct connman_network *network,
1741 const char *nameservers)
1743 struct connman_service *service;
1744 char **nameservers_array;
1747 DBG("network %p nameservers %s", network, nameservers);
1749 service = connman_service_lookup_from_network(network);
1753 __connman_service_nameserver_clear(service);
1758 nameservers_array = g_strsplit(nameservers, " ", 0);
1760 for (i = 0; nameservers_array[i]; i++) {
1761 __connman_service_nameserver_append(service,
1762 nameservers_array[i], false);
1765 g_strfreev(nameservers_array);
1770 int connman_network_set_domain(struct connman_network *network,
1773 struct connman_service *service;
1775 DBG("network %p domain %s", network, domain);
1777 service = connman_service_lookup_from_network(network);
1781 __connman_service_set_domainname(service, domain);
1787 * connman_network_set_name:
1788 * @network: network structure
1791 * Set display name value for network
1793 int connman_network_set_name(struct connman_network *network,
1796 DBG("network %p name %s", network, name);
1798 g_free(network->name);
1799 network->name = g_strdup(name);
1805 * connman_network_set_strength:
1806 * @network: network structure
1807 * @strength: strength value
1809 * Set signal strength value for network
1812 int connman_network_set_strength(struct connman_network *network,
1815 DBG("network %p strengh %d", network, strength);
1817 network->strength = strength;
1822 uint8_t connman_network_get_strength(struct connman_network *network)
1824 return network->strength;
1827 int connman_network_set_frequency(struct connman_network *network,
1830 DBG("network %p frequency %d", network, frequency);
1832 network->frequency = frequency;
1837 uint16_t connman_network_get_frequency(struct connman_network *network)
1839 return network->frequency;
1842 int connman_network_set_wifi_channel(struct connman_network *network,
1845 DBG("network %p wifi channel %d", network, channel);
1847 network->wifi.channel = channel;
1852 uint16_t connman_network_get_wifi_channel(struct connman_network *network)
1854 return network->wifi.channel;
1858 * connman_network_set_string:
1859 * @network: network structure
1860 * @key: unique identifier
1861 * @value: string value
1863 * Set string value for specific key
1865 int connman_network_set_string(struct connman_network *network,
1866 const char *key, const char *value)
1868 DBG("network %p key %s value %s", network, key, value);
1870 if (g_strcmp0(key, "Name") == 0)
1871 return connman_network_set_name(network, value);
1873 if (g_str_equal(key, "Path")) {
1874 g_free(network->path);
1875 network->path = g_strdup(value);
1876 } else if (g_str_equal(key, "Node")) {
1877 g_free(network->node);
1878 network->node = g_strdup(value);
1879 } else if (g_str_equal(key, "WiFi.Mode")) {
1880 g_free(network->wifi.mode);
1881 network->wifi.mode = g_strdup(value);
1882 } else if (g_str_equal(key, "WiFi.Security")) {
1883 g_free(network->wifi.security);
1884 network->wifi.security = g_strdup(value);
1885 } else if (g_str_equal(key, "WiFi.Passphrase")) {
1886 g_free(network->wifi.passphrase);
1887 network->wifi.passphrase = g_strdup(value);
1888 } else if (g_str_equal(key, "WiFi.EAP")) {
1889 g_free(network->wifi.eap);
1890 network->wifi.eap = g_strdup(value);
1891 } else if (g_str_equal(key, "WiFi.Identity")) {
1892 g_free(network->wifi.identity);
1893 network->wifi.identity = g_strdup(value);
1894 } else if (g_str_equal(key, "WiFi.AgentIdentity")) {
1895 g_free(network->wifi.agent_identity);
1896 network->wifi.agent_identity = g_strdup(value);
1897 } else if (g_str_equal(key, "WiFi.CACertFile")) {
1898 g_free(network->wifi.ca_cert_path);
1899 network->wifi.ca_cert_path = g_strdup(value);
1900 } else if (g_str_equal(key, "WiFi.ClientCertFile")) {
1901 g_free(network->wifi.client_cert_path);
1902 network->wifi.client_cert_path = g_strdup(value);
1903 } else if (g_str_equal(key, "WiFi.PrivateKeyFile")) {
1904 g_free(network->wifi.private_key_path);
1905 network->wifi.private_key_path = g_strdup(value);
1906 } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase")) {
1907 g_free(network->wifi.private_key_passphrase);
1908 network->wifi.private_key_passphrase = g_strdup(value);
1909 } else if (g_str_equal(key, "WiFi.Phase2")) {
1910 g_free(network->wifi.phase2_auth);
1911 network->wifi.phase2_auth = g_strdup(value);
1912 } else if (g_str_equal(key, "WiFi.PinWPS")) {
1913 g_free(network->wifi.pin_wps);
1914 network->wifi.pin_wps = g_strdup(value);
1923 * connman_network_get_string:
1924 * @network: network structure
1925 * @key: unique identifier
1927 * Get string value for specific key
1929 const char *connman_network_get_string(struct connman_network *network,
1932 DBG("network %p key %s", network, key);
1934 if (g_str_equal(key, "Path"))
1935 return network->path;
1936 else if (g_str_equal(key, "Name"))
1937 return network->name;
1938 else if (g_str_equal(key, "Node"))
1939 return network->node;
1940 else if (g_str_equal(key, "WiFi.Mode"))
1941 return network->wifi.mode;
1942 else if (g_str_equal(key, "WiFi.Security"))
1943 return network->wifi.security;
1944 else if (g_str_equal(key, "WiFi.Passphrase"))
1945 return network->wifi.passphrase;
1946 else if (g_str_equal(key, "WiFi.EAP"))
1947 return network->wifi.eap;
1948 else if (g_str_equal(key, "WiFi.Identity"))
1949 return network->wifi.identity;
1950 else if (g_str_equal(key, "WiFi.AgentIdentity"))
1951 return network->wifi.agent_identity;
1952 else if (g_str_equal(key, "WiFi.CACertFile"))
1953 return network->wifi.ca_cert_path;
1954 else if (g_str_equal(key, "WiFi.ClientCertFile"))
1955 return network->wifi.client_cert_path;
1956 else if (g_str_equal(key, "WiFi.PrivateKeyFile"))
1957 return network->wifi.private_key_path;
1958 else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase"))
1959 return network->wifi.private_key_passphrase;
1960 else if (g_str_equal(key, "WiFi.Phase2"))
1961 return network->wifi.phase2_auth;
1962 else if (g_str_equal(key, "WiFi.PinWPS"))
1963 return network->wifi.pin_wps;
1969 * connman_network_set_bool:
1970 * @network: network structure
1971 * @key: unique identifier
1972 * @value: boolean value
1974 * Set boolean value for specific key
1976 int connman_network_set_bool(struct connman_network *network,
1977 const char *key, bool value)
1979 DBG("network %p key %s value %d", network, key, value);
1981 if (g_strcmp0(key, "Roaming") == 0)
1982 network->roaming = value;
1983 else if (g_strcmp0(key, "WiFi.WPS") == 0)
1984 network->wifi.wps = value;
1985 else if (g_strcmp0(key, "WiFi.UseWPS") == 0)
1986 network->wifi.use_wps = value;
1992 * connman_network_get_bool:
1993 * @network: network structure
1994 * @key: unique identifier
1996 * Get boolean value for specific key
1998 bool connman_network_get_bool(struct connman_network *network,
2001 DBG("network %p key %s", network, key);
2003 if (g_str_equal(key, "Roaming"))
2004 return network->roaming;
2005 else if (g_str_equal(key, "WiFi.WPS"))
2006 return network->wifi.wps;
2007 else if (g_str_equal(key, "WiFi.UseWPS"))
2008 return network->wifi.use_wps;
2014 * connman_network_set_blob:
2015 * @network: network structure
2016 * @key: unique identifier
2020 * Set binary blob value for specific key
2022 int connman_network_set_blob(struct connman_network *network,
2023 const char *key, const void *data, unsigned int size)
2025 DBG("network %p key %s size %d", network, key, size);
2027 if (g_str_equal(key, "WiFi.SSID")) {
2028 g_free(network->wifi.ssid);
2029 network->wifi.ssid = g_try_malloc(size);
2030 if (network->wifi.ssid) {
2031 memcpy(network->wifi.ssid, data, size);
2032 network->wifi.ssid_len = size;
2034 network->wifi.ssid_len = 0;
2043 * connman_network_get_blob:
2044 * @network: network structure
2045 * @key: unique identifier
2046 * @size: pointer to blob size
2048 * Get binary blob value for specific key
2050 const void *connman_network_get_blob(struct connman_network *network,
2051 const char *key, unsigned int *size)
2053 DBG("network %p key %s", network, key);
2055 if (g_str_equal(key, "WiFi.SSID")) {
2057 *size = network->wifi.ssid_len;
2058 return network->wifi.ssid;
2064 void __connman_network_set_device(struct connman_network *network,
2065 struct connman_device *device)
2067 if (network->device == device)
2070 if (network->device)
2071 network_remove(network);
2073 network->device = device;
2075 if (network->device)
2076 network_probe(network);
2080 * connman_network_get_device:
2081 * @network: network structure
2083 * Get parent device of network
2085 struct connman_device *connman_network_get_device(struct connman_network *network)
2087 return network->device;
2091 * connman_network_get_data:
2092 * @network: network structure
2094 * Get private network data pointer
2096 void *connman_network_get_data(struct connman_network *network)
2098 return network->driver_data;
2102 * connman_network_set_data:
2103 * @network: network structure
2104 * @data: data pointer
2106 * Set private network data pointer
2108 void connman_network_set_data(struct connman_network *network, void *data)
2110 network->driver_data = data;
2113 void connman_network_update(struct connman_network *network)
2115 switch (network->type) {
2116 case CONNMAN_NETWORK_TYPE_UNKNOWN:
2117 case CONNMAN_NETWORK_TYPE_VENDOR:
2119 case CONNMAN_NETWORK_TYPE_ETHERNET:
2120 case CONNMAN_NETWORK_TYPE_GADGET:
2121 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
2122 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
2123 case CONNMAN_NETWORK_TYPE_CELLULAR:
2124 case CONNMAN_NETWORK_TYPE_WIFI:
2129 __connman_service_update_from_network(network);
2132 int __connman_network_init(void)
2139 void __connman_network_cleanup(void)