#define __WIFI_DIRECT_SESSION_H__
typedef enum {
+ SESSION_TYPE_NORMAL,
+ SESSION_TYPE_INVITE,
+ SESSION_TYPE_JOIN,
+ SESSION_TYPE_MULTI,
+} session_type_e;
+
+typedef enum {
SESSION_STATE_CREATED,
SESSION_STATE_STARTED,
SESSION_STATE_GO_NEG,
} session_direction_e;
typedef struct {
+ int type;
int state;
int timer;
int connecting_120;
int direction;
- int invitation;
wfd_device_s *peer;
int wps_mode;
int req_wps_mode;
int wfd_destroy_session(void *data);
int wfd_session_start(wfd_session_s *session);
int wfd_session_connect(wfd_session_s *session);
-int wfd_session_reject(wfd_session_s *session);
+int wfd_session_cancel(wfd_session_s *session, unsigned char *peer_addr);
+int wfd_session_reject(wfd_session_s *session, unsigned char *peer_addr);
int wfd_session_wps(wfd_session_s *session);
int wfd_session_invite(wfd_session_s *session);
int wfd_session_join(wfd_session_s *session);
int wfd_session_get_state(wfd_session_s *session);
int wfd_session_stop(wfd_session_s *session);
int wfd_session_complete(wfd_session_s *session);
+int wfd_session_timer(wfd_session_s *session, int start);
int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event);
return ops->enrollee_start(peer_addr, wps_mode, pin);
}
+int wfd_oem_wps_cancel(wfd_oem_ops_s *ops)
+{
+ if (!ops) {
+ WDS_LOGE("Invalid parameter");
+ return -1;
+ }
+
+ return ops->wps_cancel();
+}
+
int wfd_oem_get_dev_name(wfd_oem_ops_s *ops, char *dev_name)
{
if (!ops || !ops->get_dev_name) {
int (*get_connected_peers) (GList **peers, int *peer_count);
int (*wps_start) (unsigned char *peer_addr, int wps_mode, const char *pin);
int (*enrollee_start) (unsigned char *peer_addr, int wps_mode, const char *pin);
+ int (*wps_cancel) (void);
int (*get_pin) (char *pin);
int (*set_pin) (char *pin);
// int (*generate_pin) (char *pin);
int wfd_oem_get_connected_peers(wfd_oem_ops_s *ops, GList **peers, int *peer_count);
int wfd_oem_wps_start(wfd_oem_ops_s *ops, unsigned char *peer_addr, int wps_mode, const char *pin);
int wfd_oem_enrollee_start(wfd_oem_ops_s *ops, unsigned char *peer_addr, int wps_mode, const char *pin);
+int wfd_oem_wps_cancel(wfd_oem_ops_s *ops);
int wfd_oem_get_pin(wfd_oem_ops_s *ops, char *pin);
int wfd_oem_set_pin(wfd_oem_ops_s *ops, char *pin);
//int wfd_oem_generate_pin(wfd_oem_ops_s *ops, char *pin);
+Tue, 15 Jan 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.3)
+ * Add wps_cancel operation
+ * Add session type and session management related operation
+
Tue, 15 Jan 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.2)
* Add update peer by time operation
Name: wifi-direct-manager
Summary: Wi-Fi Direct manger
-Version: 1.0.2
+Version: 1.0.3
Release: 1
Group: Network & Connectivity/Wireless
License: Apache-2.0
.invite = ws_invite,
.wps_start = ws_wps_start,
.enrollee_start = ws_enrollee_start,
+ .wps_cancel = ws_wps_cancel,
.get_dev_name = ws_get_dev_name,
.set_dev_name = ws_set_dev_name,
return 0;
}
+int ws_wps_cancel()
+{
+ __WDP_LOG_FUNC_ENTER__;
+ ws_sock_data_s *sock = g_pd->common;
+ char reply[1024]={0,};
+ int res;
+
+ if (!sock) {
+ WDP_LOGE("Socket is NULL");
+ return -1;
+ }
+
+ res = _ws_send_cmd(sock->ctrl_sock, WS_CMD_WPS_CANCEL, reply, sizeof(reply));
+ if (res < 0) {
+ WDP_LOGE("Failed to send command to wpa_supplicant");
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+ }
+
+ if (strstr(reply, "FAIL")) {
+ WDP_LOGE("Failed to cancel WPS");
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+ }
+ WDP_LOGD("Succeeded to cancel WPS");
+
+ __WDP_LOG_FUNC_EXIT__;
+ return 0;
+}
+
int ws_get_dev_name(char *dev_name)
{
__WDP_LOG_FUNC_ENTER__;
#define WS_CMD_WPS_PBC "WPS_PBC "
#define WS_CMD_WPS_PIN "WPS_PIN "
#define WS_CMD_WPS_ENROLLEE "WPS_ENROLLEE "
+#define WS_CMD_WPS_CANCEL "WPS_CANCEL"
#define WS_CMD_SET "SET "
#define WS_CMD_GET "GET "
#define WS_CMD_STATUS "STATUS"
int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param);
int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin);
int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin);
+int ws_wps_cancel();
int ws_get_dev_name(char *dev_name);
int ws_set_dev_name(char *dev_name);
int ws_get_dev_mac(char *dev_mac);
break;
case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
{
- wfd_session_s *session = manager->session;
- if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
- WDS_LOGE("It's not permitted with this state [%d]", manager->state);
+ if (!manager->session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+ WDS_LOGE("It's not CONNECTING state");
rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
break;
}
WDS_LOGE("Failed to create session");
return -1;
}
- session->invitation = 1;
+ session->type = SESSION_TYPE_INVITE;
+ wfd_session_timer(session, 1);
+
+ wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
wifi_direct_client_noti_s noti;
memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
case WFD_OEM_EVENT_CONNECTED:
case WFD_OEM_EVENT_STA_CONNECTED:
{
- // Move this code to plugin
- unsigned char intf_addr[MACADDR_LEN] = {0, };
- wfd_local_get_intf_mac(intf_addr);
- if (!memcmp(event->intf_addr, intf_addr, MACADDR_LEN)) {
+ // FIXME: Move this code to plugin
+ if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
WDS_LOGD("Ignore this event");
break;
}
return -1;
}
memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
- peer->state = WFD_PEER_STATE_CONNECTED
+ session->state = SESSION_STATE_COMPLETED;
+ peer->state = WFD_PEER_STATE_CONNECTED;
group->members = g_list_prepend(group->members, peer);
group->member_count++;
/* After connection failed, scan again */
wfd_oem_scan_param_s param;
memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
- param.scan_mode = WFD_SCAN_MODE_ACTIVE;
+ param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
param.scan_time = 2;
param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
wfd_oem_start_scan(manager->oem_ops, ¶m);
memcpy(group->go_dev_addr, go_dev_addr, MACADDR_LEN);
group->pending = 0;
- peer = wfd_group_find_peer_by_dev_addr(group, go_dev_addr);
- wfd_util_dhcpc_start(peer);
+ peer = wfd_session_get_peer(manager->session);
+ if (!peer && !(group->flags & WFD_GROUP_FLAG_AUTONOMOUS)) {
+ WDS_LOGE("Failed to find peer by device address[" MACSTR "]", go_dev_addr);
+ return -1;
+ }
+ if (group->role == WFD_DEV_ROLE_GO) {
+ wfd_util_dhcps_start();
+ WDS_LOGD("Role is Group Owner. DHCP Server started");
+ } else {
+ wfd_util_dhcpc_start(peer);
+ }
__WDS_LOG_FUNC_EXIT__;
return 0;
}
session = (wfd_session_s*) manager->session;
- if (session && !session->invitation) {
+ if (session && session->type != SESSION_TYPE_INVITE) {
WDS_LOGE("Session already exist or not an invitaion session");
return WIFI_DIRECT_ERROR_NOT_PERMITTED;
}
}
}
- if (manager->local->dev_role == WFD_DEV_ROLE_GO && !session->invitation) {
- session->invitation = 1;
+ if (manager->local->dev_role == WFD_DEV_ROLE_GO && session->type != SESSION_TYPE_INVITE) {
+ session->type = SESSION_TYPE_INVITE;
res = wfd_session_invite(session);
} else {
/* joining to group or starting connection with PD */
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;
peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
if (!peer) {
- WDS_SECLOG("Peer not found [" MACSTR "]", MAC2STR(peer_addr));
+ WDS_LOGE("Peer not found [" MACSTR "]", MAC2STR(peer_addr));
return -1;
}
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));
+ WDS_LOGE("Peer device found[" MACSTR "]", MAC2STR(addr));
break;
}
temp = g_list_next(temp);
__WDS_LOG_FUNC_ENTER__;
wfd_manager_s *manager = wfd_get_manager();
wfd_session_s *session = (wfd_session_s*) manager->session;
+ wifi_direct_client_noti_s noti;
+ unsigned char *peer_addr = NULL;
if (!session) {
WDS_LOGE("Invalid parameter");
return FALSE;
}
-
session->connecting_120 = 0;
session->timer = 0;
- wfd_destroy_session(manager);
+ WDS_LOGD("Session timer expired");
+
+ peer_addr = wfd_session_get_peer_addr(session);
+
+ memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+ noti.error = WIFI_DIRECT_ERROR_CONNECTION_CANCELED;
+ snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_event_notify_clients(manager, ¬i);
+
+ wfd_session_cancel(session, peer_addr);
+
+ if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ } else {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
__WDS_LOG_FUNC_EXIT__;
return FALSE;
}
-static int _session_timer(wfd_session_s *session, int start)
+int wfd_session_timer(wfd_session_s *session, int start)
{
__WDS_LOG_FUNC_ENTER__;
WDS_LOGE("Session not found");
return -1;
}
- _session_timer(session, 0);
+ wfd_session_timer(session, 0);
peer = session->peer;
if (session->state == SESSION_STATE_COMPLETED)
session->state = SESSION_STATE_STARTED;
peer = session->peer;
- if (peer->dev_role == WFD_DEV_ROLE_GO || session->invitation)
+ if (peer->dev_role == WFD_DEV_ROLE_GO || session->type == SESSION_TYPE_INVITE)
join = 1;
res = wfd_oem_prov_disc_req(manager->oem_ops, peer->dev_addr,
session->req_wps_mode, join);
return -1;
}
- _session_timer(session, 1);
+ wfd_session_timer(session, 1);
__WDS_LOG_FUNC_EXIT__;
return 0;
memset(¶m, 0x00, sizeof(wfd_oem_conn_param_s));
param.wps_mode = session->wps_mode;
- if (peer->dev_role == WFD_DEV_ROLE_GO)
+ if (peer->dev_role == WFD_DEV_ROLE_GO || session->type == SESSION_TYPE_INVITE)
param.conn_flags |= WFD_OEM_CONN_TYPE_JOIN;
param.go_intent = session->go_intent;
param.freq = session->freq;
return -1;
}
- _session_timer(session, 1);
+ wfd_session_timer(session, 1);
+
+ __WDS_LOG_FUNC_EXIT__;
+ return 0;
+}
+
+int wfd_session_cancel(wfd_session_s *session, unsigned char *peer_addr)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_manager_s *manager = wfd_get_manager();
+ int res = 0;
+
+ if (!session || !session->peer) {
+ WDS_LOGE("Invalid parameter");
+ __WDS_LOG_FUNC_EXIT__;
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+ if (memcmp(peer_addr, session->peer->dev_addr, MACADDR_LEN)) {
+ WDS_LOGE("Peer is not included in this session");
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+ if (session->state > SESSION_STATE_GO_NEG)
+ res = wfd_oem_wps_cancel(manager->oem_ops);
+ else
+ res = wfd_oem_cancel_connection(manager->oem_ops, peer_addr);
+
+ if (res < 0) {
+ WDS_LOGE("Failed to cancel connection");
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ wfd_destroy_session(manager);
__WDS_LOG_FUNC_EXIT__;
return 0;
}
-int wfd_session_reject(wfd_session_s *session)
+int wfd_session_reject(wfd_session_s *session, unsigned char *peer_addr)
{
__WDS_LOG_FUNC_ENTER__;
wfd_manager_s *manager = wfd_get_manager();
return -1;
}
- _session_timer(session, 1);
+ wfd_session_timer(session, 1);
__WDS_LOG_FUNC_EXIT__;
return 0;
return -1;
}
- _session_timer(session, 1);
+ wfd_session_timer(session, 1);
__WDS_LOG_FUNC_EXIT__;
return 0;
session->wps_pin[PINSTR_LEN] = '\0';
}
session->state = SESSION_STATE_STARTED;
- _session_timer(session, 1);
+ wfd_session_timer(session, 1);
manager->local->wps_mode = event->wps_mode;
session->req_wps_mode = WFD_WPS_MODE_PBC;
}
session->state = SESSION_STATE_STARTED;
- _session_timer(session, 1);
+ wfd_session_timer(session, 1);
manager->local->wps_mode = event->wps_mode;
WDS_LOGD("Local WPS mode is %d", session->wps_mode);