summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYu <jiung.yu@samsung.com>2019-09-04 13:43:22 +0900
committerYu <jiung.yu@samsung.com>2019-09-27 14:10:34 +0900
commitdb328958f4b083cce99bdd81d861d707459ae1f6 (patch)
tree5b8f9ca20ed7eccff9c24cd9560762fa148ba338 /src
parenta0c29c7da07fa8bf3e8839a4a64a183a02296a32 (diff)
downloadconnman-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.c65
-rwxr-xr-xsrc/network.c22
-rw-r--r--src/service.c142
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
}