[connman]Added support of EAP-FAST,EAP-PWD and EAP-AKA'. 51/170251/3 accepted/tizen/unified/20180227.062953 submit/tizen/20180226.110934
authorNiraj Kumar Goit <niraj.g@samsung.com>
Thu, 15 Feb 2018 11:19:26 +0000 (16:49 +0530)
committertaesub kim <taesub.kim@samsung.com>
Mon, 26 Feb 2018 08:44:08 +0000 (17:44 +0900)
Change-Id: Ibb75ff2c2e54c8d3d53f3b184502647918bf7e24
igned-off-by: Niraj Kumar Goit <niraj.g@samsung.com>

gsupplicant/gsupplicant.h
gsupplicant/supplicant.c
plugins/wifi.c
src/network.c
src/service.c

index 0476ff6..ead619c 100755 (executable)
@@ -108,6 +108,15 @@ typedef enum {
 #endif
 } GSupplicantSecurity;
 
+#if defined TIZEN_EXT
+typedef enum {
+       G_SUPPLICANT_EAP_KEYMGMT_NONE,
+       G_SUPPLICANT_EAP_KEYMGMT_FT,
+       G_SUPPLICANT_EAP_KEYMGMT_CCKM,
+       G_SUPPLICANT_EAP_KEYMGMT_OKC,
+} GSupplicantEapKeymgmt;
+#endif
+
 typedef enum {
        G_SUPPLICANT_STATE_UNKNOWN,
        G_SUPPLICANT_STATE_DISABLED,
@@ -175,6 +184,9 @@ struct _GSupplicantSSID {
        unsigned char *bssid;
        unsigned int bssid_for_connect_len;
        unsigned char bssid_for_connect[6];
+       GSupplicantEapKeymgmt eap_keymgmt;
+       const char *phase1;
+       const char *pac_file;
 #endif
 };
 
index 9b7a934..92efbc9 100644 (file)
@@ -5131,6 +5131,33 @@ static void add_network_security_aka_sim(DBusMessageIter *dict,
                        DBUS_TYPE_STRING,
                        &ssid->passphrase);
 }
+
+static void add_network_security_fast(DBusMessageIter *dict,
+               GSupplicantSSID *ssid)
+{
+       /*
+        * For FAST, we at least need:
+        *              id / password
+        *              phase1 (provisiong information)
+        *              pac_file
+        */
+
+       /* Allow provisioing both authenticated and unauthenticated */
+       const char *phase1 = "fast_provisioning=2";
+       supplicant_dbus_dict_append_basic(dict, "phase1",
+                       DBUS_TYPE_STRING,
+                       &phase1);
+
+       SUPPLICANT_DBG("pac_file [%s]", ssid->pac_file);
+       if(ssid->pac_file)
+               supplicant_dbus_dict_append_basic(dict, "pac_file",
+                               DBUS_TYPE_STRING,
+                               &ssid->pac_file);
+
+       supplicant_dbus_dict_append_basic(dict, "password",
+                       DBUS_TYPE_STRING,
+                       &ssid->passphrase);
+}
 #endif
 
 static void add_network_security_eap(DBusMessageIter *dict,
@@ -5157,8 +5184,20 @@ static void add_network_security_eap(DBusMessageIter *dict,
 
 #if defined TIZEN_EXT
        } else if (g_strcmp0(ssid->eap, "sim") == 0 ||
-                       g_strcmp0(ssid->eap, "aka") == 0) {
+                       g_strcmp0(ssid->eap, "aka") == 0 ||
+                       g_strcmp0(ssid->eap, "aka'") == 0) {
                add_network_security_aka_sim(dict, ssid);
+       } else if (g_strcmp0(ssid->eap, "pwd") == 0) {
+               if(!ssid->passphrase)
+                       return;
+               supplicant_dbus_dict_append_basic(dict, "password",
+                               DBUS_TYPE_STRING,
+                               &ssid->passphrase);
+       } else if (g_strcmp0(ssid->eap, "fast") == 0){
+               if (!ssid->identity || !ssid->passphrase)
+                       return;
+
+               add_network_security_fast(dict, ssid);
 #endif
        } else
                return;
@@ -5738,7 +5777,7 @@ int g_supplicant_interface_connect(GSupplicantInterface *interface,
                        network_remove(intf_data);
                } else
 #if defined TIZEN_EXT
-                       if (ssid->passphrase && g_strcmp0(ssid->passphrase, "") != 0) {
+                       if (ssid->passphrase && g_strcmp0(ssid->passphrase, "") != 0 && !ssid->eap) {
                                ret = send_decryption_request(ssid->passphrase, data);
                                if (ret < 0)
                                        SUPPLICANT_DBG("Decryption request failed %d", ret);
index 3d7636c..ebbd6b8 100755 (executable)
 #define ASSOC_STATUS_NO_CLIENT 17
 #define LOAD_SHAPING_MAX_RETRIES 3
 
+#if defined TIZEN_EXT
+#define WIFI_EAP_FAST_PAC_FILE         "/var/lib/wifi/wifi.pac"        /* path of Pac file for EAP-FAST */
+#endif
+
 static struct connman_technology *wifi_technology = NULL;
 static struct connman_technology *p2p_technology = NULL;
 
@@ -2442,6 +2446,21 @@ static GSupplicantSecurity network_security(const char *security)
        return G_SUPPLICANT_SECURITY_UNKNOWN;
 }
 
+#if defined TIZEN_EXT
+static GSupplicantEapKeymgmt network_eap_keymgmt(const char *security)
+{
+       if (security == NULL)
+               return G_SUPPLICANT_EAP_KEYMGMT_NONE;
+
+       if (g_str_equal(security, "FT") == TRUE)
+               return G_SUPPLICANT_EAP_KEYMGMT_FT;
+       else if (g_str_equal(security, "CCKM") == TRUE)
+               return G_SUPPLICANT_EAP_KEYMGMT_CCKM;
+
+       return G_SUPPLICANT_EAP_KEYMGMT_NONE;
+}
+#endif
+
 static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
 {
        const char *security;
@@ -2500,8 +2519,14 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
 
 #if defined TIZEN_EXT
        ssid->bssid = connman_network_get_bssid(network);
-#endif
-#if defined TIZEN_EXT
+
+       ssid->eap_keymgmt = network_eap_keymgmt(
+                       connman_network_get_string(network, "WiFi.KeymgmtType"));
+       ssid->phase1 = connman_network_get_string(network, "WiFi.Phase1");
+
+       if(g_strcmp0(ssid->eap, "fast") == 0)
+               ssid->pac_file = g_strdup(WIFI_EAP_FAST_PAC_FILE);
+
        if (set_connman_bssid(CHECK_BSSID, NULL) == 6) {
                ssid->bssid_for_connect_len = 6;
                set_connman_bssid(GET_BSSID, (char *)ssid->bssid_for_connect);
index cf74b6d..0e3d4b3 100755 (executable)
@@ -115,6 +115,10 @@ struct connman_network {
                int disconnect_reason;
                int assoc_status_code;
                GSList *vsie_list;
+               /*
+               * Only for EAP-FAST
+               */
+               char *phase1;
 #endif
        } wifi;
 
index 9510def..c3bdc0e 100755 (executable)
@@ -167,6 +167,10 @@ struct connman_service {
        char *keymgmt_type;
        int disconnect_reason;
        int assoc_status_code;
+       /*
+        * Only for EAP-FAST
+        */
+       char *phase1;
 #endif
 #ifdef TIZEN_EXT
        enum connman_dnsconfig_method dns_config_method_ipv4;
@@ -7945,6 +7949,17 @@ static void prepare_8021x(struct connman_service *service)
        if (service->phase2)
                connman_network_set_string(service->network, "WiFi.Phase2",
                                                        service->phase2);
+
+#if defined TIZEN_EXT
+       if (service->keymgmt_type)
+               connman_network_set_string(service->network, "WiFi.KeymgmtType",
+                                                       service->keymgmt_type);
+
+       DBG("service->phase1 : %s", service->phase1);
+       if (service->phase1)
+               connman_network_set_string(service->network, "WiFi.Phase1",
+                                                       service->phase1);
+#endif
 }
 
 static int service_connect(struct connman_service *service)
@@ -8032,7 +8047,10 @@ static int service_connect(struct connman_service *service)
                        DBG("service eap: %s", service->eap);
                        if (g_str_equal(service->eap, "tls") ||
                                g_str_equal(service->eap, "sim") ||
-                               g_str_equal(service->eap, "aka"))
+                               g_str_equal(service->eap, "aka") ||
+                               g_str_equal(service->eap, "aka'") ||
+                               g_str_equal(service->eap, "pwd") ||
+                               g_str_equal(service->eap, "fast"))
                                break;
 #else
                        /*