diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2009-12-23 23:17:40 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-12-23 14:37:17 -0800 |
commit | e0674e39b356c58f3141aca1f55d8ffcea8dbba1 (patch) | |
tree | 52c50af67225151cd01862f80c31c7658b1c6e5e /src | |
parent | 5d5dd0f33a2f4f1fb282b14d93f9f51eebd82cf2 (diff) | |
download | connman-e0674e39b356c58f3141aca1f55d8ffcea8dbba1.tar.gz connman-e0674e39b356c58f3141aca1f55d8ffcea8dbba1.tar.bz2 connman-e0674e39b356c58f3141aca1f55d8ffcea8dbba1.zip |
Enable connecting to an IEEE 802.1x network from the service API
If security is "ieee8021x", allow the service API to try a connection,
and update the attached network with the right IEEE 802.1x settings.
Also, a passphrase is required when connecting to such network.
Diffstat (limited to 'src')
-rw-r--r-- | src/service.c | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/src/service.c b/src/service.c index 167cef48..c215819d 100644 --- a/src/service.c +++ b/src/service.c @@ -350,12 +350,12 @@ static void passphrase_changed(struct connman_service *service) switch (service->security) { case CONNMAN_SERVICE_SECURITY_UNKNOWN: case CONNMAN_SERVICE_SECURITY_NONE: - case CONNMAN_SERVICE_SECURITY_8021X: break; case CONNMAN_SERVICE_SECURITY_WEP: case CONNMAN_SERVICE_SECURITY_PSK: case CONNMAN_SERVICE_SECURITY_WPA: case CONNMAN_SERVICE_SECURITY_RSN: + case CONNMAN_SERVICE_SECURITY_8021X: if (service->passphrase == NULL) required = TRUE; break; @@ -563,12 +563,12 @@ static DBusMessage *get_properties(DBusConnection *conn, switch (service->security) { case CONNMAN_SERVICE_SECURITY_UNKNOWN: case CONNMAN_SERVICE_SECURITY_NONE: - case CONNMAN_SERVICE_SECURITY_8021X: break; case CONNMAN_SERVICE_SECURITY_WEP: case CONNMAN_SERVICE_SECURITY_PSK: case CONNMAN_SERVICE_SECURITY_WPA: case CONNMAN_SERVICE_SECURITY_RSN: + case CONNMAN_SERVICE_SECURITY_8021X: if (service->passphrase == NULL) required = TRUE; break; @@ -1593,6 +1593,41 @@ static connman_bool_t prepare_network(struct connman_service *service) return TRUE; } +static void prepare_8021x(struct connman_service *service) +{ + if (service->eap) + connman_network_set_string(service->network, "WiFi.EAP", + service->eap); + + if (service->identity) + connman_network_set_string(service->network, "WiFi.Identity", + service->identity); + + if (service->ca_cert_file) + connman_network_set_string(service->network, "WiFi.CACertFile", + service->ca_cert_file); + + if (service->client_cert_file) + connman_network_set_string(service->network, + "WiFi.ClientCertFile", + service->client_cert_file); + + if (service->private_key_file) + connman_network_set_string(service->network, + "WiFi.PrivateKeyFile", + service->private_key_file); + + if (service->private_key_passphrase) + connman_network_set_string(service->network, + "WiFi.PrivateKeyPassphrase", + service->private_key_passphrase); + + if (service->phase2) + connman_network_set_string(service->network, "WiFi.Phase2", + service->phase2); +} + + int __connman_service_connect(struct connman_service *service) { int err; @@ -1622,12 +1657,12 @@ int __connman_service_connect(struct connman_service *service) switch (service->security) { case CONNMAN_SERVICE_SECURITY_UNKNOWN: case CONNMAN_SERVICE_SECURITY_NONE: - case CONNMAN_SERVICE_SECURITY_8021X: break; case CONNMAN_SERVICE_SECURITY_WEP: case CONNMAN_SERVICE_SECURITY_PSK: case CONNMAN_SERVICE_SECURITY_WPA: case CONNMAN_SERVICE_SECURITY_RSN: + case CONNMAN_SERVICE_SECURITY_8021X: if (service->passphrase == NULL) return -ENOKEY; break; @@ -1639,6 +1674,19 @@ int __connman_service_connect(struct connman_service *service) if (prepare_network(service) == FALSE) return -EINVAL; + switch (service->security) { + case CONNMAN_SERVICE_SECURITY_UNKNOWN: + case CONNMAN_SERVICE_SECURITY_NONE: + case CONNMAN_SERVICE_SECURITY_WEP: + case CONNMAN_SERVICE_SECURITY_PSK: + case CONNMAN_SERVICE_SECURITY_WPA: + case CONNMAN_SERVICE_SECURITY_RSN: + break; + case CONNMAN_SERVICE_SECURITY_8021X: + prepare_8021x(service); + break; + } + __connman_ipconfig_enable(service->ipconfig); err = __connman_network_connect(service->network); @@ -1819,7 +1867,8 @@ int __connman_service_create_and_connect(DBusMessage *msg) g_strcmp0(security, "wep") != 0 && g_strcmp0(security, "psk") != 0 && g_strcmp0(security, "wpa") != 0 && - g_strcmp0(security, "rsn") != 0) + g_strcmp0(security, "rsn") != 0 && + g_strcmp0(security, "ieee8021x") != 0) return -EINVAL; device = __connman_element_find_device(CONNMAN_DEVICE_TYPE_WIFI); |