Add update peer by time operation 40/15040/1
authorJiung Yu <jiung.yu@samsung.com>
Wed, 15 Jan 2014 06:19:05 +0000 (15:19 +0900)
committerJiung Yu <jiung.yu@samsung.com>
Wed, 15 Jan 2014 06:19:12 +0000 (15:19 +0900)
Change-Id: Ie3d5e1227ecb2fb3219fe06c6c971a0f66bc6bb4
Signed-off-by: Yu jiung <jiung.yu@samsung.com>
12 files changed:
include/wifi-direct-manager.h
include/wifi-direct-peer.h
oem/wifi-direct-oem.h
packaging/wifi-direct-manager.changes
packaging/wifi-direct-manager.spec
plugin/wpasupplicant/wfd-plugin-wpasupplicant.c
src/wifi-direct-client.c
src/wifi-direct-event.c
src/wifi-direct-group.c
src/wifi-direct-manager.c
src/wifi-direct-peer.c
src/wifi-direct-session.c

index b8d20d4..94ad33d 100644 (file)
@@ -72,7 +72,16 @@ typedef enum {
        WFD_SCAN_MODE_PASSIVE,
 } wfd_scan_mode_e;
 
+typedef enum {
+       WFD_PEER_STATE_DISCOVERED,
+       WFD_PEER_STATE_CONNECTING,
+       WFD_PEER_STATE_CONNECTED,
+} wfd_peer_state_e;
+
 typedef struct {
+       int state;
+       unsigned long time;
+
        char dev_name[DEV_NAME_LEN+1];
        unsigned char dev_addr[MACADDR_LEN];
        unsigned char intf_addr[MACADDR_LEN];
index c25a471..6dfd78d 100644 (file)
 
 wfd_device_s *wfd_add_peer(void *data, unsigned char *dev_addr, char *dev_name);
 int wfd_remove_peer(void *data, unsigned char *dev_addr);
+int wfd_update_peer(void *data, wfd_device_s *peer);
+int wfd_update_peer_time(void*data, unsigned char *peer_addr);
 int wfd_peer_clear_all(void *data);
 wfd_device_s *wfd_peer_find_by_dev_addr(void *data, unsigned char *dev_addr);
 wfd_device_s *wfd_peer_find_by_intf_addr(void *data, unsigned char *intf_addr);
+wfd_device_s *wfd_peer_find_by_addr(void *data, unsigned char *addr);
 wfd_device_s *wfd_peer_find_current_peer(void *data);
 int wfd_peer_set_data(unsigned char *dev_addr, int type, int data);
 int wfd_peer_get_data(unsigned char *dev_addr, int type, int data);
index 39cf753..4017224 100644 (file)
@@ -78,6 +78,7 @@ typedef enum {
 } wfd_oem_event_e;
 
 typedef struct {
+       int age;
        char dev_name[OEM_DEV_NAME_LEN+1];
        unsigned char dev_addr[OEM_MACADDR_LEN];
        unsigned char intf_addr[OEM_MACADDR_LEN];
index 7824bd7..defb14d 100644 (file)
@@ -1,4 +1,7 @@
-Mon, 14 Oct 2013 Jiung Yu <jiung.yu@samaung.com> (1.0.1)
+Tue, 15 Jan 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.2)
+  * Add update peer by time operation
+
+Tue, 15 Jan 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.1)
   * Add interface name #define.
   * Add new scan mode SCAN_MODE_NONE.
   * Add channel information to peer
index 40a989a..5421fbd 100644 (file)
@@ -1,6 +1,6 @@
 Name:       wifi-direct-manager
 Summary:    Wi-Fi Direct manger
-Version:    1.0.1
+Version:    1.0.2
 Release:    1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
index 9e44c1c..4baca2f 100644 (file)
@@ -856,6 +856,7 @@ static int _parsing_peer_info(char *msg, wfd_oem_device_s *peer)
        for (i = 0; i < info_cnt; i++) {
                switch (infos[i].index){
                case WS_PEER_INFO_AGE:
+                       peer->age = (int) strtoul(infos[i].string, NULL, 10);
                        break;
                case WS_PEER_INFO_LISTEN_FREQ:
                        {
index 7ab07c5..2a4098d 100644 (file)
@@ -99,8 +99,6 @@ char *wfd_server_print_cmd(wifi_direct_cmd_e cmd)
                return "WIFI_DIRECT_CMD_GET_CONFIG";
        case WIFI_DIRECT_CMD_SET_CONFIG:
                return "WIFI_DIRECT_CMD_SET_CONFIG";
-       case WIFI_DIRECT_CMD_SEND_PROVISION_DISCOVERY_REQ:
-               return "WIFI_DIRECT_CMD_SEND_PROVISION_DISCOVERY_REQ";
        case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
                return "WIFI_DIRECT_CMD_SEND_CONNECT_REQ";
 
index e6891a9..46c65fa 100644 (file)
@@ -28,6 +28,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <poll.h>
+#include <time.h>
+#include <unistd.h>
 #include <errno.h>
 
 #include <glib.h>
@@ -202,6 +204,12 @@ static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *da
        peer->group_flags = data->group_flags;
        peer->dev_role = data->dev_role;
 
+       struct timeval tval;
+       gettimeofday(&tval, NULL);
+       peer->time = tval.tv_sec;
+
+       WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
+
        __WDS_LOG_FUNC_EXIT__;
        return 0;
 }
@@ -257,7 +265,10 @@ int wfd_process_event(void *user_data, void *data)
                                WDS_LOGE("Failed to add peer for invitation");
                                return -1;
                        }
+                       peer->state = WFD_PEER_STATE_CONNECTING;
+                       wfd_update_peer(manager, peer);
                }
+               wfd_update_peer_time(manager, event->dev_addr);
 
                res = wfd_session_process_event(manager, event);
                if (res < 0) {
@@ -317,6 +328,7 @@ int wfd_process_event(void *user_data, void *data)
                }
                peer->dev_role = WFD_DEV_ROLE_GO;
                memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
+               wfd_update_peer_time(manager, event->dev_addr);
 
                session = wfd_create_session(manager, event->dev_addr,
                                                manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
@@ -376,7 +388,7 @@ int wfd_process_event(void *user_data, void *data)
                        return -1;
                }
                memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
-
+               peer->state = WFD_PEER_STATE_CONNECTED
                group->members = g_list_prepend(group->members, peer);
                group->member_count++;
 
@@ -440,6 +452,7 @@ int wfd_process_event(void *user_data, void *data)
                        wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
                        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
                } else {
+                       wfd_destroy_group(manager, GROUP_IFNAME);
                        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
                        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
                }
index ee16084..0b9217c 100644 (file)
@@ -34,6 +34,7 @@
 #include <wifi-direct-internal.h>
 
 #include "wifi-direct-manager.h"
+#include "wifi-direct-peer.h"
 #include "wifi-direct-oem.h"
 #include "wifi-direct-group.h"
 #include "wifi-direct-util.h"
index 2b2ddfd..c869fc0 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <dlfcn.h>
 #include <sys/utsname.h>
+#include <time.h>
 #include <errno.h>
 
 #include <glib.h>
@@ -669,6 +670,12 @@ int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_
                return -1;
        }
 
+       unsigned long time = 0;
+       struct timeval tval;
+       gettimeofday(&tval, NULL);
+       time = tval.tv_sec;
+       WDS_LOGI("Current time [%ld]", time);
+
        peer_count = manager->peer_count;
        if (peer_count < 0)
                return -1;
@@ -685,24 +692,41 @@ int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_
        temp = g_list_first(manager->peers);
        while (temp && count < peer_count) {
                peer = temp->data;
-               {
-                       strncpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN);
-                       peers[count].device_name[DEV_NAME_LEN] = '\0';
-                       memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
-                       memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
-                       peers[count].channel = 1;
-                       peers[count].services = 0;
-                       peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
-                       peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
-                       peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
-                       peers[count].wps_device_pwd_id = 0;
-                       peers[count].wps_cfg_methods = peer->config_methods;
-                       peers[count].category = peer->pri_dev_type;
-                       peers[count].subcategory = peer->sec_dev_type;
-                       peers[count].is_wfd_device = 0;
-                       count++;
-                       WDS_LOGD("%dth peer [%d]", count, peer->dev_name);
+               if (!peer)
+                       goto next;
+               if (peer->time + 4 < time) {
+                       WDS_LOGD("Device data is too old to report to application [%s]", peer->dev_name);
+                       res = wfd_update_peer(manager, peer);
+                       if (res < 0) {
+                               WDS_LOGE("This device is disappeared [%s]", peer->dev_name);
+                               temp = g_list_next(temp);
+                               manager->peers = g_list_remove(manager->peers, peer);
+                               manager->peer_count--;
+                               if (peer->display)
+                                       free(peer->display);
+                               free(peer);
+                               peer = NULL;
+                               continue;
+                       }
                }
+
+               strncpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN);
+               peers[count].device_name[DEV_NAME_LEN] = '\0';
+               memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
+               memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
+               peers[count].channel = peer->channel;
+               peers[count].services = 0;
+               peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
+               peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
+               peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
+               peers[count].wps_device_pwd_id = 0;
+               peers[count].wps_cfg_methods = peer->config_methods;
+               peers[count].category = peer->pri_dev_type;
+               peers[count].subcategory = peer->sec_dev_type;
+
+               count++;
+               WDS_LOGD("%dth peer [%s]", count, peer->dev_name);
+next:
                temp = g_list_next(temp);
                peer = NULL;
        }
index c842703..ec36eb3 100644 (file)
@@ -97,6 +97,73 @@ int wfd_remove_peer(void *data, unsigned char *dev_addr)
        return 0;
 }
 
+int wfd_update_peer_time(void*data, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_device_s *peer = NULL;
+
+       if (!manager || !peer_addr) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
+       if (!peer) {
+               WDS_SECLOG("Peer not found [" MACSTR "]", MAC2STR(peer_addr));
+               return -1;
+       }
+
+       struct timeval tval;
+       gettimeofday(&tval, NULL);
+       peer->time = tval.tv_sec;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_update_peer(void *data, wfd_device_s *peer)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_oem_device_s *oem_dev = NULL;
+       int res = 0;
+
+       if (!peer) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       res = wfd_oem_get_peer_info(manager->oem_ops, peer->dev_addr, &oem_dev);
+       if (res < 0) {
+               WDS_LOGE("Failed to get peer information");
+               return -1;
+       }
+
+       if (oem_dev->age > 4 && peer->state == WFD_PEER_STATE_DISCOVERED) {
+               WDS_LOGE("Too old age to update peer");
+               return -1;
+       }
+       strncpy(peer->dev_name, oem_dev->dev_name, DEV_NAME_LEN);
+       peer->dev_name[DEV_NAME_LEN] = '\0';
+       memcpy(peer->intf_addr, oem_dev->intf_addr, MACADDR_LEN);
+       memcpy(peer->go_dev_addr, oem_dev->go_dev_addr, MACADDR_LEN);
+       peer->dev_role = oem_dev->dev_role;
+       peer->config_methods = oem_dev->config_methods;
+       peer->pri_dev_type = oem_dev->pri_dev_type;
+       peer->sec_dev_type = oem_dev->sec_dev_type;
+       peer->dev_flags = oem_dev->dev_flags;
+       peer->group_flags = oem_dev->group_flags;
+       peer->wps_mode =  oem_dev->wps_mode;
+
+       struct timeval tval;
+       gettimeofday(&tval, NULL);
+       peer->time = tval.tv_sec;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
 int wfd_peer_clear_all(void *data)
 {
        __WDS_LOG_FUNC_ENTER__;
@@ -193,6 +260,39 @@ wfd_device_s *wfd_peer_find_by_intf_addr(void *data, unsigned char *intf_addr)
        return peer;
 }
 
+wfd_device_s *wfd_peer_find_by_addr(void *data, unsigned char *addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_device_s *peer = NULL;
+       GList *temp = NULL;
+
+       if (!data || !addr) {
+               WDS_LOGE("Invalid parameter");
+               return NULL;
+       }
+
+       if (manager->peer_count == 0) {
+               WDS_LOGE("There is no peer data");
+               return NULL;
+       }
+
+       temp = g_list_first(manager->peers);
+       while (temp) {
+               peer = temp->data;
+               if (!memcmp(peer->dev_addr, addr, MACADDR_LEN) ||
+                               !memcmp(peer->intf_addr, addr, MACADDR_LEN)) {
+                       WDS_SECLOG("Peer device found[" MACSTR "]", MAC2STR(addr));
+                       break;
+               }
+               temp = g_list_next(temp);
+               peer = NULL;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return peer;
+}
+
 wfd_device_s *wfd_peer_find_current_peer(void *data)
 {
        __WDS_LOG_FUNC_ENTER__;
index e939e3f..9424053 100644 (file)
@@ -129,6 +129,8 @@ wfd_session_s *wfd_create_session(void *data, unsigned char *peer_addr, int wps_
                __WDS_LOG_FUNC_EXIT__;
                return NULL;
        }
+       peer->state = WFD_PEER_STATE_CONNECTING;
+
        session->peer = peer;
        session->req_wps_mode = wps_mode;
        if (wps_mode == WFD_WPS_MODE_DISPLAY)
@@ -169,14 +171,10 @@ int wfd_destroy_session(void *data)
        _session_timer(session, 0);
        peer = session->peer;
        
-       if (session->state != SESSION_STATE_COMPLETED) {
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-               noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
-               snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-               wfd_event_notify_clients(manager, &noti);
-       }
+       if (session->state == SESSION_STATE_COMPLETED)
+               peer->state = WFD_PEER_STATE_CONNECTED;
+       else
+               peer->state = WFD_PEER_STATE_DISCOVERED;
 
        free(session);
        manager->session = NULL;