* Add wps_cancel operation 41/15041/1
authorJiung Yu <jiung.yu@samsung.com>
Wed, 15 Jan 2014 08:01:29 +0000 (17:01 +0900)
committerJiung Yu <jiung.yu@samsung.com>
Wed, 15 Jan 2014 08:01:54 +0000 (17:01 +0900)
  * Add session type and session management related operation

Change-Id: Ia3ab96fe4d969455c1f58d0464db969257f224d2
Signed-off-by: Yu jiung <jiung.yu@samsung.com>
13 files changed:
include/wifi-direct-session.h
oem/wifi-direct-oem.c
oem/wifi-direct-oem.h
packaging/wifi-direct-manager.changes
packaging/wifi-direct-manager.spec
plugin/wpasupplicant/wfd-plugin-wpasupplicant.c
plugin/wpasupplicant/wfd-plugin-wpasupplicant.h
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 411966a..2d3eea9 100644 (file)
 #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,
@@ -44,11 +51,11 @@ typedef enum {
 } 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;
@@ -61,7 +68,8 @@ wfd_session_s *wfd_create_session(void *data, unsigned char *peer_addr, int wps_
 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);
@@ -70,6 +78,7 @@ unsigned char *wfd_session_get_peer_addr(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);
 
index 31af062..99df579 100644 (file)
@@ -275,6 +275,16 @@ int wfd_oem_enrollee_start(wfd_oem_ops_s *ops, unsigned char *peer_addr, int wps
        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) {
index 4017224..92b7330 100644 (file)
@@ -235,6 +235,7 @@ typedef struct _wfd_oem_ops_s {
        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);
@@ -274,6 +275,7 @@ int wfd_oem_cancel_connection(wfd_oem_ops_s *ops, unsigned char *peer_addr);
 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);
index defb14d..76c9bcb 100644 (file)
@@ -1,3 +1,7 @@
+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
 
index 5421fbd..f06e0ba 100644 (file)
@@ -1,6 +1,6 @@
 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
index 4baca2f..8451885 100644 (file)
@@ -179,6 +179,7 @@ static wfd_oem_ops_s supplicant_ops = {
        .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,
@@ -2523,6 +2524,36 @@ int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin)
        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__;
index d4c692a..f7603d8 100644 (file)
 #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"
@@ -471,6 +472,7 @@ int ws_destroy_group(const char *ifname);
 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);
index 2a4098d..0061ae7 100644 (file)
@@ -953,9 +953,8 @@ static gboolean wfd_client_process_request(GIOChannel *source,
                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;
                        }
index 46c65fa..55388f4 100644 (file)
@@ -336,7 +336,10 @@ int wfd_process_event(void *user_data, void *data)
                        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(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
@@ -354,10 +357,8 @@ int wfd_process_event(void *user_data, void *data)
        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;
                }
@@ -388,7 +389,8 @@ 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
+               session->state = SESSION_STATE_COMPLETED;
+               peer->state = WFD_PEER_STATE_CONNECTED;
                group->members = g_list_prepend(group->members, peer);
                group->member_count++;
 
@@ -590,7 +592,7 @@ int wfd_process_event(void *user_data, void *data)
                /* After connection failed, scan again */
                wfd_oem_scan_param_s param;
                memset(&param, 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, &param);
index 0b9217c..12f5988 100644 (file)
@@ -148,8 +148,17 @@ int wfd_group_complete(void *data, char *ifname, int role, unsigned char *go_dev
        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;
index c869fc0..6063e6b 100644 (file)
@@ -559,7 +559,7 @@ int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
        }
 
        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;
        }
@@ -573,8 +573,8 @@ int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
                }
        }
 
-       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 */
@@ -702,8 +702,6 @@ int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_
                                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;
index ec36eb3..0cd8554 100644 (file)
@@ -110,7 +110,7 @@ int wfd_update_peer_time(void*data, unsigned char *peer_addr)
 
        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;
        }
 
@@ -282,7 +282,7 @@ wfd_device_s *wfd_peer_find_by_addr(void *data, unsigned char *addr)
                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);
index 9424053..563d285 100644 (file)
@@ -48,21 +48,40 @@ static gboolean _session_timeout_cb(gpointer *user_data)
        __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(&noti, 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, &noti);
+
+       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__;
 
@@ -168,7 +187,7 @@ int wfd_destroy_session(void *data)
                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)
@@ -208,7 +227,7 @@ int wfd_session_start(wfd_session_s *session)
 
        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);
@@ -221,7 +240,7 @@ int wfd_session_start(wfd_session_s *session)
                return -1;
        }
 
-       _session_timer(session, 1);
+       wfd_session_timer(session, 1);
 
        __WDS_LOG_FUNC_EXIT__;
        return 0;
@@ -289,7 +308,7 @@ int wfd_session_connect(wfd_session_s *session)
 
        memset(&param, 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;
@@ -307,13 +326,46 @@ int wfd_session_connect(wfd_session_s *session)
                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();
@@ -389,7 +441,7 @@ int wfd_session_join(wfd_session_s *session)
                return -1;
        }
 
-       _session_timer(session, 1);
+       wfd_session_timer(session, 1);
 
        __WDS_LOG_FUNC_EXIT__;
        return 0;
@@ -428,7 +480,7 @@ int wfd_session_invite(wfd_session_s *session)
                return -1;
        }
 
-       _session_timer(session, 1);
+       wfd_session_timer(session, 1);
 
        __WDS_LOG_FUNC_EXIT__;
        return 0;
@@ -589,7 +641,7 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                                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;
 
@@ -619,7 +671,7 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                                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);