diff options
-rw-r--r-- | configure.ac | 5 | ||||
-rwxr-xr-x | gsupplicant/dbus.c | 1 | ||||
-rwxr-xr-x | gsupplicant/gsupplicant.h | 18 | ||||
-rwxr-xr-x | gsupplicant/supplicant.c | 102 | ||||
-rwxr-xr-x | include/network.h | 3 | ||||
-rw-r--r-- | packaging/connman.spec | 1 | ||||
-rw-r--r-- | plugins/ethernet.c | 147 | ||||
-rwxr-xr-x | plugins/wifi.c | 157 | ||||
-rwxr-xr-x | src/connman.h | 4 | ||||
-rwxr-xr-x | src/network.c | 19 | ||||
-rwxr-xr-x | src/service.c | 328 |
11 files changed, 779 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac index 75ba90cc..bdece8d7 100644 --- a/configure.ac +++ b/configure.ac @@ -92,6 +92,11 @@ AC_ARG_ENABLE(tizen-ext-wifi-mesh, [CFLAGS="$CFLAGS -DTIZEN_EXT_WIFI_MESH"], [enable_tizen_ext_wifi_mesh="no"]) AM_CONDITIONAL(TIZEN_EXT_WIFI_MESH, test "${enable_tizen_ext_wifi_mesh}" != "no") +AC_ARG_ENABLE(tizen-ext-eap-on-ethernet, + AC_HELP_STRING([--enable-tizen-ext-eap-on-ethernet], [enable TIZEN extensions for EAP on Ethernet]), + [CFLAGS="$CFLAGS -DTIZEN_EXT_EAP_ON_ETHERNET"], [enable_tizen_ext_eap_on_ethernet="no"]) +AM_CONDITIONAL(TIZEN_EXT_EAP_ON_ETHERNET, test "${enable_tizen_ext_eap_on_ethernet}" != "no") + AC_ARG_ENABLE(tizen-maintain-online, AC_HELP_STRING([--enable-tizen-maintain-online], [enable TIZEN extensions]), [if (test "${enableval}" = "yes"); then diff --git a/gsupplicant/dbus.c b/gsupplicant/dbus.c index 2957979a..9ad8e080 100755 --- a/gsupplicant/dbus.c +++ b/gsupplicant/dbus.c @@ -30,6 +30,7 @@ #include <glib.h> #include "dbus.h" +#include <connman/log.h> #define TIMEOUT 30000 diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h index 6dfd9c72..6cf85f3c 100755 --- a/gsupplicant/gsupplicant.h +++ b/gsupplicant/gsupplicant.h @@ -487,6 +487,10 @@ GSupplicantNetwork *g_supplicant_interface_get_network(GSupplicantInterface *int const char *group); #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +typedef void (*g_supplicant_eap_callback)(GSupplicantInterface *interface, bool status); +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + struct _GSupplicantCallbacks { void (*system_ready) (void); void (*system_killed) (void); @@ -531,6 +535,10 @@ struct _GSupplicantCallbacks { void (*mesh_peer_connected) (GSupplicantMeshPeer *mesh_peer); void (*mesh_peer_disconnected) (GSupplicantMeshPeer *mesh_peer); #endif + +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + g_supplicant_eap_callback eap; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ }; typedef struct _GSupplicantCallbacks GSupplicantCallbacks; @@ -542,7 +550,17 @@ void g_supplicant_set_ins_settings(GSupplicantINSPreferredFreq preferred_freq_bs unsigned int assoc_reject_score, int signal_level3_5ghz, int signal_level3_24ghz); #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +void g_supplicant_replace_config_file(const char *ifname, const char *config_file); +void g_supplicant_register_eap_callback(g_supplicant_eap_callback cb); +void g_supplicant_unregister_eap_callback(void); +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +int g_supplicant_register(GSupplicantCallbacks *callbacks); +#else /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ int g_supplicant_register(const GSupplicantCallbacks *callbacks); +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ void g_supplicant_unregister(const GSupplicantCallbacks *callbacks); static inline diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index d59085d0..759e165b 100755 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -69,7 +69,11 @@ static DBusConnection *connection; +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +static GSupplicantCallbacks *callbacks_pointer; +#else /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ static const GSupplicantCallbacks *callbacks_pointer; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ static dbus_bool_t system_available = FALSE; static dbus_bool_t system_ready = FALSE; @@ -906,6 +910,19 @@ static void callback_sta_deauthorized(GSupplicantInterface *interface, callbacks_pointer->sta_deauthorized(interface, addr); } +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +static void callback_eap(GSupplicantInterface *interface, bool status) +{ + if (!callbacks_pointer) + return; + + if (!callbacks_pointer->eap) + return; + + callbacks_pointer->eap(interface, status); +} +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + static void callback_peer_found(GSupplicantPeer *peer) { if (!callbacks_pointer) @@ -3441,6 +3458,21 @@ static void wps_property(const char *key, DBusMessageIter *iter, } +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +void g_supplicant_replace_config_file(const char *ifname, const char *config_file) +{ + if (!ifname) + return; + + if (!config_file) + return; + + SUPPLICANT_DBG("New {%s, %s}", ifname, config_file); + g_hash_table_replace(config_file_table, + g_strdup(ifname), g_strdup(config_file)); +} +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + static void interface_property(const char *key, DBusMessageIter *iter, void *user_data) { @@ -4015,6 +4047,40 @@ static void signal_sta_deauthorized(const char *path, DBusMessageIter *iter) callback_sta_deauthorized(interface, addr); } +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +static void signal_eap(const char *path, DBusMessageIter *iter) +{ + GSupplicantInterface *interface; + const char *str = NULL; + + SUPPLICANT_DBG("EAPOL_DEBUG callback eap signal"); + + interface = g_hash_table_lookup(interface_table, path); + if (!interface) + return; + + // TODO: Identify EAP fail condition, currently timeout is used for failure. + + dbus_message_iter_get_basic(iter, &str); + if (!str) + return; + + if (g_strcmp0("completion", str)) + return; + + dbus_message_iter_next(iter); + + dbus_message_iter_get_basic(iter, &str); + if (!str) + return; + + if (!g_strcmp0("success", str)) + callback_eap(interface, true); + else + callback_eap(interface, false); +} +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + static void signal_bss_changed(const char *path, DBusMessageIter *iter) { GSupplicantInterface *interface; @@ -5090,6 +5156,10 @@ static struct { signal_mesh_peer_disconnected }, #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + { SUPPLICANT_INTERFACE ".Interface", "EAP", signal_eap }, +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + { } }; @@ -5764,7 +5834,6 @@ static void interface_remove_params(DBusMessageIter *iter, void *user_data) &data->interface->path); } - int g_supplicant_interface_remove(GSupplicantInterface *interface, GSupplicantInterfaceCallback callback, void *user_data) @@ -8221,7 +8290,37 @@ void g_supplicant_set_ins_settings(GSupplicantINSPreferredFreq preferred_freq_bs } #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +void g_supplicant_register_eap_callback(g_supplicant_eap_callback cb) +{ + SUPPLICANT_DBG("g_supplicant_register_eap_callback %p", cb); + + if (!callbacks_pointer) { + SUPPLICANT_DBG("callbacks_pointer is NULL"); + return; + } + + callbacks_pointer->eap = cb; +} + +void g_supplicant_unregister_eap_callback(void) +{ + SUPPLICANT_DBG("g_supplicant_unregister_eap_callback"); + + if (!callbacks_pointer) { + SUPPLICANT_DBG("callbacks_pointer is NULL"); + return; + } + + callbacks_pointer->eap = NULL; +} +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +int g_supplicant_register(GSupplicantCallbacks *callbacks) +#else /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ int g_supplicant_register(const GSupplicantCallbacks *callbacks) +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ { connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL); if (!connection) @@ -8283,6 +8382,7 @@ int g_supplicant_register(const GSupplicantCallbacks *callbacks) } else invoke_introspect_method(); + SUPPLICANT_DBG("supplicant dbus setup completed"); return 0; } diff --git a/include/network.h b/include/network.h index fc68d300..a9f4f017 100755 --- a/include/network.h +++ b/include/network.h @@ -146,6 +146,9 @@ bool connman_network_get_connecting(struct connman_network *network); #if defined TIZEN_EXT void connman_network_set_connecting(struct connman_network *network); #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +bool connman_network_check_validity(struct connman_network *network); +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ int connman_network_set_available(struct connman_network *network, bool available); bool connman_network_get_available(struct connman_network *network); diff --git a/packaging/connman.spec b/packaging/connman.spec index 47276492..7ff85ebe 100644 --- a/packaging/connman.spec +++ b/packaging/connman.spec @@ -154,6 +154,7 @@ chmod +x bootstrap --enable-client \ --enable-tizen-ext \ --disable-tizen-ext-ins \ + --enable-tizen-ext-eap-on-ethernet \ --enable-pacrunner \ --enable-wifi=builtin \ %if %{with connman_openconnect} diff --git a/plugins/ethernet.c b/plugins/ethernet.c index 9e157467..57d65424 100644 --- a/plugins/ethernet.c +++ b/plugins/ethernet.c @@ -53,6 +53,11 @@ #include <connman/mesh.h> #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +#include <connman/option.h> +#include <gsupplicant/gsupplicant.h> +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + static bool eth_tethering = false; struct ethernet_data { @@ -60,6 +65,9 @@ struct ethernet_data { unsigned flags; unsigned int watch; struct connman_network *network; +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + GSupplicantInterface *interface; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ }; @@ -142,10 +150,99 @@ static void eth_network_remove(struct connman_network *network) DBG("network %p", network); } +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +static struct connman_network *g_network = NULL; + +void handle_eap_signal(GSupplicantInterface *interface, bool status) +{ + DBG("captured EAP signal"); + + if (!g_network) + return; + + if (g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; + + if (!connman_network_check_validity(g_network)) + return; + + DBG("network is valid"); + + g_supplicant_unregister_eap_callback(); + + if (!status) { + // Should we mark service as non favorite or make autoconnect as false? + + 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; + } + + connman_network_set_connected(g_network, status); + g_network = NULL; +} + +static void interface_create_callback(int result, + GSupplicantInterface *interface, void *user_data) +{ + struct ethernet_data *ethernet = user_data; + + if (result < 0 || !interface || !ethernet) + return; + + DBG("result %d ifname %s, ethernet %p", result, + g_supplicant_interface_get_ifname(interface), + ethernet); + + ethernet->interface = interface; + g_supplicant_interface_set_data(interface, ethernet); +} + static int eth_network_connect(struct connman_network *network) { DBG("network %p", network); + struct connman_service *service = connman_service_lookup_from_network(network); + + if (service && __connman_service_get_use_eapol(service)) { + struct connman_device *device = connman_network_get_device(network); + struct ethernet_data *ethernet = connman_device_get_data(device); + const char *driver = "wired"; + int index = connman_network_get_index(network); + char *ifname = connman_inet_ifname(index);; + char *config_file = NULL; + + g_supplicant_register_eap_callback(handle_eap_signal); + g_network = network; + + if (asprintf(&config_file, "/opt/usr/data/network/%s-eapol.conf", ifname) < 0) { + g_free(ifname); + return -ENOMEM; + } + + DBG("config_file %s", config_file); + + g_supplicant_replace_config_file(ifname, config_file); + free(config_file); + + /* + * TODO: RemoveInterface if already present because + * already created interface will not start EAP handshake. + */ + g_supplicant_interface_create(ifname, driver, NULL, + interface_create_callback, ethernet); + + g_free(ifname); + + return 0; + } + connman_network_set_connected(network, true); return 0; @@ -155,11 +252,51 @@ static int eth_network_disconnect(struct connman_network *network) { DBG("network %p", network); + struct connman_service *service = connman_service_lookup_from_network(network); + + if (service && __connman_service_get_use_eapol(service)) { + struct connman_device *device = connman_network_get_device(network); + struct ethernet_data *ethernet = connman_device_get_data(device); + + g_network = NULL; + g_supplicant_unregister_eap_callback(); + 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); + + return 0; + } + connman_network_set_connected(network, false); return 0; } +#else /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + +static int eth_network_connect(struct connman_network *network) +{ + DBG("network %p", network); + + connman_network_set_connected(network, true); + + return 0; +} + +static int eth_network_disconnect(struct connman_network *network) +{ + DBG("network %p", network); + + connman_network_set_connected(network, false); + + return 0; +} + +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + static struct connman_network_driver eth_network_driver = { .name = "cable", .type = CONNMAN_NETWORK_TYPE_ETHERNET, @@ -281,6 +418,9 @@ static int eth_dev_probe(struct connman_device *device) ethernet->index = connman_device_get_index(device); ethernet->flags = 0; +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + ethernet->interface = NULL; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ ethernet->watch = connman_rtnl_add_newlink_watch(ethernet->index, ethernet_newlink, device); @@ -296,6 +436,13 @@ 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 + 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); remove_network(device, ethernet); diff --git a/plugins/wifi.c b/plugins/wifi.c index bce1424f..cbc6b152 100755 --- a/plugins/wifi.c +++ b/plugins/wifi.c @@ -3905,6 +3905,15 @@ static void interface_added(GSupplicantInterface *interface) { const char *ifname = g_supplicant_interface_get_ifname(interface); const char *driver = g_supplicant_interface_get_driver(interface); +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + #if defined TIZEN_EXT bool is_5_0_ghz_supported = g_supplicant_interface_get_is_5_0_ghz_supported(interface); #endif @@ -4179,6 +4188,15 @@ static void interface_state(GSupplicantInterface *interface) struct connman_device *device; struct wifi_data *wifi; GSupplicantState state = g_supplicant_interface_get_state(interface); +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + bool wps; bool old_connected; @@ -4442,6 +4460,15 @@ static void interface_removed(GSupplicantInterface *interface) { const char *ifname = g_supplicant_interface_get_ifname(interface); struct wifi_data *wifi; +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + DBG("ifname %s", ifname); @@ -4510,6 +4537,15 @@ static void p2p_support(GSupplicantInterface *interface) { char dev_type[17] = {}; const char *hostname; +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + DBG(""); @@ -4536,11 +4572,29 @@ static void p2p_support(GSupplicantInterface *interface) static void scan_started(GSupplicantInterface *interface) { +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + DBG(""); } static void scan_finished(GSupplicantInterface *interface) { +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + #if defined TIZEN_EXT struct wifi_data *wifi; bool is_associating = false; @@ -4577,6 +4631,15 @@ static void scan_finished(GSupplicantInterface *interface) static void ap_create_fail(GSupplicantInterface *interface) { +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + struct wifi_data *wifi = g_supplicant_interface_get_data(interface); int ret; @@ -4742,6 +4805,15 @@ static void network_added(GSupplicantNetwork *supplicant_network) #endif interface = g_supplicant_network_get_interface(supplicant_network); +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + wifi = g_supplicant_interface_get_data(interface); name = g_supplicant_network_get_name(supplicant_network); security = g_supplicant_network_get_security(supplicant_network); @@ -4890,6 +4962,15 @@ static void network_removed(GSupplicantNetwork *network) #endif interface = g_supplicant_network_get_interface(network); +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + wifi = g_supplicant_interface_get_data(interface); identifier = g_supplicant_network_get_identifier(network); name = g_supplicant_network_get_name(network); @@ -4940,6 +5021,15 @@ static void network_changed(GSupplicantNetwork *network, const char *property) #endif interface = g_supplicant_network_get_interface(network); +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + wifi = g_supplicant_interface_get_data(interface); identifier = g_supplicant_network_get_identifier(network); name = g_supplicant_network_get_name(network); @@ -5057,6 +5147,15 @@ static void network_associated(GSupplicantNetwork *network) interface = g_supplicant_network_get_interface(network); if (!interface) return; +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + wifi = g_supplicant_interface_get_data(interface); if (!wifi) @@ -5103,6 +5202,15 @@ static void network_associated(GSupplicantNetwork *network) static void sta_authorized(GSupplicantInterface *interface, const char *addr) { +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + struct wifi_data *wifi = g_supplicant_interface_get_data(interface); DBG("wifi %p station %s authorized", wifi, addr); @@ -5116,6 +5224,15 @@ static void sta_authorized(GSupplicantInterface *interface, static void sta_deauthorized(GSupplicantInterface *interface, const char *addr) { +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + struct wifi_data *wifi = g_supplicant_interface_get_data(interface); DBG("wifi %p station %s deauthorized", wifi, addr); @@ -5351,6 +5468,15 @@ static void network_merged(GSupplicantNetwork *network) if (!interface) return; +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + state = g_supplicant_interface_get_state(interface); if (state < G_SUPPLICANT_STATE_AUTHENTICATING) return; @@ -5411,6 +5537,15 @@ static void assoc_failed(void *user_data) static void scan_done(GSupplicantInterface *interface) { +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + GList *list; int scan_type = CONNMAN_SCAN_TYPE_WPA_SUPPLICANT; struct wifi_data *wifi; @@ -5443,6 +5578,15 @@ static void debug(const char *str) static void disconnect_reasoncode(GSupplicantInterface *interface, int reasoncode) { +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + struct wifi_data *wifi = g_supplicant_interface_get_data(interface); if (wifi != NULL) { @@ -5452,6 +5596,15 @@ static void disconnect_reasoncode(GSupplicantInterface *interface, static void assoc_status_code(GSupplicantInterface *interface, int status_code) { +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If supplicant interface's driver is wired then skip it, + * because it meanti only for ethernet not Wi-Fi. + */ + if (!g_strcmp0("wired", g_supplicant_interface_get_driver(interface))) + return; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + struct wifi_data *wifi = g_supplicant_interface_get_data(interface); if (wifi != NULL) { @@ -5459,7 +5612,11 @@ static void assoc_status_code(GSupplicantInterface *interface, int status_code) } } +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +static GSupplicantCallbacks callbacks = { +#else /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ static const GSupplicantCallbacks callbacks = { +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ .system_ready = system_ready, .system_killed = system_killed, .interface_added = interface_added, diff --git a/src/connman.h b/src/connman.h index a2608396..2f2f5a8e 100755 --- a/src/connman.h +++ b/src/connman.h @@ -823,6 +823,10 @@ bool __connman_service_get_auto_connect_mode(void); void __connman_service_set_auto_connect_mode(bool enable); #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +int __connman_service_get_use_eapol(struct connman_service *service); +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + bool __connman_service_remove(struct connman_service *service); bool __connman_service_is_provider_pending(struct connman_service *service); void __connman_service_set_provider_pending(struct connman_service *service, diff --git a/src/network.c b/src/network.c index f1183b37..334202c0 100755 --- a/src/network.c +++ b/src/network.c @@ -1730,6 +1730,13 @@ static gboolean __connman_network_clear_associating_delayed(gpointer user_data) } #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +bool connman_network_check_validity(struct connman_network *network) +{ + return (NULL == g_slist_find(network_list, network)) ? false : true; +} +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + /** * connman_network_set_associating: * @network: network structure @@ -2069,6 +2076,18 @@ int __connman_network_connect(struct connman_network *network) return err; } +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * Note: If EAP on Ethernet is ON, then network will be connected + * after EAP Success event is recieved, from plugin/ethernet.c + */ + struct connman_service *service = connman_service_lookup_from_network(network); + if (service && __connman_service_get_use_eapol(service)) { + connman_network_set_associating(network, true); + return 0; + } +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + set_connected(network); return err; diff --git a/src/service.c b/src/service.c index 20123197..fb780fbe 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. */ @@ -240,6 +246,12 @@ struct connman_service { #endif int ins_score; #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + /* + * To indicate use of EAP over Ethernet. + */ + bool use_eapol; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ }; static bool allow_property_changed(struct connman_service *service); @@ -635,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) { @@ -882,6 +1033,9 @@ static int service_load(struct connman_service *service) #if defined TIZEN_EXT bool internet_connection; #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + bool use_eapol; +#endif DBG("service %p", service); @@ -1018,6 +1172,14 @@ static int service_load(struct connman_service *service) if (!error) service->autoconnect = autoconnect; g_clear_error(&error); + +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + use_eapol = g_key_file_get_boolean(keyfile, + service->identifier, "UseEapol", &error); + if (!error) + service->use_eapol = use_eapol; + g_clear_error(&error); +#endif break; } @@ -1117,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) { @@ -1140,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) { @@ -1167,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 @@ -1357,6 +1547,10 @@ static int service_save(struct connman_service *service) if (service->favorite) g_key_file_set_boolean(keyfile, service->identifier, "AutoConnect", service->autoconnect); +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + g_key_file_set_boolean(keyfile, service->identifier, + "UseEapol", service->use_eapol); +#endif break; } @@ -1487,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); @@ -1509,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, @@ -1537,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) @@ -2707,7 +2928,11 @@ bool __connman_service_index_is_default(int index) static void default_changed(void) { +#if defined TIZEN_EXT + struct connman_service *service = connman_service_get_default_connection(); +#else struct connman_service *service = connman_service_get_default(); +#endif if (service == current_default) return; @@ -2994,6 +3219,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; @@ -4111,6 +4387,11 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, break; #endif case CONNMAN_SERVICE_TYPE_ETHERNET: +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + 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: connman_dbus_dict_append_dict(dict, "Ethernet", @@ -5020,6 +5301,18 @@ const char *__connman_service_get_passphrase(struct connman_service *service) return service->passphrase; } +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET +int __connman_service_get_use_eapol(struct connman_service *service) +{ + if (!service) { + DBG("Service is NULL"); + return -1; + } + + return service->use_eapol; +} +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ + static DBusMessage *get_properties(DBusConnection *conn, DBusMessage *msg, void *user_data) { @@ -5725,6 +6018,14 @@ 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, "EapOverEthernet")) { + int err = connman_service_set_eapol_property(service, &value); + if (err < 0) + return __connman_error_failed(msg, -err); + + service_save(service); +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ } else return __connman_error_invalid_property(msg); @@ -7067,6 +7368,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); @@ -7142,6 +7448,9 @@ static void service_initialize(struct connman_service *service) service->user_pdn_connection_refcount = 0; __sync_synchronize(); #endif +#if defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET + service->use_eapol = false; +#endif /* defined TIZEN_EXT && defined TIZEN_EXT_EAP_ON_ETHERNET */ } /** @@ -7856,6 +8165,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); |