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];
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);
} 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];
-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
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
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:
{
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";
#include <stdio.h>
#include <stdlib.h>
#include <poll.h>
+#include <time.h>
+#include <unistd.h>
#include <errno.h>
#include <glib.h>
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;
}
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) {
}
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);
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++;
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);
}
#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"
#include <stdlib.h>
#include <dlfcn.h>
#include <sys/utsname.h>
+#include <time.h>
#include <errno.h>
#include <glib.h>
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;
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;
}
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__;
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__;
__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)
_session_timer(session, 0);
peer = session->peer;
- if (session->state != SESSION_STATE_COMPLETED) {
- wifi_direct_client_noti_s noti;
- memset(¬i, 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, ¬i);
- }
+ if (session->state == SESSION_STATE_COMPLETED)
+ peer->state = WFD_PEER_STATE_CONNECTED;
+ else
+ peer->state = WFD_PEER_STATE_DISCOVERED;
free(session);
manager->session = NULL;