4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Sungsik Jang <sungsik.jang@samsung.com>, Dongwook Lee <dwmax.lee@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
23 /*****************************************************************************
25 *****************************************************************************/
31 #include <sys/socket.h>
37 #include <sys/ioctl.h>
40 #include <linux/unistd.h>
44 /*****************************************************************************
46 *****************************************************************************/
49 /*****************************************************************************
50 * Wi-Fi Direct Service headers
51 *****************************************************************************/
52 #include "wifi-direct.h"
53 #include "wifi-direct-client-proxy.h"
54 #include "wifi-direct-internal.h"
56 /*****************************************************************************
58 *****************************************************************************/
60 /*****************************************************************************
62 *****************************************************************************/
63 wifi_direct_client_info_s g_client_info = {
64 .is_registered = FALSE,
68 .activation_cb = NULL,
70 .connection_cb = NULL,
71 .ip_assigned_cb = NULL,
72 .user_data_for_cb_activation = NULL,
73 .user_data_for_cb_discover = NULL,
74 .user_data_for_cb_connection = NULL,
75 .user_data_for_cb_ip_assigned = NULL,
76 .mutex = PTHREAD_MUTEX_INITIALIZER
79 /*****************************************************************************
80 * Local Functions Definition
81 *****************************************************************************/
86 return syscall(__NR_gettid);
89 #error "__NR_gettid is not defined, please include linux/unistd.h"
92 static wifi_direct_client_info_s *__wfd_get_control()
94 return &g_client_info;
97 static void __wfd_reset_control()
100 if (g_client_info.g_source_id > 0)
101 g_source_remove(g_client_info.g_source_id);
102 g_client_info.g_source_id = -1;
104 // Protect standard input / output / error
105 if (g_client_info.sync_sockfd > 0)
106 close(g_client_info.sync_sockfd);
107 g_client_info.sync_sockfd = -1;
109 if (g_client_info.async_sockfd > 0)
110 close(g_client_info.async_sockfd);
111 g_client_info.async_sockfd = -1;
113 g_client_info.is_registered = FALSE;
115 // Initialize callbacks
116 g_client_info.activation_cb = NULL;
117 g_client_info.discover_cb = NULL;
118 g_client_info.connection_cb = NULL;
119 g_client_info.ip_assigned_cb = NULL;
120 g_client_info.user_data_for_cb_activation = NULL;
121 g_client_info.user_data_for_cb_discover = NULL;
122 g_client_info.user_data_for_cb_connection = NULL;
123 g_client_info.user_data_for_cb_ip_assigned = NULL;
125 pthread_mutex_destroy(&g_client_info.mutex);
128 static int macaddr_atoe(const char *p, unsigned char mac[])
133 mac[i++] = (char) strtoul(p, &p, 16);
141 static char *__wfd_print_event(wfd_client_event_e event)
145 case WIFI_DIRECT_CLI_EVENT_INVALID:
146 return "WIFI_DIRECT_CLI_EVENT_INVALID";
148 case WIFI_DIRECT_CLI_EVENT_ACTIVATION:
151 case WIFI_DIRECT_CLI_EVENT_DEACTIVATION:
152 return "DEACTIVATION";
154 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START:
155 return "WIFI_DIRECT_CLI_EVENT_DISCOVER_START";
157 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY:
158 return "WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY";
160 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN:
161 return "WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN";
163 case WIFI_DIRECT_CLI_EVENT_DISCOVER_END:
164 return "WIFI_DIRECT_CLI_EVENT_DISCOVER_END";
166 case WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS:
167 return "WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS";
169 case WIFI_DIRECT_CLI_EVENT_CONNECTION_START:
170 return "WIFI_DIRECT_CLI_EVENT_CONNECTION_START";
172 case WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ:
173 return "WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ";
175 case WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP:
176 return "WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP";
178 case WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ:
179 return "WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ";
181 case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP:
182 return "WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP";
184 case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND:
185 return "WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND";
187 case WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND:
188 return "WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND";
190 case WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP:
191 return "WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP";
193 case WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP:
194 return "WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP";
196 case WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND:
197 return "WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND";
199 case WIFI_DIRECT_CLI_EVENT_INVITATION_REQ:
200 return "WIFI_DIRECT_CLI_EVENT_INVITATION_REQ";
203 return "WIFI_DIRECT_CLI_EVENT_unknown";
208 static char *__wfd_print_error(wifi_direct_error_e error)
212 case WIFI_DIRECT_ERROR_NONE:
213 return "WIFI_DIRECT_ERROR_NONE";
214 case WIFI_DIRECT_ERROR_NOT_PERMITTED:
215 return "WIFI_DIRECT_ERROR_NOT_PERMITTED";
216 case WIFI_DIRECT_ERROR_OUT_OF_MEMORY:
217 return "WIFI_DIRECT_ERROR_OUT_OF_MEMORY";
218 case WIFI_DIRECT_ERROR_RESOURCE_BUSY:
219 return "WIFI_DIRECT_ERROR_RESOURCE_BUSY";
220 case WIFI_DIRECT_ERROR_INVALID_PARAMETER:
221 return "WIFI_DIRECT_ERROR_INVALID_PARAMETER";
222 case WIFI_DIRECT_ERROR_NOT_INITIALIZED:
223 return "WIFI_DIRECT_ERROR_NOT_INITIALIZED";
224 case WIFI_DIRECT_ERROR_COMMUNICATION_FAILED:
225 return "WIFI_DIRECT_ERROR_COMMUNICATION_FAILED";
226 case WIFI_DIRECT_ERROR_WIFI_USED:
227 return "WIFI_DIRECT_ERROR_WIFI_USED";
228 case WIFI_DIRECT_ERROR_MOBILE_AP_USED:
229 return "WIFI_DIRECT_ERROR_MOBILE_AP_USED";
230 case WIFI_DIRECT_ERROR_CONNECTION_FAILED:
231 return "WIFI_DIRECT_ERROR_CONNECTION_FAILED";
232 case WIFI_DIRECT_ERROR_AUTH_FAILED:
233 return "WIFI_DIRECT_ERROR_AUTH_FAILED";
234 case WIFI_DIRECT_ERROR_OPERATION_FAILED:
235 return "WIFI_DIRECT_ERROR_OPERATION_FAILED";
236 case WIFI_DIRECT_ERROR_TOO_MANY_CLIENT:
237 return "WIFI_DIRECT_ERROR_TOO_MANY_CLIENT";
238 case WIFI_DIRECT_ERROR_ALREADY_INITIALIZED:
239 return "WIFI_DIRECT_ERROR_ALREADY_INITIALIZED";
241 WDC_LOGE("Invalid error value: [%d]", error);
242 return "Invalid error";
246 static int __wfd_convert_client_event(wfd_client_event_e event)
248 __WDC_LOG_FUNC_START__;
252 case WIFI_DIRECT_CLI_EVENT_ACTIVATION:
253 return WIFI_DIRECT_DEVICE_STATE_ACTIVATED;
255 case WIFI_DIRECT_CLI_EVENT_DEACTIVATION:
256 return WIFI_DIRECT_DEVICE_STATE_DEACTIVATED;
259 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY:
260 return WIFI_DIRECT_ONLY_LISTEN_STARTED;
262 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START:
263 return WIFI_DIRECT_DISCOVERY_STARTED;
265 case WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS:
266 return WIFI_DIRECT_DISCOVERY_FOUND;
268 case WIFI_DIRECT_CLI_EVENT_DISCOVER_END:
269 return WIFI_DIRECT_DISCOVERY_FINISHED;
271 case WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ:
272 return WIFI_DIRECT_CONNECTION_REQ;
274 case WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ:
275 return WIFI_DIRECT_CONNECTION_WPS_REQ;
277 case WIFI_DIRECT_CLI_EVENT_CONNECTION_START:
278 return WIFI_DIRECT_CONNECTION_IN_PROGRESS;
280 case WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP:
281 return WIFI_DIRECT_CONNECTION_RSP;
283 case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP:
284 return WIFI_DIRECT_DISCONNECTION_RSP;
286 case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND:
287 return WIFI_DIRECT_DISCONNECTION_IND;
289 case WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND:
290 return WIFI_DIRECT_DISASSOCIATION_IND;
292 case WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP:
293 return WIFI_DIRECT_GROUP_CREATED;
295 case WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP:
296 return WIFI_DIRECT_GROUP_DESTROYED;
298 case WIFI_DIRECT_CLI_EVENT_INVITATION_REQ:
299 return WIFI_DIRECT_INVITATION_REQ;
302 WDC_LOGE("Invalid event : [%d]", event);
306 __WDC_LOG_FUNC_END__;
310 char *__wfd_client_print_cmd(wifi_direct_cmd_e cmd)
314 case WIFI_DIRECT_CMD_REGISTER:
315 return "WIFI_DIRECT_CMD_REGISTER";
316 case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
317 return "WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET";
318 case WIFI_DIRECT_CMD_DEREGISTER:
319 return "WIFI_DIRECT_CMD_DEREGISTER";
320 case WIFI_DIRECT_CMD_ACTIVATE:
321 return "WIFI_DIRECT_CMD_ACTIVATE";
322 case WIFI_DIRECT_CMD_DEACTIVATE:
323 return "WIFI_DIRECT_CMD_DEACTIVATE";
324 case WIFI_DIRECT_CMD_START_DISCOVERY:
325 return "WIFI_DIRECT_CMD_START_DISCOVERY";
326 case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
327 return "WIFI_DIRECT_CMD_CANCEL_DISCOVERY";
328 case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
329 return "WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT";
330 case WIFI_DIRECT_CMD_GET_LINK_STATUS:
331 return "WIFI_DIRECT_CMD_GET_LINK_STATUS";
332 case WIFI_DIRECT_CMD_CONNECT:
333 return "WIFI_DIRECT_CMD_CONNECT";
334 case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
335 return "WIFI_DIRECT_CMD_CANCEL_CONNECTION";
336 case WIFI_DIRECT_CMD_REJECT_CONNECTION:
337 return "WIFI_DIRECT_CMD_REJECT_CONNECTION";
338 case WIFI_DIRECT_CMD_DISCONNECT_ALL:
339 return "WIFI_DIRECT_CMD_DISCONNECT_ALL";
340 case WIFI_DIRECT_CMD_CREATE_GROUP:
341 return "WIFI_DIRECT_CMD_CREATE_GROUP";
342 case WIFI_DIRECT_CMD_IS_GROUPOWNER:
343 return "WIFI_DIRECT_CMD_IS_GROUPOWNER";
344 case WIFI_DIRECT_CMD_GET_SSID:
345 return "WIFI_DIRECT_CMD_GET_SSID";
346 case WIFI_DIRECT_CMD_SET_SSID:
347 return "WIFI_DIRECT_CMD_SET_SSID";
348 case WIFI_DIRECT_CMD_GET_IP_ADDR:
349 return "WIFI_DIRECT_CMD_GET_IP_ADDR";
350 case WIFI_DIRECT_CMD_GET_CONFIG:
351 return "WIFI_DIRECT_CMD_GET_CONFIG";
352 case WIFI_DIRECT_CMD_SET_CONFIG:
353 return "WIFI_DIRECT_CMD_SET_CONFIG";
354 case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
355 return "WIFI_DIRECT_CMD_SEND_CONNECT_REQ";
356 case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
357 return "WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON";
358 case WIFI_DIRECT_CMD_SET_WPS_PIN:
359 return "WIFI_DIRECT_CMD_SET_WPS_PIN";
360 case WIFI_DIRECT_CMD_GET_WPS_PIN:
361 return "WIFI_DIRECT_CMD_GET_WPS_PIN";
362 case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
363 return "WIFI_DIRECT_CMD_GENERATE_WPS_PIN";
364 case WIFI_DIRECT_CMD_SET_WPA:
365 return "WIFI_DIRECT_CMD_SET_WPA";
366 case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
367 return "WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE";
368 case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
369 return "WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE";
370 case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
371 return "WIFI_DIRECT_CMD_SET_REQ_WPS_MODE";
372 case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
373 return "WIFI_DIRECT_CMD_GET_REQ_WPS_MODE";
374 case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
375 return "WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO";
376 case WIFI_DIRECT_CMD_DESTROY_GROUP:
377 return "WIFI_DIRECT_CMD_DESTROY_GROUP";
378 case WIFI_DIRECT_CMD_DISCONNECT:
379 return "WIFI_DIRECT_CMD_DISCONNECT";
380 case WIFI_DIRECT_CMD_SET_GO_INTENT:
381 return "WIFI_DIRECT_CMD_SET_GO_INTENT";
382 case WIFI_DIRECT_CMD_GET_GO_INTENT:
383 return "WIFI_DIRECT_CMD_GET_GO_INTENT";
384 case WIFI_DIRECT_CMD_GET_DEVICE_MAC:
385 return "WIFI_DIRECT_CMD_GET_DEVICE_MAC";
386 case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
387 return "WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP";
388 case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
389 return "WIFI_DIRECT_CMD_SET_MAX_CLIENT";
390 case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
391 return "WIFI_DIRECT_CMD_GET_MAX_CLIENT";
392 case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
393 return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE";
394 case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
395 return "WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE";
396 case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
397 return "WIFI_DIRECT_CMD_IS_DISCOVERABLE";
398 case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
399 return "WIFI_DIRECT_CMD_IS_LISTENING_ONLY";
400 case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
401 return "WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL";
402 case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
403 return "WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP";
404 case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
405 return "WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP";
406 case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP:
407 return "WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP";
408 case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
409 return "WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO";
410 case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
411 return "WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP";
412 case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
413 return "WIFI_DIRECT_CMD_GET_DEVICE_NAME";
414 case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
415 return "WIFI_DIRECT_CMD_SET_DEVICE_NAME";
416 case WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL:
417 return "WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL";
418 case WIFI_DIRECT_CMD_SERVICE_ADD:
419 return "WIFI_DIRECT_CMD_SERVICE_ADD";
420 case WIFI_DIRECT_CMD_SERVICE_DEL:
421 return "WIFI_DIRECT_CMD_SERVICE_DEL";
422 case WIFI_DIRECT_CMD_SERV_DISC_REQ:
423 return "WIFI_DIRECT_CMD_SERV_DISC_REQ";
424 case WIFI_DIRECT_CMD_SERV_DISC_CANCEL:
425 return "WIFI_DIRECT_CMD_SERV_DISC_CANCEL";
426 case WIFI_DIRECT_CMD_INIT_WIFI_DISPLAY:
427 return "WIFI_DIRECT_CMD_INIT_WIFI_DISPLAY";
428 case WIFI_DIRECT_CMD_DEINIT_WIFI_DISPLAY:
429 return "WIFI_DIRECT_CMD_DEINIT_WIFI_DISPLAY";
430 case WIFI_DIRECT_CMD_GET_DISPLAY_PORT:
431 return "WIFI_DIRECT_CMD_GET_DISPLAY_PORT";
432 case WIFI_DIRECT_CMD_GET_DISPLAY_TYPE:
433 return "WIFI_DIRECT_CMD_GET_DISPLAY_TYPE";
434 case WIFI_DIRECT_CMD_GET_ACCESS_LIST:
435 return "WIFI_DIRECT_CMD_GET_ACCESS_LIST";
436 case WIFI_DIRECT_CMD_ADD_TO_ACCESS_LIST:
437 return "WIFI_DIRECT_CMD_ADD_TO_ACCESS_LIST";
438 case WIFI_DIRECT_CMD_DEL_FROM_ACCESS_LIST:
439 return "WIFI_DIRECT_CMD_DEL_FROM_ACCESS_LIST";
441 return "WIFI_DIRECT_CMD_INVALID";
446 static int __wfd_client_check_socket(int sock, int timeout)
451 if (sock < SOCK_FD_MIN || timeout < 0) {
452 WDC_LOGE("Invalid parameter");
457 p_fd.events = POLLIN | POLLERR | POLLHUP | POLLNVAL;
458 res = poll((struct pollfd *) &p_fd, 1, timeout);
461 WDC_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
463 } else if (res == 0) {
464 WDC_LOGD( "poll timeout. socket is busy");
467 if (p_fd.revents & POLLERR) {
468 WDC_LOGE("Error! POLLERR from socket[%d]", sock);
470 } else if (p_fd.revents & POLLHUP) {
471 WDC_LOGE("Error! POLLHUP from socket[%d]", sock);
473 } else if (p_fd.revents & POLLNVAL) {
474 WDC_LOGE("Error! POLLNVAL from socket[%d]", sock);
476 } else if (p_fd.revents & POLLIN) {
477 WDC_LOGD("POLLIN from socket [%d]", sock);
482 WDC_LOGD("Unknown poll event [%d]", p_fd.revents);
486 static int __wfd_client_write_socket(int sockfd, void *data, int data_len)
488 __WDC_LOG_FUNC_START__;
491 if (sockfd < SOCK_FD_MIN || !data || data_len <= 0) {
492 WDC_LOGE("Invalid parameter");
493 __WDC_LOG_FUNC_END__;
497 WDC_LOGD("Write [%d] bytes to socket [%d].", data_len, sockfd);
499 wbytes = write(sockfd, (char*) data, data_len);
501 WDC_LOGE("Error!!! writing to the socket. Error = %s", strerror(errno));
502 __WDC_LOG_FUNC_END__;
506 __WDC_LOG_FUNC_END__;
510 static int __wfd_client_read_socket(int sockfd, char *data, int data_len)
512 __WDC_LOG_FUNC_START__;
514 int total_rbytes = 0;
517 if (sockfd < SOCK_FD_MIN) {
518 WDC_LOGE("Error!!! Invalid socket FD [%d]", sockfd);
519 __WDC_LOG_FUNC_END__;
523 if (!data || data_len <= 0) {
524 WDC_LOGE("Error!!! Invalid parameter");
525 __WDC_LOG_FUNC_END__;
529 res = __wfd_client_check_socket(sockfd, 10000);
531 WDC_LOGE("Socket error");
532 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
533 } else if (res > 0) {
534 WDC_LOGE("Socket is busy");
535 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
540 rbytes = read(sockfd, data, data_len);
542 WDC_LOGE("Failed to read socket[%d] [%s]", sockfd, strerror(errno));
545 total_rbytes += rbytes;
550 __WDC_LOG_FUNC_END__;
554 static int __wfd_client_send_request(int sockfd, wifi_direct_client_request_s *req,
555 wifi_direct_client_response_s *rsp)
557 __WDC_LOG_FUNC_START__;
560 if (!req || !rsp || sockfd < SOCK_FD_MIN) {
561 WDC_LOGE("Invalid parameter");
562 __WDC_LOG_FUNC_END__;
563 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
566 pthread_mutex_lock(&g_client_info.mutex);
567 res = __wfd_client_write_socket(sockfd, req, sizeof(wifi_direct_client_request_s));
568 if (res != WIFI_DIRECT_ERROR_NONE) {
569 WDC_LOGE("Failed to write into socket [%s]", __wfd_print_error(res));
570 __wfd_reset_control();
571 pthread_mutex_unlock(&g_client_info.mutex);
572 __WDC_LOG_FUNC_END__;
573 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
575 WDC_LOGD("Succeeded to send request [%d: %s]", req->cmd, __wfd_client_print_cmd(req->cmd));
577 res = __wfd_client_read_socket(sockfd, rsp, sizeof(wifi_direct_client_response_s));
578 pthread_mutex_unlock(&g_client_info.mutex);
580 WDC_LOGE("Failed to read socket [%d]", res);
581 __wfd_reset_control();
582 __WDC_LOG_FUNC_END__;
583 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
585 if (rsp->cmd != req->cmd) {
586 WDC_LOGE("Invalid resp [%d], Original request [%d]", rsp->cmd, req->cmd);
587 __WDC_LOG_FUNC_END__;
588 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
591 if (rsp->result != WIFI_DIRECT_ERROR_NONE) {
592 WDC_LOGE("Result received [%s]", __wfd_print_error(rsp->result));
593 __WDC_LOG_FUNC_END__;
598 __WDC_LOG_FUNC_END__;
599 return WIFI_DIRECT_ERROR_NONE;
602 static gboolean __wfd_client_process_event(GIOChannel *source,
603 GIOCondition condition,
606 wfd_client_event_e event = WIFI_DIRECT_CLI_EVENT_INVALID;
607 wifi_direct_client_info_s *client = __wfd_get_control();
608 int sockfd = client->async_sockfd;
609 wifi_direct_client_noti_s client_noti;
610 wifi_direct_error_e error = WIFI_DIRECT_ERROR_NONE;
611 char param1[64] = { 0, };
612 char param2[64] = { 0, };
615 memset(&client_noti, 0, sizeof(wifi_direct_client_noti_s));
618 res = __wfd_client_read_socket(sockfd, (char*) &client_noti,
619 sizeof(wifi_direct_client_noti_s));
621 WDC_LOGE("Error!!! Reading Async Event[%d]", sockfd);
622 __wfd_reset_control();
623 __WDC_LOG_FUNC_END__;
626 WDC_LOGD( "Received Event is [%d,%s], error[%d]", client_noti.event,
627 __wfd_print_event(client_noti.event), client_noti.error);
629 event = client_noti.event;
630 error = client_noti.error;
631 memcpy(param1, client_noti.param1, sizeof(client_noti.param1));
632 memcpy(param2, client_noti.param2, sizeof(client_noti.param2));
637 case WIFI_DIRECT_CLI_EVENT_ACTIVATION:
638 case WIFI_DIRECT_CLI_EVENT_DEACTIVATION:
639 if (!client->activation_cb) {
640 WDC_LOGE("activation_cb is NULL!!");
643 client->activation_cb(error,
644 (wifi_direct_device_state_e) __wfd_convert_client_event(event),
645 client->user_data_for_cb_activation);
648 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START:
649 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY:
650 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN:
651 case WIFI_DIRECT_CLI_EVENT_DISCOVER_END:
652 case WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS:
653 if (!client->discover_cb) {
654 WDC_LOGE("discover_cb is NULL!!");
657 client->discover_cb(error,
658 (wifi_direct_discovery_state_e) __wfd_convert_client_event(event),
659 client->user_data_for_cb_discover);
662 case WIFI_DIRECT_CLI_EVENT_CONNECTION_START:
663 case WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ:
664 case WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP:
665 case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP:
666 case WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ:
667 case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND:
668 case WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND:
669 case WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP:
670 case WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP:
671 case WIFI_DIRECT_CLI_EVENT_INVITATION_REQ:
672 if (!client->connection_cb) {
673 WDC_LOGE("connection_cb is NULL!!");
676 client->connection_cb(error,
677 (wifi_direct_connection_state_e) __wfd_convert_client_event(event),
678 param1, client->user_data_for_cb_connection);
681 // ToDo: Handling IP lease event...
682 case WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND:
683 if (!client->ip_assigned_cb) {
684 WDC_LOGE("ip_assigned_cb is NULL!!");
688 ifname = vconf_get_str(VCONFKEY_IFNAME);
690 WDC_LOGD("vconf (%s) value is NULL!!!", VCONFKEY_IFNAME);
693 WDC_LOGD("VCONFKEY_IFNAME(%s) : %s", VCONFKEY_IFNAME, ifname);
694 client->ip_assigned_cb(param1, param2, ifname,
695 client->user_data_for_cb_ip_assigned);
703 __WDC_LOG_FUNC_END__;
708 void __wfd_client_print_entry_list(wfd_discovery_entry_s *list, int num)
712 WDC_LOGD("------------------------------------------");
713 for (i = 0; i < num; i++)
715 WDC_LOGD("== Peer index : %d ==", i);
716 WDC_LOGD("is Group Owner ? %s", list[i].is_group_owner ? "YES" : "NO");
717 WDC_LOGD("device_name : %s", list[i].device_name);
718 WDC_LOGD("MAC address : "MACSTR, MAC2STR(list[i].mac_address));
719 WDC_LOGD("wps cfg method : %x", list[i].wps_cfg_methods);
721 WDC_LOGD("------------------------------------------");
724 void __wfd_client_print_connected_peer_info(wfd_connected_peer_info_s *list, int num)
728 WDC_LOGD("------------------------------------------\n");
729 for (i = 0; i < num; i++)
731 WDC_LOGD("== Peer index : %d ==\n", i);
732 WDC_LOGD("device_name : %s\n", list[i].device_name);
733 WDC_LOGD("Device MAC : " MACSTR "\n", MAC2STR(list[i].mac_address));
734 WDC_LOGD("Interface MAC : " MACSTR "\n", MAC2STR(list[i].intf_address));
735 WDC_LOGD("services : %d\n", list[i].services);
736 WDC_LOGD("is_p2p : %d\n", list[i].is_p2p);
737 WDC_LOGD("category : %d\n", list[i].category);
738 WDC_LOGD("channel : %d\n", list[i].channel);
739 WDC_LOGD("IP ["IPSTR"]\n", IP2STR(list[i].ip_address));
741 WDC_LOGD("------------------------------------------\n");
744 void __wfd_client_print_persistent_group_info(wfd_persistent_group_info_s *list, int num)
748 WDC_LOGD("------------------------------------------\n");
749 for (i = 0; i < num; i++)
751 WDC_LOGD("== Persistent Group index : %d ==\n", i);
752 WDC_LOGD("ssid : %s\n", list[i].ssid);
753 WDC_LOGD("GO MAC : " MACSTR "\n",
754 MAC2STR(list[i].go_mac_address));
756 WDC_LOGD("------------------------------------------\n");
759 static int __wfd_client_async_event_init(int clientid)
761 __WDC_LOG_FUNC_START__;
763 struct sockaddr_un saddr;
764 wifi_direct_client_info_s *client_info = __wfd_get_control();
765 wifi_direct_client_request_s req;
769 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
771 WDC_LOGE("Failed to async socket[%s]", strerror(errno));
772 __WDC_LOG_FUNC_END__;
773 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
775 WDC_LOGD("Succeeded to create async socket[%d]", sockfd);
777 memset(&saddr, 0, sizeof(saddr));
778 saddr.sun_family = AF_UNIX;
779 snprintf(saddr.sun_path, sizeof(saddr.sun_path), WFD_SOCK_FILE_PATH);
781 WDC_LOGD("Connecting to server socket to register async socket [%d]", sockfd);
783 res = connect(sockfd, (struct sockaddr *) &saddr, sizeof(saddr));
785 WDC_LOGE("Error!!! connecting to server socket. Error = [%s].", strerror(errno));
787 __WDC_LOG_FUNC_END__;
788 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
791 memset(&req, 0, sizeof(wifi_direct_client_request_s));
793 req.cmd = WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET;
794 req.client_id = clientid;
796 res = __wfd_client_write_socket(sockfd, &req, sizeof(wifi_direct_client_request_s));
797 if (res < WIFI_DIRECT_ERROR_NONE) {
798 WDC_LOGE("Failed to write to socket[%s]", strerror(errno));
799 WDC_LOGE("Error!!! [%s]", __wfd_print_error(res));
801 __WDC_LOG_FUNC_END__;
804 client_info->async_sockfd = sockfd;
806 WDC_LOGE("Async socket is created= %d", sockfd);
811 static gboolean wfd_client_execute_file(const char *file_path,
812 char *const args[], char *const envs[])
817 register unsigned int index = 0;
819 while (args[index] != NULL) {
820 WDC_LOGD("[%s]", args[index]);
824 if (!(pid = fork())) {
825 WDC_LOGD("pid(%d), ppid(%d)", getpid(), getppid());
826 WDC_LOGD("Inside child, exec (%s) command", file_path);
829 if (execve(file_path, args, envs) == -1) {
830 WDC_LOGE("Fail to execute command (%s)", strerror(errno));
833 } else if (pid > 0) {
834 if (waitpid(pid, &rv, 0) == -1)
835 WDC_LOGD("wait pid (%u) rv (%d)", pid, rv);
837 WDC_LOGD("exited, rv=%d", WEXITSTATUS(rv));
838 } else if (WIFSIGNALED(rv)) {
839 WDC_LOGD("killed by signal %d", WTERMSIG(rv));
840 } else if (WIFSTOPPED(rv)) {
841 WDC_LOGD("stopped by signal %d", WSTOPSIG(rv));
842 } else if (WIFCONTINUED(rv)) {
843 WDC_LOGD("continued");
849 WDC_LOGE("failed to fork (%s)", strerror(errno));
853 static int __wfd_client_launch_server_dbus(void)
856 const char *path = "/usr/bin/dbus-send";
857 char *const args[] = { "/usr/bin/dbus-send", "--system", "--print-reply", "--dest=net.netconfig", "/net/netconfig/wifi", "net.netconfig.wifi.LaunchDirect", NULL };
858 char *const envs[] = { NULL };
860 rv = wfd_client_execute_file(path, args, envs);
863 WDC_LOGE("Failed to launch wfd-manager");
867 WDC_LOGD("Successfully launched wfd-manager");
871 int wifi_direct_initialize(void)
873 __WDC_LOG_FUNC_START__;
874 struct sockaddr_un saddr;
875 wifi_direct_client_info_s *client_info = __wfd_get_control();
876 wifi_direct_client_request_s req;
877 wifi_direct_client_response_s resp;
882 if (client_info->is_registered == TRUE) {
883 WDC_LOGW("Warning!!! Already registered\nUpdate user data and callback!");
884 __WDC_LOG_FUNC_END__;
885 return WIFI_DIRECT_ERROR_NONE;
889 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
890 if (sockfd < SOCK_FD_MIN) {
891 WDC_LOGE("Error!!! creating sync socket[%s]", strerror(errno));
892 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
894 WDC_LOGD("Created sync socket [%d]", sockfd);
896 memset(&saddr, 0, sizeof(saddr));
897 saddr.sun_family = AF_UNIX;
898 snprintf(saddr.sun_path, sizeof(saddr.sun_path), WFD_SOCK_FILE_PATH);
900 WDC_LOGD("Connecting to server socket to register sync socket [%d]", sockfd);
901 while (retry_count > 0) {
903 res = connect(sockfd, (struct sockaddr*) &saddr, sizeof(saddr));
905 WDC_LOGD("Succeeded to connect to server socket");
909 WDC_LOGD("Launching wfd-server..\n");
910 res = __wfd_client_launch_server_dbus();
912 WDC_LOGE("Failed to send dbus msg[%s]", strerror(errno));
915 /* wait a little before retrying the next socket connection */
920 WDC_LOGE("Failed to connect to server[%s]", strerror(errno));
921 if (sockfd > SOCK_FD_MIN)
923 __WDC_LOG_FUNC_END__;
924 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
927 memset(&req, 0, sizeof(wifi_direct_client_request_s));
928 memset(&resp, 0, sizeof(wifi_direct_client_response_s));
930 req.cmd = WIFI_DIRECT_CMD_REGISTER;
931 req.client_id = gettid();
932 WDC_LOGD("Client ID = %d", req.client_id);
934 res = __wfd_client_send_request(sockfd, &req, &resp);
936 __WDC_LOG_FUNC_END__;
939 client_info->sync_sockfd = sockfd;
940 client_info->client_id = resp.client_id;
941 client_info->is_registered = TRUE;
944 int async_sockfd = -1;
945 async_sockfd = __wfd_client_async_event_init(client_info->client_id);
946 if (async_sockfd < 0) {
947 WDC_LOGE("Failed to create async socket \n");
950 __wfd_reset_control();
951 __WDC_LOG_FUNC_END__;
952 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
954 client_info->async_sockfd = async_sockfd;
956 GIOChannel *gio = g_io_channel_unix_new(client_info->async_sockfd);
957 int g_source_id = g_io_add_watch(gio, G_IO_IN | G_IO_ERR | G_IO_HUP,
958 (GIOFunc) __wfd_client_process_event, NULL);
959 g_io_channel_unref(gio);
961 client_info->g_source_id = g_source_id;
963 // Initialize callbacks
964 client_info->activation_cb = NULL;
965 client_info->discover_cb = NULL;
966 client_info->connection_cb = NULL;
967 client_info->ip_assigned_cb = NULL;
968 client_info->user_data_for_cb_activation = NULL;
969 client_info->user_data_for_cb_discover = NULL;
970 client_info->user_data_for_cb_connection = NULL;
971 client_info->user_data_for_cb_ip_assigned = NULL;
973 __WDC_LOG_FUNC_END__;
974 return WIFI_DIRECT_ERROR_NONE;
977 int wifi_direct_deinitialize(void)
979 __WDC_LOG_FUNC_START__;
980 wifi_direct_client_info_s *client_info = __wfd_get_control();
982 if (client_info->is_registered == false) {
983 WDC_LOGE("Client is already deregistered");
984 __WDC_LOG_FUNC_END__;
985 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
988 client_info->activation_cb = NULL;
989 client_info->discover_cb = NULL;
990 client_info->connection_cb = NULL;
991 client_info->ip_assigned_cb = NULL;
992 client_info->user_data_for_cb_activation = NULL;
993 client_info->user_data_for_cb_discover = NULL;
994 client_info->user_data_for_cb_connection = NULL;
995 client_info->user_data_for_cb_ip_assigned = NULL;
997 wifi_direct_client_request_s req;
998 wifi_direct_client_response_s rsp;
999 int res = WIFI_DIRECT_ERROR_NONE;
1001 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1002 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1004 req.cmd = WIFI_DIRECT_CMD_DEREGISTER;
1005 req.client_id = client_info->client_id;
1007 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1009 WDC_LOGD("Failed to deinitialize. But continue deinitialization");
1011 WDC_LOGD("Deinit Successfull");
1013 __wfd_reset_control();
1014 __WDC_LOG_FUNC_END__;
1015 return WIFI_DIRECT_ERROR_NONE;
1019 int wifi_direct_set_device_state_changed_cb(wifi_direct_device_state_changed_cb cb,
1022 __WDC_LOG_FUNC_START__;
1023 wifi_direct_client_info_s *client_info = __wfd_get_control();
1026 WDC_LOGE("Invalid parameter");
1027 __WDC_LOG_FUNC_END__;
1028 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1031 if (client_info->is_registered == false) {
1032 WDC_LOGE("Client is not initialized.");
1033 __WDC_LOG_FUNC_END__;
1034 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1037 client_info->activation_cb = cb;
1038 client_info->user_data_for_cb_activation = user_data;
1040 __WDC_LOG_FUNC_END__;
1041 return WIFI_DIRECT_ERROR_NONE;
1045 int wifi_direct_unset_device_state_changed_cb(void)
1047 __WDC_LOG_FUNC_START__;
1048 wifi_direct_client_info_s *client_info = __wfd_get_control();
1050 if (client_info->is_registered == false) {
1051 WDC_LOGE("Client is not initialized.\n");
1052 __WDC_LOG_FUNC_END__;
1053 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1056 client_info->activation_cb = NULL;
1057 client_info->user_data_for_cb_activation = NULL;
1059 __WDC_LOG_FUNC_END__;
1060 return WIFI_DIRECT_ERROR_NONE;
1065 wifi_direct_set_discovery_state_changed_cb(wifi_direct_discovery_state_chagned_cb cb,
1068 __WDC_LOG_FUNC_START__;
1069 wifi_direct_client_info_s *client_info = __wfd_get_control();
1072 WDC_LOGE("Callback is NULL.\n");
1073 __WDC_LOG_FUNC_END__;
1074 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1077 if (client_info->is_registered == false) {
1078 WDC_LOGE("Client is not initialized.\n");
1079 __WDC_LOG_FUNC_END__;
1080 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1083 client_info->discover_cb = cb;
1084 client_info->user_data_for_cb_discover = user_data;
1086 __WDC_LOG_FUNC_END__;
1087 return WIFI_DIRECT_ERROR_NONE;
1091 int wifi_direct_unset_discovery_state_changed_cb(void)
1093 __WDC_LOG_FUNC_START__;
1094 wifi_direct_client_info_s *client_info = __wfd_get_control();
1096 if (client_info->is_registered == false) {
1097 WDC_LOGE("Client is not initialized.\n");
1098 __WDC_LOG_FUNC_END__;
1099 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1102 client_info->discover_cb = NULL;
1103 client_info->user_data_for_cb_discover = NULL;
1105 __WDC_LOG_FUNC_END__;
1106 return WIFI_DIRECT_ERROR_NONE;
1110 int wifi_direct_set_connection_state_changed_cb(wifi_direct_connection_state_changed_cb cb,
1113 __WDC_LOG_FUNC_START__;
1114 wifi_direct_client_info_s *client_info = __wfd_get_control();
1117 WDC_LOGE("Callback is NULL.\n");
1118 __WDC_LOG_FUNC_END__;
1119 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1122 if (client_info->is_registered == false) {
1123 WDC_LOGE("Client is not initialized.\n");
1124 __WDC_LOG_FUNC_END__;
1125 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1128 client_info->connection_cb = cb;
1129 client_info->user_data_for_cb_connection = user_data;
1131 __WDC_LOG_FUNC_END__;
1132 return WIFI_DIRECT_ERROR_NONE;
1136 int wifi_direct_unset_connection_state_changed_cb(void)
1138 __WDC_LOG_FUNC_START__;
1139 wifi_direct_client_info_s *client_info = __wfd_get_control();
1141 if (client_info->is_registered == false) {
1142 WDC_LOGE("Client is not initialized");
1143 __WDC_LOG_FUNC_END__;
1144 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1147 client_info->connection_cb = NULL;
1148 client_info->user_data_for_cb_connection = NULL;
1150 __WDC_LOG_FUNC_END__;
1151 return WIFI_DIRECT_ERROR_NONE;
1155 int wifi_direct_set_client_ip_address_assigned_cb(wifi_direct_client_ip_address_assigned_cb cb,
1158 __WDC_LOG_FUNC_START__;
1159 wifi_direct_client_info_s *client_info = __wfd_get_control();
1162 WDC_LOGE("Callback is NULL");
1163 __WDC_LOG_FUNC_END__;
1164 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1167 if (client_info->is_registered == false) {
1168 WDC_LOGE("Client is not initialized");
1169 __WDC_LOG_FUNC_END__;
1170 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1173 client_info->ip_assigned_cb = cb;
1174 client_info->user_data_for_cb_ip_assigned = user_data;
1176 __WDC_LOG_FUNC_END__;
1177 return WIFI_DIRECT_ERROR_NONE;
1180 int wifi_direct_unset_client_ip_address_assigned_cb(void)
1182 __WDC_LOG_FUNC_START__;
1183 wifi_direct_client_info_s *client_info = __wfd_get_control();
1185 if (client_info->is_registered == false) {
1186 WDC_LOGE("Client is not initialized");
1187 __WDC_LOG_FUNC_END__;
1188 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1191 client_info->ip_assigned_cb = NULL;
1192 client_info->user_data_for_cb_ip_assigned = NULL;
1194 __WDC_LOG_FUNC_END__;
1195 return WIFI_DIRECT_ERROR_NONE;
1199 int wifi_direct_activate(void)
1201 __WDC_LOG_FUNC_START__;
1202 wifi_direct_client_info_s *client_info = __wfd_get_control();
1203 wifi_direct_client_request_s req;
1204 wifi_direct_client_response_s rsp;
1205 int res = WIFI_DIRECT_ERROR_NONE;
1207 if ((client_info->is_registered == false) ||
1208 (client_info->client_id == WFD_INVALID_ID)) {
1209 WDC_LOGE("Client is NOT registered");
1210 __WDC_LOG_FUNC_END__;
1211 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1214 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1215 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1217 req.cmd = WIFI_DIRECT_CMD_ACTIVATE;
1218 req.client_id = client_info->client_id;
1220 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1221 if (res != WIFI_DIRECT_ERROR_NONE) {
1222 __WDC_LOG_FUNC_END__;
1225 WDC_LOGD("wifi_direct_activate() SUCCESS");
1227 __WDC_LOG_FUNC_END__;
1228 return WIFI_DIRECT_ERROR_NONE;
1231 int wifi_direct_deactivate(void)
1233 __WDC_LOG_FUNC_START__;
1234 wifi_direct_client_info_s *client_info = __wfd_get_control();
1235 wifi_direct_client_request_s req;
1236 wifi_direct_client_response_s rsp;
1237 int res = WIFI_DIRECT_ERROR_NONE;
1239 if ((client_info->is_registered == false) ||
1240 (client_info->client_id == WFD_INVALID_ID)) {
1241 WDC_LOGE("Client is NOT registered");
1242 __WDC_LOG_FUNC_END__;
1243 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1246 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1247 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1249 req.cmd = WIFI_DIRECT_CMD_DEACTIVATE;
1250 req.client_id = client_info->client_id;
1252 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1253 if (res != WIFI_DIRECT_ERROR_NONE) {
1254 __WDC_LOG_FUNC_END__;
1257 WDC_LOGD("wifi_direct_deactivate() SUCCESS");
1259 __WDC_LOG_FUNC_END__;
1260 return WIFI_DIRECT_ERROR_NONE;
1263 int wifi_direct_start_discovery(bool listen_only, int timeout)
1265 __WDC_LOG_FUNC_START__;
1266 wifi_direct_client_info_s *client_info = __wfd_get_control();
1267 wifi_direct_client_request_s req;
1268 wifi_direct_client_response_s rsp;
1269 int res = WIFI_DIRECT_ERROR_NONE;
1271 if ((client_info->is_registered == false) ||
1272 (client_info->client_id == WFD_INVALID_ID)) {
1273 WDC_LOGE("Client is NOT registered");
1274 __WDC_LOG_FUNC_END__;
1275 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1279 WDC_LOGE("Nagative value. Param [timeout]!");
1280 __WDC_LOG_FUNC_END__;
1281 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1284 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1285 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1287 req.cmd = WIFI_DIRECT_CMD_START_DISCOVERY;
1288 req.client_id = client_info->client_id;
1289 req.data.int1 = listen_only;
1290 req.data.int2 = timeout;
1291 WDC_LOGE("listen only (%d) timeout (%d)",
1292 listen_only, timeout);
1294 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1295 if (res != WIFI_DIRECT_ERROR_NONE) {
1296 __WDC_LOG_FUNC_END__;
1299 WDC_LOGD("wifi_direct_start_discovery() SUCCESS");
1301 __WDC_LOG_FUNC_END__;
1302 return WIFI_DIRECT_ERROR_NONE;
1305 int wifi_direct_cancel_discovery(void)
1307 __WDC_LOG_FUNC_START__;
1308 wifi_direct_client_info_s *client_info = __wfd_get_control();
1309 wifi_direct_client_request_s req;
1310 wifi_direct_client_response_s rsp;
1311 int res = WIFI_DIRECT_ERROR_NONE;
1313 if ((client_info->is_registered == false) ||
1314 (client_info->client_id == WFD_INVALID_ID)) {
1315 WDC_LOGE("Client is NOT registered");
1316 __WDC_LOG_FUNC_END__;
1317 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1320 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1321 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1323 req.cmd = WIFI_DIRECT_CMD_CANCEL_DISCOVERY;
1324 req.client_id = client_info->client_id;
1326 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1327 if (res != WIFI_DIRECT_ERROR_NONE) {
1328 __WDC_LOG_FUNC_END__;
1331 WDC_LOGD("wifi_direct_cancel_discovery() SUCCESS");
1333 __WDC_LOG_FUNC_END__;
1334 return WIFI_DIRECT_ERROR_NONE;
1337 static char **get_service_list(char *services, unsigned int *count)
1339 __WDC_LOG_FUNC_START__;
1340 char **result = NULL;
1341 char *pos1 = services;
1342 char *pos2 = strdup(services);
1343 unsigned int cnt = 0;
1347 if (!count || !services || (services && strlen(services) <= 0)) {
1348 WDC_LOGE("Invalid parameters.");
1349 __WDC_LOG_FUNC_END__;
1353 pos1 = strtok (pos1,",\n");
1356 pos1 = strtok (NULL, ",\n");
1358 WDC_LOGD("Total Service Count = %d", cnt);
1361 result = (char**) calloc(cnt, sizeof(char *));
1363 WDC_LOGE("Failed to allocate memory for result");
1367 pos2 = strtok (pos2,",\n");
1368 while (pos2 != NULL) {
1369 char *s = strchr(pos2, ' ');
1372 result[i++] = strdup(pos2);
1373 pos2 = strtok (NULL, ",\n");
1385 for (j=0; j<i && result[j] != NULL; j++)
1393 int wifi_direct_get_access_list(wifi_direct_access_list_cb cb,
1396 __WDC_LOG_FUNC_START__;
1397 wifi_direct_client_info_s *client_info = __wfd_get_control();
1398 wifi_direct_client_request_s req;
1399 wifi_direct_client_response_s rsp;
1400 int res = WIFI_DIRECT_ERROR_NONE;
1403 if ((client_info->is_registered == false) ||
1404 (client_info->client_id == WFD_INVALID_ID)) {
1405 WDC_LOGE("Client is NOT registered");
1406 __WDC_LOG_FUNC_END__;
1407 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1411 WDC_LOGE("NULL Param [callback]!");
1412 __WDC_LOG_FUNC_END__;
1413 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1416 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1417 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1419 req.cmd = WIFI_DIRECT_CMD_GET_ACCESS_LIST;
1420 req.client_id = client_info->client_id;
1422 pthread_mutex_lock(&g_client_info.mutex);
1423 res = __wfd_client_write_socket(client_info->sync_sockfd, &req, sizeof(wifi_direct_client_request_s));
1424 if (res != WIFI_DIRECT_ERROR_NONE) {
1425 WDC_LOGE("Failed to write into socket [%s]", __wfd_print_error(res));
1426 __wfd_reset_control();
1427 pthread_mutex_unlock(&g_client_info.mutex);
1428 __WDC_LOG_FUNC_END__;
1429 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1431 WDC_LOGD("Succeeded to send request [%d: %s]", req.cmd, __wfd_client_print_cmd(req.cmd));
1433 res = __wfd_client_read_socket(client_info->sync_sockfd, &rsp, sizeof(wifi_direct_client_response_s));
1435 WDC_LOGE("Failed to read socket [%d]", res);
1436 __wfd_reset_control();
1437 pthread_mutex_unlock(&g_client_info.mutex);
1438 __WDC_LOG_FUNC_END__;
1439 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1441 if (rsp.cmd != req.cmd) {
1442 WDC_LOGE("Invalid resp [%d]", rsp.cmd);
1443 pthread_mutex_unlock(&g_client_info.mutex);
1444 __WDC_LOG_FUNC_END__;
1445 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1448 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
1449 WDC_LOGE("Result received [%s]", __wfd_print_error(rsp.result));
1450 pthread_mutex_unlock(&g_client_info.mutex);
1451 __WDC_LOG_FUNC_END__;
1456 int num = rsp.param1;
1457 wfd_access_list_info_s *buff = NULL;
1459 WDC_LOGD("Num of access list = %d", num);
1462 buff = (wfd_access_list_info_s*) calloc(num, sizeof (wfd_access_list_info_s));
1464 WDC_LOGE("Failed to alloc memory");
1465 pthread_mutex_unlock(&g_client_info.mutex);
1466 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1469 res = __wfd_client_read_socket(client_info->sync_sockfd, (char*) buff,
1470 num * sizeof(wfd_access_list_info_s));
1471 pthread_mutex_unlock(&g_client_info.mutex);
1474 WDC_LOGE("Failed to read socket");
1475 __wfd_reset_control();
1476 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1479 WDC_LOGD("wifi_direct_get_access_list() SUCCESS");
1481 wifi_direct_access_list_info_s access_list;
1483 for (i = 0; i < num; i++) {
1484 memset(&access_list, 0, sizeof(wifi_direct_access_list_info_s));
1485 access_list.device_name = strdup(buff[i].device_name);
1486 access_list.mac_address = (char*) calloc(1, MACSTR_LEN);
1487 snprintf(access_list.mac_address, MACSTR_LEN, MACSTR, MAC2STR(buff[i].mac_address));
1488 access_list.allowed = buff[i].allowed;
1490 if (!cb(&access_list, user_data))
1493 if (access_list.device_name)
1494 free(access_list.device_name);
1495 if (access_list.mac_address)
1496 free(access_list.mac_address);
1502 pthread_mutex_unlock(&g_client_info.mutex);
1505 __WDC_LOG_FUNC_END__;
1506 return WIFI_DIRECT_ERROR_NONE;
1509 int wifi_direct_foreach_discovered_peers(wifi_direct_discovered_peer_cb cb,
1512 __WDC_LOG_FUNC_START__;
1513 wifi_direct_client_info_s *client_info = __wfd_get_control();
1514 wifi_direct_client_request_s req;
1515 wifi_direct_client_response_s rsp;
1516 int res = WIFI_DIRECT_ERROR_NONE;
1519 if ((client_info->is_registered == false) ||
1520 (client_info->client_id == WFD_INVALID_ID)) {
1521 WDC_LOGE("Client is NOT registered");
1522 __WDC_LOG_FUNC_END__;
1523 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1527 WDC_LOGE("NULL Param [callback]!");
1528 __WDC_LOG_FUNC_END__;
1529 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1532 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1533 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1535 req.cmd = WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT;
1536 req.client_id = client_info->client_id;
1538 pthread_mutex_lock(&g_client_info.mutex);
1539 res = __wfd_client_write_socket(client_info->sync_sockfd, &req, sizeof(wifi_direct_client_request_s));
1540 if (res != WIFI_DIRECT_ERROR_NONE) {
1541 WDC_LOGE("Failed to write into socket [%s]", __wfd_print_error(res));
1542 __wfd_reset_control();
1543 pthread_mutex_unlock(&g_client_info.mutex);
1544 __WDC_LOG_FUNC_END__;
1545 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1547 WDC_LOGD("Succeeded to send request [%d: %s]", req.cmd, __wfd_client_print_cmd(req.cmd));
1549 res = __wfd_client_read_socket(client_info->sync_sockfd, &rsp, sizeof(wifi_direct_client_response_s));
1551 WDC_LOGE("Failed to read socket [%d]", res);
1552 __wfd_reset_control();
1553 pthread_mutex_unlock(&g_client_info.mutex);
1554 __WDC_LOG_FUNC_END__;
1555 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1557 if (rsp.cmd != req.cmd) {
1558 WDC_LOGE("Invalid resp [%d]", rsp.cmd);
1559 pthread_mutex_unlock(&g_client_info.mutex);
1560 __WDC_LOG_FUNC_END__;
1561 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1564 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
1565 WDC_LOGE("Result received [%s]", __wfd_print_error(rsp.result));
1566 pthread_mutex_unlock(&g_client_info.mutex);
1567 __WDC_LOG_FUNC_END__;
1572 int num = rsp.param1;
1573 wfd_discovery_entry_s *buff = NULL;
1575 WDC_LOGD("Num of found peers = %d", num);
1578 buff = (wfd_discovery_entry_s*) calloc(num, sizeof (wfd_discovery_entry_s));
1580 WDC_LOGE("Failed to alloc memory");
1581 pthread_mutex_unlock(&g_client_info.mutex);
1582 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1585 res = __wfd_client_read_socket(client_info->sync_sockfd, (char*) buff,
1586 num * sizeof(wfd_discovery_entry_s));
1587 pthread_mutex_unlock(&g_client_info.mutex);
1590 WDC_LOGE("Failed to read socket");
1591 __wfd_reset_control();
1592 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1595 __wfd_client_print_entry_list(buff, num);
1596 WDC_LOGD("wifi_direct_foreach_discovered_peers() SUCCESS");
1598 wifi_direct_discovered_peer_info_s *peer_list;
1600 for (i = 0; i < num; i++) {
1601 peer_list = (wifi_direct_discovered_peer_info_s *) calloc(1, sizeof(wifi_direct_discovered_peer_info_s));
1602 peer_list->device_name = strdup(buff[i].device_name);
1603 peer_list->mac_address = (char*) calloc(1, MACSTR_LEN);
1604 snprintf(peer_list->mac_address, MACSTR_LEN, MACSTR, MAC2STR(buff[i].mac_address));
1605 peer_list->channel = buff[i].channel;
1606 peer_list->is_connected = buff[i].is_connected;
1607 peer_list->is_group_owner = buff[i].is_group_owner;
1608 peer_list->is_persistent_group_owner = buff[i].is_persistent_go;
1609 peer_list->interface_address = (char*) calloc(1, MACSTR_LEN);
1610 snprintf(peer_list->interface_address, MACSTR_LEN, MACSTR, MAC2STR(buff[i].intf_address));
1611 peer_list->supported_wps_types= buff[i].wps_cfg_methods;
1612 peer_list->service_list = get_service_list(buff[i].services, &peer_list->service_count);
1613 peer_list->primary_device_type = buff[i].category;
1614 peer_list->is_wfd_device = buff[i].is_wfd_device;
1616 if (!cb(peer_list, user_data))
1623 pthread_mutex_unlock(&g_client_info.mutex);
1626 __WDC_LOG_FUNC_END__;
1627 return WIFI_DIRECT_ERROR_NONE;
1630 int wifi_direct_connect(const char *mac_address)
1632 __WDC_LOG_FUNC_START__;
1633 wifi_direct_client_info_s *client_info = __wfd_get_control();
1634 unsigned char la_mac_addr[6];
1635 wifi_direct_client_request_s req;
1636 wifi_direct_client_response_s rsp;
1637 int res = WIFI_DIRECT_ERROR_NONE;
1639 if ((client_info->is_registered == false) ||
1640 (client_info->client_id == WFD_INVALID_ID)) {
1641 WDC_LOGE("Client is NOT registered");
1642 __WDC_LOG_FUNC_END__;
1643 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1647 WDC_LOGE("mac_addr is NULL");
1648 __WDC_LOG_FUNC_END__;
1649 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1652 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1653 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1655 req.cmd = WIFI_DIRECT_CMD_CONNECT;
1656 req.client_id = client_info->client_id;
1657 macaddr_atoe(mac_address, la_mac_addr);
1658 memcpy(req.data.mac_addr, la_mac_addr, MACADDR_LEN);
1660 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1661 if (res != WIFI_DIRECT_ERROR_NONE) {
1662 __WDC_LOG_FUNC_END__;
1665 WDC_LOGD("wifi_direct_connect() SUCCESS");
1667 __WDC_LOG_FUNC_END__;
1668 return WIFI_DIRECT_ERROR_NONE;
1671 int wifi_direct_cancel_connection(const char *mac_address)
1673 __WDC_LOG_FUNC_START__;
1674 wifi_direct_client_info_s *client_info = __wfd_get_control();
1675 wifi_direct_client_request_s req;
1676 wifi_direct_client_response_s rsp;
1677 int res = WIFI_DIRECT_ERROR_NONE;
1679 if ((client_info->is_registered == false)
1680 || (client_info->client_id == WFD_INVALID_ID))
1682 WDC_LOGE("Client is NOT registered.");
1683 __WDC_LOG_FUNC_END__;
1684 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1687 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1688 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1690 req.cmd = WIFI_DIRECT_CMD_CANCEL_CONNECTION;
1691 req.client_id = client_info->client_id;
1692 macaddr_atoe(mac_address, req.data.mac_addr);
1694 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1695 if (res != WIFI_DIRECT_ERROR_NONE) {
1696 __WDC_LOG_FUNC_END__;
1699 WDC_LOGD("wifi_direct_cancel_connect() SUCCESS");
1701 __WDC_LOG_FUNC_END__;
1702 return WIFI_DIRECT_ERROR_NONE;
1706 int wifi_direct_reject_connection(const char *mac_address)
1708 __WDC_LOG_FUNC_START__;
1709 wifi_direct_client_info_s *client_info = __wfd_get_control();
1710 wifi_direct_client_request_s req;
1711 wifi_direct_client_response_s rsp;
1712 int res = WIFI_DIRECT_ERROR_NONE;
1714 if ((client_info->is_registered == false) ||
1715 (client_info->client_id == WFD_INVALID_ID)) {
1716 WDC_LOGE("Client is NOT registered");
1717 __WDC_LOG_FUNC_END__;
1718 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1722 WDC_LOGE("mac_addr is NULL");
1723 __WDC_LOG_FUNC_END__;
1724 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1727 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1728 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1730 req.cmd = WIFI_DIRECT_CMD_REJECT_CONNECTION;
1731 req.client_id = client_info->client_id;
1732 macaddr_atoe(mac_address, req.data.mac_addr);
1734 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1735 if (res != WIFI_DIRECT_ERROR_NONE) {
1736 __WDC_LOG_FUNC_END__;
1739 WDC_LOGE("wifi_direct_reject_connection() SUCCESS");
1741 __WDC_LOG_FUNC_END__;
1742 return WIFI_DIRECT_ERROR_NONE;
1746 int wifi_direct_disconnect_all(void)
1748 __WDC_LOG_FUNC_START__;
1749 wifi_direct_client_info_s *client_info = __wfd_get_control();
1750 wifi_direct_client_request_s req;
1751 wifi_direct_client_response_s rsp;
1752 int res = WIFI_DIRECT_ERROR_NONE;
1754 if ((client_info->is_registered == false) ||
1755 (client_info->client_id == WFD_INVALID_ID)) {
1756 WDC_LOGE("Client is NOT registered");
1757 __WDC_LOG_FUNC_END__;
1758 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1761 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1762 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1764 req.cmd = WIFI_DIRECT_CMD_DISCONNECT_ALL;
1765 req.client_id = client_info->client_id;
1767 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1768 if (res != WIFI_DIRECT_ERROR_NONE) {
1769 __WDC_LOG_FUNC_END__;
1772 WDC_LOGE("wifi_direct_disconnect_all() SUCCESS");
1774 __WDC_LOG_FUNC_END__;
1775 return WIFI_DIRECT_ERROR_NONE;
1779 int wifi_direct_disconnect(const char *mac_address)
1781 __WDC_LOG_FUNC_START__;
1782 wifi_direct_client_info_s *client_info = __wfd_get_control();
1783 unsigned char la_mac_addr[6];
1784 wifi_direct_client_request_s req;
1785 wifi_direct_client_response_s rsp;
1786 int res = WIFI_DIRECT_ERROR_NONE;
1788 if ((client_info->is_registered == false) ||
1789 (client_info->client_id == WFD_INVALID_ID)) {
1790 WDC_LOGE("Client is NOT registered");
1791 __WDC_LOG_FUNC_END__;
1792 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1796 WDC_LOGE("mac_address is NULL");
1797 __WDC_LOG_FUNC_END__;
1798 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1801 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1802 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1804 req.cmd = WIFI_DIRECT_CMD_DISCONNECT;
1805 req.client_id = client_info->client_id;
1806 macaddr_atoe(mac_address, la_mac_addr);
1807 memcpy(req.data.mac_addr, la_mac_addr, 6);
1809 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1810 if (res != WIFI_DIRECT_ERROR_NONE) {
1811 __WDC_LOG_FUNC_END__;
1814 WDC_LOGE("wifi_direct_disconnect() SUCCESS");
1816 __WDC_LOG_FUNC_END__;
1817 return WIFI_DIRECT_ERROR_NONE;
1821 int wifi_direct_accept_connection(char *mac_address)
1823 __WDC_LOG_FUNC_START__;
1824 wifi_direct_client_info_s *client_info = __wfd_get_control();
1825 unsigned char la_mac_addr[6];
1826 wifi_direct_client_request_s req;
1827 wifi_direct_client_response_s rsp;
1828 int res = WIFI_DIRECT_ERROR_NONE;
1830 if ((client_info->is_registered == false) ||
1831 (client_info->client_id == WFD_INVALID_ID)) {
1832 WDC_LOGE("Client is NOT registered");
1833 __WDC_LOG_FUNC_END__;
1834 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1838 WDC_LOGE("mac_addr is NULL");
1839 __WDC_LOG_FUNC_END__;
1840 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1843 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1844 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1846 req.cmd = WIFI_DIRECT_CMD_SEND_CONNECT_REQ;
1847 req.client_id = client_info->client_id;
1848 macaddr_atoe(mac_address, la_mac_addr);
1849 memcpy(req.data.mac_addr, la_mac_addr, 6);
1851 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
1852 if (res != WIFI_DIRECT_ERROR_NONE) {
1853 __WDC_LOG_FUNC_END__;
1856 WDC_LOGE("wifi_direct_connect() SUCCESS \n");
1858 __WDC_LOG_FUNC_END__;
1859 return WIFI_DIRECT_ERROR_NONE;
1863 int wifi_direct_foreach_connected_peers(wifi_direct_connected_peer_cb cb,
1866 __WDC_LOG_FUNC_START__;
1867 wifi_direct_client_info_s *client_info = __wfd_get_control();
1868 wifi_direct_client_request_s req;
1869 wifi_direct_client_response_s rsp;
1870 int res = WIFI_DIRECT_ERROR_NONE;
1873 if ((client_info->is_registered == false) ||
1874 (client_info->client_id == WFD_INVALID_ID)) {
1875 WDC_LOGE("Client is NOT registered");
1876 __WDC_LOG_FUNC_END__;
1877 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1881 WDC_LOGE("NULL Param [callback]!");
1882 __WDC_LOG_FUNC_END__;
1883 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1886 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1887 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
1889 req.cmd = WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO;
1890 req.client_id = client_info->client_id;
1892 pthread_mutex_lock(&g_client_info.mutex);
1893 res = __wfd_client_write_socket(client_info->sync_sockfd, &req, sizeof(wifi_direct_client_request_s));
1894 if (res != WIFI_DIRECT_ERROR_NONE) {
1895 WDC_LOGE("Failed to write into socket [%s]", __wfd_print_error(res));
1896 __wfd_reset_control();
1897 pthread_mutex_unlock(&g_client_info.mutex);
1898 __WDC_LOG_FUNC_END__;
1899 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1901 WDC_LOGD("Succeeded to send request [%d: %s]", req.cmd, __wfd_client_print_cmd(req.cmd));
1903 res = __wfd_client_read_socket(client_info->sync_sockfd, &rsp, sizeof(wifi_direct_client_response_s));
1905 WDC_LOGE("Failed to read socket [%d]", res);
1906 __wfd_reset_control();
1907 pthread_mutex_unlock(&g_client_info.mutex);
1908 __WDC_LOG_FUNC_END__;
1909 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1911 if (rsp.cmd != req.cmd) {
1912 WDC_LOGE("Invalid resp [%d]", rsp.cmd);
1913 pthread_mutex_unlock(&g_client_info.mutex);
1914 __WDC_LOG_FUNC_END__;
1915 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
1918 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
1919 WDC_LOGE("Result received [%s]", __wfd_print_error(rsp.result));
1920 pthread_mutex_unlock(&g_client_info.mutex);
1921 __WDC_LOG_FUNC_END__;
1926 int num = rsp.param1;
1927 wfd_connected_peer_info_s *buff = NULL;
1929 WDC_LOGD("Num of connected peers = %d", (int) rsp.param1);
1932 buff = (wfd_connected_peer_info_s*) calloc(num, sizeof(wfd_connected_peer_info_s));
1934 WDC_LOGF("malloc() failed!!!");
1935 pthread_mutex_unlock(&g_client_info.mutex);
1936 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1939 res= __wfd_client_read_socket(client_info->sync_sockfd, (char*) buff,
1940 num * sizeof(wfd_connected_peer_info_s));
1941 pthread_mutex_unlock(&g_client_info.mutex);
1944 WDC_LOGE("socket read error");
1945 __wfd_reset_control();
1946 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1949 __wfd_client_print_connected_peer_info(buff, num);
1950 WDC_LOGD("wifi_direct_foreach_connected_peers() SUCCESS");
1952 wifi_direct_connected_peer_info_s *peer_list = NULL;
1954 for (i = 0; i < num; i++) {
1955 peer_list = (wifi_direct_connected_peer_info_s *) calloc(1, sizeof(wifi_direct_connected_peer_info_s));
1956 peer_list->device_name = strdup(buff[i].device_name);
1957 peer_list->ip_address= (char*) calloc(1, IPSTR_LEN);
1958 snprintf(peer_list->ip_address, IPSTR_LEN, IPSTR, IP2STR(buff[i].ip_address));
1959 peer_list->mac_address = (char*) calloc(1, MACSTR_LEN);
1960 snprintf(peer_list->mac_address, MACSTR_LEN, MACSTR, MAC2STR(buff[i].mac_address));
1961 peer_list->interface_address = (char*) calloc(1, MACSTR_LEN);
1962 snprintf(peer_list->interface_address, MACSTR_LEN, MACSTR, MAC2STR(buff[i].intf_address));
1963 peer_list->p2p_supported = buff[i].is_p2p;
1964 peer_list->primary_device_type = buff[i].category;
1965 peer_list->channel = buff[i].channel;
1966 peer_list->service_list = get_service_list(buff[i].services, &peer_list->service_count);
1968 if (!cb(peer_list, user_data))
1974 pthread_mutex_unlock(&g_client_info.mutex);
1977 __WDC_LOG_FUNC_END__;
1978 return WIFI_DIRECT_ERROR_NONE;
1982 int wifi_direct_create_group(void)
1984 __WDC_LOG_FUNC_START__;
1985 wifi_direct_client_info_s *client_info = __wfd_get_control();
1986 wifi_direct_client_request_s req;
1987 wifi_direct_client_response_s rsp;
1988 int res = WIFI_DIRECT_ERROR_NONE;
1990 if ((client_info->is_registered == false) ||
1991 (client_info->client_id == WFD_INVALID_ID)) {
1992 WDC_LOGE("Client is NOT registered");
1993 __WDC_LOG_FUNC_END__;
1994 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
1997 memset(&req, 0, sizeof(wifi_direct_client_request_s));
1998 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2000 req.cmd = WIFI_DIRECT_CMD_CREATE_GROUP;
2001 req.client_id = client_info->client_id;
2003 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2004 if (res != WIFI_DIRECT_ERROR_NONE) {
2005 __WDC_LOG_FUNC_END__;
2008 WDC_LOGE("wifi_direct_create_group() SUCCESS \n");
2010 __WDC_LOG_FUNC_END__;
2011 return WIFI_DIRECT_ERROR_NONE;
2015 int wifi_direct_destroy_group(void)
2017 __WDC_LOG_FUNC_START__;
2018 wifi_direct_client_info_s *client_info = __wfd_get_control();
2019 wifi_direct_client_request_s req;
2020 wifi_direct_client_response_s rsp;
2021 int res = WIFI_DIRECT_ERROR_NONE;
2023 if ((client_info->is_registered == false) ||
2024 (client_info->client_id == WFD_INVALID_ID)) {
2025 WDC_LOGE("Client is NOT registered");
2026 __WDC_LOG_FUNC_END__;
2027 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2030 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2031 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2033 req.cmd = WIFI_DIRECT_CMD_DESTROY_GROUP;
2034 req.client_id = client_info->client_id;
2036 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2037 if (res != WIFI_DIRECT_ERROR_NONE) {
2038 __WDC_LOG_FUNC_END__;
2041 WDC_LOGE("wifi_direct_destroy_group() SUCCESS");
2043 __WDC_LOG_FUNC_END__;
2044 return WIFI_DIRECT_ERROR_NONE;
2048 int wifi_direct_is_group_owner(bool *owner)
2050 __WDC_LOG_FUNC_START__;
2051 wifi_direct_client_info_s *client_info = __wfd_get_control();
2052 wifi_direct_client_request_s req;
2053 wifi_direct_client_response_s rsp;
2054 int res = WIFI_DIRECT_ERROR_NONE;
2056 if ((client_info->is_registered == false) ||
2057 (client_info->client_id == WFD_INVALID_ID)) {
2058 WDC_LOGE("Client is NOT registered");
2059 __WDC_LOG_FUNC_END__;
2060 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2064 WDC_LOGE("NULL Param [owner]!");
2065 __WDC_LOG_FUNC_END__;
2066 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2069 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2070 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2072 req.cmd = WIFI_DIRECT_CMD_IS_GROUPOWNER;
2073 req.client_id = client_info->client_id;
2075 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2076 if (res != WIFI_DIRECT_ERROR_NONE) {
2077 __WDC_LOG_FUNC_END__;
2080 WDC_LOGD("wifi_direct_is_group_owner() SUCCESS");
2081 *owner = (bool) rsp.param1;
2083 __WDC_LOG_FUNC_END__;
2084 return WIFI_DIRECT_ERROR_NONE;
2087 int wifi_direct_is_autonomous_group(bool *autonomous_group)
2089 __WDC_LOG_FUNC_START__;
2090 wifi_direct_client_info_s *client_info = __wfd_get_control();
2091 wifi_direct_client_request_s req;
2092 wifi_direct_client_response_s rsp;
2093 int res = WIFI_DIRECT_ERROR_NONE;
2095 if ((client_info->is_registered == false) ||
2096 (client_info->client_id == WFD_INVALID_ID)) {
2097 WDC_LOGE("Client is NOT registered");
2098 __WDC_LOG_FUNC_END__;
2099 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2102 if (!autonomous_group) {
2103 WDC_LOGE("NULL Param [autonomous_group]!\n");
2104 __WDC_LOG_FUNC_END__;
2105 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2108 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2109 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2111 req.cmd = WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP;
2112 req.client_id = client_info->client_id;
2114 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2115 if (res != WIFI_DIRECT_ERROR_NONE) {
2116 __WDC_LOG_FUNC_END__;
2119 WDC_LOGD("wifi_direct_is_autonomous_group() SUCCESS");
2120 *autonomous_group = (bool) rsp.param1;
2122 __WDC_LOG_FUNC_END__;
2123 return WIFI_DIRECT_ERROR_NONE;
2127 int wifi_direct_set_group_owner_intent(int intent)
2129 __WDC_LOG_FUNC_START__;
2130 wifi_direct_client_info_s *client_info = __wfd_get_control();
2131 wifi_direct_client_request_s req;
2132 wifi_direct_client_response_s rsp;
2133 int res = WIFI_DIRECT_ERROR_NONE;
2135 if ((client_info->is_registered == false) ||
2136 (client_info->client_id == WFD_INVALID_ID)) {
2137 WDC_LOGE("Client is NOT registered");
2138 __WDC_LOG_FUNC_END__;
2139 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2142 if (intent < 0 || intent > 15) {
2143 WDC_LOGE("Invalid Param : intent[%d]", intent);
2144 __WDC_LOG_FUNC_END__;
2145 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2148 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2149 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2151 req.cmd = WIFI_DIRECT_CMD_SET_GO_INTENT;
2152 req.client_id = client_info->client_id;
2153 req.data.int1 = intent;
2155 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2156 if (res != WIFI_DIRECT_ERROR_NONE) {
2157 __WDC_LOG_FUNC_END__;
2160 WDC_LOGD("wifi_direct_set_group_owner_intent() SUCCESS");
2162 __WDC_LOG_FUNC_END__;
2163 return WIFI_DIRECT_ERROR_NONE;
2166 int wifi_direct_get_group_owner_intent(int *intent)
2168 __WDC_LOG_FUNC_START__;
2169 wifi_direct_client_info_s *client_info = __wfd_get_control();
2170 wifi_direct_client_request_s req;
2171 wifi_direct_client_response_s rsp;
2172 int res = WIFI_DIRECT_ERROR_NONE;
2174 if ((client_info->is_registered == false) ||
2175 (client_info->client_id == WFD_INVALID_ID)) {
2176 WDC_LOGE("Client is NOT registered");
2177 __WDC_LOG_FUNC_END__;
2178 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2182 WDC_LOGE("Invalid Parameter");
2183 __WDC_LOG_FUNC_END__;
2184 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2187 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2188 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2190 req.cmd = WIFI_DIRECT_CMD_GET_GO_INTENT;
2191 req.client_id = client_info->client_id;
2193 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2194 if (res != WIFI_DIRECT_ERROR_NONE) {
2195 __WDC_LOG_FUNC_END__;
2198 WDC_LOGD("int wifi_direct_get_group_owner_intent() intent[%d] SUCCESS", rsp.param1);
2199 *intent = rsp.param1;
2201 __WDC_LOG_FUNC_END__;
2202 return WIFI_DIRECT_ERROR_NONE;
2205 int wifi_direct_set_max_clients(int max)
2207 __WDC_LOG_FUNC_START__;
2208 wifi_direct_client_info_s *client_info = __wfd_get_control();
2209 wifi_direct_client_request_s req;
2210 wifi_direct_client_response_s rsp;
2211 int res = WIFI_DIRECT_ERROR_NONE;
2213 if ((client_info->is_registered == false) ||
2214 (client_info->client_id == WFD_INVALID_ID)) {
2215 WDC_LOGE("Client is NOT registered");
2216 __WDC_LOG_FUNC_END__;
2217 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2219 WDC_LOGD("max client [%d]\n", max);
2221 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2222 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2224 req.cmd = WIFI_DIRECT_CMD_SET_MAX_CLIENT;
2225 req.client_id = client_info->client_id;
2226 req.data.int1 = max;
2228 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2229 if (res != WIFI_DIRECT_ERROR_NONE) {
2230 __WDC_LOG_FUNC_END__;
2233 WDC_LOGD("int wifi_direct_set_max_clients() SUCCESS");
2235 __WDC_LOG_FUNC_END__;
2236 return WIFI_DIRECT_ERROR_NONE;
2239 int wifi_direct_get_max_clients(int *max)
2241 __WDC_LOG_FUNC_START__;
2242 wifi_direct_client_info_s *client_info = __wfd_get_control();
2243 wifi_direct_client_request_s req;
2244 wifi_direct_client_response_s rsp;
2245 int res = WIFI_DIRECT_ERROR_NONE;
2247 if ((client_info->is_registered == false) ||
2248 (client_info->client_id == WFD_INVALID_ID)) {
2249 WDC_LOGE("Client is NOT registered");
2250 __WDC_LOG_FUNC_END__;
2251 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2255 WDC_LOGE("Invalid Parameter");
2256 __WDC_LOG_FUNC_END__;
2257 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2260 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2261 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2263 req.cmd = WIFI_DIRECT_CMD_GET_MAX_CLIENT;
2264 req.client_id = client_info->client_id;
2266 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2267 if (res != WIFI_DIRECT_ERROR_NONE) {
2268 __WDC_LOG_FUNC_END__;
2271 WDC_LOGD("int wifi_direct_get_max_clients() max_client[%d] SUCCESS", rsp.param1);
2274 __WDC_LOG_FUNC_END__;
2275 return WIFI_DIRECT_ERROR_NONE;
2278 int wifi_direct_get_operating_channel(int *channel)
2280 __WDC_LOG_FUNC_START__;
2281 wifi_direct_client_info_s *client_info = __wfd_get_control();
2282 wifi_direct_client_request_s req;
2283 wifi_direct_client_response_s rsp;
2284 int res = WIFI_DIRECT_ERROR_NONE;
2286 if ((client_info->is_registered == false) ||
2287 (client_info->client_id == WFD_INVALID_ID)) {
2288 WDC_LOGE("Client is NOT registered");
2289 __WDC_LOG_FUNC_END__;
2290 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2294 WDC_LOGE("NULL Param [channel]!\n");
2295 __WDC_LOG_FUNC_END__;
2296 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2299 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2300 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2302 req.cmd = WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL;
2303 req.client_id = client_info->client_id;
2305 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2306 if (res != WIFI_DIRECT_ERROR_NONE) {
2307 __WDC_LOG_FUNC_END__;
2310 WDC_LOGD("channel = [%d]", (int) rsp.param1);
2311 *channel = rsp.param1;
2313 __WDC_LOG_FUNC_END__;
2315 return WIFI_DIRECT_ERROR_NONE;
2320 int wifi_direct_get_passphrase(char** passphrase)
2322 __WDC_LOG_FUNC_START__;
2323 wifi_direct_client_info_s *client_info = __wfd_get_control();
2324 wifi_direct_client_request_s req;
2325 wifi_direct_client_response_s rsp;
2326 char la_passphrase[WIFI_DIRECT_WPA_LEN+1] = {0,};
2327 int res = WIFI_DIRECT_ERROR_NONE;
2329 if ((client_info->is_registered == false) ||
2330 (client_info->client_id == WFD_INVALID_ID)) {
2331 WDC_LOGE("Client is NOT registered.");
2332 __WDC_LOG_FUNC_END__;
2333 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2337 WDC_LOGE("NULL Param [passphrase]!");
2338 __WDC_LOG_FUNC_END__;
2339 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2342 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2343 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2345 req.cmd = WIFI_DIRECT_CMD_GET_PASSPHRASE;
2346 req.client_id = client_info->client_id;
2348 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2349 if (res != WIFI_DIRECT_ERROR_NONE) {
2350 __WDC_LOG_FUNC_END__;
2354 WDC_LOGD("wifi_direct_get_wpa_passphrase() SUCCESS");
2355 strncpy(la_passphrase, rsp.param2, WIFI_DIRECT_WPA_LEN);
2356 la_passphrase[WIFI_DIRECT_WPA_LEN] = '\0';
2357 *passphrase = strdup(la_passphrase);
2359 __WDC_LOG_FUNC_END__;
2360 return WIFI_DIRECT_ERROR_NONE;
2363 int wifi_direct_set_wpa_passphrase(char *passphrase)
2365 __WDC_LOG_FUNC_START__;
2366 wifi_direct_client_info_s *client_info = __wfd_get_control();
2367 wifi_direct_client_request_s req;
2368 wifi_direct_client_response_s rsp;
2369 int status = WIFI_DIRECT_ERROR_NONE;
2371 if ((client_info->is_registered == false) ||
2372 (client_info->client_id == WFD_INVALID_ID)) {
2373 WDC_LOGE("Client is NOT registered.");
2374 __WDC_LOG_FUNC_END__;
2375 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2379 WDC_LOGE("NULL Param [passphrase]!");
2380 __WDC_LOG_FUNC_END__;
2381 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2383 WDC_LOGD("passphrase = [%s]", passphrase);
2385 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2386 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2388 req.cmd = WIFI_DIRECT_CMD_SET_WPA;
2389 req.client_id = client_info->client_id;
2390 req.cmd_data_len = 64;
2392 pthread_mutex_lock(&g_client_info.mutex);
2393 status = __wfd_client_write_socket(client_info->sync_sockfd, &req,
2394 sizeof(wifi_direct_client_request_s));
2395 if (status != WIFI_DIRECT_ERROR_NONE) {
2396 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(status));
2397 __wfd_reset_control();
2398 pthread_mutex_unlock(&g_client_info.mutex);
2399 __WDC_LOG_FUNC_END__;
2400 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2402 WDC_LOGD("writing msg hdr is success!");
2404 status = __wfd_client_write_socket(client_info->sync_sockfd, passphrase, req.cmd_data_len);
2405 if (status != WIFI_DIRECT_ERROR_NONE) {
2406 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(status));
2407 __wfd_reset_control();
2408 pthread_mutex_unlock(&g_client_info.mutex);
2409 __WDC_LOG_FUNC_END__;
2410 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2413 status = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
2414 sizeof(wifi_direct_client_response_s));
2415 pthread_mutex_unlock(&g_client_info.mutex);
2417 WDC_LOGE("Error!!! reading socket, status = %d", status);
2418 __wfd_reset_control();
2419 __WDC_LOG_FUNC_END__;
2420 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2422 if (rsp.cmd == WIFI_DIRECT_CMD_SET_WPA) {
2423 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
2424 WDC_LOGE("Error!!! Result received = %d", rsp.result);
2425 WDC_LOGE("Error!!! [%s]", __wfd_print_error(rsp.result));
2426 __WDC_LOG_FUNC_END__;
2430 WDC_LOGE("Error!!! Invalid resp cmd = %d", rsp.cmd);
2431 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
2435 __WDC_LOG_FUNC_END__;
2436 return WIFI_DIRECT_ERROR_NONE;
2439 int wifi_direct_activate_pushbutton(void)
2441 __WDC_LOG_FUNC_START__;
2442 wifi_direct_client_info_s *client_info = __wfd_get_control();
2443 wifi_direct_client_request_s req;
2444 wifi_direct_client_response_s rsp;
2445 int res = WIFI_DIRECT_ERROR_NONE;
2447 if ((client_info->is_registered == false) ||
2448 (client_info->client_id == WFD_INVALID_ID)) {
2449 WDC_LOGE("Client is NOT registered");
2450 __WDC_LOG_FUNC_END__;
2451 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2454 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2455 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2457 req.cmd = WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON;
2458 req.client_id = client_info->client_id;
2460 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2461 if (res != WIFI_DIRECT_ERROR_NONE) {
2462 __WDC_LOG_FUNC_END__;
2465 WDC_LOGD("wifi_direct_activate_pushbutton() SUCCESS");
2467 __WDC_LOG_FUNC_END__;
2468 return WIFI_DIRECT_ERROR_NONE;
2471 int wifi_direct_set_wps_pin(char *pin)
2473 __WDC_LOG_FUNC_START__;
2474 wifi_direct_client_info_s *client_info = __wfd_get_control();
2475 wifi_direct_client_request_s req;
2476 wifi_direct_client_response_s rsp;
2477 int status = WIFI_DIRECT_ERROR_NONE;
2479 if ((client_info->is_registered == false) ||
2480 (client_info->client_id == WFD_INVALID_ID)) {
2481 WDC_LOGE("Client is NOT registered");
2482 __WDC_LOG_FUNC_END__;
2483 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2487 WDC_LOGE("NULL Param [pin]!");
2488 __WDC_LOG_FUNC_END__;
2489 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2491 WDC_LOGE("pin = [%s]\n", pin);
2493 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2494 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2496 req.cmd = WIFI_DIRECT_CMD_SET_WPS_PIN;
2497 req.client_id = client_info->client_id;
2498 req.cmd_data_len = WIFI_DIRECT_WPS_PIN_LEN+1;
2500 pthread_mutex_lock(&g_client_info.mutex);
2501 status = __wfd_client_write_socket(client_info->sync_sockfd, &req,
2502 sizeof(wifi_direct_client_request_s));
2503 if (status != WIFI_DIRECT_ERROR_NONE) {
2504 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(status));
2505 __wfd_reset_control();
2506 pthread_mutex_unlock(&g_client_info.mutex);
2507 __WDC_LOG_FUNC_END__;
2508 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2510 WDC_LOGD("writing msg hdr is success!\n");
2512 status = __wfd_client_write_socket(client_info->sync_sockfd, pin,
2513 WIFI_DIRECT_WPS_PIN_LEN);
2514 if (status != WIFI_DIRECT_ERROR_NONE) {
2515 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(status));
2516 __wfd_reset_control();
2517 pthread_mutex_unlock(&g_client_info.mutex);
2518 __WDC_LOG_FUNC_END__;
2519 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2522 status = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
2523 sizeof(wifi_direct_client_response_s));
2524 pthread_mutex_unlock(&g_client_info.mutex);
2526 WDC_LOGE("Error!!! reading socket, status = %d", status);
2527 __wfd_reset_control();
2528 __WDC_LOG_FUNC_END__;
2529 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2531 if (rsp.cmd == WIFI_DIRECT_CMD_SET_WPS_PIN) {
2532 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
2533 WDC_LOGD("Error!!! Result received = %d", rsp.result);
2534 WDC_LOGD("Error!!! [%s]", __wfd_print_error(rsp.result));
2535 __WDC_LOG_FUNC_END__;
2539 WDC_LOGE("Error!!! Invalid resp cmd = %d", rsp.cmd);
2540 __WDC_LOG_FUNC_END__;
2541 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
2545 __WDC_LOG_FUNC_END__;
2546 return WIFI_DIRECT_ERROR_NONE;
2550 int wifi_direct_get_wps_pin(char **pin)
2552 __WDC_LOG_FUNC_START__;
2553 wifi_direct_client_info_s *client_info = __wfd_get_control();
2554 wifi_direct_client_request_s req;
2555 wifi_direct_client_response_s rsp;
2556 char la_pin[WIFI_DIRECT_WPS_PIN_LEN + 1] = { 0, };
2557 int res = WIFI_DIRECT_ERROR_NONE;
2559 if ((client_info->is_registered == false) ||
2560 (client_info->client_id == WFD_INVALID_ID)) {
2561 WDC_LOGE("Client is NOT registered");
2562 __WDC_LOG_FUNC_END__;
2563 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2566 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2567 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2569 req.cmd = WIFI_DIRECT_CMD_GET_WPS_PIN;
2570 req.client_id = client_info->client_id;
2572 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2573 if (res != WIFI_DIRECT_ERROR_NONE) {
2574 __WDC_LOG_FUNC_END__;
2577 WDC_LOGD("wifi_direct_get_wps_pin() SUCCESS");
2578 strncpy(la_pin, rsp.param2, WIFI_DIRECT_WPS_PIN_LEN);
2579 la_pin[WIFI_DIRECT_WPS_PIN_LEN] = '\0';
2580 *pin = strdup(la_pin);
2582 __WDC_LOG_FUNC_END__;
2583 return WIFI_DIRECT_ERROR_NONE;
2586 int wifi_direct_generate_wps_pin(void)
2588 __WDC_LOG_FUNC_START__;
2589 wifi_direct_client_info_s *client_info = __wfd_get_control();
2590 wifi_direct_client_request_s req;
2591 wifi_direct_client_response_s rsp;
2592 int res = WIFI_DIRECT_ERROR_NONE;
2594 if ((client_info->is_registered == false) ||
2595 (client_info->client_id == WFD_INVALID_ID)) {
2596 WDC_LOGE("Client is NOT registered");
2597 __WDC_LOG_FUNC_END__;
2598 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2601 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2602 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2604 req.cmd = WIFI_DIRECT_CMD_GENERATE_WPS_PIN;
2605 req.client_id = client_info->client_id;
2607 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2608 if (res != WIFI_DIRECT_ERROR_NONE) {
2609 __WDC_LOG_FUNC_END__;
2612 WDC_LOGD("wifi_direct_generate_wps_pin() SUCCESS");
2614 __WDC_LOG_FUNC_END__;
2615 return WIFI_DIRECT_ERROR_NONE;
2619 int wifi_direct_get_supported_wps_mode(int *wps_mode)
2621 __WDC_LOG_FUNC_START__;
2622 wifi_direct_client_info_s *client_info = __wfd_get_control();
2623 wifi_direct_client_request_s req;
2624 wifi_direct_client_response_s rsp;
2625 int res = WIFI_DIRECT_ERROR_NONE;
2627 if ((client_info->is_registered == false) ||
2628 (client_info->client_id == WFD_INVALID_ID)) {
2629 WDC_LOGE("Client is NOT registered");
2630 __WDC_LOG_FUNC_END__;
2631 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2634 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2635 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2637 req.cmd = WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE;
2638 req.client_id = client_info->client_id;
2640 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2641 if (res != WIFI_DIRECT_ERROR_NONE) {
2642 __WDC_LOG_FUNC_END__;
2645 WDC_LOGD("Supported wps config = [%d]", (int) rsp.param1);
2646 *wps_mode = rsp.param1;
2648 __WDC_LOG_FUNC_END__;
2649 return WIFI_DIRECT_ERROR_NONE;
2652 int wifi_direct_foreach_supported_wps_types(wifi_direct_supported_wps_type_cb cb, void* user_data)
2654 __WDC_LOG_FUNC_START__;
2655 wifi_direct_client_info_s *client_info = __wfd_get_control();
2656 wifi_direct_client_request_s req;
2657 wifi_direct_client_response_s rsp;
2658 int res = WIFI_DIRECT_ERROR_NONE;
2660 if ((client_info->is_registered == false) ||
2661 (client_info->client_id == WFD_INVALID_ID)) {
2662 WDC_LOGE("Client is NOT registered");
2663 __WDC_LOG_FUNC_END__;
2664 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2668 WDC_LOGE("NULL Param [callback]!");
2669 __WDC_LOG_FUNC_END__;
2670 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2673 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2674 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2676 req.cmd = WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE;
2677 req.client_id = client_info->client_id;
2679 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2680 if (res != WIFI_DIRECT_ERROR_NONE) {
2681 __WDC_LOG_FUNC_END__;
2684 WDC_LOGD("Supported wps config = [%d]", (int) rsp.param1);
2689 wps_mode = rsp.param1;
2690 if (wps_mode & WIFI_DIRECT_WPS_TYPE_PBC)
2691 result = cb(WIFI_DIRECT_WPS_TYPE_PBC, user_data);
2692 if ((result == true) && (wps_mode & WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY))
2693 result = cb(WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY, user_data);
2694 if ((result == true) && (wps_mode & WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD))
2695 result = cb(WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD, user_data);
2697 __WDC_LOG_FUNC_END__;
2698 return WIFI_DIRECT_ERROR_NONE;
2701 int wifi_direct_get_local_wps_type(wifi_direct_wps_type_e *type)
2703 __WDC_LOG_FUNC_START__;
2704 wifi_direct_client_info_s *client_info = __wfd_get_control();
2705 wifi_direct_client_request_s req;
2706 wifi_direct_client_response_s rsp;
2707 int res = WIFI_DIRECT_ERROR_NONE;
2709 if ((client_info->is_registered == false) ||
2710 (client_info->client_id == WFD_INVALID_ID)) {
2711 WDC_LOGE("Client is NOT registered");
2712 __WDC_LOG_FUNC_END__;
2713 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2717 WDC_LOGE("NULL Param [type]!\n");
2718 __WDC_LOG_FUNC_END__;
2719 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2722 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2723 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2725 req.cmd = WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE;
2726 req.client_id = client_info->client_id;
2728 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2729 if (res != WIFI_DIRECT_ERROR_NONE) {
2730 __WDC_LOG_FUNC_END__;
2733 WDC_LOGD("wifi_direct_get_wps_type() SUCCESS");
2736 __WDC_LOG_FUNC_END__;
2737 return WIFI_DIRECT_ERROR_NONE;
2740 int wifi_direct_set_req_wps_type(wifi_direct_wps_type_e type)
2742 __WDC_LOG_FUNC_START__;
2743 wifi_direct_client_info_s *client_info = __wfd_get_control();
2744 wifi_direct_client_request_s req;
2745 wifi_direct_client_response_s rsp;
2746 int res = WIFI_DIRECT_ERROR_NONE;
2748 if ((client_info->is_registered == false) ||
2749 (client_info->client_id == WFD_INVALID_ID)) {
2750 WDC_LOGE("Client is NOT registered");
2751 __WDC_LOG_FUNC_END__;
2752 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2755 if (type == WIFI_DIRECT_WPS_TYPE_PBC ||
2756 type == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY ||
2757 type == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
2758 WDC_LOGD("Param wps_mode [%d]", type);
2760 WDC_LOGE("Invalid Param [wps_mode]!");
2761 __WDC_LOG_FUNC_END__;
2762 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2765 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2766 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2768 req.cmd = WIFI_DIRECT_CMD_SET_REQ_WPS_MODE;
2769 req.client_id = client_info->client_id;
2770 req.data.int1 = type;
2772 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2773 if (res != WIFI_DIRECT_ERROR_NONE) {
2774 __WDC_LOG_FUNC_END__;
2777 WDC_LOGD("wifi_direct_set_req_wps_type() SUCCESS");
2779 __WDC_LOG_FUNC_END__;
2780 return WIFI_DIRECT_ERROR_NONE;
2783 int wifi_direct_get_req_wps_type(wifi_direct_wps_type_e *type)
2785 __WDC_LOG_FUNC_START__;
2786 wifi_direct_client_info_s *client_info = __wfd_get_control();
2787 wifi_direct_client_request_s req;
2788 wifi_direct_client_response_s rsp;
2789 int res = WIFI_DIRECT_ERROR_NONE;
2791 if ((client_info->is_registered == false) ||
2792 (client_info->client_id == WFD_INVALID_ID)) {
2793 WDC_LOGE("Client is NOT registered");
2794 __WDC_LOG_FUNC_END__;
2795 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2799 WDC_LOGE("NULL Param [type]!\n");
2800 __WDC_LOG_FUNC_END__;
2801 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2804 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2805 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2807 req.cmd = WIFI_DIRECT_CMD_GET_REQ_WPS_MODE;
2808 req.client_id = client_info->client_id;
2810 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2811 if (res != WIFI_DIRECT_ERROR_NONE) {
2812 __WDC_LOG_FUNC_END__;
2815 WDC_LOGD("wifi_direct_get_req_wps_type() SUCCESS");
2818 __WDC_LOG_FUNC_END__;
2819 return WIFI_DIRECT_ERROR_NONE;
2823 int wifi_direct_set_ssid(const char *ssid)
2825 __WDC_LOG_FUNC_START__;
2826 wifi_direct_client_info_s *client_info = __wfd_get_control();
2827 wifi_direct_client_request_s req;
2828 wifi_direct_client_response_s rsp;
2829 int res = WIFI_DIRECT_ERROR_NONE;
2831 if ((client_info->is_registered == false) ||
2832 (client_info->client_id == WFD_INVALID_ID)) {
2833 WDC_LOGE("Client is NOT registered");
2834 __WDC_LOG_FUNC_END__;
2835 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2839 WDC_LOGE("NULL Param [ssid]!");
2840 __WDC_LOG_FUNC_END__;
2841 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2843 WDC_LOGE("ssid = [%s]", ssid);
2845 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2846 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2848 req.cmd = WIFI_DIRECT_CMD_SET_SSID;
2849 req.client_id = client_info->client_id;
2851 pthread_mutex_lock(&g_client_info.mutex);
2852 res = __wfd_client_write_socket(client_info->sync_sockfd, &req,
2853 sizeof(wifi_direct_client_request_s));
2854 if (res != WIFI_DIRECT_ERROR_NONE) {
2855 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(res));
2856 __wfd_reset_control();
2857 pthread_mutex_unlock(&g_client_info.mutex);
2858 __WDC_LOG_FUNC_END__;
2859 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2861 WDC_LOGD("writing msg hdr is success!");
2863 res = __wfd_client_write_socket(client_info->sync_sockfd, (void*) ssid,
2864 WIFI_DIRECT_MAX_SSID_LEN);
2865 if (res != WIFI_DIRECT_ERROR_NONE) {
2866 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(res));
2867 __wfd_reset_control();
2868 pthread_mutex_unlock(&g_client_info.mutex);
2869 __WDC_LOG_FUNC_END__;
2870 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2873 res = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
2874 sizeof(wifi_direct_client_response_s));
2875 pthread_mutex_unlock(&g_client_info.mutex);
2877 WDC_LOGE("Error!!! reading socket, status = %d", res);
2878 __wfd_reset_control();
2879 __WDC_LOG_FUNC_END__;
2880 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
2882 if (rsp.cmd == WIFI_DIRECT_CMD_SET_SSID) {
2883 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
2884 WDC_LOGE("Error!!! Result received = %d", rsp.result);
2885 WDC_LOGE("Error!!! [%s]", __wfd_print_error(rsp.result));
2886 __WDC_LOG_FUNC_END__;
2890 WDC_LOGE("Error!!! Invalid resp cmd = %d\n", rsp.cmd);
2891 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
2895 __WDC_LOG_FUNC_END__;
2896 return WIFI_DIRECT_ERROR_NONE;
2899 int wifi_direct_get_ssid(char **ssid)
2901 __WDC_LOG_FUNC_START__;
2902 wifi_direct_client_info_s *client_info = __wfd_get_control();
2903 wifi_direct_client_request_s req;
2904 wifi_direct_client_response_s rsp;
2905 char la_ssid[WIFI_DIRECT_MAX_SSID_LEN + 1] = { 0, };
2906 int res = WIFI_DIRECT_ERROR_NONE;
2908 if ((client_info->is_registered == false) ||
2909 (client_info->client_id == WFD_INVALID_ID)) {
2910 WDC_LOGE("Client is NOT registered");
2911 __WDC_LOG_FUNC_END__;
2912 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2916 WDC_LOGE("NULL Param [ssid]!");
2917 __WDC_LOG_FUNC_END__;
2918 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2921 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2922 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2924 req.cmd = WIFI_DIRECT_CMD_GET_SSID;
2925 req.client_id = client_info->client_id;
2927 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2928 if (res != WIFI_DIRECT_ERROR_NONE) {
2929 __WDC_LOG_FUNC_END__;
2932 WDC_LOGD("wifi_direct_get_ssid() %s SUCCESS", rsp.param2);
2933 strncpy(la_ssid, rsp.param2, WIFI_DIRECT_MAX_SSID_LEN);
2934 la_ssid[WIFI_DIRECT_MAX_SSID_LEN] = '\0';
2935 *ssid = strdup(la_ssid);
2937 __WDC_LOG_FUNC_END__;
2938 return WIFI_DIRECT_ERROR_NONE;
2941 int wifi_direct_get_device_name(char **device_name)
2943 __WDC_LOG_FUNC_START__;
2944 wifi_direct_client_info_s *client_info = __wfd_get_control();
2945 wifi_direct_client_request_s req;
2946 wifi_direct_client_response_s rsp;
2947 char la_device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN + 1] = { 0, };
2948 int res = WIFI_DIRECT_ERROR_NONE;
2950 if ((client_info->is_registered == false) ||
2951 (client_info->client_id == WFD_INVALID_ID)) {
2952 WDC_LOGE("Client is NOT registered");
2953 __WDC_LOG_FUNC_END__;
2954 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2958 WDC_LOGE("NULL Param [device_name]!");
2959 __WDC_LOG_FUNC_END__;
2960 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2963 memset(&req, 0, sizeof(wifi_direct_client_request_s));
2964 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
2966 req.cmd = WIFI_DIRECT_CMD_GET_DEVICE_NAME;
2967 req.client_id = client_info->client_id;
2969 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
2970 if (res != WIFI_DIRECT_ERROR_NONE) {
2971 __WDC_LOG_FUNC_END__;
2974 WDC_LOGD("wifi_direct_get_device_name() %s SUCCESS \n", rsp.param2);
2975 strncpy(la_device_name, rsp.param2, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
2976 la_device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = '\0';
2977 *device_name = strdup(la_device_name);
2979 __WDC_LOG_FUNC_END__;
2980 return WIFI_DIRECT_ERROR_NONE;
2983 int wifi_direct_set_device_name(const char *device_name)
2985 __WDC_LOG_FUNC_START__;
2986 wifi_direct_client_info_s *client_info = __wfd_get_control();
2987 wifi_direct_client_request_s req;
2988 wifi_direct_client_response_s rsp;
2989 int status = WIFI_DIRECT_ERROR_NONE;
2991 if ((client_info->is_registered == false) ||
2992 (client_info->client_id == WFD_INVALID_ID)) {
2993 WDC_LOGE("Client is NOT registered");
2994 __WDC_LOG_FUNC_END__;
2995 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
2999 WDC_LOGE("NULL Param [device_name]!");
3000 __WDC_LOG_FUNC_END__;
3001 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3003 WDC_LOGE("device_name = [%s]", device_name);
3005 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3006 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3008 req.cmd = WIFI_DIRECT_CMD_SET_DEVICE_NAME;
3009 req.client_id = client_info->client_id;
3011 pthread_mutex_lock(&g_client_info.mutex);
3012 status = __wfd_client_write_socket(client_info->sync_sockfd, &req,
3013 sizeof(wifi_direct_client_request_s));
3014 if (status != WIFI_DIRECT_ERROR_NONE) {
3015 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(status));
3016 __wfd_reset_control();
3017 pthread_mutex_unlock(&g_client_info.mutex);
3018 __WDC_LOG_FUNC_END__;
3019 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3021 WDC_LOGD( "writing msg hdr is success!\n");
3023 status = __wfd_client_write_socket(client_info->sync_sockfd, (void*) device_name,
3024 WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
3025 if (status != WIFI_DIRECT_ERROR_NONE) {
3026 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(status));
3027 __wfd_reset_control();
3028 pthread_mutex_unlock(&g_client_info.mutex);
3029 __WDC_LOG_FUNC_END__;
3030 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3033 status = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
3034 sizeof(wifi_direct_client_response_s));
3035 pthread_mutex_unlock(&g_client_info.mutex);
3037 WDC_LOGE("Error!!! reading socket, status = %d", status);
3038 __wfd_reset_control();
3039 __WDC_LOG_FUNC_END__;
3040 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3042 if (rsp.cmd == WIFI_DIRECT_CMD_SET_DEVICE_NAME) {
3043 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
3044 WDC_LOGE("Error!!! Result received = %d", rsp.result);
3045 WDC_LOGE("Error!!! [%s]", __wfd_print_error(rsp.result));
3046 __WDC_LOG_FUNC_END__;
3050 WDC_LOGE("Error!!! Invalid resp cmd = %d", rsp.cmd);
3051 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
3055 __WDC_LOG_FUNC_END__;
3056 return WIFI_DIRECT_ERROR_NONE;
3059 int wifi_direct_get_network_interface_name(char **name)
3061 __WDC_LOG_FUNC_START__;
3062 wifi_direct_client_info_s *client_info = __wfd_get_control();
3063 wifi_direct_state_e status = 0;
3064 char *get_str = NULL;
3067 if ((client_info->is_registered == false) ||
3068 (client_info->client_id == WFD_INVALID_ID)) {
3069 WDC_LOGE("Client is NOT registered");
3070 __WDC_LOG_FUNC_END__;
3071 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3075 WDC_LOGE("NULL Param [name]!\n");
3076 __WDC_LOG_FUNC_END__;
3077 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3080 result = wifi_direct_get_state(&status);
3081 WDC_LOGD("wifi_direct_get_state() state=[%d], result=[%d]\n", status, result);
3083 if (status < WIFI_DIRECT_STATE_CONNECTED) {
3084 WDC_LOGE("Device is not connected!\n");
3085 __WDC_LOG_FUNC_END__;
3086 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
3089 get_str = vconf_get_str(VCONFKEY_IFNAME);
3091 WDC_LOGD( "vconf (%s) value is NULL!!!\n", VCONFKEY_IFNAME);
3092 __WDC_LOG_FUNC_END__;
3093 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
3095 WDC_LOGD( "VCONFKEY_IFNAME(%s) : %s\n", VCONFKEY_IFNAME, get_str);
3096 *name = strdup(get_str);
3099 __WDC_LOG_FUNC_END__;
3100 return WIFI_DIRECT_ERROR_NONE;
3103 int wifi_direct_get_ip_address(char **ip_address)
3105 __WDC_LOG_FUNC_START__;
3106 wifi_direct_client_info_s *client_info = __wfd_get_control();
3107 wifi_direct_state_e state = 0;
3108 char *get_str = NULL;
3111 if ((client_info->is_registered == false) ||
3112 (client_info->client_id == WFD_INVALID_ID)) {
3113 WDC_LOGE("Client is NOT registered");
3114 __WDC_LOG_FUNC_END__;
3115 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3119 WDC_LOGE("NULL Param [ip_address]!\n");
3120 __WDC_LOG_FUNC_END__;
3121 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3124 result = wifi_direct_get_state(&state);
3125 WDC_LOGD( "wifi_direct_get_state() state=[%d], result=[%d]", state, result);
3126 if( state < WIFI_DIRECT_STATE_CONNECTED) {
3127 WDC_LOGE("Device is not connected!");
3128 __WDC_LOG_FUNC_END__;
3129 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
3132 get_str = vconf_get_str(VCONFKEY_LOCAL_IP);
3135 WDC_LOGD("vconf (%s) value is NULL!!!", VCONFKEY_LOCAL_IP);
3136 __WDC_LOG_FUNC_END__;
3137 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
3139 WDC_LOGD("VCONFKEY_LOCAL_IP(%s) : %s", VCONFKEY_LOCAL_IP, get_str);
3140 *ip_address = strdup(get_str);
3143 __WDC_LOG_FUNC_END__;
3144 return WIFI_DIRECT_ERROR_NONE;
3147 int wifi_direct_get_subnet_mask(char **subnet_mask)
3149 __WDC_LOG_FUNC_START__;
3150 wifi_direct_client_info_s *client_info = __wfd_get_control();
3151 wifi_direct_state_e status = 0;
3152 char *get_str = NULL;
3155 if ((client_info->is_registered == false) ||
3156 (client_info->client_id == WFD_INVALID_ID)) {
3157 WDC_LOGE("Client is NOT registered");
3158 __WDC_LOG_FUNC_END__;
3159 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3163 WDC_LOGE("NULL Param [subnet_mask]!");
3164 __WDC_LOG_FUNC_END__;
3165 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3168 result = wifi_direct_get_state(&status);
3169 WDC_LOGD("wifi_direct_get_state() state=[%d], result=[%d]", status, result);
3170 if( status < WIFI_DIRECT_STATE_CONNECTED) {
3171 WDC_LOGE("Device is not connected!");
3172 __WDC_LOG_FUNC_END__;
3173 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
3176 get_str = vconf_get_str(VCONFKEY_SUBNET_MASK);
3178 WDC_LOGD("vconf (%s) value is NULL!!!", VCONFKEY_SUBNET_MASK);
3179 __WDC_LOG_FUNC_END__;
3180 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
3182 WDC_LOGD("VCONFKEY_SUBNET_MASK(%s) : %s", VCONFKEY_SUBNET_MASK, get_str);
3183 *subnet_mask = strdup(get_str);
3186 __WDC_LOG_FUNC_END__;
3187 return WIFI_DIRECT_ERROR_NONE;
3190 int wifi_direct_get_gateway_address(char **gateway_address)
3192 __WDC_LOG_FUNC_START__;
3193 wifi_direct_client_info_s *client_info = __wfd_get_control();
3194 wifi_direct_state_e status = 0;
3195 char *get_str = NULL;
3198 if ((client_info->is_registered == false) ||
3199 (client_info->client_id == WFD_INVALID_ID)) {
3200 WDC_LOGE("Client is NOT registered");
3201 __WDC_LOG_FUNC_END__;
3202 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3205 if (!gateway_address) {
3206 WDC_LOGE("NULL Param [gateway_address]!");
3207 __WDC_LOG_FUNC_END__;
3208 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3211 result = wifi_direct_get_state(&status);
3212 WDC_LOGD("wifi_direct_get_state() state=[%d], result=[%d]", status, result);
3213 if(status < WIFI_DIRECT_STATE_CONNECTED) {
3214 WDC_LOGE("Device is not connected!");
3215 __WDC_LOG_FUNC_END__;
3216 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
3219 get_str = vconf_get_str(VCONFKEY_GATEWAY);
3221 WDC_LOGD("vconf (%s) value is NULL!!!", VCONFKEY_GATEWAY);
3222 __WDC_LOG_FUNC_END__;
3223 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
3225 WDC_LOGD("VCONFKEY_GATEWAY(%s) : %s", VCONFKEY_GATEWAY, get_str);
3226 *gateway_address = strdup(get_str);
3229 __WDC_LOG_FUNC_END__;
3230 return WIFI_DIRECT_ERROR_NONE;
3233 int wifi_direct_get_mac_address(char **mac_address)
3235 __WDC_LOG_FUNC_START__;
3236 wifi_direct_client_info_s *client_info = __wfd_get_control();
3239 char mac_info[MACSTR_LEN];
3240 unsigned char la_mac_addr[6];
3242 if ((client_info->is_registered == false) ||
3243 (client_info->client_id == WFD_INVALID_ID)) {
3244 WDC_LOGE("Client is NOT registered");
3245 __WDC_LOG_FUNC_END__;
3246 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3250 WDC_LOGE("NULL Param [mac_address]!");
3251 __WDC_LOG_FUNC_END__;
3252 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3255 memset(mac_info, 0, sizeof(mac_info));
3257 fd = open(WIFI_DIRECT_MAC_ADDRESS_INFO_FILE, O_RDONLY);
3259 WDC_LOGE("[.mac.info] file open failed.");
3260 __WDC_LOG_FUNC_END__;
3261 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
3264 n = read(fd, mac_info, MACSTR_LEN);
3266 WDC_LOGE("[.mac.info] file read failed.");
3269 __WDC_LOG_FUNC_END__;
3270 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
3272 mac_info[17] = '\0';
3273 WDC_LOGD("mac_address = [%s]", mac_info);
3275 memset(la_mac_addr, 0, sizeof(la_mac_addr));
3276 macaddr_atoe(mac_info, la_mac_addr);
3277 la_mac_addr[0] |= 0x02;
3279 *mac_address = (char*) calloc(1, MACSTR_LEN);
3280 snprintf(*mac_address, MACSTR_LEN, MACSTR, MAC2STR(la_mac_addr));
3285 __WDC_LOG_FUNC_END__;
3286 return WIFI_DIRECT_ERROR_NONE;
3290 int wifi_direct_get_state(wifi_direct_state_e *state)
3292 __WDC_LOG_FUNC_START__;
3293 wifi_direct_client_info_s *client_info = __wfd_get_control();
3294 wifi_direct_client_request_s req;
3295 wifi_direct_client_response_s rsp;
3296 int res = WIFI_DIRECT_ERROR_NONE;
3299 WDC_LOGE("NULL Param [state]!");
3300 __WDC_LOG_FUNC_END__;
3301 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3304 if ((client_info->is_registered == false) ||
3305 (client_info->client_id == WFD_INVALID_ID)) {
3306 WDC_LOGE("Client is NOT registered");
3307 __WDC_LOG_FUNC_END__;
3308 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3311 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3312 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3314 req.cmd = WIFI_DIRECT_CMD_GET_LINK_STATUS;
3315 req.client_id = client_info->client_id;
3317 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
3318 if (res != WIFI_DIRECT_ERROR_NONE) {
3319 __WDC_LOG_FUNC_END__;
3322 WDC_LOGD("Link Status = %d", (int) rsp.param1);
3323 *state = (wifi_direct_state_e) rsp.param1;
3325 /* for CAPI : there is no WIFI_DIRECT_STATE_GROUP_OWNER type in CAPI */
3326 if(*state == WIFI_DIRECT_STATE_GROUP_OWNER)
3327 *state = WIFI_DIRECT_STATE_CONNECTED;
3329 __WDC_LOG_FUNC_END__;
3330 return WIFI_DIRECT_ERROR_NONE;
3334 int wifi_direct_is_discoverable(bool* discoverable)
3336 __WDC_LOG_FUNC_START__;
3337 wifi_direct_client_info_s *client_info = __wfd_get_control();
3338 wifi_direct_client_request_s req;
3339 wifi_direct_client_response_s rsp;
3340 int res = WIFI_DIRECT_ERROR_NONE;
3342 if ((client_info->is_registered == false) ||
3343 (client_info->client_id == WFD_INVALID_ID)) {
3344 WDC_LOGE("Client is NOT registered");
3345 __WDC_LOG_FUNC_END__;
3346 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3349 if (!discoverable) {
3350 WDC_LOGE("NULL Param [discoverable]!");
3351 __WDC_LOG_FUNC_END__;
3352 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3355 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3356 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3358 req.cmd = WIFI_DIRECT_CMD_IS_DISCOVERABLE;
3359 req.client_id = client_info->client_id;
3361 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
3362 if (res != WIFI_DIRECT_ERROR_NONE) {
3363 __WDC_LOG_FUNC_END__;
3366 WDC_LOGD("wifi_direct_is_discoverable() SUCCESS");
3367 *discoverable = (bool) rsp.param1;
3369 __WDC_LOG_FUNC_END__;
3370 return WIFI_DIRECT_ERROR_NONE;
3373 int wifi_direct_is_listening_only(bool* listen_only)
3375 __WDC_LOG_FUNC_START__;
3376 wifi_direct_client_info_s *client_info = __wfd_get_control();
3377 wifi_direct_client_request_s req;
3378 wifi_direct_client_response_s rsp;
3379 int res = WIFI_DIRECT_ERROR_NONE;
3381 if ((client_info->is_registered == false) ||
3382 (client_info->client_id == WFD_INVALID_ID)) {
3383 WDC_LOGE("Client is NOT registered");
3384 __WDC_LOG_FUNC_END__;
3385 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3389 WDC_LOGE("NULL Param [listen_only]!");
3390 __WDC_LOG_FUNC_END__;
3391 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3394 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3395 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3397 req.cmd = WIFI_DIRECT_CMD_IS_LISTENING_ONLY;
3398 req.client_id = client_info->client_id;
3400 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
3401 if (res != WIFI_DIRECT_ERROR_NONE) {
3402 __WDC_LOG_FUNC_END__;
3405 WDC_LOGD("wifi_direct_is_listening_only() SUCCESS");
3406 *listen_only = (bool) rsp.param1;
3408 __WDC_LOG_FUNC_END__;
3409 return WIFI_DIRECT_ERROR_NONE;
3413 int wifi_direct_get_primary_device_type(wifi_direct_primary_device_type_e* type)
3415 __WDC_LOG_FUNC_START__;
3416 wifi_direct_client_info_s *client_info = __wfd_get_control();
3419 WDC_LOGE("NULL Param [type]!");
3420 __WDC_LOG_FUNC_END__;
3421 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3424 if ((client_info->is_registered == false) ||
3425 (client_info->client_id == WFD_INVALID_ID)) {
3426 WDC_LOGE("Client is NOT registered");
3427 __WDC_LOG_FUNC_END__;
3428 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3431 WDC_LOGD("Current primary_dev_type [%d]", WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE);
3432 *type = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE;
3434 __WDC_LOG_FUNC_END__;
3435 return WIFI_DIRECT_ERROR_NONE;
3438 int wifi_direct_get_secondary_device_type(wifi_direct_secondary_device_type_e* type)
3440 __WDC_LOG_FUNC_START__;
3441 wifi_direct_client_info_s *client_info = __wfd_get_control();
3443 if ((client_info->is_registered == false) ||
3444 (client_info->client_id == WFD_INVALID_ID)) {
3445 WDC_LOGE("Client is NOT registered");
3446 __WDC_LOG_FUNC_END__;
3447 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3451 WDC_LOGE("NULL Param [type]!");
3452 __WDC_LOG_FUNC_END__;
3453 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3456 WDC_LOGD("Current second_dev_type [%d]", WIFI_DIRECT_SECONDARY_DEVICE_TYPE_PHONE_SM_DUAL);
3457 *type = WIFI_DIRECT_SECONDARY_DEVICE_TYPE_PHONE_SM_DUAL; // smart phone dual mode (wifi and cellular)
3459 __WDC_LOG_FUNC_END__;
3460 return WIFI_DIRECT_ERROR_NONE;
3463 int wifi_direct_set_autoconnection_mode(bool mode)
3465 __WDC_LOG_FUNC_START__;
3466 wifi_direct_client_info_s *client_info = __wfd_get_control();
3467 wifi_direct_client_request_s req;
3468 wifi_direct_client_response_s rsp;
3469 int res = WIFI_DIRECT_ERROR_NONE;
3471 if ((client_info->is_registered == false) ||
3472 (client_info->client_id == WFD_INVALID_ID)) {
3473 WDC_LOGE("Client is NOT registered");
3474 __WDC_LOG_FUNC_END__;
3475 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3478 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3479 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3481 req.cmd = WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE;
3482 req.client_id = client_info->client_id;
3483 req.data.int1 = mode;
3485 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
3486 if (res != WIFI_DIRECT_ERROR_NONE) {
3487 __WDC_LOG_FUNC_END__;
3491 __WDC_LOG_FUNC_END__;
3492 return WIFI_DIRECT_ERROR_NONE;
3495 int wifi_direct_is_autoconnection_mode(bool *mode)
3497 __WDC_LOG_FUNC_START__;
3498 wifi_direct_client_info_s *client_info = __wfd_get_control();
3499 wifi_direct_client_request_s req;
3500 wifi_direct_client_response_s rsp;
3501 int res = WIFI_DIRECT_ERROR_NONE;
3503 if ((client_info->is_registered == false) ||
3504 (client_info->client_id == WFD_INVALID_ID)) {
3505 WDC_LOGE("Client is NOT registered");
3506 __WDC_LOG_FUNC_END__;
3507 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3511 WDC_LOGE("NULL Param [mode]!");
3512 __WDC_LOG_FUNC_END__;
3513 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3516 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3517 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3519 req.cmd = WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE;
3520 req.client_id = client_info->client_id;
3522 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
3523 if (res != WIFI_DIRECT_ERROR_NONE) {
3524 __WDC_LOG_FUNC_END__;
3527 WDC_LOGD("wifi_direct_is_autoconnection_mode() SUCCESS");
3528 *mode = (bool) rsp.param1;
3530 __WDC_LOG_FUNC_END__;
3531 return WIFI_DIRECT_ERROR_NONE;
3536 int wifi_direct_set_persistent_group_enabled(bool enabled)
3538 __WDC_LOG_FUNC_START__;
3539 wifi_direct_client_info_s *client_info = __wfd_get_control();
3540 wifi_direct_client_request_s req;
3541 wifi_direct_client_response_s rsp;
3542 int res = WIFI_DIRECT_ERROR_NONE;
3544 if ((client_info->is_registered == false) ||
3545 (client_info->client_id == WFD_INVALID_ID)) {
3546 WDC_LOGE("Client is NOT registered");
3547 __WDC_LOG_FUNC_END__;
3548 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3551 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3552 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3554 if (enabled == true)
3555 req.cmd = WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP;
3557 req.cmd = WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP;
3558 req.client_id = client_info->client_id;
3560 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
3561 if (res != WIFI_DIRECT_ERROR_NONE) {
3562 __WDC_LOG_FUNC_END__;
3565 WDC_LOGD("wifi_direct_set_persistent_group_enabled() SUCCESS");
3567 __WDC_LOG_FUNC_END__;
3568 return WIFI_DIRECT_ERROR_NONE;
3572 int wifi_direct_is_persistent_group_enabled(bool *enabled)
3574 __WDC_LOG_FUNC_START__;
3575 wifi_direct_client_info_s *client_info = __wfd_get_control();
3576 wifi_direct_client_request_s req;
3577 wifi_direct_client_response_s rsp;
3578 int res = WIFI_DIRECT_ERROR_NONE;
3580 if ((client_info->is_registered == false) ||
3581 (client_info->client_id == WFD_INVALID_ID)) {
3582 WDC_LOGE("Client is NOT registered");
3583 __WDC_LOG_FUNC_END__;
3584 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3588 WDC_LOGE("NULL Param [enabled]!");
3589 __WDC_LOG_FUNC_END__;
3590 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3593 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3594 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3596 req.cmd = WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP;
3597 req.client_id = client_info->client_id;
3599 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
3600 if (res != WIFI_DIRECT_ERROR_NONE) {
3601 __WDC_LOG_FUNC_END__;
3604 WDC_LOGD("wifi_direct_is_persistent_group_enabled() SUCCESS");
3605 *enabled = (bool) rsp.param1;
3607 __WDC_LOG_FUNC_END__;
3608 return WIFI_DIRECT_ERROR_NONE;
3611 int wifi_direct_foreach_persistent_groups(wifi_direct_persistent_group_cb cb,
3614 __WDC_LOG_FUNC_START__;
3615 wifi_direct_client_info_s *client_info = __wfd_get_control();
3616 wifi_direct_client_request_s req;
3617 wifi_direct_client_response_s rsp;
3618 int res = WIFI_DIRECT_ERROR_NONE;
3621 if ((client_info->is_registered == false) ||
3622 (client_info->client_id == WFD_INVALID_ID)) {
3623 WDC_LOGE("Client is NOT registered");
3624 __WDC_LOG_FUNC_END__;
3625 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3629 WDC_LOGE("NULL Param [callback]!");
3630 __WDC_LOG_FUNC_END__;
3631 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3634 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3635 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3637 req.cmd = WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO;
3638 req.client_id = client_info->client_id;
3640 pthread_mutex_lock(&g_client_info.mutex);
3641 res = __wfd_client_write_socket(client_info->sync_sockfd, &req, sizeof(wifi_direct_client_request_s));
3642 if (res != WIFI_DIRECT_ERROR_NONE) {
3643 WDC_LOGE("Failed to write into socket [%s]", __wfd_print_error(res));
3644 __wfd_reset_control();
3645 pthread_mutex_unlock(&g_client_info.mutex);
3646 __WDC_LOG_FUNC_END__;
3647 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3649 WDC_LOGD("Succeeded to send request [%d: %s]", req.cmd, __wfd_client_print_cmd(req.cmd));
3651 res = __wfd_client_read_socket(client_info->sync_sockfd, &rsp, sizeof(wifi_direct_client_response_s));
3653 WDC_LOGE("Failed to read socket [%d]", res);
3654 __wfd_reset_control();
3655 pthread_mutex_unlock(&g_client_info.mutex);
3656 __WDC_LOG_FUNC_END__;
3657 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3659 if (rsp.cmd != req.cmd) {
3660 WDC_LOGE("Invalid resp [%d]", rsp.cmd);
3661 pthread_mutex_unlock(&g_client_info.mutex);
3662 __WDC_LOG_FUNC_END__;
3663 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3666 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
3667 WDC_LOGE("Result received [%s]", __wfd_print_error(rsp.result));
3668 pthread_mutex_unlock(&g_client_info.mutex);
3669 __WDC_LOG_FUNC_END__;
3674 int num = rsp.param1;
3675 wfd_persistent_group_info_s *buff = NULL;
3677 WDC_LOGD("Num of persistent groups = %d", (int) rsp.param1);
3680 buff = (wfd_persistent_group_info_s *) malloc(num * sizeof(wfd_persistent_group_info_s));
3682 WDC_LOGE("malloc() failed!!!.");
3683 pthread_mutex_unlock(&g_client_info.mutex);
3684 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
3687 res = __wfd_client_read_socket(client_info->sync_sockfd, (char*) buff,
3688 num * sizeof(wfd_persistent_group_info_s));
3689 pthread_mutex_unlock(&g_client_info.mutex);
3692 WDC_LOGE("socket read error.");
3693 __wfd_reset_control();
3694 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
3697 __wfd_client_print_persistent_group_info(buff, num);
3698 WDC_LOGD("wifi_direct_foreach_persistent_groups() SUCCESS");
3701 char *go_mac_address;
3703 for (i = 0; i < num; i++) {
3704 ssid = strdup(buff[i].ssid);
3706 WDC_LOGD("Failed to copy ssid");
3709 go_mac_address = (char*) calloc(1, MACSTR_LEN);
3710 if (!go_mac_address) {
3711 WDC_LOGD("Failed to allocate memory for GO MAC address");
3714 return WIFI_DIRECT_ERROR_OUT_OF_MEMORY;
3716 snprintf(go_mac_address, MACSTR_LEN, MACSTR, MAC2STR(buff[i].go_mac_address));
3718 res = cb(go_mac_address, ssid, user_data);
3721 free(go_mac_address);
3722 go_mac_address = NULL;
3731 pthread_mutex_unlock(&g_client_info.mutex);
3734 __WDC_LOG_FUNC_END__;
3735 return WIFI_DIRECT_ERROR_NONE;
3738 int wifi_direct_remove_persistent_group(const char *mac_address, const char *ssid)
3740 __WDC_LOG_FUNC_START__;
3741 wifi_direct_client_info_s *client_info = __wfd_get_control();
3742 wifi_direct_client_request_s req;
3743 wifi_direct_client_response_s rsp;
3744 wfd_persistent_group_info_s persistent_group_info;
3745 int status = WIFI_DIRECT_ERROR_NONE;
3747 if ((client_info->is_registered == false) ||
3748 (client_info->client_id == WFD_INVALID_ID)) {
3749 WDC_LOGE("Client is NOT registered");
3750 __WDC_LOG_FUNC_END__;
3751 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3754 if (!mac_address || !ssid) {
3755 WDC_LOGE("NULL Param");
3756 __WDC_LOG_FUNC_END__;
3757 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3760 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3761 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3763 req.cmd = WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP;
3764 req.client_id = client_info->client_id;
3766 pthread_mutex_lock(&g_client_info.mutex);
3767 status = __wfd_client_write_socket(client_info->sync_sockfd, &req,
3768 sizeof(wifi_direct_client_request_s));
3769 if (status != WIFI_DIRECT_ERROR_NONE) {
3770 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(status));
3771 __wfd_reset_control();
3772 pthread_mutex_unlock(&g_client_info.mutex);
3773 __WDC_LOG_FUNC_END__;
3774 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3776 WDC_LOGD("writing msg hdr is success!");
3778 strncpy(persistent_group_info.ssid, ssid, WIFI_DIRECT_MAX_SSID_LEN);
3779 persistent_group_info.ssid[WIFI_DIRECT_MAX_SSID_LEN] ='\0';
3780 macaddr_atoe(mac_address, persistent_group_info.go_mac_address);
3782 status = __wfd_client_write_socket(client_info->sync_sockfd, &persistent_group_info,
3783 sizeof(wfd_persistent_group_info_s));
3784 if (status != WIFI_DIRECT_ERROR_NONE) {
3785 WDC_LOGE("Error!!! writing to socket[%s]", __wfd_print_error(status));
3786 __wfd_reset_control();
3787 pthread_mutex_unlock(&g_client_info.mutex);
3788 __WDC_LOG_FUNC_END__;
3789 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3792 status = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
3793 sizeof(wifi_direct_client_response_s));
3794 pthread_mutex_unlock(&g_client_info.mutex);
3796 WDC_LOGE("Error!!! reading socket, status = %d", status);
3797 __wfd_reset_control();
3798 __WDC_LOG_FUNC_END__;
3799 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3801 if (rsp.cmd == WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP) {
3802 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
3803 WDC_LOGD("Error!!! Result received = %d", rsp.result);
3804 WDC_LOGD("Error!!! [%s]", __wfd_print_error(rsp.result));
3805 __WDC_LOG_FUNC_END__;
3809 WDC_LOGE("Error!!! Invalid resp cmd = %d", rsp.cmd);
3810 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
3814 __WDC_LOG_FUNC_END__;
3815 return WIFI_DIRECT_ERROR_NONE;
3818 int wifi_direct_set_p2poem_loglevel(int increase_log_level)
3820 __WDC_LOG_FUNC_START__;
3821 wifi_direct_client_info_s *client_info = __wfd_get_control();
3822 wifi_direct_client_request_s req;
3823 wifi_direct_client_response_s rsp;
3824 int res = WIFI_DIRECT_ERROR_NONE;
3826 if ((client_info->is_registered == false) ||
3827 (client_info->client_id == WFD_INVALID_ID)) {
3828 WDC_LOGE("Client is NOT registered");
3829 __WDC_LOG_FUNC_END__;
3830 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3833 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3834 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3836 req.cmd = WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL;
3837 req.client_id = client_info->client_id;
3838 if (increase_log_level == 0)
3839 req.data.int1 = false;
3841 req.data.int1 = true;
3843 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
3844 if (res != WIFI_DIRECT_ERROR_NONE) {
3845 __WDC_LOG_FUNC_END__;
3849 __WDC_LOG_FUNC_END__;
3850 return WIFI_DIRECT_ERROR_NONE;
3853 int wifi_direct_service_add(wifi_direct_service_type_e type, char *data1, char *data2)
3855 __WDC_LOG_FUNC_START__;
3856 wifi_direct_client_info_s *client_info = __wfd_get_control();
3857 wifi_direct_client_request_s req;
3858 wifi_direct_client_response_s rsp;
3861 int status = WIFI_DIRECT_ERROR_NONE;
3865 if (!data1 && !strlen(data1)) {
3866 WDC_LOGE("NULL Param [data1]!");
3867 __WDC_LOG_FUNC_END__;
3868 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3871 if ((client_info->is_registered == false) ||
3872 (client_info->client_id == WFD_INVALID_ID)) {
3873 WDC_LOGE("Client is NOT registered.");
3874 __WDC_LOG_FUNC_END__;
3875 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3878 if (type >= WIFI_DIRECT_SERVICE_BONJOUR &&
3879 type <= WIFI_DIRECT_SERVICE_VENDORSPEC) {
3880 WDC_LOGD("Param service_type [%d]", type);
3882 WDC_LOGE("Invalid Param [type]!");
3883 __WDC_LOG_FUNC_END__;
3884 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3887 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3888 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3890 //TODO: modify the method to handle the NULL or zero length data
3892 if (data2 && (data_len=strlen(data2)))
3893 len =data_len +strlen(data1)+2;
3895 len = strlen(data1)+1;
3897 WDC_LOGD("data1 [%s], data2 [%s], len [%d]", data1, data2, len);
3898 buf= calloc(sizeof(wifi_direct_client_request_s)+len, sizeof(char));
3900 WDC_LOGE("Memory can't be allocated for Buf\n");
3901 return WIFI_DIRECT_ERROR_OUT_OF_MEMORY;
3904 req.cmd = WIFI_DIRECT_CMD_SERVICE_ADD;
3905 req.client_id = client_info->client_id;
3906 req.data.int1 = type;
3907 req.data.int2 = data_len;
3908 req.cmd_data_len = len;
3910 memcpy(buf, &req, sizeof(wifi_direct_client_request_s));
3912 ptr += sizeof(wifi_direct_client_request_s);
3914 snprintf(ptr, len, "%s %s", data2, data1);
3916 snprintf(ptr, len, "%s", data1);
3918 pthread_mutex_lock(&g_client_info.mutex);
3919 status = __wfd_client_write_socket(client_info->sync_sockfd, buf,
3920 sizeof(wifi_direct_client_request_s) + len);
3922 if (status != WIFI_DIRECT_ERROR_NONE) {
3923 WDC_LOGE("Error!!! writing to socket, Errno = %s", strerror(errno));
3924 __wfd_reset_control();
3925 pthread_mutex_unlock(&g_client_info.mutex);
3926 __WDC_LOG_FUNC_END__;
3927 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3929 WDC_LOGD("Success writing data to the socket!");
3931 status = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
3932 sizeof(wifi_direct_client_response_s));
3933 pthread_mutex_unlock(&g_client_info.mutex);
3935 WDC_LOGE("Error!!! reading socket, status = %d", status);
3936 __wfd_reset_control();
3937 __WDC_LOG_FUNC_END__;
3938 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
3940 if (rsp.cmd == WIFI_DIRECT_CMD_SERVICE_ADD) {
3941 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
3942 WDC_LOGD("Error!!! Result received = %d", rsp.result);
3943 WDC_LOGD("Error!!! [%spin]", __wfd_print_error(rsp.result));
3944 __WDC_LOG_FUNC_END__;
3948 WDC_LOGE("Error!!! Invalid resp cmd = %d", rsp.cmd);
3949 __WDC_LOG_FUNC_END__;
3950 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
3954 __WDC_LOG_FUNC_END__;
3955 return WIFI_DIRECT_ERROR_NONE;
3958 int wifi_direct_service_del(wifi_direct_service_type_e type, char *data1, char *data2)
3960 __WDC_LOG_FUNC_START__;
3961 wifi_direct_client_info_s *client_info = __wfd_get_control();
3962 wifi_direct_client_request_s req;
3963 wifi_direct_client_response_s rsp;
3966 int status = WIFI_DIRECT_ERROR_NONE;
3970 if (!data1 && !strlen(data1)) {
3971 WDC_LOGE("NULL Param [data1]!");
3972 __WDC_LOG_FUNC_END__;
3973 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3976 if ((client_info->is_registered == false) ||
3977 (client_info->client_id == WFD_INVALID_ID)) {
3978 WDC_LOGE("Client is NOT registered.");
3979 __WDC_LOG_FUNC_END__;
3980 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
3983 if (type >= WIFI_DIRECT_SERVICE_BONJOUR &&
3984 type <= WIFI_DIRECT_SERVICE_VENDORSPEC) {
3985 WDC_LOGD("Param service_type [%d]", type);
3987 WDC_LOGE("Invalid Param [type]!");
3988 __WDC_LOG_FUNC_END__;
3989 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3992 memset(&req, 0, sizeof(wifi_direct_client_request_s));
3993 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
3995 //TODO: modify the method to handle the NULL or zero length data
3997 if (data2 && (data_len=strlen(data2)))
3998 len =data_len +strlen(data1)+2;
4000 len = strlen(data1)+1;
4002 WDC_LOGD("data1 [%s], data2 [%s], len [%d]", data1, data2, len);
4003 buf= calloc(sizeof(wifi_direct_client_request_s) + len, sizeof(char));
4005 WDC_LOGE("Memory can't be allocated for Buf\n");
4006 return WIFI_DIRECT_ERROR_OUT_OF_MEMORY;
4009 req.cmd = WIFI_DIRECT_CMD_SERVICE_DEL;
4010 req.client_id = client_info->client_id;
4011 req.data.int1 = type;
4012 req.data.int2 = data_len;
4013 req.cmd_data_len = len;
4015 memcpy(buf, &req, sizeof(wifi_direct_client_request_s));
4017 ptr += sizeof(wifi_direct_client_request_s);
4019 snprintf(ptr, len, "%s %s", data2, data1);
4021 snprintf(ptr, len, "%s", data1);
4023 pthread_mutex_lock(&g_client_info.mutex);
4024 status = __wfd_client_write_socket(client_info->sync_sockfd, buf,
4025 sizeof(wifi_direct_client_request_s) + len);
4027 if (status != WIFI_DIRECT_ERROR_NONE) {
4028 WDC_LOGE("Error!!! writing to socket, Errno = %s", strerror(errno));
4029 __wfd_reset_control();
4030 pthread_mutex_unlock(&g_client_info.mutex);
4031 __WDC_LOG_FUNC_END__;
4032 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
4034 WDC_LOGD("Success writing data to the socket!");
4036 status = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
4037 sizeof(wifi_direct_client_response_s));
4038 pthread_mutex_unlock(&g_client_info.mutex);
4040 WDC_LOGE("Error!!! reading socket, status = %d", status);
4041 __wfd_reset_control();
4042 __WDC_LOG_FUNC_END__;
4043 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
4045 if (rsp.cmd == WIFI_DIRECT_CMD_SERVICE_DEL) {
4046 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
4047 WDC_LOGD("Error!!! Result received = %d", rsp.result);
4048 WDC_LOGD("Error!!! [%spin]", __wfd_print_error(rsp.result));
4049 __WDC_LOG_FUNC_END__;
4053 WDC_LOGE("Error!!! Invalid resp cmd = %d", rsp.cmd);
4054 __WDC_LOG_FUNC_END__;
4055 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
4059 __WDC_LOG_FUNC_END__;
4060 return WIFI_DIRECT_ERROR_NONE;
4064 int wifi_direct_serv_disc_req(char* mac_address, wifi_direct_service_type_e type, char *data1, char *data2)
4066 __WDC_LOG_FUNC_START__;
4067 wifi_direct_client_info_s *client_info = __wfd_get_control();
4068 wifi_direct_client_request_s req;
4069 wifi_direct_client_response_s rsp;
4070 unsigned char la_mac_addr[6];
4073 int status = WIFI_DIRECT_ERROR_NONE;
4078 if ((client_info->is_registered == false) ||
4079 (client_info->client_id == WFD_INVALID_ID)) {
4080 WDC_LOGE("Client is NOT registered.");
4081 __WDC_LOG_FUNC_END__;
4082 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
4085 if (type >= WIFI_DIRECT_SERVICE_ALL &&
4086 type <= WIFI_DIRECT_SERVICE_VENDORSPEC) {
4087 WDC_LOGD("Param service_type [%d]", type);
4089 WDC_LOGE("Invalid Param [type]!");
4090 __WDC_LOG_FUNC_END__;
4091 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
4094 memset(&req, 0, sizeof(wifi_direct_client_request_s));
4095 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
4097 if(data2 && (data_len = strlen(data2)))
4099 if(data1 && (query_len = strlen(data1)))
4102 WDC_LOGD("data [%s], query [%s]", data2, data1);
4103 buf= calloc(sizeof(wifi_direct_client_request_s)+data_len+query_len, sizeof(char));
4105 WDC_LOGE("Memory can't be allocated for Buf\n");
4106 return WIFI_DIRECT_ERROR_OUT_OF_MEMORY;
4109 req.cmd = WIFI_DIRECT_CMD_SERV_DISC_REQ;
4110 req.client_id = client_info->client_id;
4111 req.data.int1 = type;
4112 req.data.int2 = data_len;
4113 req.cmd_data_len = data_len+ query_len;
4114 macaddr_atoe(mac_address, la_mac_addr);
4115 memcpy(req.data.mac_addr, la_mac_addr, MACADDR_LEN);
4117 memcpy(buf, &req, sizeof(wifi_direct_client_request_s));
4119 ptr += sizeof(wifi_direct_client_request_s);
4122 snprintf(ptr, data_len+query_len, "%s %s", data2, data1);
4124 snprintf(ptr, query_len, "%s", data1);
4126 pthread_mutex_lock(&g_client_info.mutex);
4127 status = __wfd_client_write_socket(client_info->sync_sockfd, buf,
4128 sizeof(wifi_direct_client_request_s) + req.cmd_data_len);
4130 if (status != WIFI_DIRECT_ERROR_NONE) {
4131 WDC_LOGE("Error!!! writing to socket, Errno = %s", strerror(errno));
4132 __wfd_reset_control();
4133 pthread_mutex_unlock(&g_client_info.mutex);
4134 __WDC_LOG_FUNC_END__;
4135 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
4137 WDC_LOGD("Success writing data to the socket!");
4139 status = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
4140 sizeof(wifi_direct_client_response_s));
4141 pthread_mutex_unlock(&g_client_info.mutex);
4143 WDC_LOGE("Error!!! reading socket, status = %d", status);
4144 __wfd_reset_control();
4145 __WDC_LOG_FUNC_END__;
4146 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
4148 if (rsp.cmd == WIFI_DIRECT_CMD_SERV_DISC_REQ) {
4149 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
4150 WDC_LOGD("Error!!! Result received = %d", rsp.result);
4151 WDC_LOGD("Error!!! [%spin]", __wfd_print_error(rsp.result));
4152 __WDC_LOG_FUNC_END__;
4156 WDC_LOGE("Error!!! Invalid resp cmd = %d", rsp.cmd);
4157 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
4160 WDC_LOGD("handle = [%d]\n", (int) rsp.param1);
4161 __WDC_LOG_FUNC_END__;
4165 int wifi_direct_serv_disc_cancel(int handle)
4167 __WDC_LOG_FUNC_START__;
4168 wifi_direct_client_info_s *client_info = __wfd_get_control();
4169 wifi_direct_client_request_s req;
4170 wifi_direct_client_response_s rsp;
4171 int res = WIFI_DIRECT_ERROR_NONE;
4173 if ((client_info->is_registered == false) ||
4174 (client_info->client_id == WFD_INVALID_ID)) {
4175 WDC_LOGE("Client is NOT registered");
4176 __WDC_LOG_FUNC_END__;
4177 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
4180 memset(&req, 0, sizeof(wifi_direct_client_request_s));
4181 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
4183 req.cmd = WIFI_DIRECT_CMD_SERV_DISC_CANCEL;
4184 req.client_id = client_info->client_id;
4185 req.data.int1 = handle;
4187 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
4188 if (res != WIFI_DIRECT_ERROR_NONE) {
4189 __WDC_LOG_FUNC_END__;
4193 __WDC_LOG_FUNC_END__;
4194 return WIFI_DIRECT_ERROR_NONE;
4197 int wifi_direct_init_wifi_display(wifi_direct_display_type_e type, int port, int hdcp)
4199 __WDC_LOG_FUNC_START__;
4200 wifi_direct_client_info_s *client_info = __wfd_get_control();
4201 wifi_direct_client_request_s req;
4202 wifi_direct_client_response_s rsp;
4205 int status = WIFI_DIRECT_ERROR_NONE;
4206 if ((client_info->is_registered == false) ||
4207 (client_info->client_id == WFD_INVALID_ID)) {
4208 WDC_LOGE("Client is NOT registered.");
4209 __WDC_LOG_FUNC_END__;
4210 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
4213 memset(&req, 0, sizeof(wifi_direct_client_request_s));
4214 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
4216 WDC_LOGD("type [%d], port [%d], hdcp [%d]", type, port, hdcp);
4217 buf= calloc(sizeof(wifi_direct_client_request_s) + sizeof(int), sizeof(char));
4219 WDC_LOGE("Memory can't be allocated for Buf\n");
4220 return WIFI_DIRECT_ERROR_OUT_OF_MEMORY;
4223 req.cmd = WIFI_DIRECT_CMD_INIT_WIFI_DISPLAY;
4224 req.client_id = client_info->client_id;
4225 req.data.int1 = type;
4226 req.data.int2 = port;
4227 req.cmd_data_len = sizeof(int);
4229 memcpy(buf, &req, sizeof(wifi_direct_client_request_s));
4231 ptr += sizeof(wifi_direct_client_request_s);
4232 memcpy(ptr, &hdcp, sizeof(int));
4234 pthread_mutex_lock(&g_client_info.mutex);
4235 status = __wfd_client_write_socket(client_info->sync_sockfd, buf,
4236 sizeof(wifi_direct_client_request_s) + sizeof(int));
4238 if (status != WIFI_DIRECT_ERROR_NONE) {
4239 WDC_LOGE("Error!!! writing to socket, Errno = %s", strerror(errno));
4240 __wfd_reset_control();
4241 pthread_mutex_unlock(&g_client_info.mutex);
4242 __WDC_LOG_FUNC_END__;
4243 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
4245 WDC_LOGD("Success writing data to the socket!");
4247 status = __wfd_client_read_socket(client_info->sync_sockfd, (char*) &rsp,
4248 sizeof(wifi_direct_client_response_s));
4249 pthread_mutex_unlock(&g_client_info.mutex);
4251 WDC_LOGE("Error!!! reading socket, status = %d", status);
4252 __wfd_reset_control();
4253 __WDC_LOG_FUNC_END__;
4254 return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
4256 if (rsp.cmd == WIFI_DIRECT_CMD_INIT_WIFI_DISPLAY) {
4257 if (rsp.result != WIFI_DIRECT_ERROR_NONE) {
4258 WDC_LOGD("Error!!! Result received = %d", rsp.result);
4259 WDC_LOGD("Error!!! [%spin]", __wfd_print_error(rsp.result));
4260 __WDC_LOG_FUNC_END__;
4264 WDC_LOGE("Error!!! Invalid resp cmd = %d", rsp.cmd);
4265 __WDC_LOG_FUNC_END__;
4266 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
4269 __WDC_LOG_FUNC_END__;
4270 return WIFI_DIRECT_ERROR_NONE;
4273 int wifi_direct_deinit_wifi_display(void)
4275 __WDC_LOG_FUNC_START__;
4276 wifi_direct_client_info_s *client_info = __wfd_get_control();
4277 wifi_direct_client_request_s req;
4278 wifi_direct_client_response_s rsp;
4279 int res = WIFI_DIRECT_ERROR_NONE;
4281 if ((client_info->is_registered == false) ||
4282 (client_info->client_id == WFD_INVALID_ID)) {
4283 WDC_LOGE("Client is NOT registered");
4284 __WDC_LOG_FUNC_END__;
4285 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
4288 memset(&req, 0, sizeof(wifi_direct_client_request_s));
4289 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
4291 req.cmd = WIFI_DIRECT_CMD_DEINIT_WIFI_DISPLAY;
4292 req.client_id = client_info->client_id;
4294 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
4295 if (res != WIFI_DIRECT_ERROR_NONE) {
4296 __WDC_LOG_FUNC_END__;
4299 WDC_LOGD("wifi_direct_deinit_wifi_display() SUCCESS");
4301 __WDC_LOG_FUNC_END__;
4302 return WIFI_DIRECT_ERROR_NONE;
4305 int wifi_direct_get_display_port(int *port)
4307 __WDC_LOG_FUNC_START__;
4308 wifi_direct_client_info_s *client_info = __wfd_get_control();
4309 wifi_direct_client_request_s req;
4310 wifi_direct_client_response_s rsp;
4311 int res = WIFI_DIRECT_ERROR_NONE;
4313 if ((client_info->is_registered == false) ||
4314 (client_info->client_id == WFD_INVALID_ID)) {
4315 WDC_LOGE("Client is NOT registered");
4316 __WDC_LOG_FUNC_END__;
4317 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
4321 WDC_LOGE("NULL Param [port]!");
4322 __WDC_LOG_FUNC_END__;
4323 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
4326 memset(&req, 0, sizeof(wifi_direct_client_request_s));
4327 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
4329 req.cmd = WIFI_DIRECT_CMD_GET_DISPLAY_PORT;
4330 req.client_id = client_info->client_id;
4332 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
4333 if (res != WIFI_DIRECT_ERROR_NONE) {
4334 __WDC_LOG_FUNC_END__;
4337 WDC_LOGD("wifi_direct_get_display_port() SUCCESS");
4338 *port = (int) rsp.param1;
4340 __WDC_LOG_FUNC_END__;
4341 return WIFI_DIRECT_ERROR_NONE;
4344 int wifi_direct_get_display_type(wifi_direct_display_type_e *type)
4346 __WDC_LOG_FUNC_START__;
4347 wifi_direct_client_info_s *client_info = __wfd_get_control();
4348 wifi_direct_client_request_s req;
4349 wifi_direct_client_response_s rsp;
4350 int res = WIFI_DIRECT_ERROR_NONE;
4352 if ((client_info->is_registered == false) ||
4353 (client_info->client_id == WFD_INVALID_ID)) {
4354 WDC_LOGE("Client is NOT registered");
4355 __WDC_LOG_FUNC_END__;
4356 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
4360 WDC_LOGE("NULL Param [type]!");
4361 __WDC_LOG_FUNC_END__;
4362 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
4365 memset(&req, 0, sizeof(wifi_direct_client_request_s));
4366 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
4368 req.cmd = WIFI_DIRECT_CMD_GET_DISPLAY_TYPE;
4369 req.client_id = client_info->client_id;
4371 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
4372 if (res != WIFI_DIRECT_ERROR_NONE) {
4373 __WDC_LOG_FUNC_END__;
4376 WDC_LOGD("wifi_direct_get_display_type() SUCCESS");
4377 *type = (wifi_direct_display_type_e) rsp.param1;
4379 __WDC_LOG_FUNC_END__;
4380 return WIFI_DIRECT_ERROR_NONE;
4383 int wifi_direct_add_to_access_list(const char *mac_address, bool allow)
4385 __WDC_LOG_FUNC_START__;
4386 wifi_direct_client_info_s *client_info = __wfd_get_control();
4387 unsigned char la_mac_addr[6];
4388 wifi_direct_client_request_s req;
4389 wifi_direct_client_response_s rsp;
4390 int res = WIFI_DIRECT_ERROR_NONE;
4392 if ((client_info->is_registered == false) ||
4393 (client_info->client_id == WFD_INVALID_ID)) {
4394 WDC_LOGE("Client is NOT registered");
4395 __WDC_LOG_FUNC_END__;
4396 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
4400 WDC_LOGE("mac_addr is NULL");
4401 __WDC_LOG_FUNC_END__;
4402 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
4405 memset(&req, 0, sizeof(wifi_direct_client_request_s));
4406 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
4408 req.cmd = WIFI_DIRECT_CMD_ADD_TO_ACCESS_LIST;
4409 req.client_id = client_info->client_id;
4410 req.data.int1 = allow;
4411 macaddr_atoe(mac_address, la_mac_addr);
4412 memcpy(req.data.mac_addr, la_mac_addr, MACADDR_LEN);
4414 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
4415 if (res != WIFI_DIRECT_ERROR_NONE) {
4416 __WDC_LOG_FUNC_END__;
4419 WDC_LOGD("wifi_direct_add_device_to_list() SUCCESS");
4421 __WDC_LOG_FUNC_END__;
4422 return WIFI_DIRECT_ERROR_NONE;
4425 int wifi_direct_del_from_access_list(const char *mac_address)
4427 __WDC_LOG_FUNC_START__;
4428 wifi_direct_client_info_s *client_info = __wfd_get_control();
4429 unsigned char la_mac_addr[6];
4430 wifi_direct_client_request_s req;
4431 wifi_direct_client_response_s rsp;
4432 int res = WIFI_DIRECT_ERROR_NONE;
4434 if ((client_info->is_registered == false) ||
4435 (client_info->client_id == WFD_INVALID_ID)) {
4436 WDC_LOGE("Client is NOT registered");
4437 __WDC_LOG_FUNC_END__;
4438 return WIFI_DIRECT_ERROR_NOT_INITIALIZED;
4442 WDC_LOGE("mac_addr is NULL");
4443 __WDC_LOG_FUNC_END__;
4444 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
4447 memset(&req, 0, sizeof(wifi_direct_client_request_s));
4448 memset(&rsp, 0, sizeof(wifi_direct_client_response_s));
4450 req.cmd = WIFI_DIRECT_CMD_DEL_FROM_ACCESS_LIST;
4451 req.client_id = client_info->client_id;
4452 macaddr_atoe(mac_address, la_mac_addr);
4453 memcpy(req.data.mac_addr, la_mac_addr, MACADDR_LEN);
4455 res = __wfd_client_send_request(client_info->sync_sockfd, &req, &rsp);
4456 if (res != WIFI_DIRECT_ERROR_NONE) {
4457 __WDC_LOG_FUNC_END__;
4460 WDC_LOGD("wifi_direct_del_device_from_list() SUCCESS");
4462 __WDC_LOG_FUNC_END__;
4463 return WIFI_DIRECT_ERROR_NONE;