Add wifi_aware_peer_get_mac
authorCheoleun Moon <chleun.moon@samsung.com>
Thu, 5 Mar 2020 10:37:08 +0000 (19:37 +0900)
committerCheoleun Moon <chleun.moon@samsung.com>
Thu, 5 Mar 2020 10:37:08 +0000 (19:37 +0900)
include/wifi-aware.h
src/include/wifi-aware-peer.h
src/wifi-aware-peer.c
src/wifi-aware-private.c
src/wifi-aware.c
test/wifi-aware-test.c

index 0717038..326bcb1 100644 (file)
@@ -585,6 +585,14 @@ int wifi_aware_set_message_received_cb(wifi_aware_session_h session,
  */
 int wifi_aware_unset_message_received_cb(wifi_aware_session_h session);
 
+/**
+ * @brief Get the MAC address (NAN Management Interface) of Wi-Fi Aware peer.
+ * @remarks @a mac should be freed using free().
+ * @since_tizen 6.0
+ * @param[in] peer
+ * @param[out] mac
+ */
+int wifi_aware_peer_get_mac(wifi_aware_peer_h peer, unsigned char **mac);
 
 typedef enum {
        WIFI_AWARE_SECURITY_TYPE_OPEN,
index bbe035e..23a7fb3 100644 (file)
 extern "C" {
 #endif
 
+#define WIFI_AWARE_MAC_ADDRESS_LEN 6
 int _wifi_aware_peer_create(wifi_aware_peer_h *peer, unsigned int peer_id);
 void _wifi_aware_peer_destroy(wifi_aware_peer_h peer);
 int _wifi_aware_peer_add(GHashTable *peer_map, wifi_aware_peer_h peer);
 int _wifi_aware_peer_remove(GHashTable *peer_map, wifi_aware_peer_h peer);
 wifi_aware_peer_h _wifi_aware_get_peer(GHashTable *peer_map, unsigned int peer_id);
 unsigned int _wifi_aware_peer_get_id(wifi_aware_peer_h peer);
+int _wifi_aware_peer_get_mac(wifi_aware_peer_h peer, unsigned char **mac);
+void _wifi_aware_peer_set_mac(wifi_aware_peer_h  peer, unsigned char *mac);
 
 #ifdef __cplusplus
 }
index 8feb9d1..19a7819 100644 (file)
@@ -25,6 +25,7 @@
 
 typedef struct {
        unsigned int id;
+       unsigned char mac[WIFI_AWARE_MAC_ADDRESS_LEN];
 } wifi_aware_peer_s;
 
 int _wifi_aware_peer_create(wifi_aware_peer_h *peer, unsigned int peer_id)
@@ -87,3 +88,18 @@ unsigned int _wifi_aware_peer_get_id(wifi_aware_peer_h peer)
        wifi_aware_peer_s *handle = (wifi_aware_peer_s *)peer;
        return handle->id;
 }
+
+int _wifi_aware_peer_get_mac(wifi_aware_peer_h peer, unsigned char **mac)
+{
+       *mac = (unsigned char *)g_try_malloc0(sizeof(unsigned char *) * WIFI_AWARE_MAC_ADDRESS_LEN);
+       RET_VAL_IF(mac == NULL, WIFI_AWARE_ERROR_OUT_OF_MEMORY, "g_try_malloc0 failed");
+       wifi_aware_peer_s *handle = (wifi_aware_peer_s *)peer;
+       memcpy(*mac, handle->mac, WIFI_AWARE_MAC_ADDRESS_LEN);
+       return WIFI_AWARE_ERROR_NONE;
+}
+
+void _wifi_aware_peer_set_mac(wifi_aware_peer_h  peer, unsigned char *mac)
+{
+       wifi_aware_peer_s *handle = (wifi_aware_peer_s *)peer;
+       memcpy(handle->mac, mac, WIFI_AWARE_MAC_ADDRESS_LEN);
+}
index e2a2121..e6ccd5f 100644 (file)
@@ -830,29 +830,60 @@ int _wifi_aware_session_cancel(wifi_aware_session_h session)
        return WIFI_AWARE_ERROR_INVALID_OPERATION;
 }
 
+static void __unpack_byte_array(unsigned char *array, GVariant *var, uint16_t len)
+{
+    GVariantIter *iter = NULL;
+    int length = 0;
+
+    if (array == NULL || var == NULL || len == 0) {
+        WIFI_AWARE_LOGI("Invalid parameter");
+        return;
+    }
+
+    g_variant_get(var, "ay", &iter);
+    if (iter == NULL) {
+        WIFI_AWARE_LOGE("Fail to get iterator");
+        return;
+    }
+
+    while (g_variant_iter_loop(iter, "y", &array[length])) {
+        ++length;
+        if (length >= len)
+            break;
+    }
+    g_variant_iter_free(iter);
+}
+
 static void __parsing_service_discovered_event(GVariant *parameters,
-               uint16_t *sub_id, unsigned int *peer_id,
+               uint16_t *sub_id, unsigned int *peer_id, unsigned char *peer_mac,
                unsigned char *specific_info, size_t *specific_info_len)
 {
-       gchar *info_value = NULL;
+       GVariant *mac_var = NULL;
+       GVariant *info_var = NULL;
 
-       g_variant_get(parameters, "(qusq)", sub_id, peer_id,
-                       &info_value, specific_info_len);
+       g_variant_get(parameters, "(quvqv)", sub_id, peer_id, &mac_var,
+                       specific_info_len, &info_var);
 
-       memcpy(specific_info, info_value, *specific_info_len);
-       g_free(info_value);
+       __unpack_byte_array(peer_mac, mac_var, WIFI_AWARE_MAC_ADDRESS_LEN);
+       __unpack_byte_array(specific_info, info_var, *specific_info_len);
+       g_variant_unref(mac_var);
+       g_variant_unref(info_var);
 }
 
 static void __parsing_message_received_event(GVariant *parameters, unsigned int *peer_id,
+               unsigned char *peer_mac,
                unsigned char *message, size_t *message_len)
 {
-       gchar *value = NULL;
+       GVariant *mac_var = NULL;
+       GVariant *msg_var = NULL;
 
-       g_variant_get(parameters, "(usq)", peer_id,
-                       &value, message_len);
+       g_variant_get(parameters, "(uvqv)", peer_id, &mac_var,
+                       message_len, &msg_var);
 
-       memcpy(message, value, *message_len);
-       g_free(value);
+       __unpack_byte_array(peer_mac, mac_var, WIFI_AWARE_MAC_ADDRESS_LEN);
+       __unpack_byte_array(message, msg_var, *message_len);
+       g_variant_unref(mac_var);
+       g_variant_unref(msg_var);
 }
 
 static int __get_peer_handle(unsigned int peer_id, wifi_aware_peer_h *peer)
@@ -884,6 +915,7 @@ static void __service_discovered_cb(GDBusConnection *connection,
 
        uint16_t sub_id = 0;
        unsigned int peer_id = 0;
+       unsigned char peer_mac[WIFI_AWARE_MAC_ADDRESS_LEN];
        unsigned char specific_info[WIFI_AWARE_MAX_SERVICE_SPECIFIC_INFO_LEN];
        size_t specific_info_len = 0;
 
@@ -893,7 +925,7 @@ static void __service_discovered_cb(GDBusConnection *connection,
        RET_IF(!_wifi_aware_session_is_subscribe_type(session), "This session is not for Subscribe");
 
        __parsing_service_discovered_event(parameters,
-                       &sub_id, &peer_id,
+                       &sub_id, &peer_id, peer_mac,
                        specific_info, &specific_info_len);
 
        uint16_t session_pub_sub_id = _wifi_aware_session_get_pub_sub_id(session);
@@ -908,6 +940,7 @@ static void __service_discovered_cb(GDBusConnection *connection,
                return;
        }
 
+       _wifi_aware_peer_set_mac(peer, peer_mac);
        __wifi_aware_discovered_cb(session, peer, specific_info, specific_info_len);
 }
 
@@ -920,13 +953,14 @@ static void __message_received_cb(GDBusConnection *connection,
        WIFI_AWARE_LOGD("NAN Service is discovered");
 
        unsigned int peer_id = 0;
+       unsigned char peer_mac[WIFI_AWARE_MAC_ADDRESS_LEN];
        unsigned char message[WIFI_AWARE_MAX_SERVICE_SPECIFIC_INFO_LEN];
        size_t message_len = 0;
 
        wifi_aware_session_h session = (wifi_aware_session_h)user_data;
        wifi_aware_peer_h peer = NULL;
 
-       __parsing_message_received_event(parameters, &peer_id,
+       __parsing_message_received_event(parameters, &peer_id, peer_mac,
                        message, &message_len);
 
        WIFI_AWARE_LOGD("Peer ID: %u", peer_id);
@@ -935,6 +969,7 @@ static void __message_received_cb(GDBusConnection *connection,
                return;
        }
 
+       _wifi_aware_peer_set_mac(peer, peer_mac);
        __wifi_aware_received_cb(session, peer, message, message_len);
 }
 
index c574272..10cc57d 100644 (file)
@@ -31,6 +31,7 @@
 #include "wifi-aware-data-path.h"
 #include "wifi-aware-gdbus.h"
 #include "wifi-aware-log.h"
+#include "wifi-aware-peer.h"
 #include "wifi-aware-private.h"
 #include "wifi-aware-utils.h"
 
@@ -562,6 +563,17 @@ API int wifi_aware_unset_message_received_cb(wifi_aware_session_h session)
        return WIFI_AWARE_ERROR_NONE;
 }
 
+API int wifi_aware_peer_get_mac(wifi_aware_peer_h peer, unsigned char **mac)
+{
+       __WIFI_AWARE_FUNC_ENTER__;
+       CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
+       RET_VAL_IF(peer == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "Peer is NULL");
+       RET_VAL_IF(mac == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "mac is NULL");
+
+       return _wifi_aware_peer_get_mac(peer, mac);
+}
+
 API int wifi_aware_data_path_create(wifi_aware_session_h session, wifi_aware_peer_h peer,
                wifi_aware_data_path_h *data_path)
 {
index 3eb7aff..fe288eb 100644 (file)
@@ -568,10 +568,20 @@ static void __add_new_peer(wifi_aware_peer_h peer)
        g_peer_list = g_slist_append(g_peer_list, info);
 }
 
+static void __print_mac(unsigned char mac[6])
+{
+       printf(MACSTR, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+}
+
 static void __print_peer_info(gpointer data, gpointer user_data)
 {
        peer_info *info = (peer_info *)data;
-       printf("%02d %p\n", info->peer_id, info->peer);
+       unsigned char *mac = NULL;
+       wifi_aware_peer_get_mac(info->peer, &mac);
+       printf("%02d %p ", info->peer_id, info->peer);
+       __print_mac(mac);
+       free(mac);
+       printf("\n");
 }
 
 static void __display_peer_list()