2 * Network Configuration Module
4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
23 #include <glib-object.h>
24 #include <sys/socket.h>
29 #include <netinet/in.h>
30 #include <arpa/inet.h>
31 #include <sys/ioctl.h>
33 //#include "wifi-direct-utils.h"
34 #include "wifi-direct-oem.h"
35 #include "wifi-direct-service.h"
36 #include "wifi-direct-wpasupplicant.h"
38 #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
39 #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
46 static char g_local_interface_ip_address[20];
47 static wfd_noti_cb g_noti_cb;
48 wfd_oem_event_cb g_oem_event_callback;
50 GList *g_conn_peer_addr;
51 static unsigned char g_assoc_sta_mac[6];
52 static unsigned char g_disassoc_sta_mac[6];
54 static int g_wps_event_block;
56 enum current_conn_direction
59 CONN_DIRECTION_INCOMING,
60 CONN_DIRECTION_OUTGOING,
63 static struct wfd_oem_operations supplicant_ops =
65 .wfd_oem_init = wfd_ws_init,
66 .wfd_oem_destroy = wfd_ws_destroy,
67 .wfd_oem_activate = wfd_ws_activate,
68 .wfd_oem_deactivate = wfd_ws_deactivate,
69 .wfd_oem_connect = wfd_ws_connect,
70 .wfd_oem_wps_pbc_start = wfd_ws_wps_pbc_start,
71 .wfd_oem_wps_pin_start = wfd_ws_wps_pin_start,
72 .wfd_oem_disconnect = wfd_ws_disconnect,
73 .wfd_oem_disconnect_sta = wfd_ws_disconnect_sta,
74 .wfd_oem_is_discovery_enabled = wfd_ws_is_discovery_enabled,
75 .wfd_oem_start_discovery = wfd_ws_start_discovery,
76 .wfd_oem_cancel_discovery = wfd_ws_cancel_discovery,
77 .wfd_oem_get_discovery_result = wfd_ws_get_discovery_result,
78 .wfd_oem_get_peer_info = wfd_ws_get_peer_info,
79 .wfd_oem_send_provision_discovery_request = wfd_ws_send_provision_discovery_request,
80 .wfd_oem_send_invite_request = wfd_ws_send_invite_request,
81 .wfd_oem_create_group = wfd_ws_create_group,
82 .wfd_oem_cancel_group = wfd_ws_cancel_group,
83 .wfd_oem_activate_pushbutton = wfd_ws_activate_pushbutton,
84 .wfd_oem_get_default_interface_name = wfd_ws_get_default_interface_name,
85 .wfd_oem_dhcpc_get_ip_address = wfd_ws_dhcpc_get_ip_address,
86 .wfd_oem_get_ip = wfd_ws_get_ip,
87 .wfd_oem_set_ssid = wfd_ws_set_ssid,
88 .wfd_oem_is_groupowner = wfd_ws_is_groupowner,
89 .wfd_oem_get_ssid = wfd_ws_get_ssid,
90 .wfd_oem_set_wps_pin = wfd_ws_set_wps_pin,
91 .wfd_oem_get_wps_pin = wfd_ws_get_wps_pin,
92 .wfd_oem_generate_wps_pin = wfd_ws_generate_wps_pin,
93 .wfd_oem_set_wpa_passphrase = wfd_ws_set_wpa_passphrase,
94 .wfd_oem_get_supported_wps_mode = wfd_ws_get_supported_wps_mode,
95 .wfd_oem_get_connected_peers_info = wfd_ws_get_connected_peers_info,
96 .wfd_oem_get_connected_peers_count = wfd_ws_get_connected_peers_count,
97 .wfd_oem_set_oem_loglevel = wfd_ws_set_oem_loglevel,
98 .wfd_oem_get_go_intent = wfd_ws_get_go_intent,
99 .wfd_oem_set_go_intent = wfd_ws_set_go_intent,
100 .wfd_oem_set_device_type = wfd_ws_set_device_type,
101 .wfd_oem_get_device_mac_address = wfd_ws_get_device_mac_address,
102 .wfd_oem_get_disassoc_sta_mac = wfd_ws_get_disassoc_sta_mac,
103 .wfd_oem_get_assoc_sta_mac = wfd_ws_get_assoc_sta_mac,
104 .wfd_oem_get_requestor_mac = wfd_ws_get_requestor_mac,
105 .wfd_oem_get_operating_channel = wfd_ws_get_operating_channel,
106 .wfd_oem_get_persistent_group_info = wfd_ws_get_persistent_group_info,
107 .wfd_oem_remove_persistent_group = wfd_ws_remove_persistent_group,
108 .wfd_oem_set_persistent_group_enabled = wfd_ws_set_persistent_reconnect,
109 .wfd_oem_connect_for_persistent_group = wfd_ws_connect_for_persistent_group,
112 int wfd_plugin_load( struct wfd_oem_operations **ops)
114 *ops = &supplicant_ops;
119 static gboolean __wfd_oem_thread_safe_event_handler_cb(GIOChannel* source, GIOCondition condition, gpointer data)
125 n = read(g_oem_pipe[0], &event, sizeof(event));
128 WDP_LOGE( "pipe read error, Error=[%s]\n",strerror(errno));
132 if (g_oem_event_callback != NULL)
133 g_oem_event_callback(event);
138 int __send_wpa_request(int sockfd, char *cmd, char *reply, size_t reply_buf_len)
140 __WDP_LOG_FUNC_ENTER__;
146 struct pollfd pollfd;
147 int timeout = 6000; /** for 6.0 sec */
151 WDP_LOGE("Invalid argument sfd=[%d]\n", sockfd);
157 WDP_LOGE("Invalid argument. Command is NULL\n");
160 cmd_len = strlen(cmd);
161 WDP_LOGI("cmd [%s] cmd_len[%d]\n", cmd, cmd_len);
163 result = write(sockfd, cmd, cmd_len);
166 WDP_LOGE( "Send cmd failed: [%d]\n", result);
167 __WDP_LOG_FUNC_EXIT__;
174 pollfd.events = POLLIN | POLLERR | POLLHUP;
175 pollret = poll(&pollfd, 1, timeout);
179 WDP_LOGI( "POLLing timeout. Nothing to read.\n");
180 __WDP_LOG_FUNC_EXIT__;
183 else if (pollret < 0)
185 WDP_LOGE("Polling error [%d]\n", pollret);
186 __WDP_LOG_FUNC_EXIT__;
191 if (pollfd.revents == POLLIN)
193 WDP_LOGD("POLLIN \n");
194 result = read(sockfd, (char *) reply, reply_buf_len);
196 WDP_LOGD("sockfd %d retval %d\n", sockfd, result);
197 WDP_LOGD("reply[%s]\n", reply);
201 WDP_LOGE( "Error!!! reading data, error [%s]\n", strerror(errno));
202 __WDP_LOG_FUNC_EXIT__;
209 WDP_LOGD("POLL EVENT=%d ignored\n", pollfd.revents);
210 __WDP_LOG_FUNC_EXIT__;
216 __WDP_LOG_FUNC_EXIT__;
221 int __create_ctrl_intf(char *ctrl_intf_name, char *path)
223 __WDP_LOG_FUNC_ENTER__;
225 struct sockaddr_un servAddr;
226 struct sockaddr_un localAddr;
227 char local_path[32] = {0, };
232 snprintf(local_path, sizeof(local_path), "/tmp/%s", ctrl_intf_name);
236 if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
238 WDP_LOGE( "Error!!! creating sync socket. Error = [%s].\n", strerror(errno));
239 __WDP_LOG_FUNC_EXIT__;
243 WDP_LOGI( "Created socket [%d]\n", sockfd);
245 memset(&servAddr, 0, sizeof(servAddr));
246 servAddr.sun_family = AF_UNIX;
247 strcpy(servAddr.sun_path, path);
248 len = sizeof(servAddr.sun_family) + strlen(path);
250 WDP_LOGD( "Connecting to server socket to register socket [%d]\n", sockfd);
252 memset(&localAddr, 0, sizeof(localAddr));
253 localAddr.sun_family = AF_UNIX;
254 strcpy(localAddr.sun_path, local_path);
256 if (bind(sockfd, (struct sockaddr*)&localAddr, sizeof(localAddr)) < 0)
258 WDP_LOGE( "Error!!! bind(). Error = [%s]. Try again..\n", strerror(errno));
260 unlink(localAddr.sun_path);
261 if (bind(sockfd, (struct sockaddr*)&localAddr, sizeof(localAddr)) < 0)
263 WDP_LOGE( "Error!!! bind(). Error = [%s]. Give up..\n", strerror(errno));
264 __WDP_LOG_FUNC_EXIT__;
270 if ((ret = connect(sockfd, (struct sockaddr *) &servAddr, sizeof(servAddr))) < 0)
273 if (unlink(path) < 0)
275 WDP_LOGE("unlink[ctrl_iface], Error=[%s]", strerror(errno));
276 __WDP_LOG_FUNC_EXIT__;
280 if (bind(sockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0)
282 WDP_LOGE("bind[PF_UNIX], Error=[%s]", strerror(errno));
283 __WDP_LOG_FUNC_EXIT__;
286 WDP_LOGI( "Successfully replaced leftover ctrl_iface socket [%s]\n", path);
289 __WDP_LOG_FUNC_EXIT__;
295 static int __read_socket_cb(int sockfd, char *dataptr, int datalen)
297 __WDP_LOG_FUNC_ENTER__;
300 struct pollfd pollfd;
301 int timeout = 2000; /** for 2 sec */
304 WDP_LOGD( "Reading msg from socketfd=[%d]\n", sockfd);
308 WDP_LOGE( "Error!!! Invalid socket FD [%d]\n", sockfd);
309 __WDP_LOG_FUNC_EXIT__;
313 if ((dataptr == NULL) || (datalen <= 0))
315 WDP_LOGE( "Error!!! Invalid parameter\n");
316 __WDP_LOG_FUNC_EXIT__;
321 //printf("@@@@@@@ len = %d @@@@@@@@@@@\n", datalen);
324 pollfd.events = POLLIN | POLLERR | POLLHUP;
325 pollret = poll(&pollfd, 1, timeout);
327 //printf("POLL ret = %d, \n", pollret);
331 if (pollfd.revents == POLLIN)
333 WDP_LOGD( "POLLIN\n");
336 retval = read(sockfd, (char *) dataptr, datalen);
337 WDP_LOGD( "sockfd %d retval %d\n", sockfd, retval);
340 WDP_LOGD( "Error!!! reading data, Error=[%s]\n", strerror(errno));
342 __WDP_LOG_FUNC_EXIT__;
345 else if (pollfd.revents & POLLHUP)
347 WDP_LOGD( "POLLHUP\n");
348 __WDP_LOG_FUNC_EXIT__;
352 else if (pollfd.revents & POLLERR)
354 WDP_LOGD( "POLLERR\n");
355 __WDP_LOG_FUNC_EXIT__;
359 else if (pollret == 0)
361 WDP_LOGD( "POLLing timeout \n");
362 __WDP_LOG_FUNC_EXIT__;
367 WDP_LOGD( "Polling unknown error \n");
368 __WDP_LOG_FUNC_EXIT__;
372 __WDP_LOG_FUNC_EXIT__;
377 void __polling_ip(char *ipaddr_buf, int len, int is_IPv6)
382 if (wfd_ws_dhcpc_get_ip_address(ipaddr_buf, len, is_IPv6) == true)
389 WDP_LOGE( "** Failed to get IP address!!\n");
392 char* __get_event_str(char*ptr, char* event_str)
413 event_str[c++] = *p++;
421 int __extract_value_str(char *str, char *key, char *value)
423 __WDP_LOG_FUNC_ENTER__;
424 char *tmp_str = NULL;
430 tmp_str = strstr(str, key);
433 WDP_LOGE( "Key[%s] is not found\n", key);
436 tmp_str = tmp_str + strlen(key) + 1;
437 //WDP_LOGD( "tmp_str [%s]\n", tmp_str);
439 for(i = 0; tmp_str[i]; i++)
441 if(tmp_str[i] == '\n' || tmp_str[i] == '\r' || tmp_str[i] == ' ')
447 memcpy(value, tmp_str, i);
450 WDP_LOGD( "extracted value [%s]\n", value);
452 __WDP_LOG_FUNC_EXIT__;
457 int __is_white_space(char c)
465 int __is_item_char(char c)
467 if (c >= 'a' && c <= 'z')
470 if (c >= 'A' && c <= 'Z')
473 if (c >= '0' && c <= '9')
495 char* __get_item_value(char*ptr, char* item, char* value)
518 if (__is_white_space(*p) || !__is_item_char(*p))
534 if (__is_white_space(*p))
546 char* __get_persistent_group_value(char*ptr, ws_network_info_s* group)
557 memset(value, 0, sizeof(value));
558 while(__is_item_char(*p))
562 group->network_id = atoi(value);
564 while(!__is_item_char(*p))
571 memset(value, 0, sizeof(value));
572 while(__is_item_char(*p))
576 strncpy(group->ssid, value, sizeof(group->ssid));
578 while(!__is_item_char(*p))
585 memset(value, 0, sizeof(value));
586 while(__is_item_char(*p))
590 strncpy(group->bssid, value, sizeof(group->bssid));
592 while(!__is_item_char(*p))
599 memset(value, 0, sizeof(value));
604 strncpy(group->flags, value, sizeof(group->flags));
611 int __parsing_peer(char* buf, ws_discovered_peer_info_s* peer)
613 __WDP_LOG_FUNC_ENTER__;
621 memset(peer, 0, sizeof(ws_discovered_peer_info_s));
624 strncpy(peer->mac, ptr, 17);
628 WDP_LOGD( "mac=%s\n", peer->mac);
632 ptr = __get_item_value(ptr, item, value);
636 //printf("item=%s, value=%s\n", item,value);
639 item_id = WS_PEER_INFO_NONE;
640 while(g_ws_field_info[i].item_id != WS_PEER_INFO_NONE)
642 if (strcmp(g_ws_field_info[i].item_str, item)==0)
644 item_id = g_ws_field_info[i].item_id;
652 case WS_PEER_INFO_AGE:
653 peer->age = atoi(value);
655 case WS_PEER_INFO_LISTEN_FREQ:
656 peer->listen_freq = atoi(value);
658 case WS_PEER_INFO_LEVEL:
659 peer->level = atoi(value);
661 case WS_PEER_INFO_WPS_METHOD:
662 strncpy(peer->wps_method, value, sizeof(peer->wps_method));
664 case WS_PEER_INFO_INTERFACE_ADDR:
665 strncpy(peer->interface_addr, value, sizeof(peer->interface_addr));
667 case WS_PEER_INFO_MEMBER_IN_GO_DEV:
668 strncpy(peer->member_in_go_dev, value, sizeof(peer->member_in_go_dev));
670 case WS_PEER_INFO_MEMBER_IN_GO_IFACE:
671 strncpy(peer->member_in_go_iface, value, sizeof(peer->member_in_go_iface));
673 case WS_PEER_INFO_PRI_DEV_TYPE:
674 strncpy(peer->pri_dev_type, value, sizeof(peer->pri_dev_type));
676 case WS_PEER_INFO_DEVICE_NAME:
677 strncpy(peer->device_name, value, sizeof(peer->device_name));
679 case WS_PEER_INFO_MANUFACTURER:
680 strncpy(peer->manufacturer, value, sizeof(peer->manufacturer));
682 case WS_PEER_INFO_MODEL_NAME:
683 strncpy(peer->model_name, value, sizeof(peer->model_name));
685 case WS_PEER_INFO_MODEL_NUMBER:
686 strncpy(peer->model_number, value, sizeof(peer->model_number));
688 case WS_PEER_INFO_SERIAL_NUMBER:
689 strncpy(peer->serial_number, value, sizeof(peer->serial_number));
691 case WS_PEER_INFO_CONFIG_METHODS:
694 unsigned long int ret = 0;
695 ret = strtoul(p, &p, 16);
696 if (ret == ULONG_MAX)
698 peer->config_methods = 0;
699 WDP_LOGE( "config_methods has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
703 peer->config_methods = (unsigned int)ret;
704 WDP_LOGD( "config_methods value=[%x <- %s]\n", peer->config_methods, value);
708 case WS_PEER_INFO_DEV_CAPAB:
711 unsigned long int ret = 0;
712 ret = strtoul(p, &p, 16);
713 if (ret == ULONG_MAX)
716 WDP_LOGE( "device_capab has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
720 peer->dev_capab = (unsigned int)ret;
721 WDP_LOGD( "device_capab value=[%x <- %s]\n", peer->dev_capab, value);
725 case WS_PEER_INFO_GROUP_CAPAB:
728 unsigned long int ret = 0;
729 ret = strtoul(p, &p, 16);
730 if (ret == ULONG_MAX)
732 peer->group_capab = 0;
733 WDP_LOGE( "group_capab has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
737 peer->group_capab = (unsigned int)ret;
738 WDP_LOGD( "group_capab value=[%x <- %s]\n", peer->group_capab, value);
742 case WS_PEER_INFO_GO_NEG_REQ_SENT:
743 peer->go_neg_req_sent = atoi(value);
745 case WS_PEER_INFO_GO_STATE:
746 strncpy(peer->go_state, value, sizeof(peer->go_state));
748 case WS_PEER_INFO_DIALOG_TOKEN:
749 peer->dialog_token = atoi(value);
751 case WS_PEER_INFO_INTENDED_ADDR:
752 strncpy(peer->intended_addr, value, sizeof(peer->intended_addr));
754 case WS_PEER_INFO_COUNTRY:
755 strncpy(peer->country, value, sizeof(peer->country));
757 case WS_PEER_INFO_OPER_FREQ:
758 peer->oper_freq = atoi(value);
760 case WS_PEER_INFO_REQ_CONFIG_METHODS:
761 peer->req_config_methods = atoi(value);
763 case WS_PEER_INFO_FLAGS:
764 strncpy(peer->flags, value, sizeof(peer->flags));
766 case WS_PEER_INFO_STATUS:
767 strncpy(peer->status, value, sizeof(peer->status));
769 case WS_PEER_INFO_WAIT_COUNT:
770 peer->wait_count = atoi(value);
772 case WS_PEER_INFO_INVITATION_REQS:
773 peer->invitation_reqs = atoi(value);
775 case WS_PEER_INFO_OPER_SSID:
776 strncpy(peer->oper_ssid, value, sizeof(peer->oper_ssid));
779 /*----- Miracast -----*/
780 case WS_PEER_INFO_IS_WFD_DEVICE:
781 peer->is_wfd_device = atoi(value);
785 WDP_LOGD( "unknown field\n");
790 __WDP_LOG_FUNC_EXIT__;
797 int __parsing_persistent_group(char* buf, ws_network_info_s ws_persistent_group_list[], int* persistent_group_num)
799 __WDP_LOG_FUNC_ENTER__;
802 ws_network_info_s group;
805 memset(&group, 0, sizeof(ws_network_info_s));
808 // Passing first line : "network id / ssid / bssid / flags"
818 ptr = __get_persistent_group_value(ptr, &group);
820 ws_persistent_group_list[count].network_id = group.network_id;
821 strncpy(ws_persistent_group_list[count].ssid, group.ssid, sizeof(ws_persistent_group_list[count].ssid));
822 strncpy(ws_persistent_group_list[count].bssid, group.bssid, sizeof(ws_persistent_group_list[count].bssid));
823 strncpy(ws_persistent_group_list[count].flags, group.flags, sizeof(ws_persistent_group_list[count].flags));
827 *persistent_group_num = count;
829 __WDP_LOG_FUNC_EXIT__;
834 void __parsing_ws_event(char* buf, ws_event_s *event)
836 __WDP_LOG_FUNC_ENTER__;
841 ws_field_id_e event_id;
846 WDP_LOGE( "ERROR : buf is NULL!!\n");
851 ptr = __get_event_str(ptr, event_str);
853 if (NULL != event_str)
854 WDP_LOGD( "event str [%s]\n", event_str);
857 event_id = WS_EVENT_NONE;
858 while(g_ws_event_info[i].id != WS_EVENT_NONE)
860 if (strcmp(g_ws_event_info[i].str, event_str)==0)
862 event_id = g_ws_event_info[i].id;
870 memset(event, 0, sizeof(ws_event_s));
872 case WS_EVENT_DISCOVER_FOUND_PEER:
873 event->id = WS_EVENT_DISCOVER_FOUND_PEER;
874 WDP_LOGD( "WS EVENT : [WS_EVENT_DISCOVER_FOUND_PEER]\n");
877 case WS_EVENT_PROVISION_DISCOVERY_RESPONSE:
878 event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE;
879 ptr = __get_event_str(ptr, event_str);
880 strncpy(event->peer_mac_address, event_str, sizeof(event->peer_mac_address));
881 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE]\n");
882 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
885 case WS_EVENT_PROVISION_DISCOVERY_PBC_REQ:
886 event->id = WS_EVENT_PROVISION_DISCOVERY_PBC_REQ;
887 res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
890 WDP_LOGE( "Failed to extract p2p_dev_addr");
891 // TO-DO: stop parsing and make event callback function stop
892 __WDP_LOG_FUNC_EXIT__;
895 res = __extract_value_str(ptr, "name" , event->peer_ssid);
898 WDP_LOGE( "Failed to extract name(ssid)");
899 // TO-DO: stop parsing and make event callback function stop
900 __WDP_LOG_FUNC_EXIT__;
903 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_PBC_REQ]\n");
904 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
907 case WS_EVENT_PROVISION_DISCOVERY_DISPLAY:
908 event->id = WS_EVENT_PROVISION_DISCOVERY_DISPLAY;
909 res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
912 WDP_LOGD( "Failed to extract p2p_dev_addr");
913 WDP_LOGD( "Prov disc Response : DISPLAY");
914 event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY;
915 ptr = __get_event_str(ptr, event_str);
916 strncpy(event->peer_mac_address, event_str, sizeof(event->peer_mac_address));
917 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY]\n");
918 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
919 ptr = __get_event_str(ptr, event_str);
920 strncpy(event->wps_pin, event_str, sizeof(event->wps_pin));
921 WDP_LOGD( "WS EVENT : [PIN : %s]\n", event_str);
922 __WDP_LOG_FUNC_EXIT__;
925 ptr = __get_event_str(ptr, event_str); /* Stepping Mac Addr */
926 ptr = __get_event_str(ptr, event_str); /* Stepping PIN */
927 memset(event->wps_pin, 0x00, sizeof(event->wps_pin));
928 strncpy(event->wps_pin, event_str, sizeof(event->wps_pin));
929 WDP_LOGD( "WS EVENT : [PIN : %s]\n", event_str);
931 res = __extract_value_str(ptr, "name" , event->peer_ssid);
934 WDP_LOGE( "Failed to extract name(ssid)");
935 __WDP_LOG_FUNC_EXIT__;
938 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_DISPLAY]\n");
939 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
942 case WS_EVENT_PROVISION_DISCOVERY_KEYPAD:
943 event->id = WS_EVENT_PROVISION_DISCOVERY_KEYPAD;
944 res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
947 WDP_LOGD( "Failed to extract p2p_dev_addr");
948 WDP_LOGD( "Prov disc Response : KEYPAD");
949 event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD;
950 ptr = __get_event_str(ptr, event_str);
951 strncpy(event->peer_mac_address, event_str, sizeof(event->peer_mac_address));
952 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD]\n");
953 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
954 __WDP_LOG_FUNC_EXIT__;
957 res = __extract_value_str(ptr, "name" , event->peer_ssid);
960 WDP_LOGE( "Failed to extract name(ssid)");
961 __WDP_LOG_FUNC_EXIT__;
964 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_KEYPAD]\n");
965 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
968 case WS_EVENT_GROUP_FORMATION_SUCCESS:
969 case WS_EVENT_GROUP_FORMATION_FAILURE:
970 event->id = event_id;
973 case WS_EVENT_GROUP_STARTED:
974 event->id = WS_EVENT_GROUP_STARTED;
975 WDP_LOGD( "WS EVENT : [WS_EVENT_GROUP_STARTED]\n");
979 dev_addr = (char*) calloc(1, 18);
980 res = __extract_value_str(ptr, "dev_addr", dev_addr);
982 strcpy(event->peer_mac_address, dev_addr);
984 WDP_LOGD( "connected peer mac address [%s]", event->peer_mac_address);
986 /* for checking persistent group */
988 dummy = (char*) calloc(1, 18); /* dummy */
989 res = __extract_value_str(ptr, "PERSISTENT", dummy);
992 WDP_LOGD( "[PERSISTENT GROUP]");
993 event->id = WS_EVENT_PERSISTENT_GROUP_STARTED;
999 case WS_EVENT_GROUP_REMOVED:
1000 event->id = WS_EVENT_GROUP_REMOVED;
1001 WDP_LOGD( "WS EVENT : [WS_EVENT_GROUP_REMOVED]\n");
1004 case WS_EVENT_TERMINATING:
1005 event->id = WS_EVENT_TERMINATING;
1006 WDP_LOGD( "WS EVENT : [WS_EVENT_TERMINATING]\n");
1009 case WS_EVENT_CONNECTED:
1011 WDP_LOGD( "WS EVENT : [WS_EVENT_CONNECTED]\n");
1014 intf_addr = (char*) calloc(1, 18);
1015 event->id = WS_EVENT_CONNECTED;
1016 res = __extract_value_str(ptr, "to", intf_addr);
1018 wfd_macaddr_atoe(intf_addr, g_assoc_sta_mac);
1019 WDP_LOGD( "connected peer interface mac address [%s]", intf_addr);
1024 case WS_EVENT_STA_CONNECTED:
1026 WDP_LOGD( "WS EVENT : [WS_EVENT_STA_CONNECTED]\n");
1028 event->id = WS_EVENT_STA_CONNECTED;
1030 ptr = __get_event_str(ptr, event_str);
1031 strncpy(event->peer_intf_mac_address, event_str, sizeof(event->peer_intf_mac_address));
1033 res = __extract_value_str(ptr, "dev_addr", event->peer_mac_address);
1035 WDP_LOGD("Key %s is not found", "dev_addr");
1037 WDP_LOGD("Empty value");
1039 WDP_LOGD( "connected peer mac address [%s]", event->peer_intf_mac_address);
1043 case WS_EVENT_DISCONNECTED:
1045 WDP_LOGD( "WS EVENT : [WS_EVENT_DISCONNECTED]\n");
1048 intf_addr = (char*) calloc(1, 18);
1049 event->id = WS_EVENT_DISCONNECTED;
1050 res = __extract_value_str(ptr, "to", intf_addr);
1052 strncpy(event->peer_mac_address, intf_addr, 18);
1054 WDP_LOGD( "disconnected peer mac address [%s]", event->peer_mac_address);
1058 case WS_EVENT_STA_DISCONNECTED:
1060 WDP_LOGD( "WS EVENT : [WS_EVENT_STA_DISCONNECTED]\n");
1062 event->id = WS_EVENT_STA_DISCONNECTED;
1064 ptr = __get_event_str(ptr, event_str);
1065 strncpy(event->peer_intf_mac_address, event_str, sizeof(event->peer_intf_mac_address));
1067 res = __extract_value_str(ptr, "dev_addr", event->peer_mac_address);
1069 WDP_LOGD("Key %s is not found", "dev_addr");
1071 WDP_LOGD("Empty value");
1073 WDP_LOGD( "disconnected peer mac address [%s]", event->peer_intf_mac_address);
1077 case WS_EVENT_INVITATION_REQ:
1079 WDP_LOGD( "WS EVENT : [WS_EVENT_INVITATION_REQ]\n");
1081 event->id = WS_EVENT_INVITATION_REQ;
1084 res = __extract_value_str(ptr, "go_dev_addr", event->peer_mac_address);
1086 res = __extract_value_str(ptr, "bssid", event->peer_mac_address);
1090 WDP_LOGE( "Failed to extract p2p_dev_addr");
1091 __WDP_LOG_FUNC_EXIT__;
1094 WDP_LOGD( "WS EVENT : [GO MAC : %s]\n", event->peer_mac_address);
1098 case WS_EVENT_INVITATION_RSP:
1100 WDP_LOGD( "WS EVENT : [WS_EVENT_INVITATION_RSP]\n");
1102 event->id = WS_EVENT_INVITATION_RSP;
1105 res = __extract_value_str(ptr, "status", );
1108 WDP_LOGE( "Failed to extract p2p_dev_addr");
1111 WDP_LOGD( "WS EVENT : [GO MAC : %s]\n", event->peer_mac_address);
1116 case WS_EVENT_GO_NEG_REQUEST:
1118 WDP_LOGD( "WS EVENT : [WS_EVENT_GO_NEG_REQUEST]");
1120 event->id = WS_EVENT_GO_NEG_REQUEST;
1121 ptr = __get_event_str(ptr + 19, event_str);
1122 strncpy(event->peer_intf_mac_address, event_str, sizeof(event->peer_intf_mac_address));
1126 case WS_EVENT_WPS_FAIL:
1128 WDP_LOGD("WS EVENT : [WS_EVENT_WPS_FAIL]");
1129 char config_error[4] = {0, };
1130 event->id = WS_EVENT_WPS_FAIL;
1131 ptr = __extract_value_str(ptr, "config_error", config_error);
1132 event->msg = atoi(config_error);
1137 WDP_LOGE( "ERROR : unknown event !!\n");
1141 __WDP_LOG_FUNC_EXIT__;
1147 int __store_persistent_peer(int network_id, char* persistent_group_ssid, char* peer_mac_address)
1149 __WDP_LOG_FUNC_ENTER__;
1154 snprintf(buf, sizeof(buf), "%d %s %s\n",network_id, persistent_group_ssid, peer_mac_address);
1156 fp = fopen(PERSISTENT_PEER_PATH, "a");
1159 WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
1160 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
1163 //fseek(fp, 0, SEEK_END);
1167 __WDP_LOG_FUNC_EXIT__;
1172 int __get_network_id_from_network_list_with_ssid(char* persistent_group_ssid)
1174 __WDP_LOG_FUNC_ENTER__;
1176 int persistent_group_count = 0;
1179 wfd_persistent_group_info_s* plist;
1181 WDP_LOGD( "search with persistent_group_ssid = [%s]\n",persistent_group_ssid);
1183 result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
1186 if (persistent_group_count > 0)
1188 for(i=0; i<persistent_group_count; i++)
1190 WDP_LOGD( "plist[%d].ssid=[%s]\n", i,plist[i].ssid);
1191 if (strcmp(plist[i].ssid, persistent_group_ssid) == 0)
1193 WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
1194 return plist[i].network_id;
1197 WDP_LOGE( "There is no Persistent Group has ssid[%s]\n", persistent_group_ssid);
1198 __WDP_LOG_FUNC_EXIT__;
1203 WDP_LOGE( "have no Persistent Group!!\n");
1204 __WDP_LOG_FUNC_EXIT__;
1210 WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
1211 __WDP_LOG_FUNC_EXIT__;
1216 int __get_network_id_from_network_list_with_go_mac(char* go_mac_address)
1218 __WDP_LOG_FUNC_ENTER__;
1220 int persistent_group_count = 0;
1223 wfd_persistent_group_info_s* plist;
1224 char mac_str[18] = {0, };
1226 WDP_LOGD( "search with persistent_group go_mac_address = [%s]\n",go_mac_address);
1228 result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
1231 if (persistent_group_count > 0)
1233 for(i=0; i<persistent_group_count; i++)
1235 snprintf(mac_str, 18, MACSTR, MAC2STR(plist[i].go_mac_address));
1236 WDP_LOGD( "plist[%d].go_mac_address=[%s]\n", i,mac_str);
1237 if (strcmp(mac_str, go_mac_address) == 0)
1239 WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
1240 return plist[i].network_id;
1243 WDP_LOGE( "There is no Persistent Group has go mac[%s]\n", go_mac_address);
1244 __WDP_LOG_FUNC_EXIT__;
1249 WDP_LOGE( "have no Persistent Group!!\n");
1250 __WDP_LOG_FUNC_EXIT__;
1256 WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
1257 __WDP_LOG_FUNC_EXIT__;
1263 int __get_network_id_from_persistent_client_list_with_mac(char* peer_mac_address)
1265 __WDP_LOG_FUNC_ENTER__;
1271 char stored_ssid[64] = "";
1272 char stored_peer_mac[18] = "";
1274 fp = fopen(PERSISTENT_PEER_PATH, "r");
1277 WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
1278 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
1281 while(fgets(buf, 100, fp) != NULL)
1283 n = sscanf(buf,"%d %s %s", &network_id, stored_ssid, stored_peer_mac);
1284 WDP_LOGD( "network_id=[%d], ssid=[%s], peer_mac=[%s]\n",network_id, stored_ssid, stored_peer_mac);
1286 if (strcmp(stored_peer_mac, peer_mac_address) == 0)
1293 WDP_LOGD( "Can not find peer mac in persistent peer list\n");
1295 __WDP_LOG_FUNC_EXIT__;
1300 bool __is_already_stored_persistent_client(int network_id, char* peer_mac_address)
1302 __WDP_LOG_FUNC_ENTER__;
1307 int stored_network_id;
1308 char stored_ssid[64] = "";
1309 char stored_peer_mac[18] = "";
1311 fp = fopen(PERSISTENT_PEER_PATH, "r");
1314 WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
1315 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
1318 while(fgets(buf, 100, fp) != NULL)
1320 n = sscanf(buf,"%d %s %s", &stored_network_id, stored_ssid, stored_peer_mac);
1321 WDP_LOGD( "stored_network_id=[%d], stored_ssid=[%s], stored_peer_mac=[%s]\n",stored_network_id, stored_ssid, stored_peer_mac);
1323 if ((strcmp(stored_peer_mac, peer_mac_address) == 0)
1324 && (stored_network_id == network_id))
1326 WDP_LOGD( "found peer in persistent peer list\n");
1327 __WDP_LOG_FUNC_EXIT__;
1333 WDP_LOGD( "Can not find peer in persistent peer list\n");
1334 __WDP_LOG_FUNC_EXIT__;
1339 int __get_persistent_group_clients(void)
1341 __WDP_LOG_FUNC_ENTER__;
1348 char peer_mac[18] = "";
1350 fp = fopen(PERSISTENT_PEER_PATH, "r");
1353 WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
1354 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
1357 while(fgets(buf, 100, fp) != NULL)
1359 n = sscanf(buf,"%d %s %s", &network_id, ssid, peer_mac);
1360 WDP_LOGD( "network_id=[%d], ssid=[%s], peer_mac=[%s]\n",network_id, ssid, peer_mac);
1364 __WDP_LOG_FUNC_EXIT__;
1369 int __send_invite_request_with_network_id(int network_id, unsigned char dev_mac_addr[6])
1371 __WDP_LOG_FUNC_ENTER__;
1373 char cmd[128] = {0, };
1374 char mac_str[18] = {0, };
1375 char res_buffer[1024]={0,};
1376 int res_buffer_len = sizeof(res_buffer);
1379 snprintf(mac_str, 18, MACSTR, MAC2STR(dev_mac_addr));
1380 snprintf(cmd, sizeof(cmd), "%s persistent=%d peer=%s", CMD_SEND_INVITE_REQ, network_id, mac_str);
1382 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
1383 WDP_LOGD( "__send_wpa_request(p2p_invite persistent=%d peer=%s) result=[%d]\n", network_id, mac_str, result);
1387 WDP_LOGE( "__send_wpa_request FAILED!!\n");
1388 __WDP_LOG_FUNC_EXIT__;
1392 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
1394 WDP_LOGE( "__send_wpa_request FAILED!!\n");
1395 __WDP_LOG_FUNC_EXIT__;
1399 WDP_LOGD( "Invite... peer-MAC [%s]\n", mac_str);
1401 __WDP_LOG_FUNC_EXIT__;
1405 int glist_compare_peer_mac_cb(const void* data1, const void* data2)
1407 char *mac_str1 = (char*) data1;
1408 char *mac_str2 = (char*) data2;
1411 if (data1==NULL || data2==NULL)
1413 WDP_LOGE( "Error!! data is NULL\n");
1417 r = strcmp(mac_str1, mac_str2);
1424 void glist_print_connected_peer_cb(gpointer data, gpointer user_data)
1426 char *mac_str = (char*) data;
1427 int count = *(int*)user_data;
1428 WDP_LOGD( "Connected peer[%d] mac=[%s]\n", count, mac_str);
1429 *(int*)user_data = count+1;
1432 void wfd_ws_print_connected_peer()
1434 WDP_LOGD( "Connected Peer Table\n");
1436 g_list_foreach(g_conn_peer_addr, glist_print_connected_peer_cb, &count);
1437 WDP_LOGD( "Count=%d\n", count);
1440 void wfd_ws_glist_reset_connected_peer()
1442 if(g_conn_peer_addr)
1444 GList *element = NULL;
1446 element = g_list_first(g_conn_peer_addr);
1450 free((char*) element->data);
1451 element = g_list_next(element);
1453 g_list_free(g_conn_peer_addr);
1454 g_conn_peer_addr = NULL;
1459 static gboolean __ws_event_callback(GIOChannel * source,
1460 GIOCondition condition,
1463 __WDP_LOG_FUNC_ENTER__;
1465 int sockfd = g_monitor_sockfd;
1466 char buffer[4096] = {0, };
1468 ws_event_s event = {0,};
1471 if ( (n = __read_socket_cb(sockfd, buffer, sizeof(buffer))) < 0)
1473 WDP_LOGE( "Error!!! Reading Async Event[%d]\n", sockfd);
1474 __WDP_LOG_FUNC_EXIT__;
1478 WDP_LOGD( "Received Event:[%d, %s]\n", n, buffer);
1480 __parsing_ws_event(buffer, &event);
1482 WDP_LOGD( "EVENT ID = %d\n", event.id);
1486 case WS_EVENT_DISCOVER_FOUND_PEER:
1487 g_noti_cb(WFD_EVENT_DISCOVER_FOUND_PEERS);
1490 case WS_EVENT_PROVISION_DISCOVERY_RESPONSE:
1492 unsigned char la_mac_addr[6];
1493 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1495 wfd_server_control_t * wfd_server = wfd_server_get_control();
1497 WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
1498 if (wfd_server->current_peer.is_group_owner == FALSE)
1499 wfd_ws_connect(la_mac_addr, WIFI_DIRECT_WPS_TYPE_PBC);
1503 case WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY:
1505 if (g_wps_event_block)
1508 g_wps_event_block = 1;
1509 unsigned char la_mac_addr[6];
1510 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1511 memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
1512 memcpy(g_incomming_peer_mac_address, la_mac_addr, 6);
1513 memset(g_wps_pin, 0x00, sizeof(g_wps_pin));
1514 memcpy(&g_wps_pin, event.wps_pin, 8);
1515 WDP_LOGD( "MAC ADDR = " MACSTR "(a)\tPIN = %s\n", MAC2STR(g_incomming_peer_mac_address), g_wps_pin);
1516 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY);
1520 case WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD:
1522 if (g_wps_event_block)
1525 g_wps_event_block = 1;
1526 unsigned char la_mac_addr[6];
1527 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1528 memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
1529 memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
1530 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD);
1535 case WS_EVENT_PROVISION_DISCOVERY_PBC_REQ:
1536 case WS_EVENT_PROVISION_DISCOVERY_DISPLAY:
1537 case WS_EVENT_PROVISION_DISCOVERY_KEYPAD:
1539 if (g_wps_event_block)
1542 g_wps_event_block = 1;
1543 WDP_LOGD("Incomming PROV_DISC [%d]", event.id);
1544 unsigned char la_mac_addr[6];
1545 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1546 memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
1547 memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
1548 memset(g_incomming_peer_ssid, 0, sizeof(g_incomming_peer_ssid));
1549 strncpy(g_incomming_peer_ssid, event.peer_ssid, sizeof(g_incomming_peer_ssid));
1550 if (event.wps_pin != NULL) {
1551 WDP_LOGD( "NEW PIN RECEIVED = %s\n", event.wps_pin);
1552 memset(g_wps_pin, 0x00, sizeof(g_wps_pin));
1553 strncpy(g_wps_pin, event.wps_pin, sizeof(g_wps_pin));
1555 WDP_LOGD( "Prov Req: mac[" MACSTR"] ssid=[%s]\n",
1556 MAC2STR(g_incomming_peer_mac_address), g_incomming_peer_ssid);
1558 if (WS_EVENT_PROVISION_DISCOVERY_DISPLAY == event.id)
1559 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY);
1560 else if (WS_EVENT_PROVISION_DISCOVERY_KEYPAD == event.id)
1561 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD);
1563 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST);
1567 case WS_EVENT_GROUP_FORMATION_SUCCESS:
1568 case WS_EVENT_GROUP_FORMATION_FAILURE:
1569 g_wps_event_block = 0;
1572 case WS_EVENT_GROUP_STARTED:
1574 g_wps_event_block = 0;
1576 if(wfd_ws_is_groupowner())
1578 WDP_LOGD(" CHECK : It's AP... \n");
1579 system("/usr/bin/wifi-direct-dhcp.sh server");
1580 __polling_ip(g_local_interface_ip_address, 20, FALSE);
1581 WDP_LOGE( "*** IP : %s\n", g_local_interface_ip_address);
1583 g_noti_cb(WFD_EVENT_SOFTAP_READY);
1587 wfd_ws_glist_reset_connected_peer();
1589 g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
1590 WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
1592 g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
1597 case WS_EVENT_PERSISTENT_GROUP_STARTED:
1599 if(wfd_ws_is_groupowner())
1601 WDP_LOGD(" CHECK : It's AP... \n");
1602 system("/usr/bin/wifi-direct-dhcp.sh server");
1603 __polling_ip(g_local_interface_ip_address, 20, FALSE);
1604 WDP_LOGE( "*** IP : %s\n", g_local_interface_ip_address);
1606 g_noti_cb(WFD_EVENT_SOFTAP_READY);
1610 wfd_ws_glist_reset_connected_peer();
1612 g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
1613 WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
1615 /* We need to store current peer
1616 because, persistent joining is excuted silencely without client event.*/
1617 unsigned char la_mac_addr[6];
1618 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1619 wfd_server_remember_connecting_peer(la_mac_addr);
1620 wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
1622 g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
1627 case WS_EVENT_GROUP_REMOVED:
1629 system("/usr/bin/wifi-direct-dhcp.sh stop");
1630 g_noti_cb(WFD_EVENT_CREATE_LINK_CANCEL);
1631 g_noti_cb(WFD_EVENT_CREATE_LINK_DOWN);
1632 g_noti_cb(WFD_EVENT_SOFTAP_STOP);
1634 wfd_ws_glist_reset_connected_peer();
1641 case WS_EVENT_TERMINATING:
1642 system("/usr/bin/wlan.sh stop");
1643 system("/usr/sbin/p2p_supp.sh stop");
1644 WDP_LOGE( "Device is Deactivated\n");
1647 case WS_EVENT_CONNECTED:
1653 case WS_EVENT_DISCONNECTED:
1655 GList *element = NULL;
1656 element = g_list_find(g_conn_peer_addr, event.peer_mac_address);
1659 g_conn_peer_addr = g_list_remove(g_conn_peer_addr, event.peer_mac_address);
1660 WDP_LOGD( "disconnected peer[%s] is removed\n", event.peer_mac_address);
1661 free((char*) element->data);
1666 case WS_EVENT_STA_CONNECTED:
1668 g_wps_event_block = 0;
1669 GList *element = NULL;
1670 element = g_list_find_custom(g_conn_peer_addr, event.peer_mac_address, glist_compare_peer_mac_cb);
1673 g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
1674 WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
1677 wfd_ws_print_connected_peer();
1679 wfd_macaddr_atoe(event.peer_intf_mac_address, g_assoc_sta_mac);
1681 wfd_server_control_t * wfd_server = wfd_server_get_control();
1682 if (wfd_server->config_data.want_persistent_group == true)
1684 char g_persistent_group_ssid[64];
1688 memset(g_persistent_group_ssid, 0, sizeof(g_persistent_group_ssid));
1689 wfd_ws_get_ssid(g_persistent_group_ssid, 64);
1691 /* find network id with ssid */
1692 network_id = __get_network_id_from_network_list_with_ssid(g_persistent_group_ssid);
1693 if (network_id < 0) /* NOT Persistent group */
1695 WDP_LOGD( "__get_network_id_from_network_list_with_ssid FAIL!![%d]\n", network_id);
1696 WDP_LOGD( "[NOT Persistent Group]\n");
1698 else /* Persistent group */
1700 /* checking peer list whether the peer is already stored or not */
1701 if (__is_already_stored_persistent_client(network_id, event.peer_mac_address) == false)
1703 /* storing new persistent group client*/
1704 result = __store_persistent_peer(network_id, g_persistent_group_ssid, event.peer_mac_address);
1706 WDP_LOGD( "__store_persistent_peer FAIL!![%d]\n", result);
1709 /* We need to store current peer
1710 because, persistent joining is excuted silencely without client event.*/
1711 unsigned char la_mac_addr[6];
1712 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1713 wfd_server_remember_connecting_peer(la_mac_addr);
1714 wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
1718 g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
1721 case WS_EVENT_STA_DISCONNECTED:
1723 GList *element = NULL;
1725 wfd_ws_print_connected_peer();
1727 element = g_list_find_custom(g_conn_peer_addr, event.peer_mac_address, glist_compare_peer_mac_cb);
1730 g_conn_peer_addr = g_list_remove(g_conn_peer_addr, element->data);
1731 WDP_LOGD( "disconnected peer[%s] is removed\n", event.peer_mac_address);
1732 wfd_ws_print_connected_peer();
1736 WDP_LOGD( "Something wrong.. disconnected peer[%s] is not in Table\n", event.peer_mac_address);
1738 wfd_macaddr_atoe(event.peer_intf_mac_address, g_disassoc_sta_mac);
1739 g_noti_cb(WFD_EVENT_SOFTAP_STA_DISASSOC);
1743 case WS_EVENT_INVITATION_REQ:
1745 unsigned char la_mac_addr[6];
1746 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1747 memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
1748 WDP_LOGD( "INVITATION REQ. RECEIVED: mac[" MACSTR"]\n", MAC2STR(g_incomming_peer_mac_address));
1749 wfd_ws_start_discovery(false, 0);
1751 g_noti_cb(WFD_EVENT_INVITE_REQUEST);
1755 case WS_EVENT_INVITATION_RSP:
1760 case WS_EVENT_WPS_FAIL:
1762 if (event.msg == WPS_ERROR_PASSWORD_MISMATCH) {
1763 WDP_LOGD("WPS_ERROR_PASSWORD_MISMATCH");
1764 g_noti_cb(WFD_EVENT_CREATE_LINK_AUTH_FAIL);
1774 __WDP_LOG_FUNC_EXIT__;
1779 int __convert_category_from_type(char *pri_dev_type)
1781 __WDP_LOG_FUNC_ENTER__;
1782 char *saveptr = NULL;
1785 if(pri_dev_type == NULL)
1787 WDP_LOGE( "Incorrect parameter\n");
1791 token = strtok_r(pri_dev_type, "-", &saveptr);
1794 WDP_LOGD( "Extracting failed\n");
1798 if(!strcmp(token, "255"))
1799 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_OTHER;
1800 else if(!strcmp(token, "11"))
1801 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_AUDIO;
1802 else if(!strcmp(token, "10"))
1803 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE;
1804 else if(!strcmp(token, "9"))
1805 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_GAME_DEVICE;
1806 else if(!strcmp(token, "8"))
1807 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_MULTIMEDIA_DEVICE;
1808 else if(!strcmp(token, "7"))
1809 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_DISPLAY;
1810 else if(!strcmp(token, "6"))
1811 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_NETWORK_INFRA;
1812 else if(!strcmp(token, "5"))
1813 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_STORAGE;
1814 else if(!strcmp(token, "4"))
1815 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_CAMERA;
1816 else if(!strcmp(token, "3"))
1817 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_PRINTER;
1818 else if(!strcmp(token, "2"))
1819 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_INPUT_DEVICE;
1820 else if(!strcmp(token, "1"))
1821 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_COMPUTER;
1824 WDP_LOGD( "Unknown device type [%s]\n", token);
1827 __WDP_LOG_FUNC_EXIT__;
1832 int __wpa_ctrl_attach(int sockfd)
1834 __WDP_LOG_FUNC_ENTER__;
1837 char res_buffer[1024]={0,};
1838 int res_buffer_len=sizeof(res_buffer);
1841 strncpy(cmd, CMD_ATTACH, sizeof(cmd));
1842 result = __send_wpa_request(sockfd, cmd, (char*)res_buffer, res_buffer_len);
1843 WDP_LOGE( "__send_wpa_request(ATTACH) result=[%d]\n", result);
1846 WDP_LOGE( "__send_wpa_request FAILED!!\n");
1848 __WDP_LOG_FUNC_EXIT__;
1857 __convert_wps_config_methods_value(wifi_direct_wps_type_e wps_config_methods)
1859 __WDP_LOG_FUNC_ENTER__;
1861 WDP_LOGD("wps_config_methods [%d]\n", wps_config_methods);
1863 switch(wps_config_methods)
1865 case WIFI_DIRECT_WPS_TYPE_PBC:
1867 __WDP_LOG_FUNC_EXIT__;
1872 case WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY:
1874 __WDP_LOG_FUNC_EXIT__;
1879 case WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD:
1881 __WDP_LOG_FUNC_EXIT__;
1888 WDP_LOGD("Invalid input parameter!\n");
1889 __WDP_LOG_FUNC_EXIT__;
1898 __convert_device_type(char *ptr)
1900 __WDP_LOG_FUNC_ENTER__;
1904 char category_type[3] = {0,};
1908 WDP_LOGE( "ERROR : ptr is NULL!!\n");
1913 while(*p != '-') // take the first number before the first '-' (e.g. 1-0050F204-5)
1915 category_type[c++] = *p++;
1917 category_type[c]='\0';
1919 WDP_LOGD("category=[%d]\n", atoi(category_type));
1921 __WDP_LOG_FUNC_EXIT__;
1923 return atoi(category_type);
1927 __convert_secondary_device_type(char *ptr)
1929 __WDP_LOG_FUNC_ENTER__;
1933 char category_type[3] = {0,};
1937 WDP_LOGE( "ERROR : ptr is NULL!!\n");
1941 p = strstr(ptr, WIFI_ALLIANCE_OUI);
1944 WDP_LOGE( "ERROR : Unknown OUI, It's vendor specific device type..\n");
1947 p += strlen(WIFI_ALLIANCE_OUI); // // skip OUI (e.g. 1-0050F204-5)
1948 p ++; // skip the second '-' (e.g. 1-0050F204-5)
1953 category_type[c++] = *p++;
1955 category_type[c]='\0';
1957 WDP_LOGD("sub-category [%d]\n", atoi(category_type));
1959 __WDP_LOG_FUNC_EXIT__;
1961 return atoi(category_type);
1965 int __convert_freq_to_channel(char *freq_kHz)
1967 __WDP_LOG_FUNC_ENTER__;
1971 while(g_ws_op_channel_info[i].channel != 0)
1973 if (strcmp(g_ws_op_channel_info[i].freq, freq_kHz)==0)
1975 channel = g_ws_op_channel_info[i].channel;
1981 __WDP_LOG_FUNC_EXIT__;
1986 #if 1 // Threadsafe event handling.
1988 void __wfd_oem_callback(wfd_event_t event)
1990 // write header parts
1991 write(g_oem_pipe[1], &event, sizeof(event));
1996 void __wfd_oem_callback(wfd_event_t event_type)
1998 if (g_oem_event_callback != NULL)
1999 g_oem_event_callback(event_type);
2004 int __wfd_ws_reinvoke_persistent_group(int network_id)
2006 __WDP_LOG_FUNC_ENTER__;
2008 char cmd[64] = {0, };
2009 char res_buffer[1024]={0,};
2010 int res_buffer_len = sizeof(res_buffer);
2013 /* Persistent group mode */
2014 snprintf(cmd, sizeof(cmd), "%s %s%d", CMD_CREATE_GROUP, "persistent=", network_id);
2016 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2017 WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD persistent=%d) result=[%d]\n", network_id, result);
2021 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2022 __WDP_LOG_FUNC_EXIT__;
2026 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2028 __WDP_LOG_FUNC_EXIT__;
2032 WDP_LOGD( "Create p2p persistent group... \n");
2034 __WDP_LOG_FUNC_EXIT__;
2038 int wfd_ws_init(wfd_oem_event_cb event_callback)
2040 __WDP_LOG_FUNC_ENTER__;
2042 #if 1 // Threadsafe event handling
2043 if (pipe(g_oem_pipe) < 0) {
2044 WDP_LOGD( "pipe error : Error=[%s]\n", strerror(errno));
2048 GIOChannel* gio2 = g_io_channel_unix_new(g_oem_pipe[0]);
2049 g_io_add_watch(gio2, G_IO_IN, (GIOFunc)__wfd_oem_thread_safe_event_handler_cb, NULL);
2050 g_io_channel_unref(gio2);
2053 g_oem_event_callback = event_callback;
2055 g_noti_cb = __wfd_oem_callback;
2057 memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
2058 memset(g_incomming_peer_ssid, 0, sizeof(g_incomming_peer_ssid));
2060 __WDP_LOG_FUNC_EXIT__;
2064 int wfd_ws_destroy()
2066 __WDP_LOG_FUNC_ENTER__;
2068 // Do nothing upto now...
2070 __WDP_LOG_FUNC_EXIT__;
2074 int wfd_ws_activate()
2076 __WDP_LOG_FUNC_ENTER__;
2078 char cmd[128] = {0, };
2079 char res_buffer[1024]={0,};
2080 int res_buffer_len=sizeof(res_buffer);
2082 // Loading Driver, Excuting p2p_supplicant
2083 system("/usr/bin/wlan.sh p2p");
2084 system("/usr/sbin/p2p_supp.sh start");
2087 g_global_sockfd = __create_ctrl_intf("p2p_ctrl_global", "/var/run/p2p_global");
2088 if(g_global_sockfd < 0)
2090 WDP_LOGE( "Failed to create Global Control interface\n");
2094 strncpy(cmd, CMD_INTERFACE, sizeof(cmd));
2095 result = __send_wpa_request(g_global_sockfd, cmd, res_buffer, res_buffer_len);
2096 WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
2097 if(!strstr(res_buffer, "wlan0"))
2099 memset(cmd, 0x0, 128);
2100 memset(res_buffer, 0x0, 1024);
2102 snprintf(cmd, sizeof(cmd), "%s %s", CMD_INTERFACE_ADD, "wlan0\t/usr/etc/wifi-direct/p2p_suppl.conf\tnl80211\t/var/run/p2p_supplicant");
2103 result = __send_wpa_request(g_global_sockfd, cmd, res_buffer, res_buffer_len);
2104 WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
2106 memset(res_buffer, 0x0, 1024);
2115 g_control_sockfd = __create_ctrl_intf("p2p_ctrl_control", "/var/run/p2p_supplicant/wlan0");
2116 if (g_control_sockfd > 0) {
2118 g_monitor_sockfd = __create_ctrl_intf("p2p_ctrl_monitor", "/var/run/p2p_supplicant/wlan0");
2119 if (g_monitor_sockfd > 0)
2121 if (__wpa_ctrl_attach(g_monitor_sockfd) < 0)
2123 WDP_LOGE( "Failed to attach monitor socket! sockfd=[%d]", g_monitor_sockfd);
2129 WDP_LOGE( "Failed to attach control socket! sockfd=[%d]", g_control_sockfd);
2134 WDP_LOGE( "Failed to create socket !!\n");
2136 } while (count > 0);
2138 WDP_LOGD( "Successfully socket connected to server !!\n");
2142 gio3 = g_io_channel_unix_new(g_monitor_sockfd);
2143 g_source_id = g_io_add_watch(gio3, G_IO_IN | G_IO_ERR | G_IO_HUP, (GIOFunc) __ws_event_callback, NULL);
2144 g_io_channel_unref(gio3);
2145 WDP_LOGD( "Scoket is successfully registered to g_main_loop.\n");
2147 //wfd_ws_set_oem_loglevel(3);
2150 if(wfd_ws_dsp_init() == true)
2151 WDP_LOGD( "Success : wfd_ws_dsp_init() \n");
2153 WDP_LOGE( "Failed : wfd_ws_dsp_init()\n");
2155 __get_persistent_group_clients();
2157 __WDP_LOG_FUNC_EXIT__;
2161 int wfd_ws_deactivate()
2163 __WDP_LOG_FUNC_ENTER__;
2165 char cmd[32] = {0, };
2166 char res_buffer[1024]={0,};
2167 int res_buffer_len=sizeof(res_buffer);
2170 g_wps_event_block = 0;
2173 wfd_ws_cancel_discovery();
2175 // detach monitor interface
2176 strncpy(cmd, CMD_DETACH, sizeof(cmd));
2177 result = __send_wpa_request(g_monitor_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2178 WDP_LOGD( "__send_wpa_request(CMD_DETACH) result=[%d]\n", result);
2181 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2182 __WDP_LOG_FUNC_EXIT__;
2185 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2187 WDP_LOGE( "DETACH command Fail. result [%d], res_buffer [%s]\n", result, res_buffer);
2188 __WDP_LOG_FUNC_EXIT__;
2191 memset(cmd, 0x0, 32);
2192 memset(res_buffer, 0x0, 1024);
2194 // close control interface
2195 g_source_remove(g_source_id);
2196 unlink("/tmp/wpa_ctrl_monitor");
2197 if (g_monitor_sockfd >= 0)
2198 close(g_monitor_sockfd);
2200 // terminate wpasupplicant
2201 strncpy(cmd, CMD_TERMINATE, sizeof(cmd));
2202 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2203 WDP_LOGD( "__send_wpa_request(CMD_TERMINATE) result=[%d]\n", result);
2206 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2207 __WDP_LOG_FUNC_EXIT__;
2210 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2212 WDP_LOGE( "DETACH command Fail. result [%d], res_buffer [%s]\n", result, res_buffer);
2213 __WDP_LOG_FUNC_EXIT__;
2216 memset(cmd, 0x0, 32);
2217 memset(res_buffer, 0x0, 1024);
2219 unlink("/tmp/wpa_ctrl_control");
2220 if (g_control_sockfd >= 0)
2221 close(g_control_sockfd);
2223 wfd_ws_glist_reset_connected_peer();
2226 system("/usr/bin/wlan.sh stop");
2228 __WDP_LOG_FUNC_EXIT__;
2232 int wfd_ws_wps_pbc_start(unsigned char peer_addr[6])
2234 __WDP_LOG_FUNC_ENTER__;
2236 char cmd[40] = {0, };
2237 char res_buffer[1024]={0,};
2238 int res_buffer_len = sizeof(res_buffer);
2241 if (wfd_ws_is_groupowner()!=true)
2243 WDP_LOGE( "wps_pbc_start() can be called, only when device is go!!\n");
2244 __WDP_LOG_FUNC_EXIT__;
2248 char tmp_mac[6] = {0,};
2250 if (peer_addr == NULL) {
2251 WDP_LOGD("Peer address is NULL");
2252 if (memcmp(g_incomming_peer_mac_address, tmp_mac, 6) == 0) {
2253 WDP_LOGD("Incomming peer [" MACSTR "]", MAC2STR(g_incomming_peer_mac_address));
2254 snprintf(cmd, sizeof(cmd), "%s", CMD_WPS_PUSHBUTTON_START);
2256 WDP_LOGD("Incomming peer [" MACSTR "]", MAC2STR(g_incomming_peer_mac_address));
2257 snprintf(cmd, sizeof(cmd), "%s p2p_dev_addr=" MACSTR "", CMD_WPS_PUSHBUTTON_START, MAC2STR(g_incomming_peer_mac_address));
2259 } else if (memcmp(peer_addr, tmp_mac, 6) != 0){
2260 WDP_LOGD("Peer address [" MACSTR "]", MAC2STR(peer_addr));
2261 snprintf(cmd, sizeof(cmd), "%s p2p_dev_addr=" MACSTR "", CMD_WPS_PUSHBUTTON_START, MAC2STR(peer_addr));
2263 WDP_LOGE("Peer address is incorrent");
2267 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2268 WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
2271 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2272 __WDP_LOG_FUNC_EXIT__;
2276 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2278 __WDP_LOG_FUNC_EXIT__;
2282 WDP_LOGD( "start WPS PBC...\n");
2284 __WDP_LOG_FUNC_EXIT__;
2288 int wfd_ws_wps_pin_start(unsigned char peer_addr[6])
2290 __WDP_LOG_FUNC_ENTER__;
2292 char cmd[50] = {0, };
2293 char mac_str[18] = {0, };
2294 char res_buffer[1024]={0,};
2295 int res_buffer_len = sizeof(res_buffer);
2298 snprintf(mac_str, 18, MACSTR, MAC2STR(peer_addr));
2299 snprintf(cmd, sizeof(cmd),"%s %s %s", CMD_WPS_WPS_PIN_START, mac_str, g_wps_pin);
2300 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2301 WDP_LOGD( "__send_wpa_request(WPS_PIN) result=[%d]\n", result);
2304 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2305 __WDP_LOG_FUNC_EXIT__;
2309 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2311 __WDP_LOG_FUNC_EXIT__;
2315 WDP_LOGD( "start WPS PBC...\n");
2318 __WDP_LOG_FUNC_EXIT__;
2322 int wfd_ws_connect(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config)
2324 __WDP_LOG_FUNC_ENTER__;
2326 char cmd[64] = {0, };
2327 char mac_str[18] = {0, };
2328 char res_buffer[1024]={0,};
2329 int res_buffer_len = sizeof(res_buffer);
2332 wfd_server_control_t * wfd_server = wfd_server_get_control();
2333 WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
2335 if (wfd_ws_is_groupowner()==true)
2337 strncpy(cmd, CMD_WPS_PUSHBUTTON_START, sizeof(cmd));
2338 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2339 WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
2342 if (wfd_server->current_peer.is_group_owner)
2344 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2345 if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD ||
2346 wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
2347 snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, g_wps_pin);
2349 snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, __convert_wps_config_methods_value(wps_config));
2351 WDP_LOGD("Join command: [%s]", cmd);
2352 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2353 WDP_LOGD( "__send_wpa_request(CMD_CONNECT join) result=[%d]\n", result);
2357 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2358 WDP_LOGD( "MAC ADDR = [%s]\t PIN = [%s]\n",
2359 mac_str, g_wps_pin);
2361 if (wps_config == WIFI_DIRECT_WPS_TYPE_PBC) {
2362 WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PBC");
2363 snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CONNECT, mac_str, CMD_PBC_STRING);
2364 } else if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
2365 WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY");
2366 snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, CMD_DISPLAY_STRING);
2367 } else if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
2368 WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD");
2369 snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, CMD_KEYPAD_STRING);
2371 WDP_LOGD( "UNKNOWN CONFIG METHOD\n");
2375 WDP_LOGD( "COMMAND = [%s]\n", cmd);
2377 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2378 WDP_LOGD( "__send_wpa_request(P2P_CONNECT) result=[%d]\n", result);
2383 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2384 __WDP_LOG_FUNC_EXIT__;
2388 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2390 __WDP_LOG_FUNC_EXIT__;
2394 WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
2396 __WDP_LOG_FUNC_EXIT__;
2399 int wfd_ws_connect_for_go_neg(unsigned char mac_addr[6],
2400 wifi_direct_wps_type_e wps_config)
2402 __WDP_LOG_FUNC_ENTER__;
2403 char cmd[64] = {0, };
2404 char mac_str[18] = {0, };
2405 char res_buffer[1024]={0,};
2406 int res_buffer_len = sizeof(res_buffer);
2409 WDP_LOGD( "CONNECT REQUEST FOR GO NEGOTIATION");
2410 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2411 snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, __convert_wps_config_methods_value(wps_config));
2413 if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD ||
2414 wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
2415 WDP_LOGD( "CONFIG = [%d] \n", wps_config);
2417 WDP_LOGE( "Not expected CONFIG METHOD\n");
2421 WDP_LOGD( "COMMAND = [%s]****\n", cmd);
2422 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer,
2425 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2426 __WDP_LOG_FUNC_EXIT__;
2429 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) {
2430 __WDP_LOG_FUNC_EXIT__;
2433 WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
2434 __WDP_LOG_FUNC_EXIT__;
2438 /* for sending connection request in case Persistent mode enabled */
2439 int wfd_ws_connect_for_persistent_group(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config)
2441 __WDP_LOG_FUNC_ENTER__;
2443 char cmd[64] = {0, };
2444 char mac_str[18] = {0, };
2445 char res_buffer[1024]={0,};
2446 int res_buffer_len = sizeof(res_buffer);
2449 wfd_server_control_t * wfd_server = wfd_server_get_control();
2450 WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
2451 WDP_LOGD( "wfd_server->current_peer.is_persistent_go=[%d]\n", wfd_server->current_peer.is_persistent_go);
2455 WDP_LOGD( "[persistent mode!!!]\n");
2456 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2458 if (wfd_server->current_peer.is_group_owner) /* join group */
2460 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2461 snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, __convert_wps_config_methods_value(wps_config));
2462 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2463 WDP_LOGD( "__send_wpa_request(CMD_CONNECT join) result=[%d]\n", result);
2465 else /* Creating or reinvoking my persistent group and send invite req. */
2468 /* First, searching for peer in persistent client list : in case, My device is GO */
2469 network_id = __get_network_id_from_persistent_client_list_with_mac(mac_str);
2471 if (network_id < 0) /* If peer is not exist in client list, searching for peer in persistnet group GO list : in case, peer is GO */
2472 network_id = __get_network_id_from_network_list_with_go_mac(mac_str);
2474 if (network_id < 0) /* If can not find peer anywhere, Create new persistent group */
2476 if (wfd_ws_create_group(NULL) != true)
2478 WDP_LOGE( "wfd_ws_create_group FAILED!!\n");
2479 __WDP_LOG_FUNC_EXIT__;
2483 if (wfd_ws_send_invite_request(mac_addr) != true)
2485 WDP_LOGE( "wfd_ws_send_invite_request FAILED!!\n");
2486 __WDP_LOG_FUNC_EXIT__;
2490 else /* Reinvoke persistent group and invite peer */
2492 if (__send_invite_request_with_network_id(network_id, mac_addr) != true)
2494 WDP_LOGE( "__send_invite_request_with_network_id FAILED!!\n");
2495 __WDP_LOG_FUNC_EXIT__;
2499 if (__wfd_ws_reinvoke_persistent_group(network_id) != true)
2501 WDP_LOGE( "__wfd_ws_reinvoke_persistent_group FAILED!!\n");
2502 __WDP_LOG_FUNC_EXIT__;
2507 int persistent_group_count = 0;
2508 wfd_persistent_group_info_s* plist;
2511 result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
2514 /* checking already created persistent group list */
2515 for(i=0; i<persistent_group_count; i++)
2517 WDP_LOGD( "plist[%d].go_mac_address=[%s]\n", i,plist[i].go_mac_address);
2518 if (strcmp(plist[i].go_mac_address, mac_str) == 0)
2520 WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
2521 snprintf(cmd, sizeof(cmd), "%s persistent=%d", CMD_CREATE_GROUP, plist[i].network_id);
2522 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2523 WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD persistent=%d) result=[%d]\n", plist[i].network_id, result);
2528 if (i == persistent_group_count) /* Can't find peer in persistent group list. Creation of new persistent group */
2530 /* Persistent group mode */
2531 snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CREATE_GROUP, "persistent", FREQUENCY_2G);
2532 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2533 WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD) result=[%d]\n", result);
2537 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2538 __WDP_LOG_FUNC_EXIT__;
2542 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2544 __WDP_LOG_FUNC_EXIT__;
2548 wfd_ws_send_invite_request(mac_addr);
2554 WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
2555 __WDP_LOG_FUNC_EXIT__;
2562 WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
2564 __WDP_LOG_FUNC_EXIT__;
2568 int wfd_ws_disconnect()
2570 __WDP_LOG_FUNC_ENTER__;
2572 char cmd[32] = {0, };
2573 char res_buffer[1024]={0,};
2574 int res_buffer_len = sizeof(res_buffer);
2577 g_wps_event_block = 0;
2579 snprintf(cmd, sizeof(cmd), "%s %s", CMD_GROUP_REMOVE, DEFAULT_IF_NAME);
2580 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2581 WDP_LOGD( "__send_wpa_request(P2P_GROUP_REMOVE) result=[%d]\n", result);
2585 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2586 __WDP_LOG_FUNC_EXIT__;
2590 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2592 __WDP_LOG_FUNC_EXIT__;
2596 WDP_LOGD( "disconnect... remove group [%s]\n", DEFAULT_IF_NAME);
2598 __WDP_LOG_FUNC_EXIT__;
2603 // TODO: should find how to disconnect with peer by peer_mac
2604 int wfd_ws_disconnect_sta(unsigned char mac_addr[6])
2606 __WDP_LOG_FUNC_ENTER__;
2610 result = wfd_ws_disconnect();
2612 __WDP_LOG_FUNC_EXIT__;
2616 bool wfd_ws_is_discovery_enabled()
2618 __WDP_LOG_FUNC_ENTER__;
2620 __WDP_LOG_FUNC_EXIT__;
2626 __WDP_LOG_FUNC_ENTER__;
2628 char cmd[16] = {0, };
2629 char res_buffer[1024]={0,};
2630 int res_buffer_len=sizeof(res_buffer);
2633 g_wps_event_block = 0;
2635 // Skip checking result..
2636 strncpy(cmd, CMD_FLUSH, sizeof(cmd));
2637 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2638 WDP_LOGD( "__send_wpa_request(P2P_FLUSH) result=[%d]\n", result);
2642 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2643 __WDP_LOG_FUNC_EXIT__;
2647 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2649 __WDP_LOG_FUNC_EXIT__;
2653 __WDP_LOG_FUNC_EXIT__;
2659 int wfd_ws_start_discovery(bool listen_only, int timeout)
2661 __WDP_LOG_FUNC_ENTER__;
2663 char cmd[16] = {0, };
2664 char res_buffer[1024]={0,};
2665 int res_buffer_len=sizeof(res_buffer);
2669 if (wfd_ws_is_groupowner()==false && wfd_ws_is_groupclient()==false)
2673 if (listen_only == true)
2676 snprintf(cmd, sizeof(cmd), "%s %d", CMD_START_LISTEN, timeout);
2678 strncpy(cmd, CMD_START_LISTEN, sizeof(cmd));
2680 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2681 WDP_LOGD( "__send_wpa_request(P2P_LISTEN) result=[%d]\n", result);
2685 strncpy(cmd, CMD_START_DISCOVER, sizeof(cmd));
2686 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2687 WDP_LOGD( "__send_wpa_request(P2P_FIND) result=[%d]\n", result);
2692 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2693 __WDP_LOG_FUNC_EXIT__;
2697 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2699 __WDP_LOG_FUNC_EXIT__;
2703 // to notify to the application.
2704 if (listen_only == true)
2705 g_noti_cb(WFD_EVENT_DISCOVER_START_LISTEN_ONLY);
2707 g_noti_cb(WFD_EVENT_DISCOVER_START_80211_SCAN);
2709 __WDP_LOG_FUNC_EXIT__;
2713 int wfd_ws_cancel_discovery()
2715 __WDP_LOG_FUNC_ENTER__;
2717 char cmd[16] = {0, };
2718 char res_buffer[1024]={0,};
2719 int res_buffer_len=sizeof(res_buffer);
2722 strncpy(cmd, CMD_CANCEL_DISCOVER, sizeof(cmd));
2723 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2724 WDP_LOGD( "__send_wpa_request(P2P_STOP_FIND) result=[%d]\n", result);
2728 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2729 __WDP_LOG_FUNC_EXIT__;
2733 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2735 __WDP_LOG_FUNC_EXIT__;
2739 // to notify to the application.
2740 g_noti_cb(WFD_EVENT_DISCOVER_CANCEL);
2742 __WDP_LOG_FUNC_EXIT__;
2746 int wfd_ws_get_discovery_result(wfd_discovery_entry_s ** peer_list, int* peer_num)
2748 __WDP_LOG_FUNC_ENTER__;
2750 char cmd[40] = {0, };
2751 char mac_str[18] = {0, };
2752 char res_buffer[1024] = {0,};
2753 int res_buffer_len = sizeof(res_buffer);
2757 ws_discovered_peer_info_s ws_peer_list[MAX_PEER_NUM];
2758 static wfd_discovery_entry_s wfd_peer_list[16];
2760 memset(&ws_peer_list, 0, (sizeof(ws_discovered_peer_info_s)*MAX_PEER_NUM));
2761 memset(&wfd_peer_list, 0, (sizeof(wfd_discovery_entry_s)*16));
2763 /* Reading first discovered peer */
2764 strncpy(cmd, CMD_GET_FIRST_DISCOVERED_PEER, sizeof(cmd));
2765 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2766 WDP_LOGD( "__send_wpa_request(P2P_PEER FIRST) result=[%d]\n", result);
2769 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2772 __WDP_LOG_FUNC_EXIT__;
2776 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
2780 __WDP_LOG_FUNC_EXIT__;
2784 __parsing_peer(res_buffer, &ws_peer_list[peer_count]);
2787 /* Reading Next discovered peers */
2790 memset(cmd, 0x0, 40);
2791 memset(mac_str, 0x0, 18);
2792 memset(res_buffer, 0, sizeof(res_buffer));
2794 strncpy(mac_str, ws_peer_list[peer_count-1].mac, sizeof(mac_str));
2795 snprintf(cmd, sizeof(cmd), "%s%s", CMD_GET_NEXT_DISCOVERED_PEER, mac_str);
2796 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2797 WDP_LOGD( "__send_wpa_request(P2P_PEER NEXT-) result=[%d]\n", result);
2799 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
2802 __parsing_peer(res_buffer, &ws_peer_list[peer_count]);
2807 WDP_LOGD( "number of discovered peers: %d\n", peer_count);
2809 for(i=0; i<peer_count; i++)
2811 memset(&wfd_peer_list[i], 0, sizeof(wfd_discovery_entry_s));
2812 WDP_LOGD( "index [%d] MAC [%s] GOstate=[%s] groupCapab=[%x] devCapab=[%x] is_wfd_device[%d] Name[%s] type=[%s] ssid[%s]\n",
2814 ws_peer_list[i].mac,
2815 ws_peer_list[i].go_state,
2816 ws_peer_list[i].group_capab,
2817 ws_peer_list[i].dev_capab,
2818 ws_peer_list[i].is_wfd_device,
2819 ws_peer_list[i].device_name,
2820 ws_peer_list[i].pri_dev_type,
2821 ws_peer_list[i].oper_ssid);
2825 bool is_group_owner;
2826 char ssid[WIFI_DIRECT_MAX_SSID_LEN + 1];
2827 unsigned char mac_address[6];
2830 unsigned int services;
2831 bool is_persistent_go;
2832 unsigned char intf_mac_address[6];
2833 unsigned int wps_device_pwd_id;
2834 unsigned int wps_cfg_methods;
2835 unsigned int category;
2836 unsigned int subcategory;
2837 } wfd_discovery_entry_s;
2839 // Device MAC address
2840 if (NULL != ws_peer_list[i].mac)
2842 unsigned char la_mac_addr[6];
2844 wfd_macaddr_atoe(ws_peer_list[i].mac, la_mac_addr);
2845 memcpy(wfd_peer_list[i].mac_address, (char*)(la_mac_addr), sizeof(la_mac_addr));
2848 // Interface MAC address
2849 if (NULL != ws_peer_list[i].interface_addr)
2851 unsigned char la_mac_addr[6];
2853 wfd_macaddr_atoe(ws_peer_list[i].interface_addr, la_mac_addr);
2854 memcpy(wfd_peer_list[i].intf_mac_address, (char*)(la_mac_addr), sizeof(la_mac_addr));
2857 // WPS Config method
2858 wfd_peer_list[i].wps_cfg_methods = 0;
2859 if ((ws_peer_list[i].config_methods & WPS_CONFIG_DISPLAY) > 0)
2860 wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
2861 if ((ws_peer_list[i].config_methods & WPS_CONFIG_PUSHBUTTON) > 0)
2862 wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PBC;
2863 if ((ws_peer_list[i].config_methods & WPS_CONFIG_KEYPAD) > 0)
2864 wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
2866 // Device name --> SSID
2867 strncpy(wfd_peer_list[i].device_name, ws_peer_list[i].device_name, sizeof(wfd_peer_list[i].device_name));
2870 if ((ws_peer_list[i].group_capab & GROUP_CAPAB_GROUP_OWNER) > 0) /* checking GO state */
2871 wfd_peer_list[i].is_group_owner = true;
2873 wfd_peer_list[i].is_group_owner = false;
2875 WDP_LOGD( "GroupOwnerCapab: %x & %x = %d\n", ws_peer_list[i].group_capab, GROUP_CAPAB_GROUP_OWNER, (ws_peer_list[i].group_capab & GROUP_CAPAB_GROUP_OWNER));
2878 if ((ws_peer_list[i].group_capab & GROUP_CAPAB_PERSISTENT_GROUP) > 0) /* checking persistent GO state */
2879 wfd_peer_list[i].is_persistent_go = true;
2881 wfd_peer_list[i].is_persistent_go = false;
2884 if (strncmp(ws_peer_list[i].member_in_go_dev, "00:00:00:00:00:00", strlen("00:00:00:00:00:00"))!=0)
2885 wfd_peer_list[i].is_connected = true;
2887 wfd_peer_list[i].is_connected = false;
2890 // ToDo: convert freq to channel...
2891 wfd_peer_list[i].channel = ws_peer_list[i].listen_freq;
2893 // wps_device_pwd_id
2894 // ToDo: where to get it?
2895 wfd_peer_list[i].wps_device_pwd_id = 0;
2897 wfd_peer_list[i].category = __convert_device_type(ws_peer_list[i].pri_dev_type);
2898 wfd_peer_list[i].subcategory = __convert_secondary_device_type(ws_peer_list[i].pri_dev_type);
2901 *peer_num = peer_count;
2902 *peer_list = &wfd_peer_list[0];
2904 WDP_LOGE( "Getting discovery result is Completed.\n");
2906 __WDP_LOG_FUNC_EXIT__;
2911 int wfd_ws_get_peer_info(unsigned char *mac_addr, wfd_discovery_entry_s **peer)
2913 __WDP_LOG_FUNC_ENTER__;
2915 char cmd[32] = {0, };
2916 char mac_str[18] = {0, };
2917 char res_buffer[1024] = {0,};
2918 int res_buffer_len = sizeof(res_buffer);
2920 ws_discovered_peer_info_s ws_peer_info;
2921 wfd_discovery_entry_s* wfd_peer_info;
2923 memset(&ws_peer_info, 0x0, sizeof(ws_discovered_peer_info_s));
2924 wfd_peer_info = (wfd_discovery_entry_s *) calloc(1, sizeof(wfd_discovery_entry_s));
2926 /* Reading first discovered peer */
2927 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2928 snprintf(cmd, sizeof(cmd),"%s %s", CMD_GET_PEER_INFO, mac_str);
2929 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2930 WDP_LOGD( "__send_wpa_request(P2P_PEER) result=[%d]\n", result);
2933 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2935 __WDP_LOG_FUNC_EXIT__;
2939 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
2942 __WDP_LOG_FUNC_EXIT__;
2946 // TODO: parsing peer info
2947 __parsing_peer(res_buffer, &ws_peer_info);
2949 WDP_LOGD( "MAC [%s] GOstate=[%s] groupCapab=[%x] devCapab=[%x] Name[%s] type=[%s] ssid[%s]\n",
2951 ws_peer_info.go_state,
2952 ws_peer_info.group_capab,
2953 ws_peer_info.dev_capab,
2954 ws_peer_info.device_name,
2955 ws_peer_info.pri_dev_type,
2956 ws_peer_info.oper_ssid);
2958 if (NULL != ws_peer_info.mac)
2960 unsigned char la_mac_addr[6];
2962 wfd_macaddr_atoe(ws_peer_info.mac, la_mac_addr);
2963 memcpy(wfd_peer_info->mac_address, (char*)(la_mac_addr), sizeof(la_mac_addr));
2966 // Interface MAC address
2967 if (NULL != ws_peer_info.interface_addr)
2969 unsigned char la_mac_addr[6];
2971 wfd_macaddr_atoe(ws_peer_info.interface_addr, la_mac_addr);
2972 memcpy(wfd_peer_info->intf_mac_address, (char*)(la_mac_addr), sizeof(la_mac_addr));
2975 // WPS Config method
2976 wfd_peer_info->wps_cfg_methods = 0;
2977 if ((ws_peer_info.config_methods & WPS_CONFIG_DISPLAY) > 0)
2978 wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
2979 if ((ws_peer_info.config_methods & WPS_CONFIG_PUSHBUTTON) > 0)
2980 wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PBC;
2981 if ((ws_peer_info.config_methods & WPS_CONFIG_KEYPAD) > 0)
2982 wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
2984 // Device name --> SSID
2985 strncpy(wfd_peer_info->device_name, ws_peer_info.device_name, sizeof(wfd_peer_info->device_name));
2988 if ((ws_peer_info.group_capab & GROUP_CAPAB_GROUP_OWNER) > 0) /* checking GO state */
2989 wfd_peer_info->is_group_owner = true;
2991 wfd_peer_info->is_group_owner = false;
2993 WDP_LOGD( "GroupOwnerCapab: %x & %x = %d\n", ws_peer_info.group_capab, GROUP_CAPAB_GROUP_OWNER, (ws_peer_info.group_capab & GROUP_CAPAB_GROUP_OWNER));
2996 if ((ws_peer_info.group_capab & GROUP_CAPAB_PERSISTENT_GROUP) > 0) /* checking persistent GO state */
2997 wfd_peer_info->is_persistent_go = true;
2999 wfd_peer_info->is_persistent_go = false;
3002 if (strncmp(ws_peer_info.member_in_go_dev, "00:00:00:00:00:00", strlen("00:00:00:00:00:00"))!=0)
3003 wfd_peer_info->is_connected = true;
3005 wfd_peer_info->is_connected = false;
3008 // ToDo: convert freq to channel...
3009 wfd_peer_info->channel = ws_peer_info.listen_freq;
3011 // wps_device_pwd_id
3012 // ToDo: where to get it?
3013 wfd_peer_info->wps_device_pwd_id = 0;
3015 wfd_peer_info->category = __convert_device_type(ws_peer_info.pri_dev_type);
3016 wfd_peer_info->subcategory = __convert_secondary_device_type(ws_peer_info.pri_dev_type);
3018 *peer = wfd_peer_info;
3020 __WDP_LOG_FUNC_EXIT__;
3024 int wfd_ws_send_provision_discovery_request(unsigned char mac_addr[6], wifi_direct_wps_type_e config_method, int is_peer_go)
3026 __WDP_LOG_FUNC_ENTER__;
3028 char cmd[64] = {0, };
3029 char mac_str[18] = {0, };
3030 char res_buffer[1024]={0,};
3031 int res_buffer_len = sizeof(res_buffer);
3034 WDP_LOGD("Outgoing PROV_DISC");
3036 if (is_peer_go && config_method == WIFI_DIRECT_WPS_TYPE_PBC)
3038 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
3039 snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, __convert_wps_config_methods_value(config_method));
3040 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3041 WDP_LOGD("Join command: [%s]", cmd);
3042 WDP_LOGD( "__send_wpa_request(P2P_PROV_DISC) result=[%d]\n", result);
3046 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
3047 snprintf(cmd, sizeof(cmd),"%s %s %s", CMD_SEND_PROVISION_DISCOVERY_REQ, mac_str, __convert_wps_config_methods_value(config_method));
3048 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3049 WDP_LOGD( "__send_wpa_request(P2P_PROV_DISC) result=[%d]\n", result);
3054 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3055 __WDP_LOG_FUNC_EXIT__;
3059 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3061 __WDP_LOG_FUNC_EXIT__;
3065 WDP_LOGD( "Provisioning... peer-MAC [%s]\n", mac_str);
3067 __WDP_LOG_FUNC_EXIT__;
3072 bool wfd_ws_get_go_dev_addr(char* p2p_device_address)
3074 __WDP_LOG_FUNC_ENTER__;
3076 char cmd[16] = {0, };
3077 char res_buffer[1024]={0,};
3078 int res_buffer_len = sizeof(res_buffer);
3081 if (p2p_device_address == NULL)
3083 WDP_LOGE( "Wrong param\n");
3084 __WDP_LOG_FUNC_EXIT__;
3088 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3089 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3090 WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
3094 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3095 __WDP_LOG_FUNC_EXIT__;
3099 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3101 __WDP_LOG_FUNC_EXIT__;
3105 char* ptr = strstr(res_buffer, "p2p_device_address=");
3108 WDP_LOGD( "Can't find p2p_device_address...\n");
3109 __WDP_LOG_FUNC_EXIT__;
3116 if (__get_item_value(ptr, item, value) == NULL)
3118 WDP_LOGD( "Can't wrong format to get p2p_device_address...\n");
3119 __WDP_LOG_FUNC_EXIT__;
3123 if (strcmp(item, "p2p_device_address")!=0)
3125 WDP_LOGD( "Can't get p2p_device_address.... item=[%s]\n", item);
3126 __WDP_LOG_FUNC_EXIT__;
3130 strncpy(p2p_device_address, value, sizeof(value));
3132 __WDP_LOG_FUNC_EXIT__;
3136 int wfd_ws_send_invite_request(unsigned char dev_mac_addr[6])
3138 __WDP_LOG_FUNC_ENTER__;
3140 char cmd[128] = {0, };
3141 char mac_str[18] = {0, };
3142 char res_buffer[1024]={0,};
3143 char p2p_device_address[32];
3144 int res_buffer_len = sizeof(res_buffer);
3147 /* invite request sometimes failed in listen only mode */
3148 wfd_server_control_t * wfd_server = wfd_server_get_control();
3149 if (wfd_server->config_data.listen_only)
3150 wfd_ws_start_discovery(false, 0);
3152 if(wfd_ws_get_go_dev_addr(p2p_device_address) == false)
3154 __WDP_LOG_FUNC_EXIT__;
3158 snprintf(mac_str, 18, MACSTR, MAC2STR(dev_mac_addr));
3159 snprintf(cmd, sizeof(cmd), "%s group=p2p-wlan0-0 peer=%s go_dev_addr=%s", CMD_SEND_INVITE_REQ, mac_str, p2p_device_address);
3161 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3162 WDP_LOGI( "__send_wpa_request(CMD_SEND_INVITE_REQ) result=[%d]\n", result);
3166 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3167 __WDP_LOG_FUNC_EXIT__;
3171 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3173 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3174 __WDP_LOG_FUNC_EXIT__;
3178 WDP_LOGD( "Invite... peer-MAC [%s]\n", mac_str);
3180 __WDP_LOG_FUNC_EXIT__;
3185 int wfd_ws_create_group(char* ssid)
3187 __WDP_LOG_FUNC_ENTER__;
3189 char cmd[64] = {0, };
3190 char res_buffer[1024]={0,};
3191 int res_buffer_len = sizeof(res_buffer);
3193 wfd_server_control_t * wfd_server = wfd_server_get_control();
3195 if (wfd_server->config_data.want_persistent_group)
3197 /* Persistent group mode */
3198 snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CREATE_GROUP, "persistent", FREQUENCY_2G);
3202 snprintf(cmd, sizeof(cmd), "%s %s", CMD_CREATE_GROUP, FREQUENCY_2G);
3205 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3206 WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD) result=[%d]\n", result);
3210 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3211 __WDP_LOG_FUNC_EXIT__;
3215 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3217 __WDP_LOG_FUNC_EXIT__;
3221 WDP_LOGD( "Create p2p group... \n");
3223 __WDP_LOG_FUNC_EXIT__;
3227 int wfd_ws_cancel_group()
3229 __WDP_LOG_FUNC_ENTER__;
3231 char cmd[30] = {0, };
3232 char res_buffer[1024]={0,};
3233 int res_buffer_len = sizeof(res_buffer);
3236 snprintf(cmd, sizeof(cmd), "%s %s", CMD_GROUP_REMOVE, DEFAULT_IF_NAME);
3238 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3239 WDP_LOGD( "__send_wpa_request(P2P_GROUP_REMOVE) result=[%d]\n", result);
3243 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3244 __WDP_LOG_FUNC_EXIT__;
3248 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3250 __WDP_LOG_FUNC_EXIT__;
3254 WDP_LOGD( "Remove p2p group... \n");
3256 __WDP_LOG_FUNC_EXIT__;
3260 int wfd_ws_activate_pushbutton()
3262 __WDP_LOG_FUNC_ENTER__;
3264 char cmd[8] = {0, };
3265 char res_buffer[1024]={0,};
3266 int res_buffer_len = sizeof(res_buffer);
3269 strncpy(cmd, CMD_WPS_PUSHBUTTON_START, sizeof(cmd));
3270 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3271 WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
3274 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3275 __WDP_LOG_FUNC_EXIT__;
3279 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3281 __WDP_LOG_FUNC_EXIT__;
3285 WDP_LOGD( "start WPS PBC...\n");
3287 __WDP_LOG_FUNC_EXIT__;
3291 bool wfd_ws_is_groupowner()
3293 __WDP_LOG_FUNC_ENTER__;
3295 char cmd[16] = {0, };
3296 char res_buffer[1024]={0,};
3297 int res_buffer_len = sizeof(res_buffer);
3300 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3301 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3302 WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
3306 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3307 __WDP_LOG_FUNC_EXIT__;
3311 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3313 __WDP_LOG_FUNC_EXIT__;
3317 if(strstr(res_buffer, "mode=P2P GO") == NULL)
3319 WDP_LOGD( "This device is not Groupowner\n");
3320 __WDP_LOG_FUNC_EXIT__;
3324 __WDP_LOG_FUNC_EXIT__;
3328 bool wfd_ws_is_groupclient()
3330 __WDP_LOG_FUNC_ENTER__;
3331 char cmd[16] = {0, };
3332 char res_buffer[1024]={0,};
3333 int res_buffer_len = sizeof(res_buffer);
3336 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3337 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3338 WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
3342 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3343 __WDP_LOG_FUNC_EXIT__;
3347 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3349 __WDP_LOG_FUNC_EXIT__;
3353 if(strstr(res_buffer, "mode=station") == NULL)
3355 WDP_LOGD( "This device is not client\n");
3356 __WDP_LOG_FUNC_EXIT__;
3360 __WDP_LOG_FUNC_EXIT__;
3364 int wfd_ws_get_ssid(char* ssid, int len)
3366 __WDP_LOG_FUNC_ENTER__;
3368 char cmd[12] = {0, };
3369 char tmp_ssid[64] = {0, };
3370 char res_buffer[1024]={0,};
3371 int res_buffer_len = sizeof(res_buffer);
3376 WDP_LOGE( "Incorrect parameter");
3380 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3381 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3382 WDP_LOGD( "__send_wpa_request(STATUS) result=[%d]\n", result);
3386 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3387 __WDP_LOG_FUNC_EXIT__;
3391 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3393 __WDP_LOG_FUNC_EXIT__;
3397 result = __extract_value_str(res_buffer, "\nssid", (char*) tmp_ssid);
3400 WDP_LOGE( "Extracting value failed\n");
3403 WDP_LOGD( "###### ssid [%s] ###########\n", tmp_ssid);
3404 memcpy(ssid, tmp_ssid, len);
3407 __WDP_LOG_FUNC_EXIT__;
3411 char* wfd_ws_get_default_interface_name()
3413 __WDP_LOG_FUNC_ENTER__;
3415 __WDP_LOG_FUNC_EXIT__;
3417 return DEFAULT_IF_NAME;
3420 bool wfd_ws_dhcpc_get_ip_address(char *ipaddr_buf, int len, int is_IPv6)
3422 __WDP_LOG_FUNC_ENTER__;
3424 struct ifreq IfRequest;
3425 struct sockaddr_in* sin = NULL;
3428 if (ipaddr_buf == NULL)
3432 if((fp = fopen(DEFAULT_IP_LOG_PATH, "r+")) != NULL)
3438 if((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0) {
3439 WDP_LOGE( "Failed to open socket\n");
3443 memset(IfRequest.ifr_name, 0, DEFAULT_IF_NAME_LEN);
3444 strncpy(IfRequest.ifr_name, DEFAULT_IF_NAME, DEFAULT_IF_NAME_LEN - 1);
3445 if(ioctl(fd, SIOCGIFADDR, &IfRequest) < 0) {
3446 WDP_LOGE( "Failed to get IP\n");
3451 sin = (struct sockaddr_in*)&IfRequest.ifr_broadaddr;
3452 if (ipaddr_buf != NULL)
3453 strncpy(ipaddr_buf, (char*)inet_ntoa(sin->sin_addr), len);
3459 __WDP_LOG_FUNC_EXIT__;
3465 char* wfd_ws_get_ip()
3467 __WDP_LOG_FUNC_ENTER__;
3469 char ip_string[20] = {0,};
3471 snprintf(ip_string, 20, "%s", g_local_interface_ip_address);
3472 WDP_LOGD( "################################################\n");
3473 WDP_LOGD( "###### IP = %s ###########\n", ip_string);
3474 WDP_LOGD( "################################################\n");
3476 __WDP_LOG_FUNC_EXIT__;
3480 int wfd_ws_set_wps_pin(char* pin)
3482 __WDP_LOG_FUNC_ENTER__;
3484 strncpy(g_wps_pin, pin, sizeof(g_wps_pin));
3485 WDP_LOGD( "SETTING WPS PIN = %s\n", \
3490 __WDP_LOG_FUNC_EXIT__;
3494 int wfd_ws_get_wps_pin(char* wps_pin, int len)
3496 __WDP_LOG_FUNC_ENTER__;
3498 if (wps_pin == NULL) {
3501 strncpy(wps_pin, g_wps_pin, sizeof(g_wps_pin));
3502 WDP_LOGD( "FILLED WPS PIN = %s\n", wps_pin);
3503 __WDP_LOG_FUNC_EXIT__;
3507 int wfd_ws_generate_wps_pin()
3509 __WDP_LOG_FUNC_ENTER__;
3511 __WDP_LOG_FUNC_EXIT__;
3517 int wfd_ws_set_ssid(char* ssid)
3519 __WDP_LOG_FUNC_ENTER__;
3521 char cmd[128] = {0, };
3522 char res_buffer[1024]={0,};
3523 int res_buffer_len = sizeof(res_buffer);
3526 if (ssid == NULL || strlen(ssid) == 0)
3528 WDP_LOGE( "Wrong SSID\n");
3529 __WDP_LOG_FUNC_EXIT__;
3533 snprintf(cmd, sizeof(cmd), "%s device_name %s", CMD_SET_PARAM, ssid);
3534 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3535 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3539 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3540 __WDP_LOG_FUNC_EXIT__;
3543 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3545 __WDP_LOG_FUNC_EXIT__;
3548 memset(cmd, 0x0, 128);
3549 memset(res_buffer, 0x0, 1024);
3551 snprintf(cmd, sizeof(cmd), "%s p2p_ssid_postfix %s", CMD_SET_PARAM, ssid);
3552 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3553 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3557 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3558 __WDP_LOG_FUNC_EXIT__;
3561 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3563 __WDP_LOG_FUNC_EXIT__;
3567 __WDP_LOG_FUNC_EXIT__;
3571 int wfd_ws_set_wpa_passphrase(char* wpa_key)
3573 __WDP_LOG_FUNC_ENTER__;
3575 __WDP_LOG_FUNC_EXIT__;
3579 int wfd_ws_get_supported_wps_mode()
3581 __WDP_LOG_FUNC_ENTER__;
3585 //TO-DO : supplicant CLI command should be supported.
3587 wps_config = WIFI_DIRECT_WPS_TYPE_PBC |WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY |WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
3591 __WDP_LOG_FUNC_EXIT__;
3595 int wfd_ws_get_connected_peers_count(int* peer_num)
3597 __WDP_LOG_FUNC_ENTER__;
3598 GList *element = NULL;
3601 element = g_list_first(g_conn_peer_addr);
3605 element = g_list_next(element);
3607 WDP_LOGD( "Connected peer number [%d]\n", *peer_num);
3608 __WDP_LOG_FUNC_EXIT__;
3613 int wfd_ws_get_connected_peers_info(wfd_connected_peer_info_s ** peer_list, int* peer_num)
3615 __WDP_LOG_FUNC_ENTER__;
3617 char cmd[32] = {0, };
3618 char res_buffer[1024]={0,};
3619 int res_buffer_len = sizeof(res_buffer);
3620 char pri_dev_type[16] ={0, };
3621 GList *element = NULL;
3624 if(peer_list == NULL || peer_num == NULL)
3626 WDP_LOGD( "Incorrect parameter\n");
3630 wfd_ws_get_connected_peers_count(peer_num);
3632 wfd_connected_peer_info_s *tmp_peer_list = NULL;
3634 tmp_peer_list = (wfd_connected_peer_info_s*) calloc(*peer_num, sizeof(wfd_connected_peer_info_s));
3635 if(tmp_peer_list == NULL)
3637 WDP_LOGD( "Memory allocatin failed\n");
3644 element = g_list_first(g_conn_peer_addr);
3647 WDP_LOGD( "element data is [%s]\n", (char*) element->data);
3648 memset(cmd, 0x0, 32);
3649 memset(res_buffer, 0x0, 1024);
3651 snprintf(cmd, sizeof(cmd), "%s %s", CMD_GET_PEER_INFO, (char*) element->data);
3652 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3653 WDP_LOGD( "__send_wpa_request(%s) result=[%d]\n", cmd, result);
3657 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3660 if (tmp_peer_list != NULL)
3661 free(tmp_peer_list);
3663 __WDP_LOG_FUNC_EXIT__;
3667 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3671 if (tmp_peer_list != NULL)
3672 free(tmp_peer_list);
3674 __WDP_LOG_FUNC_EXIT__;
3681 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN + 1];
3682 unsigned char ip_address[4];
3683 unsigned char mac_address[6];
3684 unsigned char intf_mac_address[6];
3685 unsigned int services;
3687 unsigned short category;
3689 } wfd_connected_peer_info_s;
3692 result = __extract_value_str(res_buffer, "device_name", (char*) tmp_peer_list[i].device_name);
3694 WDP_LOGE( "Extracting value failed\n");
3697 if (tmp_peer_list != NULL)
3698 free(tmp_peer_list);
3703 wfd_macaddr_atoe((char*) element->data, tmp_peer_list[i].mac_address);
3705 char intf_mac_address[18] = {0, };
3706 result = __extract_value_str(res_buffer, "interface_addr", (char*) intf_mac_address);
3709 WDP_LOGE( "Extracting value failed\n");
3712 if (tmp_peer_list != NULL)
3713 free(tmp_peer_list);
3717 wfd_macaddr_atoe((char*) intf_mac_address, tmp_peer_list[i].intf_mac_address);
3719 tmp_peer_list[i].services = 0;
3720 tmp_peer_list[i].is_p2p = true;
3722 result = __extract_value_str(res_buffer, "pri_dev_type", (char*) pri_dev_type);
3725 WDP_LOGE( "Extracting value failed\n");
3728 if (tmp_peer_list != NULL)
3729 free(tmp_peer_list);
3734 tmp_peer_list[i].category = __convert_category_from_type(pri_dev_type);
3735 if(tmp_peer_list[i].category < 0)
3737 WDP_LOGE( "Category converting error\n");
3740 if (tmp_peer_list != NULL)
3741 free(tmp_peer_list);
3746 element = g_list_next(element);
3750 *peer_list = tmp_peer_list;
3751 __WDP_LOG_FUNC_EXIT__;
3756 int wfd_ws_get_go_intent(int *p2p_go_intent)
3758 __WDP_LOG_FUNC_ENTER__;
3760 char cmd[32] = {0, };
3761 char res_buffer[1024]={0,};
3762 int res_buffer_len = sizeof(res_buffer);
3765 if (p2p_go_intent == NULL)
3767 WDP_LOGE( "p2p_go_intent is NULL\n", p2p_go_intent);
3768 __WDP_LOG_FUNC_EXIT__;
3772 snprintf(cmd, sizeof(cmd), "%s p2p_go_intent", CMD_GET_PARAM);
3773 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3774 WDP_LOGD( "__send_wpa_request(GET P2P_GO_INTENT) result=[%d]\n", result);
3778 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3779 __WDP_LOG_FUNC_EXIT__;
3783 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3785 __WDP_LOG_FUNC_EXIT__;
3789 *p2p_go_intent = atoi(res_buffer);
3791 __WDP_LOG_FUNC_EXIT__;
3795 int wfd_ws_set_go_intent(int go_intent)
3797 __WDP_LOG_FUNC_ENTER__;
3799 char cmd[32] = {0, };
3800 char res_buffer[1024]={0,};
3801 int res_buffer_len = sizeof(res_buffer);
3804 if (go_intent < 0 || go_intent > 15)
3806 WDP_LOGE( "Wrong p2p_go_intent [%d]\n", go_intent);
3807 __WDP_LOG_FUNC_EXIT__;
3811 snprintf(cmd, sizeof(cmd), "%s p2p_go_intent %d", CMD_SET_PARAM, go_intent);
3812 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3813 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3817 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3818 __WDP_LOG_FUNC_EXIT__;
3822 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3824 __WDP_LOG_FUNC_EXIT__;
3828 __WDP_LOG_FUNC_EXIT__;
3833 int wfd_ws_set_device_type(wifi_direct_primary_device_type_e primary_cat, wifi_direct_secondary_device_type_e sub_cat)
3835 __WDP_LOG_FUNC_ENTER__;
3837 char cmd[32] = {0, };
3838 char res_buffer[1024]={0,};
3839 int res_buffer_len = sizeof(res_buffer);
3842 snprintf(cmd, sizeof(cmd), "%s device_type %d", CMD_SET_PARAM, primary_cat);
3843 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3844 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3848 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3849 __WDP_LOG_FUNC_EXIT__;
3853 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3855 __WDP_LOG_FUNC_EXIT__;
3858 memset(cmd, 0x0, 32);
3859 memset(res_buffer, 0x0, 1024);
3861 snprintf(cmd, sizeof(cmd), "%s device_type %d", CMD_SET_PARAM, sub_cat);
3862 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3863 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3867 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3868 __WDP_LOG_FUNC_EXIT__;
3872 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3874 __WDP_LOG_FUNC_EXIT__;
3878 __WDP_LOG_FUNC_EXIT__;
3883 int wfd_ws_get_device_mac_address(unsigned char* device_mac)
3885 __WDP_LOG_FUNC_ENTER__;
3887 char cmd[8] = {0, };
3888 char device_address[18] = {0, };
3889 char res_buffer[1024]={0,};
3890 int res_buffer_len = sizeof(res_buffer);
3893 strncpy(cmd, CMD_STATUS, sizeof(cmd));
3894 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3895 WDP_LOGD( "__send_wpa_request(STATUS) result=[%d]\n", result);
3899 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3900 __WDP_LOG_FUNC_EXIT__;
3904 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3906 __WDP_LOG_FUNC_EXIT__;
3910 __extract_value_str(res_buffer, "p2p_device_address", (char*) device_address);
3911 if(strlen(device_address) ==18)
3913 wfd_macaddr_atoe((char*) device_address, device_mac);
3917 WDP_LOGE( "Extracting value failed\n");
3921 __WDP_LOG_FUNC_EXIT__;
3925 int wfd_ws_set_oem_loglevel(int is_increase)
3927 __WDP_LOG_FUNC_ENTER__;
3929 char cmd[16] = {0, };
3930 char res_buffer[1024]={0,};
3931 int res_buffer_len = sizeof(res_buffer);
3934 snprintf(cmd, sizeof(cmd), "%s %d", CMD_LOG_LEVEL, is_increase);
3935 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3936 WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
3940 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3941 __WDP_LOG_FUNC_EXIT__;
3945 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3947 __WDP_LOG_FUNC_EXIT__;
3951 __WDP_LOG_FUNC_EXIT__;
3955 int wfd_ws_get_assoc_sta_mac(unsigned char *mac_addr)
3957 __WDP_LOG_FUNC_ENTER__;
3959 memcpy(mac_addr, g_assoc_sta_mac, 6);
3961 __WDP_LOG_FUNC_EXIT__;
3965 int wfd_ws_get_disassoc_sta_mac(unsigned char *mac_addr)
3967 __WDP_LOG_FUNC_ENTER__;
3968 memcpy(mac_addr, g_disassoc_sta_mac, 6);
3969 __WDP_LOG_FUNC_EXIT__;
3973 int wfd_ws_get_requestor_mac(unsigned char* mac_addr)
3975 __WDP_LOG_FUNC_ENTER__;
3977 memcpy(mac_addr, g_incomming_peer_mac_address, 6);
3979 __WDP_LOG_FUNC_EXIT__;
3983 int wfd_ws_get_operating_channel(void)
3985 __WDP_LOG_FUNC_ENTER__;
3987 char cmd[16] = {0, };
3988 char res_buffer[1024]={0,};
3989 int res_buffer_len = sizeof(res_buffer);
3991 char item[32] = {0, };
3992 char freq_value[32] = {0,};
3996 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3997 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3998 WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
4002 WDP_LOGE( "__send_wpa_request FAILED!!\n");
4003 __WDP_LOG_FUNC_EXIT__;
4007 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4009 __WDP_LOG_FUNC_EXIT__;
4013 char* ptr = strstr(res_buffer, "frequency=");
4016 WDP_LOGD( "Can't find frequency field...\n");
4017 __WDP_LOG_FUNC_EXIT__;
4021 if (__get_item_value(ptr, item, freq_value) == NULL)
4023 WDP_LOGD( "Can't get value of frequency...\n");
4024 __WDP_LOG_FUNC_EXIT__;
4028 if (strcmp(item, "frequency")!=0)
4030 WDP_LOGD( "Can't get frequency.... item=[%s]\n", item);
4031 __WDP_LOG_FUNC_EXIT__;
4035 WDP_LOGD( "freq_value=[%s]\n", freq_value);
4037 channel = __convert_freq_to_channel(freq_value);
4039 WDP_LOGD( "channel=[%d]\n", channel);
4041 __WDP_LOG_FUNC_EXIT__;
4047 /* -------------------- Miracast ---------------------------*/
4050 int wfd_ws_dsp_init(void)
4052 __WDP_LOG_FUNC_ENTER__;
4054 char cmd[32] = {0, };
4055 char res_buffer[1024]={0,};
4056 int res_buffer_len = sizeof(res_buffer);
4060 char* dev_info = "0400";
4061 int ctrl_port = 2022;
4063 char* cpled_sink_status = "00";
4066 snprintf(cmd, sizeof(cmd), "%s enable %d", CMD_WFD_SET, enable);
4067 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4068 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4072 WDP_LOGE( "__send_wpa_request FAILED[param : enable]!!\n");
4073 __WDP_LOG_FUNC_EXIT__;
4076 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4078 __WDP_LOG_FUNC_EXIT__;
4082 /* param : dev_info */
4083 memset(cmd, 0x0, 32);
4084 memset(res_buffer, 0x0, 1024);
4086 snprintf(cmd, sizeof(cmd), "%s dev_info %s", CMD_WFD_SET, dev_info);
4087 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4088 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4092 WDP_LOGE( "__send_wpa_request FAILED[param : dev_info]!!\n");
4093 __WDP_LOG_FUNC_EXIT__;
4096 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4098 __WDP_LOG_FUNC_EXIT__;
4102 /* param : ctrl_port */
4103 memset(cmd, 0x0, 32);
4104 memset(res_buffer, 0x0, 1024);
4106 snprintf(cmd, sizeof(cmd), "%s ctrl_port %d", CMD_WFD_SET, ctrl_port);
4107 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4108 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4112 WDP_LOGE( "__send_wpa_request FAILED[param : ctrl_port]!!\n");
4113 __WDP_LOG_FUNC_EXIT__;
4116 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4118 __WDP_LOG_FUNC_EXIT__;
4122 /* param : max_tput */
4123 memset(cmd, 0x0, 32);
4124 memset(res_buffer, 0x0, 1024);
4126 snprintf(cmd, sizeof(cmd), "%s max_tput %d", CMD_WFD_SET, max_tput);
4127 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4128 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4132 WDP_LOGE( "__send_wpa_request FAILED[param : max_tput]!!\n");
4133 __WDP_LOG_FUNC_EXIT__;
4136 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4138 __WDP_LOG_FUNC_EXIT__;
4142 /* param : cpled_sink_status */
4143 memset(cmd, 0x0, 32);
4144 memset(res_buffer, 0x0, 1024);
4146 snprintf(cmd, sizeof(cmd), "%s cpled_sink_status %s", CMD_WFD_SET, cpled_sink_status);
4147 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4148 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4152 WDP_LOGE( "__send_wpa_request FAILED[param : cpled_sink_status]!!\n");
4153 __WDP_LOG_FUNC_EXIT__;
4156 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4158 __WDP_LOG_FUNC_EXIT__;
4162 __WDP_LOG_FUNC_EXIT__;
4167 int wfd_ws_get_persistent_group_info(wfd_persistent_group_info_s ** persistent_group_list, int* persistent_group_num)
4169 __WDP_LOG_FUNC_ENTER__;
4171 char cmd[16] = {0, };
4172 char res_buffer[1024] = {0,};
4173 int res_buffer_len = sizeof(res_buffer);
4176 ws_network_info_s ws_persistent_group_list[MAX_PERSISTENT_GROUP_NUM];
4177 wfd_persistent_group_info_s wfd_persistent_group_list[MAX_PERSISTENT_GROUP_NUM];
4179 memset(ws_persistent_group_list, 0, (sizeof(ws_network_info_s)*MAX_PERSISTENT_GROUP_NUM));
4180 memset(wfd_persistent_group_list, 0, (sizeof(wfd_persistent_group_info_s)*MAX_PERSISTENT_GROUP_NUM));
4182 /* Reading lists the configured networks, including stored information for persistent groups.
4183 The identifier in this is used with p2p_group_add and p2p_invite to indicate witch persistent
4184 group is to be reinvoked. */
4185 strncpy(cmd, CMD_GET_LIST_NETWORKS, sizeof(cmd));
4186 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4187 WDP_LOGD( "__send_wpa_request(LIST_NETWORKS) result=[%d]\n", result);
4190 WDP_LOGE( "__send_wpa_request FAILED!!\n");
4191 *persistent_group_num = 0;
4192 *persistent_group_list = NULL;
4193 __WDP_LOG_FUNC_EXIT__;
4197 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4199 *persistent_group_num = 0;
4200 *persistent_group_list = NULL;
4201 __WDP_LOG_FUNC_EXIT__;
4205 __parsing_persistent_group(res_buffer, ws_persistent_group_list, persistent_group_num);
4207 WDP_LOGD( "Persistent Group Count=%d\n", *persistent_group_num);
4208 for(i=0;i<(*persistent_group_num);i++)
4210 WDP_LOGD( "----persistent group [%d]----\n", i);
4211 WDP_LOGD( "network_id=%d\n", ws_persistent_group_list[i].network_id);
4212 WDP_LOGD( "ssid=%s\n", ws_persistent_group_list[i].ssid);
4213 WDP_LOGD( "bssid=%s\n", ws_persistent_group_list[i].bssid);
4214 WDP_LOGD( "flags=%s\n", ws_persistent_group_list[i].flags);
4217 // TODO: should filer by [PERSISTENT] value of flags.
4219 wfd_persistent_group_list[i].network_id = ws_persistent_group_list[i].network_id;
4220 strncpy(wfd_persistent_group_list[i].ssid, ws_persistent_group_list[i].ssid, sizeof(wfd_persistent_group_list[i].ssid));
4222 unsigned char la_mac_addr[6];
4223 wfd_macaddr_atoe(ws_persistent_group_list[i].bssid, la_mac_addr);
4224 memcpy(wfd_persistent_group_list[i].go_mac_address, la_mac_addr, 6);
4227 *persistent_group_list = &wfd_persistent_group_list[0];
4229 __WDP_LOG_FUNC_EXIT__;
4234 int wfd_ws_remove_persistent_group(wfd_persistent_group_info_s *persistent_group)
4236 __WDP_LOG_FUNC_ENTER__;
4237 char cmd[32] = {0, };
4238 char res_buffer[1024] = {0,};
4239 int res_buffer_len = sizeof(res_buffer);
4242 ws_network_info_s ws_persistent_group_list[MAX_PERSISTENT_GROUP_NUM];
4243 int persistent_group_num;
4244 char go_mac_str[18];
4246 memset(ws_persistent_group_list, 0, (sizeof(ws_network_info_s)*MAX_PERSISTENT_GROUP_NUM));
4247 memset(go_mac_str, 0, sizeof(go_mac_str));
4248 snprintf(go_mac_str, 18, MACSTR, MAC2STR(persistent_group->go_mac_address));
4250 strncpy(cmd, CMD_GET_LIST_NETWORKS, sizeof(cmd));
4251 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4252 WDP_LOGD( "__send_wpa_request(LIST_NETWORKS) result=[%d]\n", result);
4255 WDP_LOGE( "__send_wpa_request FAILED!!\n");
4256 __WDP_LOG_FUNC_EXIT__;
4260 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4262 __WDP_LOG_FUNC_EXIT__;
4266 __parsing_persistent_group(res_buffer, ws_persistent_group_list, &persistent_group_num);
4268 WDP_LOGD( "Persistent Group Count=%d\n", persistent_group_num);
4269 for(i=0;i<persistent_group_num;i++)
4271 WDP_LOGD( "----persistent group [%d]----\n", i);
4272 WDP_LOGD( "network_id=%d\n", ws_persistent_group_list[i].network_id);
4273 WDP_LOGD( "ssid=%s\n", ws_persistent_group_list[i].ssid);
4274 WDP_LOGD( "bssid=%s\n", ws_persistent_group_list[i].bssid);
4275 WDP_LOGD( "flags=%s\n", ws_persistent_group_list[i].flags);
4277 // TODO: should filer by [PERSISTENT] value of flags.
4280 WDP_LOGD( "persistent_group->ssid [%s]----\n", persistent_group->ssid);
4281 WDP_LOGD( "ws_persistent_group_list[i].ssid [%s]----\n", ws_persistent_group_list[i].ssid);
4282 WDP_LOGD( "go_mac_str [%s]----\n", go_mac_str);
4283 WDP_LOGD( "ws_persistent_group_list[i].bssid [%s]----\n", ws_persistent_group_list[i].bssid);
4285 if (strcmp(persistent_group->ssid, ws_persistent_group_list[i].ssid) == 0
4286 && strcmp(go_mac_str, ws_persistent_group_list[i].bssid) == 0)
4289 WDP_LOGD( "----Found persistent group [%d]----\n", i);
4291 memset(cmd, 0x0, sizeof(cmd));
4292 memset(res_buffer, 0x0, sizeof(res_buffer));
4294 snprintf(cmd, sizeof(cmd), "%s %d", CMD_REMOVE_NETWORK, ws_persistent_group_list[i].network_id);
4295 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4296 WDP_LOGD( "__send_wpa_request(CMD_REMOVE_NETWORK) result=[%d]\n", result);
4300 WDP_LOGE( "__send_wpa_request FAILED[CMD_REMOVE_NETWORK]!!\n");
4301 __WDP_LOG_FUNC_EXIT__;
4304 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4306 __WDP_LOG_FUNC_EXIT__;
4318 __WDP_LOG_FUNC_EXIT__;
4322 int wfd_ws_set_persistent_reconnect(bool enabled)
4324 __WDP_LOG_FUNC_ENTER__;
4326 char cmd[128] = {0, };
4327 char res_buffer[1024]={0,};
4328 int res_buffer_len = sizeof(res_buffer);
4331 snprintf(cmd, sizeof(cmd), "%s persistent_reconnect %d", CMD_SET_PARAM, enabled);
4332 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4333 WDP_LOGD( "__send_wpa_request(SET persistent_reconnect %d) result=[%d]\n", enabled, result);
4337 WDP_LOGE( "__send_wpa_request FAILED!!\n");
4338 __WDP_LOG_FUNC_EXIT__;
4341 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4343 __WDP_LOG_FUNC_EXIT__;
4347 __WDP_LOG_FUNC_EXIT__;