X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fconfig.c;h=d9907a1cb30b37cbbc8296090342137dfdbc7251;hb=92632d79d49dd50e5a162b2cb78ca53a75d570e2;hp=25dd1748ee09a47027cddf1a5bed9c4703b163d5;hpb=199bca7e38232678c1c2ddbd3fc6a6b597bce6a7;p=platform%2Fupstream%2Fconnman.git diff --git a/src/config.c b/src/config.c old mode 100755 new mode 100644 index 25dd174..d9907a1 --- a/src/config.c +++ b/src/config.c @@ -45,7 +45,12 @@ struct connman_config_service { unsigned int ssid_len; char *eap; char *identity; + char *anonymous_identity; char *ca_cert_file; + char *subject_match; + char *altsubject_match; + char *domain_suffix_match; + char *domain_match; char *client_cert_file; char *private_key_file; char *private_key_passphrase; @@ -67,10 +72,16 @@ struct connman_config_service { char *ipv6_gateway; char *ipv6_privacy; char *mac; + bool mdns; char **nameservers; char **search_domains; char **timeservers; char *domain_name; +#if defined TIZEN_EXT + char *connector; + char *c_sign_key; + char *net_access_key; +#endif }; struct connman_config { @@ -98,10 +109,16 @@ static bool cleanup = false; #define SERVICE_KEY_PRV_KEY_PASS "PrivateKeyPassphrase" #define SERVICE_KEY_PRV_KEY_PASS_TYPE "PrivateKeyPassphraseType" #define SERVICE_KEY_IDENTITY "Identity" +#define SERVICE_KEY_ANONYMOUS_IDENTITY "AnonymousIdentity" +#define SERVICE_KEY_SUBJECT_MATCH "SubjectMatch" +#define SERVICE_KEY_ALT_SUBJECT_MATCH "AltSubjectMatch" +#define SERVICE_KEY_DOMAIN_SUFF_MATCH "DomainSuffixMatch" +#define SERVICE_KEY_DOMAIN_MATCH "DomainMatch" #define SERVICE_KEY_PHASE2 "Phase2" #define SERVICE_KEY_PASSPHRASE "Passphrase" #define SERVICE_KEY_SECURITY "Security" #define SERVICE_KEY_HIDDEN "Hidden" +#define SERVICE_KEY_MDNS "mDNS" #define SERVICE_KEY_IPv4 "IPv4" #define SERVICE_KEY_IPv6 "IPv6" @@ -111,6 +128,11 @@ static bool cleanup = false; #define SERVICE_KEY_SEARCH_DOMAINS "SearchDomains" #define SERVICE_KEY_TIMESERVERS "Timeservers" #define SERVICE_KEY_DOMAIN "Domain" +#if defined TIZEN_EXT +#define SERVICE_KEY_CONNECTOR "Connector" +#define SERVICE_KEY_C_SIGN_KEY "CSignKey" +#define SERVICE_KEY_NET_ACCESS_KEY "NetAccessKey" +#endif static const char *config_possible_keys[] = { CONFIG_KEY_NAME, @@ -129,6 +151,11 @@ static const char *service_possible_keys[] = { SERVICE_KEY_PRV_KEY_PASS, SERVICE_KEY_PRV_KEY_PASS_TYPE, SERVICE_KEY_IDENTITY, + SERVICE_KEY_ANONYMOUS_IDENTITY, + SERVICE_KEY_SUBJECT_MATCH, + SERVICE_KEY_ALT_SUBJECT_MATCH, + SERVICE_KEY_DOMAIN_SUFF_MATCH, + SERVICE_KEY_DOMAIN_MATCH, SERVICE_KEY_PHASE2, SERVICE_KEY_PASSPHRASE, SERVICE_KEY_SECURITY, @@ -137,10 +164,16 @@ static const char *service_possible_keys[] = { SERVICE_KEY_IPv6, SERVICE_KEY_IPv6_PRIVACY, SERVICE_KEY_MAC, + SERVICE_KEY_MDNS, SERVICE_KEY_NAMESERVERS, SERVICE_KEY_SEARCH_DOMAINS, SERVICE_KEY_TIMESERVERS, SERVICE_KEY_DOMAIN, +#if defined TIZEN_EXT + SERVICE_KEY_CONNECTOR, + SERVICE_KEY_C_SIGN_KEY, + SERVICE_KEY_NET_ACCESS_KEY, +#endif NULL, }; @@ -178,7 +211,7 @@ static void unregister_service(gpointer data) list = list->next) { service_id = list->data; - service = __connman_service_lookup_from_ident(service_id); + service = connman_service_lookup_from_identifier(service_id); if (service) { __connman_service_set_immutable(service, false); __connman_service_set_config(service, NULL, NULL); @@ -220,7 +253,12 @@ free_only: g_free(config_service->ssid); g_free(config_service->eap); g_free(config_service->identity); + g_free(config_service->anonymous_identity); g_free(config_service->ca_cert_file); + g_free(config_service->subject_match); + g_free(config_service->altsubject_match); + g_free(config_service->domain_suffix_match); + g_free(config_service->domain_match); g_free(config_service->client_cert_file); g_free(config_service->private_key_file); g_free(config_service->private_key_passphrase); @@ -242,6 +280,11 @@ free_only: g_free(config_service->config_ident); g_free(config_service->config_entry); g_free(config_service->virtual_file); +#if defined TIZEN_EXT + g_free(config_service->connector); + g_free(config_service->c_sign_key); + g_free(config_service->net_access_key); +#endif g_free(config_service); } @@ -494,6 +537,9 @@ static bool load_service_generic(GKeyFile *keyfile, g_strfreev(strlist); } + service->mdns = __connman_config_get_bool(keyfile, group, + SERVICE_KEY_MDNS, NULL); + return true; err: @@ -544,8 +590,8 @@ static bool load_service(GKeyFile *keyfile, const char *group, g_free(service->type); service->type = str; } else { - DBG("Type of the configured service is missing for group %s", - group); + connman_warn("Type of the configured service is missing " + "for group %s", group); goto err; } @@ -601,7 +647,11 @@ static bool load_service(GKeyFile *keyfile, const char *group, unsigned int ssid_len; ssid_len = strlen(service->name); +#if defined TIZEN_EXT + ssid = g_try_malloc0(ssid_len + 1); +#else ssid = g_try_malloc0(ssid_len); +#endif if (!ssid) goto err; @@ -655,6 +705,41 @@ static bool load_service(GKeyFile *keyfile, const char *group, service->identity = str; } + str = __connman_config_get_string(keyfile, group, + SERVICE_KEY_ANONYMOUS_IDENTITY, NULL); + if (str) { + g_free(service->anonymous_identity); + service->anonymous_identity = str; + } + + str = __connman_config_get_string(keyfile, group, + SERVICE_KEY_SUBJECT_MATCH, NULL); + if (str) { + g_free(service->subject_match); + service->subject_match = str; + } + + str = __connman_config_get_string(keyfile, group, + SERVICE_KEY_ALT_SUBJECT_MATCH, NULL); + if (str) { + g_free(service->altsubject_match); + service->altsubject_match = str; + } + + str = __connman_config_get_string(keyfile, group, + SERVICE_KEY_DOMAIN_SUFF_MATCH, NULL); + if (str) { + g_free(service->domain_suffix_match); + service->domain_suffix_match = str; + } + + str = __connman_config_get_string(keyfile, group, + SERVICE_KEY_DOMAIN_MATCH, NULL); + if (str) { + g_free(service->domain_match); + service->domain_match = str; + } + str = __connman_config_get_string(keyfile, group, SERVICE_KEY_PHASE2, NULL); if (str) { g_free(service->phase2); @@ -667,6 +752,29 @@ static bool load_service(GKeyFile *keyfile, const char *group, g_free(service->passphrase); service->passphrase = str; } +#if defined TIZEN_EXT + + str = __connman_config_get_string(keyfile, group, SERVICE_KEY_CONNECTOR, + NULL); + if (str) { + g_free(service->connector); + service->connector = str; + } + + str = __connman_config_get_string(keyfile, group, SERVICE_KEY_C_SIGN_KEY, + NULL); + if (str) { + g_free(service->c_sign_key); + service->c_sign_key = str; + } + + str = __connman_config_get_string(keyfile, group, SERVICE_KEY_NET_ACCESS_KEY, + NULL); + if (str) { + g_free(service->net_access_key); + service->net_access_key = str; + } +#endif str = __connman_config_get_string(keyfile, group, SERVICE_KEY_SECURITY, NULL); @@ -687,6 +795,7 @@ static bool load_service(GKeyFile *keyfile, const char *group, if (security == CONNMAN_SERVICE_SECURITY_PSK || #if defined TIZEN_EXT security == CONNMAN_SERVICE_SECURITY_RSN || + security == CONNMAN_SERVICE_SECURITY_SAE || #endif security == CONNMAN_SERVICE_SECURITY_WEP) { service->security = security; @@ -701,7 +810,28 @@ static bool load_service(GKeyFile *keyfile, const char *group, } else service->security = CONNMAN_SERVICE_SECURITY_PSK; - } +#if defined TIZEN_EXT + } else if (service->connector) { + + if (str && security != CONNMAN_SERVICE_SECURITY_DPP) + connman_info("Mismatch between DPP configuration and " + "setting %s = %s", + SERVICE_KEY_SECURITY, str); + + service->security = CONNMAN_SERVICE_SECURITY_DPP; +#endif + } else if (str) { + + if (security != CONNMAN_SERVICE_SECURITY_NONE) + connman_info("Mismatch no security and " + "setting %s = %s", + SERVICE_KEY_SECURITY, str); + + service->security = CONNMAN_SERVICE_SECURITY_NONE; + } else + service->security = CONNMAN_SERVICE_SECURITY_NONE; + + g_free(str); service->config_ident = g_strdup(config->ident); service->config_entry = g_strdup_printf("service_%s", service->ident); @@ -739,8 +869,11 @@ static bool load_service_from_keyfile(GKeyFile *keyfile, groups = g_key_file_get_groups(keyfile, NULL); for (i = 0; groups[i]; i++) { - if (!g_str_has_prefix(groups[i], "service_")) + if (!g_str_has_prefix(groups[i], "service_")) { + connman_warn("Ignore group named '%s' because prefix " + "is not 'service_'", groups[i]); continue; + } if (load_service(keyfile, groups[i], config)) found = true; } @@ -894,10 +1027,10 @@ static void config_notify_handler(struct inotify_event *event, return; } - if (event->mask & IN_CREATE || event->mask & IN_MOVED_TO) + if (event->mask & (IN_CREATE | IN_MOVED_TO)) create_config(ident); - if (event->mask & IN_MODIFY) { + if (event->mask & (IN_MODIFY | IN_MOVED_TO)) { struct connman_config *config; config = g_hash_table_lookup(config_table, ident); @@ -919,7 +1052,7 @@ static void config_notify_handler(struct inotify_event *event, } } - if (event->mask & IN_DELETE) + if (event->mask & (IN_DELETE | IN_MOVED_FROM)) g_hash_table_remove(config_table, ident); } @@ -956,6 +1089,11 @@ char *__connman_config_get_string(GKeyFile *key_file, if (!str) return NULL; + /* passphrases can have spaces in the end */ + if (!g_strcmp0(key, SERVICE_KEY_PASSPHRASE) || + !g_strcmp0(key, SERVICE_KEY_PRV_KEY_PASS)) + return str; + return g_strchomp(str); } @@ -1028,10 +1166,30 @@ static void provision_service_wifi(struct connman_config_service *config, __connman_service_set_string(service, "Identity", config->identity); + if (config->anonymous_identity) + __connman_service_set_string(service, "AnonymousIdentity", + config->anonymous_identity); + if (config->ca_cert_file) __connman_service_set_string(service, "CACertFile", config->ca_cert_file); + if (config->subject_match) + __connman_service_set_string(service, "SubjectMatch", + config->subject_match); + + if (config->altsubject_match) + __connman_service_set_string(service, "AltSubjectMatch", + config->altsubject_match); + + if (config->domain_suffix_match) + __connman_service_set_string(service, "DomainSuffixMatch", + config->domain_suffix_match); + + if (config->domain_match) + __connman_service_set_string(service, "DomainMatch", + config->domain_match); + if (config->client_cert_file) __connman_service_set_string(service, "ClientCertFile", config->client_cert_file); @@ -1077,6 +1235,18 @@ static void provision_service_wifi(struct connman_config_service *config, if (config->hidden) __connman_service_set_hidden(service); + +#if defined TIZEN_EXT + if (config->connector) + __connman_service_set_string(service, "Connector", + config->connector); + if (config->c_sign_key) + __connman_service_set_string(service, "CSignKey", + config->c_sign_key); + if (config->net_access_key) + __connman_service_set_string(service, "NetAccessKey", + config->net_access_key); +#endif } struct connect_virtual { @@ -1119,6 +1289,7 @@ static int try_provision_service(struct connman_config_service *config, enum connman_service_type type; const void *ssid; unsigned int ssid_len; + const char *str; network = __connman_service_get_network(service); if (!network) { @@ -1138,10 +1309,8 @@ static int try_provision_service(struct connman_config_service *config, ssid = connman_network_get_blob(network, "WiFi.SSID", &ssid_len); - if (!ssid) { - connman_error("Network SSID not set"); - return -EINVAL; - } + if (!ssid) + return -ENOENT; if (!config->ssid || ssid_len != config->ssid_len) return -ENOENT; @@ -1149,6 +1318,10 @@ static int try_provision_service(struct connman_config_service *config, if (memcmp(config->ssid, ssid, ssid_len)) return -ENOENT; + str = connman_network_get_string(network, "WiFi.Security"); + if (config->security != __connman_service_string2security(str)) + return -ENOENT; + break; case CONNMAN_SERVICE_TYPE_ETHERNET: @@ -1166,12 +1339,15 @@ static int try_provision_service(struct connman_config_service *config, case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif return -ENOENT; } DBG("service %p ident %s", service, - __connman_service_get_ident(service)); + connman_service_get_identifier(service)); if (config->mac) { struct connman_device *device; @@ -1191,6 +1367,12 @@ static int try_provision_service(struct connman_config_service *config, return -ENOENT; } +#if defined TIZEN_EXT + struct connman_ipconfig *ip6config = __connman_service_get_ip6config(service); + enum connman_ipconfig_method ipv6_method = __connman_ipconfig_get_method(ip6config); + if (ipv6_method == CONNMAN_IPCONFIG_METHOD_MANUAL) + goto ipv6_out; +#endif if (!config->ipv6_address) { connman_network_set_ipv6_method(network, CONNMAN_IPCONFIG_METHOD_AUTO); @@ -1227,6 +1409,9 @@ static int try_provision_service(struct connman_config_service *config, connman_ipaddress_free(address); } +#if defined TIZEN_EXT +ipv6_out: +#endif if (config->ipv6_privacy) { struct connman_ipconfig *ipconfig; @@ -1236,6 +1421,12 @@ static int try_provision_service(struct connman_config_service *config, config->ipv6_privacy); } +#if defined TIZEN_EXT + struct connman_ipconfig *ip4config = __connman_service_get_ip4config(service); + enum connman_ipconfig_method ipv4_method = __connman_ipconfig_get_method(ip4config); + if (ipv4_method == CONNMAN_IPCONFIG_METHOD_MANUAL) + goto ipv4_out; +#endif if (!config->ipv4_address) { connman_network_set_ipv4_method(network, CONNMAN_IPCONFIG_METHOD_DHCP); @@ -1272,9 +1463,12 @@ static int try_provision_service(struct connman_config_service *config, connman_ipaddress_free(address); } +#if defined TIZEN_EXT +ipv4_out: +#endif __connman_service_disconnect(service); - service_id = __connman_service_get_ident(service); + service_id = connman_service_get_identifier(service); config->service_identifiers = g_slist_prepend(config->service_identifiers, g_strdup(service_id)); @@ -1313,6 +1507,8 @@ static int try_provision_service(struct connman_config_service *config, __connman_service_set_search_domains(service, config->search_domains); + __connman_service_set_mdns(service, config->mdns); + if (config->timeservers) __connman_service_set_timeservers(service, config->timeservers); @@ -1333,12 +1529,14 @@ static int try_provision_service(struct connman_config_service *config, virtual->service = service; virtual->vfile = config->virtual_file; - g_timeout_add(0, remove_virtual_config, virtual); + g_idle_add(remove_virtual_config, virtual); return 0; } +#if !defined TIZEN_EXT __connman_service_set_immutable(service, true); +#endif if (type == CONNMAN_SERVICE_TYPE_ETHERNET || type == CONNMAN_SERVICE_TYPE_GADGET) { @@ -1353,22 +1551,35 @@ static int try_provision_service(struct connman_config_service *config, return 0; } +static int +find_and_provision_service_from_config(struct connman_service *service, + struct connman_config *config) +{ + GHashTableIter iter; + gpointer value, key; + + g_hash_table_iter_init(&iter, config->service_table); + while (g_hash_table_iter_next(&iter, &key, + &value)) { + if (!try_provision_service(value, service)) + return 0; + } + + return -ENOENT; +} + static int find_and_provision_service(struct connman_service *service) { - GHashTableIter iter, iter_service; - gpointer value, key, value_service, key_service; + GHashTableIter iter; + gpointer value, key; g_hash_table_iter_init(&iter, config_table); while (g_hash_table_iter_next(&iter, &key, &value)) { struct connman_config *config = value; - g_hash_table_iter_init(&iter_service, config->service_table); - while (g_hash_table_iter_next(&iter_service, &key_service, - &value_service)) { - if (!try_provision_service(value_service, service)) - return 0; - } + if (!find_and_provision_service_from_config(service, config)) + return 0; } return -ENOENT; @@ -1380,7 +1591,9 @@ int __connman_config_provision_service(struct connman_service *service) /* For now only WiFi, Gadget and Ethernet services are supported */ type = connman_service_get_type(service); - +#if defined TIZEN_EXT + if (!simplified_log) +#endif DBG("service %p type %d", service, type); if (type != CONNMAN_SERVICE_TYPE_WIFI && @@ -1459,7 +1672,7 @@ int __connman_config_provision_service_ident(struct connman_service *service, } } - find_and_provision_service(service); + find_and_provision_service_from_config(service, config); } return ret; @@ -1489,7 +1702,7 @@ int connman_config_provision_mutable_service(GKeyFile *keyfile) { struct connman_config_service *service_config; struct connman_config *config; - char *vfile, *group; + char *vfile, *group = NULL; char rstr[11]; DBG(""); @@ -1525,13 +1738,14 @@ int connman_config_provision_mutable_service(GKeyFile *keyfile) if (g_strcmp0(service_config->type, "wifi") == 0) __connman_device_request_scan(CONNMAN_SERVICE_TYPE_WIFI); + g_free(group); return 0; error: DBG("Could not proceed"); g_hash_table_remove(config_table, vfile); g_free(vfile); - + g_free(group); return -EINVAL; } @@ -1545,13 +1759,16 @@ struct connman_config_entry **connman_config_get_entries(const char *type) g_hash_table_iter_init(&iter_file, config_table); while (g_hash_table_iter_next(&iter_file, &key, &value)) { struct connman_config *config_file = value; + struct connman_config_entry **tmp_entries = entries; count = g_hash_table_size(config_file->service_table); entries = g_try_realloc(entries, (i + count + 1) * sizeof(struct connman_config_entry *)); - if (!entries) + if (!entries) { + g_free(tmp_entries); return NULL; + } g_hash_table_iter_init(&iter_config, config_file->service_table); @@ -1584,10 +1801,14 @@ struct connman_config_entry **connman_config_get_entries(const char *type) } if (entries) { + struct connman_config_entry **tmp_entries = entries; + entries = g_try_realloc(entries, (i + 1) * sizeof(struct connman_config_entry *)); - if (!entries) + if (!entries) { + g_free(tmp_entries); return NULL; + } entries[i] = NULL; @@ -1616,7 +1837,6 @@ void connman_config_free_entries(struct connman_config_entry **entries) } g_free(entries); - return; } bool __connman_config_address_provisioned(const char *address,