5 * Copyright (C) 2007-2014 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32 * How many times to send RS with the purpose of
33 * refreshing RDNSS entries before they actually expire.
34 * With a value of 1, one RS will be sent, with no retries.
36 #define RS_REFRESH_COUNT 1
39 * Value in seconds to wait for RA after RS was sent.
40 * After this time elapsed, we can send another RS.
42 #define RS_REFRESH_TIMEOUT 3
45 #define WIFI_ENCYPTION_MODE_LEN_MAX 6
46 #define WIFI_BSSID_LEN_MAX 6
49 static GSList *network_list = NULL;
50 static GSList *driver_list = NULL;
52 struct connman_network {
54 enum connman_network_type type;
66 int router_solicit_count;
67 int router_solicit_refresh_count;
69 struct connman_network_driver *driver;
75 struct connman_device *device;
81 unsigned short channel;
88 char *client_cert_path;
89 char *private_key_path;
90 char *private_key_passphrase;
96 char encryption_mode[WIFI_ENCYPTION_MODE_LEN_MAX];
97 unsigned char bssid[WIFI_BSSID_LEN_MAX];
99 unsigned int isHS20AP;
100 unsigned int keymgmt;
103 int disconnect_reason;
104 int assoc_status_code;
106 unsigned int wifi_vsie_len;
110 #if defined TIZEN_EXT
111 /* Multiple APN services and a default APN which a user selected */
112 bool default_internet;
117 static void autoconf_ipv6_set(struct connman_network *network);
119 static const char *type2string(enum connman_network_type type)
122 case CONNMAN_NETWORK_TYPE_UNKNOWN:
123 case CONNMAN_NETWORK_TYPE_VENDOR:
125 case CONNMAN_NETWORK_TYPE_ETHERNET:
127 case CONNMAN_NETWORK_TYPE_GADGET:
129 case CONNMAN_NETWORK_TYPE_WIFI:
131 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
132 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
134 case CONNMAN_NETWORK_TYPE_CELLULAR:
141 static bool match_driver(struct connman_network *network,
142 struct connman_network_driver *driver)
144 if (network->type == driver->type ||
145 driver->type == CONNMAN_NETWORK_TYPE_UNKNOWN)
151 static void set_configuration(struct connman_network *network,
152 enum connman_ipconfig_type type)
154 struct connman_service *service;
156 DBG("network %p", network);
158 if (!network->device)
161 __connman_device_set_network(network->device, network);
163 connman_device_set_disconnected(network->device, false);
165 service = connman_service_lookup_from_network(network);
166 __connman_service_ipconfig_indicate_state(service,
167 CONNMAN_SERVICE_STATE_CONFIGURATION,
171 static void dhcp_success(struct connman_network *network)
173 struct connman_service *service;
174 struct connman_ipconfig *ipconfig_ipv4;
177 service = connman_service_lookup_from_network(network);
181 ipconfig_ipv4 = __connman_service_get_ip4config(service);
183 DBG("lease acquired for ipconfig %p", ipconfig_ipv4);
188 err = __connman_ipconfig_address_add(ipconfig_ipv4);
192 #if defined TIZEN_EXT
193 err = __connman_ipconfig_gateway_add(ipconfig_ipv4, service);
195 err = __connman_ipconfig_gateway_add(ipconfig_ipv4);
203 connman_network_set_error(network,
204 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
207 static void dhcp_failure(struct connman_network *network)
209 struct connman_service *service;
210 struct connman_ipconfig *ipconfig_ipv4;
212 service = connman_service_lookup_from_network(network);
216 ipconfig_ipv4 = __connman_service_get_ip4config(service);
218 DBG("lease lost for ipconfig %p", ipconfig_ipv4);
223 __connman_ipconfig_address_remove(ipconfig_ipv4);
224 __connman_ipconfig_gateway_remove(ipconfig_ipv4);
227 static void dhcp_callback(struct connman_ipconfig *ipconfig,
228 struct connman_network *network,
229 bool success, gpointer data)
231 #if defined TIZEN_EXT
232 struct connman_service *service;
233 struct connman_ipconfig *ipconfig_ipv6;
236 network->connecting = false;
239 dhcp_success(network);
241 dhcp_failure(network);
243 #if defined TIZEN_EXT
244 service = connman_service_lookup_from_network(network);
245 ipconfig_ipv6 = __connman_service_get_ip6config(service);
246 if (__connman_ipconfig_get_method(ipconfig_ipv6) == CONNMAN_IPCONFIG_METHOD_AUTO) {
247 DBG("IPv6 autoconf start");
248 set_configuration(network, CONNMAN_IPCONFIG_TYPE_IPV6);
249 autoconf_ipv6_set(network);
254 static int set_connected_manual(struct connman_network *network)
257 struct connman_service *service;
258 struct connman_ipconfig *ipconfig;
260 DBG("network %p", network);
262 network->connecting = false;
264 service = connman_service_lookup_from_network(network);
266 ipconfig = __connman_service_get_ip4config(service);
268 if (!__connman_ipconfig_get_local(ipconfig))
269 __connman_service_read_ip4config(service);
271 err = __connman_ipconfig_address_add(ipconfig);
275 #if defined TIZEN_EXT
276 err = __connman_ipconfig_gateway_add(ipconfig, service);
278 err = __connman_ipconfig_gateway_add(ipconfig);
287 static int set_connected_dhcp(struct connman_network *network)
289 struct connman_service *service;
290 struct connman_ipconfig *ipconfig_ipv4;
293 DBG("network %p", network);
295 service = connman_service_lookup_from_network(network);
296 ipconfig_ipv4 = __connman_service_get_ip4config(service);
298 err = __connman_dhcp_start(ipconfig_ipv4, network,
299 dhcp_callback, NULL);
301 connman_error("Can not request DHCP lease");
308 static int manual_ipv6_set(struct connman_network *network,
309 struct connman_ipconfig *ipconfig_ipv6)
311 struct connman_service *service;
314 DBG("network %p ipv6 %p", network, ipconfig_ipv6);
316 service = connman_service_lookup_from_network(network);
320 if (!__connman_ipconfig_get_local(ipconfig_ipv6))
321 __connman_service_read_ip6config(service);
323 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
325 err = __connman_ipconfig_address_add(ipconfig_ipv6);
327 connman_network_set_error(network,
328 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
332 #if defined TIZEN_EXT
333 err = __connman_ipconfig_gateway_add(ipconfig_ipv6, service);
335 err = __connman_ipconfig_gateway_add(ipconfig_ipv6);
340 __connman_connection_gateway_activate(service,
341 CONNMAN_IPCONFIG_TYPE_IPV6);
343 __connman_device_set_network(network->device, network);
345 connman_device_set_disconnected(network->device, false);
347 connman_network_set_associating(network, false);
349 network->connecting = false;
354 static void stop_dhcpv6(struct connman_network *network)
356 network->connecting = false;
358 __connman_dhcpv6_stop(network);
361 static void dhcpv6_release_callback(struct connman_network *network,
362 enum __connman_dhcpv6_status status,
365 DBG("status %d", status);
367 stop_dhcpv6(network);
370 static void release_dhcpv6(struct connman_network *network)
372 __connman_dhcpv6_start_release(network, dhcpv6_release_callback);
373 stop_dhcpv6(network);
376 static void dhcpv6_info_callback(struct connman_network *network,
377 enum __connman_dhcpv6_status status,
380 DBG("status %d", status);
382 stop_dhcpv6(network);
385 static int dhcpv6_set_addresses(struct connman_network *network)
387 struct connman_service *service;
388 struct connman_ipconfig *ipconfig_ipv6;
391 service = connman_service_lookup_from_network(network);
395 network->connecting = false;
397 ipconfig_ipv6 = __connman_service_get_ip6config(service);
398 err = __connman_ipconfig_address_add(ipconfig_ipv6);
405 connman_network_set_error(network,
406 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
410 static void dhcpv6_callback(struct connman_network *network,
411 enum __connman_dhcpv6_status status, gpointer data);
414 * Have a separate callback for renew so that we do not do autoconf
415 * in wrong phase as the dhcpv6_callback() is also called when doing
416 * DHCPv6 solicitation.
418 static void dhcpv6_renew_callback(struct connman_network *network,
419 enum __connman_dhcpv6_status status,
423 case CONNMAN_DHCPV6_STATUS_SUCCEED:
424 dhcpv6_callback(network, status, data);
426 case CONNMAN_DHCPV6_STATUS_FAIL:
427 case CONNMAN_DHCPV6_STATUS_RESTART:
428 stop_dhcpv6(network);
430 /* restart and do solicit again. */
431 autoconf_ipv6_set(network);
436 static void dhcpv6_callback(struct connman_network *network,
437 enum __connman_dhcpv6_status status, gpointer data)
439 DBG("status %d", status);
441 /* Start the renew process if necessary */
442 if (status == CONNMAN_DHCPV6_STATUS_SUCCEED) {
444 if (dhcpv6_set_addresses(network) < 0) {
445 stop_dhcpv6(network);
449 if (__connman_dhcpv6_start_renew(network,
450 dhcpv6_renew_callback) == -ETIMEDOUT)
451 dhcpv6_renew_callback(network,
452 CONNMAN_DHCPV6_STATUS_FAIL,
455 } else if (status == CONNMAN_DHCPV6_STATUS_RESTART) {
456 stop_dhcpv6(network);
457 autoconf_ipv6_set(network);
459 stop_dhcpv6(network);
462 static void check_dhcpv6(struct nd_router_advert *reply,
463 unsigned int length, void *user_data)
465 struct connman_network *network = user_data;
466 struct connman_service *service;
469 DBG("reply %p", reply);
473 * Router solicitation message seem to get lost easily so
474 * try to send it again.
476 if (network->router_solicit_count > 0) {
477 DBG("re-send router solicitation %d",
478 network->router_solicit_count);
479 network->router_solicit_count--;
480 __connman_inet_ipv6_send_rs(network->index, 1,
481 check_dhcpv6, network);
484 #if defined TIZEN_EXT
485 DBG("RA message is not received from server in reply of RS.");
487 connman_network_unref(network);
491 network->router_solicit_count = 0;
494 * If we were disconnected while waiting router advertisement,
495 * we just quit and do not start DHCPv6
497 if (!network->connected) {
498 connman_network_unref(network);
499 #if defined TIZEN_EXT
500 DBG("Network is not connected");
505 prefixes = __connman_inet_ipv6_get_prefixes(reply, length);
508 * If IPv6 config is missing from service, then create it.
509 * The ipconfig might be missing if we got a rtnl message
510 * that disabled IPv6 config and thus removed it. This
511 * can happen if we are switching from one service to
512 * another in the same interface. The only way to get IPv6
513 * config back is to re-create it here.
515 service = connman_service_lookup_from_network(network);
517 connman_service_create_ip6config(service, network->index);
519 connman_network_set_associating(network, false);
521 __connman_service_ipconfig_indicate_state(service,
522 CONNMAN_SERVICE_STATE_CONFIGURATION,
523 CONNMAN_IPCONFIG_TYPE_IPV6);
527 * We do stateful/stateless DHCPv6 if router advertisement says so.
529 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED) {
530 #if defined TIZEN_EXT
531 DBG("IPv6 ND_RA_FLAG_MANAGED");
533 __connman_dhcpv6_start(network, prefixes, dhcpv6_callback);
535 if (reply->nd_ra_flags_reserved & ND_RA_FLAG_OTHER)
536 #if defined TIZEN_EXT
538 DBG("IPv6 ND_RA_FLAG_OTHER");
540 __connman_dhcpv6_start_info(network,
541 dhcpv6_info_callback);
542 #if defined TIZEN_EXT
546 g_slist_free_full(prefixes, g_free);
547 network->connecting = false;
550 connman_network_unref(network);
553 static void receive_refresh_rs_reply(struct nd_router_advert *reply,
554 unsigned int length, void *user_data)
556 struct connman_network *network = user_data;
558 DBG("reply %p", reply);
562 * Router solicitation message seem to get lost easily so
563 * try to send it again.
565 if (network->router_solicit_refresh_count > 1) {
566 network->router_solicit_refresh_count--;
567 DBG("re-send router solicitation %d",
568 network->router_solicit_refresh_count);
569 __connman_inet_ipv6_send_rs(network->index,
571 receive_refresh_rs_reply,
577 /* RS refresh not in progress anymore */
578 network->router_solicit_refresh_count = 0;
580 connman_network_unref(network);
584 int __connman_network_refresh_rs_ipv6(struct connman_network *network,
589 DBG("network %p index %d", network, index);
591 /* Send only one RS for all RDNSS entries which are about to expire */
592 if (network->router_solicit_refresh_count > 0) {
593 DBG("RS refresh already started");
597 network->router_solicit_refresh_count = RS_REFRESH_COUNT;
599 connman_network_ref(network);
601 ret = __connman_inet_ipv6_send_rs(index, RS_REFRESH_TIMEOUT,
602 receive_refresh_rs_reply, network);
606 static void autoconf_ipv6_set(struct connman_network *network)
608 struct connman_service *service;
609 struct connman_ipconfig *ipconfig;
612 DBG("network %p", network);
614 if (network->router_solicit_count > 0) {
616 * The autoconfiguration is already pending and we have sent
617 * router solicitation messages and are now waiting answers.
618 * There is no need to continue any further.
620 DBG("autoconfiguration already started");
624 __connman_device_set_network(network->device, network);
626 connman_device_set_disconnected(network->device, false);
628 #if defined TIZEN_EXT
629 if(network->type == CONNMAN_NETWORK_TYPE_CELLULAR)
633 service = connman_service_lookup_from_network(network);
637 ipconfig = __connman_service_get_ip6config(service);
641 __connman_ipconfig_enable_ipv6(ipconfig);
643 __connman_ipconfig_address_remove(ipconfig);
645 index = __connman_ipconfig_get_index(ipconfig);
647 connman_network_ref(network);
649 /* Try to get stateless DHCPv6 information, RFC 3736 */
650 network->router_solicit_count = 3;
651 __connman_inet_ipv6_send_rs(index, 1, check_dhcpv6, network);
654 static void set_connected(struct connman_network *network)
656 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
657 struct connman_service *service;
659 if (network->connected)
662 connman_network_set_associating(network, false);
664 network->connected = true;
666 service = connman_service_lookup_from_network(network);
668 ipconfig_ipv4 = __connman_service_get_ip4config(service);
669 ipconfig_ipv6 = __connman_service_get_ip6config(service);
671 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
674 __connman_network_enable_ipconfig(network, ipconfig_ipv4);
675 __connman_network_enable_ipconfig(network, ipconfig_ipv6);
678 static void set_disconnected(struct connman_network *network)
680 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
681 enum connman_ipconfig_method ipv4_method, ipv6_method;
682 enum connman_service_state state;
683 struct connman_service *service;
685 service = connman_service_lookup_from_network(network);
687 ipconfig_ipv4 = __connman_service_get_ip4config(service);
688 ipconfig_ipv6 = __connman_service_get_ip6config(service);
690 DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
693 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
694 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
696 DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
699 * Resetting solicit count here will prevent the RS resend loop
700 * from sending packets in check_dhcpv6()
702 network->router_solicit_count = 0;
704 __connman_device_set_network(network->device, NULL);
706 if (network->connected) {
707 switch (ipv6_method) {
708 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
709 case CONNMAN_IPCONFIG_METHOD_OFF:
710 case CONNMAN_IPCONFIG_METHOD_FIXED:
711 case CONNMAN_IPCONFIG_METHOD_MANUAL:
713 case CONNMAN_IPCONFIG_METHOD_DHCP:
714 case CONNMAN_IPCONFIG_METHOD_AUTO:
715 release_dhcpv6(network);
719 switch (ipv4_method) {
720 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
721 case CONNMAN_IPCONFIG_METHOD_OFF:
722 case CONNMAN_IPCONFIG_METHOD_AUTO:
723 case CONNMAN_IPCONFIG_METHOD_FIXED:
724 case CONNMAN_IPCONFIG_METHOD_MANUAL:
726 case CONNMAN_IPCONFIG_METHOD_DHCP:
727 __connman_dhcp_stop(ipconfig_ipv4);
733 * We only set the disconnect state if we were not in idle
734 * or in failure. It does not make sense to go to disconnect
735 * state if we were not connected.
737 state = __connman_service_ipconfig_get_state(service,
738 CONNMAN_IPCONFIG_TYPE_IPV4);
739 if (state != CONNMAN_SERVICE_STATE_IDLE &&
740 state != CONNMAN_SERVICE_STATE_FAILURE)
741 __connman_service_ipconfig_indicate_state(service,
742 CONNMAN_SERVICE_STATE_DISCONNECT,
743 CONNMAN_IPCONFIG_TYPE_IPV4);
745 state = __connman_service_ipconfig_get_state(service,
746 CONNMAN_IPCONFIG_TYPE_IPV6);
747 if (state != CONNMAN_SERVICE_STATE_IDLE &&
748 state != CONNMAN_SERVICE_STATE_FAILURE)
749 __connman_service_ipconfig_indicate_state(service,
750 CONNMAN_SERVICE_STATE_DISCONNECT,
751 CONNMAN_IPCONFIG_TYPE_IPV6);
753 if (network->connected) {
754 #if defined TIZEN_EXT
756 * Do not remove gateway and its address,
757 * if there are connected profiles that use same interface (multiple PDN)
759 if (connman_service_get_type(service) != CONNMAN_SERVICE_TYPE_CELLULAR ||
760 __connman_service_get_connected_count_of_iface(service) <= 0) {
762 __connman_connection_gateway_remove(service,
763 CONNMAN_IPCONFIG_TYPE_ALL);
765 __connman_ipconfig_address_unset(ipconfig_ipv4);
766 __connman_ipconfig_address_unset(ipconfig_ipv6);
767 #if defined TIZEN_EXT
771 * Special handling for IPv6 autoconfigured address.
772 * The simplest way to remove autoconfigured routes is to
773 * disable IPv6 temporarily so that kernel will do the cleanup
776 if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
777 __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
778 __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
782 __connman_service_ipconfig_indicate_state(service,
783 CONNMAN_SERVICE_STATE_IDLE,
784 CONNMAN_IPCONFIG_TYPE_IPV4);
786 __connman_service_ipconfig_indicate_state(service,
787 CONNMAN_SERVICE_STATE_IDLE,
788 CONNMAN_IPCONFIG_TYPE_IPV6);
790 network->connecting = false;
791 network->connected = false;
793 connman_network_set_associating(network, false);
798 static int network_probe(struct connman_network *network)
801 struct connman_network_driver *driver = NULL;
803 DBG("network %p name %s", network, network->name);
808 for (list = driver_list; list; list = list->next) {
811 if (!match_driver(network, driver)) {
816 DBG("driver %p name %s", driver, driver->name);
818 if (driver->probe(network) == 0)
830 switch (network->type) {
831 case CONNMAN_NETWORK_TYPE_UNKNOWN:
832 case CONNMAN_NETWORK_TYPE_VENDOR:
834 case CONNMAN_NETWORK_TYPE_ETHERNET:
835 case CONNMAN_NETWORK_TYPE_GADGET:
836 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
837 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
838 case CONNMAN_NETWORK_TYPE_CELLULAR:
839 case CONNMAN_NETWORK_TYPE_WIFI:
840 network->driver = driver;
841 if (!__connman_service_create_from_network(network)) {
842 network->driver = NULL;
850 static void network_remove(struct connman_network *network)
852 DBG("network %p name %s", network, network->name);
854 if (!network->driver)
857 if (network->connected)
858 set_disconnected(network);
860 switch (network->type) {
861 case CONNMAN_NETWORK_TYPE_UNKNOWN:
862 case CONNMAN_NETWORK_TYPE_VENDOR:
864 case CONNMAN_NETWORK_TYPE_ETHERNET:
865 case CONNMAN_NETWORK_TYPE_GADGET:
866 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
867 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
868 case CONNMAN_NETWORK_TYPE_CELLULAR:
869 case CONNMAN_NETWORK_TYPE_WIFI:
870 if (network->group) {
871 __connman_service_remove_from_network(network);
873 g_free(network->group);
874 network->group = NULL;
879 if (network->driver->remove)
880 network->driver->remove(network);
882 network->driver = NULL;
885 static void probe_driver(struct connman_network_driver *driver)
889 DBG("driver %p name %s", driver, driver->name);
891 for (list = network_list; list; list = list->next) {
892 struct connman_network *network = list->data;
897 if (driver->type != network->type)
900 if (driver->probe(network) < 0)
903 network->driver = driver;
907 static void remove_driver(struct connman_network_driver *driver)
911 DBG("driver %p name %s", driver, driver->name);
913 for (list = network_list; list; list = list->next) {
914 struct connman_network *network = list->data;
916 if (network->driver == driver)
917 network_remove(network);
921 static gint compare_priority(gconstpointer a, gconstpointer b)
923 const struct connman_network_driver *driver1 = a;
924 const struct connman_network_driver *driver2 = b;
926 return driver2->priority - driver1->priority;
930 * connman_network_driver_register:
931 * @driver: network driver definition
933 * Register a new network driver
935 * Returns: %0 on success
937 int connman_network_driver_register(struct connman_network_driver *driver)
939 DBG("driver %p name %s", driver, driver->name);
941 driver_list = g_slist_insert_sorted(driver_list, driver,
944 probe_driver(driver);
950 * connman_network_driver_unregister:
951 * @driver: network driver definition
953 * Remove a previously registered network driver
955 void connman_network_driver_unregister(struct connman_network_driver *driver)
957 DBG("driver %p name %s", driver, driver->name);
959 driver_list = g_slist_remove(driver_list, driver);
961 remove_driver(driver);
964 static void network_destruct(struct connman_network *network)
966 DBG("network %p name %s", network, network->name);
968 g_free(network->wifi.ssid);
969 g_free(network->wifi.mode);
970 g_free(network->wifi.security);
971 g_free(network->wifi.passphrase);
972 g_free(network->wifi.eap);
973 g_free(network->wifi.identity);
974 g_free(network->wifi.agent_identity);
975 g_free(network->wifi.ca_cert_path);
976 g_free(network->wifi.client_cert_path);
977 g_free(network->wifi.private_key_path);
978 g_free(network->wifi.private_key_passphrase);
979 g_free(network->wifi.phase2_auth);
980 g_free(network->wifi.pin_wps);
981 #if defined TIZEN_EXT
982 g_free(network->wifi.wifi_vsie);
984 g_free(network->path);
985 g_free(network->group);
986 g_free(network->node);
987 g_free(network->name);
988 g_free(network->identifier);
990 network->device = NULL;
996 * connman_network_create:
997 * @identifier: network identifier (for example an unqiue name)
999 * Allocate a new network and assign the #identifier to it.
1001 * Returns: a newly-allocated #connman_network structure
1003 struct connman_network *connman_network_create(const char *identifier,
1004 enum connman_network_type type)
1006 struct connman_network *network;
1009 DBG("identifier %s type %d", identifier, type);
1011 network = g_try_new0(struct connman_network, 1);
1015 DBG("network %p", network);
1017 network->refcount = 1;
1019 ident = g_strdup(identifier);
1026 network->type = type;
1027 network->identifier = ident;
1029 network_list = g_slist_prepend(network_list, network);
1035 * connman_network_ref:
1036 * @network: network structure
1038 * Increase reference counter of network
1040 struct connman_network *
1041 connman_network_ref_debug(struct connman_network *network,
1042 const char *file, int line, const char *caller)
1044 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
1045 network->refcount + 1, file, line, caller);
1047 __sync_fetch_and_add(&network->refcount, 1);
1053 * connman_network_unref:
1054 * @network: network structure
1056 * Decrease reference counter of network
1058 void connman_network_unref_debug(struct connman_network *network,
1059 const char *file, int line, const char *caller)
1061 DBG("%p name %s ref %d by %s:%d:%s()", network, network->name,
1062 network->refcount - 1, file, line, caller);
1064 if (__sync_fetch_and_sub(&network->refcount, 1) != 1)
1067 network_list = g_slist_remove(network_list, network);
1069 network_destruct(network);
1072 const char *__connman_network_get_type(struct connman_network *network)
1074 return type2string(network->type);
1078 * connman_network_get_type:
1079 * @network: network structure
1081 * Get type of network
1083 enum connman_network_type connman_network_get_type(
1084 struct connman_network *network)
1086 return network->type;
1090 * connman_network_get_identifier:
1091 * @network: network structure
1093 * Get identifier of network
1095 const char *connman_network_get_identifier(struct connman_network *network)
1097 return network->identifier;
1101 * connman_network_set_index:
1102 * @network: network structure
1103 * @index: index number
1105 * Set index number of network
1107 void connman_network_set_index(struct connman_network *network, int index)
1109 struct connman_service *service;
1110 struct connman_ipconfig *ipconfig;
1112 service = connman_service_lookup_from_network(network);
1116 ipconfig = __connman_service_get_ip4config(service);
1118 __connman_ipconfig_set_index(ipconfig, index);
1120 DBG("index %d service %p ip4config %p", network->index,
1124 ipconfig = __connman_service_get_ip6config(service);
1126 __connman_ipconfig_set_index(ipconfig, index);
1128 DBG("index %d service %p ip6config %p", network->index,
1133 network->index = index;
1137 * connman_network_get_index:
1138 * @network: network structure
1140 * Get index number of network
1142 int connman_network_get_index(struct connman_network *network)
1144 return network->index;
1148 * connman_network_set_group:
1149 * @network: network structure
1150 * @group: group name
1152 * Set group name for automatic clustering
1154 void connman_network_set_group(struct connman_network *network,
1157 switch (network->type) {
1158 case CONNMAN_NETWORK_TYPE_UNKNOWN:
1159 case CONNMAN_NETWORK_TYPE_VENDOR:
1161 case CONNMAN_NETWORK_TYPE_ETHERNET:
1162 case CONNMAN_NETWORK_TYPE_GADGET:
1163 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
1164 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
1165 case CONNMAN_NETWORK_TYPE_CELLULAR:
1166 case CONNMAN_NETWORK_TYPE_WIFI:
1170 if (g_strcmp0(network->group, group) == 0) {
1172 __connman_service_update_from_network(network);
1176 if (network->group) {
1177 __connman_service_remove_from_network(network);
1179 g_free(network->group);
1182 network->group = g_strdup(group);
1185 network_probe(network);
1189 * connman_network_get_group:
1190 * @network: network structure
1192 * Get group name for automatic clustering
1194 const char *connman_network_get_group(struct connman_network *network)
1196 return network->group;
1199 const char *__connman_network_get_ident(struct connman_network *network)
1201 if (!network->device)
1204 return connman_device_get_ident(network->device);
1207 bool __connman_network_get_weakness(struct connman_network *network)
1209 switch (network->type) {
1210 case CONNMAN_NETWORK_TYPE_UNKNOWN:
1211 case CONNMAN_NETWORK_TYPE_VENDOR:
1212 case CONNMAN_NETWORK_TYPE_ETHERNET:
1213 case CONNMAN_NETWORK_TYPE_GADGET:
1214 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
1215 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
1216 case CONNMAN_NETWORK_TYPE_CELLULAR:
1218 case CONNMAN_NETWORK_TYPE_WIFI:
1219 if (network->strength > 0 && network->strength < 20)
1227 #if defined TIZEN_EXT
1228 void connman_network_set_connecting(struct connman_network *network)
1230 DBG("set network connecting true");
1231 network->connecting = TRUE;
1236 bool connman_network_get_connecting(struct connman_network *network)
1238 return network->connecting;
1242 * connman_network_set_available:
1243 * @network: network structure
1244 * @available: availability state
1246 * Change availability state of network (in range)
1248 int connman_network_set_available(struct connman_network *network,
1251 #if !defined TIZEN_EXT
1252 DBG("network %p available %d", network, available);
1255 if (network->available == available)
1258 network->available = available;
1264 * connman_network_get_available:
1265 * @network: network structure
1267 * Get network available setting
1269 bool connman_network_get_available(struct connman_network *network)
1271 return network->available;
1274 #if defined TIZEN_EXT
1275 void connman_network_clear_associating(struct connman_network *network)
1277 struct connman_service *service;
1278 enum connman_service_state state;
1280 DBG("network %p", network);
1282 network->connecting = FALSE;
1283 network->associating = FALSE;
1285 service = connman_service_lookup_from_network(network);
1289 state = __connman_service_ipconfig_get_state(service,
1290 CONNMAN_IPCONFIG_TYPE_IPV4);
1291 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1292 state != CONNMAN_SERVICE_STATE_FAILURE)
1293 __connman_service_ipconfig_indicate_state(service,
1294 CONNMAN_SERVICE_STATE_DISCONNECT,
1295 CONNMAN_IPCONFIG_TYPE_IPV4);
1297 state = __connman_service_ipconfig_get_state(service,
1298 CONNMAN_IPCONFIG_TYPE_IPV6);
1299 if (state != CONNMAN_SERVICE_STATE_IDLE &&
1300 state != CONNMAN_SERVICE_STATE_FAILURE)
1301 __connman_service_ipconfig_indicate_state(service,
1302 CONNMAN_SERVICE_STATE_DISCONNECT,
1303 CONNMAN_IPCONFIG_TYPE_IPV6);
1305 __connman_service_ipconfig_indicate_state(service,
1306 CONNMAN_SERVICE_STATE_IDLE,
1307 CONNMAN_IPCONFIG_TYPE_IPV4);
1309 __connman_service_ipconfig_indicate_state(service,
1310 CONNMAN_SERVICE_STATE_IDLE,
1311 CONNMAN_IPCONFIG_TYPE_IPV6);
1314 static gboolean __connman_network_clear_associating_delayed(gpointer user_data)
1317 gboolean found = FALSE;
1318 enum connman_service_state state_ipv4;
1319 enum connman_service_state state_ipv6;
1320 struct connman_service *service;
1321 struct connman_network *network = (struct connman_network *)user_data;
1323 for (list = network_list; list != NULL; list = list->next) {
1324 struct connman_network *item = list->data;
1326 if (item == network) {
1335 DBG("network %p name %s", network, network->name);
1336 service = connman_service_lookup_from_network(network);
1338 state_ipv4 = __connman_service_ipconfig_get_state(service,
1339 CONNMAN_IPCONFIG_TYPE_IPV4);
1340 state_ipv6 = __connman_service_ipconfig_get_state(service,
1341 CONNMAN_IPCONFIG_TYPE_IPV6);
1343 DBG("service %p state %d/%d", service, state_ipv4, state_ipv6);
1345 if (network->associating == FALSE &&
1346 state_ipv4 == CONNMAN_SERVICE_STATE_ASSOCIATION &&
1347 state_ipv6 == CONNMAN_SERVICE_STATE_ASSOCIATION) {
1348 __connman_service_ipconfig_indicate_state(service,
1349 CONNMAN_SERVICE_STATE_IDLE,
1350 CONNMAN_IPCONFIG_TYPE_IPV4);
1351 __connman_service_ipconfig_indicate_state(service,
1352 CONNMAN_SERVICE_STATE_IDLE,
1353 CONNMAN_IPCONFIG_TYPE_IPV6);
1355 if (network->associating == FALSE) {
1356 struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
1357 enum connman_ipconfig_method ipv4_method, ipv6_method;
1359 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1360 ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
1361 ipconfig_ipv6 = __connman_service_get_ip4config(service);
1362 ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
1364 if((ipv4_method == CONNMAN_IPCONFIG_METHOD_UNKNOWN || ipv4_method == CONNMAN_IPCONFIG_METHOD_OFF) &&
1365 (state_ipv6 == CONNMAN_SERVICE_STATE_ASSOCIATION))
1366 __connman_service_ipconfig_indicate_state(service,
1367 CONNMAN_SERVICE_STATE_IDLE,
1368 CONNMAN_IPCONFIG_TYPE_IPV6);
1369 if((ipv6_method == CONNMAN_IPCONFIG_METHOD_UNKNOWN || ipv6_method == CONNMAN_IPCONFIG_METHOD_OFF) &&
1370 (state_ipv4 == CONNMAN_SERVICE_STATE_ASSOCIATION))
1371 __connman_service_ipconfig_indicate_state(service,
1372 CONNMAN_SERVICE_STATE_IDLE,
1373 CONNMAN_IPCONFIG_TYPE_IPV4);
1382 * connman_network_set_associating:
1383 * @network: network structure
1384 * @associating: associating state
1386 * Change associating state of network
1388 int connman_network_set_associating(struct connman_network *network,
1391 DBG("network %p associating %d", network, associating);
1393 if (network->associating == associating)
1396 network->associating = associating;
1399 struct connman_service *service;
1401 service = connman_service_lookup_from_network(network);
1402 __connman_service_ipconfig_indicate_state(service,
1403 CONNMAN_SERVICE_STATE_ASSOCIATION,
1404 CONNMAN_IPCONFIG_TYPE_IPV4);
1405 __connman_service_ipconfig_indicate_state(service,
1406 CONNMAN_SERVICE_STATE_ASSOCIATION,
1407 CONNMAN_IPCONFIG_TYPE_IPV6);
1410 #if defined TIZEN_EXT
1411 if (associating == FALSE &&
1412 connman_network_get_bool(network, "WiFi.UseWPS") == FALSE)
1413 g_timeout_add_seconds(1,
1414 __connman_network_clear_associating_delayed,
1421 static void set_associate_error(struct connman_network *network)
1423 struct connman_service *service;
1425 service = connman_service_lookup_from_network(network);
1427 #if defined TIZEN_EXT
1428 __connman_service_indicate_error(service,
1429 CONNMAN_SERVICE_ERROR_AUTH_FAILED);
1431 __connman_service_indicate_error(service,
1432 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1436 static void set_configure_error(struct connman_network *network)
1438 struct connman_service *service;
1440 service = connman_service_lookup_from_network(network);
1442 __connman_service_indicate_error(service,
1443 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1446 static void set_invalid_key_error(struct connman_network *network)
1448 struct connman_service *service;
1450 service = connman_service_lookup_from_network(network);
1452 #if defined TIZEN_EXT
1454 __connman_service_set_favorite(service, false);
1456 __connman_service_indicate_error(service,
1457 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1460 static void set_connect_error(struct connman_network *network)
1462 struct connman_service *service;
1464 service = connman_service_lookup_from_network(network);
1466 __connman_service_indicate_error(service,
1467 CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
1470 static void set_blocked_error(struct connman_network *network)
1472 struct connman_service *service;
1474 service = connman_service_lookup_from_network(network);
1476 __connman_service_indicate_error(service,
1477 CONNMAN_SERVICE_ERROR_BLOCKED);
1481 #if defined TIZEN_EXT
1482 static void set_dhcp_error(struct connman_network *network)
1484 struct connman_service *service;
1486 if (network->associating != FALSE)
1487 network->associating = FALSE;
1489 service = connman_service_lookup_from_network(network);
1491 __connman_service_indicate_error(service,
1492 CONNMAN_SERVICE_ERROR_DHCP_FAILED);
1496 void connman_network_set_ipv4_method(struct connman_network *network,
1497 enum connman_ipconfig_method method)
1499 struct connman_service *service;
1500 struct connman_ipconfig *ipconfig;
1502 service = connman_service_lookup_from_network(network);
1506 ipconfig = __connman_service_get_ip4config(service);
1510 __connman_ipconfig_set_method(ipconfig, method);
1513 void connman_network_set_ipv6_method(struct connman_network *network,
1514 enum connman_ipconfig_method method)
1516 struct connman_service *service;
1517 struct connman_ipconfig *ipconfig;
1519 service = connman_service_lookup_from_network(network);
1523 ipconfig = __connman_service_get_ip6config(service);
1527 __connman_ipconfig_set_method(ipconfig, method);
1530 void connman_network_set_error(struct connman_network *network,
1531 enum connman_network_error error)
1533 DBG("network %p error %d", network, error);
1536 case CONNMAN_NETWORK_ERROR_UNKNOWN:
1538 case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
1539 set_associate_error(network);
1541 case CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL:
1542 set_configure_error(network);
1544 case CONNMAN_NETWORK_ERROR_INVALID_KEY:
1545 set_invalid_key_error(network);
1547 case CONNMAN_NETWORK_ERROR_CONNECT_FAIL:
1548 set_connect_error(network);
1550 #if defined TIZEN_EXT
1551 case CONNMAN_NETWORK_ERROR_DHCP_FAIL:
1552 set_dhcp_error(network);
1556 case CONNMAN_NETWORK_ERROR_BLOCKED:
1557 set_blocked_error(network);
1562 __connman_network_disconnect(network);
1566 * connman_network_set_connected:
1567 * @network: network structure
1568 * @connected: connected state
1570 * Change connected state of network
1572 int connman_network_set_connected(struct connman_network *network,
1575 DBG("network %p connected %d/%d connecting %d associating %d",
1576 network, network->connected, connected, network->connecting,
1577 network->associating);
1579 if ((network->connecting || network->associating) &&
1581 connman_network_set_error(network,
1582 CONNMAN_NETWORK_ERROR_CONNECT_FAIL);
1586 if (network->connected == connected)
1590 set_disconnected(network);
1592 set_connected(network);
1598 * connman_network_get_connected:
1599 * @network: network structure
1601 * Get network connection status
1603 bool connman_network_get_connected(struct connman_network *network)
1605 return network->connected;
1609 * connman_network_get_associating:
1610 * @network: network structure
1612 * Get network associating status
1614 bool connman_network_get_associating(struct connman_network *network)
1616 return network->associating;
1619 void connman_network_clear_hidden(void *user_data)
1624 DBG("user_data %p", user_data);
1627 * Hidden service does not have a connect timeout so
1628 * we do not need to remove it. We can just return
1629 * error to the caller telling that we could not find
1630 * any network that we could connect to.
1632 connman_dbus_reply_pending(user_data, EIO, NULL);
1635 int connman_network_connect_hidden(struct connman_network *network,
1636 char *identity, char *passphrase, void *user_data)
1639 struct connman_service *service;
1641 service = connman_service_lookup_from_network(network);
1643 DBG("network %p service %p user_data %p", network, service, user_data);
1649 __connman_service_set_agent_identity(service, identity);
1652 err = __connman_service_set_passphrase(service, passphrase);
1654 if (err == -ENOKEY) {
1655 __connman_service_indicate_error(service,
1656 CONNMAN_SERVICE_ERROR_INVALID_KEY);
1659 __connman_service_set_hidden(service);
1660 __connman_service_set_hidden_data(service, user_data);
1661 return __connman_service_connect(service,
1662 CONNMAN_SERVICE_CONNECT_REASON_USER);
1666 __connman_service_return_error(service, -err, user_data);
1671 * __connman_network_connect:
1672 * @network: network structure
1676 int __connman_network_connect(struct connman_network *network)
1680 DBG("network %p", network);
1682 if (network->connected)
1685 if (network->connecting || network->associating)
1688 if (!network->driver)
1691 if (!network->driver->connect)
1694 if (!network->device)
1697 network->connecting = true;
1699 #if defined TIZEN_EXT
1700 if (network->type != CONNMAN_NETWORK_TYPE_CELLULAR)
1702 __connman_device_disconnect(network->device);
1703 #if defined TIZEN_EXT
1704 DBG("ConnMan, Connect Request [%s]", network->name);
1706 err = network->driver->connect(network);
1708 if (err == -EINPROGRESS) {
1709 #if defined TIZEN_EXT
1710 if (network->type != CONNMAN_NETWORK_TYPE_CELLULAR)
1712 connman_network_set_associating(network, true);
1714 network->connecting = false;
1719 set_connected(network);
1725 * __connman_network_disconnect:
1726 * @network: network structure
1728 * Disconnect network
1730 int __connman_network_disconnect(struct connman_network *network)
1734 DBG("network %p", network);
1736 if (!network->connected && !network->connecting &&
1737 !network->associating)
1740 if (!network->driver)
1743 network->connecting = false;
1744 #if defined TIZEN_EXT
1745 DBG("ConnMan, Disconnect request");
1747 if (network->driver->disconnect)
1748 err = network->driver->disconnect(network);
1750 if (err != -EINPROGRESS)
1751 set_disconnected(network);
1756 int __connman_network_clear_ipconfig(struct connman_network *network,
1757 struct connman_ipconfig *ipconfig)
1759 struct connman_service *service;
1760 struct connman_ipconfig *ipconfig_ipv4;
1761 enum connman_ipconfig_method method;
1762 enum connman_ipconfig_type type;
1764 service = connman_service_lookup_from_network(network);
1768 ipconfig_ipv4 = __connman_service_get_ip4config(service);
1769 method = __connman_ipconfig_get_method(ipconfig);
1770 type = __connman_ipconfig_get_config_type(ipconfig);
1773 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1774 case CONNMAN_IPCONFIG_METHOD_OFF:
1775 case CONNMAN_IPCONFIG_METHOD_FIXED:
1777 case CONNMAN_IPCONFIG_METHOD_AUTO:
1778 release_dhcpv6(network);
1780 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1781 __connman_ipconfig_address_remove(ipconfig);
1783 case CONNMAN_IPCONFIG_METHOD_DHCP:
1784 __connman_dhcp_stop(ipconfig_ipv4);
1788 if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
1789 __connman_service_ipconfig_indicate_state(service,
1790 CONNMAN_SERVICE_STATE_CONFIGURATION,
1791 CONNMAN_IPCONFIG_TYPE_IPV6);
1792 else if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
1793 __connman_service_ipconfig_indicate_state(service,
1794 CONNMAN_SERVICE_STATE_CONFIGURATION,
1795 CONNMAN_IPCONFIG_TYPE_IPV4);
1800 #if defined TIZEN_EXT
1801 void __connman_network_set_auto_ipv6_gateway(char *gateway, void *user_data)
1805 struct connman_network *network = user_data;
1806 struct connman_service *service;
1807 struct connman_ipconfig *ipconfig = NULL;
1809 service = connman_service_lookup_from_network(network);
1810 if (service == NULL)
1813 ipconfig = __connman_service_get_ipconfig(service, AF_INET6);
1814 if (ipconfig == NULL)
1817 __connman_ipconfig_set_gateway(ipconfig, gateway);
1823 int __connman_network_enable_ipconfig(struct connman_network *network,
1824 struct connman_ipconfig *ipconfig)
1827 enum connman_ipconfig_type type;
1828 enum connman_ipconfig_method method;
1829 #if defined TIZEN_EXT
1830 struct connman_service *service;
1833 if (!network || !ipconfig)
1836 type = __connman_ipconfig_get_config_type(ipconfig);
1839 case CONNMAN_IPCONFIG_TYPE_UNKNOWN:
1840 case CONNMAN_IPCONFIG_TYPE_ALL:
1843 case CONNMAN_IPCONFIG_TYPE_IPV6:
1844 #if !defined TIZEN_EXT
1845 set_configuration(network, type);
1848 method = __connman_ipconfig_get_method(ipconfig);
1850 DBG("ipv6 ipconfig method %d", method);
1853 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1856 case CONNMAN_IPCONFIG_METHOD_OFF:
1857 __connman_ipconfig_disable_ipv6(ipconfig);
1860 case CONNMAN_IPCONFIG_METHOD_AUTO:
1861 #if defined TIZEN_EXT
1862 service = connman_service_lookup_from_network(network);
1864 if(network->type == CONNMAN_NETWORK_TYPE_CELLULAR)
1865 __connman_service_ipconfig_indicate_state(service,
1866 CONNMAN_SERVICE_STATE_CONFIGURATION,
1867 CONNMAN_IPCONFIG_TYPE_IPV6);
1869 #if !defined TIZEN_EXT
1870 autoconf_ipv6_set(network);
1874 case CONNMAN_IPCONFIG_METHOD_FIXED:
1875 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1876 #if defined TIZEN_EXT
1877 set_configuration(network, type);
1879 r = manual_ipv6_set(network, ipconfig);
1882 case CONNMAN_IPCONFIG_METHOD_DHCP:
1889 case CONNMAN_IPCONFIG_TYPE_IPV4:
1890 set_configuration(network, type);
1892 method = __connman_ipconfig_get_method(ipconfig);
1894 DBG("ipv4 ipconfig method %d", method);
1897 case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
1898 case CONNMAN_IPCONFIG_METHOD_OFF:
1901 case CONNMAN_IPCONFIG_METHOD_AUTO:
1905 case CONNMAN_IPCONFIG_METHOD_FIXED:
1906 case CONNMAN_IPCONFIG_METHOD_MANUAL:
1907 r = set_connected_manual(network);
1910 case CONNMAN_IPCONFIG_METHOD_DHCP:
1911 r = set_connected_dhcp(network);
1919 connman_network_set_error(network,
1920 CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
1925 int connman_network_set_ipaddress(struct connman_network *network,
1926 struct connman_ipaddress *ipaddress)
1928 struct connman_service *service;
1929 struct connman_ipconfig *ipconfig = NULL;
1931 DBG("network %p", network);
1933 service = connman_service_lookup_from_network(network);
1937 ipconfig = __connman_service_get_ipconfig(service, ipaddress->family);
1941 __connman_ipconfig_set_local(ipconfig, ipaddress->local);
1942 __connman_ipconfig_set_peer(ipconfig, ipaddress->peer);
1943 __connman_ipconfig_set_broadcast(ipconfig, ipaddress->broadcast);
1944 __connman_ipconfig_set_prefixlen(ipconfig, ipaddress->prefixlen);
1945 __connman_ipconfig_set_gateway(ipconfig, ipaddress->gateway);
1950 #if defined TIZEN_EXT
1952 * Description: Network client requires additional wifi specific info
1954 int connman_network_set_bssid(struct connman_network *network,
1955 const unsigned char *bssid)
1962 DBG("network %p bssid %02x:%02x:%02x:%02x:%02x:%02x", network,
1963 bssid[0], bssid[1], bssid[2],
1964 bssid[3], bssid[4], bssid[5]);
1966 for (;i < WIFI_BSSID_LEN_MAX;i++)
1967 network->wifi.bssid[i] = bssid[i];
1972 unsigned char *connman_network_get_bssid(struct connman_network *network)
1974 return (unsigned char *)network->wifi.bssid;
1977 int connman_network_set_maxrate(struct connman_network *network,
1978 unsigned int maxrate)
1980 #if !defined TIZEN_EXT
1981 DBG("network %p maxrate %d", network, maxrate);
1984 network->wifi.maxrate = maxrate;
1989 unsigned int connman_network_get_maxrate(struct connman_network *network)
1991 return network->wifi.maxrate;
1994 int connman_network_set_enc_mode(struct connman_network *network,
1995 const char *encryption_mode)
1997 if (encryption_mode == NULL)
2000 DBG("network %p encryption mode %s", network, encryption_mode);
2002 g_strlcpy(network->wifi.encryption_mode, encryption_mode,
2003 WIFI_ENCYPTION_MODE_LEN_MAX);
2008 const char *connman_network_get_enc_mode(struct connman_network *network)
2010 return (const char *)network->wifi.encryption_mode;
2013 int connman_network_set_rsn_mode(struct connman_network *network,
2016 network->wifi.rsn_mode = rsn_mode;
2021 int connman_network_set_proxy(struct connman_network *network,
2022 const char *proxies)
2024 struct connman_service *service;
2026 DBG("network %p proxies %s", network, proxies);
2028 service = connman_service_lookup_from_network(network);
2029 if (service == NULL)
2032 __connman_service_set_proxy(service, proxies);
2034 connman_service_set_proxy_method(service,
2035 CONNMAN_SERVICE_PROXY_METHOD_MANUAL);
2040 int connman_network_set_is_hs20AP(struct connman_network *network,
2041 unsigned int isHS20AP)
2046 network->wifi.isHS20AP = isHS20AP;
2051 unsigned int connman_network_get_is_hs20AP(struct connman_network *network)
2056 return network->wifi.isHS20AP;
2059 int connman_network_set_keymgmt(struct connman_network *network,
2060 unsigned int keymgmt)
2062 if (network == NULL)
2065 network->wifi.keymgmt = keymgmt;
2070 unsigned int connman_network_get_keymgmt(struct connman_network *network)
2072 if (network == NULL)
2075 return network->wifi.keymgmt;
2078 int connman_network_set_disconnect_reason(struct connman_network *network,
2081 if (network == NULL)
2084 network->wifi.disconnect_reason = reason_code;
2089 int connman_network_get_disconnect_reason(struct connman_network *network)
2091 if (network == NULL)
2094 return network->wifi.disconnect_reason;
2097 int connman_network_set_assoc_status_code(struct connman_network *network,
2098 int assoc_status_code)
2101 if (network == NULL)
2104 network->wifi.assoc_status_code = assoc_status_code;
2108 int connman_network_get_assoc_status_code(struct connman_network *network)
2110 if (network == NULL)
2113 return network->wifi.assoc_status_code;
2118 int connman_network_set_nameservers(struct connman_network *network,
2119 const char *nameservers)
2121 struct connman_service *service;
2122 char **nameservers_array;
2125 DBG("network %p nameservers %s", network, nameservers);
2127 service = connman_service_lookup_from_network(network);
2131 __connman_service_nameserver_clear(service);
2136 nameservers_array = g_strsplit(nameservers, " ", 0);
2138 for (i = 0; nameservers_array[i]; i++) {
2139 #if defined TIZEN_EXT
2140 __connman_service_nameserver_append(service,
2141 nameservers_array[i], false,
2142 CONNMAN_IPCONFIG_TYPE_ALL);
2144 __connman_service_nameserver_append(service,
2145 nameservers_array[i], false);
2149 g_strfreev(nameservers_array);
2154 int connman_network_set_domain(struct connman_network *network,
2157 struct connman_service *service;
2159 DBG("network %p domain %s", network, domain);
2161 service = connman_service_lookup_from_network(network);
2165 __connman_service_set_domainname(service, domain);
2171 * connman_network_set_name:
2172 * @network: network structure
2175 * Set display name value for network
2177 int connman_network_set_name(struct connman_network *network,
2180 DBG("network %p name %s", network, name);
2182 g_free(network->name);
2183 network->name = g_strdup(name);
2189 * connman_network_set_strength:
2190 * @network: network structure
2191 * @strength: strength value
2193 * Set signal strength value for network
2196 int connman_network_set_strength(struct connman_network *network,
2199 #if !defined TIZEN_EXT
2200 DBG("network %p strengh %d", network, strength);
2203 network->strength = strength;
2208 uint8_t connman_network_get_strength(struct connman_network *network)
2210 return network->strength;
2213 int connman_network_set_frequency(struct connman_network *network,
2216 #if !defined TIZEN_EXT
2217 DBG("network %p frequency %d", network, frequency);
2220 network->frequency = frequency;
2225 uint16_t connman_network_get_frequency(struct connman_network *network)
2227 return network->frequency;
2230 int connman_network_set_wifi_channel(struct connman_network *network,
2233 DBG("network %p wifi channel %d", network, channel);
2235 network->wifi.channel = channel;
2240 uint16_t connman_network_get_wifi_channel(struct connman_network *network)
2242 return network->wifi.channel;
2246 * connman_network_set_string:
2247 * @network: network structure
2248 * @key: unique identifier
2249 * @value: string value
2251 * Set string value for specific key
2253 int connman_network_set_string(struct connman_network *network,
2254 const char *key, const char *value)
2256 #if !defined TIZEN_EXT
2257 DBG("network %p key %s value %s", network, key, value);
2260 if (g_strcmp0(key, "Name") == 0)
2261 return connman_network_set_name(network, value);
2263 if (g_str_equal(key, "Path")) {
2264 g_free(network->path);
2265 network->path = g_strdup(value);
2266 } else if (g_str_equal(key, "Node")) {
2267 g_free(network->node);
2268 network->node = g_strdup(value);
2269 } else if (g_str_equal(key, "WiFi.Mode")) {
2270 g_free(network->wifi.mode);
2271 network->wifi.mode = g_strdup(value);
2272 } else if (g_str_equal(key, "WiFi.Security")) {
2273 g_free(network->wifi.security);
2274 network->wifi.security = g_strdup(value);
2275 } else if (g_str_equal(key, "WiFi.Passphrase")) {
2276 #if defined TIZEN_EXT
2277 DBG("ConnMan, %p key %s", network, key);
2279 g_free(network->wifi.passphrase);
2280 network->wifi.passphrase = g_strdup(value);
2281 } else if (g_str_equal(key, "WiFi.EAP")) {
2282 g_free(network->wifi.eap);
2283 network->wifi.eap = g_strdup(value);
2284 } else if (g_str_equal(key, "WiFi.Identity")) {
2285 g_free(network->wifi.identity);
2286 network->wifi.identity = g_strdup(value);
2287 } else if (g_str_equal(key, "WiFi.AgentIdentity")) {
2288 g_free(network->wifi.agent_identity);
2289 network->wifi.agent_identity = g_strdup(value);
2290 } else if (g_str_equal(key, "WiFi.CACertFile")) {
2291 g_free(network->wifi.ca_cert_path);
2292 network->wifi.ca_cert_path = g_strdup(value);
2293 } else if (g_str_equal(key, "WiFi.ClientCertFile")) {
2294 g_free(network->wifi.client_cert_path);
2295 network->wifi.client_cert_path = g_strdup(value);
2296 } else if (g_str_equal(key, "WiFi.PrivateKeyFile")) {
2297 g_free(network->wifi.private_key_path);
2298 network->wifi.private_key_path = g_strdup(value);
2299 } else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase")) {
2300 g_free(network->wifi.private_key_passphrase);
2301 network->wifi.private_key_passphrase = g_strdup(value);
2302 } else if (g_str_equal(key, "WiFi.Phase2")) {
2303 g_free(network->wifi.phase2_auth);
2304 network->wifi.phase2_auth = g_strdup(value);
2305 } else if (g_str_equal(key, "WiFi.PinWPS")) {
2306 g_free(network->wifi.pin_wps);
2307 network->wifi.pin_wps = g_strdup(value);
2316 * connman_network_get_string:
2317 * @network: network structure
2318 * @key: unique identifier
2320 * Get string value for specific key
2322 const char *connman_network_get_string(struct connman_network *network,
2325 #if !defined TIZEN_EXT
2326 DBG("network %p key %s", network, key);
2329 if (g_str_equal(key, "Path"))
2330 return network->path;
2331 else if (g_str_equal(key, "Name"))
2332 return network->name;
2333 else if (g_str_equal(key, "Node"))
2334 return network->node;
2335 else if (g_str_equal(key, "WiFi.Mode"))
2336 return network->wifi.mode;
2337 else if (g_str_equal(key, "WiFi.Security"))
2338 #if defined TIZEN_EXT
2339 if (network->wifi.rsn_mode != true ||
2340 g_str_equal(network->wifi.security, "ieee8021x"))
2341 return network->wifi.security;
2345 return network->wifi.security;
2347 else if (g_str_equal(key, "WiFi.Passphrase"))
2348 return network->wifi.passphrase;
2349 else if (g_str_equal(key, "WiFi.EAP"))
2350 return network->wifi.eap;
2351 else if (g_str_equal(key, "WiFi.Identity"))
2352 return network->wifi.identity;
2353 else if (g_str_equal(key, "WiFi.AgentIdentity"))
2354 return network->wifi.agent_identity;
2355 else if (g_str_equal(key, "WiFi.CACertFile"))
2356 return network->wifi.ca_cert_path;
2357 else if (g_str_equal(key, "WiFi.ClientCertFile"))
2358 return network->wifi.client_cert_path;
2359 else if (g_str_equal(key, "WiFi.PrivateKeyFile"))
2360 return network->wifi.private_key_path;
2361 else if (g_str_equal(key, "WiFi.PrivateKeyPassphrase"))
2362 return network->wifi.private_key_passphrase;
2363 else if (g_str_equal(key, "WiFi.Phase2"))
2364 return network->wifi.phase2_auth;
2365 else if (g_str_equal(key, "WiFi.PinWPS"))
2366 return network->wifi.pin_wps;
2372 * connman_network_set_bool:
2373 * @network: network structure
2374 * @key: unique identifier
2375 * @value: boolean value
2377 * Set boolean value for specific key
2379 int connman_network_set_bool(struct connman_network *network,
2380 const char *key, bool value)
2382 #if !defined TIZEN_EXT
2383 DBG("network %p key %s value %d", network, key, value);
2386 if (g_strcmp0(key, "Roaming") == 0)
2387 network->roaming = value;
2388 else if (g_strcmp0(key, "WiFi.WPS") == 0)
2389 network->wifi.wps = value;
2390 else if (g_strcmp0(key, "WiFi.UseWPS") == 0)
2391 network->wifi.use_wps = value;
2392 #if defined TIZEN_EXT
2393 else if (g_strcmp0(key, "DefaultInternet") == 0)
2394 network->default_internet = value;
2401 * connman_network_get_bool:
2402 * @network: network structure
2403 * @key: unique identifier
2405 * Get boolean value for specific key
2407 bool connman_network_get_bool(struct connman_network *network,
2410 #if !defined TIZEN_EXT
2411 DBG("network %p key %s", network, key);
2414 if (g_str_equal(key, "Roaming"))
2415 return network->roaming;
2416 else if (g_str_equal(key, "WiFi.WPS"))
2417 return network->wifi.wps;
2418 else if (g_str_equal(key, "WiFi.UseWPS"))
2419 return network->wifi.use_wps;
2420 #if defined TIZEN_EXT
2421 else if (g_str_equal(key, "DefaultInternet"))
2422 return network->default_internet;
2429 * connman_network_set_blob:
2430 * @network: network structure
2431 * @key: unique identifier
2435 * Set binary blob value for specific key
2437 int connman_network_set_blob(struct connman_network *network,
2438 const char *key, const void *data, unsigned int size)
2440 #if !defined TIZEN_EXT
2441 DBG("network %p key %s size %d", network, key, size);
2444 if (g_str_equal(key, "WiFi.SSID")) {
2445 g_free(network->wifi.ssid);
2446 network->wifi.ssid = g_try_malloc(size);
2447 if (network->wifi.ssid) {
2448 memcpy(network->wifi.ssid, data, size);
2449 network->wifi.ssid_len = size;
2451 network->wifi.ssid_len = 0;
2452 #if defined TIZEN_EXT
2453 } else if (g_str_equal(key, "WiFi.Vsie")){
2454 g_free(network->wifi.wifi_vsie);
2455 network->wifi.wifi_vsie = g_try_malloc(size);
2456 if (network->wifi.wifi_vsie) {
2457 memcpy(network->wifi.wifi_vsie, data, size);
2458 network->wifi.wifi_vsie_len = size;
2460 network->wifi.wifi_vsie_len = 0;
2470 * connman_network_get_blob:
2471 * @network: network structure
2472 * @key: unique identifier
2473 * @size: pointer to blob size
2475 * Get binary blob value for specific key
2477 const void *connman_network_get_blob(struct connman_network *network,
2478 const char *key, unsigned int *size)
2480 DBG("network %p key %s", network, key);
2482 if (g_str_equal(key, "WiFi.SSID")) {
2484 *size = network->wifi.ssid_len;
2485 return network->wifi.ssid;
2488 #if defined TIZEN_EXT
2489 if (g_str_equal(key, "WiFi.Vsie")) {
2491 *size = network->wifi.wifi_vsie_len;
2492 DBG("network %p key %s size=%d", network, key, *size);
2495 return network->wifi.wifi_vsie;
2502 void __connman_network_set_device(struct connman_network *network,
2503 struct connman_device *device)
2505 if (network->device == device)
2508 if (network->device)
2509 network_remove(network);
2511 network->device = device;
2513 if (network->device)
2514 network_probe(network);
2518 * connman_network_get_device:
2519 * @network: network structure
2521 * Get parent device of network
2523 struct connman_device *connman_network_get_device(struct connman_network *network)
2525 return network->device;
2529 * connman_network_get_data:
2530 * @network: network structure
2532 * Get private network data pointer
2534 void *connman_network_get_data(struct connman_network *network)
2536 return network->driver_data;
2540 * connman_network_set_data:
2541 * @network: network structure
2542 * @data: data pointer
2544 * Set private network data pointer
2546 void connman_network_set_data(struct connman_network *network, void *data)
2548 network->driver_data = data;
2551 void connman_network_update(struct connman_network *network)
2553 switch (network->type) {
2554 case CONNMAN_NETWORK_TYPE_UNKNOWN:
2555 case CONNMAN_NETWORK_TYPE_VENDOR:
2557 case CONNMAN_NETWORK_TYPE_ETHERNET:
2558 case CONNMAN_NETWORK_TYPE_GADGET:
2559 case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
2560 case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
2561 case CONNMAN_NETWORK_TYPE_CELLULAR:
2562 case CONNMAN_NETWORK_TYPE_WIFI:
2567 __connman_service_update_from_network(network);
2570 int __connman_network_init(void)
2577 void __connman_network_cleanup(void)