diff options
author | Yu <jiung.yu@samsung.com> | 2019-09-04 13:43:22 +0900 |
---|---|---|
committer | Yu <jiung.yu@samsung.com> | 2019-09-27 14:10:34 +0900 |
commit | db328958f4b083cce99bdd81d861d707459ae1f6 (patch) | |
tree | 5b8f9ca20ed7eccff9c24cd9560762fa148ba338 /src | |
parent | a0c29c7da07fa8bf3e8839a4a64a183a02296a32 (diff) | |
download | connman-db328958f4b083cce99bdd81d861d707459ae1f6.tar.gz connman-db328958f4b083cce99bdd81d861d707459ae1f6.tar.bz2 connman-db328958f4b083cce99bdd81d861d707459ae1f6.zip |
Add DPP service based on configuration filesubmit/tizen/20190927.130602
Description: This is incomplete solution becase there's
no defined way to connect to DPP AP for upstream connman
for current patch
Change-Id: Ia6a3188e2826708c2123d209249d8b59fb5a42dc
Signed-off-by: Yu jiung <jiung.yu@samsung.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/config.c | 65 | ||||
-rwxr-xr-x | src/network.c | 22 | ||||
-rw-r--r-- | src/service.c | 142 |
3 files changed, 229 insertions, 0 deletions
diff --git a/src/config.c b/src/config.c index ca5957d6..0e550e42 100644 --- a/src/config.c +++ b/src/config.c @@ -77,6 +77,11 @@ struct connman_config_service { 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 { @@ -123,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, @@ -159,6 +169,11 @@ static const char *service_possible_keys[] = { 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, }; @@ -265,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); } @@ -728,6 +748,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); @@ -763,6 +806,16 @@ 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) @@ -1178,6 +1231,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 { diff --git a/src/network.c b/src/network.c index a6d635ec..d8756ec1 100755 --- a/src/network.c +++ b/src/network.c @@ -127,6 +127,9 @@ struct connman_network { GSList *bssid_list; ieee80211_modes_e phy_mode; connection_mode_e connection_mode; + char *connector; + char *c_sign_key; + char *net_access_key; #endif } wifi; @@ -2702,6 +2705,17 @@ int connman_network_set_string(struct connman_network *network, } else if (g_str_equal(key, "WiFi.PinWPS")) { g_free(network->wifi.pin_wps); network->wifi.pin_wps = g_strdup(value); +#if defined TIZEN_EXT + } else if (g_str_equal(key, "WiFi.Connector")) { + g_free(network->wifi.connector); + network->wifi.connector = g_strdup(value); + } else if (g_str_equal(key, "WiFi.CSignKey")) { + g_free(network->wifi.c_sign_key); + network->wifi.c_sign_key = g_strdup(value); + } else if (g_str_equal(key, "WiFi.NetAccessKey")) { + g_free(network->wifi.net_access_key); + network->wifi.net_access_key = g_strdup(value); +#endif } else { return -EINVAL; } @@ -2767,6 +2781,14 @@ const char *connman_network_get_string(struct connman_network *network, return network->wifi.phase2_auth; else if (g_str_equal(key, "WiFi.PinWPS")) return network->wifi.pin_wps; +#if defined TIZEN_EXT + else if (g_str_equal(key, "WiFi.Connector")) + return network->wifi.connector; + else if (g_str_equal(key, "WiFi.CSignKey")) + return network->wifi.c_sign_key; + else if (g_str_equal(key, "WiFi.NetAccessKey")) + return network->wifi.net_access_key; +#endif return NULL; } diff --git a/src/service.c b/src/service.c index 0c6e6235..9cbfa6ce 100644 --- a/src/service.c +++ b/src/service.c @@ -172,6 +172,11 @@ struct connman_service { enum connman_dnsconfig_method dns_config_method_ipv4; enum connman_dnsconfig_method dns_config_method_ipv6; #endif +#if defined TIZEN_EXT + char *connector; + char *c_sign_key; + char *net_access_key; +#endif }; static bool allow_property_changed(struct connman_service *service); @@ -350,6 +355,8 @@ enum connman_service_security __connman_service_string2security(const char *str) return CONNMAN_SERVICE_SECURITY_SAE; if (!strcmp(str, "owe")) return CONNMAN_SERVICE_SECURITY_OWE; + if (!strcmp(str, "dpp")) + return CONNMAN_SERVICE_SECURITY_DPP; #endif return CONNMAN_SERVICE_SECURITY_UNKNOWN; @@ -374,6 +381,8 @@ static const char *security2string(enum connman_service_security security) return "sae"; case CONNMAN_SERVICE_SECURITY_OWE: return "owe"; + case CONNMAN_SERVICE_SECURITY_DPP: + return "dpp"; #else case CONNMAN_SERVICE_SECURITY_RSN: return "psk"; @@ -812,6 +821,29 @@ static int service_load(struct connman_service *service) } } #endif +#if defined TIZEN_EXT + if (service->type == CONNMAN_SERVICE_TYPE_WIFI && + service->security == CONNMAN_SERVICE_SECURITY_DPP) { + str = g_key_file_get_string(keyfile, + service->identifier, "Connector", NULL); + if (str != NULL) { + g_free(service->connector); + service->connector = str; + } + str = g_key_file_get_string(keyfile, + service->identifier, "CSignKey", NULL); + if (str != NULL) { + g_free(service->c_sign_key); + service->c_sign_key = str; + } + str = g_key_file_get_string(keyfile, + service->identifier, "NetAccessKey", NULL); + if (str != NULL) { + g_free(service->net_access_key); + service->net_access_key = str; + } + } +#endif done: g_key_file_free(keyfile); @@ -1087,6 +1119,29 @@ static int service_save(struct connman_service *service) g_key_file_remove_key(keyfile, service->identifier, "PrivateKeyPassphrase", NULL); } + if (service->type == CONNMAN_SERVICE_TYPE_WIFI && + service->security == CONNMAN_SERVICE_SECURITY_DPP) { + if (service->connector != NULL && strlen(service->connector) > 0) + g_key_file_set_string(keyfile, service->identifier, + "Connector", service->connector); + else + g_key_file_remove_key(keyfile, service->identifier, + "Connector", NULL); + + if (service->c_sign_key != NULL && strlen(service->c_sign_key) > 0) + g_key_file_set_string(keyfile, service->identifier, + "CSignKey", service->c_sign_key); + else + g_key_file_remove_key(keyfile, service->identifier, + "CSignKey", NULL); + + if (service->net_access_key != NULL && strlen(service->net_access_key) > 0) + g_key_file_set_string(keyfile, service->identifier, + "NetAccessKey", service->net_access_key); + else + g_key_file_remove_key(keyfile, service->identifier, + "NetAccessKey", NULL); + } #endif done: @@ -4204,6 +4259,7 @@ int __connman_service_check_passphrase(enum connman_service_security security, case CONNMAN_SERVICE_SECURITY_8021X: #if defined TIZEN_EXT case CONNMAN_SERVICE_SECURITY_OWE: + case CONNMAN_SERVICE_SECURITY_DPP: #endif break; } @@ -4224,6 +4280,9 @@ int __connman_service_set_passphrase(struct connman_service *service, return -EINVAL; #if defined TIZEN_EXT + if (service->immutable && + service->security != CONNMAN_SERVICE_SECURITY_DPP) + return -EINVAL; /* The encrypted passphrase is used here * and validation is done by net-config before being encrypted. */ @@ -5711,6 +5770,17 @@ static void __connman_service_cleanup_network_8021x(struct connman_service *serv connman_network_set_string(service->network, "WiFi.Phase2", NULL); connman_network_set_string(service->network, "WiFi.AnonymousIdentity", NULL); } +static void __connman_service_cleanup_network_dpp(struct connman_service *service) +{ + if (service == NULL) + return; + + DBG("service %p ", service); + + connman_network_set_string(service->network, "WiFi.Connector", NULL); + connman_network_set_string(service->network, "WiFi.CSignKey", NULL); + connman_network_set_string(service->network, "WiFi.NetAccessKey", NULL); +} #endif bool __connman_service_remove(struct connman_service *service) @@ -5784,6 +5854,16 @@ bool __connman_service_remove(struct connman_service *service) g_strfreev(service->nameservers_config); service->nameservers_config = NULL; + g_free(service->connector); + service->connector = NULL; + + g_free(service->c_sign_key); + service->c_sign_key = NULL; + + g_free(service->net_access_key); + service->net_access_key = NULL; + + __connman_service_cleanup_network_dpp(service); #endif service->error = CONNMAN_SERVICE_ERROR_UNKNOWN; @@ -6282,6 +6362,11 @@ static void service_free(gpointer user_data) g_free(service->phase2); g_free(service->config_file); g_free(service->config_entry); +#if defined TIZEN_EXT + g_free(service->connector); + g_free(service->c_sign_key); + g_free(service->net_access_key); +#endif if (service->stats.timer) g_timer_destroy(service->stats.timer); @@ -6855,6 +6940,19 @@ void __connman_service_set_string(struct connman_service *service, service->phase2 = g_strdup(value); } else if (g_str_equal(key, "Passphrase")) __connman_service_set_passphrase(service, value); +#if defined TIZEN_EXT + else if (g_str_equal(key, "Connector")) { + g_free(service->connector); + service->connector = g_strdup(value); + } else if (g_str_equal(key, "CSignKey")) { + g_free(service->c_sign_key); + service->c_sign_key = g_strdup(value); + } else if (g_str_equal(key, "NetAccessKey")) { + g_free(service->net_access_key); + service->net_access_key = g_strdup(value); + } else + DBG("Unknown key: %s", key); +#endif } void __connman_service_set_search_domains(struct connman_service *service, @@ -8064,6 +8162,29 @@ static void prepare_8021x(struct connman_service *service) service->phase1); #endif } +#if defined TIZEN_EXT + +static bool has_valid_configuration_object(struct connman_service *service) +{ + return service->connector && service->c_sign_key && service->net_access_key; +} + +static void prepare_dpp(struct connman_service *service) +{ + DBG("prepare dpp"); + if (service->connector) + connman_network_set_string(service->network, "WiFi.Connector", + service->connector); + + if (service->c_sign_key) + connman_network_set_string(service->network, "WiFi.CSignKey", + service->c_sign_key); + + if (service->net_access_key) + connman_network_set_string(service->network, "WiFi.NetAccessKey", + service->net_access_key); +} +#endif static int service_connect(struct connman_service *service) { @@ -8142,6 +8263,13 @@ static int service_connect(struct connman_service *service) } break; +#if defined TIZEN_EXT + case CONNMAN_SERVICE_SECURITY_DPP: + if (has_valid_configuration_object(service) && + !service->network) + return -EINVAL; + break; +#endif case CONNMAN_SERVICE_SECURITY_8021X: if (!service->eap) { connman_warn("EAP type has not been found. " @@ -8206,6 +8334,9 @@ static int service_connect(struct connman_service *service) #if defined TIZEN_EXT case CONNMAN_SERVICE_SECURITY_SAE: case CONNMAN_SERVICE_SECURITY_OWE: + break; + case CONNMAN_SERVICE_SECURITY_DPP: + prepare_dpp(service); #endif break; case CONNMAN_SERVICE_SECURITY_8021X: @@ -8902,6 +9033,8 @@ static enum connman_service_security convert_wifi_security(const char *security) return CONNMAN_SERVICE_SECURITY_SAE; else if (g_str_equal(security, "owe")) return CONNMAN_SERVICE_SECURITY_OWE; + else if (g_str_equal(security, "dpp")) + return CONNMAN_SERVICE_SECURITY_DPP; else if (g_str_equal(security, "ft_psk") == TRUE) return CONNMAN_SERVICE_SECURITY_PSK; else if (g_str_equal(security, "ft_ieee8021x") == TRUE) @@ -9122,6 +9255,15 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne if (service->phase2 != NULL) connman_network_set_string(service->network, "WiFi.Phase2", service->phase2); + if (service->eap != NULL) + connman_network_set_string(service->network, "WiFi.Connector", + service->connector); + if (service->identity != NULL) + connman_network_set_string(service->network, "WiFi.CSignKey", + service->c_sign_key); + if (service->phase2 != NULL) + connman_network_set_string(service->network, "WiFi.NetAccessKey", + service->net_access_key); #endif } |