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);
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);
+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
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
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:
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";
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:
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");
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;
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:
}
+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__;