Modified logic to process each VSIE of all vendors. 83/167983/1
authorNiraj Kumar Goit <niraj.g@samsung.com>
Thu, 4 Jan 2018 09:18:49 +0000 (14:48 +0530)
committerSeonah Moon <seonah1.moon@samsung.com>
Tue, 23 Jan 2018 07:59:24 +0000 (16:59 +0900)
Modified logic to process each VSIE of all vendors instead of
only samsung vendor(OUI: 001632). Received VSIE will be appended
in the list and shared with application.

Change-Id: Ifbb0159f40a8949a6f117416e5d436d5c2299b49

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

index 8860626..46d065b 100755 (executable)
@@ -382,8 +382,7 @@ const char *g_supplicant_network_get_eap(GSupplicantNetwork *network);
 const char *g_supplicant_network_get_identity(GSupplicantNetwork *network);
 const char *g_supplicant_network_get_phase2(GSupplicantNetwork *network);
 unsigned int g_supplicant_network_get_keymgmt(GSupplicantNetwork *network);
-const void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network,
-                                               unsigned int *wifi_vsie_len);
+void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network);
 #endif
 
 struct _GSupplicantCallbacks {
index 28c95ea..724520e 100644 (file)
@@ -221,8 +221,7 @@ struct g_supplicant_bss {
 #if defined TIZEN_EXT
        dbus_bool_t ft_psk;
        dbus_bool_t ft_ieee8021x;
-       char *wifi_vsie;
-       unsigned int wifi_vsie_len;
+       GSList *vsie_list;
        dbus_bool_t hs20;
 #endif
        unsigned int wps_capabilities;
@@ -250,8 +249,7 @@ struct _GSupplicantNetwork {
        char *identity;
        char *phase2;
        unsigned int keymgmt;
-       char *wifi_vsie;
-       unsigned int wifi_vsie_len;
+       GSList *vsie_list;
 #endif
 };
 
@@ -808,7 +806,7 @@ static void remove_network(gpointer data)
        g_free(network->phase2);
 #endif
 #if defined TIZEN_EXT
-       g_free(network->wifi_vsie);
+       g_slist_free_full(network->vsie_list, g_free);
 #endif
 
        g_free(network);
@@ -820,7 +818,7 @@ static void remove_bss(gpointer data)
 
        g_free(bss->path);
 #if defined TIZEN_EXT
-       g_free(bss->wifi_vsie);
+       g_slist_free_full(bss->vsie_list, g_free);
 #endif
        g_free(bss);
 }
@@ -1558,16 +1556,29 @@ bool g_supplicant_network_get_rsn_mode(GSupplicantNetwork *network)
                return false;
 }
 
-const void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network,
-                                               unsigned int *wifi_vsie_len)
+void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network)
 {
-       if (!network) {
-               *wifi_vsie_len = 0;
+       GSList *vsie_list = NULL;
+
+       if (!network)
                return NULL;
+
+       if (g_slist_length(network->vsie_list) > 0) {
+               GSList *list = NULL;
+               unsigned char *vsie = NULL;
+               for (list = network->vsie_list; list; list = list->next) {
+                       unsigned char *ie = (unsigned char *)list->data;
+                       vsie = (unsigned char *)g_try_malloc0(ie[1]+2); // tag number size(1), tag length size(1)
+
+                       if (vsie) {
+                               memcpy(vsie, ie, ie[1]+2);
+                               vsie_list = g_slist_append(vsie_list, vsie);
+                       } else
+                               SUPPLICANT_DBG("Failed to allocate memory");
+               }
        }
 
-       *wifi_vsie_len = network->wifi_vsie_len;
-       return network->wifi_vsie;
+       return vsie_list;
 }
 #endif
 
@@ -1849,14 +1860,18 @@ static int add_or_replace_bss_to_network(struct g_supplicant_bss *bss)
 #if defined TIZEN_EXT
        network->keymgmt = bss->keymgmt;
 
-       if (bss->wifi_vsie_len > 0) {
-               SUPPLICANT_DBG("vsie len: %d", bss->wifi_vsie_len);
-               network->wifi_vsie = (char *)g_try_malloc0(bss->wifi_vsie_len);
-               if(network->wifi_vsie) {
-                       network->wifi_vsie_len = bss->wifi_vsie_len;
-                       memcpy(network->wifi_vsie, bss->wifi_vsie, network->wifi_vsie_len);
-               } else {
-                       SUPPLICANT_DBG("Failed to allocate memory for wifi_vsie");
+       if (g_slist_length(bss->vsie_list) > 0) {
+               GSList *list = NULL;
+               unsigned char *vsie = NULL;
+               for (list = bss->vsie_list; list; list = list->next) {
+                       unsigned char *ie = (unsigned char *)list->data;
+                       vsie = (unsigned char *)g_try_malloc0(ie[1]+2); // tag number size(1), tag length size(1)
+
+                       if (vsie) {
+                               memcpy(vsie, ie, ie[1]+2);
+                               network->vsie_list = g_slist_append(network->vsie_list, vsie);
+                       } else
+                               SUPPLICANT_DBG("Failed to allocate memory.");
                }
        }
 
@@ -2047,9 +2062,6 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data)
 {
        struct g_supplicant_bss *bss = user_data;
        const unsigned char WPS_OUI[] = { 0x00, 0x50, 0xf2, 0x04 };
-#if defined TIZEN_EXT
-       const unsigned char WIFI_OUI[] = {0x00, 0x16, 0x32};
-#endif
        unsigned char *ie, *ie_end;
        DBusMessageIter array;
        unsigned int value;
@@ -2081,16 +2093,20 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data)
        for (ie_end = ie + ie_len; ie < ie_end && ie + ie[1] + 1 <= ie_end;
                                                        ie += ie[1] + 2) {
 #if defined TIZEN_EXT
-               if((ie[0] == VENDOR_SPECIFIC_INFO) && (memcmp(ie+2, WIFI_OUI, sizeof(WIFI_OUI)) == 0)) {
-                               SUPPLICANT_DBG("IE: match WIFI_OUI");
-                               bss->wifi_vsie = (char *)g_try_malloc0(ie[1] + 2);   // tag number size(1), tag length size(1)
-                               if (bss->wifi_vsie) {
-                                       bss->wifi_vsie_len = ie[1] + 2;
-                                       memcpy(bss->wifi_vsie, ie, bss->wifi_vsie_len);
-                               } else {
-                                       SUPPLICANT_DBG("Failed to allocate memory for wifi_vsie");
-                               }
-                               continue;
+               unsigned char *vsie;
+               int vsie_len = 0;
+               if(ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, WPS_OUI, sizeof(WPS_OUI)) != 0) {
+                       SUPPLICANT_DBG("IE: match vendor specific data");
+
+                       vsie_len = ie[1]+2;     // tag number size(1), tag length size(1)
+                       vsie = (unsigned char *)g_try_malloc0(vsie_len);
+
+                       if (vsie) {
+                               memcpy(vsie, ie, vsie_len);
+                               bss->vsie_list = g_slist_append(bss->vsie_list, vsie);
+                       } else
+                               SUPPLICANT_DBG("Failed to allocate memory");
+                       continue;
                }
 #endif
                if (ie[0] != WMM_WPA1_WPS_INFO || ie[1] < WPS_INFO_MIN_LEN ||
index 4be5fbf..baf1c01 100755 (executable)
@@ -183,6 +183,10 @@ int connman_network_set_blob(struct connman_network *network,
                        const char *key, const void *data, unsigned int size);
 const void *connman_network_get_blob(struct connman_network *network,
                                        const char *key, unsigned int *size);
+#if defined TIZEN_EXT
+void connman_network_set_vsie_list(struct connman_network *network, GSList *vsie_list);
+void *connman_network_get_vsie_list(struct connman_network *network);
+#endif
 
 struct connman_device *connman_network_get_device(struct connman_network *network);
 
index 8bc6307..c66f838 100755 (executable)
@@ -3335,8 +3335,7 @@ static void network_added(GSupplicantNetwork *supplicant_network)
        bool wps_advertizing;
 
 #if defined TIZEN_EXT
-       const char *wifi_vsie;
-       unsigned int wifi_vsie_len;
+       GSList *vsie_list = NULL;
 #endif
 
        mode = g_supplicant_network_get_mode(supplicant_network);
@@ -3363,9 +3362,6 @@ static void network_added(GSupplicantNetwork *supplicant_network)
 
        ssid = g_supplicant_network_get_ssid(supplicant_network, &ssid_len);
 
-#if defined TIZEN_EXT
-       wifi_vsie = g_supplicant_network_get_wifi_vsie(supplicant_network, &wifi_vsie_len);
-#endif
        network = connman_device_get_network(wifi->device, identifier);
 
        if (!network) {
@@ -3390,9 +3386,11 @@ static void network_added(GSupplicantNetwork *supplicant_network)
        connman_network_set_blob(network, "WiFi.SSID",
                                                ssid, ssid_len);
 #if defined TIZEN_EXT
-       if(wifi_vsie_len > 0 && wifi_vsie)
-               connman_network_set_blob(network, "WiFi.Vsie",
-                                                       wifi_vsie, wifi_vsie_len);
+       vsie_list = (GSList *)g_supplicant_network_get_wifi_vsie(supplicant_network);
+       if (vsie_list)
+               connman_network_set_vsie_list(network, vsie_list);
+       else
+               DBG("vsie_list is NULL");
 #endif
        connman_network_set_string(network, "WiFi.Security", security);
        connman_network_set_strength(network,
index d38fc0a..cf74b6d 100755 (executable)
@@ -114,8 +114,7 @@ struct connman_network {
                bool rsn_mode;
                int disconnect_reason;
                int assoc_status_code;
-               void *wifi_vsie;
-               unsigned int wifi_vsie_len;
+               GSList *vsie_list;
 #endif
        } wifi;
 
@@ -980,7 +979,7 @@ static void network_destruct(struct connman_network *network)
        g_free(network->wifi.phase2_auth);
        g_free(network->wifi.pin_wps);
 #if defined TIZEN_EXT
-       g_free(network->wifi.wifi_vsie);
+       g_slist_free_full(network->wifi.vsie_list, g_free);
 #endif
        g_free(network->path);
        g_free(network->group);
@@ -2388,6 +2387,31 @@ bool connman_network_get_bool(struct connman_network *network,
        return false;
 }
 
+#if defined TIZEN_EXT
+/**
+ * connman_network_set_vsie_list:
+ * @network: network structure
+ * @vsie_list: GSList pointer
+ *
+ * Set vendor specific list pointer
+ */
+void connman_network_set_vsie_list(struct connman_network *network, GSList *vsie_list)
+{
+       network->wifi.vsie_list = vsie_list;
+}
+
+/**
+ * connman_network_get_vsie_list:
+ * @network: network structure
+ *
+ * Get vendor specific list pointer
+ */
+void *connman_network_get_vsie_list(struct connman_network *network)
+{
+       return network->wifi.vsie_list;
+}
+#endif
+
 /**
  * connman_network_set_blob:
  * @network: network structure
@@ -2408,16 +2432,6 @@ int connman_network_set_blob(struct connman_network *network,
                        network->wifi.ssid_len = size;
                } else
                        network->wifi.ssid_len = 0;
-#if defined TIZEN_EXT
-       } else if (g_str_equal(key, "WiFi.Vsie")){
-               g_free(network->wifi.wifi_vsie);
-               network->wifi.wifi_vsie = g_try_malloc(size);
-               if (network->wifi.wifi_vsie) {
-                       memcpy(network->wifi.wifi_vsie, data, size);
-                       network->wifi.wifi_vsie_len = size;
-               } else
-                       network->wifi.wifi_vsie_len = 0;
-#endif
        } else {
                return -EINVAL;
        }
@@ -2442,15 +2456,6 @@ const void *connman_network_get_blob(struct connman_network *network,
                return network->wifi.ssid;
        }
 
-#if defined TIZEN_EXT
-       if (g_str_equal(key, "WiFi.Vsie")) {
-               if (size)
-                       *size = network->wifi.wifi_vsie_len;
-
-               return network->wifi.wifi_vsie;
-       }
-#endif
-
        return NULL;
 }
 
index d0543ae..ba4acc1 100755 (executable)
@@ -3305,14 +3305,25 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
                connman_dbus_dict_append_basic(dict, "Frequency",
                                DBUS_TYPE_UINT16, &frequency);
        }
-       const void *wifi_vsie;
+
+       unsigned char *wifi_vsie;
        unsigned int wifi_vsie_len;
-       wifi_vsie = connman_network_get_blob(service->network, "WiFi.Vsie", &wifi_vsie_len);
-       if(wifi_vsie_len > 0) {
-               DBG("ConnMan, service->path=%s vsie length=%d", service->path, wifi_vsie_len);
+       GSList *vsie_list = NULL;
+
+       if (service->network)
+               vsie_list = (GSList *)connman_network_get_vsie_list(service->network);
+
+       if (vsie_list) {
+               DBG("ConnMan, service->path=%s No.of elements in list: %d", service->path, g_slist_length(vsie_list));
+               GSList *list;
+               for (list = vsie_list; list; list = list->next) {
+                       wifi_vsie = (unsigned char *)list->data;
+                       wifi_vsie_len = wifi_vsie[1] + 2;
+
+                       connman_dbus_dict_append_fixed_array(dict, "Vsie", DBUS_TYPE_BYTE,
+                                       &wifi_vsie, wifi_vsie_len);
+               }
        }
-       connman_dbus_dict_append_fixed_array(dict, "Vsie", DBUS_TYPE_BYTE,
-                       &wifi_vsie, wifi_vsie_len);
 #endif
 
        str = __connman_service_type2string(service->type);