summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/ethernet.c17
-rwxr-xr-xsrc/service.c313
2 files changed, 291 insertions, 39 deletions
diff --git a/plugins/ethernet.c b/plugins/ethernet.c
index 6702cd38..4876f768 100644
--- a/plugins/ethernet.c
+++ b/plugins/ethernet.c
@@ -173,7 +173,12 @@ void handle_eap_signal(GSupplicantInterface *interface, bool status)
if (!status) {
// Should we mark service as non favorite or make autoconnect as false?
- g_supplicant_interface_remove(interface, NULL, NULL);
+ struct ethernet_data *ethernet = g_supplicant_interface_get_data(interface);
+ if (ethernet && ethernet->interface) {
+ g_supplicant_interface_remove(ethernet->interface, NULL, NULL);
+ ethernet->interface = NULL;
+ }
+
connman_network_set_error(g_network, CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
g_network = NULL;
return;
@@ -253,7 +258,10 @@ static int eth_network_disconnect(struct connman_network *network)
g_network = NULL;
g_supplicant_unregister_eap_callback();
- g_supplicant_interface_remove(ethernet->interface, NULL, NULL);
+ if (ethernet && ethernet->interface) {
+ g_supplicant_interface_remove(ethernet->interface, NULL, NULL);
+ ethernet->interface = NULL;
+ }
connman_network_set_associating(network, false);
connman_network_set_connected(network, false);
@@ -427,7 +435,10 @@ static void eth_dev_remove(struct connman_device *device)
connman_device_set_data(device, NULL);
#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
- g_supplicant_interface_remove(ethernet->interface, NULL, NULL);
+ if (ethernet && ethernet->interface) {
+ g_supplicant_interface_remove(ethernet->interface, NULL, NULL);
+ ethernet->interface = NULL;
+ }
#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */
connman_rtnl_remove_watch(ethernet->watch);
diff --git a/src/service.c b/src/service.c
index e21f68a0..73938912 100755
--- a/src/service.c
+++ b/src/service.c
@@ -210,9 +210,15 @@ struct connman_service {
int disconnect_reason;
int assoc_status_code;
/*
- * Only for EAP-FAST
+ * Only for EAP-FAST and EAP-PEAP in EAPoL.
*/
char *phase1;
+#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
+ /*
+ * Only for EAP-FAST
+ */
+ char *pac_file;
+#endif
/*
* Description: To indicate that disconnection triggered by user.
*/
@@ -641,6 +647,145 @@ int __connman_service_load_modifiable(struct connman_service *service)
return 0;
}
+#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
+static void __connman_service_cleanup_8021x(struct connman_service *service)
+{
+ if (service == NULL)
+ return;
+
+ DBG("service %p ", service);
+
+ __connman_service_set_string(service, "EAP", NULL);
+ __connman_service_set_string(service, "Identity", NULL);
+ __connman_service_set_string(service, "Passphrase", NULL);
+ __connman_service_set_string(service, "AnonymousIdentity", NULL);
+ __connman_service_set_string(service, "CACertFile", NULL);
+ __connman_service_set_string(service, "ClientCertFile", NULL);
+ __connman_service_set_string(service, "PrivateKeyFile", NULL);
+ __connman_service_set_string(service, "PrivateKeyPassphrase", NULL);
+ __connman_service_set_string(service, "Phase1", NULL);
+ __connman_service_set_string(service, "Phase2", NULL);
+ __connman_service_set_string(service, "PacFile", NULL);
+}
+
+static int connman_service_set_eapol_property(struct connman_service *service,
+ DBusMessageIter *array)
+{
+ DBusMessageIter dict;
+ char *str = NULL;
+
+ __connman_service_cleanup_8021x(service);
+
+ if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY)
+ return -EINVAL;
+
+ dbus_message_iter_recurse(array, &dict);
+
+ while(dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry, value;
+ const char *key;
+ int type;
+
+ dbus_message_iter_recurse(&dict, &entry);
+
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&entry, &key);
+ dbus_message_iter_next(&entry);
+
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_VARIANT)
+ return -EINVAL;
+
+ dbus_message_iter_recurse(&entry, &value);
+
+ type = dbus_message_iter_get_arg_type(&value);
+
+ if (g_str_equal(key, "UseEapol")) {
+ dbus_bool_t use_eapol;
+
+ if (type != DBUS_TYPE_BOOLEAN)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &use_eapol);
+ service->use_eapol = use_eapol;
+
+ } else if (g_str_equal(key, "EAP")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "EAP", str);
+
+ } else if (g_str_equal(key, "Identity")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "Identity", str);
+
+ } else if (g_str_equal(key, "AnonymousIdentity")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "AnonymousIdentity", str);
+
+ } else if (g_str_equal(key, "CACertFile")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "CACertFile", str);
+ } else if (g_str_equal(key, "ClientCertFile")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "ClientCertFile", str);
+ } else if (g_str_equal(key, "PrivateKeyFile")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "PrivateKeyFile", str);
+ } else if (g_str_equal(key, "PrivateKeyPassphrase")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "PrivateKeyPassphrase", str);
+ } else if (g_str_equal(key, "Phase2")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "Phase2", str);
+ } else if (g_str_equal(key, "Phase1")) {
+ int val;
+ char phase1[5] = {0,};
+
+ if (type != DBUS_TYPE_INT32)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &val);
+ sprintf(phase1, "%d", val);
+ __connman_service_set_string(service, "Phase1", phase1);
+ } else if (g_str_equal(key, "PacFile")) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&value, &str);
+ __connman_service_set_string(service, "PacFile", str);
+ }
+
+ dbus_message_iter_next(&dict);
+ }
+
+ return 0;
+}
+#endif
+
#if defined TIZEN_EXT
static void save_assoc_reject(gpointer key, gpointer value, gpointer user_data)
{
@@ -1134,8 +1279,12 @@ static int service_load(struct connman_service *service)
service->identifier, "Hidden", NULL);
#if defined TIZEN_EXT
- if (service->type == CONNMAN_SERVICE_TYPE_WIFI &&
- service->security == CONNMAN_SERVICE_SECURITY_8021X) {
+ if ((service->type == CONNMAN_SERVICE_TYPE_WIFI &&
+ service->security == CONNMAN_SERVICE_SECURITY_8021X)
+#if defined TIZEN_EXT_EAP_ON_ETHERNET
+ || (service->type == CONNMAN_SERVICE_TYPE_ETHERNET && service->use_eapol)
+#endif
+ ) {
str = g_key_file_get_string(keyfile,
service->identifier, "EAP", NULL);
if (str != NULL) {
@@ -1157,6 +1306,14 @@ static int service_load(struct connman_service *service)
service->identity = str;
}
+#if defined TIZEN_EXT_EAP_ON_ETHERNET
+ str = g_key_file_get_string(keyfile,
+ service->identifier, "AnonymousIdentity", NULL);
+ if (str != NULL) {
+ g_free(service->anonymous_identity);
+ service->anonymous_identity = str;
+ }
+#endif
str = g_key_file_get_string(keyfile,
service->identifier, "CACertFile", NULL);
if (str != NULL) {
@@ -1184,6 +1341,22 @@ static int service_load(struct connman_service *service)
g_free(service->private_key_passphrase);
service->private_key_passphrase = str;
}
+
+#if defined TIZEN_EXT_EAP_ON_ETHERNET
+ str = g_key_file_get_string(keyfile,
+ service->identifier, "Phase1", NULL);
+ if (str != NULL) {
+ g_free(service->phase1);
+ service->phase1 = str;
+ }
+
+ str = g_key_file_get_string(keyfile,
+ service->identifier, "PacFile", NULL);
+ if (str != NULL) {
+ g_free(service->pac_file);
+ service->pac_file = str;
+ }
+#endif
}
#endif
#if defined TIZEN_EXT
@@ -1508,8 +1681,12 @@ static int service_save(struct connman_service *service)
"Config.ident", service->config_entry);
#if defined TIZEN_EXT
- if (service->type == CONNMAN_SERVICE_TYPE_WIFI &&
- service->security == CONNMAN_SERVICE_SECURITY_8021X) {
+ if ((service->type == CONNMAN_SERVICE_TYPE_WIFI &&
+ service->security == CONNMAN_SERVICE_SECURITY_8021X)
+#if defined TIZEN_EXT_EAP_ON_ETHERNET
+ || (service->type == CONNMAN_SERVICE_TYPE_ETHERNET)
+#endif
+ ) {
if (service->eap != NULL && strlen(service->eap) > 0)
g_key_file_set_string(keyfile, service->identifier,
"EAP", service->eap);
@@ -1530,6 +1707,14 @@ static int service_save(struct connman_service *service)
else
g_key_file_remove_key(keyfile, service->identifier,
"Identity", NULL);
+#if defined TIZEN_EXT_EAP_ON_ETHERNET
+ if (service->anonymous_identity != NULL && strlen(service->anonymous_identity) > 0)
+ g_key_file_set_string(keyfile, service->identifier,
+ "AnonymousIdentity", service->anonymous_identity);
+ else
+ g_key_file_remove_key(keyfile, service->identifier,
+ "AnonymousIdentity", NULL);
+#endif
if (service->ca_cert_file != NULL && strlen(service->ca_cert_file) > 0)
g_key_file_set_string(keyfile, service->identifier,
@@ -1558,7 +1743,22 @@ static int service_save(struct connman_service *service)
else
g_key_file_remove_key(keyfile, service->identifier,
"PrivateKeyPassphrase", NULL);
+#if defined TIZEN_EXT_EAP_ON_ETHERNET
+ if (service->phase1 != NULL && strlen(service->phase1) > 0)
+ g_key_file_set_string(keyfile, service->identifier,
+ "Phase1", service->phase1);
+ else
+ g_key_file_remove_key(keyfile, service->identifier,
+ "Phase1", NULL);
+ if (service->pac_file != NULL && strlen(service->pac_file) > 0)
+ g_key_file_set_string(keyfile, service->identifier,
+ "PacFile", service->pac_file);
+ else
+ g_key_file_remove_key(keyfile, service->identifier,
+ "PacFile", NULL);
+#endif
}
+
if (service->type == CONNMAN_SERVICE_TYPE_WIFI &&
service->security == CONNMAN_SERVICE_SECURITY_DPP) {
if (service->connector != NULL && strlen(service->connector) > 0)
@@ -2847,26 +3047,6 @@ void connman_service_set_disconnection_requested(struct connman_service *service
}
#endif
-#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
-static void use_eapol_changed(struct connman_service *service)
-{
- dbus_bool_t use_eapol;
-
- if (!service->path)
- return;
-
- if (!allow_property_changed(service))
- return;
-
- use_eapol = service->use_eapol;
- connman_dbus_property_changed_basic(service->path,
- CONNMAN_SERVICE_INTERFACE,
- "UseEapol",
- DBUS_TYPE_BOOLEAN,
- &use_eapol);
-}
-#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */
-
static void strength_changed(struct connman_service *service)
{
if (service->strength == 0)
@@ -3035,6 +3215,57 @@ static void append_ethernet(DBusMessageIter *iter, void *user_data)
iter);
}
+#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
+static void append_eap_over_ethernet(DBusMessageIter *iter, void *user_data)
+{
+ struct connman_service *service = user_data;
+ dbus_bool_t val;
+
+ val = service->use_eapol;
+ connman_dbus_dict_append_basic(iter, "UseEapol",
+ DBUS_TYPE_BOOLEAN, &val);
+ if (service->use_eapol) {
+ if (service->eap)
+ connman_dbus_dict_append_basic(iter, "EAP",
+ DBUS_TYPE_STRING, &service->eap);
+
+ if (service->identity)
+ connman_dbus_dict_append_basic(iter, "Identity",
+ DBUS_TYPE_STRING, &service->identity);
+
+ if (service->anonymous_identity)
+ connman_dbus_dict_append_basic(iter, "AnonymousIdentity",
+ DBUS_TYPE_STRING, &service->anonymous_identity);
+
+ if (service->ca_cert_file)
+ connman_dbus_dict_append_basic(iter, "CACertFile",
+ DBUS_TYPE_STRING, &service->ca_cert_file);
+
+ if (service->client_cert_file)
+ connman_dbus_dict_append_basic(iter, "ClientCertFile",
+ DBUS_TYPE_STRING, &service->client_cert_file);
+
+ if (service->private_key_file)
+ connman_dbus_dict_append_basic(iter, "PrivateKeyFile",
+ DBUS_TYPE_STRING, &service->private_key_file);
+
+ if (service->phase2)
+ connman_dbus_dict_append_basic(iter, "Phase2",
+ DBUS_TYPE_STRING, &service->phase2);
+
+ if (service->phase1)
+ connman_dbus_dict_append_basic(iter, "Phase1",
+ DBUS_TYPE_STRING, &service->phase1);
+
+ if (service->pac_file)
+ connman_dbus_dict_append_basic(iter, "PacFile",
+ DBUS_TYPE_STRING, &service->pac_file);
+
+ /* Should we include passphrase? */
+ }
+}
+#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */
+
static void append_ipv4(DBusMessageIter *iter, void *user_data)
{
struct connman_service *service = user_data;
@@ -4153,9 +4384,9 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
#endif
case CONNMAN_SERVICE_TYPE_ETHERNET:
#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
- val = service->use_eapol;
- connman_dbus_dict_append_basic(dict, "UseEapol",
- DBUS_TYPE_BOOLEAN, &val);
+ connman_dbus_dict_append_dict(dict, "EapOverEthernet",
+ append_eap_over_ethernet, service);
+
#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_GADGET:
@@ -5784,15 +6015,11 @@ static DBusMessage *set_property(DBusConnection *conn,
__connman_service_set_passphrase(service, passphrase);
#endif
#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET
- } else if (g_str_equal(name, "UseEapol")) {
- dbus_bool_t use_eapol;
-
- if (type != DBUS_TYPE_BOOLEAN)
- return __connman_error_invalid_arguments(msg);
-
- dbus_message_iter_get_basic(&value, &use_eapol);
+ } else if (g_str_equal(name, "EapOverEthernet")) {
+ int err = connman_service_set_eapol_property(service, &value);
+ if (err < 0)
+ return __connman_error_failed(msg, -err);
- service->use_eapol = use_eapol;
service_save(service);
#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */
} else
@@ -7137,6 +7364,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 && defined TIZEN_EXT_EAP_ON_ETHERNET
+ g_free(service->pac_file);
+ g_free(service->phase1);
+#endif
+
#if defined TIZEN_EXT
g_free(service->connector);
g_free(service->c_sign_key);
@@ -7929,6 +8161,15 @@ 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 && defined TIZEN_EXT_EAP_ON_ETHERNET
+ else if (g_str_equal(key, "Phase1")) {
+ g_free(service->phase1);
+ service->phase1 = g_strdup(value);
+ } else if (g_str_equal(key, "PacFile")) {
+ g_free(service->pac_file);
+ service->pac_file = g_strdup(value);
+ }
+#endif
#if defined TIZEN_EXT
else if (g_str_equal(key, "Connector")) {
g_free(service->connector);