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;
99 static const char *type2string(enum connman_network_type type)
102 case CONNMAN_NETWORK_TYPE_UNKNOWN:
103 case CONNMAN_NETWORK_TYPE_VENDOR:
105 case CONNMAN_NETWORK_TYPE_ETHERNET:
107 case CONNMAN_NETWORK_TYPE_WIFI:
109 case CONNMAN_NETWORK_TYPE_WIMAX:
111 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
112 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
114 case CONNMAN_NETWORK_TYPE_CELLULAR:
121 static gboolean match_driver(struct connman_network *network,
122 struct connman_network_driver *driver)
124 if (network->type == driver->type ||
125 driver->type == CONNMAN_NETWORK_TYPE_UNKNOWN)
131 static int network_probe(struct connman_network *network)
134 struct connman_network_driver *driver = NULL;
136 DBG("network %p name %s", network, network->name);
138 if (network->driver != NULL)
141 for (list = driver_list; list; list = list->next) {
144 if (match_driver(network, driver) == FALSE)
147 DBG("driver %p name %s", driver, driver->name);
149 if (driver->probe(network) == 0)
158 if (network->group == NULL)
161 switch (network->type) {
162 case CONNMAN_NETWORK_TYPE_UNKNOWN:
163 case CONNMAN_NETWORK_TYPE_VENDOR:
165 case CONNMAN_NETWORK_TYPE_ETHERNET:
166 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
167 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
168 case CONNMAN_NETWORK_TYPE_CELLULAR:
169 case CONNMAN_NETWORK_TYPE_WIFI:
170 case CONNMAN_NETWORK_TYPE_WIMAX:
171 network->driver = driver;
172 if (__connman_service_create_from_network(network) == NULL) {
173 network->driver = NULL;
181 static void network_remove(struct connman_network *network)
183 DBG("network %p name %s", network, network->name);
185 if (network->driver == NULL)
188 connman_network_set_connected(network, FALSE);
190 switch (network->type) {
191 case CONNMAN_NETWORK_TYPE_UNKNOWN:
192 case CONNMAN_NETWORK_TYPE_VENDOR:
194 case CONNMAN_NETWORK_TYPE_ETHERNET:
195 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
196 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
197 case CONNMAN_NETWORK_TYPE_CELLULAR:
198 case CONNMAN_NETWORK_TYPE_WIFI:
199 case CONNMAN_NETWORK_TYPE_WIMAX:
200 if (network->group != NULL) {
201 __connman_service_remove_from_network(network);
203 g_free(network->group);
204 network->group = NULL;
209 if (network->driver->remove)
210 network->driver->remove(network);
212 network->driver = NULL;
215 static void network_change(struct connman_network *network)
217 DBG("network %p name %s", network, network->name);
219 if (network->connected == FALSE)
222 connman_device_set_disconnected(network->device, TRUE);
224 if (network->driver && network->driver->disconnect) {
225 network->driver->disconnect(network);
229 network->connected = FALSE;
232 static void probe_driver(struct connman_network_driver *driver)
236 DBG("driver %p name %s", driver, driver->name);
238 for (list = network_list; list != NULL; list = list->next) {
239 struct connman_network *network = list->data;
241 if (network->driver != NULL)
244 if (driver->type != network->type)
247 if (driver->probe(network) < 0)
250 network->driver = driver;
254 static void remove_driver(struct connman_network_driver *driver)
258 DBG("driver %p name %s", driver, driver->name);
260 for (list = network_list; list != NULL; list = list->next) {
261 struct connman_network *network = list->data;
263 if (network->driver == driver)
264 network_remove(network);
268 static gint compare_priority(gconstpointer a, gconstpointer b)
270 const struct connman_network_driver *driver1 = a;
271 const struct connman_network_driver *driver2 = b;
273 return driver2->priority - driver1->priority;
277 * connman_network_driver_register:
278 * @driver: network driver definition
280 * Register a new network driver
282 * Returns: %0 on success
284 int connman_network_driver_register(struct connman_network_driver *driver)
288 DBG("driver %p name %s", driver, driver->name);
290 for (list = driver_list; list; list = list->next) {
291 struct connman_network_driver *tmp = list->data;
293 if (tmp->type == driver->type)
298 driver_list = g_slist_insert_sorted(driver_list, driver,
301 probe_driver(driver);
307 * connman_network_driver_unregister:
308 * @driver: network driver definition
310 * Remove a previously registered network driver
312 void connman_network_driver_unregister(struct connman_network_driver *driver)
314 DBG("driver %p name %s", driver, driver->name);
316 driver_list = g_slist_remove(driver_list, driver);
318 remove_driver(driver);
321 static void network_destruct(struct connman_network *network)
323 DBG("network %p name %s", network, network->name);
325 g_free(network->wifi.ssid);
326 g_free(network->wifi.mode);
327 g_free(network->wifi.security);
328 g_free(network->wifi.passphrase);
329 g_free(network->wifi.agent_passphrase);
330 g_free(network->wifi.eap);
331 g_free(network->wifi.identity);
332 g_free(network->wifi.agent_identity);
333 g_free(network->wifi.ca_cert_path);
334 g_free(network->wifi.client_cert_path);
335 g_free(network->wifi.private_key_path);
336 g_free(network->wifi.private_key_passphrase);
337 g_free(network->wifi.phase2_auth);
338 g_free(network->wifi.pin_wps);
340 g_free(network->path);
341 g_free(network->group);
342 g_free(network->node);
343 g_free(network->name);
344 g_free(network->identifier);
346 network->device = NULL;
352 * connman_network_create:
353 * @identifier: network identifier (for example an unqiue name)
355 * Allocate a new network and assign the #identifier to it.
357 * Returns: a newly-allocated #connman_network structure
359 struct connman_network *connman_network_create(const char *identifier,
360 enum connman_network_type type)
362 struct connman_network *network;
365 DBG("identifier %s type %d", identifier, type);
367 network = g_try_new0(struct connman_network, 1);
371 DBG("network %p", network);
373 network->refcount = 1;
375 ident = g_strdup(identifier);
382 network->type = type;
383 network->identifier = ident;
385 network_list = g_slist_append(network_list, network);
391 * connman_network_ref:
392 * @network: network structure
394 * Increase reference counter of network
396 struct connman_network *
397 connman_network_ref_debug(struct connman_network *network,
398 const char *file, int line, const char *caller)
400 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
401 network->refcount + 1, file, line, caller);
403 __sync_fetch_and_add(&network->refcount, 1);
409 * connman_network_unref:
410 * @network: network structure
412 * Decrease reference counter of network
414 void connman_network_unref_debug(struct connman_network *network,
415 const char *file, int line, const char *caller)
417 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
418 network->refcount - 1, file, line, caller);
420 if (__sync_fetch_and_sub(&network->refcount, 1) != 1)
423 network_list = g_slist_remove(network_list, network);
425 network_destruct(network);
428 const char *__connman_network_get_type(struct connman_network *network)
430 return type2string(network->type);
434 * connman_network_get_type:
435 * @network: network structure
437 * Get type of network
439 enum connman_network_type connman_network_get_type(struct connman_network *network)
441 return network->type;
445 * connman_network_get_identifier:
446 * @network: network structure
448 * Get identifier of network
450 const char *connman_network_get_identifier(struct connman_network *network)
452 return network->identifier;
456 * connman_network_set_index:
457 * @network: network structure
458 * @index: index number
460 * Set index number of network
462 void connman_network_set_index(struct connman_network *network, int index)
464 struct connman_service *service;
465 struct connman_ipconfig *ipconfig;
467 service = connman_service_lookup_from_network(network);
471 ipconfig = __connman_service_get_ip4config(service);
472 if (ipconfig == NULL)
475 /* If index changed, the index of ipconfig must be reset. */
476 __connman_ipconfig_set_index(ipconfig, index);
478 DBG("index %d service %p ip4config %p", network->index,
481 network->index = index;
485 * connman_network_get_index:
486 * @network: network structure
488 * Get index number of network
490 int connman_network_get_index(struct connman_network *network)
492 return network->index;
496 * connman_network_set_group:
497 * @network: network structure
500 * Set group name for automatic clustering
502 void connman_network_set_group(struct connman_network *network,
505 switch (network->type) {
506 case CONNMAN_NETWORK_TYPE_UNKNOWN:
507 case CONNMAN_NETWORK_TYPE_VENDOR:
509 case CONNMAN_NETWORK_TYPE_ETHERNET:
510 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
511 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
512 case CONNMAN_NETWORK_TYPE_CELLULAR:
513 case CONNMAN_NETWORK_TYPE_WIFI:
514 case CONNMAN_NETWORK_TYPE_WIMAX:
518 if (g_strcmp0(network->group, group) == 0) {
520 __connman_service_update_from_network(network);
524 if (network->group != NULL) {
525 __connman_service_remove_from_network(network);
527 g_free(network->group);
530 network->group = g_strdup(group);
532 if (network->group != NULL)
533 network_probe(network);
537 * connman_network_get_group:
538 * @network: network structure
540 * Get group name for automatic clustering
542 const char *connman_network_get_group(struct connman_network *network)
544 return network->group;
547 const char *__connman_network_get_ident(struct connman_network *network)
549 if (network->device == NULL)
552 return connman_device_get_ident(network->device);
555 connman_bool_t __connman_network_get_weakness(struct connman_network *network)
557 switch (network->type) {
558 case CONNMAN_NETWORK_TYPE_UNKNOWN:
559 case CONNMAN_NETWORK_TYPE_VENDOR:
560 case CONNMAN_NETWORK_TYPE_ETHERNET:
561 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
562 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
563 case CONNMAN_NETWORK_TYPE_CELLULAR:
564 case CONNMAN_NETWORK_TYPE_WIMAX:
566 case CONNMAN_NETWORK_TYPE_WIFI:
567 if (g_strcmp0(network->wifi.mode, "adhoc") == 0)
569 if (network->strength > 0 && network->strength < 20)
577 connman_bool_t connman_network_get_connecting(struct connman_network *network)
579 return network->connecting;
583 * connman_network_set_available:
584 * @network: network structure
585 * @available: availability state
587 * Change availability state of network (in range)
589 int connman_network_set_available(struct connman_network *network,
590 connman_bool_t available)
592 DBG("network %p available %d", network, available);
594 if (network->available == available)
597 network->available = available;
603 * connman_network_get_available:
604 * @network: network structure
606 * Get network available setting
608 connman_bool_t connman_network_get_available(struct connman_network *network)
610 return network->available;
614 * connman_network_set_associating:
615 * @network: network structure
616 * @associating: associating state
618 * Change associating state of network
620 int connman_network_set_associating(struct connman_network *network,
621 connman_bool_t associating)
623 DBG("network %p associating %d", network, associating);
625 if (network->associating == associating)
628 network->associating = associating;
630 if (associating == TRUE) {
631 struct connman_service *service;
633 service = connman_service_lookup_from_network(network);
634 __connman_service_ipconfig_indicate_state(service,
635 CONNMAN_SERVICE_STATE_ASSOCIATION,
636 CONNMAN_IPCONFIG_TYPE_IPV4);
637 __connman_service_ipconfig_indicate_state(service,
638 CONNMAN_SERVICE_STATE_ASSOCIATION,
639 CONNMAN_IPCONFIG_TYPE_IPV6);
645 static void set_associate_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_configure_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_CONNECT_FAILED);
665 static void set_invalid_key_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_INVALID_KEY);
675 static void set_connect_error(struct connman_network *network)
677 struct connman_service *service;
679 service = connman_service_lookup_from_network(network);
681 __connman_service_indicate_error(service,
682 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
685 void connman_network_set_ipv4_method(struct connman_network *network,
686 enum connman_ipconfig_method method)
688 struct connman_service *service;
689 struct connman_ipconfig *ipconfig;
691 service = connman_service_lookup_from_network(network);
695 ipconfig = __connman_service_get_ip4config(service);
696 if (ipconfig == NULL)
699 __connman_ipconfig_set_method(ipconfig, method);
702 void connman_network_set_ipv6_method(struct connman_network *network,
703 enum connman_ipconfig_method method)
705 struct connman_service *service;
706 struct connman_ipconfig *ipconfig;
708 service = connman_service_lookup_from_network(network);
712 ipconfig = __connman_service_get_ip6config(service);
713 if (ipconfig == NULL)
716 __connman_ipconfig_set_method(ipconfig, method);
719 void connman_network_set_error(struct connman_network *network,
720 enum connman_network_error error)
722 DBG("nework %p, error %d", network, error);
724 network->connecting = FALSE;
725 network->associating = FALSE;
728 case CONNMAN_NETWORK_ERROR_UNKNOWN:
730 case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
731 set_associate_error(network);
733 case CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL:
734 set_configure_error(network);
736 case CONNMAN_NETWORK_ERROR_INVALID_KEY:
737 set_invalid_key_error(network);
739 case CONNMAN_NETWORK_ERROR_CONNECT_FAIL:
740 set_connect_error(network);
744 network_change(network);
747 void connman_network_clear_error(struct connman_network *network)
749 struct connman_service *service;
751 DBG("network %p", network);
756 if (network->connecting == TRUE || network->associating == TRUE)
759 service = connman_service_lookup_from_network(network);
760 __connman_service_clear_error(service);
763 static void set_configuration(struct connman_network *network,
764 enum connman_ipconfig_type type)
766 struct connman_service *service;
768 DBG("network %p", network);
770 if (network->device == NULL)
773 __connman_device_set_network(network->device, network);
775 connman_device_set_disconnected(network->device, FALSE);
777 service = connman_service_lookup_from_network(network);
778 __connman_service_ipconfig_indicate_state(service,
779 CONNMAN_SERVICE_STATE_CONFIGURATION,
783 static void dhcp_success(struct connman_network *network)
785 struct connman_service *service;
786 struct connman_ipconfig *ipconfig_ipv4;
789 service = connman_service_lookup_from_network(network);
793 connman_network_set_associating(network, FALSE);
795 network->connecting = FALSE;
797 ipconfig_ipv4 = __connman_service_get_ip4config(service);
798 err = __connman_ipconfig_address_add(ipconfig_ipv4);
802 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
809 connman_network_set_error(network,
810 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
813 static void dhcp_failure(struct connman_network *network)
815 struct connman_service *service;
817 service = connman_service_lookup_from_network(network);
821 __connman_service_ipconfig_indicate_state(service,
822 CONNMAN_SERVICE_STATE_IDLE,
823 CONNMAN_IPCONFIG_TYPE_IPV4);
826 static void dhcp_callback(struct connman_network *network,
827 connman_bool_t success)
829 DBG("success %d", success);
832 dhcp_success(network);
834 dhcp_failure(network);
837 static int set_connected_fixed(struct connman_network *network)
839 struct connman_service *service;
840 struct connman_ipconfig *ipconfig_ipv4;
845 service = connman_service_lookup_from_network(network);
847 ipconfig_ipv4 = __connman_service_get_ip4config(service);
849 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
851 network->connecting = FALSE;
853 connman_network_set_associating(network, FALSE);
855 err = __connman_ipconfig_address_add(ipconfig_ipv4);
859 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
866 connman_network_set_error(network,
867 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
872 static void set_connected_manual(struct connman_network *network)
874 struct connman_service *service;
875 struct connman_ipconfig *ipconfig;
878 DBG("network %p", network);
880 service = connman_service_lookup_from_network(network);
882 ipconfig = __connman_service_get_ip4config(service);
884 if (__connman_ipconfig_get_local(ipconfig) == NULL)
885 __connman_service_read_ip4config(service);
887 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
889 err = __connman_ipconfig_address_add(ipconfig);
893 err = __connman_ipconfig_gateway_add(ipconfig);
897 network->connecting = FALSE;
899 connman_network_set_associating(network, FALSE);
904 connman_network_set_error(network,
905 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
909 static int set_connected_dhcp(struct connman_network *network)
913 DBG("network %p", network);
915 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
917 err = __connman_dhcp_start(network, dhcp_callback);
919 connman_error("Can not request DHCP lease");
926 static int manual_ipv6_set(struct connman_network *network,
927 struct connman_ipconfig *ipconfig_ipv6)
929 struct connman_service *service;
932 DBG("network %p ipv6 %p", network, ipconfig_ipv6);
934 service = connman_service_lookup_from_network(network);
938 if (__connman_ipconfig_get_local(ipconfig_ipv6) == NULL)
939 __connman_service_read_ip6config(service);
941 err = __connman_ipconfig_address_add(ipconfig_ipv6);
943 connman_network_set_error(network,
944 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
948 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
952 __connman_connection_gateway_activate(service,
953 CONNMAN_IPCONFIG_TYPE_IPV6);
955 __connman_device_set_network(network->device, network);
957 connman_device_set_disconnected(network->device, FALSE);
959 network->connecting = FALSE;
964 static void stop_dhcpv6(struct connman_network *network)
966 __connman_dhcpv6_stop(network);
969 static void dhcpv6_release_callback(struct connman_network *network,
970 connman_bool_t success)
972 DBG("success %d", success);
974 stop_dhcpv6(network);
977 static void release_dhcpv6(struct connman_network *network)
979 __connman_dhcpv6_start_release(network, dhcpv6_release_callback);
980 stop_dhcpv6(network);
983 static void dhcpv6_info_callback(struct connman_network *network,
984 connman_bool_t success)
986 DBG("success %d", success);
988 stop_dhcpv6(network);
991 static gboolean dhcpv6_set_addresses(struct connman_network *network)
993 struct connman_service *service;
994 struct connman_ipconfig *ipconfig_ipv6;
997 service = connman_service_lookup_from_network(network);
1001 connman_network_set_associating(network, FALSE);
1003 network->connecting = FALSE;
1005 ipconfig_ipv6 = __connman_service_get_ip6config(service);
1006 err = __connman_ipconfig_address_add(ipconfig_ipv6);
1010 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
1017 connman_network_set_error(network,
1018 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1022 static void autoconf_ipv6_set(struct connman_network *network);
1023 static void dhcpv6_callback(struct connman_network *network,
1024 connman_bool_t success);
1027 * Have a separate callback for renew so that we do not do autoconf
1028 * in wrong phase as the dhcpv6_callback() is also called when doing
1029 * DHCPv6 solicitation.
1031 static void dhcpv6_renew_callback(struct connman_network *network,
1032 connman_bool_t success)
1034 if (success == TRUE)
1035 dhcpv6_callback(network, success);
1037 stop_dhcpv6(network);
1039 /* restart and do solicit again. */
1040 autoconf_ipv6_set(network);
1044 static void dhcpv6_callback(struct connman_network *network,
1045 connman_bool_t success)
1047 DBG("success %d", success);
1049 /* Start the renew process if necessary */
1050 if (success == TRUE) {
1052 if (dhcpv6_set_addresses(network) < 0) {
1053 stop_dhcpv6(network);
1057 if (__connman_dhcpv6_start_renew(network,
1058 dhcpv6_renew_callback) == -ETIMEDOUT)
1059 dhcpv6_renew_callback(network, FALSE);
1061 stop_dhcpv6(network);
1064 static void check_dhcpv6(struct nd_router_advert *reply,
1065 unsigned int length, void *user_data)
1067 struct connman_network *network = user_data;
1070 DBG("reply %p", reply);
1072 if (reply == NULL) {
1074 * Router solicitation message seem to get lost easily so
1075 * try to send it again.
1077 if (network->router_solicit_count > 0) {
1078 DBG("re-send router solicitation %d",
1079 network->router_solicit_count);
1080 network->router_solicit_count--;
1081 __connman_inet_ipv6_send_rs(network->index, 1,
1082 check_dhcpv6, network);
1085 connman_network_unref(network);
1089 network->router_solicit_count = 0;
1092 * If we were disconnected while waiting router advertisement,
1093 * we just quit and do not start DHCPv6
1095 if (network->connected == FALSE) {
1096 connman_network_unref(network);
1100 prefixes = __connman_inet_ipv6_get_prefixes(reply, length);
1103 * We do stateful/stateless DHCPv6 if router advertisement says so.
1105 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED)
1106 __connman_dhcpv6_start(network, prefixes, dhcpv6_callback);
1107 else if (reply->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
1108 __connman_dhcpv6_start_info(network, dhcpv6_info_callback);
1110 connman_network_unref(network);
1113 static void receive_refresh_rs_reply(struct nd_router_advert *reply,
1114 unsigned int length, void *user_data)
1116 struct connman_network *network = user_data;
1118 DBG("reply %p", reply);
1120 if (reply == NULL) {
1122 * Router solicitation message seem to get lost easily so
1123 * try to send it again.
1125 if (network->router_solicit_refresh_count > 1) {
1126 network->router_solicit_refresh_count--;
1127 DBG("re-send router solicitation %d",
1128 network->router_solicit_refresh_count);
1129 __connman_inet_ipv6_send_rs(network->index,
1131 receive_refresh_rs_reply,
1137 /* RS refresh not in progress anymore */
1138 network->router_solicit_refresh_count = 0;
1140 connman_network_unref(network);
1144 int __connman_refresh_rs_ipv6(struct connman_network *network, int index)
1148 DBG("network %p index %d", network, index);
1150 /* Send only one RS for all RDNSS entries which are about to expire */
1151 if (network->router_solicit_refresh_count > 0) {
1152 DBG("RS refresh already started");
1156 network->router_solicit_refresh_count = RS_REFRESH_COUNT;
1158 connman_network_ref(network);
1160 ret = __connman_inet_ipv6_send_rs(index, RS_REFRESH_TIMEOUT,
1161 receive_refresh_rs_reply, network);
1165 static void autoconf_ipv6_set(struct connman_network *network)
1167 struct connman_service *service;
1168 struct connman_ipconfig *ipconfig;
1171 DBG("network %p", network);
1173 if (network->router_solicit_count > 0) {
1175 * The autoconfiguration is already pending and we have sent
1176 * router solicitation messages and are now waiting answers.
1177 * There is no need to continue any further.
1179 DBG("autoconfiguration already started");
1183 __connman_device_set_network(network->device, network);
1185 connman_device_set_disconnected(network->device, FALSE);
1187 network->connecting = FALSE;
1189 service = connman_service_lookup_from_network(network);
1190 if (service == NULL)
1193 ipconfig = __connman_service_get_ip6config(service);
1194 if (ipconfig == NULL)
1197 index = __connman_ipconfig_get_index(ipconfig);
1199 connman_network_ref(network);
1201 /* Try to get stateless DHCPv6 information, RFC 3736 */
1202 network->router_solicit_count = 3;
1203 __connman_inet_ipv6_send_rs(index, 1, check_dhcpv6, network);
1206 static void set_connected(struct connman_network *network)
1208 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
1209 enum connman_ipconfig_method ipv4_method, ipv6_method;
1210 struct connman_service *service;
1213 if (network->connected == TRUE)
1216 network->connected = TRUE;
1218 service = connman_service_lookup_from_network(network);
1220 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1221 ipconfig_ipv6 = __connman_service_get_ip6config(service);
1223 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
1226 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
1227 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
1229 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
1231 switch (ipv6_method) {
1232 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1233 case CONNMAN_IPCONFIG_METHOD_OFF:
1235 case CONNMAN_IPCONFIG_METHOD_DHCP:
1236 case CONNMAN_IPCONFIG_METHOD_AUTO:
1237 autoconf_ipv6_set(network);
1239 case CONNMAN_IPCONFIG_METHOD_FIXED:
1240 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1241 ret = manual_ipv6_set(network, ipconfig_ipv6);
1243 connman_network_set_error(network,
1244 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1250 switch (ipv4_method) {
1251 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1252 case CONNMAN_IPCONFIG_METHOD_OFF:
1253 case CONNMAN_IPCONFIG_METHOD_AUTO:
1255 case CONNMAN_IPCONFIG_METHOD_FIXED:
1256 if (set_connected_fixed(network) < 0) {
1257 connman_network_set_error(network,
1258 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1262 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1263 set_connected_manual(network);
1265 case CONNMAN_IPCONFIG_METHOD_DHCP:
1266 if (set_connected_dhcp(network) < 0) {
1267 connman_network_set_error(network,
1268 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1273 network->connecting = FALSE;
1275 connman_network_set_associating(network, FALSE);
1278 static void set_disconnected(struct connman_network *network)
1280 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
1281 enum connman_ipconfig_method ipv4_method, ipv6_method;
1282 enum connman_service_state state;
1283 struct connman_service *service;
1285 if (network->connected == FALSE)
1288 network->connected = FALSE;
1290 service = connman_service_lookup_from_network(network);
1292 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1293 ipconfig_ipv6 = __connman_service_get_ip6config(service);
1295 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
1298 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
1299 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
1301 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
1304 * Resetting solicit count here will prevent the RS resend loop
1305 * from sending packets in check_dhcpv6()
1307 network->router_solicit_count = 0;
1309 __connman_device_set_network(network->device, NULL);
1311 switch (ipv6_method) {
1312 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1313 case CONNMAN_IPCONFIG_METHOD_OFF:
1314 case CONNMAN_IPCONFIG_METHOD_FIXED:
1315 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1317 case CONNMAN_IPCONFIG_METHOD_DHCP:
1318 case CONNMAN_IPCONFIG_METHOD_AUTO:
1319 release_dhcpv6(network);
1323 switch (ipv4_method) {
1324 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1325 case CONNMAN_IPCONFIG_METHOD_OFF:
1326 case CONNMAN_IPCONFIG_METHOD_AUTO:
1327 case CONNMAN_IPCONFIG_METHOD_FIXED:
1328 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1330 case CONNMAN_IPCONFIG_METHOD_DHCP:
1331 __connman_dhcp_stop(network);
1336 * We only set the disconnect state if we were not in idle
1337 * or in failure. It does not make sense to go to disconnect
1338 * state if we were not connected.
1340 state = __connman_service_ipconfig_get_state(service,
1341 CONNMAN_IPCONFIG_TYPE_IPV4);
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_IPV4);
1348 state = __connman_service_ipconfig_get_state(service,
1349 CONNMAN_IPCONFIG_TYPE_IPV6);
1350 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1351 state != CONNMAN_SERVICE_STATE_FAILURE)
1352 __connman_service_ipconfig_indicate_state(service,
1353 CONNMAN_SERVICE_STATE_DISCONNECT,
1354 CONNMAN_IPCONFIG_TYPE_IPV6);
1356 __connman_connection_gateway_remove(service,
1357 CONNMAN_IPCONFIG_TYPE_ALL);
1359 __connman_ipconfig_address_unset(ipconfig_ipv4);
1360 __connman_ipconfig_address_unset(ipconfig_ipv6);
1363 * Special handling for IPv6 autoconfigured address.
1364 * The simplest way to remove autoconfigured routes is to
1365 * disable IPv6 temporarily so that kernel will do the cleanup
1368 if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
1369 __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
1370 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
1373 __connman_service_ipconfig_indicate_state(service,
1374 CONNMAN_SERVICE_STATE_IDLE,
1375 CONNMAN_IPCONFIG_TYPE_IPV4);
1377 __connman_service_ipconfig_indicate_state(service,
1378 CONNMAN_SERVICE_STATE_IDLE,
1379 CONNMAN_IPCONFIG_TYPE_IPV6);
1381 network->connecting = FALSE;
1383 connman_network_set_associating(network, FALSE);
1387 * connman_network_set_connected:
1388 * @network: network structure
1389 * @connected: connected state
1391 * Change connected state of network
1393 int connman_network_set_connected(struct connman_network *network,
1394 connman_bool_t connected)
1396 DBG("network %p connected %d/%d connecting %d associating %d",
1397 network, network->connected, connected, network->connecting,
1398 network->associating);
1400 if ((network->connecting == TRUE || network->associating == TRUE) &&
1401 connected == FALSE) {
1402 connman_network_set_error(network,
1403 CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
1404 if (__connman_network_disconnect(network) == 0)
1408 if (network->connected == connected)
1411 if (connected == FALSE)
1412 set_disconnected(network);
1414 set_connected(network);
1420 * connman_network_get_connected:
1421 * @network: network structure
1423 * Get network connection status
1425 connman_bool_t connman_network_get_connected(struct connman_network *network)
1427 return network->connected;
1431 * connman_network_get_associating:
1432 * @network: network structure
1434 * Get network associating status
1436 connman_bool_t connman_network_get_associating(struct connman_network *network)
1438 return network->associating;
1441 void connman_network_clear_hidden(void *user_data)
1443 if (user_data == NULL)
1446 DBG("user_data %p", user_data);
1449 * Hidden service does not have a connect timeout so
1450 * we do not need to remove it. We can just return
1451 * error to the caller telling that we could not find
1452 * any network that we could connect to.
1454 __connman_service_reply_dbus_pending(user_data, EIO);
1457 int connman_network_connect_hidden(struct connman_network *network,
1458 char *identity, char* passphrase, void *user_data)
1461 struct connman_service *service;
1463 service = connman_service_lookup_from_network(network);
1465 DBG("network %p service %p user_data %p", network, service, user_data);
1467 if (service == NULL) {
1472 if (identity != NULL)
1473 __connman_service_set_agent_identity(service, identity);
1475 if (passphrase != NULL)
1476 err = __connman_service_add_passphrase(service, passphrase);
1478 if (err == -ENOKEY) {
1479 __connman_service_indicate_error(service,
1480 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1483 __connman_service_set_hidden(service);
1484 __connman_service_set_userconnect(service, TRUE);
1485 __connman_service_set_hidden_data(service, user_data);
1486 return __connman_service_connect(service);
1490 __connman_service_return_error(service, -err, user_data);
1495 * __connman_network_connect:
1496 * @network: network structure
1500 int __connman_network_connect(struct connman_network *network)
1504 DBG("network %p", network);
1506 if (network->connected == TRUE)
1509 if (network->connecting == TRUE || network->associating == TRUE)
1512 if (network->driver == NULL)
1515 if (network->driver->connect == NULL)
1518 if (network->device == NULL)
1521 network->connecting = TRUE;
1523 __connman_device_disconnect(network->device);
1525 err = network->driver->connect(network);
1527 if (err == -EINPROGRESS)
1528 connman_network_set_associating(network, TRUE);
1530 network->connecting = FALSE;
1536 set_connected(network);
1542 * __connman_network_disconnect:
1543 * @network: network structure
1545 * Disconnect network
1547 int __connman_network_disconnect(struct connman_network *network)
1551 DBG("network %p", network);
1553 if (network->connected == FALSE && network->connecting == FALSE &&
1554 network->associating == FALSE)
1557 if (network->driver == NULL)
1560 if (network->driver->disconnect == NULL)
1563 network->connecting = FALSE;
1565 err = network->driver->disconnect(network);
1567 set_disconnected(network);
1572 static int manual_ipv4_set(struct connman_network *network,
1573 struct connman_ipconfig *ipconfig)
1575 struct connman_service *service;
1578 service = connman_service_lookup_from_network(network);
1579 if (service == NULL)
1582 err = __connman_ipconfig_address_add(ipconfig);
1584 connman_network_set_error(network,
1585 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1589 return __connman_ipconfig_gateway_add(ipconfig);
1592 int __connman_network_clear_ipconfig(struct connman_network *network,
1593 struct connman_ipconfig *ipconfig)
1595 struct connman_service *service;
1596 enum connman_ipconfig_method method;
1597 enum connman_ipconfig_type type;
1599 service = connman_service_lookup_from_network(network);
1600 if (service == NULL)
1603 method = __connman_ipconfig_get_method(ipconfig);
1604 type = __connman_ipconfig_get_config_type(ipconfig);
1607 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1608 case CONNMAN_IPCONFIG_METHOD_OFF:
1609 case CONNMAN_IPCONFIG_METHOD_FIXED:
1611 case CONNMAN_IPCONFIG_METHOD_AUTO:
1612 release_dhcpv6(network);
1614 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1615 __connman_ipconfig_address_remove(ipconfig);
1617 case CONNMAN_IPCONFIG_METHOD_DHCP:
1618 __connman_dhcp_stop(network);
1622 if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
1623 __connman_service_ipconfig_indicate_state(service,
1624 CONNMAN_SERVICE_STATE_CONFIGURATION,
1625 CONNMAN_IPCONFIG_TYPE_IPV6);
1626 else if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
1627 __connman_service_ipconfig_indicate_state(service,
1628 CONNMAN_SERVICE_STATE_CONFIGURATION,
1629 CONNMAN_IPCONFIG_TYPE_IPV4);
1634 int __connman_network_set_ipconfig(struct connman_network *network,
1635 struct connman_ipconfig *ipconfig_ipv4,
1636 struct connman_ipconfig *ipconfig_ipv6)
1638 enum connman_ipconfig_method method;
1641 if (network == NULL)
1644 if (ipconfig_ipv6) {
1645 method = __connman_ipconfig_get_method(ipconfig_ipv6);
1648 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1649 case CONNMAN_IPCONFIG_METHOD_OFF:
1651 case CONNMAN_IPCONFIG_METHOD_AUTO:
1652 autoconf_ipv6_set(network);
1654 case CONNMAN_IPCONFIG_METHOD_FIXED:
1655 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1656 ret = manual_ipv6_set(network, ipconfig_ipv6);
1658 connman_network_set_error(network,
1659 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1663 case CONNMAN_IPCONFIG_METHOD_DHCP:
1668 if (ipconfig_ipv4) {
1669 method = __connman_ipconfig_get_method(ipconfig_ipv4);
1672 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1673 case CONNMAN_IPCONFIG_METHOD_OFF:
1674 case CONNMAN_IPCONFIG_METHOD_FIXED:
1675 case CONNMAN_IPCONFIG_METHOD_AUTO:
1677 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1678 return manual_ipv4_set(network, ipconfig_ipv4);
1679 case CONNMAN_IPCONFIG_METHOD_DHCP:
1680 return __connman_dhcp_start(network, dhcp_callback);
1687 int connman_network_set_ipaddress(struct connman_network *network,
1688 struct connman_ipaddress *ipaddress)
1690 struct connman_service *service;
1691 struct connman_ipconfig *ipconfig = NULL;
1693 DBG("network %p", network);
1695 service = connman_service_lookup_from_network(network);
1696 if (service == NULL)
1699 ipconfig = __connman_service_get_ipconfig(service, ipaddress->family);
1700 if (ipconfig == NULL)
1703 __connman_ipconfig_set_local(ipconfig, ipaddress->local);
1704 __connman_ipconfig_set_peer(ipconfig, ipaddress->peer);
1705 __connman_ipconfig_set_broadcast(ipconfig, ipaddress->broadcast);
1706 __connman_ipconfig_set_prefixlen(ipconfig, ipaddress->prefixlen);
1707 __connman_ipconfig_set_gateway(ipconfig, ipaddress->gateway);
1712 int connman_network_set_nameservers(struct connman_network *network,
1713 const char *nameservers)
1715 struct connman_service *service;
1716 char **nameservers_array;
1719 DBG("network %p nameservers %s", network, nameservers);
1721 service = connman_service_lookup_from_network(network);
1722 if (service == NULL)
1725 __connman_service_nameserver_clear(service);
1727 if (nameservers == NULL)
1730 nameservers_array = g_strsplit(nameservers, " ", 0);
1732 for (i = 0; nameservers_array[i] != NULL; i++) {
1733 __connman_service_nameserver_append(service,
1734 nameservers_array[i], FALSE);
1737 g_strfreev(nameservers_array);
1742 int connman_network_set_domain(struct connman_network *network,
1745 struct connman_service *service;
1747 DBG("network %p domain %s", network, domain);
1749 service = connman_service_lookup_from_network(network);
1750 if (service == NULL)
1753 __connman_service_set_domainname(service, domain);
1759 * connman_network_set_name:
1760 * @network: network structure
1763 * Set display name value for network
1765 int connman_network_set_name(struct connman_network *network,
1768 DBG("network %p name %s", network, name);
1770 g_free(network->name);
1771 network->name = g_strdup(name);
1777 * connman_network_set_strength:
1778 * @network: network structure
1779 * @strength: strength value
1781 * Set signal strength value for network
1784 int connman_network_set_strength(struct connman_network *network,
1785 connman_uint8_t strength)
1787 DBG("network %p strengh %d", network, strength);
1789 network->strength = strength;
1794 connman_uint8_t connman_network_get_strength(struct connman_network *network)
1796 return network->strength;
1799 int connman_network_set_frequency(struct connman_network *network,
1800 connman_uint16_t frequency)
1802 DBG("network %p frequency %d", network, frequency);
1804 network->frequency = frequency;
1809 connman_uint16_t connman_network_get_frequency(struct connman_network *network)
1811 return network->frequency;
1814 int connman_network_set_wifi_channel(struct connman_network *network,
1815 connman_uint16_t channel)
1817 DBG("network %p wifi channel %d", network, channel);
1819 network->wifi.channel = channel;
1824 connman_uint16_t connman_network_get_wifi_channel(struct connman_network *network)
1826 return network->wifi.channel;
1830 * connman_network_set_string:
1831 * @network: network structure
1832 * @key: unique identifier
1833 * @value: string value
1835 * Set string value for specific key
1837 int connman_network_set_string(struct connman_network *network,
1838 const char *key, const char *value)
1840 DBG("network %p key %s value %s", network, key, value);
1842 if (g_strcmp0(key, "Name") == 0)
1843 return connman_network_set_name(network, value);
1845 if (g_str_equal(key, "Path") == TRUE) {
1846 g_free(network->path);
1847 network->path = g_strdup(value);
1848 } else if (g_str_equal(key, "Node") == TRUE) {
1849 g_free(network->node);
1850 network->node = g_strdup(value);
1851 } else if (g_str_equal(key, "WiFi.Mode") == TRUE) {
1852 g_free(network->wifi.mode);
1853 network->wifi.mode = g_strdup(value);
1854 } else if (g_str_equal(key, "WiFi.Security") == TRUE) {
1855 g_free(network->wifi.security);
1856 network->wifi.security = g_strdup(value);
1857 } else if (g_str_equal(key, "WiFi.Passphrase") == TRUE) {
1858 g_free(network->wifi.passphrase);
1859 network->wifi.passphrase = g_strdup(value);
1860 } else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE) {
1861 g_free(network->wifi.agent_passphrase);
1862 network->wifi.agent_passphrase = g_strdup(value);
1863 } else if (g_str_equal(key, "WiFi.EAP") == TRUE) {
1864 g_free(network->wifi.eap);
1865 network->wifi.eap = g_strdup(value);
1866 } else if (g_str_equal(key, "WiFi.Identity") == TRUE) {
1867 g_free(network->wifi.identity);
1868 network->wifi.identity = g_strdup(value);
1869 } else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE) {
1870 g_free(network->wifi.agent_identity);
1871 network->wifi.agent_identity = g_strdup(value);
1872 } else if (g_str_equal(key, "WiFi.CACertFile") == TRUE) {
1873 g_free(network->wifi.ca_cert_path);
1874 network->wifi.ca_cert_path = g_strdup(value);
1875 } else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE) {
1876 g_free(network->wifi.client_cert_path);
1877 network->wifi.client_cert_path = g_strdup(value);
1878 } else if (g_str_equal(key, "WiFi.PrivateKeyFile") == TRUE) {
1879 g_free(network->wifi.private_key_path);
1880 network->wifi.private_key_path = g_strdup(value);
1881 } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase") == TRUE) {
1882 g_free(network->wifi.private_key_passphrase);
1883 network->wifi.private_key_passphrase = g_strdup(value);
1884 } else if (g_str_equal(key, "WiFi.Phase2") == TRUE) {
1885 g_free(network->wifi.phase2_auth);
1886 network->wifi.phase2_auth = g_strdup(value);
1887 } else if (g_str_equal(key, "WiFi.PinWPS") == TRUE) {
1888 g_free(network->wifi.pin_wps);
1889 network->wifi.pin_wps = g_strdup(value);
1898 * connman_network_get_string:
1899 * @network: network structure
1900 * @key: unique identifier
1902 * Get string value for specific key
1904 const char *connman_network_get_string(struct connman_network *network,
1907 DBG("network %p key %s", network, key);
1909 if (g_str_equal(key, "Path") == TRUE)
1910 return network->path;
1911 else if (g_str_equal(key, "Name") == TRUE)
1912 return network->name;
1913 else if (g_str_equal(key, "Node") == TRUE)
1914 return network->node;
1915 else if (g_str_equal(key, "WiFi.Mode") == TRUE)
1916 return network->wifi.mode;
1917 else if (g_str_equal(key, "WiFi.Security") == TRUE)
1918 return network->wifi.security;
1919 else if (g_str_equal(key, "WiFi.Passphrase") == TRUE)
1920 return network->wifi.passphrase;
1921 else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE)
1922 return network->wifi.agent_passphrase;
1923 else if (g_str_equal(key, "WiFi.EAP") == TRUE)
1924 return network->wifi.eap;
1925 else if (g_str_equal(key, "WiFi.Identity") == TRUE)
1926 return network->wifi.identity;
1927 else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE)
1928 return network->wifi.agent_identity;
1929 else if (g_str_equal(key, "WiFi.CACertFile") == TRUE)
1930 return network->wifi.ca_cert_path;
1931 else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE)
1932 return network->wifi.client_cert_path;
1933 else if (g_str_equal(key, "WiFi.PrivateKeyFile") == TRUE)
1934 return network->wifi.private_key_path;
1935 else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase") == TRUE)
1936 return network->wifi.private_key_passphrase;
1937 else if (g_str_equal(key, "WiFi.Phase2") == TRUE)
1938 return network->wifi.phase2_auth;
1939 else if (g_str_equal(key, "WiFi.PinWPS") == TRUE)
1940 return network->wifi.pin_wps;
1946 * connman_network_set_bool:
1947 * @network: network structure
1948 * @key: unique identifier
1949 * @value: boolean value
1951 * Set boolean value for specific key
1953 int connman_network_set_bool(struct connman_network *network,
1954 const char *key, connman_bool_t value)
1956 DBG("network %p key %s value %d", network, key, value);
1958 if (g_strcmp0(key, "Roaming") == 0)
1959 network->roaming = value;
1960 else if (g_strcmp0(key, "WiFi.WPS") == 0)
1961 network->wifi.wps = value;
1962 else if (g_strcmp0(key, "WiFi.UseWPS") == 0)
1963 network->wifi.use_wps = value;
1969 * connman_network_get_bool:
1970 * @network: network structure
1971 * @key: unique identifier
1973 * Get boolean value for specific key
1975 connman_bool_t connman_network_get_bool(struct connman_network *network,
1978 DBG("network %p key %s", network, key);
1980 if (g_str_equal(key, "Roaming") == TRUE)
1981 return network->roaming;
1982 else if (g_str_equal(key, "WiFi.WPS") == TRUE)
1983 return network->wifi.wps;
1984 else if (g_str_equal(key, "WiFi.UseWPS") == TRUE)
1985 return network->wifi.use_wps;
1991 * connman_network_set_blob:
1992 * @network: network structure
1993 * @key: unique identifier
1997 * Set binary blob value for specific key
1999 int connman_network_set_blob(struct connman_network *network,
2000 const char *key, const void *data, unsigned int size)
2002 DBG("network %p key %s size %d", network, key, size);
2004 if (g_str_equal(key, "WiFi.SSID") == TRUE) {
2005 g_free(network->wifi.ssid);
2006 network->wifi.ssid = g_try_malloc(size);
2007 if (network->wifi.ssid != NULL) {
2008 memcpy(network->wifi.ssid, data, size);
2009 network->wifi.ssid_len = size;
2011 network->wifi.ssid_len = 0;
2020 * connman_network_get_blob:
2021 * @network: network structure
2022 * @key: unique identifier
2023 * @size: pointer to blob size
2025 * Get binary blob value for specific key
2027 const void *connman_network_get_blob(struct connman_network *network,
2028 const char *key, unsigned int *size)
2030 DBG("network %p key %s", network, key);
2032 if (g_str_equal(key, "WiFi.SSID") == TRUE) {
2034 *size = network->wifi.ssid_len;
2035 return network->wifi.ssid;
2041 void __connman_network_set_device(struct connman_network *network,
2042 struct connman_device *device)
2044 if (network->device == device)
2047 if (network->device != NULL)
2048 network_remove(network);
2050 network->device = device;
2052 if (network->device != NULL)
2053 network_probe(network);
2057 * connman_network_get_device:
2058 * @network: network structure
2060 * Get parent device of network
2062 struct connman_device *connman_network_get_device(struct connman_network *network)
2064 return network->device;
2068 * connman_network_get_data:
2069 * @network: network structure
2071 * Get private network data pointer
2073 void *connman_network_get_data(struct connman_network *network)
2075 return network->driver_data;
2079 * connman_network_set_data:
2080 * @network: network structure
2081 * @data: data pointer
2083 * Set private network data pointer
2085 void connman_network_set_data(struct connman_network *network, void *data)
2087 network->driver_data = data;
2090 void connman_network_update(struct connman_network *network)
2092 switch (network->type) {
2093 case CONNMAN_NETWORK_TYPE_UNKNOWN:
2094 case CONNMAN_NETWORK_TYPE_VENDOR:
2096 case CONNMAN_NETWORK_TYPE_ETHERNET:
2097 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
2098 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
2099 case CONNMAN_NETWORK_TYPE_CELLULAR:
2100 case CONNMAN_NETWORK_TYPE_WIFI:
2101 case CONNMAN_NETWORK_TYPE_WIMAX:
2105 if (network->group != NULL)
2106 __connman_service_update_from_network(network);
2109 int __connman_network_init(void)
2116 void __connman_network_cleanup(void)