Added support for EAPoL connection. 70/230970/9 accepted/tizen/unified/20200507.052338 submit/tizen/20200504.135236 submit/tizen/20200504.152605 submit/tizen/20200506.120225
authorNiraj Kumar Goit <niraj.g@samsung.com>
Thu, 16 Apr 2020 08:26:06 +0000 (13:56 +0530)
committerNiraj Kumar Goit <niraj.g@samsung.com>
Sun, 3 May 2020 18:26:11 +0000 (23:56 +0530)
Change-Id: I2f864bae88c0c6f95c0128d5c4c285dfc62f2541
Signed-off-by: Niraj Kumar Goit <niraj.g@samsung.com>
include/common/network-cm-intf.h
include/internal/network-dbus-request.h
include/internal/network-internal.h
include/profile/network-pm-config.h
src/network-cm-intf.c
src/network-dbus-request.c
src/network-profile-intf.c

index ad0f786..b4d209d 100755 (executable)
@@ -833,6 +833,31 @@ int net_get_ethernet_cable_state(void *handle, int *state);
 int net_get_metered_state(void *handle, int *state);
 
 /**
+ * \brief      This API is only for Connection CAPI. Don't use this.
+ *
+ * \param[in] enable           Enable EAP over Ethernet network.
+ * \param[in] pofilename       Profile name of ethernet.
+ *
+ ******************************************************************************************/
+int net_ethernet_eap_enable(gboolean enable, const char *profilename);
+
+/**
+ * \brief      This API is only for Connection CAPI. Don't use this.
+ *
+ * \param[out] supported       Indicating whether the EAP over Ethernet is supported.
+ *
+ ******************************************************************************************/
+int net_ethernet_eap_supported(gboolean *supported);
+
+/**
+ * \brief      This API is only for Connection CAPI. Don't use this.
+ *
+ * \param[in] net_info Ethernet device information.
+ *
+ ******************************************************************************************/
+int net_save_ethernet_eap_config(void *handle, net_dev_info_t *net_info);
+
+/**
  * \}
  */
 
index 570af23..6e2bf65 100755 (executable)
@@ -57,11 +57,14 @@ extern "C" {
 #define CONNMAN_CONFIG_FIELD_SSID                              "SSID"
 #define CONNMAN_CONFIG_FIELD_EAP_METHOD                        "EAP"
 #define CONNMAN_CONFIG_FIELD_IDENTITY                  "Identity"
+#define CONNMAN_CONFIG_FIELD_ANONYMOUS_IDENTITY                "AnonymousIdentity"
 #define CONNMAN_CONFIG_FIELD_PASSPHRASE                        "Passphrase"
 #define CONNMAN_CONFIG_FIELD_PHASE2                            "Phase2"
+#define CONNMAN_CONFIG_FIELD_PHASE1                            "Phase1"
 #define CONNMAN_CONFIG_FIELD_CA_CERT_FILE              "CACertFile"
 #define CONNMAN_CONFIG_FIELD_CLIENT_CERT_FILE  "ClientCertFile"
 #define CONNMAN_CONFIG_FIELD_PVT_KEY_FILE              "PrivateKeyFile"
+#define CONNMAN_CONFIG_FIELD_PAC_FILE                  "PacFile"
 #define CONNMAN_CONFIG_FIELD_PVT_KEY_PASSPHRASE        "PrivateKeyPassphrase"
 #define CONNMAN_CONFIG_FIELD_EAP_KEYMGMT_TYPE  "KeymgmtType"
 
@@ -137,6 +140,11 @@ int _net_dbus_mptcp_set_path_manager(network_info_t *network_info, const char *p
 int _net_dbus_mptcp_get_path_manager(network_info_t *network_info, char **pm);
 int _net_dbus_mptcp_set_scheduler(network_info_t *network_info, const char *scheduler);
 int _net_dbus_mptcp_get_scheduler(network_info_t *network_info, char **scheduler);
+
+int _net_dbus_ethernet_eap_enable(gboolean enable, const char *profilename);
+int _net_dbus_ethernet_eap_supported(gboolean *supported);
+int _net_dbus_save_ethernet_eap_connection(network_info_t *network_info,
+               net_dev_info_t *net_info);
 #ifdef __cplusplus
 }
 #endif
index d3f3aec..b84ff12 100755 (executable)
@@ -67,11 +67,13 @@ extern "C" {
 #define NETCONFIG_WIFI_INTERFACE               NETCONFIG_SERVICE ".wifi"
 #define NETCONFIG_STATISTICS_INTERFACE NETCONFIG_SERVICE ".network_statistics"
 #define NETCONFIG_MPTCP_INTERFACE              NETCONFIG_SERVICE ".mptcp"
+#define NETCONFIG_ETHERNET_INTERFACE           NETCONFIG_SERVICE ".ethernet"
 
 #define NETCONFIG_NETWORK_PATH                 "/net/netconfig/network"
 #define NETCONFIG_WIFI_PATH                            "/net/netconfig/wifi"
 #define NETCONFIG_STATISTICS_PATH              "/net/netconfig/network_statistics"
 #define NETCONFIG_MPTCP_PATH                   "/net/netconfig/mptcp"
+#define NETCONFIG_ETHERNET_PATH                        "/net/netconfig/ethernet"
 
 #define NETCONFIG_TV_PROFILE_INTERFACE NETCONFIG_SERVICE ".tv_profile"
 
index d8540b6..130d7bd 100755 (executable)
@@ -90,6 +90,50 @@ extern "C"
 
 /** Maximum length of IPv6 Prefix */
 #define        NETPM_IPV6_MAX_PREFIX_LEN 128
+
+/**
+ * These lengths depends on authentication server being used,
+ * In case of freeradius server Max allowed length for username/password is 255
+ * Let us restrict this value to some optimal value say 50.
+ */
+#define NET_USERNAME_LEN                                       50
+
+/**
+ * These lengths depends on authentication server being used,
+ * In case of freeradius server Max allowed length for username/password is 255
+ * Let us restrict this value to some optimal value say 150.
+ */
+#define NET_PASSWORD_LEN                       150
+
+/**
+ * length of CA Cert file name
+ * Used by EAP-TLS, EAP-TTLS and EAP-PEAP
+ */
+#define NET_CA_CERT_FILENAME_LEN               128
+
+/**
+ * length of Client Cert file name
+ * only used by EAP-TLS
+ */
+#define NET_CLIENT_CERT_FILENAME_LEN           128
+
+/**
+ * length of private key file name
+ * only used by EAP-TLS
+ */
+#define NET_PRIVATE_KEY_FILENAME_LEN           128
+
+/**
+ * length of PAC file name
+ * only used by EAP-FAST
+ */
+#define NET_PAC_FILENAME_LEN                   128
+
+/**
+ * length of Private key password
+ * only used by EAP-TLS
+ */
+#define NET_PRIVATE_KEY_PASSWD_LEN             50
 /*==================================================================================================
                                              ENUMS
 ==================================================================================================*/
@@ -262,6 +306,40 @@ typedef enum
        NET_DNS_CONFIG_TYPE_DYNAMIC,
 } net_dns_config_type_t;
 
+/**
+ * @enum net_ethernet_eap_type_t
+ * Net Ethernet EAP Type
+ */
+typedef enum {
+       NET_ETHERNET_EAP_TYPE_MD5 = 0,          /**< EAP MD5 type */
+       NET_ETHERNET_EAP_TYPE_PEAP = 1,         /**< EAP PEAP type */
+       NET_ETHERNET_EAP_TYPE_TLS = 2,          /**< EAP TLS type */
+       NET_ETHERNET_EAP_TYPE_TTLS = 3,         /**< EAP TTLS type */
+       NET_ETHERNET_EAP_TYPE_FAST = 4,         /**< EAP FAST type */
+} net_ethernet_eap_type_t;
+
+/**
+ * @enum net_ethernet_eap_auth_type_t
+ * Net Ethernet EAP Auth Type
+ */
+typedef enum {
+       NET_ETHERNET_EAP_AUTH_TYPE_NONE = 0,            /**< EAP phase2 authentication none */
+       NET_ETHERNET_EAP_AUTH_TYPE_PAP = 1,             /**< EAP phase2 authentication PAP */
+       NET_ETHERNET_EAP_AUTH_TYPE_MSCHAP = 2,          /**< EAP phase2 authentication MSCHAP */
+       NET_ETHERNET_EAP_AUTH_TYPE_MSCHAPV2 = 3,        /**< EAP phase2 authentication MSCHAPv2 */
+       NET_ETHERNET_EAP_AUTH_TYPE_GTC = 4,             /**< EAP phase2 authentication GTC */
+       NET_ETHERNET_EAP_AUTH_TYPE_MD5 = 5,             /**< EAP phase2 authentication MD5 */
+} net_ethernet_eap_auth_type_t;
+
+/**
+ * @enum net_ethernet_eap_peap_version_t
+ * Net Ethernet EAP PEAP Version
+ */
+typedef enum {
+       NET_ETHERNET_EAP_PEAP_VERSION_AUTO = 0,         /**< PEAP version Automatic */
+       NET_ETHERNET_EAP_PEAP_VERSION_0 = 1,            /**< PEAP version 0 */
+       NET_ETHERNET_EAP_PEAP_VERSION_1 = 2,            /**< PEAP version 1 */
+} net_ethernet_eap_peap_version_t;
 /*==================================================================================================
                                  STRUCTURES AND OTHER TYPEDEFS
 ==================================================================================================*/
@@ -324,6 +402,35 @@ typedef struct
 } net_auth_info_t;
 
 /**
+ * Below structure is used by EAP over Ethernet
+ */
+typedef struct {
+       char username[NET_USERNAME_LEN+1];                      /** User name */
+       char password[NET_PASSWORD_LEN+1];                      /** Password */
+       char anonymous_identity[NET_USERNAME_LEN+1];    /** AnonymousIdentity */
+
+       /**
+        * Following fields are mandatory for EAP-TLS.
+        * Optional for EAP-PEAP and EAP-TTLS
+        *
+        * For EAP-PEAP and EAP-TTLS only ca_cert_filename[] is required
+        */
+       char ca_cert_filename[NET_CA_CERT_FILENAME_LEN+1];                      /** Used to authenticate server */
+       char client_cert_filename[NET_CLIENT_CERT_FILENAME_LEN+1];              /** client certificate file name */
+       char private_key_filename[NET_PRIVATE_KEY_FILENAME_LEN+1];              /** private key file name */
+       char private_key_passwd[NET_PRIVATE_KEY_PASSWD_LEN+1];          /** private key password */
+
+       /** only for EAP-FAST */
+       char pac_filename[NET_PAC_FILENAME_LEN+1];                      /** PAC file name */
+
+       net_ethernet_eap_type_t eap_type;                                       /** eap type */
+       net_ethernet_eap_auth_type_t eap_auth;                                  /** eap phase2 authentication type */
+
+       /** only for EAP-PEAP */
+       net_ethernet_eap_peap_version_t peap_version;                           /** eap-peap version */
+} net_ethernet_eap_info_t;
+
+/**
  * Device Info in Connect response event
  */
 typedef struct
@@ -399,6 +506,12 @@ typedef struct
 
        /** Privacy of the connection link */
        char            Privacy6[NETPM_IPV6_MAX_PRIVACY_LEN+1];
+
+       /** Whether to use EAP over Ethernet or not */
+       gboolean        use_eapol;
+
+       /** EAP over ethernet info */
+       net_ethernet_eap_info_t eap;
 } net_dev_info_t;
 
 /**
index 310e023..7c4a5e8 100755 (executable)
@@ -795,6 +795,64 @@ EXPORT_API int net_get_metered_state(void *handle, int *state)
        return Error;
 }
 
+EXPORT_API int net_ethernet_eap_enable(gboolean enable, const char *profilename)
+{
+       __NETWORK_FUNC_ENTER__;
+       net_err_t Error = NET_ERR_NONE;
+
+       Error = _net_dbus_ethernet_eap_enable(enable, profilename);
+
+       if (Error != NET_ERR_NONE)
+               NETWORK_LOG(NETWORK_ERROR, "_net_dbus_ethernet_eap_enable failed");
+
+       __NETWORK_FUNC_EXIT__;
+       return Error;
+}
+
+EXPORT_API int net_ethernet_eap_supported(gboolean *supported)
+{
+       __NETWORK_FUNC_ENTER__;
+       net_err_t Error = NET_ERR_NONE;
+
+       Error = _net_dbus_ethernet_eap_supported(supported);
+
+       if (Error != NET_ERR_NONE)
+               NETWORK_LOG(NETWORK_ERROR, "_net_dbus_ethernet_eap_supported failed");
+
+       __NETWORK_FUNC_EXIT__;
+       return Error;
+}
+
+EXPORT_API int net_save_ethernet_eap_config(void *handle, net_dev_info_t *net_info)
+{
+       __NETWORK_FUNC_ENTER__;
+
+       net_err_t Error = NET_ERR_NONE;
+       network_info_t *network_info = (network_info_t *)handle;
+       const char *profile_name = net_info->ProfileName;
+
+       NETWORK_LOG(NETWORK_LOW, "Save eap config for profile: %s", profile_name);
+
+       if (_net_check_profile_name(profile_name) != NET_ERR_NONE) {
+               NETWORK_LOG(NETWORK_ERROR, "Invalid profile name");
+               __NETWORK_FUNC_EXIT__;
+               return NET_ERR_INVALID_PARAM;
+       }
+
+       Error = _net_dbus_save_ethernet_eap_connection(network_info, net_info);
+       if (Error != NET_ERR_NONE) {
+               NETWORK_LOG(NETWORK_ERROR,
+                               "Failed to save ethernet eap config, Error [%s]",
+                               _net_print_error(Error));
+
+               __NETWORK_FUNC_EXIT__;
+               return Error;
+       }
+
+       __NETWORK_FUNC_EXIT__;
+       return NET_ERR_NONE;
+}
+
 /*****************************************************************************
  * ConnMan Mesh Client Interface Async Function Definition
  *****************************************************************************/
@@ -893,6 +951,7 @@ EXPORT_API int net_open_connection_with_profile(void *handle, const char *profil
                        profile_name, NET_PROFILE_NAME_LEN_MAX+1);
 
        Error = _net_dbus_open_connection(network_info, profile_name);
+
        if (Error != NET_ERR_NONE) {
                /* LCOV_EXCL_START */
                NETWORK_LOG(NETWORK_ERROR,
index 66f3119..c043e1f 100755 (executable)
@@ -527,6 +527,156 @@ int _net_dbus_open_connection(network_info_t *network_info, const char* profile_
        return Error;
 }
 
+static char *_net_convert_eap_type_to_string(net_ethernet_eap_type_t eap_type)
+{
+       switch (eap_type) {
+       case NET_ETHERNET_EAP_TYPE_MD5:
+               return "MD5";
+       case NET_ETHERNET_EAP_TYPE_PEAP:
+               return "PEAP";
+       case NET_ETHERNET_EAP_TYPE_TLS:
+               return "TLS";
+       case NET_ETHERNET_EAP_TYPE_TTLS:
+               return "TTLS";
+       case NET_ETHERNET_EAP_TYPE_FAST:
+               return "FAST";
+       default:
+               return NULL;
+       }
+}
+
+static char *_net_convert_eap_auth_type_to_string(net_ethernet_eap_auth_type_t eap_auth_type)
+{
+       switch (eap_auth_type) {
+       case NET_ETHERNET_EAP_AUTH_TYPE_NONE:
+               return "NONE";
+       case NET_ETHERNET_EAP_AUTH_TYPE_PAP:
+               return "PAP";
+       case NET_ETHERNET_EAP_AUTH_TYPE_MSCHAP:
+               return "MSCHAP";
+       case NET_ETHERNET_EAP_AUTH_TYPE_MSCHAPV2:
+               return "MSCHAPV2";
+       case NET_ETHERNET_EAP_AUTH_TYPE_GTC:
+               return "GTC";
+       case NET_ETHERNET_EAP_AUTH_TYPE_MD5:
+               return "MD5";
+       default:
+               return NULL;
+       }
+}
+
+static char *_net_convert_eap_peap_version_to_string(net_ethernet_eap_peap_version_t peap_version)
+{
+       switch (peap_version) {
+       case NET_ETHERNET_EAP_PEAP_VERSION_AUTO:
+               return "VERSION_AUTO";
+       case NET_ETHERNET_EAP_PEAP_VERSION_0:
+               return "VERSION_0";
+       case NET_ETHERNET_EAP_PEAP_VERSION_1:
+               return "VERSION_1";
+       default:
+               return NULL;
+       }
+}
+
+int _net_dbus_save_ethernet_eap_connection(network_info_t *network_info, net_dev_info_t *net_info)
+{
+       __NETWORK_FUNC_ENTER__;
+
+       net_err_t Error = NET_ERR_NONE;
+       GVariant *params = NULL;
+       GVariantBuilder *builder;
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{ss}"));
+       g_variant_builder_add(builder, "{ss}", CONNMAN_CONFIG_FIELD_TYPE, "wired");
+
+       char *eap_type = _net_convert_eap_type_to_string(net_info->eap.eap_type);
+       if (eap_type)
+               g_variant_builder_add(builder, "{ss}",
+                               CONNMAN_CONFIG_FIELD_EAP_METHOD, eap_type);
+
+       switch(net_info->eap.eap_type) {
+       case NET_ETHERNET_EAP_TYPE_MD5:
+               if (net_info->eap.username[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_IDENTITY, net_info->eap.username);
+
+               if (net_info->eap.password[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_PASSPHRASE, net_info->eap.password);
+               break;
+       case NET_ETHERNET_EAP_TYPE_PEAP:
+       case NET_ETHERNET_EAP_TYPE_TTLS:
+       case NET_ETHERNET_EAP_TYPE_FAST:
+               if (net_info->eap.username[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_IDENTITY, net_info->eap.username);
+
+               if (net_info->eap.password[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_PASSPHRASE, net_info->eap.password);
+
+               if (net_info->eap.anonymous_identity[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_ANONYMOUS_IDENTITY, net_info->eap.anonymous_identity);
+
+               if (net_info->eap.eap_type != NET_ETHERNET_EAP_TYPE_FAST && net_info->eap.ca_cert_filename[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_CA_CERT_FILE, net_info->eap.ca_cert_filename);
+
+               char *auth_type = _net_convert_eap_auth_type_to_string(net_info->eap.eap_auth);
+               if (auth_type)
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_PHASE2, auth_type);
+
+               char *peap_version = _net_convert_eap_peap_version_to_string(net_info->eap.peap_version);
+               if (net_info->eap.eap_type == NET_ETHERNET_EAP_TYPE_PEAP && peap_version)
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_PHASE1, peap_version);
+
+               if (net_info->eap.eap_type == NET_ETHERNET_EAP_TYPE_FAST && net_info->eap.pac_filename[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_PAC_FILE, net_info->eap.pac_filename);
+               break;
+       case NET_ETHERNET_EAP_TYPE_TLS:
+               if (net_info->eap.username[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_IDENTITY, net_info->eap.username);
+
+               if (net_info->eap.ca_cert_filename[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_CA_CERT_FILE, net_info->eap.ca_cert_filename);
+
+               if (net_info->eap.client_cert_filename[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_CLIENT_CERT_FILE, net_info->eap.client_cert_filename);
+
+               if (net_info->eap.private_key_filename[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_PVT_KEY_FILE, net_info->eap.private_key_filename);
+
+               if (net_info->eap.private_key_passwd[0] != '\0')
+                       g_variant_builder_add(builder, "{ss}",
+                                       CONNMAN_CONFIG_FIELD_PVT_KEY_PASSPHRASE, net_info->eap.private_key_passwd);
+               break;
+       }
+
+       params = g_variant_new("(o@a{ss})",
+                       net_info->ProfileName, g_variant_builder_end(builder));
+       g_variant_builder_unref(builder);
+
+       /* Create the ethernet EAP config file and set property in connman */
+       Error = _net_invoke_dbus_method_nonblock(network_info,
+                       NETCONFIG_SERVICE, NETCONFIG_ETHERNET_PATH,
+                       NETCONFIG_ETHERNET_INTERFACE, "SetEapConfig", params,
+                       DBUS_REPLY_TIMEOUT,
+                       __net_open_connection_reply,
+                       network_info);
+
+       __NETWORK_FUNC_EXIT__;
+       return Error;
+}
+
 int _net_dbus_close_connection(network_info_t *network_info, const char* profile_name)
 {
        __NETWORK_FUNC_ENTER__;
@@ -1995,3 +2145,50 @@ int _net_dbus_mptcp_get_scheduler(network_info_t *network_info, char **scheduler
        return Error;
 }
 /* LCOV_EXCL_STOP */
+
+int _net_dbus_ethernet_eap_enable(gboolean enable, const char *profilename)
+{
+       __NETWORK_FUNC_ENTER__;
+
+       net_err_t Error = NET_ERR_NONE;
+       GVariant *message = NULL;
+       GVariant *params = NULL;
+       char *method = "EnableEap";
+
+       params = g_variant_new("(sb)", profilename, enable);
+       message = _net_invoke_dbus_method(NULL, NETCONFIG_SERVICE, NETCONFIG_ETHERNET_PATH,
+                       NETCONFIG_ETHERNET_INTERFACE, method, params, &Error);
+
+       if (message == NULL) {
+               NETWORK_LOG(NETWORK_ERROR, "Failed to %s EAPoL.\n", enable ? "enable" : "disable");
+               __NETWORK_FUNC_EXIT__;
+               return Error;
+       }
+
+       g_variant_unref(message);
+
+       __NETWORK_FUNC_EXIT__;
+       return Error;
+}
+
+int _net_dbus_ethernet_eap_supported(gboolean *supported)
+{
+       __NETWORK_FUNC_ENTER__;
+       net_err_t Error = NET_ERR_NONE;
+       GVariant *message = NULL;
+
+       message = _net_invoke_dbus_method(NULL, NETCONFIG_SERVICE, NETCONFIG_ETHERNET_PATH,
+                       NETCONFIG_ETHERNET_INTERFACE, "IsEapSupported", NULL, &Error);
+
+       if (message == NULL) {
+               NETWORK_LOG(NETWORK_ERROR, "Failed to get EAP over Ethernet status");
+               __NETWORK_FUNC_EXIT__;
+               return Error;
+       }
+
+       g_variant_get(message, "(b)", supported);
+       g_variant_unref(message);
+
+       __NETWORK_FUNC_EXIT__;
+       return Error;
+}
index 8d7cbc3..a3a06d4 100755 (executable)
@@ -1268,6 +1268,104 @@ static void __net_extract_proxy_configuration_value(GVariant *variant, net_dev_i
                g_free(servers);
 }
 
+static net_ethernet_eap_type_t __net_convert_eap_type_from_string(const char *eap_type)
+{
+       if (g_strcmp0(eap_type, "MD5") == 0)
+               return NET_ETHERNET_EAP_TYPE_MD5;
+       else if (g_strcmp0(eap_type, "PEAP") == 0)
+               return NET_ETHERNET_EAP_TYPE_PEAP;
+       else if (g_strcmp0(eap_type, "TLS") == 0)
+               return NET_ETHERNET_EAP_TYPE_TLS;
+       else if (g_strcmp0(eap_type, "TTLS") == 0)
+               return NET_ETHERNET_EAP_TYPE_TTLS;
+       else if (g_strcmp0(eap_type, "FAST") == 0)
+               return NET_ETHERNET_EAP_TYPE_FAST;
+       else
+               return -1;
+}
+
+static net_ethernet_eap_auth_type_t __net_convert_eap_auth_from_string(const char *eap_auth)
+{
+       if (g_strcmp0(eap_auth, "PAP") == 0)
+               return NET_ETHERNET_EAP_AUTH_TYPE_PAP;
+       else if (g_strcmp0(eap_auth, "MSCHAP") == 0)
+               return NET_ETHERNET_EAP_AUTH_TYPE_MSCHAP;
+       else if (g_strcmp0(eap_auth, "MSCHAPV2") == 0)
+               return NET_ETHERNET_EAP_AUTH_TYPE_MSCHAPV2;
+       else if (g_strcmp0(eap_auth, "GTC") == 0)
+               return NET_ETHERNET_EAP_AUTH_TYPE_GTC;
+       else if (g_strcmp0(eap_auth, "MD5") == 0)
+               return NET_ETHERNET_EAP_AUTH_TYPE_MD5;
+       else
+               return NET_ETHERNET_EAP_AUTH_TYPE_NONE;
+}
+
+static void __net_extract_eapol_value(GVariant *variant, net_dev_info_t *net_info)
+{
+       const gchar *subKey = NULL;
+       const gchar *value = NULL;
+       GVariant *var = NULL;
+       GVariantIter *iter = NULL;
+
+       g_variant_get(variant, "a{sv}", &iter);
+       while (g_variant_iter_loop(iter, "{sv}", &subKey, &var)) {
+               if (g_strcmp0(subKey, "UseEapol") == 0) {
+                       net_info->use_eapol = g_variant_get_boolean(var);
+
+               } else if (g_strcmp0(subKey, "EAP") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL)
+                               net_info->eap.eap_type = __net_convert_eap_type_from_string(value);
+               } else if (g_strcmp0(subKey, "Identity") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL)
+                               g_strlcpy(net_info->eap.username, value, NET_USERNAME_LEN+1);
+               } else if (g_strcmp0(subKey, "AnonymousIdentity") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL)
+                               g_strlcpy(net_info->eap.anonymous_identity, value, NET_USERNAME_LEN+1);
+               } else if (g_strcmp0(subKey, "CACertFile") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL)
+                               g_strlcpy(net_info->eap.ca_cert_filename, value, NET_CA_CERT_FILENAME_LEN+1);
+               } else if (g_strcmp0(subKey, "ClientCertFile") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL)
+                               g_strlcpy(net_info->eap.client_cert_filename, value, NET_CLIENT_CERT_FILENAME_LEN+1);
+               } else if (g_strcmp0(subKey, "PrivateKeyFile") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL)
+                               g_strlcpy(net_info->eap.private_key_filename, value, NET_PRIVATE_KEY_FILENAME_LEN+1);
+               } else if (g_strcmp0(subKey, "Phase2") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL)
+                               net_info->eap.eap_auth = __net_convert_eap_auth_from_string(value);
+               } else if (g_strcmp0(subKey, "Phase1") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL) {
+                               if (g_strcmp0(value, "1") == 0)
+                                       net_info->eap.peap_version = 1;
+                               else
+                                       net_info->eap.peap_version = 0;
+                       }
+               } else if (g_strcmp0(subKey, "PacFile") == 0) {
+                       value = g_variant_get_string(var, NULL);
+
+                       if (value != NULL)
+                               g_strlcpy(net_info->eap.pac_filename, value, NET_PAC_FILENAME_LEN+1);
+               }
+       }
+       g_variant_iter_free(iter);
+}
+
 static int __net_extract_common_info(const char *key, GVariant *variant, net_profile_info_t *ProfInfo)
 {
        __NETWORK_FUNC_ENTER__;
@@ -1323,6 +1421,8 @@ static int __net_extract_common_info(const char *key, GVariant *variant, net_pro
                __net_extract_proxy_configuration_value(variant, net_info);
        } else if (g_strcmp0(key, "Provider") == 0) {
                /* Do nothing */
+       } else if (g_strcmp0(key, "EapOverEthernet") == 0) {
+               __net_extract_eapol_value(variant, net_info);
        }
 
        __NETWORK_FUNC_EXIT__;