* Add cancel connection fuction to manager 44/15044/1
authorJiung Yu <jiung.yu@samsung.com>
Wed, 15 Jan 2014 08:41:19 +0000 (17:41 +0900)
committerJiung Yu <jiung.yu@samsung.com>
Wed, 15 Jan 2014 08:42:35 +0000 (17:42 +0900)
  * Add reject connection fuction to manager
  * Add disconnect fuction to manager
  * Add disconnect all fuction to manager

Change-Id: Id78ed1dff519a8555ba75090f6378e0fe9434bb2
Signed-off-by: Yu jiung <jiung.yu@samsung.com>
include/wifi-direct-manager.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-manager.c

index 94ad33d..aa87a2d 100644 (file)
@@ -139,7 +139,7 @@ int wfd_local_get_dev_mac(unsigned char *dev_mac);
 int wfd_local_get_intf_mac(unsigned char *intf_mac);
 int wfd_local_get_ip_addr(char *ip_str);
 int wfd_local_get_supported_wps_mode(int *wps_mode);
-int wfd_local_set_req_wps_mode(int wps_mode);
+int wfd_local_set_req_wps_mode(int req_wps_mode);
 int wfd_local_get_wps_mode(int *wps_mode);
 int wfd_local_get_req_wps_mode(int *req_wps_mode);
 
@@ -157,6 +157,10 @@ int wfd_manager_activate(wfd_manager_s *manager);
 int wfd_manager_deactivate(wfd_manager_s *manager);
 int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr);
 int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr);
+int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_addr);
+int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr);
+int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr);
+int wfd_manager_disconnect_all(wfd_manager_s *manager);
 int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers);
 int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data);
 wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr);
index 966a5d0..db4e2c8 100644 (file)
@@ -1,3 +1,9 @@
+Tue, 15 Jan 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.6)
+  * Add cancel connection fuction to manager
+  * Add reject connection fuction to manager
+  * Add disconnect fuction to manager
+  * Add disconnect allfuction to manager
+
 Tue, 15 Jan 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.5)
   * Change group function operation and parameter
 
index 03f3832..fbd7612 100644 (file)
@@ -1,6 +1,6 @@
 Name:       wifi-direct-manager
 Summary:    Wi-Fi Direct manger
-Version:    1.0.5
+Version:    1.0.6
 Release:    1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
index 8451885..325faf9 100644 (file)
@@ -1656,7 +1656,6 @@ static gboolean ws_event_handler(GIOChannel *source,
                        wfd_oem_invite_data_s* edata = NULL;
                        edata = (wfd_oem_invite_data_s*) event->edata;
                        event_id = WFD_OEM_EVENT_INVITATION_REQ;
-                       ws_restart_scan(edata->listen);
                }
                break;
        case WS_EVENT_INVITATION_RESULT:
index 0061ae7..4f36586 100644 (file)
@@ -82,6 +82,10 @@ char *wfd_server_print_cmd(wifi_direct_cmd_e cmd)
                return "WIFI_DIRECT_CMD_GET_LINK_STATUS";
        case WIFI_DIRECT_CMD_CONNECT:
                return "WIFI_DIRECT_CMD_CONNECT";
+       case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
+               return "WIFI_DIRECT_CMD_CANCEL_CONNECTION";
+       case WIFI_DIRECT_CMD_REJECT_CONNECTION:
+               return "WIFI_DIRECT_CMD_REJECT_CONNECTION";
 
        case WIFI_DIRECT_CMD_DISCONNECT_ALL:
                return "WIFI_DIRECT_CMD_DISCONNECT_ALL";
@@ -967,18 +971,15 @@ static gboolean wfd_client_process_request(GIOChannel *source,
                                return FALSE;
                        }
 
-                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-                       if (res < 0) {
-                               WDS_LOGE("Failed to send response to client");
-                               _wfd_deregister_client(manager, req.client_id);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return FALSE;
-                       }
+                       res = wfd_manager_cancel_connection(manager, req.data.mac_addr);
+                       if (res < 0)
+                               WDS_LOGE("Failed to cancel connection");
 
-                       res = wfd_oem_cancel_connection(manager->oem_ops, NULL);
-                       wfd_peer_clear_all(manager);
-                       wfd_destroy_session(manager);
-                       goto done;
+                       noti = (wifi_direct_client_noti_s*) calloc(1, 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(req.data.mac_addr));
+                       goto send_notification;
                }
                break;
        case WIFI_DIRECT_CMD_REJECT_CONNECTION:
@@ -1005,46 +1006,27 @@ static gboolean wfd_client_process_request(GIOChannel *source,
                                return FALSE;
                        }
 
-                       res = wfd_session_stop(session);
+                       res = wfd_manager_reject_connection(manager, req.data.mac_addr);
                        if (res < 0) {
-                               WDS_LOGE("Failed to stop session");
-                               // TODO: Which event should be sent?
-                       }
-
-                       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_LOGE("Failed to reject connection");
+                               // TODO: check whether set state and break
                        }
 
-                       /* After connection rejected by user, remove cache of all peer and scan again */
-                       wfd_peer_clear_all(manager);
-                       goto done;
+                       noti = (wifi_direct_client_noti_s*) calloc(1, 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(req.data.mac_addr));
+                       goto send_notification;
                }
                break;
        case WIFI_DIRECT_CMD_DISCONNECT:        // group, session
                {
-                       wfd_group_s *group = (wfd_group_s*) manager->group;
-                       wfd_device_s *peer = NULL;
-
-                       if (manager->state < WIFI_DIRECT_STATE_CONNECTING || !group) {
+                       if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
                                WDS_LOGE("It's not permitted with this state [%d]", manager->state);
                                rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
                                break;
                        }
 
-                       peer = wfd_manager_find_connected_peer(manager, req.data.mac_addr);
-                       if (!peer) {
-                               WDS_LOGE("Connected peer not found");
-                               peer = wfd_manager_get_current_peer(manager);
-                               if (!peer) {
-                                       WDS_LOGE("Connecting peer not found");
-                                       rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
-                               }
-                       }
-
                        res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
                        if (res < 0) {
                                WDS_LOGE("Failed to send response to client");
@@ -1053,38 +1035,16 @@ static gboolean wfd_client_process_request(GIOChannel *source,
                                return FALSE;
                        }
 
-                       if (rsp.result != WIFI_DIRECT_ERROR_NONE)
-                               goto done;
-
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
-
-                       wfd_destroy_session(manager);
-                       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-                               res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr);
-                       } else {
-                               res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-                       }
-                       if (res < 0) {
-                               WDS_LOGE("Failed to disconnect peer");
-                               noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
-                               noti->event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                               noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
-                               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_CONNECTED);
-                                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
-                               }
-                               goto send_notification;
-                       }
-                       goto done;
+                       noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+                       noti->event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+                       noti->error = wfd_manager_disconnect(manager, req.data.mac_addr);
+                       snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
+                       goto send_notification;
                }
                break;
        case WIFI_DIRECT_CMD_DISCONNECT_ALL:
                {
-                       if (manager->state < WIFI_DIRECT_STATE_CONNECTING) {
+                       if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
                                WDS_LOGD("It's not connected state [%d]", manager->state);
                                rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
                                break;
@@ -1098,26 +1058,10 @@ static gboolean wfd_client_process_request(GIOChannel *source,
                                return FALSE;
                        }
 
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
-
-                       wfd_destroy_session(manager);
-                       res = wfd_oem_destroy_group(manager->oem_ops, "p2p-wlan0-0");
-                       if (res < 0) {
-                               WDS_LOGE("Failed to destroy group");
-                               noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
-                               noti->event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                               noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
-                               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_CONNECTED);
-                                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
-                               }
-                               goto send_notification;
-                       }
-                       goto done;
+                       noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+                       noti->event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+                       noti->error = wfd_manager_disconnect_all(manager);
+                       goto send_notification;
                }
                break;
        case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
index 60d587b..008e6af 100644 (file)
@@ -655,6 +655,211 @@ int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_ad
 }
 
 
+int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_session_s *session = NULL;
+       wfd_group_s *group = NULL;
+       int res = 0;
+
+       if (!manager || !peer_addr) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+       }
+
+       res = wfd_session_cancel(manager->session, peer_addr);
+       if (res < 0) {
+               WDS_LOGE("Failed to cancel session");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       if (manager->local->dev_role != WFD_DEV_ROLE_GO)
+               wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
+
+       group = (wfd_group_s*) manager->group;
+       if (group) {
+               wfd_group_remove_member(group, peer_addr);
+               if (!group->member_count) {
+                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                       wfd_destroy_group(manager, group->ifname);
+               } else {
+                       wfd_oem_disconnect(manager->oem_ops, 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 WIFI_DIRECT_ERROR_NONE;
+}
+
+
+int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_session_s *session = NULL;
+       int res = 0;
+
+       if (!manager || !peer_addr) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Session not found");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_NONE) {
+               res = wfd_oem_reject_connection(manager->oem_ops, peer_addr);
+               if (res < 0) {
+                       WDS_LOGE("Failed to reject connection");
+                       // TODO: check whether set state and break
+               }
+       }
+       wfd_destroy_session(manager);
+
+       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 WIFI_DIRECT_ERROR_NONE;
+}
+
+
+int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_device_s *peer = NULL;
+       int res = 0;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       if (!peer_addr) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+       }
+
+       group = (wfd_group_s*) manager->group;
+       if (!group) {
+               WDS_LOGE("Group not found");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       peer = wfd_group_find_member_by_addr(group, peer_addr);
+       if (!peer) {
+               WDS_LOGE("Connected peer not found");
+               return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+       }
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+               res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr);
+       } else {
+               res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+       }
+       if (res < 0) {
+               WDS_LOGE("Failed to disconnect peer");
+               res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               goto failed;
+       }
+       WDS_LOGE("Succeeded to disconnect peer");
+
+       wfd_group_remove_member(group, peer_addr);
+       if (!group->member_count) {
+               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+               wfd_destroy_group(manager, group->ifname);
+       }
+
+       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 WIFI_DIRECT_ERROR_NONE;
+
+failed:
+       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_CONNECTED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return res;
+}
+
+int wfd_manager_disconnect_all(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       int res = 0;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       group = (wfd_group_s*) manager->group;
+       if (!group) {
+               WDS_LOGE("Group not found");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
+
+       res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+       if (res < 0) {
+               WDS_LOGE("Failed to destroy group");
+               res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               goto failed;
+       }
+       WDS_LOGE("Succeeded to disconnect all peer");
+
+       wfd_destroy_group(manager, group->ifname);
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return WIFI_DIRECT_ERROR_NONE;
+
+failed:
+       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_CONNECTED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return res;
+}
+
 int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
 {
        __WDS_LOG_FUNC_ENTER__;