Add GetPeerVsie method 22/170122/1 accepted/tizen/unified/20180302.061522 submit/tizen/20180228.035728
authorNishant Chaprana <n.chaprana@samsung.com>
Tue, 13 Feb 2018 11:19:05 +0000 (16:49 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Tue, 13 Feb 2018 11:19:05 +0000 (16:49 +0530)
Change-Id: Ia0173c4affa1d1efdfa7ea93fce193f9a6432296
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
include/wifi-direct-ipc.h
include/wifi-direct-manager.h
include/wifi-direct-method.h
oem/wifi-direct-oem.h
packaging/wifi-direct-manager.spec
plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c
src/wifi-direct-dbus.c
src/wifi-direct-event.c
src/wifi-direct-iface.c
src/wifi-direct-manager.c
src/wifi-direct-method.c

index 28e710c..29ade36 100644 (file)
@@ -217,6 +217,7 @@ typedef struct {
        unsigned int wps_device_pwd_id;
        unsigned int wps_cfg_methods;
        gboolean is_wfd_device;
+       char *vsie;
 } wfd_discovery_entry_s;
 
 
index e28ad62..0189805 100644 (file)
@@ -135,6 +135,7 @@ typedef struct {
        unsigned char client_ip_addr[IPADDR_LEN];
        unsigned char go_ip_addr[IPADDR_LEN];
        int rssi;
+       char *vsie;
 } wfd_device_s;
 
 typedef struct {
index 6e4cefc..54e74de 100644 (file)
@@ -49,6 +49,7 @@ void get_connecting_peer_handler(GVariant *parameters, void *dest);
 void is_discoverable_handler(GVariant *parameters, void *dest);
 void is_listening_only_handler(GVariant *parameters, void *dest);
 void get_peer_info_handler(GVariant *parameters, void *dest);
+void get_peer_vsie_handler(GVariant *parameters, void *dest);
 void get_state_handler(GVariant *parameters, void *dest);
 void create_group_handler(GVariant *parameters, void *dest);
 void destroy_group_handler(GVariant *parameters, void *dest);
index b4506fb..1c2b995 100644 (file)
@@ -66,6 +66,7 @@ extern "C" {
 #define OEM_QUERY_ID_LEN 15
 #define OEM_SERVICE_MAX_LEN 1024
 #define OEM_CONFIG_METHOD_LEN 256
+#define OEM_VSIE_MAX_LEN 1024
 
 /* Referring to Wi-Fi Peer-to-Peer Services Technical Specification v1.1
  * The default P2Ps PIN is 12345670. Any device decided to be GO will use
@@ -248,6 +249,7 @@ typedef struct {
        int wps_mode;
        wfd_oem_display_s display;
        int rssi;
+       char *vsie;
 } wfd_oem_device_s;
 
 typedef struct {
@@ -266,6 +268,7 @@ typedef struct {
        int has_asp_services;
        int has_asp2_services;
        int rssi;
+       char *vsie;
 } wfd_oem_dev_data_s;
 
 typedef struct {
index 5dcd711..d49a226 100644 (file)
@@ -6,7 +6,7 @@
 
 Name:          wifi-direct-manager
 Summary:       Wi-Fi Direct manger
-Version:       1.2.266
+Version:       1.2.267
 Release:       1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
index 438ece0..2cee0a2 100644 (file)
@@ -438,7 +438,6 @@ static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
 {
        GVariantIter *iter = NULL;
        int length = 0;
-       int res = 1;
 
        if (!dst || !src || size == 0) {
                WDP_LOGE("Invalid parameter");
@@ -457,12 +456,7 @@ static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
        }
        g_variant_iter_free(iter);
 
-       if (length < size) {
-               WDP_LOGE("array is shorter than size");
-               res = -1;
-       }
-
-       return res;
+       return length;
 }
 
 static int __ws_byte_to_txt(const unsigned char *src, char **dst, int src_len)
@@ -773,6 +767,17 @@ static void __ws_get_peer_property(const char *key, GVariant *value, void *user_
 
                if (!ISZEROMACADDR(peer->go_dev_addr))
                        peer->dev_role = WFD_OEM_DEV_ROLE_GC;
+
+       } else if (g_strcmp0(key, "VSIE") == 0) {
+               int vsie_len;
+               unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
+
+               vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
+               if (vsie_len > 0) {
+                       __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
+                       WDP_LOGD("VSIE [%s]", peer->vsie);
+               }
+
        } else {
                WDP_LOGD("Unknown value");
        }
@@ -870,17 +875,29 @@ static void __ws_peer_property(const char *key, GVariant *value, void *user_data
 
                if (!ISZEROMACADDR(go_dev_addr))
                        peer->dev_role = WFD_OEM_DEV_ROLE_GC;
+
        } else if (g_strcmp0(key, "AdvertiseService") == 0) {
                if (value != NULL && g_variant_get_size(value) != 0)
                        peer->has_asp_services = 1;
                else
                        peer->has_asp_services = 0;
+
        } else if (g_strcmp0(key, "AdvertiseASPService") == 0) {
                if (value != NULL && g_variant_get_size(value) != 0)
                        peer->has_asp2_services = 1;
                else
                        peer->has_asp2_services = 0;
 
+       } else if (g_strcmp0(key, "VSIE") == 0) {
+               int vsie_len;
+               unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
+
+               vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
+               if (vsie_len > 0) {
+                       __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
+                       WDP_LOGD("VSIE [%s]", peer->vsie);
+               }
+
        } else {
                WDP_LOGD("Unknown value");
        }
@@ -4682,10 +4699,10 @@ int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
                                __ws_get_peer_property, ws_dev);
 
        if (res < 0) {
-                       WDP_LOGE("Failed to send command to wpa_supplicant");
-                       g_free(ws_dev);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               g_free(ws_dev);
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
        } else {
                WDP_LOGD("succeeded to get peer info");
                *peer = ws_dev;
index 0883d81..278137d 100644 (file)
@@ -99,6 +99,11 @@ const gchar wfd_manager_introspection_xml[] = {
                                "<arg type='i' name='error_code' direction='out'/>"
                                "<arg type='a{sv}' name='peer_details' direction='out'/>"
                        "</method>"
+                       "<method name='GetPeerVsie'>"
+                               "<arg type='s' name='peer_mac_addr' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='s' name='vsie' direction='out'/>"
+                       "</method>"
                        "<method name='GetState'>"
                                "<arg type='i' name='error_code' direction='out'/>"
                                "<arg type='i' name='state' direction='out'/>"
index d01dd77..9248b61 100644 (file)
@@ -104,6 +104,15 @@ static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *da
        if (manager->is_wifi_display_supported)
                memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
 
+       if (data->vsie) {
+               if (peer->vsie)
+                       free(peer->vsie);
+               peer->vsie = g_strdup(data->vsie);
+               free(data->vsie);
+               data->vsie = NULL;
+       }
+       WDS_LOGD("Peer name: [%s], vsie: [%s]", peer->dev_name, peer->vsie);
+
 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
        wfd_util_get_current_time(&peer->time);
 #else
index cbd1bed..591ea90 100644 (file)
@@ -81,6 +81,7 @@ static wfd_manager_iface_method_handler wfd_manager_iface_manage[] = {
                {"IsDiscoverable", is_discoverable_handler},
                {"IsListeningOnly", is_listening_only_handler},
                {"GetPeerInfo", get_peer_info_handler},
+               {"GetPeerVsie", get_peer_vsie_handler},
                {"GetState", get_state_handler},
                {NULL, NULL},
 };
index 572d0ee..b71e288 100644 (file)
@@ -1268,7 +1268,14 @@ int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_d
        peer_dev->time = time;
        peer_dev->channel = oem_dev->channel;
 
-       free(oem_dev);
+       if (oem_dev->vsie) {
+               if (peer_dev->vsie)
+                       g_free(peer_dev->vsie);
+               peer_dev->vsie = g_strdup(oem_dev->vsie);
+               g_free(oem_dev->vsie);
+       }
+
+       g_free(oem_dev);
 
        peer_info = (wfd_discovery_entry_s*) g_try_malloc0(sizeof(wfd_discovery_entry_s));
        if (!(peer_info)) {
@@ -1294,6 +1301,9 @@ int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_d
                if (peer_dev->display.availability && peer_dev->display.port)
                        peer_info->is_wfd_device = 1;
 
+       if (peer_dev->vsie)
+               peer_info->vsie = g_strdup(peer_dev->vsie);
+
        *peer = peer_info;
 //LCOV_EXCL_STOP
        __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
index 01ed328..4498312 100644 (file)
@@ -785,9 +785,14 @@ void get_peer_info_handler(GVariant *parameters, void *dest)
                                wfd_manager_dbus_pack_ay(connected_peer->ip_addr, IPADDR_LEN));
        }
 
+       g_variant_builder_add(builder_peer, "{sv}",
+                       "Vsie",
+                       g_variant_new_string(peer->vsie));
+
        ret = WIFI_DIRECT_ERROR_NONE;
        return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
        g_variant_builder_unref(builder_peer);
+       g_free(peer->vsie);
        g_free(peer);
        wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
 
@@ -796,6 +801,36 @@ void get_peer_info_handler(GVariant *parameters, void *dest)
        return;
 }
 
+void get_peer_vsie_handler(GVariant *parameters, void *dest)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       wfd_manager_s *manager = wfd_get_manager();
+       GVariant *return_parameters = NULL;
+       wfd_device_s *peer = NULL;
+       const char *mac_address = NULL;
+       unsigned char mac_addr[MACADDR_LEN] = {0, };
+       int ret;
+
+       WIFI_DIRECT_METHOD_RET_IF_NULL(manager);
+
+       g_variant_get(parameters, "(&s)", &mac_address);
+       macaddr_atoe(mac_address, mac_addr);
+
+       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_NOT_PERMITTED, dest);
+
+       peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+       if (!peer)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_INVALID_PARAMETER, dest);
+
+       ret = WIFI_DIRECT_ERROR_NONE;
+       return_parameters = g_variant_new("(is)", ret, peer->vsie ? peer->vsie : "");
+       wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
 void get_state_handler(GVariant *parameters, void *dest)
 {
        __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE