5 * Copyright (C) 2007-2012 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;
50 connman_bool_t available;
51 connman_bool_t connected;
52 connman_bool_t roaming;
53 connman_uint8_t strength;
54 connman_uint16_t frequency;
61 int router_solicit_count;
62 int router_solicit_refresh_count;
64 struct connman_network_driver *driver;
67 connman_bool_t connecting;
68 connman_bool_t associating;
70 struct connman_device *device;
76 unsigned short channel;
79 char *agent_passphrase;
84 char *client_cert_path;
85 char *private_key_path;
86 char *private_key_passphrase;
89 connman_bool_t use_wps;
95 static const char *type2string(enum connman_network_type type)
98 case CONNMAN_NETWORK_TYPE_UNKNOWN:
99 case CONNMAN_NETWORK_TYPE_VENDOR:
101 case CONNMAN_NETWORK_TYPE_ETHERNET:
103 case CONNMAN_NETWORK_TYPE_WIFI:
105 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
106 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
108 case CONNMAN_NETWORK_TYPE_CELLULAR:
115 static gboolean match_driver(struct connman_network *network,
116 struct connman_network_driver *driver)
118 if (network->type == driver->type ||
119 driver->type == CONNMAN_NETWORK_TYPE_UNKNOWN)
125 static int network_probe(struct connman_network *network)
128 struct connman_network_driver *driver = NULL;
130 DBG("network %p name %s", network, network->name);
132 if (network->driver != NULL)
135 for (list = driver_list; list; list = list->next) {
138 if (match_driver(network, driver) == FALSE)
141 DBG("driver %p name %s", driver, driver->name);
143 if (driver->probe(network) == 0)
152 if (network->group == NULL)
155 switch (network->type) {
156 case CONNMAN_NETWORK_TYPE_UNKNOWN:
157 case CONNMAN_NETWORK_TYPE_VENDOR:
159 case CONNMAN_NETWORK_TYPE_ETHERNET:
160 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
161 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
162 case CONNMAN_NETWORK_TYPE_CELLULAR:
163 case CONNMAN_NETWORK_TYPE_WIFI:
164 network->driver = driver;
165 if (__connman_service_create_from_network(network) == NULL) {
166 network->driver = NULL;
174 static void network_remove(struct connman_network *network)
176 DBG("network %p name %s", network, network->name);
178 if (network->driver == NULL)
181 connman_network_set_connected(network, FALSE);
183 switch (network->type) {
184 case CONNMAN_NETWORK_TYPE_UNKNOWN:
185 case CONNMAN_NETWORK_TYPE_VENDOR:
187 case CONNMAN_NETWORK_TYPE_ETHERNET:
188 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
189 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
190 case CONNMAN_NETWORK_TYPE_CELLULAR:
191 case CONNMAN_NETWORK_TYPE_WIFI:
192 if (network->group != NULL) {
193 __connman_service_remove_from_network(network);
195 g_free(network->group);
196 network->group = NULL;
201 if (network->driver->remove)
202 network->driver->remove(network);
204 network->driver = NULL;
207 static void network_change(struct connman_network *network)
209 DBG("network %p name %s", network, network->name);
211 if (network->connected == FALSE)
214 connman_device_set_disconnected(network->device, TRUE);
216 if (network->driver && network->driver->disconnect) {
217 network->driver->disconnect(network);
221 network->connected = FALSE;
224 static void probe_driver(struct connman_network_driver *driver)
228 DBG("driver %p name %s", driver, driver->name);
230 for (list = network_list; list != NULL; list = list->next) {
231 struct connman_network *network = list->data;
233 if (network->driver != NULL)
236 if (driver->type != network->type)
239 if (driver->probe(network) < 0)
242 network->driver = driver;
246 static void remove_driver(struct connman_network_driver *driver)
250 DBG("driver %p name %s", driver, driver->name);
252 for (list = network_list; list != NULL; list = list->next) {
253 struct connman_network *network = list->data;
255 if (network->driver == driver)
256 network_remove(network);
260 static gint compare_priority(gconstpointer a, gconstpointer b)
262 const struct connman_network_driver *driver1 = a;
263 const struct connman_network_driver *driver2 = b;
265 return driver2->priority - driver1->priority;
269 * connman_network_driver_register:
270 * @driver: network driver definition
272 * Register a new network driver
274 * Returns: %0 on success
276 int connman_network_driver_register(struct connman_network_driver *driver)
280 DBG("driver %p name %s", driver, driver->name);
282 for (list = driver_list; list; list = list->next) {
283 struct connman_network_driver *tmp = list->data;
285 if (tmp->type == driver->type)
290 driver_list = g_slist_insert_sorted(driver_list, driver,
293 probe_driver(driver);
299 * connman_network_driver_unregister:
300 * @driver: network driver definition
302 * Remove a previously registered network driver
304 void connman_network_driver_unregister(struct connman_network_driver *driver)
306 DBG("driver %p name %s", driver, driver->name);
308 driver_list = g_slist_remove(driver_list, driver);
310 remove_driver(driver);
313 static void network_destruct(struct connman_network *network)
315 DBG("network %p name %s", network, network->name);
317 g_free(network->wifi.ssid);
318 g_free(network->wifi.mode);
319 g_free(network->wifi.security);
320 g_free(network->wifi.passphrase);
321 g_free(network->wifi.agent_passphrase);
322 g_free(network->wifi.eap);
323 g_free(network->wifi.identity);
324 g_free(network->wifi.agent_identity);
325 g_free(network->wifi.ca_cert_path);
326 g_free(network->wifi.client_cert_path);
327 g_free(network->wifi.private_key_path);
328 g_free(network->wifi.private_key_passphrase);
329 g_free(network->wifi.phase2_auth);
330 g_free(network->wifi.pin_wps);
332 g_free(network->path);
333 g_free(network->group);
334 g_free(network->node);
335 g_free(network->name);
336 g_free(network->identifier);
338 network->device = NULL;
344 * connman_network_create:
345 * @identifier: network identifier (for example an unqiue name)
347 * Allocate a new network and assign the #identifier to it.
349 * Returns: a newly-allocated #connman_network structure
351 struct connman_network *connman_network_create(const char *identifier,
352 enum connman_network_type type)
354 struct connman_network *network;
357 DBG("identifier %s type %d", identifier, type);
359 network = g_try_new0(struct connman_network, 1);
363 DBG("network %p", network);
365 network->refcount = 1;
367 ident = g_strdup(identifier);
374 network->type = type;
375 network->identifier = ident;
377 network_list = g_slist_prepend(network_list, network);
383 * connman_network_ref:
384 * @network: network structure
386 * Increase reference counter of network
388 struct connman_network *
389 connman_network_ref_debug(struct connman_network *network,
390 const char *file, int line, const char *caller)
392 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
393 network->refcount + 1, file, line, caller);
395 __sync_fetch_and_add(&network->refcount, 1);
401 * connman_network_unref:
402 * @network: network structure
404 * Decrease reference counter of network
406 void connman_network_unref_debug(struct connman_network *network,
407 const char *file, int line, const char *caller)
409 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
410 network->refcount - 1, file, line, caller);
412 if (__sync_fetch_and_sub(&network->refcount, 1) != 1)
415 network_list = g_slist_remove(network_list, network);
417 network_destruct(network);
420 const char *__connman_network_get_type(struct connman_network *network)
422 return type2string(network->type);
426 * connman_network_get_type:
427 * @network: network structure
429 * Get type of network
431 enum connman_network_type connman_network_get_type(struct connman_network *network)
433 return network->type;
437 * connman_network_get_identifier:
438 * @network: network structure
440 * Get identifier of network
442 const char *connman_network_get_identifier(struct connman_network *network)
444 return network->identifier;
448 * connman_network_set_index:
449 * @network: network structure
450 * @index: index number
452 * Set index number of network
454 void connman_network_set_index(struct connman_network *network, int index)
456 struct connman_service *service;
457 struct connman_ipconfig *ipconfig;
459 service = connman_service_lookup_from_network(network);
463 ipconfig = __connman_service_get_ip4config(service);
464 if (ipconfig == NULL)
467 /* If index changed, the index of ipconfig must be reset. */
468 __connman_ipconfig_set_index(ipconfig, index);
470 DBG("index %d service %p ip4config %p", network->index,
473 network->index = index;
477 * connman_network_get_index:
478 * @network: network structure
480 * Get index number of network
482 int connman_network_get_index(struct connman_network *network)
484 return network->index;
488 * connman_network_set_group:
489 * @network: network structure
492 * Set group name for automatic clustering
494 void connman_network_set_group(struct connman_network *network,
497 switch (network->type) {
498 case CONNMAN_NETWORK_TYPE_UNKNOWN:
499 case CONNMAN_NETWORK_TYPE_VENDOR:
501 case CONNMAN_NETWORK_TYPE_ETHERNET:
502 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
503 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
504 case CONNMAN_NETWORK_TYPE_CELLULAR:
505 case CONNMAN_NETWORK_TYPE_WIFI:
509 if (g_strcmp0(network->group, group) == 0) {
511 __connman_service_update_from_network(network);
515 if (network->group != NULL) {
516 __connman_service_remove_from_network(network);
518 g_free(network->group);
521 network->group = g_strdup(group);
523 if (network->group != NULL)
524 network_probe(network);
528 * connman_network_get_group:
529 * @network: network structure
531 * Get group name for automatic clustering
533 const char *connman_network_get_group(struct connman_network *network)
535 return network->group;
538 const char *__connman_network_get_ident(struct connman_network *network)
540 if (network->device == NULL)
543 return connman_device_get_ident(network->device);
546 connman_bool_t __connman_network_get_weakness(struct connman_network *network)
548 switch (network->type) {
549 case CONNMAN_NETWORK_TYPE_UNKNOWN:
550 case CONNMAN_NETWORK_TYPE_VENDOR:
551 case CONNMAN_NETWORK_TYPE_ETHERNET:
552 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
553 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
554 case CONNMAN_NETWORK_TYPE_CELLULAR:
556 case CONNMAN_NETWORK_TYPE_WIFI:
557 if (g_strcmp0(network->wifi.mode, "adhoc") == 0)
559 if (network->strength > 0 && network->strength < 20)
567 connman_bool_t connman_network_get_connecting(struct connman_network *network)
569 return network->connecting;
573 * connman_network_set_available:
574 * @network: network structure
575 * @available: availability state
577 * Change availability state of network (in range)
579 int connman_network_set_available(struct connman_network *network,
580 connman_bool_t available)
582 DBG("network %p available %d", network, available);
584 if (network->available == available)
587 network->available = available;
593 * connman_network_get_available:
594 * @network: network structure
596 * Get network available setting
598 connman_bool_t connman_network_get_available(struct connman_network *network)
600 return network->available;
604 * connman_network_set_associating:
605 * @network: network structure
606 * @associating: associating state
608 * Change associating state of network
610 int connman_network_set_associating(struct connman_network *network,
611 connman_bool_t associating)
613 DBG("network %p associating %d", network, associating);
615 if (network->associating == associating)
618 network->associating = associating;
620 if (associating == TRUE) {
621 struct connman_service *service;
623 service = connman_service_lookup_from_network(network);
624 __connman_service_ipconfig_indicate_state(service,
625 CONNMAN_SERVICE_STATE_ASSOCIATION,
626 CONNMAN_IPCONFIG_TYPE_IPV4);
627 __connman_service_ipconfig_indicate_state(service,
628 CONNMAN_SERVICE_STATE_ASSOCIATION,
629 CONNMAN_IPCONFIG_TYPE_IPV6);
635 static void set_associate_error(struct connman_network *network)
637 struct connman_service *service;
639 service = connman_service_lookup_from_network(network);
641 __connman_service_indicate_error(service,
642 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
645 static void set_configure_error(struct connman_network *network)
647 struct connman_service *service;
649 service = connman_service_lookup_from_network(network);
651 __connman_service_indicate_error(service,
652 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
655 static void set_invalid_key_error(struct connman_network *network)
657 struct connman_service *service;
659 service = connman_service_lookup_from_network(network);
661 __connman_service_indicate_error(service,
662 CONNMAN_SERVICE_ERROR_INVALID_KEY);
665 static void set_connect_error(struct connman_network *network)
667 struct connman_service *service;
669 service = connman_service_lookup_from_network(network);
671 __connman_service_indicate_error(service,
672 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
675 void connman_network_set_ipv4_method(struct connman_network *network,
676 enum connman_ipconfig_method method)
678 struct connman_service *service;
679 struct connman_ipconfig *ipconfig;
681 service = connman_service_lookup_from_network(network);
685 ipconfig = __connman_service_get_ip4config(service);
686 if (ipconfig == NULL)
689 __connman_ipconfig_set_method(ipconfig, method);
692 void connman_network_set_ipv6_method(struct connman_network *network,
693 enum connman_ipconfig_method method)
695 struct connman_service *service;
696 struct connman_ipconfig *ipconfig;
698 service = connman_service_lookup_from_network(network);
702 ipconfig = __connman_service_get_ip6config(service);
703 if (ipconfig == NULL)
706 __connman_ipconfig_set_method(ipconfig, method);
709 void connman_network_set_error(struct connman_network *network,
710 enum connman_network_error error)
712 DBG("network %p error %d", network, error);
714 network->connecting = FALSE;
715 network->associating = FALSE;
718 case CONNMAN_NETWORK_ERROR_UNKNOWN:
720 case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
721 set_associate_error(network);
723 case CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL:
724 set_configure_error(network);
726 case CONNMAN_NETWORK_ERROR_INVALID_KEY:
727 set_invalid_key_error(network);
729 case CONNMAN_NETWORK_ERROR_CONNECT_FAIL:
730 set_connect_error(network);
734 network_change(network);
737 void connman_network_clear_error(struct connman_network *network)
739 struct connman_service *service;
741 DBG("network %p", network);
746 if (network->connecting == TRUE || network->associating == TRUE)
749 service = connman_service_lookup_from_network(network);
750 __connman_service_clear_error(service);
753 static void set_configuration(struct connman_network *network,
754 enum connman_ipconfig_type type)
756 struct connman_service *service;
758 DBG("network %p", network);
760 if (network->device == NULL)
763 __connman_device_set_network(network->device, network);
765 connman_device_set_disconnected(network->device, FALSE);
767 service = connman_service_lookup_from_network(network);
768 __connman_service_ipconfig_indicate_state(service,
769 CONNMAN_SERVICE_STATE_CONFIGURATION,
773 static void dhcp_success(struct connman_network *network)
775 struct connman_service *service;
776 struct connman_ipconfig *ipconfig_ipv4;
779 service = connman_service_lookup_from_network(network);
783 connman_network_set_associating(network, FALSE);
785 network->connecting = FALSE;
787 ipconfig_ipv4 = __connman_service_get_ip4config(service);
788 err = __connman_ipconfig_address_add(ipconfig_ipv4);
792 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
799 connman_network_set_error(network,
800 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
803 static void dhcp_failure(struct connman_network *network)
805 struct connman_service *service;
807 service = connman_service_lookup_from_network(network);
811 __connman_service_ipconfig_indicate_state(service,
812 CONNMAN_SERVICE_STATE_IDLE,
813 CONNMAN_IPCONFIG_TYPE_IPV4);
816 static void dhcp_callback(struct connman_network *network,
817 connman_bool_t success)
819 DBG("success %d", success);
822 dhcp_success(network);
824 dhcp_failure(network);
827 static int set_connected_fixed(struct connman_network *network)
829 struct connman_service *service;
830 struct connman_ipconfig *ipconfig_ipv4;
835 service = connman_service_lookup_from_network(network);
837 ipconfig_ipv4 = __connman_service_get_ip4config(service);
839 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
841 network->connecting = FALSE;
843 connman_network_set_associating(network, FALSE);
845 err = __connman_ipconfig_address_add(ipconfig_ipv4);
849 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
856 connman_network_set_error(network,
857 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
862 static void set_connected_manual(struct connman_network *network)
864 struct connman_service *service;
865 struct connman_ipconfig *ipconfig;
868 DBG("network %p", network);
870 service = connman_service_lookup_from_network(network);
872 ipconfig = __connman_service_get_ip4config(service);
874 if (__connman_ipconfig_get_local(ipconfig) == NULL)
875 __connman_service_read_ip4config(service);
877 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
879 err = __connman_ipconfig_address_add(ipconfig);
883 err = __connman_ipconfig_gateway_add(ipconfig);
887 network->connecting = FALSE;
889 connman_network_set_associating(network, FALSE);
894 connman_network_set_error(network,
895 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
899 static int set_connected_dhcp(struct connman_network *network)
903 DBG("network %p", network);
905 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
907 err = __connman_dhcp_start(network, dhcp_callback);
909 connman_error("Can not request DHCP lease");
916 static int manual_ipv6_set(struct connman_network *network,
917 struct connman_ipconfig *ipconfig_ipv6)
919 struct connman_service *service;
922 DBG("network %p ipv6 %p", network, ipconfig_ipv6);
924 service = connman_service_lookup_from_network(network);
928 if (__connman_ipconfig_get_local(ipconfig_ipv6) == NULL)
929 __connman_service_read_ip6config(service);
931 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
933 err = __connman_ipconfig_address_add(ipconfig_ipv6);
935 connman_network_set_error(network,
936 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
940 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
944 __connman_connection_gateway_activate(service,
945 CONNMAN_IPCONFIG_TYPE_IPV6);
947 __connman_device_set_network(network->device, network);
949 connman_device_set_disconnected(network->device, FALSE);
951 network->connecting = FALSE;
956 static void stop_dhcpv6(struct connman_network *network)
958 __connman_dhcpv6_stop(network);
961 static void dhcpv6_release_callback(struct connman_network *network,
962 connman_bool_t success)
964 DBG("success %d", success);
966 stop_dhcpv6(network);
969 static void release_dhcpv6(struct connman_network *network)
971 __connman_dhcpv6_start_release(network, dhcpv6_release_callback);
972 stop_dhcpv6(network);
975 static void dhcpv6_info_callback(struct connman_network *network,
976 connman_bool_t success)
978 DBG("success %d", success);
980 stop_dhcpv6(network);
983 static gboolean dhcpv6_set_addresses(struct connman_network *network)
985 struct connman_service *service;
986 struct connman_ipconfig *ipconfig_ipv6;
989 service = connman_service_lookup_from_network(network);
993 connman_network_set_associating(network, FALSE);
995 network->connecting = FALSE;
997 ipconfig_ipv6 = __connman_service_get_ip6config(service);
998 err = __connman_ipconfig_address_add(ipconfig_ipv6);
1002 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
1009 connman_network_set_error(network,
1010 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1014 static void autoconf_ipv6_set(struct connman_network *network);
1015 static void dhcpv6_callback(struct connman_network *network,
1016 connman_bool_t success);
1019 * Have a separate callback for renew so that we do not do autoconf
1020 * in wrong phase as the dhcpv6_callback() is also called when doing
1021 * DHCPv6 solicitation.
1023 static void dhcpv6_renew_callback(struct connman_network *network,
1024 connman_bool_t success)
1026 if (success == TRUE)
1027 dhcpv6_callback(network, success);
1029 stop_dhcpv6(network);
1031 /* restart and do solicit again. */
1032 autoconf_ipv6_set(network);
1036 static void dhcpv6_callback(struct connman_network *network,
1037 connman_bool_t success)
1039 DBG("success %d", success);
1041 /* Start the renew process if necessary */
1042 if (success == TRUE) {
1044 if (dhcpv6_set_addresses(network) < 0) {
1045 stop_dhcpv6(network);
1049 if (__connman_dhcpv6_start_renew(network,
1050 dhcpv6_renew_callback) == -ETIMEDOUT)
1051 dhcpv6_renew_callback(network, FALSE);
1053 stop_dhcpv6(network);
1056 static void check_dhcpv6(struct nd_router_advert *reply,
1057 unsigned int length, void *user_data)
1059 struct connman_network *network = user_data;
1062 DBG("reply %p", reply);
1064 if (reply == NULL) {
1066 * Router solicitation message seem to get lost easily so
1067 * try to send it again.
1069 if (network->router_solicit_count > 0) {
1070 DBG("re-send router solicitation %d",
1071 network->router_solicit_count);
1072 network->router_solicit_count--;
1073 __connman_inet_ipv6_send_rs(network->index, 1,
1074 check_dhcpv6, network);
1077 connman_network_unref(network);
1081 network->router_solicit_count = 0;
1084 * If we were disconnected while waiting router advertisement,
1085 * we just quit and do not start DHCPv6
1087 if (network->connected == FALSE) {
1088 connman_network_unref(network);
1092 prefixes = __connman_inet_ipv6_get_prefixes(reply, length);
1095 * We do stateful/stateless DHCPv6 if router advertisement says so.
1097 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED)
1098 __connman_dhcpv6_start(network, prefixes, dhcpv6_callback);
1099 else if (reply->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
1100 __connman_dhcpv6_start_info(network, dhcpv6_info_callback);
1102 connman_network_unref(network);
1105 static void receive_refresh_rs_reply(struct nd_router_advert *reply,
1106 unsigned int length, void *user_data)
1108 struct connman_network *network = user_data;
1110 DBG("reply %p", reply);
1112 if (reply == NULL) {
1114 * Router solicitation message seem to get lost easily so
1115 * try to send it again.
1117 if (network->router_solicit_refresh_count > 1) {
1118 network->router_solicit_refresh_count--;
1119 DBG("re-send router solicitation %d",
1120 network->router_solicit_refresh_count);
1121 __connman_inet_ipv6_send_rs(network->index,
1123 receive_refresh_rs_reply,
1129 /* RS refresh not in progress anymore */
1130 network->router_solicit_refresh_count = 0;
1132 connman_network_unref(network);
1136 int __connman_refresh_rs_ipv6(struct connman_network *network, int index)
1140 DBG("network %p index %d", network, index);
1142 /* Send only one RS for all RDNSS entries which are about to expire */
1143 if (network->router_solicit_refresh_count > 0) {
1144 DBG("RS refresh already started");
1148 network->router_solicit_refresh_count = RS_REFRESH_COUNT;
1150 connman_network_ref(network);
1152 ret = __connman_inet_ipv6_send_rs(index, RS_REFRESH_TIMEOUT,
1153 receive_refresh_rs_reply, network);
1157 static void autoconf_ipv6_set(struct connman_network *network)
1159 struct connman_service *service;
1160 struct connman_ipconfig *ipconfig;
1163 DBG("network %p", network);
1165 if (network->router_solicit_count > 0) {
1167 * The autoconfiguration is already pending and we have sent
1168 * router solicitation messages and are now waiting answers.
1169 * There is no need to continue any further.
1171 DBG("autoconfiguration already started");
1175 __connman_device_set_network(network->device, network);
1177 connman_device_set_disconnected(network->device, FALSE);
1179 network->connecting = FALSE;
1181 service = connman_service_lookup_from_network(network);
1182 if (service == NULL)
1185 ipconfig = __connman_service_get_ip6config(service);
1186 if (ipconfig == NULL)
1189 index = __connman_ipconfig_get_index(ipconfig);
1191 connman_network_ref(network);
1193 /* Try to get stateless DHCPv6 information, RFC 3736 */
1194 network->router_solicit_count = 3;
1195 __connman_inet_ipv6_send_rs(index, 1, check_dhcpv6, network);
1198 static void set_connected(struct connman_network *network)
1200 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
1201 enum connman_ipconfig_method ipv4_method, ipv6_method;
1202 struct connman_service *service;
1205 if (network->connected == TRUE)
1208 network->connected = TRUE;
1210 service = connman_service_lookup_from_network(network);
1212 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1213 ipconfig_ipv6 = __connman_service_get_ip6config(service);
1215 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
1218 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
1219 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
1221 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
1223 switch (ipv6_method) {
1224 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1225 case CONNMAN_IPCONFIG_METHOD_OFF:
1227 case CONNMAN_IPCONFIG_METHOD_DHCP:
1228 case CONNMAN_IPCONFIG_METHOD_AUTO:
1229 autoconf_ipv6_set(network);
1231 case CONNMAN_IPCONFIG_METHOD_FIXED:
1232 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1233 ret = manual_ipv6_set(network, ipconfig_ipv6);
1235 connman_network_set_error(network,
1236 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1242 switch (ipv4_method) {
1243 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1244 case CONNMAN_IPCONFIG_METHOD_OFF:
1245 case CONNMAN_IPCONFIG_METHOD_AUTO:
1247 case CONNMAN_IPCONFIG_METHOD_FIXED:
1248 if (set_connected_fixed(network) < 0) {
1249 connman_network_set_error(network,
1250 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1254 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1255 set_connected_manual(network);
1257 case CONNMAN_IPCONFIG_METHOD_DHCP:
1258 if (set_connected_dhcp(network) < 0) {
1259 connman_network_set_error(network,
1260 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1265 network->connecting = FALSE;
1267 connman_network_set_associating(network, FALSE);
1270 static void set_disconnected(struct connman_network *network)
1272 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
1273 enum connman_ipconfig_method ipv4_method, ipv6_method;
1274 enum connman_service_state state;
1275 struct connman_service *service;
1277 if (network->connected == FALSE)
1280 network->connected = FALSE;
1282 service = connman_service_lookup_from_network(network);
1284 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1285 ipconfig_ipv6 = __connman_service_get_ip6config(service);
1287 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
1290 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
1291 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
1293 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
1296 * Resetting solicit count here will prevent the RS resend loop
1297 * from sending packets in check_dhcpv6()
1299 network->router_solicit_count = 0;
1301 __connman_device_set_network(network->device, NULL);
1303 switch (ipv6_method) {
1304 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1305 case CONNMAN_IPCONFIG_METHOD_OFF:
1306 case CONNMAN_IPCONFIG_METHOD_FIXED:
1307 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1309 case CONNMAN_IPCONFIG_METHOD_DHCP:
1310 case CONNMAN_IPCONFIG_METHOD_AUTO:
1311 release_dhcpv6(network);
1315 switch (ipv4_method) {
1316 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1317 case CONNMAN_IPCONFIG_METHOD_OFF:
1318 case CONNMAN_IPCONFIG_METHOD_AUTO:
1319 case CONNMAN_IPCONFIG_METHOD_FIXED:
1320 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1322 case CONNMAN_IPCONFIG_METHOD_DHCP:
1323 __connman_dhcp_stop(network);
1328 * We only set the disconnect state if we were not in idle
1329 * or in failure. It does not make sense to go to disconnect
1330 * state if we were not connected.
1332 state = __connman_service_ipconfig_get_state(service,
1333 CONNMAN_IPCONFIG_TYPE_IPV4);
1334 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1335 state != CONNMAN_SERVICE_STATE_FAILURE)
1336 __connman_service_ipconfig_indicate_state(service,
1337 CONNMAN_SERVICE_STATE_DISCONNECT,
1338 CONNMAN_IPCONFIG_TYPE_IPV4);
1340 state = __connman_service_ipconfig_get_state(service,
1341 CONNMAN_IPCONFIG_TYPE_IPV6);
1342 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1343 state != CONNMAN_SERVICE_STATE_FAILURE)
1344 __connman_service_ipconfig_indicate_state(service,
1345 CONNMAN_SERVICE_STATE_DISCONNECT,
1346 CONNMAN_IPCONFIG_TYPE_IPV6);
1348 __connman_connection_gateway_remove(service,
1349 CONNMAN_IPCONFIG_TYPE_ALL);
1351 __connman_ipconfig_address_unset(ipconfig_ipv4);
1352 __connman_ipconfig_address_unset(ipconfig_ipv6);
1355 * Special handling for IPv6 autoconfigured address.
1356 * The simplest way to remove autoconfigured routes is to
1357 * disable IPv6 temporarily so that kernel will do the cleanup
1360 if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
1361 __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
1362 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
1365 __connman_service_ipconfig_indicate_state(service,
1366 CONNMAN_SERVICE_STATE_IDLE,
1367 CONNMAN_IPCONFIG_TYPE_IPV4);
1369 __connman_service_ipconfig_indicate_state(service,
1370 CONNMAN_SERVICE_STATE_IDLE,
1371 CONNMAN_IPCONFIG_TYPE_IPV6);
1373 network->connecting = FALSE;
1375 connman_network_set_associating(network, FALSE);
1379 * connman_network_set_connected:
1380 * @network: network structure
1381 * @connected: connected state
1383 * Change connected state of network
1385 int connman_network_set_connected(struct connman_network *network,
1386 connman_bool_t connected)
1388 DBG("network %p connected %d/%d connecting %d associating %d",
1389 network, network->connected, connected, network->connecting,
1390 network->associating);
1392 if ((network->connecting == TRUE || network->associating == TRUE) &&
1393 connected == FALSE) {
1394 connman_network_set_error(network,
1395 CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
1396 if (__connman_network_disconnect(network) == 0)
1400 if (network->connected == connected)
1403 if (connected == FALSE)
1404 set_disconnected(network);
1406 set_connected(network);
1412 * connman_network_get_connected:
1413 * @network: network structure
1415 * Get network connection status
1417 connman_bool_t connman_network_get_connected(struct connman_network *network)
1419 return network->connected;
1423 * connman_network_get_associating:
1424 * @network: network structure
1426 * Get network associating status
1428 connman_bool_t connman_network_get_associating(struct connman_network *network)
1430 return network->associating;
1433 void connman_network_clear_hidden(void *user_data)
1435 if (user_data == NULL)
1438 DBG("user_data %p", user_data);
1441 * Hidden service does not have a connect timeout so
1442 * we do not need to remove it. We can just return
1443 * error to the caller telling that we could not find
1444 * any network that we could connect to.
1446 __connman_service_reply_dbus_pending(user_data, EIO, NULL);
1449 int connman_network_connect_hidden(struct connman_network *network,
1450 char *identity, char* passphrase, void *user_data)
1453 struct connman_service *service;
1455 service = connman_service_lookup_from_network(network);
1457 DBG("network %p service %p user_data %p", network, service, user_data);
1459 if (service == NULL) {
1464 if (identity != NULL)
1465 __connman_service_set_agent_identity(service, identity);
1467 if (passphrase != NULL)
1468 err = __connman_service_add_passphrase(service, passphrase);
1470 if (err == -ENOKEY) {
1471 __connman_service_indicate_error(service,
1472 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1475 __connman_service_set_hidden(service);
1476 __connman_service_set_userconnect(service, TRUE);
1477 __connman_service_set_hidden_data(service, user_data);
1478 return __connman_service_connect(service);
1482 __connman_service_return_error(service, -err, user_data);
1487 * __connman_network_connect:
1488 * @network: network structure
1492 int __connman_network_connect(struct connman_network *network)
1496 DBG("network %p", network);
1498 if (network->connected == TRUE)
1501 if (network->connecting == TRUE || network->associating == TRUE)
1504 if (network->driver == NULL)
1507 if (network->driver->connect == NULL)
1510 if (network->device == NULL)
1513 network->connecting = TRUE;
1515 __connman_device_disconnect(network->device);
1517 err = network->driver->connect(network);
1519 if (err == -EINPROGRESS)
1520 connman_network_set_associating(network, TRUE);
1522 network->connecting = FALSE;
1528 set_connected(network);
1534 * __connman_network_disconnect:
1535 * @network: network structure
1537 * Disconnect network
1539 int __connman_network_disconnect(struct connman_network *network)
1543 DBG("network %p", network);
1545 if (network->connected == FALSE && network->connecting == FALSE &&
1546 network->associating == FALSE)
1549 if (network->driver == NULL)
1552 if (network->driver->disconnect == NULL)
1555 network->connecting = FALSE;
1557 err = network->driver->disconnect(network);
1559 set_disconnected(network);
1564 static int manual_ipv4_set(struct connman_network *network,
1565 struct connman_ipconfig *ipconfig)
1567 struct connman_service *service;
1570 service = connman_service_lookup_from_network(network);
1571 if (service == NULL)
1574 err = __connman_ipconfig_address_add(ipconfig);
1576 connman_network_set_error(network,
1577 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1581 return __connman_ipconfig_gateway_add(ipconfig);
1584 int __connman_network_clear_ipconfig(struct connman_network *network,
1585 struct connman_ipconfig *ipconfig)
1587 struct connman_service *service;
1588 enum connman_ipconfig_method method;
1589 enum connman_ipconfig_type type;
1591 service = connman_service_lookup_from_network(network);
1592 if (service == NULL)
1595 method = __connman_ipconfig_get_method(ipconfig);
1596 type = __connman_ipconfig_get_config_type(ipconfig);
1599 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1600 case CONNMAN_IPCONFIG_METHOD_OFF:
1601 case CONNMAN_IPCONFIG_METHOD_FIXED:
1603 case CONNMAN_IPCONFIG_METHOD_AUTO:
1604 release_dhcpv6(network);
1606 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1607 __connman_ipconfig_address_remove(ipconfig);
1609 case CONNMAN_IPCONFIG_METHOD_DHCP:
1610 __connman_dhcp_stop(network);
1614 if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
1615 __connman_service_ipconfig_indicate_state(service,
1616 CONNMAN_SERVICE_STATE_CONFIGURATION,
1617 CONNMAN_IPCONFIG_TYPE_IPV6);
1618 else if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
1619 __connman_service_ipconfig_indicate_state(service,
1620 CONNMAN_SERVICE_STATE_CONFIGURATION,
1621 CONNMAN_IPCONFIG_TYPE_IPV4);
1626 int __connman_network_set_ipconfig(struct connman_network *network,
1627 struct connman_ipconfig *ipconfig_ipv4,
1628 struct connman_ipconfig *ipconfig_ipv6)
1630 enum connman_ipconfig_method method;
1633 if (network == NULL)
1636 if (ipconfig_ipv6) {
1637 method = __connman_ipconfig_get_method(ipconfig_ipv6);
1640 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1641 case CONNMAN_IPCONFIG_METHOD_OFF:
1643 case CONNMAN_IPCONFIG_METHOD_AUTO:
1644 autoconf_ipv6_set(network);
1646 case CONNMAN_IPCONFIG_METHOD_FIXED:
1647 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1648 ret = manual_ipv6_set(network, ipconfig_ipv6);
1650 connman_network_set_error(network,
1651 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1655 case CONNMAN_IPCONFIG_METHOD_DHCP:
1660 if (ipconfig_ipv4) {
1661 method = __connman_ipconfig_get_method(ipconfig_ipv4);
1664 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1665 case CONNMAN_IPCONFIG_METHOD_OFF:
1666 case CONNMAN_IPCONFIG_METHOD_FIXED:
1667 case CONNMAN_IPCONFIG_METHOD_AUTO:
1669 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1670 return manual_ipv4_set(network, ipconfig_ipv4);
1671 case CONNMAN_IPCONFIG_METHOD_DHCP:
1672 return __connman_dhcp_start(network, dhcp_callback);
1679 int connman_network_set_ipaddress(struct connman_network *network,
1680 struct connman_ipaddress *ipaddress)
1682 struct connman_service *service;
1683 struct connman_ipconfig *ipconfig = NULL;
1685 DBG("network %p", network);
1687 service = connman_service_lookup_from_network(network);
1688 if (service == NULL)
1691 ipconfig = __connman_service_get_ipconfig(service, ipaddress->family);
1692 if (ipconfig == NULL)
1695 __connman_ipconfig_set_local(ipconfig, ipaddress->local);
1696 __connman_ipconfig_set_peer(ipconfig, ipaddress->peer);
1697 __connman_ipconfig_set_broadcast(ipconfig, ipaddress->broadcast);
1698 __connman_ipconfig_set_prefixlen(ipconfig, ipaddress->prefixlen);
1699 __connman_ipconfig_set_gateway(ipconfig, ipaddress->gateway);
1704 int connman_network_set_nameservers(struct connman_network *network,
1705 const char *nameservers)
1707 struct connman_service *service;
1708 char **nameservers_array;
1711 DBG("network %p nameservers %s", network, nameservers);
1713 service = connman_service_lookup_from_network(network);
1714 if (service == NULL)
1717 __connman_service_nameserver_clear(service);
1719 if (nameservers == NULL)
1722 nameservers_array = g_strsplit(nameservers, " ", 0);
1724 for (i = 0; nameservers_array[i] != NULL; i++) {
1725 __connman_service_nameserver_append(service,
1726 nameservers_array[i], FALSE);
1729 g_strfreev(nameservers_array);
1734 int connman_network_set_domain(struct connman_network *network,
1737 struct connman_service *service;
1739 DBG("network %p domain %s", network, domain);
1741 service = connman_service_lookup_from_network(network);
1742 if (service == NULL)
1745 __connman_service_set_domainname(service, domain);
1751 * connman_network_set_name:
1752 * @network: network structure
1755 * Set display name value for network
1757 int connman_network_set_name(struct connman_network *network,
1760 DBG("network %p name %s", network, name);
1762 g_free(network->name);
1763 network->name = g_strdup(name);
1769 * connman_network_set_strength:
1770 * @network: network structure
1771 * @strength: strength value
1773 * Set signal strength value for network
1776 int connman_network_set_strength(struct connman_network *network,
1777 connman_uint8_t strength)
1779 DBG("network %p strengh %d", network, strength);
1781 network->strength = strength;
1786 connman_uint8_t connman_network_get_strength(struct connman_network *network)
1788 return network->strength;
1791 int connman_network_set_frequency(struct connman_network *network,
1792 connman_uint16_t frequency)
1794 DBG("network %p frequency %d", network, frequency);
1796 network->frequency = frequency;
1801 connman_uint16_t connman_network_get_frequency(struct connman_network *network)
1803 return network->frequency;
1806 int connman_network_set_wifi_channel(struct connman_network *network,
1807 connman_uint16_t channel)
1809 DBG("network %p wifi channel %d", network, channel);
1811 network->wifi.channel = channel;
1816 connman_uint16_t connman_network_get_wifi_channel(struct connman_network *network)
1818 return network->wifi.channel;
1822 * connman_network_set_string:
1823 * @network: network structure
1824 * @key: unique identifier
1825 * @value: string value
1827 * Set string value for specific key
1829 int connman_network_set_string(struct connman_network *network,
1830 const char *key, const char *value)
1832 DBG("network %p key %s value %s", network, key, value);
1834 if (g_strcmp0(key, "Name") == 0)
1835 return connman_network_set_name(network, value);
1837 if (g_str_equal(key, "Path") == TRUE) {
1838 g_free(network->path);
1839 network->path = g_strdup(value);
1840 } else if (g_str_equal(key, "Node") == TRUE) {
1841 g_free(network->node);
1842 network->node = g_strdup(value);
1843 } else if (g_str_equal(key, "WiFi.Mode") == TRUE) {
1844 g_free(network->wifi.mode);
1845 network->wifi.mode = g_strdup(value);
1846 } else if (g_str_equal(key, "WiFi.Security") == TRUE) {
1847 g_free(network->wifi.security);
1848 network->wifi.security = g_strdup(value);
1849 } else if (g_str_equal(key, "WiFi.Passphrase") == TRUE) {
1850 g_free(network->wifi.passphrase);
1851 network->wifi.passphrase = g_strdup(value);
1852 } else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE) {
1853 g_free(network->wifi.agent_passphrase);
1854 network->wifi.agent_passphrase = g_strdup(value);
1855 } else if (g_str_equal(key, "WiFi.EAP") == TRUE) {
1856 g_free(network->wifi.eap);
1857 network->wifi.eap = g_strdup(value);
1858 } else if (g_str_equal(key, "WiFi.Identity") == TRUE) {
1859 g_free(network->wifi.identity);
1860 network->wifi.identity = g_strdup(value);
1861 } else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE) {
1862 g_free(network->wifi.agent_identity);
1863 network->wifi.agent_identity = g_strdup(value);
1864 } else if (g_str_equal(key, "WiFi.CACertFile") == TRUE) {
1865 g_free(network->wifi.ca_cert_path);
1866 network->wifi.ca_cert_path = g_strdup(value);
1867 } else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE) {
1868 g_free(network->wifi.client_cert_path);
1869 network->wifi.client_cert_path = g_strdup(value);
1870 } else if (g_str_equal(key, "WiFi.PrivateKeyFile") == TRUE) {
1871 g_free(network->wifi.private_key_path);
1872 network->wifi.private_key_path = g_strdup(value);
1873 } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase") == TRUE) {
1874 g_free(network->wifi.private_key_passphrase);
1875 network->wifi.private_key_passphrase = g_strdup(value);
1876 } else if (g_str_equal(key, "WiFi.Phase2") == TRUE) {
1877 g_free(network->wifi.phase2_auth);
1878 network->wifi.phase2_auth = g_strdup(value);
1879 } else if (g_str_equal(key, "WiFi.PinWPS") == TRUE) {
1880 g_free(network->wifi.pin_wps);
1881 network->wifi.pin_wps = g_strdup(value);
1890 * connman_network_get_string:
1891 * @network: network structure
1892 * @key: unique identifier
1894 * Get string value for specific key
1896 const char *connman_network_get_string(struct connman_network *network,
1899 DBG("network %p key %s", network, key);
1901 if (g_str_equal(key, "Path") == TRUE)
1902 return network->path;
1903 else if (g_str_equal(key, "Name") == TRUE)
1904 return network->name;
1905 else if (g_str_equal(key, "Node") == TRUE)
1906 return network->node;
1907 else if (g_str_equal(key, "WiFi.Mode") == TRUE)
1908 return network->wifi.mode;
1909 else if (g_str_equal(key, "WiFi.Security") == TRUE)
1910 return network->wifi.security;
1911 else if (g_str_equal(key, "WiFi.Passphrase") == TRUE)
1912 return network->wifi.passphrase;
1913 else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE)
1914 return network->wifi.agent_passphrase;
1915 else if (g_str_equal(key, "WiFi.EAP") == TRUE)
1916 return network->wifi.eap;
1917 else if (g_str_equal(key, "WiFi.Identity") == TRUE)
1918 return network->wifi.identity;
1919 else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE)
1920 return network->wifi.agent_identity;
1921 else if (g_str_equal(key, "WiFi.CACertFile") == TRUE)
1922 return network->wifi.ca_cert_path;
1923 else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE)
1924 return network->wifi.client_cert_path;
1925 else if (g_str_equal(key, "WiFi.PrivateKeyFile") == TRUE)
1926 return network->wifi.private_key_path;
1927 else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase") == TRUE)
1928 return network->wifi.private_key_passphrase;
1929 else if (g_str_equal(key, "WiFi.Phase2") == TRUE)
1930 return network->wifi.phase2_auth;
1931 else if (g_str_equal(key, "WiFi.PinWPS") == TRUE)
1932 return network->wifi.pin_wps;
1938 * connman_network_set_bool:
1939 * @network: network structure
1940 * @key: unique identifier
1941 * @value: boolean value
1943 * Set boolean value for specific key
1945 int connman_network_set_bool(struct connman_network *network,
1946 const char *key, connman_bool_t value)
1948 DBG("network %p key %s value %d", network, key, value);
1950 if (g_strcmp0(key, "Roaming") == 0)
1951 network->roaming = value;
1952 else if (g_strcmp0(key, "WiFi.WPS") == 0)
1953 network->wifi.wps = value;
1954 else if (g_strcmp0(key, "WiFi.UseWPS") == 0)
1955 network->wifi.use_wps = value;
1961 * connman_network_get_bool:
1962 * @network: network structure
1963 * @key: unique identifier
1965 * Get boolean value for specific key
1967 connman_bool_t connman_network_get_bool(struct connman_network *network,
1970 DBG("network %p key %s", network, key);
1972 if (g_str_equal(key, "Roaming") == TRUE)
1973 return network->roaming;
1974 else if (g_str_equal(key, "WiFi.WPS") == TRUE)
1975 return network->wifi.wps;
1976 else if (g_str_equal(key, "WiFi.UseWPS") == TRUE)
1977 return network->wifi.use_wps;
1983 * connman_network_set_blob:
1984 * @network: network structure
1985 * @key: unique identifier
1989 * Set binary blob value for specific key
1991 int connman_network_set_blob(struct connman_network *network,
1992 const char *key, const void *data, unsigned int size)
1994 DBG("network %p key %s size %d", network, key, size);
1996 if (g_str_equal(key, "WiFi.SSID") == TRUE) {
1997 g_free(network->wifi.ssid);
1998 network->wifi.ssid = g_try_malloc(size);
1999 if (network->wifi.ssid != NULL) {
2000 memcpy(network->wifi.ssid, data, size);
2001 network->wifi.ssid_len = size;
2003 network->wifi.ssid_len = 0;
2012 * connman_network_get_blob:
2013 * @network: network structure
2014 * @key: unique identifier
2015 * @size: pointer to blob size
2017 * Get binary blob value for specific key
2019 const void *connman_network_get_blob(struct connman_network *network,
2020 const char *key, unsigned int *size)
2022 DBG("network %p key %s", network, key);
2024 if (g_str_equal(key, "WiFi.SSID") == TRUE) {
2026 *size = network->wifi.ssid_len;
2027 return network->wifi.ssid;
2033 void __connman_network_set_device(struct connman_network *network,
2034 struct connman_device *device)
2036 if (network->device == device)
2039 if (network->device != NULL)
2040 network_remove(network);
2042 network->device = device;
2044 if (network->device != NULL)
2045 network_probe(network);
2049 * connman_network_get_device:
2050 * @network: network structure
2052 * Get parent device of network
2054 struct connman_device *connman_network_get_device(struct connman_network *network)
2056 return network->device;
2060 * connman_network_get_data:
2061 * @network: network structure
2063 * Get private network data pointer
2065 void *connman_network_get_data(struct connman_network *network)
2067 return network->driver_data;
2071 * connman_network_set_data:
2072 * @network: network structure
2073 * @data: data pointer
2075 * Set private network data pointer
2077 void connman_network_set_data(struct connman_network *network, void *data)
2079 network->driver_data = data;
2082 void connman_network_update(struct connman_network *network)
2084 switch (network->type) {
2085 case CONNMAN_NETWORK_TYPE_UNKNOWN:
2086 case CONNMAN_NETWORK_TYPE_VENDOR:
2088 case CONNMAN_NETWORK_TYPE_ETHERNET:
2089 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
2090 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
2091 case CONNMAN_NETWORK_TYPE_CELLULAR:
2092 case CONNMAN_NETWORK_TYPE_WIFI:
2096 if (network->group != NULL)
2097 __connman_service_update_from_network(network);
2100 int __connman_network_init(void)
2107 void __connman_network_cleanup(void)