2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct client functions.
23 * @file wifi-direct-client.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
31 #include <sys/types.h>
32 #include <sys/socket.h>
42 #include <wifi-direct.h>
43 //#include <security-server/security-server.h>
45 #include "wifi-direct-ipc.h"
46 #include "wifi-direct-manager.h"
47 #include "wifi-direct-oem.h"
48 #include "wifi-direct-session.h"
49 #include "wifi-direct-group.h"
50 #include "wifi-direct-client.h"
51 #include "wifi-direct-util.h"
52 #include "wifi-direct-state.h"
53 #include "wifi-direct-peer.h"
55 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
56 #include "wifi-direct-service.h"
57 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
60 static int _wfd_deregister_client(void *data, int client_id);
61 static gboolean wfd_client_process_request(GIOChannel *source,
62 GIOCondition condition,
66 static int _wfd_check_client_privilege(int client_sock, int cmd);
69 char *wfd_server_print_cmd(wifi_direct_cmd_e cmd)
73 case WIFI_DIRECT_CMD_REGISTER:
74 return "WIFI_DIRECT_CMD_REGISTER";
75 case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
76 return "WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET";
77 case WIFI_DIRECT_CMD_DEREGISTER:
78 return "WIFI_DIRECT_CMD_DEREGISTER";
79 case WIFI_DIRECT_CMD_ACTIVATE:
80 return "WIFI_DIRECT_CMD_ACTIVATE";
81 case WIFI_DIRECT_CMD_DEACTIVATE:
82 return "WIFI_DIRECT_CMD_DEACTIVATE";
83 case WIFI_DIRECT_CMD_START_DISCOVERY:
84 return "WIFI_DIRECT_CMD_START_DISCOVERY";
85 case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
86 return "WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL";
87 case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
88 return "WIFI_DIRECT_CMD_CANCEL_DISCOVERY";
89 case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
90 return "WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT";
91 case WIFI_DIRECT_CMD_GET_LINK_STATUS:
92 return "WIFI_DIRECT_CMD_GET_LINK_STATUS";
93 case WIFI_DIRECT_CMD_CONNECT:
94 return "WIFI_DIRECT_CMD_CONNECT";
95 case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
96 return "WIFI_DIRECT_CMD_CANCEL_CONNECTION";
97 case WIFI_DIRECT_CMD_REJECT_CONNECTION:
98 return "WIFI_DIRECT_CMD_REJECT_CONNECTION";
100 case WIFI_DIRECT_CMD_DISCONNECT_ALL:
101 return "WIFI_DIRECT_CMD_DISCONNECT_ALL";
102 case WIFI_DIRECT_CMD_CREATE_GROUP:
103 return "WIFI_DIRECT_CMD_CREATE_GROUP";
104 case WIFI_DIRECT_CMD_IS_GROUPOWNER:
105 return "WIFI_DIRECT_CMD_IS_GROUPOWNER";
106 case WIFI_DIRECT_CMD_GET_SSID:
107 return "WIFI_DIRECT_CMD_GET_SSID";
108 case WIFI_DIRECT_CMD_SET_SSID:
109 return "WIFI_DIRECT_CMD_SET_SSID";
110 case WIFI_DIRECT_CMD_GET_IP_ADDR:
111 return "WIFI_DIRECT_CMD_GET_IP_ADDR";
112 case WIFI_DIRECT_CMD_GET_CONFIG:
113 return "WIFI_DIRECT_CMD_GET_CONFIG";
114 case WIFI_DIRECT_CMD_SET_CONFIG:
115 return "WIFI_DIRECT_CMD_SET_CONFIG";
116 case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
117 return "WIFI_DIRECT_CMD_SEND_CONNECT_REQ";
119 case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
120 return "WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON";
121 case WIFI_DIRECT_CMD_SET_WPS_PIN:
122 return "WIFI_DIRECT_CMD_SET_WPS_PIN";
123 case WIFI_DIRECT_CMD_GET_WPS_PIN:
124 return "WIFI_DIRECT_CMD_GET_WPS_PIN";
125 case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
126 return "WIFI_DIRECT_CMD_GENERATE_WPS_PIN";
127 case WIFI_DIRECT_CMD_SET_WPA:
128 return "WIFI_DIRECT_CMD_SET_WPA";
129 case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
130 return "WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE";
131 case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
132 return "WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE";
133 case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
134 return "WIFI_DIRECT_CMD_GET_REQ_WPS_MODE";
135 case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
136 return "WIFI_DIRECT_CMD_SET_REQ_WPS_MODE";
137 case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
138 return "WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO";
139 case WIFI_DIRECT_CMD_DESTROY_GROUP:
140 return "WIFI_DIRECT_CMD_DESTROY_GROUP";
142 case WIFI_DIRECT_CMD_DISCONNECT:
143 return "WIFI_DIRECT_CMD_DISCONNECT";
144 case WIFI_DIRECT_CMD_SET_GO_INTENT:
145 return "WIFI_DIRECT_CMD_SET_GO_INTENT";
146 case WIFI_DIRECT_CMD_GET_GO_INTENT:
147 return "WIFI_DIRECT_CMD_GET_GO_INTENT";
148 case WIFI_DIRECT_CMD_GET_MAC_ADDR:
149 return "WIFI_DIRECT_CMD_GET_MAC_ADDR";
150 case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
151 return "WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP";
152 case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
153 return "WIFI_DIRECT_CMD_SET_MAX_CLIENT";
154 case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
155 return "WIFI_DIRECT_CMD_GET_MAX_CLIENT";
156 case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
157 return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE";
159 case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
160 return "WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE";
161 case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
162 return "WIFI_DIRECT_CMD_IS_DISCOVERABLE";
163 case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
164 return "WIFI_DIRECT_CMD_IS_LISTENING_ONLY";
165 case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
166 return "WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL";
167 case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
168 return "WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP";
169 case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
170 return "WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP";
171 case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP:
172 return "WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP";
173 case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
174 return "WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO";
175 case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
176 return "WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP";
177 case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
178 return "WIFI_DIRECT_CMD_GET_DEVICE_NAME";
180 case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
181 return "WIFI_DIRECT_CMD_SET_DEVICE_NAME";
182 case WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL:
183 return "WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL";
184 case WIFI_DIRECT_CMD_GET_PEER_INFO:
185 return "WIFI_DIRECT_CMD_GET_PEER_INFO";
187 case WIFI_DIRECT_CMD_SET_PASSPHRASE:
188 return "WIFI_DIRECT_CMD_SET_PASSPHRASE";
189 case WIFI_DIRECT_CMD_GET_PASSPHRASE:
190 return "WIFI_DIRECT_CMD_GET_PASSPHRASE";
191 case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER:
192 return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER";
194 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
195 case WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE:
196 return "WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE";
197 case WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE:
198 return "WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE";
199 case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
200 return "WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY";
201 case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
202 return "WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY";
203 case WIFI_DIRECT_CMD_REGISTER_SERVICE:
204 return "WIFI_DIRECT_CMD_REGISTER_SERVICE";
205 case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
206 return "WIFI_DIRECT_CMD_DEREGISTER_SERVICE";
207 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
209 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
210 case WIFI_DIRECT_CMD_INIT_MIRACAST:
211 return "WIFI_DIRECT_CMD_INIT_MIRACAST";
212 case WIFI_DIRECT_CMD_INIT_DISPLAY:
213 return "WIFI_DIRECT_CMD_INIT_DISPLAY";
214 case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
215 return "WIFI_DIRECT_CMD_DEINIT_DISPLAY";
216 case WIFI_DIRECT_CMD_SET_DISPLAY:
217 return "WIFI_DIRECT_CMD_SET_DISPLAY";
218 case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
219 return "WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY";
220 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
221 return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE";
222 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
223 return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY";
224 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
225 return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP";
226 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
227 return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT";
228 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
229 return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT";
230 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
233 return "WIFI_DIRECT_CMD_INVALID";
238 static wfd_client_s *_wfd_client_find_by_id(GList *clients, int client_id)
240 __WDS_LOG_FUNC_ENTER__;
241 wfd_client_s *client = NULL;
244 if (!clients || client_id < 0) {
245 WDS_LOGE("Invalid parameter(client_id:%d)", client_id);
249 temp = g_list_first(clients);
251 client = (wfd_client_s*) temp->data;
252 if (client->client_id == client_id) {
253 WDS_LOGD("Client found. [%d]", client_id);
256 temp = g_list_next(temp);
260 __WDS_LOG_FUNC_EXIT__;
264 static int _wfd_client_check_socket(int sock)
270 p_fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL;
271 res = poll((struct pollfd *) &p_fd, 1, 1);
274 WDS_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
276 } else if (res == 0) {
277 WDS_LOGD( "poll timeout. socket is busy\n");
281 if (p_fd.revents & POLLERR) {
282 WDS_LOGE("Error! POLLERR from socket[%d]", sock);
284 } else if (p_fd.revents & POLLHUP) {
285 WDS_LOGE("Error! POLLHUP from socket[%d]", sock);
287 } else if (p_fd.revents & POLLNVAL) {
288 WDS_LOGE("Error! POLLNVAL from socket[%d]", sock);
290 } else if (p_fd.revents & POLLIN) {
291 WDS_LOGD("POLLIN from socket [%d]", sock);
293 } else if (p_fd.revents & POLLOUT) {
294 WDS_LOGD("POLLOUT from socket [%d]", sock);
299 WDS_LOGD("Unknown poll event [%d]", p_fd.revents);
303 static int _wfd_send_to_client(int sock, char *data, int data_len)
305 __WDS_LOG_FUNC_ENTER__;
307 int left_len = data_len;
311 if (sock < SOCK_FD_MIN || !data || data_len < 0) {
312 WDS_LOGE("Invalid parameter");
316 res = _wfd_client_check_socket(sock);
318 WDS_LOGE("Socket error");
320 } else if (res > 0) {
321 WDS_LOGE("Socket is busy");
327 wbytes = write(sock, ptr, left_len);
329 WDS_LOGE("Failed to write data into socket[%d]. [error=%s]", sock, strerror(errno));
331 }else if (wbytes < left_len) {
332 WDS_LOGD("%d bytes left. Continue sending...", left_len - wbytes);
335 } else if (wbytes == left_len) {
336 WDS_LOGD("Succeeded to write data[%d bytes] into socket [%d]", wbytes, sock);
339 WDS_LOGE("Unknown error occurred. [%s]", strerror(errno));
344 __WDS_LOG_FUNC_EXIT__;
351 static int _wfd_read_from_client(int sock, char *data, int data_len)
353 __WDS_LOG_FUNC_ENTER__;
355 int total_rbytes = 0;
358 if(sock < SOCK_FD_MIN || !data || data_len <= 0) {
359 WDS_LOGE("Invalid parameter");
363 res = _wfd_client_check_socket(sock);
365 WDS_LOGE("Socket error");
367 } else if (res > 0) {
368 WDS_LOGE("Socket is busy");
374 rbytes = read(sock, data, data_len);
376 WDS_LOGE("Failed to read data from socket[%d]", sock);
379 total_rbytes += rbytes;
384 __WDS_LOG_FUNC_EXIT__;
388 int wfd_client_send_event(wfd_manager_s *manager, wifi_direct_client_noti_s *noti)
390 __WDS_LOG_FUNC_ENTER__;
393 wfd_client_s *client = NULL;
396 if (!manager || !noti) {
397 WDS_LOGE("Invalid parameter");
398 __WDS_LOG_FUNC_EXIT__;
402 temp = g_list_first(manager->clients);
405 res = _wfd_send_to_client(client->asock, (char*) noti, sizeof(wifi_direct_client_noti_s));
407 WDS_LOGE("Failed to send Notification[%d] to client [%d]", noti->event, client->client_id);
408 temp = g_list_next(temp);
409 _wfd_deregister_client(manager, client->client_id);
411 WDS_LOGD("Succeeded to send Notification [%d:%d] to client [%d]", noti->event,
412 noti->error, client->client_id);
413 temp = g_list_next(temp);
418 WDS_LOGD("Notification[%d:%d] sent to %d clients, Not Sent [%d]",
419 noti->event, noti->error, cnt, manager->client_count - cnt);
422 __WDS_LOG_FUNC_EXIT__;
426 static int _wfd_register_client(void *data, int sock)
428 __WDS_LOG_FUNC_ENTER__;
430 wifi_direct_client_request_s req;
431 wifi_direct_client_response_s rsp;
432 wfd_manager_s *manager = (wfd_manager_s*) data;
433 wfd_client_s *client = NULL;
436 if (sock < SOCK_FD_MIN) {
437 WDS_LOGE("Invalid argument");
438 __WDS_LOG_FUNC_EXIT__;
443 rbytes = read(sock, (char*) &req, sizeof(wifi_direct_client_request_s));
445 WDS_LOGE("Failed to read socket data from client. [%s]", strerror(errno));
446 __WDS_LOG_FUNC_EXIT__;
450 if (req.cmd == WIFI_DIRECT_CMD_REGISTER) {
451 // TODO: check validity of command
452 client = _wfd_client_find_by_id(manager->clients, req.client_id);
454 WDS_LOGE("Client already exist. client_id [%d]", sock);
455 res = WIFI_DIRECT_ERROR_NOT_PERMITTED; // WIFI_DIRECT_ERROR_ALREADY_EXIST
458 /*FixMe: Tizen TV Plardorm return the "ACCESS DENIED" error
459 Ignore the check for now*/
461 #if !defined TIZEN_TV
462 if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
463 rsp.result = WIFI_DIRECT_ERROR_AUTH_FAILED;
468 client = (wfd_client_s*) g_try_malloc0(sizeof(wfd_client_s));
470 WDS_LOGE("Failed to allocate memory");
473 client->client_id = sock;
474 client->ssock = sock;
475 client->asock = WFD_CLIENT_PENDING_SOCKET;
477 GIOChannel *gio = NULL;
478 gio = g_io_channel_unix_new(sock);
479 client->gsource_id = g_io_add_watch(gio, G_IO_IN | G_IO_ERR | G_IO_HUP,
480 (GIOFunc) wfd_client_process_request, (gpointer) sock);
481 g_io_channel_unref(gio);
483 manager->clients = g_list_prepend(manager->clients, (gpointer) client);
484 manager->client_count++;
485 WDS_LOGD("Client [%d] is added. %d client alive", client->client_id, manager->client_count);
487 res = WIFI_DIRECT_ERROR_NONE;
488 WDS_LOGD("New client[%d] added. Total count [%d]", client->client_id, manager->client_count);
489 } else if (req.cmd == WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET) {
490 client = _wfd_client_find_by_id(manager->clients, req.client_id);
492 WDS_LOGE("Client not found. client_id[%d]", req.client_id);
493 res = WIFI_DIRECT_ERROR_NOT_PERMITTED; // WIFI_DIRECT_ERROR_UNKNOWN_CLIENT
497 /*FixMe: Tizen TV Plardorm return the "ACCESS DENIED" error
498 Ignore the check for now*/
500 #if !defined TIZEN_TV
501 if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
502 res = WIFI_DIRECT_ERROR_AUTH_FAILED;
507 client->asock = sock;
508 WDS_LOGD("Async socket[%d] for New client[%d] added.", sock, client->client_id);
511 WDS_LOGE("Unknown command from client. [%d]", req.cmd);
512 __WDS_LOG_FUNC_EXIT__;
518 rsp.client_id = client->client_id;
520 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(wifi_direct_client_response_s));
522 WDS_LOGE("Failed to send response to client");
523 _wfd_deregister_client(manager, req.client_id);
524 __WDS_LOG_FUNC_EXIT__;
528 __WDS_LOG_FUNC_EXIT__;
532 static gboolean _wfd_remove_event_source(gpointer data)
534 __WDS_LOG_FUNC_ENTER__;
535 int source_id = (int) data;
539 WDS_LOGE("Invalid source ID [%d]", source_id);
543 res = g_source_remove(source_id);
545 WDS_LOGE("Failed to remove GSource");
548 WDS_LOGD("Succeeded to remove GSource");
550 __WDS_LOG_FUNC_EXIT__;
554 static int _wfd_deregister_client(void *data, int client_id)
556 __WDS_LOG_FUNC_ENTER__;
557 wfd_client_s *client = NULL;
558 wfd_manager_s *manager = (wfd_manager_s*) data;
560 client = _wfd_client_find_by_id(manager->clients, client_id);
562 WDS_LOGE("Failed to find client[%d]", client_id);
566 if (client->asock == WFD_CLIENT_PENDING_SOCKET) {
567 WDS_LOGE("This client[%d] is initializing(pending)...", client->client_id);
571 manager->clients = g_list_remove(manager->clients, client);
572 manager->client_count--;
573 WDS_LOGD("Client [%d] is removed. %d client left", client->client_id, manager->client_count);
575 if (client->asock >= SOCK_FD_MIN)
576 close(client->asock);
578 if (client->ssock >= SOCK_FD_MIN)
579 close(client->ssock);
581 g_idle_add((GSourceFunc) _wfd_remove_event_source, (gpointer) client->gsource_id);
582 client->gsource_id = 0;
586 __WDS_LOG_FUNC_EXIT__;
590 static int _wfd_create_server_socket(wfd_manager_s *manager)
592 __WDS_LOG_FUNC_ENTER__;
594 struct sockaddr_un saddr;
599 WDS_LOGE("Invalid parameter(NULL)");
603 /* Server socket initialization */
604 unlink(WFD_SERVER_SOCK_PATH);
607 sock = socket(AF_UNIX, SOCK_STREAM, 0);
608 if (sock < SOCK_FD_MIN) {
609 WDS_LOGE("Failed to create server socket. [%s]", strerror(errno));
612 __WDS_LOG_FUNC_EXIT__;
617 res = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sock_opt, sizeof(sock_opt));
619 WDS_LOGE("Failed to set socket option. [%s]", strerror(errno));
624 memset(&saddr, 0x00, sizeof(saddr));
625 saddr.sun_family = AF_UNIX;
626 snprintf(saddr.sun_path, sizeof(saddr.sun_path), WFD_SERVER_SOCK_PATH);
629 res = bind(sock, (struct sockaddr*) &saddr, sizeof(saddr));
631 WDS_LOGE("Failed to bind server socket. [%s]", strerror(errno));
633 __WDS_LOG_FUNC_EXIT__;
638 res = chmod(WFD_SERVER_SOCK_PATH, WFD_SERVER_SOCK_MODE);
640 WDS_LOGE("Failed to change mode of server socket file. [%s]", strerror(errno));
642 __WDS_LOG_FUNC_EXIT__;
647 res = listen(sock, WFD_MAX_CLIENT);
649 WDS_LOGE("Failed to listen server socket. [%s]", strerror(errno));
651 __WDS_LOG_FUNC_EXIT__;
655 manager->serv_sock = sock;
656 WDS_LOGD("Succeeded to create server socket. [%d]", sock);
658 __WDS_LOG_FUNC_EXIT__;
662 static gboolean _wfd_accept_client(GIOChannel *source,
663 GIOCondition condition,
666 __WDS_LOG_FUNC_ENTER__;
667 wfd_manager_s *manager = (wfd_manager_s*) user_data;
669 socklen_t cli_len = 0;
672 if (!manager || manager->serv_sock < 0) {
673 WDS_LOGE("Invalid parameter");
678 cli_sock = accept(manager->serv_sock, NULL, &cli_len);
679 if (cli_sock == -1) {
680 WDS_LOGE("Failed to accept client. [%s]", strerror(errno));
684 res = _wfd_register_client(manager, cli_sock);
686 WDS_LOGE("Failed to register client.");
691 __WDS_LOG_FUNC_EXIT__;
695 int wfd_client_handler_init(wfd_manager_s *manager)
697 __WDS_LOG_FUNC_ENTER__;
698 GList *clients = manager->clients;
702 g_list_free(clients);
706 res = _wfd_create_server_socket(manager);
708 WDS_LOGE("Failed to create server socket");
712 GIOChannel *gio = g_io_channel_unix_new(manager->serv_sock);
713 manager->client_handle = g_io_add_watch(gio, G_IO_IN,
714 (GIOFunc) _wfd_accept_client, manager);
715 g_io_channel_unref(gio);
717 __WDS_LOG_FUNC_EXIT__;
721 int wfd_client_handler_deinit(wfd_manager_s *manager)
723 __WDS_LOG_FUNC_ENTER__;
725 wfd_client_s *client = NULL;
727 if (manager->serv_sock >= SOCK_FD_MIN)
728 close(manager->serv_sock);
729 manager->serv_sock = -1;
730 g_source_remove(manager->client_handle);
731 manager->client_handle = 0;
733 temp = g_list_first(manager->clients);
737 if (client->ssock >= SOCK_FD_MIN)
738 close(client->ssock);
740 if (client->asock >= SOCK_FD_MIN)
741 close(client->asock);
743 g_source_remove(client->gsource_id);
744 client->gsource_id = 0;
747 temp = g_list_next(temp);
750 if (manager->clients) {
751 g_list_free(manager->clients);
752 manager->clients = NULL;
755 manager->client_count = 0;
756 manager->clients = NULL;
757 __WDS_LOG_FUNC_EXIT__;
761 #if !defined TIZEN_TV
762 static int _wfd_check_client_privilege(int client_sock, int cmd)
764 __WDS_LOG_FUNC_ENTER__;
765 int ret = SECURITY_SERVER_API_ERROR_ACCESS_DENIED;
768 case WIFI_DIRECT_CMD_ACTIVATE:
769 case WIFI_DIRECT_CMD_DEACTIVATE:
770 case WIFI_DIRECT_CMD_CONNECT:
771 case WIFI_DIRECT_CMD_CANCEL_CONNECT:
772 case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
773 case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
774 case WIFI_DIRECT_CMD_REJECT_CONNECTION:
775 case WIFI_DIRECT_CMD_DISCONNECT:
776 case WIFI_DIRECT_CMD_DISCONNECT_ALL:
777 case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
778 case WIFI_DIRECT_CMD_CREATE_GROUP:
779 case WIFI_DIRECT_CMD_DESTROY_GROUP:
780 case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
781 case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
782 case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
783 case WIFI_DIRECT_CMD_SET_GO_INTENT:
784 case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
785 case WIFI_DIRECT_CMD_SET_WPS_PIN:
786 case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
787 case WIFI_DIRECT_CMD_SET_SSID:
788 case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
789 case WIFI_DIRECT_CMD_SET_PASSPHRASE:
790 case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER:
792 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
793 case WIFI_DIRECT_CMD_INIT_MIRACAST:
795 case WIFI_DIRECT_CMD_INIT_DISPLAY:
796 case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
797 case WIFI_DIRECT_CMD_SET_DISPLAY:
798 case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
799 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
801 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
802 case WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE:
803 case WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE:
804 case WIFI_DIRECT_CMD_REGISTER_SERVICE:
805 case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
806 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
807 ret = security_server_check_privilege_by_sockfd(client_sock, "wifi-direct::admin", "rw");
809 case WIFI_DIRECT_CMD_START_DISCOVERY:
810 case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
811 case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
813 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
814 case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
815 case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
816 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
817 ret = security_server_check_privilege_by_sockfd(client_sock, "wifi-direct::discover", "w");
819 case WIFI_DIRECT_CMD_REGISTER:
820 case WIFI_DIRECT_CMD_DEREGISTER:
821 case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
822 case WIFI_DIRECT_CMD_GET_LINK_STATUS:
823 case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
824 case WIFI_DIRECT_CMD_GET_SSID:
825 case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
826 case WIFI_DIRECT_CMD_GET_GO_INTENT:
827 case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
828 case WIFI_DIRECT_CMD_GET_IP_ADDR:
829 case WIFI_DIRECT_CMD_GET_MAC_ADDR:
830 case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
831 case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
832 case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
833 case WIFI_DIRECT_CMD_GET_WPS_PIN:
834 case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
835 case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
836 case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
837 case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
838 case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
839 case WIFI_DIRECT_CMD_IS_GROUPOWNER:
840 case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
841 case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
842 case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP:
843 case WIFI_DIRECT_CMD_GET_PEER_INFO:
844 case WIFI_DIRECT_CMD_GET_PASSPHRASE:
845 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
846 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
847 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
848 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
849 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
850 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
851 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
852 ret = security_server_check_privilege_by_sockfd(client_sock, "wifi-direct::info", "r");
854 case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
855 ret = security_server_check_privilege_by_sockfd(client_sock, "wifi-direct::info", "rw");
857 case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
858 ret = security_server_check_privilege_by_sockfd(client_sock, "wifi-direct::native", "rw");
861 WDS_LOGE("Unknown command[%d]", cmd);
865 if(ret == SECURITY_SERVER_API_SUCCESS) {
866 WDS_LOGD("Security Server: API Access Validation Success");
867 return WIFI_DIRECT_ERROR_NONE;
868 } else if(ret == SECURITY_SERVER_API_ERROR_ACCESS_DENIED) {
869 WDS_LOGE("Access denied to client id [%d]", client_sock);
870 return WIFI_DIRECT_ERROR_PERMISSION_DENIED;
872 WDS_LOGE("Security Server, exception[%d]", ret);
873 return WIFI_DIRECT_ERROR_AUTH_FAILED;
878 static gboolean wfd_client_process_request(GIOChannel *source,
879 GIOCondition condition,
882 __WDS_LOG_FUNC_ENTER__;
883 int sock = (int) user_data;
884 wifi_direct_client_request_s req;
885 wifi_direct_client_response_s rsp;
886 char *extra_rsp = NULL;
887 wifi_direct_client_noti_s *noti = NULL;
888 wfd_manager_s *manager = wfd_get_manager();
891 if (sock < SOCK_FD_MIN) {
892 WDS_LOGE("Invalid argument");
893 __WDS_LOG_FUNC_EXIT__;
897 memset(&req, 0x0, sizeof(wifi_direct_client_request_s));
898 memset(&rsp, 0x0, sizeof(wifi_direct_client_response_s));
900 res = _wfd_read_from_client(sock, (char*) &req, sizeof(req));
902 WDS_LOGE("Client socket Hanged up");
903 _wfd_deregister_client(manager, req.client_id);
904 __WDS_LOG_FUNC_EXIT__;
906 } else if (res == 0) {
907 WDS_LOGE("Client socket busy");
910 WDS_LOGI("Client request [%d:%s], %d bytes read from socket[%d]", req.cmd, wfd_server_print_cmd(req.cmd), res, sock);
913 rsp.client_id = req.client_id;
914 rsp.result = WIFI_DIRECT_ERROR_NONE;
916 #if !defined TIZEN_TV
917 /*FixMe: Tizen TV Plardorm return the "ACCESS DENIED" error
918 Ignore the check for now*/
919 if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
920 rsp.result = WIFI_DIRECT_ERROR_AUTH_FAILED;
926 case WIFI_DIRECT_CMD_DEREGISTER: // manager
927 _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
929 res = _wfd_deregister_client(manager, req.client_id);
931 WDS_LOGE("Failed to deregister client[%d]", sock);
936 case WIFI_DIRECT_CMD_ACTIVATE: // manager (event)
937 if (manager->state > WIFI_DIRECT_STATE_DEACTIVATED) {
938 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
941 rsp.result = wfd_util_wifi_direct_activatable();
945 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
947 WDS_LOGE("Failed to send response to client");
948 _wfd_deregister_client(manager, req.client_id);
949 __WDS_LOG_FUNC_EXIT__;
953 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
954 noti->event = WIFI_DIRECT_CLI_EVENT_ACTIVATION;
955 noti->error = wfd_manager_activate(manager);
956 goto send_notification;
958 case WIFI_DIRECT_CMD_DEACTIVATE: // manager (event)
959 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
960 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
963 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
965 WDS_LOGE("Failed to send response to client");
966 _wfd_deregister_client(manager, req.client_id);
967 __WDS_LOG_FUNC_EXIT__;
971 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
972 noti->event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
973 noti->error = wfd_manager_deactivate(manager);
974 goto send_notification;
976 case WIFI_DIRECT_CMD_GET_LINK_STATUS:
977 rsp.param1 = manager->state;
979 case WIFI_DIRECT_CMD_START_DISCOVERY:
981 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
982 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
983 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
984 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
985 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
989 wfd_oem_scan_param_s param;
990 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
991 if (req.data.int1) // listen_only
992 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
994 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
995 param.scan_time = req.data.int2; // timeout
996 if (manager->local->dev_role == WFD_DEV_ROLE_GO)
997 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
999 res = wfd_oem_start_scan(manager->oem_ops, ¶m);
1001 WDS_LOGE("Failed to start scan");
1002 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1005 WDS_LOGE("Succeeded to start scan");
1006 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
1007 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
1009 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1010 if (req.data.int1) {
1011 noti->event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;
1012 manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
1014 noti->event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
1015 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
1017 noti->error = WIFI_DIRECT_ERROR_NONE;
1020 case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
1022 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
1023 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
1024 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
1025 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
1026 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1030 wfd_oem_scan_param_s param;
1031 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
1032 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
1033 param.scan_time = req.data.int1; // timeout
1034 int channel = req.data.int2; // channel
1036 if (channel == WIFI_DIRECT_DISCOVERY_FULL_SCAN) {
1037 param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
1038 } else if (channel == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL) {
1039 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1040 } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL1) {
1041 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
1043 } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL6) {
1044 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
1046 } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL11) {
1047 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
1050 param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
1051 param.freq = wfd_util_channel_to_freq(channel);
1054 WDS_LOGD("timeout[%d], frequency[%d] ", param.scan_time, param.freq);
1055 res = wfd_oem_start_scan(manager->oem_ops, ¶m);
1057 WDS_LOGE("Failed to start specific scan");
1058 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1061 WDS_LOGE("Succeeded to start specific scan");
1062 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
1063 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
1065 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1066 if (channel == WIFI_DIRECT_DISCOVERY_FULL_SCAN)
1067 noti->event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
1069 noti->event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN;
1070 noti->error = WIFI_DIRECT_ERROR_NONE;
1071 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
1074 case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
1075 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
1076 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
1077 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1081 res = wfd_oem_stop_scan(manager->oem_ops);
1083 WDS_LOGE("Failed to stop scan");
1084 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1087 WDS_LOGE("Succeeded to stop scan");
1089 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1090 noti->event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
1091 noti->error = WIFI_DIRECT_ERROR_NONE;
1092 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1093 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1094 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1096 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1097 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1101 case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
1102 rsp.param1 = manager->scan_mode == WFD_SCAN_MODE_PASSIVE;
1104 case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
1106 wfd_discovery_entry_s *peers = NULL;
1108 peer_cnt = wfd_manager_get_peers(manager, &peers);
1109 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
1111 WDS_LOGE("Failed to get scan result");
1112 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1115 rsp.param1 = peer_cnt;
1116 rsp.result = WIFI_DIRECT_ERROR_NONE;
1118 rsp.data_length = peer_cnt * sizeof(wfd_discovery_entry_s);
1119 extra_rsp = (char*) peers;
1120 WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
1123 case WIFI_DIRECT_CMD_CONNECT: //session (event)
1125 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
1126 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
1127 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
1128 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1132 wfd_group_s *group = (wfd_group_s*) manager->group;
1133 if (group && group->member_count >= manager->max_station) {
1134 rsp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
1138 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
1140 WDS_LOGE("Failed to send response to client");
1141 _wfd_deregister_client(manager, req.client_id);
1142 __WDS_LOG_FUNC_EXIT__;
1146 res = wfd_manager_connect(manager, req.data.mac_addr);
1147 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1149 noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1150 noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1152 noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
1153 noti->error = WIFI_DIRECT_ERROR_NONE;
1155 g_snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
1156 goto send_notification;
1159 case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
1161 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
1162 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1166 wfd_group_s *group = (wfd_group_s*) manager->group;
1167 if (group && group->member_count >= manager->max_station) {
1168 rsp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
1172 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
1174 WDS_LOGE("Failed to send response to client");
1175 _wfd_deregister_client(manager, req.client_id);
1176 __WDS_LOG_FUNC_EXIT__;
1180 res = wfd_manager_accept_connection(manager, req.data.mac_addr);
1181 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1183 noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1184 noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1186 noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
1187 noti->error = WIFI_DIRECT_ERROR_NONE;
1189 g_snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
1190 goto send_notification;
1193 case WIFI_DIRECT_CMD_CANCEL_CONNECT: // deprecated
1195 wfd_session_s *session = (wfd_session_s*) manager->session;
1196 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
1198 WDS_LOGE("Failed to send response to client");
1199 _wfd_deregister_client(manager, req.client_id);
1200 __WDS_LOG_FUNC_EXIT__;
1204 res = wfd_oem_cancel_connection(manager->oem_ops, NULL);
1206 WDS_LOGE("Failed to cancel connection");
1208 res = wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
1210 WDS_LOGE("Failed to destroy group");
1212 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1213 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1215 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1216 noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1217 noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1219 g_snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(session->peer->dev_addr));
1220 goto send_notification;
1223 case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
1225 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
1226 WDS_LOGE("It's not CONNECTING state");
1227 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1231 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
1233 WDS_LOGE("Failed to send response to client");
1234 _wfd_deregister_client(manager, req.client_id);
1235 __WDS_LOG_FUNC_EXIT__;
1239 res = wfd_manager_cancel_connection(manager, req.data.mac_addr);
1241 WDS_LOGE("Failed to cancel connection");
1243 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1244 noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1245 noti->error = WIFI_DIRECT_ERROR_CONNECTION_CANCELED;
1246 g_snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
1247 goto send_notification;
1250 case WIFI_DIRECT_CMD_REJECT_CONNECTION:
1252 wfd_session_s *session = (wfd_session_s*) manager->session;
1254 if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
1255 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
1256 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1260 if (session->direction != SESSION_DIRECTION_INCOMING) {
1261 WDS_LOGE("Only incomming session can be rejected");
1262 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1266 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
1268 WDS_LOGE("Failed to send response to client");
1269 _wfd_deregister_client(manager, req.client_id);
1270 __WDS_LOG_FUNC_EXIT__;
1274 res = wfd_manager_reject_connection(manager, req.data.mac_addr);
1276 WDS_LOGE("Failed to reject connection");
1277 // TODO: check whether to set state and break
1280 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1281 noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1282 noti->error = WIFI_DIRECT_ERROR_CONNECTION_CANCELED;
1283 g_snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
1284 goto send_notification;
1287 case WIFI_DIRECT_CMD_DISCONNECT: // group, session
1289 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1290 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
1291 res = wfd_oem_stop_scan(manager->oem_ops);
1293 WDS_LOGE("Failed to stop scan");
1294 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1297 WDS_LOGI("Succeeded to stop scan");
1298 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
1299 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1300 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1302 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1303 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1306 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
1307 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1312 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
1314 WDS_LOGE("Failed to send response to client");
1315 _wfd_deregister_client(manager, req.client_id);
1316 __WDS_LOG_FUNC_EXIT__;
1320 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1321 noti->event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
1322 noti->error = wfd_manager_disconnect(manager, req.data.mac_addr);
1323 g_snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
1324 goto send_notification;
1327 case WIFI_DIRECT_CMD_DISCONNECT_ALL:
1329 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1330 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
1331 res = wfd_oem_stop_scan(manager->oem_ops);
1333 WDS_LOGE("Failed to stop scan");
1334 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1337 WDS_LOGI("Succeeded to stop scan");
1338 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
1339 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1340 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1342 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1343 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1346 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
1347 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1352 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
1354 WDS_LOGE("Failed to send response to client");
1355 _wfd_deregister_client(manager, req.client_id);
1356 __WDS_LOG_FUNC_EXIT__;
1360 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1361 noti->event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
1362 noti->error = wfd_manager_disconnect_all(manager);
1363 goto send_notification;
1366 case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
1368 // even though status is not CONNECTED, this command can be excuted only when group exist
1369 if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1370 WDS_LOGD("It's not connected state [%d]", manager->state);
1371 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1375 wfd_connected_peer_info_s *peers = NULL;
1377 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
1378 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
1380 WDS_LOGE("Failed to get scan result");
1381 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1384 rsp.param1 = peer_cnt;
1385 rsp.result = WIFI_DIRECT_ERROR_NONE;
1387 rsp.data_length = peer_cnt * sizeof(wfd_connected_peer_info_s);
1388 extra_rsp = (char*) peers;
1389 WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
1392 case WIFI_DIRECT_CMD_CREATE_GROUP: // group
1395 wfd_group_s *group = manager->group;
1396 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1397 WDS_LOGE("Group already exist or not a proper state");
1398 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1402 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1404 WDS_LOGE("Failed to create pending group");
1405 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1408 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1409 manager->group = group;
1410 WDS_LOGD("Succeeded to create pending group");
1412 persistent = (manager->local->group_flags & WFD_GROUP_FLAG_PERSISTENT);
1414 res = wfd_oem_create_group(manager->oem_ops, persistent, 0, manager->local->passphrase);
1416 WDS_LOGE("Failed to create group");
1417 wfd_destroy_group(manager, GROUP_IFNAME);
1418 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1421 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN);
1424 case WIFI_DIRECT_CMD_DESTROY_GROUP:
1426 wfd_group_s *group = manager->group;
1427 if (!group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1428 WDS_LOGE("Group not exist");
1429 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1433 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1435 WDS_LOGE("Failed to destroy group");
1436 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1440 res = wfd_destroy_group(manager, group->ifname);
1442 WDS_LOGE("Failed to destroy group");
1444 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1445 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1447 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1448 noti->event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
1449 noti->error = WIFI_DIRECT_ERROR_NONE;
1452 case WIFI_DIRECT_CMD_IS_GROUPOWNER:
1454 wfd_device_s *local = manager->local;
1455 rsp.param1 = local->dev_role == WFD_DEV_ROLE_GO;
1458 case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
1460 wfd_group_s *group = manager->group;
1462 WDS_LOGE("Group not exist");
1463 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1466 rsp.param1 = group->flags & WFD_GROUP_FLAG_AUTONOMOUS;
1469 case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP:
1471 wfd_group_s *group = manager->group;
1473 WDS_LOGE("Group not exist");
1474 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1477 rsp.param1 = group->flags & WFD_GROUP_FLAG_PERSISTENT;
1480 case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
1482 wfd_group_s *group = manager->group;
1484 WDS_LOGE("Group not exist");
1485 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1488 rsp.param1 = wfd_util_freq_to_channel(group->freq);
1489 // TODO: check channel value
1492 case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO: // group
1494 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1495 WDS_LOGE("Wi-Fi Direct is not activated.");
1496 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1500 int persistent_group_count = 0;
1501 wfd_persistent_group_info_s *plist;
1503 res = wfd_oem_get_persistent_groups(manager->oem_ops, (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1505 WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1506 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1510 rsp.param1 = persistent_group_count;
1511 rsp.result = WIFI_DIRECT_ERROR_NONE;
1512 rsp.data_length = persistent_group_count * sizeof(wfd_persistent_group_info_s);
1513 extra_rsp = (char*) plist;
1514 WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
1517 case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
1519 manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1522 case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
1524 manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1527 case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP: // group
1529 wfd_persistent_group_info_s persistent_group;
1531 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1532 WDS_LOGE("Wi-Fi Direct is not activated.");
1533 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1534 _wfd_read_from_client(sock, (char*) &persistent_group, sizeof(wfd_persistent_group_info_s));
1538 res = _wfd_read_from_client(sock, (char*) &persistent_group, sizeof(wfd_persistent_group_info_s));
1540 WDS_LOGE("Client socket Hanged up");
1541 _wfd_deregister_client(manager, sock);
1543 } else if (res == -1) {
1544 WDS_LOGE("Failed to read socket [%d]", sock);
1547 WDS_LOGD("Remove persistent group [%s]", persistent_group.ssid);
1548 WDS_LOGD("Remove persistent group [" MACSTR "]", MAC2STR(persistent_group.go_mac_address));
1550 res = wfd_oem_remove_persistent_group(manager->oem_ops,
1551 persistent_group.ssid, persistent_group.go_mac_address);
1553 WDS_LOGE("Failed to remove persistent group");
1554 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1558 case WIFI_DIRECT_CMD_GET_SSID:
1559 case WIFI_DIRECT_CMD_GET_DEVICE_NAME: // manager (sync)
1560 res = wfd_local_get_dev_name(rsp.param2);
1562 WDS_LOGE("Failed to get device name");
1563 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1566 case WIFI_DIRECT_CMD_SET_SSID:
1567 case WIFI_DIRECT_CMD_SET_DEVICE_NAME: // manager (sync)
1569 char dev_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = {0, };
1570 res = _wfd_read_from_client(sock, dev_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
1572 WDS_LOGE("Failed to set device name");
1573 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1577 res = wfd_local_set_dev_name(dev_name);
1579 WDS_LOGE("Failed to set device name");
1580 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1584 case WIFI_DIRECT_CMD_GET_MAC_ADDR: // manager (sync)
1586 res = wfd_local_get_dev_mac(rsp.param2);
1588 WDS_LOGE("Failed to get device mac");
1589 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1593 case WIFI_DIRECT_CMD_GET_IP_ADDR: // group
1594 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1595 WDS_LOGE("Device is not connected yet");
1596 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1600 unsigned char ip_addr[IPADDR_LEN] = {0,};
1602 res = wfd_util_get_local_ip(ip_addr);
1604 WDS_LOGE("Failed to get local IP address");
1605 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1607 g_snprintf(rsp.param2, IPSTR_LEN, IPSTR, IP2STR(ip_addr));
1609 case WIFI_DIRECT_CMD_GET_GO_INTENT: // manager (sync)
1610 res = wfd_manager_get_go_intent(&rsp.param1);
1612 WDS_LOGE("Failed to get GO intent");
1613 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1616 case WIFI_DIRECT_CMD_SET_GO_INTENT: // manager (sync)
1617 res = wfd_manager_set_go_intent(req.data.int1);
1619 WDS_LOGE("Failed to set GO intent");
1620 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1623 case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
1624 res = wfd_manager_get_max_station(&rsp.param1);
1626 WDS_LOGE("Failed to get max station");
1627 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1630 case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
1631 res = wfd_manager_set_max_station(req.data.int1);
1633 WDS_LOGE("Failed to set max station");
1634 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1637 case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
1638 res = wfd_manager_get_autoconnection(&rsp.param1);
1640 WDS_LOGE("Failed to get autoconnection");
1641 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1644 case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE: // manager (sync)
1645 res = wfd_manager_set_autoconnection(req.data.int1);
1647 WDS_LOGE("Failed to set autoconnection");
1648 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1651 case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
1652 if (manager->state == WIFI_DIRECT_STATE_DISCOVERING
1653 || wfd_group_is_autonomous(manager->group) == 1)
1658 case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE: // manager (sync)
1659 res = wfd_local_get_supported_wps_mode(&rsp.param1);
1661 WDS_LOGE("Failed to get supported wps mode");
1662 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1665 case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
1666 res = wfd_local_get_wps_mode(&rsp.param1);
1668 WDS_LOGE("Failed to get wps mode");
1669 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1672 case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
1673 res = wfd_manager_get_req_wps_mode(&rsp.param1);
1675 WDS_LOGE("Failed to get request wps mode");
1676 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1679 case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
1680 res = wfd_manager_set_req_wps_mode(req.data.int1);
1682 WDS_LOGE("Failed to set request wps mode");
1683 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1686 case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
1687 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1688 WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1689 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1693 res = wfd_oem_wps_start(manager->oem_ops, NULL, WFD_WPS_MODE_PBC, NULL);
1695 WDS_LOGE("Failed to start wps");
1696 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1699 case WIFI_DIRECT_CMD_GET_WPS_PIN: // session
1701 wfd_session_s *session = (wfd_session_s*) manager->session;
1702 if (!session || manager->auto_pin[0] != 0) {
1703 WDS_LOGE("Session not exist");
1704 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1708 if (session->wps_pin[0] == '\0') {
1709 WDS_LOGE("WPS PIN is not set");
1710 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1713 g_snprintf(rsp.param2, sizeof(rsp.param2), "%s", session->wps_pin);
1716 case WIFI_DIRECT_CMD_SET_WPS_PIN: // session
1719 wfd_session_s *session = (wfd_session_s*) manager->session;
1721 WDS_LOGE("Session not exist");
1722 pin = manager->auto_pin;
1724 pin = session->wps_pin;
1726 res = _wfd_read_from_client(sock, pin, PINSTR_LEN);
1728 WDS_LOGE("Client socket Hanged up");
1729 _wfd_deregister_client(manager, sock);
1731 } else if (res == -1) {
1732 WDS_LOGE("Failed to read socket [%d]", sock);
1735 pin[PINSTR_LEN] = '\0';
1736 WDS_LOGD("PIN string [%s]", pin);
1739 case WIFI_DIRECT_CMD_GENERATE_WPS_PIN: // manager
1740 // TODO: implement in plugin
1744 case WIFI_DIRECT_CMD_GET_PEER_INFO:
1746 wfd_discovery_entry_s *peer = NULL;
1748 res = wfd_manager_get_peer_info(manager,req.data.mac_addr, &peer);
1749 if (res < 0 || !peer) {
1750 WDS_LOGE("Failed to get peer info");
1751 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1756 rsp.result = WIFI_DIRECT_ERROR_NONE;
1758 rsp.data_length = sizeof(wfd_discovery_entry_s);
1759 extra_rsp = (char*) peer;
1760 WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
1763 case WIFI_DIRECT_CMD_SET_PASSPHRASE:
1765 char passphrase[PASSPHRASE_LEN + 1] = {0,};
1766 wfd_group_s *group = manager->group;
1768 WDS_LOGE("Group already exists");
1769 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1770 _wfd_read_from_client(sock, passphrase, PASSPHRASE_LEN);
1774 res = _wfd_read_from_client(sock, manager->local->passphrase, PASSPHRASE_LEN);
1776 WDS_LOGE("Client socket Hanged up");
1777 _wfd_deregister_client(manager, sock);
1779 } else if (res == -1) {
1780 WDS_LOGE("Failed to read socket [%d]", sock);
1783 manager->local->passphrase[PASSPHRASE_LEN] = '\0';
1784 WDS_LOGD("Passphrase string [%s]", manager->local->passphrase);
1787 case WIFI_DIRECT_CMD_GET_PASSPHRASE:
1789 wfd_group_s *group = manager->group;
1791 WDS_LOGE("Group not exist");
1792 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1795 if (group->role == WFD_DEV_ROLE_GC) {
1796 WDS_LOGE("Device is not GO");
1797 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1800 g_strlcpy(rsp.param2, group->passphrase, PASSPHRASE_LEN + 1);
1801 WDS_LOGD("group->pass : [%s]", group->passphrase);
1804 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1805 case WIFI_DIRECT_CMD_REGISTER_SERVICE:
1807 int service_type = req.data.int1;
1808 char *info_str = NULL;
1810 info_str = (char*) g_try_malloc0(req.cmd_data_len);
1812 WDS_LOGE("Failed to allocate memory for info string");
1813 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1817 res = _wfd_read_from_client(sock, info_str, req.cmd_data_len);
1819 WDS_LOGE("Failed to read from socket");
1820 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1824 info_str[req.cmd_data_len] = '\0';
1825 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
1827 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1828 WDS_LOGE("Wi-Fi Direct is not activated.");
1829 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1834 res = wfd_service_add(&(manager->local->services), service_type, info_str, &rsp.param1);
1836 WDS_LOGE("Failed to add service");
1837 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1844 case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
1846 int service_id = req.data.int1;
1848 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1849 WDS_LOGE("Wi-Fi Direct is not activated.");
1850 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1854 res = wfd_service_del(manager->local->services, service_id);
1856 WDS_LOGE("Failed to delete service");
1857 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1862 case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
1864 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1865 WDS_LOGE("Wi-Fi Direct is not activated.");
1866 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1870 int service_type = req.data.int1;
1871 WDS_LOGD("Service type [%d]", service_type);
1873 res = wfd_oem_start_service_discovery(manager->oem_ops, req.data.mac_addr, service_type);
1875 WDS_LOGE("Failed to start service discovery");
1876 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1879 noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
1880 noti->event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_STARTED;
1881 noti->error = WIFI_DIRECT_ERROR_NONE;
1885 case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
1889 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1890 WDS_LOGE("Wi-Fi Direct is not activated.");
1891 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1895 service_type = req.data.int1;
1896 WDS_LOGD("Service type [%d]", service_type);
1898 res = wfd_oem_cancel_service_discovery(manager->oem_ops, req.data.mac_addr, service_type);
1900 WDS_LOGE("Failed to cancel service discovery");
1901 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1905 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1907 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1908 case WIFI_DIRECT_CMD_INIT_MIRACAST:
1910 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1911 WDS_LOGE("Wi-Fi Direct is not activated.");
1912 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1916 int miracast_enable = req.data.int1;
1917 WDS_LOGD("Miracast enable [%d]", miracast_enable);
1919 res = wfd_oem_miracast_init(manager->oem_ops, miracast_enable);
1921 WDS_LOGE("Failed to initialize miracast");
1922 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1926 if(miracast_enable) {
1927 manager->local->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
1928 manager->local->display.port = WIFI_DISPLAY_DEFAULT_PORT;
1929 manager->local->display.availablity = WIFI_DISPLAY_DEFAULT_AVAIL;
1930 manager->local->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
1931 manager->local->display.max_tput = WIFI_DISPLAY_DEFAULT_TPUT;
1933 memset(&(manager->local->display), 0x0, sizeof(wfd_display_type_e));
1936 int screen_mirroring_status;
1937 if (vconf_get_int(VCONFKEY_SCREEN_MIRRORING_STATE, &screen_mirroring_status) < 0)
1938 WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
1939 WDS_LOGD("screen_mirroring_status: %d\n", screen_mirroring_status);
1941 if (miracast_enable == TRUE) {
1943 /* set go intent 14 so that can be Group Owner. value 15 can cause connection fail when nego with peer has 15 go intent value. */
1944 res = wfd_manager_set_go_intent(14);
1946 WDS_LOGE("Failed to set GO intent");
1948 /* set vconf of Screen Mirroring state. This is necessary to avoid 5 min. auto-deactivation in case of applications using Screen Mirroring. */
1949 if(screen_mirroring_status < VCONFKEY_SCREEN_MIRRORING_ACTIVATED)
1951 if (vconf_set_int(VCONFKEY_SCREEN_MIRRORING_STATE, VCONFKEY_SCREEN_MIRRORING_ACTIVATED) < 0)
1952 WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
1957 /* set go intent to default value */
1958 res = wfd_manager_set_go_intent(7);
1960 WDS_LOGE("Failed to set GO intent");
1962 /* set vconf of Screen Mirroring state. This is necessary in case of applications using Screen Mirroring. */
1963 if(screen_mirroring_status < VCONFKEY_SCREEN_MIRRORING_CONNECTED)
1965 if (vconf_set_int(VCONFKEY_SCREEN_MIRRORING_STATE, VCONFKEY_SCREEN_MIRRORING_DEACTIVATED) < 0)
1966 WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
1973 case WIFI_DIRECT_CMD_INIT_DISPLAY:
1975 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
1976 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1980 wfd_device_s * device = manager->local;
1982 res = wfd_oem_miracast_init(manager->oem_ops, true);
1984 WDS_LOGE("Failed to initialize display");
1985 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1987 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
1988 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
1989 device->display.availablity = WIFI_DISPLAY_DEFAULT_AVAIL;
1990 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
1991 device->display.max_tput = WIFI_DISPLAY_DEFAULT_TPUT;
1995 case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
1997 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
1998 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2002 wfd_device_s * device = manager->local;
2004 res = wfd_oem_miracast_init(manager->oem_ops, false);
2006 WDS_LOGE("Failed to deinitialize display");
2007 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2010 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
2013 case WIFI_DIRECT_CMD_SET_DISPLAY:
2015 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2016 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2020 int type = req.data.int1; // type
2021 int port = req.data.int2; // port
2022 int hdcp = req.data.int3; // hdcp
2024 res = wfd_manager_set_display_device(type, port, hdcp);
2026 WDS_LOGE("Failed to set display device settings");
2027 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2031 case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
2033 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2034 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2037 res = wfd_manager_set_session_availability(req.data.int1);
2039 WDS_LOGE("Failed to set session availability");
2040 rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2045 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
2047 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2048 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2052 wfd_device_s *peer = NULL;
2054 peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
2056 rsp.param1 = peer->display.type;
2058 WDS_LOGE("Failed to get peer");
2059 rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2064 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
2066 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2067 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2071 wfd_device_s *peer = NULL;
2073 peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
2075 rsp.param1 = peer->display.availablity;
2077 WDS_LOGE("Failed to get peer");
2078 rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2083 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
2085 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2086 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2090 wfd_device_s *peer = NULL;
2092 peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
2094 rsp.param1 = peer->display.hdcp_support;
2096 WDS_LOGE("Failed to get peer");
2097 rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2102 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
2104 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2105 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2109 wfd_device_s *peer = NULL;
2111 peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
2113 rsp.param1 = peer->display.port;
2115 WDS_LOGE("Failed to get peer");
2116 rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2121 case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
2123 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2124 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2128 wfd_device_s *peer = NULL;
2130 peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
2132 rsp.param1 = peer->display.max_tput;
2134 WDS_LOGE("Failed to get peer");
2135 rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2140 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2142 WDS_LOGE("Unknown command[%d]", req.cmd);
2143 rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2148 res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
2150 WDS_LOGE("Failed to send response to client");
2153 _wfd_deregister_client(manager, req.client_id);
2154 __WDS_LOG_FUNC_EXIT__;
2158 if (rsp.data_length > 0) {
2159 res = _wfd_send_to_client(sock, (char*) extra_rsp, rsp.data_length);
2161 WDS_LOGE("Failed to send extra response data to client");
2164 _wfd_deregister_client(manager, req.client_id);
2165 __WDS_LOG_FUNC_EXIT__;
2174 res = wfd_client_send_event(manager, noti);
2176 WDS_LOGE("Failed to send Notification to client");
2179 __WDS_LOG_FUNC_EXIT__;
2182 WDS_LOGD("Succeeded to send Notification[%d] to client", noti->event);
2188 __WDS_LOG_FUNC_EXIT__;