5 * Copyright (C) 2007-2010 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
31 static GSList *network_list = NULL;
32 static GSList *driver_list = NULL;
34 struct connman_network {
36 enum connman_network_type type;
37 connman_bool_t available;
38 connman_bool_t connected;
39 connman_bool_t roaming;
40 connman_uint8_t strength;
41 connman_uint16_t frequency;
48 int router_solicit_count;
50 struct connman_network_driver *driver;
53 connman_bool_t connecting;
54 connman_bool_t associating;
56 struct connman_device *device;
62 unsigned short channel;
65 char *agent_passphrase;
70 char *client_cert_path;
71 char *private_key_path;
72 char *private_key_passphrase;
75 connman_bool_t use_wps;
85 static const char *type2string(enum connman_network_type type)
88 case CONNMAN_NETWORK_TYPE_UNKNOWN:
89 case CONNMAN_NETWORK_TYPE_VENDOR:
91 case CONNMAN_NETWORK_TYPE_ETHERNET:
93 case CONNMAN_NETWORK_TYPE_WIFI:
95 case CONNMAN_NETWORK_TYPE_WIMAX:
97 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
98 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
100 case CONNMAN_NETWORK_TYPE_CELLULAR:
107 connman_bool_t __connman_network_has_driver(struct connman_network *network)
109 if (network == NULL || network->driver == NULL)
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 case CONNMAN_NETWORK_TYPE_WIMAX:
165 network->driver = driver;
166 if (__connman_service_create_from_network(network) == NULL) {
167 network->driver = NULL;
175 static void network_remove(struct connman_network *network)
177 DBG("network %p name %s", network, network->name);
179 if (network->driver == NULL)
182 connman_network_set_connected(network, FALSE);
184 switch (network->type) {
185 case CONNMAN_NETWORK_TYPE_UNKNOWN:
186 case CONNMAN_NETWORK_TYPE_VENDOR:
188 case CONNMAN_NETWORK_TYPE_ETHERNET:
189 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
190 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
191 case CONNMAN_NETWORK_TYPE_CELLULAR:
192 case CONNMAN_NETWORK_TYPE_WIFI:
193 case CONNMAN_NETWORK_TYPE_WIMAX:
194 if (network->group != NULL) {
195 __connman_service_remove_from_network(network);
197 g_free(network->group);
198 network->group = NULL;
203 if (network->driver->remove)
204 network->driver->remove(network);
206 network->driver = NULL;
209 static void network_change(struct connman_network *network)
211 DBG("network %p name %s", network, network->name);
213 if (network->connected == FALSE)
216 connman_device_set_disconnected(network->device, TRUE);
218 if (network->driver && network->driver->disconnect) {
219 network->driver->disconnect(network);
223 network->connected = FALSE;
226 static void probe_driver(struct connman_network_driver *driver)
230 DBG("driver %p name %s", driver, driver->name);
232 for (list = network_list; list != NULL; list = list->next) {
233 struct connman_network *network = list->data;
235 if (network->driver != NULL)
238 if (driver->type != network->type)
241 if (driver->probe(network) < 0)
244 network->driver = driver;
248 static void remove_driver(struct connman_network_driver *driver)
252 DBG("driver %p name %s", driver, driver->name);
254 for (list = network_list; list != NULL; list = list->next) {
255 struct connman_network *network = list->data;
257 if (network->driver == driver)
258 network_remove(network);
262 static gint compare_priority(gconstpointer a, gconstpointer b)
264 const struct connman_network_driver *driver1 = a;
265 const struct connman_network_driver *driver2 = b;
267 return driver2->priority - driver1->priority;
271 * connman_network_driver_register:
272 * @driver: network driver definition
274 * Register a new network driver
276 * Returns: %0 on success
278 int connman_network_driver_register(struct connman_network_driver *driver)
282 DBG("driver %p name %s", driver, driver->name);
284 for (list = driver_list; list; list = list->next) {
285 struct connman_network_driver *tmp = list->data;
287 if (tmp->type == driver->type)
292 driver_list = g_slist_insert_sorted(driver_list, driver,
295 probe_driver(driver);
301 * connman_network_driver_unregister:
302 * @driver: network driver definition
304 * Remove a previously registered network driver
306 void connman_network_driver_unregister(struct connman_network_driver *driver)
308 DBG("driver %p name %s", driver, driver->name);
310 driver_list = g_slist_remove(driver_list, driver);
312 remove_driver(driver);
315 static void network_destruct(struct connman_network *network)
317 DBG("network %p name %s", network, network->name);
319 g_free(network->wifi.ssid);
320 g_free(network->wifi.mode);
321 g_free(network->wifi.security);
322 g_free(network->wifi.passphrase);
323 g_free(network->wifi.agent_passphrase);
324 g_free(network->wifi.eap);
325 g_free(network->wifi.identity);
326 g_free(network->wifi.agent_identity);
327 g_free(network->wifi.ca_cert_path);
328 g_free(network->wifi.client_cert_path);
329 g_free(network->wifi.private_key_path);
330 g_free(network->wifi.private_key_passphrase);
331 g_free(network->wifi.phase2_auth);
332 g_free(network->wifi.pin_wps);
334 g_free(network->path);
335 g_free(network->group);
336 g_free(network->node);
337 g_free(network->name);
338 g_free(network->identifier);
340 network->device = NULL;
346 * connman_network_create:
347 * @identifier: network identifier (for example an unqiue name)
349 * Allocate a new network and assign the #identifier to it.
351 * Returns: a newly-allocated #connman_network structure
353 struct connman_network *connman_network_create(const char *identifier,
354 enum connman_network_type type)
356 struct connman_network *network;
359 DBG("identifier %s type %d", identifier, type);
361 network = g_try_new0(struct connman_network, 1);
365 DBG("network %p", network);
367 network->refcount = 1;
369 ident = g_strdup(identifier);
376 network->type = type;
377 network->identifier = ident;
379 network_list = g_slist_append(network_list, network);
385 * connman_network_ref:
386 * @network: network structure
388 * Increase reference counter of network
390 struct connman_network *
391 connman_network_ref_debug(struct connman_network *network,
392 const char *file, int line, const char *caller)
394 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
395 network->refcount + 1, file, line, caller);
397 __sync_fetch_and_add(&network->refcount, 1);
403 * connman_network_unref:
404 * @network: network structure
406 * Decrease reference counter of network
408 void connman_network_unref_debug(struct connman_network *network,
409 const char *file, int line, const char *caller)
411 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
412 network->refcount - 1, file, line, caller);
414 if (__sync_fetch_and_sub(&network->refcount, 1) != 1)
417 network_list = g_slist_remove(network_list, network);
419 network_destruct(network);
422 const char *__connman_network_get_type(struct connman_network *network)
424 return type2string(network->type);
428 * connman_network_get_type:
429 * @network: network structure
431 * Get type of network
433 enum connman_network_type connman_network_get_type(struct connman_network *network)
435 return network->type;
439 * connman_network_get_identifier:
440 * @network: network structure
442 * Get identifier of network
444 const char *connman_network_get_identifier(struct connman_network *network)
446 return network->identifier;
450 * connman_network_set_index:
451 * @network: network structure
452 * @index: index number
454 * Set index number of network
456 void connman_network_set_index(struct connman_network *network, int index)
458 struct connman_service *service;
459 struct connman_ipconfig *ipconfig;
461 service = __connman_service_lookup_from_network(network);
465 ipconfig = __connman_service_get_ip4config(service);
467 DBG("index %d service %p ip4config %p", network->index,
470 if (network->index < 0 && ipconfig == NULL) {
472 ipconfig = __connman_service_get_ip4config(service);
473 if (ipconfig == NULL)
475 * This is needed for plugins that havent set their
476 * ipconfig layer yet, due to not being able to get
477 * a network index prior to creating a service.
479 __connman_service_create_ip4config(service, index);
481 __connman_ipconfig_set_index(ipconfig, index);
484 /* If index changed, the index of ipconfig must be reset. */
485 if (ipconfig == NULL)
488 __connman_ipconfig_set_index(ipconfig, index);
492 network->index = index;
496 * connman_network_get_index:
497 * @network: network structure
499 * Get index number of network
501 int connman_network_get_index(struct connman_network *network)
503 return network->index;
507 * connman_network_set_group:
508 * @network: network structure
511 * Set group name for automatic clustering
513 void connman_network_set_group(struct connman_network *network,
516 switch (network->type) {
517 case CONNMAN_NETWORK_TYPE_UNKNOWN:
518 case CONNMAN_NETWORK_TYPE_VENDOR:
520 case CONNMAN_NETWORK_TYPE_ETHERNET:
521 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
522 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
523 case CONNMAN_NETWORK_TYPE_CELLULAR:
524 case CONNMAN_NETWORK_TYPE_WIFI:
525 case CONNMAN_NETWORK_TYPE_WIMAX:
529 if (g_strcmp0(network->group, group) == 0) {
531 __connman_service_update_from_network(network);
535 if (network->group != NULL) {
536 __connman_service_remove_from_network(network);
538 g_free(network->group);
541 network->group = g_strdup(group);
543 if (network->group != NULL)
544 network_probe(network);
548 * connman_network_get_group:
549 * @network: network structure
551 * Get group name for automatic clustering
553 const char *connman_network_get_group(struct connman_network *network)
555 return network->group;
558 const char *__connman_network_get_ident(struct connman_network *network)
560 if (network->device == NULL)
563 return connman_device_get_ident(network->device);
566 connman_bool_t __connman_network_get_weakness(struct connman_network *network)
568 switch (network->type) {
569 case CONNMAN_NETWORK_TYPE_UNKNOWN:
570 case CONNMAN_NETWORK_TYPE_VENDOR:
571 case CONNMAN_NETWORK_TYPE_ETHERNET:
572 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
573 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
574 case CONNMAN_NETWORK_TYPE_CELLULAR:
575 case CONNMAN_NETWORK_TYPE_WIMAX:
577 case CONNMAN_NETWORK_TYPE_WIFI:
578 if (g_strcmp0(network->wifi.mode, "adhoc") == 0)
580 if (network->strength > 0 && network->strength < 20)
588 connman_bool_t connman_network_get_connecting(struct connman_network *network)
590 return network->connecting;
594 * connman_network_set_available:
595 * @network: network structure
596 * @available: availability state
598 * Change availability state of network (in range)
600 int connman_network_set_available(struct connman_network *network,
601 connman_bool_t available)
603 DBG("network %p available %d", network, available);
605 if (network->available == available)
608 network->available = available;
614 * connman_network_get_available:
615 * @network: network structure
617 * Get network available setting
619 connman_bool_t connman_network_get_available(struct connman_network *network)
621 return network->available;
625 * connman_network_set_associating:
626 * @network: network structure
627 * @associating: associating state
629 * Change associating state of network
631 int connman_network_set_associating(struct connman_network *network,
632 connman_bool_t associating)
634 DBG("network %p associating %d", network, associating);
636 if (network->associating == associating)
639 network->associating = associating;
641 if (associating == TRUE) {
642 struct connman_service *service;
644 service = __connman_service_lookup_from_network(network);
645 __connman_service_ipconfig_indicate_state(service,
646 CONNMAN_SERVICE_STATE_ASSOCIATION,
647 CONNMAN_IPCONFIG_TYPE_IPV4);
648 __connman_service_ipconfig_indicate_state(service,
649 CONNMAN_SERVICE_STATE_ASSOCIATION,
650 CONNMAN_IPCONFIG_TYPE_IPV6);
656 static void set_associate_error(struct connman_network *network)
658 struct connman_service *service;
660 service = __connman_service_lookup_from_network(network);
662 __connman_service_indicate_error(service,
663 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
666 static void set_configure_error(struct connman_network *network)
668 struct connman_service *service;
670 service = __connman_service_lookup_from_network(network);
672 __connman_service_indicate_error(service,
673 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
676 static void set_invalid_key_error(struct connman_network *network)
678 struct connman_service *service;
680 service = __connman_service_lookup_from_network(network);
682 __connman_service_indicate_error(service,
683 CONNMAN_SERVICE_ERROR_INVALID_KEY);
686 static void set_connect_error(struct connman_network *network)
688 struct connman_service *service;
690 service = __connman_service_lookup_from_network(network);
692 __connman_service_indicate_error(service,
693 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
696 void connman_network_set_ipv4_method(struct connman_network *network,
697 enum connman_ipconfig_method method)
699 struct connman_service *service;
700 struct connman_ipconfig *ipconfig;
702 service = __connman_service_lookup_from_network(network);
706 ipconfig = __connman_service_get_ip4config(service);
707 if (ipconfig == NULL)
710 __connman_ipconfig_set_method(ipconfig, method);
713 void connman_network_set_ipv6_method(struct connman_network *network,
714 enum connman_ipconfig_method method)
716 struct connman_service *service;
717 struct connman_ipconfig *ipconfig;
719 service = __connman_service_lookup_from_network(network);
723 ipconfig = __connman_service_get_ip6config(service);
724 if (ipconfig == NULL)
727 __connman_ipconfig_set_method(ipconfig, method);
730 void connman_network_set_error(struct connman_network *network,
731 enum connman_network_error error)
733 DBG("nework %p, error %d", network, error);
735 network->connecting = FALSE;
736 network->associating = FALSE;
739 case CONNMAN_NETWORK_ERROR_UNKNOWN:
741 case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
742 set_associate_error(network);
744 case CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL:
745 set_configure_error(network);
747 case CONNMAN_NETWORK_ERROR_INVALID_KEY:
748 set_invalid_key_error(network);
750 case CONNMAN_NETWORK_ERROR_CONNECT_FAIL:
751 set_connect_error(network);
755 network_change(network);
758 void connman_network_clear_error(struct connman_network *network)
760 struct connman_service *service;
762 DBG("network %p", network);
767 if (network->connecting == TRUE || network->associating == TRUE)
770 service = __connman_service_lookup_from_network(network);
771 __connman_service_clear_error(service);
774 static void set_configuration(struct connman_network *network,
775 enum connman_ipconfig_type type)
777 struct connman_service *service;
779 DBG("network %p", network);
781 if (network->device == NULL)
784 __connman_device_set_network(network->device, network);
786 connman_device_set_disconnected(network->device, FALSE);
788 service = __connman_service_lookup_from_network(network);
789 __connman_service_ipconfig_indicate_state(service,
790 CONNMAN_SERVICE_STATE_CONFIGURATION,
794 static void dhcp_success(struct connman_network *network)
796 struct connman_service *service;
797 struct connman_ipconfig *ipconfig_ipv4;
800 service = __connman_service_lookup_from_network(network);
804 connman_network_set_associating(network, FALSE);
806 network->connecting = FALSE;
808 ipconfig_ipv4 = __connman_service_get_ip4config(service);
809 err = __connman_ipconfig_address_add(ipconfig_ipv4);
813 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
820 connman_network_set_error(network,
821 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
824 static void dhcp_failure(struct connman_network *network)
826 struct connman_service *service;
828 service = __connman_service_lookup_from_network(network);
832 __connman_service_ipconfig_indicate_state(service,
833 CONNMAN_SERVICE_STATE_IDLE,
834 CONNMAN_IPCONFIG_TYPE_IPV4);
837 static void dhcp_callback(struct connman_network *network,
838 connman_bool_t success)
840 DBG("success %d", success);
843 dhcp_success(network);
845 dhcp_failure(network);
848 static int set_connected_fixed(struct connman_network *network)
850 struct connman_service *service;
851 struct connman_ipconfig *ipconfig_ipv4;
856 service = __connman_service_lookup_from_network(network);
858 ipconfig_ipv4 = __connman_service_get_ip4config(service);
860 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
862 network->connecting = FALSE;
864 connman_network_set_associating(network, FALSE);
866 err = __connman_ipconfig_address_add(ipconfig_ipv4);
870 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
877 connman_network_set_error(network,
878 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
883 static void set_connected_manual(struct connman_network *network)
885 struct connman_service *service;
886 struct connman_ipconfig *ipconfig;
889 DBG("network %p", network);
891 service = __connman_service_lookup_from_network(network);
893 ipconfig = __connman_service_get_ip4config(service);
895 if (__connman_ipconfig_get_local(ipconfig) == NULL)
896 __connman_service_read_ip4config(service);
898 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
900 err = __connman_ipconfig_address_add(ipconfig);
904 err = __connman_ipconfig_gateway_add(ipconfig);
908 network->connecting = FALSE;
910 connman_network_set_associating(network, FALSE);
915 connman_network_set_error(network,
916 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
920 static int set_connected_dhcp(struct connman_network *network)
924 DBG("network %p", network);
926 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV4);
928 err = __connman_dhcp_start(network, dhcp_callback);
930 connman_error("Can not request DHCP lease");
937 static int manual_ipv6_set(struct connman_network *network,
938 struct connman_ipconfig *ipconfig_ipv6)
940 struct connman_service *service;
943 DBG("network %p ipv6 %p", network, ipconfig_ipv6);
945 service = __connman_service_lookup_from_network(network);
949 if (__connman_ipconfig_get_local(ipconfig_ipv6) == NULL)
950 __connman_service_read_ip6config(service);
952 err = __connman_ipconfig_address_add(ipconfig_ipv6);
954 connman_network_set_error(network,
955 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
959 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
963 __connman_connection_gateway_activate(service,
964 CONNMAN_IPCONFIG_TYPE_IPV6);
966 __connman_device_set_network(network->device, network);
968 connman_device_set_disconnected(network->device, FALSE);
970 network->connecting = FALSE;
975 static void stop_dhcpv6(struct connman_network *network)
977 __connman_dhcpv6_stop(network);
980 static void dhcpv6_release_callback(struct connman_network *network,
981 connman_bool_t success)
983 DBG("success %d", success);
985 stop_dhcpv6(network);
988 static void release_dhcpv6(struct connman_network *network)
990 __connman_dhcpv6_start_release(network, dhcpv6_release_callback);
991 stop_dhcpv6(network);
994 static void dhcpv6_info_callback(struct connman_network *network,
995 connman_bool_t success)
997 DBG("success %d", success);
999 stop_dhcpv6(network);
1002 static gboolean dhcpv6_set_addresses(struct connman_network *network)
1004 struct connman_service *service;
1005 struct connman_ipconfig *ipconfig_ipv6;
1008 service = __connman_service_lookup_from_network(network);
1009 if (service == NULL)
1012 connman_network_set_associating(network, FALSE);
1014 network->connecting = FALSE;
1016 ipconfig_ipv6 = __connman_service_get_ip6config(service);
1017 err = __connman_ipconfig_address_add(ipconfig_ipv6);
1021 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
1028 connman_network_set_error(network,
1029 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1033 static void autoconf_ipv6_set(struct connman_network *network);
1034 static void dhcpv6_callback(struct connman_network *network,
1035 connman_bool_t success);
1038 * Have a separate callback for renew so that we do not do autoconf
1039 * in wrong phase as the dhcpv6_callback() is also called when doing
1040 * DHCPv6 solicitation.
1042 static void dhcpv6_renew_callback(struct connman_network *network,
1043 connman_bool_t success)
1045 if (success == TRUE)
1046 dhcpv6_callback(network, success);
1048 stop_dhcpv6(network);
1050 /* restart and do solicit again. */
1051 autoconf_ipv6_set(network);
1055 static void dhcpv6_callback(struct connman_network *network,
1056 connman_bool_t success)
1058 DBG("success %d", success);
1060 /* Start the renew process if necessary */
1061 if (success == TRUE) {
1063 if (dhcpv6_set_addresses(network) < 0) {
1064 stop_dhcpv6(network);
1068 if (__connman_dhcpv6_start_renew(network,
1069 dhcpv6_renew_callback) == -ETIMEDOUT)
1070 dhcpv6_renew_callback(network, FALSE);
1072 stop_dhcpv6(network);
1075 static void check_dhcpv6(struct nd_router_advert *reply,
1076 unsigned int length, void *user_data)
1078 struct connman_network *network = user_data;
1081 DBG("reply %p", reply);
1083 if (reply == NULL) {
1085 * Router solicitation message seem to get lost easily so
1086 * try to send it again.
1088 if (network->router_solicit_count > 0) {
1089 DBG("re-send router solicitation %d",
1090 network->router_solicit_count);
1091 network->router_solicit_count--;
1092 __connman_inet_ipv6_send_rs(network->index, 1,
1093 check_dhcpv6, network);
1096 connman_network_unref(network);
1100 network->router_solicit_count = 0;
1103 * If we were disconnected while waiting router advertisement,
1104 * we just quit and do not start DHCPv6
1106 if (network->connected == FALSE) {
1107 connman_network_unref(network);
1111 prefixes = __connman_inet_ipv6_get_prefixes(reply, length);
1114 * We do stateful/stateless DHCPv6 if router advertisement says so.
1116 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED)
1117 __connman_dhcpv6_start(network, prefixes, dhcpv6_callback);
1118 else if (reply->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
1119 __connman_dhcpv6_start_info(network, dhcpv6_info_callback);
1121 connman_network_unref(network);
1124 static void autoconf_ipv6_set(struct connman_network *network)
1126 struct connman_service *service;
1127 struct connman_ipconfig *ipconfig;
1130 DBG("network %p", network);
1132 if (network->router_solicit_count > 0) {
1134 * The autoconfiguration is already pending and we have sent
1135 * router solicitation messages and are now waiting answers.
1136 * There is no need to continue any further.
1138 DBG("autoconfiguration already started");
1142 __connman_device_set_network(network->device, network);
1144 connman_device_set_disconnected(network->device, FALSE);
1146 network->connecting = FALSE;
1148 service = __connman_service_lookup_from_network(network);
1149 if (service == NULL)
1152 ipconfig = __connman_service_get_ip6config(service);
1153 if (ipconfig == NULL)
1156 index = __connman_ipconfig_get_index(ipconfig);
1158 connman_network_ref(network);
1160 /* Try to get stateless DHCPv6 information, RFC 3736 */
1161 network->router_solicit_count = 3;
1162 __connman_inet_ipv6_send_rs(index, 1, check_dhcpv6, network);
1165 static void set_connected(struct connman_network *network)
1167 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
1168 enum connman_ipconfig_method ipv4_method, ipv6_method;
1169 struct connman_service *service;
1172 if (network->connected == TRUE)
1175 network->connected = TRUE;
1177 service = __connman_service_lookup_from_network(network);
1179 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1180 ipconfig_ipv6 = __connman_service_get_ip6config(service);
1182 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
1185 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
1186 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
1188 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
1190 switch (ipv6_method) {
1191 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1192 case CONNMAN_IPCONFIG_METHOD_OFF:
1194 case CONNMAN_IPCONFIG_METHOD_DHCP:
1195 case CONNMAN_IPCONFIG_METHOD_AUTO:
1196 autoconf_ipv6_set(network);
1198 case CONNMAN_IPCONFIG_METHOD_FIXED:
1199 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1200 ret = manual_ipv6_set(network, ipconfig_ipv6);
1202 connman_network_set_error(network,
1203 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1209 switch (ipv4_method) {
1210 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1211 case CONNMAN_IPCONFIG_METHOD_OFF:
1212 case CONNMAN_IPCONFIG_METHOD_AUTO:
1214 case CONNMAN_IPCONFIG_METHOD_FIXED:
1215 if (set_connected_fixed(network) < 0) {
1216 connman_network_set_error(network,
1217 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1221 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1222 set_connected_manual(network);
1224 case CONNMAN_IPCONFIG_METHOD_DHCP:
1225 if (set_connected_dhcp(network) < 0) {
1226 connman_network_set_error(network,
1227 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1232 network->connecting = FALSE;
1234 connman_network_set_associating(network, FALSE);
1237 static void set_disconnected(struct connman_network *network)
1239 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
1240 enum connman_ipconfig_method ipv4_method, ipv6_method;
1241 enum connman_service_state state;
1242 struct connman_service *service;
1244 if (network->connected == FALSE)
1247 network->connected = FALSE;
1249 service = __connman_service_lookup_from_network(network);
1251 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1252 ipconfig_ipv6 = __connman_service_get_ip6config(service);
1254 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
1257 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
1258 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
1260 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
1263 * Resetting solicit count here will prevent the RS resend loop
1264 * from sending packets in check_dhcpv6()
1266 network->router_solicit_count = 0;
1268 __connman_device_set_network(network->device, NULL);
1270 switch (ipv6_method) {
1271 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1272 case CONNMAN_IPCONFIG_METHOD_OFF:
1273 case CONNMAN_IPCONFIG_METHOD_FIXED:
1274 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1276 case CONNMAN_IPCONFIG_METHOD_DHCP:
1277 case CONNMAN_IPCONFIG_METHOD_AUTO:
1278 release_dhcpv6(network);
1282 switch (ipv4_method) {
1283 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1284 case CONNMAN_IPCONFIG_METHOD_OFF:
1285 case CONNMAN_IPCONFIG_METHOD_AUTO:
1286 case CONNMAN_IPCONFIG_METHOD_FIXED:
1287 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1289 case CONNMAN_IPCONFIG_METHOD_DHCP:
1290 __connman_dhcp_stop(network);
1295 * We only set the disconnect state if we were not in idle
1296 * or in failure. It does not make sense to go to disconnect
1297 * state if we were not connected.
1299 state = __connman_service_ipconfig_get_state(service,
1300 CONNMAN_IPCONFIG_TYPE_IPV4);
1301 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1302 state != CONNMAN_SERVICE_STATE_FAILURE)
1303 __connman_service_ipconfig_indicate_state(service,
1304 CONNMAN_SERVICE_STATE_DISCONNECT,
1305 CONNMAN_IPCONFIG_TYPE_IPV4);
1307 state = __connman_service_ipconfig_get_state(service,
1308 CONNMAN_IPCONFIG_TYPE_IPV6);
1309 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1310 state != CONNMAN_SERVICE_STATE_FAILURE)
1311 __connman_service_ipconfig_indicate_state(service,
1312 CONNMAN_SERVICE_STATE_DISCONNECT,
1313 CONNMAN_IPCONFIG_TYPE_IPV6);
1315 __connman_connection_gateway_remove(service,
1316 CONNMAN_IPCONFIG_TYPE_ALL);
1318 __connman_ipconfig_address_unset(ipconfig_ipv4);
1319 __connman_ipconfig_address_unset(ipconfig_ipv6);
1322 * Special handling for IPv6 autoconfigured address.
1323 * The simplest way to remove autoconfigured routes is to
1324 * disable IPv6 temporarily so that kernel will do the cleanup
1327 if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
1328 __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
1329 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
1332 __connman_service_ipconfig_indicate_state(service,
1333 CONNMAN_SERVICE_STATE_IDLE,
1334 CONNMAN_IPCONFIG_TYPE_IPV4);
1336 __connman_service_ipconfig_indicate_state(service,
1337 CONNMAN_SERVICE_STATE_IDLE,
1338 CONNMAN_IPCONFIG_TYPE_IPV6);
1340 network->connecting = FALSE;
1342 connman_network_set_associating(network, FALSE);
1346 * connman_network_set_connected:
1347 * @network: network structure
1348 * @connected: connected state
1350 * Change connected state of network
1352 int connman_network_set_connected(struct connman_network *network,
1353 connman_bool_t connected)
1355 DBG("network %p connected %d/%d connecting %d associating %d",
1356 network, network->connected, connected, network->connecting,
1357 network->associating);
1359 if ((network->connecting == TRUE || network->associating == TRUE) &&
1360 connected == FALSE) {
1361 connman_network_set_error(network,
1362 CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
1363 if (__connman_network_disconnect(network) == 0)
1367 if (network->connected == connected)
1370 if (connected == FALSE)
1371 set_disconnected(network);
1373 set_connected(network);
1379 * connman_network_get_connected:
1380 * @network: network structure
1382 * Get network connection status
1384 connman_bool_t connman_network_get_connected(struct connman_network *network)
1386 return network->connected;
1390 * connman_network_get_associating:
1391 * @network: network structure
1393 * Get network associating status
1395 connman_bool_t connman_network_get_associating(struct connman_network *network)
1397 return network->associating;
1400 int connman_network_connect_hidden(struct connman_network *network,
1401 char *identity, char* passphrase)
1404 struct connman_service *service;
1408 service = __connman_service_lookup_from_network(network);
1409 if (service == NULL)
1412 if (identity != NULL)
1413 __connman_service_set_agent_identity(service, identity);
1415 if (passphrase != NULL)
1416 err = __connman_service_add_passphrase(service, passphrase);
1418 if (err == -ENOKEY) {
1419 __connman_service_indicate_error(service,
1420 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1423 return __connman_service_connect(service);
1427 * __connman_network_connect:
1428 * @network: network structure
1432 int __connman_network_connect(struct connman_network *network)
1436 DBG("network %p", network);
1438 if (network->connected == TRUE)
1441 if (network->connecting == TRUE || network->associating == TRUE)
1444 if (network->driver == NULL)
1447 if (network->driver->connect == NULL)
1450 if (network->device == NULL)
1453 network->connecting = TRUE;
1455 __connman_device_disconnect(network->device);
1457 err = network->driver->connect(network);
1459 if (err == -EINPROGRESS)
1460 connman_network_set_associating(network, TRUE);
1462 network->connecting = FALSE;
1468 set_connected(network);
1474 * __connman_network_disconnect:
1475 * @network: network structure
1477 * Disconnect network
1479 int __connman_network_disconnect(struct connman_network *network)
1483 DBG("network %p", network);
1485 if (network->connected == FALSE && network->connecting == FALSE &&
1486 network->associating == FALSE)
1489 if (network->driver == NULL)
1492 if (network->driver->disconnect == NULL)
1495 network->connecting = FALSE;
1497 err = network->driver->disconnect(network);
1499 set_disconnected(network);
1504 static int manual_ipv4_set(struct connman_network *network,
1505 struct connman_ipconfig *ipconfig)
1507 struct connman_service *service;
1510 service = __connman_service_lookup_from_network(network);
1511 if (service == NULL)
1514 err = __connman_ipconfig_address_add(ipconfig);
1516 connman_network_set_error(network,
1517 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1521 return __connman_ipconfig_gateway_add(ipconfig);
1524 int __connman_network_clear_ipconfig(struct connman_network *network,
1525 struct connman_ipconfig *ipconfig)
1527 struct connman_service *service;
1528 enum connman_ipconfig_method method;
1529 enum connman_ipconfig_type type;
1531 service = __connman_service_lookup_from_network(network);
1532 if (service == NULL)
1535 method = __connman_ipconfig_get_method(ipconfig);
1536 type = __connman_ipconfig_get_config_type(ipconfig);
1539 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1540 case CONNMAN_IPCONFIG_METHOD_OFF:
1541 case CONNMAN_IPCONFIG_METHOD_FIXED:
1543 case CONNMAN_IPCONFIG_METHOD_AUTO:
1544 release_dhcpv6(network);
1546 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1547 __connman_ipconfig_address_remove(ipconfig);
1549 case CONNMAN_IPCONFIG_METHOD_DHCP:
1550 __connman_dhcp_stop(network);
1554 if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
1555 __connman_service_ipconfig_indicate_state(service,
1556 CONNMAN_SERVICE_STATE_CONFIGURATION,
1557 CONNMAN_IPCONFIG_TYPE_IPV6);
1558 else if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
1559 __connman_service_ipconfig_indicate_state(service,
1560 CONNMAN_SERVICE_STATE_CONFIGURATION,
1561 CONNMAN_IPCONFIG_TYPE_IPV4);
1566 int __connman_network_set_ipconfig(struct connman_network *network,
1567 struct connman_ipconfig *ipconfig_ipv4,
1568 struct connman_ipconfig *ipconfig_ipv6)
1570 enum connman_ipconfig_method method;
1573 if (network == NULL)
1576 if (ipconfig_ipv6) {
1577 method = __connman_ipconfig_get_method(ipconfig_ipv6);
1580 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1581 case CONNMAN_IPCONFIG_METHOD_OFF:
1583 case CONNMAN_IPCONFIG_METHOD_AUTO:
1584 autoconf_ipv6_set(network);
1586 case CONNMAN_IPCONFIG_METHOD_FIXED:
1587 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1588 ret = manual_ipv6_set(network, ipconfig_ipv6);
1590 connman_network_set_error(network,
1591 CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
1595 case CONNMAN_IPCONFIG_METHOD_DHCP:
1600 if (ipconfig_ipv4) {
1601 method = __connman_ipconfig_get_method(ipconfig_ipv4);
1604 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1605 case CONNMAN_IPCONFIG_METHOD_OFF:
1606 case CONNMAN_IPCONFIG_METHOD_FIXED:
1607 case CONNMAN_IPCONFIG_METHOD_AUTO:
1609 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1610 return manual_ipv4_set(network, ipconfig_ipv4);
1611 case CONNMAN_IPCONFIG_METHOD_DHCP:
1612 return __connman_dhcp_start(network, dhcp_callback);
1619 int connman_network_set_ipaddress(struct connman_network *network,
1620 struct connman_ipaddress *ipaddress)
1622 struct connman_service *service;
1623 struct connman_ipconfig *ipconfig = NULL;
1625 DBG("network %p", network);
1627 service = __connman_service_lookup_from_network(network);
1628 if (service == NULL)
1631 ipconfig = __connman_service_get_ipconfig(service, ipaddress->family);
1632 if (ipconfig == NULL)
1635 __connman_ipconfig_set_local(ipconfig, ipaddress->local);
1636 __connman_ipconfig_set_peer(ipconfig, ipaddress->peer);
1637 __connman_ipconfig_set_broadcast(ipconfig, ipaddress->broadcast);
1638 __connman_ipconfig_set_prefixlen(ipconfig, ipaddress->prefixlen);
1639 __connman_ipconfig_set_gateway(ipconfig, ipaddress->gateway);
1644 int connman_network_set_nameservers(struct connman_network *network,
1645 const char *nameservers)
1647 struct connman_service *service;
1648 char **nameservers_array;
1651 DBG("network %p nameservers %s", network, nameservers);
1653 service = __connman_service_lookup_from_network(network);
1654 if (service == NULL)
1657 __connman_service_nameserver_clear(service);
1659 if (nameservers == NULL)
1662 nameservers_array = g_strsplit(nameservers, " ", 0);
1664 for (i = 0; nameservers_array[i] != NULL; i++) {
1665 __connman_service_nameserver_append(service,
1666 nameservers_array[i], FALSE);
1669 g_strfreev(nameservers_array);
1674 int connman_network_set_domain(struct connman_network *network,
1677 struct connman_service *service;
1679 DBG("network %p domain %s", network, domain);
1681 service = __connman_service_lookup_from_network(network);
1682 if (service == NULL)
1685 __connman_service_set_domainname(service, domain);
1691 * connman_network_set_name:
1692 * @network: network structure
1695 * Set display name value for network
1697 int connman_network_set_name(struct connman_network *network,
1700 DBG("network %p name %s", network, name);
1702 g_free(network->name);
1703 network->name = g_strdup(name);
1709 * connman_network_set_strength:
1710 * @network: network structure
1711 * @strength: strength value
1713 * Set signal strength value for network
1716 int connman_network_set_strength(struct connman_network *network,
1717 connman_uint8_t strength)
1719 DBG("network %p strengh %d", network, strength);
1721 network->strength = strength;
1726 connman_uint8_t connman_network_get_strength(struct connman_network *network)
1728 return network->strength;
1731 int connman_network_set_frequency(struct connman_network *network,
1732 connman_uint16_t frequency)
1734 DBG("network %p frequency %d", network, frequency);
1736 network->frequency = frequency;
1741 connman_uint16_t connman_network_get_frequency(struct connman_network *network)
1743 return network->frequency;
1746 int connman_network_set_wifi_channel(struct connman_network *network,
1747 connman_uint16_t channel)
1749 DBG("network %p wifi channel %d", network, channel);
1751 network->wifi.channel = channel;
1756 connman_uint16_t connman_network_get_wifi_channel(struct connman_network *network)
1758 return network->wifi.channel;
1762 * connman_network_set_string:
1763 * @network: network structure
1764 * @key: unique identifier
1765 * @value: string value
1767 * Set string value for specific key
1769 int connman_network_set_string(struct connman_network *network,
1770 const char *key, const char *value)
1772 DBG("network %p key %s value %s", network, key, value);
1774 if (g_strcmp0(key, "Name") == 0)
1775 return connman_network_set_name(network, value);
1777 if (g_str_equal(key, "Path") == TRUE) {
1778 g_free(network->path);
1779 network->path = g_strdup(value);
1780 } else if (g_str_equal(key, "Node") == TRUE) {
1781 g_free(network->node);
1782 network->node = g_strdup(value);
1783 } else if (g_str_equal(key, "WiFi.Mode") == TRUE) {
1784 g_free(network->wifi.mode);
1785 network->wifi.mode = g_strdup(value);
1786 } else if (g_str_equal(key, "WiFi.Security") == TRUE) {
1787 g_free(network->wifi.security);
1788 network->wifi.security = g_strdup(value);
1789 } else if (g_str_equal(key, "WiFi.Passphrase") == TRUE) {
1790 g_free(network->wifi.passphrase);
1791 network->wifi.passphrase = g_strdup(value);
1792 } else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE) {
1793 g_free(network->wifi.agent_passphrase);
1794 network->wifi.agent_passphrase = g_strdup(value);
1795 } else if (g_str_equal(key, "WiFi.EAP") == TRUE) {
1796 g_free(network->wifi.eap);
1797 network->wifi.eap = g_strdup(value);
1798 } else if (g_str_equal(key, "WiFi.Identity") == TRUE) {
1799 g_free(network->wifi.identity);
1800 network->wifi.identity = g_strdup(value);
1801 } else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE) {
1802 g_free(network->wifi.agent_identity);
1803 network->wifi.agent_identity = g_strdup(value);
1804 } else if (g_str_equal(key, "WiFi.CACertFile") == TRUE) {
1805 g_free(network->wifi.ca_cert_path);
1806 network->wifi.ca_cert_path = g_strdup(value);
1807 } else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE) {
1808 g_free(network->wifi.client_cert_path);
1809 network->wifi.client_cert_path = g_strdup(value);
1810 } else if (g_str_equal(key, "WiFi.PrivateKeyFile") == TRUE) {
1811 g_free(network->wifi.private_key_path);
1812 network->wifi.private_key_path = g_strdup(value);
1813 } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase") == TRUE) {
1814 g_free(network->wifi.private_key_passphrase);
1815 network->wifi.private_key_passphrase = g_strdup(value);
1816 } else if (g_str_equal(key, "WiFi.Phase2") == TRUE) {
1817 g_free(network->wifi.phase2_auth);
1818 network->wifi.phase2_auth = g_strdup(value);
1819 } else if (g_str_equal(key, "WiFi.PinWPS") == TRUE) {
1820 g_free(network->wifi.pin_wps);
1821 network->wifi.pin_wps = g_strdup(value);
1830 * connman_network_get_string:
1831 * @network: network structure
1832 * @key: unique identifier
1834 * Get string value for specific key
1836 const char *connman_network_get_string(struct connman_network *network,
1839 DBG("network %p key %s", network, key);
1841 if (g_str_equal(key, "Path") == TRUE)
1842 return network->path;
1843 else if (g_str_equal(key, "Name") == TRUE)
1844 return network->name;
1845 else if (g_str_equal(key, "Node") == TRUE)
1846 return network->node;
1847 else if (g_str_equal(key, "WiFi.Mode") == TRUE)
1848 return network->wifi.mode;
1849 else if (g_str_equal(key, "WiFi.Security") == TRUE)
1850 return network->wifi.security;
1851 else if (g_str_equal(key, "WiFi.Passphrase") == TRUE)
1852 return network->wifi.passphrase;
1853 else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE)
1854 return network->wifi.agent_passphrase;
1855 else if (g_str_equal(key, "WiFi.EAP") == TRUE)
1856 return network->wifi.eap;
1857 else if (g_str_equal(key, "WiFi.Identity") == TRUE)
1858 return network->wifi.identity;
1859 else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE)
1860 return network->wifi.agent_identity;
1861 else if (g_str_equal(key, "WiFi.CACertFile") == TRUE)
1862 return network->wifi.ca_cert_path;
1863 else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE)
1864 return network->wifi.client_cert_path;
1865 else if (g_str_equal(key, "WiFi.PrivateKeyFile") == TRUE)
1866 return network->wifi.private_key_path;
1867 else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase") == TRUE)
1868 return network->wifi.private_key_passphrase;
1869 else if (g_str_equal(key, "WiFi.Phase2") == TRUE)
1870 return network->wifi.phase2_auth;
1871 else if (g_str_equal(key, "WiFi.PinWPS") == TRUE)
1872 return network->wifi.pin_wps;
1878 * connman_network_set_bool:
1879 * @network: network structure
1880 * @key: unique identifier
1881 * @value: boolean value
1883 * Set boolean value for specific key
1885 int connman_network_set_bool(struct connman_network *network,
1886 const char *key, connman_bool_t value)
1888 DBG("network %p key %s value %d", network, key, value);
1890 if (g_strcmp0(key, "Roaming") == 0)
1891 network->roaming = value;
1892 else if (g_strcmp0(key, "WiFi.WPS") == 0)
1893 network->wifi.wps = value;
1894 else if (g_strcmp0(key, "WiFi.UseWPS") == 0)
1895 network->wifi.use_wps = value;
1901 * connman_network_get_bool:
1902 * @network: network structure
1903 * @key: unique identifier
1905 * Get boolean value for specific key
1907 connman_bool_t connman_network_get_bool(struct connman_network *network,
1910 DBG("network %p key %s", network, key);
1912 if (g_str_equal(key, "Roaming") == TRUE)
1913 return network->roaming;
1914 else if (g_str_equal(key, "WiFi.WPS") == TRUE)
1915 return network->wifi.wps;
1916 else if (g_str_equal(key, "WiFi.UseWPS") == TRUE)
1917 return network->wifi.use_wps;
1923 * connman_network_set_blob:
1924 * @network: network structure
1925 * @key: unique identifier
1929 * Set binary blob value for specific key
1931 int connman_network_set_blob(struct connman_network *network,
1932 const char *key, const void *data, unsigned int size)
1934 DBG("network %p key %s size %d", network, key, size);
1936 if (g_str_equal(key, "WiFi.SSID") == TRUE) {
1937 g_free(network->wifi.ssid);
1938 network->wifi.ssid = g_try_malloc(size);
1939 if (network->wifi.ssid != NULL) {
1940 memcpy(network->wifi.ssid, data, size);
1941 network->wifi.ssid_len = size;
1943 network->wifi.ssid_len = 0;
1952 * connman_network_get_blob:
1953 * @network: network structure
1954 * @key: unique identifier
1955 * @size: pointer to blob size
1957 * Get binary blob value for specific key
1959 const void *connman_network_get_blob(struct connman_network *network,
1960 const char *key, unsigned int *size)
1962 DBG("network %p key %s", network, key);
1964 if (g_str_equal(key, "WiFi.SSID") == TRUE) {
1966 *size = network->wifi.ssid_len;
1967 return network->wifi.ssid;
1973 void __connman_network_set_device(struct connman_network *network,
1974 struct connman_device *device)
1976 if (network->device == device)
1979 if (network->device != NULL)
1980 network_remove(network);
1982 network->device = device;
1984 if (network->device != NULL)
1985 network_probe(network);
1989 * connman_network_get_device:
1990 * @network: network structure
1992 * Get parent device of network
1994 struct connman_device *connman_network_get_device(struct connman_network *network)
1996 return network->device;
2000 * connman_network_get_data:
2001 * @network: network structure
2003 * Get private network data pointer
2005 void *connman_network_get_data(struct connman_network *network)
2007 return network->driver_data;
2011 * connman_network_set_data:
2012 * @network: network structure
2013 * @data: data pointer
2015 * Set private network data pointer
2017 void connman_network_set_data(struct connman_network *network, void *data)
2019 network->driver_data = data;
2022 void connman_network_update(struct connman_network *network)
2024 switch (network->type) {
2025 case CONNMAN_NETWORK_TYPE_UNKNOWN:
2026 case CONNMAN_NETWORK_TYPE_VENDOR:
2028 case CONNMAN_NETWORK_TYPE_ETHERNET:
2029 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
2030 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
2031 case CONNMAN_NETWORK_TYPE_CELLULAR:
2032 case CONNMAN_NETWORK_TYPE_WIFI:
2033 case CONNMAN_NETWORK_TYPE_WIMAX:
2037 if (network->group != NULL)
2038 __connman_service_update_from_network(network);
2041 int __connman_network_init(void)
2048 void __connman_network_cleanup(void)