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];
53 char g_wps_pin[WPS_PIN_LEN];
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, NETWORK_SSID_LEN);
577 group->ssid[NETWORK_SSID_LEN-1] = '\0';
579 while(!__is_item_char(*p))
586 memset(value, 0, sizeof(value));
587 while(__is_item_char(*p))
591 strncpy(group->bssid, value, NETWORK_BSSID_LEN);
592 group->bssid[NETWORK_BSSID_LEN-1] = '\0';
594 while(!__is_item_char(*p))
601 memset(value, 0x00, sizeof(value));
606 strncpy(group->flags, value, NETWORK_FLAGS_LEN);
607 group->flags[NETWORK_FLAGS_LEN-1] = '\0';
614 int __parsing_peer(char* buf, ws_discovered_peer_info_s* peer)
616 __WDP_LOG_FUNC_ENTER__;
624 memset(peer, 0, sizeof(ws_discovered_peer_info_s));
627 strncpy(peer->mac, ptr, MACSTR_LEN);
628 peer->mac[MACSTR_LEN-1]='\0';
631 WDP_LOGD( "mac=%s\n", peer->mac);
635 ptr = __get_item_value(ptr, item, value);
639 //printf("item=%s, value=%s\n", item,value);
642 item_id = WS_PEER_INFO_NONE;
643 while(g_ws_field_info[i].item_id != WS_PEER_INFO_NONE)
645 if (strcmp(g_ws_field_info[i].item_str, item)==0)
647 item_id = g_ws_field_info[i].item_id;
655 case WS_PEER_INFO_AGE:
656 peer->age = atoi(value);
658 case WS_PEER_INFO_LISTEN_FREQ:
659 peer->listen_freq = atoi(value);
661 case WS_PEER_INFO_LEVEL:
662 peer->level = atoi(value);
664 case WS_PEER_INFO_WPS_METHOD:
665 strncpy(peer->wps_method, value, WPS_METHOD_LEN);
666 peer->wps_method[WPS_METHOD_LEN-1] = '\0';
668 case WS_PEER_INFO_INTERFACE_ADDR:
669 strncpy(peer->interface_addr, value, MACSTR_LEN);
670 peer->interface_addr[MACSTR_LEN-1] = '\0';
672 case WS_PEER_INFO_MEMBER_IN_GO_DEV:
673 strncpy(peer->member_in_go_dev, value, MACSTR_LEN);
674 peer->member_in_go_dev[MACSTR_LEN-1] = '\0';
676 case WS_PEER_INFO_MEMBER_IN_GO_IFACE:
677 strncpy(peer->member_in_go_iface, value, MACSTR_LEN);
678 peer->member_in_go_iface[MACSTR_LEN-1] = '\0';
680 case WS_PEER_INFO_PRI_DEV_TYPE:
681 strncpy(peer->pri_dev_type, value, DEVICE_TYPE_LEN);
682 peer->pri_dev_type[DEVICE_TYPE_LEN-1] = '\0';
684 case WS_PEER_INFO_DEVICE_NAME:
685 strncpy(peer->device_name, value, DEVICE_NAME_LEN);
686 peer->device_name[DEVICE_NAME_LEN-1] = '\0';
688 case WS_PEER_INFO_MANUFACTURER:
689 strncpy(peer->manufacturer, value, MANUFACTURER_LEN);
690 peer->manufacturer[MANUFACTURER_LEN-1] = '\0';
692 case WS_PEER_INFO_MODEL_NAME:
693 strncpy(peer->model_name, value, MODEL_NAME_LEN);
694 peer->model_name[MODEL_NAME_LEN-1] = '\0';
696 case WS_PEER_INFO_MODEL_NUMBER:
697 strncpy(peer->model_number, value, MODEL_NUMBER_LEN);
698 peer->model_number[MODEL_NUMBER_LEN-1] = '\0';
700 case WS_PEER_INFO_SERIAL_NUMBER:
701 strncpy(peer->serial_number, value, SERIAL_NUMBER_LEN);
702 peer->serial_number[SERIAL_NUMBER_LEN-1] = '\0';
704 case WS_PEER_INFO_CONFIG_METHODS:
707 unsigned long int ret = 0;
708 ret = strtoul(p, &p, 16);
709 if (ret == ULONG_MAX)
711 peer->config_methods = 0;
712 WDP_LOGE( "config_methods has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
716 peer->config_methods = (unsigned int)ret;
717 WDP_LOGD( "config_methods value=[%x <- %s]\n", peer->config_methods, value);
721 case WS_PEER_INFO_DEV_CAPAB:
724 unsigned long int ret = 0;
725 ret = strtoul(p, &p, 16);
726 if (ret == ULONG_MAX)
729 WDP_LOGE( "device_capab has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
733 peer->dev_capab = (unsigned int)ret;
734 WDP_LOGD( "device_capab value=[%x <- %s]\n", peer->dev_capab, value);
738 case WS_PEER_INFO_GROUP_CAPAB:
741 unsigned long int ret = 0;
742 ret = strtoul(p, &p, 16);
743 if (ret == ULONG_MAX)
745 peer->group_capab = 0;
746 WDP_LOGE( "group_capab has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
750 peer->group_capab = (unsigned int)ret;
751 WDP_LOGD( "group_capab value=[%x <- %s]\n", peer->group_capab, value);
755 case WS_PEER_INFO_GO_NEG_REQ_SENT:
756 peer->go_neg_req_sent = atoi(value);
758 case WS_PEER_INFO_GO_STATE:
759 strncpy(peer->go_state, value, GO_STATE_LEN);
760 peer->go_state[GO_STATE_LEN-1] = '\0';
762 case WS_PEER_INFO_DIALOG_TOKEN:
763 peer->dialog_token = atoi(value);
765 case WS_PEER_INFO_INTENDED_ADDR:
766 strncpy(peer->intended_addr, value, MACSTR_LEN);
767 peer->intended_addr[MACSTR_LEN-1] = '\0';
769 case WS_PEER_INFO_COUNTRY:
770 strncpy(peer->country, value, COUNTRY_CODE_LEN);
771 peer->country[COUNTRY_CODE_LEN-1] = '\0';
773 case WS_PEER_INFO_OPER_FREQ:
774 peer->oper_freq = atoi(value);
776 case WS_PEER_INFO_REQ_CONFIG_METHODS:
777 peer->req_config_methods = atoi(value);
779 case WS_PEER_INFO_FLAGS:
780 strncpy(peer->flags, value, PEER_FLAGS_LEN);
781 peer->flags[PEER_FLAGS_LEN-1] = '\0';
783 case WS_PEER_INFO_STATUS:
784 strncpy(peer->status, value, PEER_STATUS_LEN);
785 peer->status[PEER_STATUS_LEN-1] = '\0';
787 case WS_PEER_INFO_WAIT_COUNT:
788 peer->wait_count = atoi(value);
790 case WS_PEER_INFO_INVITATION_REQS:
791 peer->invitation_reqs = atoi(value);
793 case WS_PEER_INFO_OPER_SSID:
794 strncpy(peer->oper_ssid, value, DEVICE_NAME_LEN);
795 peer->oper_ssid[DEVICE_NAME_LEN-1] = '\0';
798 /*----- Miracast -----*/
799 case WS_PEER_INFO_IS_WFD_DEVICE:
800 peer->is_wfd_device = atoi(value);
804 WDP_LOGD( "unknown field\n");
809 __WDP_LOG_FUNC_EXIT__;
814 int __parsing_persistent_group(char* buf, ws_network_info_s ws_persistent_group_list[], int* persistent_group_num)
816 __WDP_LOG_FUNC_ENTER__;
819 ws_network_info_s group;
822 memset(&group, 0, sizeof(ws_network_info_s));
825 // Passing first line : "network id / ssid / bssid / flags"
835 ptr = __get_persistent_group_value(ptr, &group);
837 ws_persistent_group_list[count].network_id = group.network_id;
838 strncpy(ws_persistent_group_list[count].ssid, group.ssid, sizeof(ws_persistent_group_list[count].ssid));
839 strncpy(ws_persistent_group_list[count].bssid, group.bssid, sizeof(ws_persistent_group_list[count].bssid));
840 strncpy(ws_persistent_group_list[count].flags, group.flags, sizeof(ws_persistent_group_list[count].flags));
844 *persistent_group_num = count;
846 __WDP_LOG_FUNC_EXIT__;
851 void __parsing_ws_event(char* buf, ws_event_s *event)
853 __WDP_LOG_FUNC_ENTER__;
858 ws_field_id_e event_id;
863 WDP_LOGE( "ERROR : buf is NULL!!\n");
868 ptr = __get_event_str(ptr, event_str);
870 WDP_LOGD( "event str [%s]\n", event_str);
873 event_id = WS_EVENT_NONE;
874 while(g_ws_event_info[i].id != WS_EVENT_NONE)
876 if (strcmp(g_ws_event_info[i].str, event_str)==0)
878 event_id = g_ws_event_info[i].id;
886 memset(event, 0, sizeof(ws_event_s));
888 case WS_EVENT_DISCOVER_FOUND_PEER:
889 event->id = WS_EVENT_DISCOVER_FOUND_PEER;
890 WDP_LOGD( "WS EVENT : [WS_EVENT_DISCOVER_FOUND_PEER]\n");
893 case WS_EVENT_PROVISION_DISCOVERY_RESPONSE:
894 event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE;
895 ptr = __get_event_str(ptr, event_str);
896 strncpy(event->peer_mac_address, event_str, MACSTR_LEN);
897 event->peer_mac_address[MACSTR_LEN-1] = '\0';
898 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE]\n");
899 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
902 case WS_EVENT_PROVISION_DISCOVERY_PBC_REQ:
903 event->id = WS_EVENT_PROVISION_DISCOVERY_PBC_REQ;
904 res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
907 WDP_LOGE( "Failed to extract p2p_dev_addr");
908 // TO-DO: stop parsing and make event callback function stop
909 __WDP_LOG_FUNC_EXIT__;
912 res = __extract_value_str(ptr, "name" , event->peer_ssid);
915 WDP_LOGE( "Failed to extract name(ssid)");
916 // TO-DO: stop parsing and make event callback function stop
917 __WDP_LOG_FUNC_EXIT__;
920 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_PBC_REQ]\n");
921 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
924 case WS_EVENT_PROVISION_DISCOVERY_DISPLAY:
925 event->id = WS_EVENT_PROVISION_DISCOVERY_DISPLAY;
926 res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
929 WDP_LOGD( "Failed to extract p2p_dev_addr");
930 WDP_LOGD( "Prov disc Response : DISPLAY");
931 event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY;
932 ptr = __get_event_str(ptr, event_str);
933 strncpy(event->peer_mac_address, event_str, MACSTR_LEN);
934 event->peer_mac_address[MACSTR_LEN-1] = '\0';
935 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY]\n");
936 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
937 ptr = __get_event_str(ptr, event_str);
938 strncpy(event->wps_pin, event_str, WPS_PIN_LEN);
939 event->wps_pin[WPS_PIN_LEN-1] = '\0';
940 WDP_LOGD( "WS EVENT : [PIN : %s]\n", event_str);
941 __WDP_LOG_FUNC_EXIT__;
944 ptr = __get_event_str(ptr, event_str); /* Stepping Mac Addr */
945 ptr = __get_event_str(ptr, event_str); /* Stepping PIN */
946 memset(event->wps_pin, 0x00, sizeof(event->wps_pin));
947 strncpy(event->wps_pin, event_str, WPS_PIN_LEN);
948 event->wps_pin[WPS_PIN_LEN-1] = '\0';
949 WDP_LOGD( "WS EVENT : [PIN : %s]\n", event_str);
951 res = __extract_value_str(ptr, "name" , event->peer_ssid);
954 WDP_LOGE( "Failed to extract name(ssid)");
955 __WDP_LOG_FUNC_EXIT__;
958 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_DISPLAY]\n");
959 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
962 case WS_EVENT_PROVISION_DISCOVERY_KEYPAD:
963 event->id = WS_EVENT_PROVISION_DISCOVERY_KEYPAD;
964 res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
967 WDP_LOGD( "Failed to extract p2p_dev_addr");
968 WDP_LOGD( "Prov disc Response : KEYPAD");
969 event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD;
970 ptr = __get_event_str(ptr, event_str);
971 strncpy(event->peer_mac_address, event_str, MACSTR_LEN);
972 event->peer_mac_address[MACSTR_LEN-1] = '\0';
973 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD]\n");
974 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
975 __WDP_LOG_FUNC_EXIT__;
978 res = __extract_value_str(ptr, "name" , event->peer_ssid);
981 WDP_LOGE( "Failed to extract name(ssid)");
982 __WDP_LOG_FUNC_EXIT__;
985 WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_KEYPAD]\n");
986 WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
989 case WS_EVENT_GROUP_FORMATION_SUCCESS:
990 case WS_EVENT_GROUP_FORMATION_FAILURE:
991 event->id = event_id;
994 case WS_EVENT_GROUP_STARTED:
995 event->id = WS_EVENT_GROUP_STARTED;
996 WDP_LOGD( "WS EVENT : [WS_EVENT_GROUP_STARTED]\n");
1000 dev_addr = (char*) calloc(1, 18);
1001 res = __extract_value_str(ptr, "dev_addr", dev_addr);
1003 strcpy(event->peer_mac_address, dev_addr);
1005 WDP_LOGD( "connected peer mac address [%s]", event->peer_mac_address);
1007 /* for checking persistent group */
1009 dummy = (char*) calloc(1, 18); /* dummy */
1010 res = __extract_value_str(ptr, "PERSISTENT", dummy);
1013 WDP_LOGD( "[PERSISTENT GROUP]");
1014 event->id = WS_EVENT_PERSISTENT_GROUP_STARTED;
1020 case WS_EVENT_GROUP_REMOVED:
1021 event->id = WS_EVENT_GROUP_REMOVED;
1022 WDP_LOGD( "WS EVENT : [WS_EVENT_GROUP_REMOVED]\n");
1025 case WS_EVENT_TERMINATING:
1026 event->id = WS_EVENT_TERMINATING;
1027 WDP_LOGD( "WS EVENT : [WS_EVENT_TERMINATING]\n");
1030 case WS_EVENT_CONNECTED:
1032 WDP_LOGD( "WS EVENT : [WS_EVENT_CONNECTED]\n");
1035 intf_addr = (char*) calloc(1, 18);
1036 event->id = WS_EVENT_CONNECTED;
1037 res = __extract_value_str(ptr, "to", intf_addr);
1039 wfd_macaddr_atoe(intf_addr, g_assoc_sta_mac);
1040 WDP_LOGD( "connected peer interface mac address [%s]", intf_addr);
1045 case WS_EVENT_STA_CONNECTED:
1047 WDP_LOGD( "WS EVENT : [WS_EVENT_STA_CONNECTED]\n");
1049 event->id = WS_EVENT_STA_CONNECTED;
1051 ptr = __get_event_str(ptr, event_str);
1052 strncpy(event->peer_intf_mac_address, event_str, MACSTR_LEN);
1053 event->peer_intf_mac_address[MACSTR_LEN-1] = '\0';
1055 res = __extract_value_str(ptr, "dev_addr", event->peer_mac_address);
1057 WDP_LOGD("Key %s is not found", "dev_addr");
1059 WDP_LOGD("Empty value");
1061 WDP_LOGD( "connected peer mac address [%s]", event->peer_intf_mac_address);
1065 case WS_EVENT_DISCONNECTED:
1067 WDP_LOGD( "WS EVENT : [WS_EVENT_DISCONNECTED]\n");
1070 intf_addr = (char*) calloc(1, 18);
1071 event->id = WS_EVENT_DISCONNECTED;
1072 res = __extract_value_str(ptr, "to", intf_addr);
1074 strncpy(event->peer_mac_address, intf_addr, MACSTR_LEN);
1075 event->peer_mac_address[MACSTR_LEN-1] = '\0';
1078 WDP_LOGD( "disconnected peer mac address [%s]", event->peer_mac_address);
1082 case WS_EVENT_STA_DISCONNECTED:
1084 WDP_LOGD( "WS EVENT : [WS_EVENT_STA_DISCONNECTED]\n");
1086 event->id = WS_EVENT_STA_DISCONNECTED;
1088 ptr = __get_event_str(ptr, event_str);
1089 strncpy(event->peer_intf_mac_address, event_str, MACSTR_LEN);
1090 event->peer_intf_mac_address[MACSTR_LEN-1] = '\0';
1092 res = __extract_value_str(ptr, "dev_addr", event->peer_mac_address);
1094 WDP_LOGD("Key %s is not found", "dev_addr");
1096 WDP_LOGD("Empty value");
1098 WDP_LOGD( "disconnected peer mac address [%s]", event->peer_intf_mac_address);
1102 case WS_EVENT_INVITATION_REQ:
1104 WDP_LOGD( "WS EVENT : [WS_EVENT_INVITATION_REQ]\n");
1106 event->id = WS_EVENT_INVITATION_REQ;
1109 res = __extract_value_str(ptr, "go_dev_addr", event->peer_mac_address);
1111 res = __extract_value_str(ptr, "bssid", event->peer_mac_address);
1115 WDP_LOGE( "Failed to extract p2p_dev_addr");
1116 __WDP_LOG_FUNC_EXIT__;
1119 WDP_LOGD( "WS EVENT : [GO MAC : %s]\n", event->peer_mac_address);
1123 case WS_EVENT_INVITATION_RSP:
1125 WDP_LOGD( "WS EVENT : [WS_EVENT_INVITATION_RSP]\n");
1127 event->id = WS_EVENT_INVITATION_RSP;
1130 res = __extract_value_str(ptr, "status", );
1133 WDP_LOGE( "Failed to extract p2p_dev_addr");
1136 WDP_LOGD( "WS EVENT : [GO MAC : %s]\n", event->peer_mac_address);
1141 case WS_EVENT_GO_NEG_REQUEST:
1143 WDP_LOGD( "WS EVENT : [WS_EVENT_GO_NEG_REQUEST]");
1145 event->id = WS_EVENT_GO_NEG_REQUEST;
1146 ptr = __get_event_str(ptr + 19, event_str);
1147 strncpy(event->peer_intf_mac_address, event_str, MACSTR_LEN);
1148 event->peer_intf_mac_address[MACSTR_LEN-1] = '\0';
1152 case WS_EVENT_WPS_FAIL:
1154 WDP_LOGD("WS EVENT : [WS_EVENT_WPS_FAIL]");
1155 char config_error[4] = {0, };
1156 event->id = WS_EVENT_WPS_FAIL;
1157 ptr = __extract_value_str(ptr, "config_error", config_error);
1158 event->msg = atoi(config_error);
1163 WDP_LOGE( "ERROR : unknown event !!\n");
1167 __WDP_LOG_FUNC_EXIT__;
1173 int __store_persistent_peer(int network_id, char* persistent_group_ssid, char* peer_mac_address)
1175 __WDP_LOG_FUNC_ENTER__;
1180 snprintf(buf, sizeof(buf), "%d %s %s\n",network_id, persistent_group_ssid, peer_mac_address);
1182 fp = fopen(PERSISTENT_PEER_PATH, "a");
1185 WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
1186 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
1189 //fseek(fp, 0, SEEK_END);
1193 __WDP_LOG_FUNC_EXIT__;
1198 int __get_network_id_from_network_list_with_ssid(char* persistent_group_ssid)
1200 __WDP_LOG_FUNC_ENTER__;
1202 int persistent_group_count = 0;
1205 wfd_persistent_group_info_s* plist;
1207 WDP_LOGD( "search with persistent_group_ssid = [%s]\n",persistent_group_ssid);
1209 result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
1212 if (persistent_group_count > 0)
1214 for(i=0; i<persistent_group_count; i++)
1216 WDP_LOGD( "plist[%d].ssid=[%s]\n", i,plist[i].ssid);
1217 if (strcmp(plist[i].ssid, persistent_group_ssid) == 0)
1219 WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
1220 return plist[i].network_id;
1223 WDP_LOGE( "There is no Persistent Group has ssid[%s]\n", persistent_group_ssid);
1224 __WDP_LOG_FUNC_EXIT__;
1229 WDP_LOGE( "have no Persistent Group!!\n");
1230 __WDP_LOG_FUNC_EXIT__;
1236 WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
1237 __WDP_LOG_FUNC_EXIT__;
1242 int __get_network_id_from_network_list_with_go_mac(char* go_mac_address)
1244 __WDP_LOG_FUNC_ENTER__;
1246 int persistent_group_count = 0;
1249 wfd_persistent_group_info_s* plist;
1250 char mac_str[18] = {0, };
1252 WDP_LOGD( "search with persistent_group go_mac_address = [%s]\n",go_mac_address);
1254 result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
1257 if (persistent_group_count > 0)
1259 for(i=0; i<persistent_group_count; i++)
1261 snprintf(mac_str, 18, MACSTR, MAC2STR(plist[i].go_mac_address));
1262 WDP_LOGD( "plist[%d].go_mac_address=[%s]\n", i,mac_str);
1263 if (strcmp(mac_str, go_mac_address) == 0)
1265 WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
1266 return plist[i].network_id;
1269 WDP_LOGE( "There is no Persistent Group has go mac[%s]\n", go_mac_address);
1270 __WDP_LOG_FUNC_EXIT__;
1275 WDP_LOGE( "have no Persistent Group!!\n");
1276 __WDP_LOG_FUNC_EXIT__;
1282 WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
1283 __WDP_LOG_FUNC_EXIT__;
1289 int __get_network_id_from_persistent_client_list_with_mac(char* peer_mac_address)
1291 __WDP_LOG_FUNC_ENTER__;
1297 char stored_ssid[64] = "";
1298 char stored_peer_mac[18] = "";
1300 fp = fopen(PERSISTENT_PEER_PATH, "r");
1303 WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
1304 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
1307 while(fgets(buf, 100, fp) != NULL)
1309 n = sscanf(buf,"%d %s %s", &network_id, stored_ssid, stored_peer_mac);
1310 WDP_LOGD( "network_id=[%d], ssid=[%s], peer_mac=[%s]\n",network_id, stored_ssid, stored_peer_mac);
1312 if (strcmp(stored_peer_mac, peer_mac_address) == 0)
1319 WDP_LOGD( "Can not find peer mac in persistent peer list\n");
1321 __WDP_LOG_FUNC_EXIT__;
1326 bool __is_already_stored_persistent_client(int network_id, char* peer_mac_address)
1328 __WDP_LOG_FUNC_ENTER__;
1333 int stored_network_id;
1334 char stored_ssid[64] = "";
1335 char stored_peer_mac[18] = "";
1337 fp = fopen(PERSISTENT_PEER_PATH, "r");
1340 WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
1341 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
1344 while(fgets(buf, 100, fp) != NULL)
1346 n = sscanf(buf,"%d %s %s", &stored_network_id, stored_ssid, stored_peer_mac);
1347 WDP_LOGD( "stored_network_id=[%d], stored_ssid=[%s], stored_peer_mac=[%s]\n",stored_network_id, stored_ssid, stored_peer_mac);
1349 if ((strcmp(stored_peer_mac, peer_mac_address) == 0)
1350 && (stored_network_id == network_id))
1352 WDP_LOGD( "found peer in persistent peer list\n");
1353 __WDP_LOG_FUNC_EXIT__;
1359 WDP_LOGD( "Can not find peer in persistent peer list\n");
1360 __WDP_LOG_FUNC_EXIT__;
1365 int __get_persistent_group_clients(void)
1367 __WDP_LOG_FUNC_ENTER__;
1374 char peer_mac[18] = "";
1376 fp = fopen(PERSISTENT_PEER_PATH, "r");
1379 WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
1380 return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
1383 while(fgets(buf, 100, fp) != NULL)
1385 n = sscanf(buf,"%d %s %s", &network_id, ssid, peer_mac);
1386 WDP_LOGD( "network_id=[%d], ssid=[%s], peer_mac=[%s]\n",network_id, ssid, peer_mac);
1390 __WDP_LOG_FUNC_EXIT__;
1395 int __send_invite_request_with_network_id(int network_id, unsigned char dev_mac_addr[6])
1397 __WDP_LOG_FUNC_ENTER__;
1399 char cmd[128] = {0, };
1400 char mac_str[18] = {0, };
1401 char res_buffer[1024]={0,};
1402 int res_buffer_len = sizeof(res_buffer);
1405 snprintf(mac_str, 18, MACSTR, MAC2STR(dev_mac_addr));
1406 snprintf(cmd, sizeof(cmd), "%s persistent=%d peer=%s", CMD_SEND_INVITE_REQ, network_id, mac_str);
1408 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
1409 WDP_LOGD( "__send_wpa_request(p2p_invite persistent=%d peer=%s) result=[%d]\n", network_id, mac_str, result);
1413 WDP_LOGE( "__send_wpa_request FAILED!!\n");
1414 __WDP_LOG_FUNC_EXIT__;
1418 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
1420 WDP_LOGE( "__send_wpa_request FAILED!!\n");
1421 __WDP_LOG_FUNC_EXIT__;
1425 WDP_LOGD( "Invite... peer-MAC [%s]\n", mac_str);
1427 __WDP_LOG_FUNC_EXIT__;
1431 int glist_compare_peer_mac_cb(const void* data1, const void* data2)
1433 char *mac_str1 = (char*) data1;
1434 char *mac_str2 = (char*) data2;
1437 if (data1==NULL || data2==NULL)
1439 WDP_LOGE( "Error!! data is NULL\n");
1443 r = strcmp(mac_str1, mac_str2);
1450 void glist_print_connected_peer_cb(gpointer data, gpointer user_data)
1452 char *mac_str = (char*) data;
1453 int count = *(int*)user_data;
1454 WDP_LOGD( "Connected peer[%d] mac=[%s]\n", count, mac_str);
1455 *(int*)user_data = count+1;
1458 void wfd_ws_print_connected_peer()
1460 WDP_LOGD( "Connected Peer Table\n");
1462 g_list_foreach(g_conn_peer_addr, glist_print_connected_peer_cb, &count);
1463 WDP_LOGD( "Count=%d\n", count);
1466 void wfd_ws_glist_reset_connected_peer()
1468 if(g_conn_peer_addr)
1470 GList *element = NULL;
1472 element = g_list_first(g_conn_peer_addr);
1476 free((char*) element->data);
1477 element = g_list_next(element);
1479 g_list_free(g_conn_peer_addr);
1480 g_conn_peer_addr = NULL;
1485 static gboolean __ws_event_callback(GIOChannel * source,
1486 GIOCondition condition,
1489 __WDP_LOG_FUNC_ENTER__;
1491 int sockfd = g_monitor_sockfd;
1492 char buffer[4096] = {0, };
1494 ws_event_s event = {0,};
1497 if ( (n = __read_socket_cb(sockfd, buffer, sizeof(buffer))) < 0)
1499 WDP_LOGE( "Error!!! Reading Async Event[%d]\n", sockfd);
1500 __WDP_LOG_FUNC_EXIT__;
1504 WDP_LOGD( "Received Event:[%d, %s]\n", n, buffer);
1506 __parsing_ws_event(buffer, &event);
1508 WDP_LOGD( "EVENT ID = %d\n", event.id);
1512 case WS_EVENT_DISCOVER_FOUND_PEER:
1513 g_noti_cb(WFD_EVENT_DISCOVER_FOUND_PEERS);
1516 case WS_EVENT_PROVISION_DISCOVERY_RESPONSE:
1518 unsigned char la_mac_addr[6];
1519 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1521 wfd_server_control_t * wfd_server = wfd_server_get_control();
1523 WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
1524 if (wfd_server->current_peer.is_group_owner == FALSE)
1525 wfd_ws_connect(la_mac_addr, WIFI_DIRECT_WPS_TYPE_PBC);
1529 case WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY:
1531 if (g_wps_event_block)
1534 g_wps_event_block = 1;
1535 unsigned char la_mac_addr[6];
1536 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1537 memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
1538 memcpy(g_incomming_peer_mac_address, la_mac_addr, 6);
1539 memset(g_wps_pin, 0x00, sizeof(g_wps_pin));
1540 memcpy(&g_wps_pin, event.wps_pin, 8);
1541 WDP_LOGD( "MAC ADDR = " MACSTR "(a)\tPIN = %s\n", MAC2STR(g_incomming_peer_mac_address), g_wps_pin);
1542 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY);
1546 case WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD:
1548 if (g_wps_event_block)
1551 g_wps_event_block = 1;
1552 unsigned char la_mac_addr[6];
1553 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1554 memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
1555 memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
1556 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD);
1561 case WS_EVENT_PROVISION_DISCOVERY_PBC_REQ:
1562 case WS_EVENT_PROVISION_DISCOVERY_DISPLAY:
1563 case WS_EVENT_PROVISION_DISCOVERY_KEYPAD:
1565 if (g_wps_event_block)
1568 g_wps_event_block = 1;
1569 WDP_LOGD("Incomming PROV_DISC [%d]", event.id);
1570 unsigned char la_mac_addr[6];
1571 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1572 memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
1573 memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
1574 memset(g_incomming_peer_ssid, 0, sizeof(g_incomming_peer_ssid));
1575 strncpy(g_incomming_peer_ssid, event.peer_ssid, sizeof(g_incomming_peer_ssid));
1577 WDP_LOGD( "NEW PIN RECEIVED = %s\n", event.wps_pin);
1578 memset(g_wps_pin, 0x00, sizeof(g_wps_pin));
1579 strncpy(g_wps_pin, event.wps_pin, WPS_PIN_LEN);
1581 WDP_LOGD( "Prov Req: mac[" MACSTR"] ssid=[%s]\n",
1582 MAC2STR(g_incomming_peer_mac_address), g_incomming_peer_ssid);
1584 if (WS_EVENT_PROVISION_DISCOVERY_DISPLAY == event.id)
1585 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY);
1586 else if (WS_EVENT_PROVISION_DISCOVERY_KEYPAD == event.id)
1587 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD);
1589 g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST);
1593 case WS_EVENT_GROUP_FORMATION_SUCCESS:
1594 case WS_EVENT_GROUP_FORMATION_FAILURE:
1595 g_wps_event_block = 0;
1598 case WS_EVENT_GROUP_STARTED:
1600 g_wps_event_block = 0;
1602 if(wfd_ws_is_groupowner())
1604 WDP_LOGD(" CHECK : It's AP... \n");
1605 system("/usr/bin/wifi-direct-dhcp.sh server");
1606 __polling_ip(g_local_interface_ip_address, 20, FALSE);
1607 WDP_LOGE( "*** IP : %s\n", g_local_interface_ip_address);
1609 g_noti_cb(WFD_EVENT_SOFTAP_READY);
1613 wfd_ws_glist_reset_connected_peer();
1615 g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
1616 WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
1618 g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
1623 case WS_EVENT_PERSISTENT_GROUP_STARTED:
1625 if(wfd_ws_is_groupowner())
1627 WDP_LOGD(" CHECK : It's AP... \n");
1628 system("/usr/bin/wifi-direct-dhcp.sh server");
1629 __polling_ip(g_local_interface_ip_address, 20, FALSE);
1630 WDP_LOGE( "*** IP : %s\n", g_local_interface_ip_address);
1632 g_noti_cb(WFD_EVENT_SOFTAP_READY);
1636 wfd_ws_glist_reset_connected_peer();
1638 g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
1639 WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
1641 /* We need to store current peer
1642 because, persistent joining is excuted silencely without client event.*/
1643 unsigned char la_mac_addr[6];
1644 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1645 wfd_server_remember_connecting_peer(la_mac_addr);
1646 wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
1648 g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
1653 case WS_EVENT_GROUP_REMOVED:
1655 system("/usr/bin/wifi-direct-dhcp.sh stop");
1656 g_noti_cb(WFD_EVENT_CREATE_LINK_CANCEL);
1657 g_noti_cb(WFD_EVENT_CREATE_LINK_DOWN);
1658 g_noti_cb(WFD_EVENT_SOFTAP_STOP);
1660 wfd_ws_glist_reset_connected_peer();
1667 case WS_EVENT_TERMINATING:
1668 system("/usr/bin/wlan.sh stop");
1669 system("/usr/sbin/p2p_supp.sh stop");
1670 WDP_LOGE( "Device is Deactivated\n");
1673 case WS_EVENT_CONNECTED:
1679 case WS_EVENT_DISCONNECTED:
1681 GList *element = NULL;
1682 element = g_list_find(g_conn_peer_addr, event.peer_mac_address);
1685 g_conn_peer_addr = g_list_remove(g_conn_peer_addr, event.peer_mac_address);
1686 WDP_LOGD( "disconnected peer[%s] is removed\n", event.peer_mac_address);
1687 free((char*) element->data);
1692 case WS_EVENT_STA_CONNECTED:
1694 g_wps_event_block = 0;
1695 GList *element = NULL;
1696 element = g_list_find_custom(g_conn_peer_addr, event.peer_mac_address, glist_compare_peer_mac_cb);
1699 g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
1700 WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
1703 wfd_ws_print_connected_peer();
1705 wfd_macaddr_atoe(event.peer_intf_mac_address, g_assoc_sta_mac);
1707 wfd_server_control_t * wfd_server = wfd_server_get_control();
1708 if (wfd_server->config_data.want_persistent_group == true)
1710 char g_persistent_group_ssid[64];
1714 memset(g_persistent_group_ssid, 0, sizeof(g_persistent_group_ssid));
1715 wfd_ws_get_ssid(g_persistent_group_ssid, 64);
1717 /* find network id with ssid */
1718 network_id = __get_network_id_from_network_list_with_ssid(g_persistent_group_ssid);
1719 if (network_id < 0) /* NOT Persistent group */
1721 WDP_LOGD( "__get_network_id_from_network_list_with_ssid FAIL!![%d]\n", network_id);
1722 WDP_LOGD( "[NOT Persistent Group]\n");
1724 else /* Persistent group */
1726 /* checking peer list whether the peer is already stored or not */
1727 if (__is_already_stored_persistent_client(network_id, event.peer_mac_address) == false)
1729 /* storing new persistent group client*/
1730 result = __store_persistent_peer(network_id, g_persistent_group_ssid, event.peer_mac_address);
1732 WDP_LOGD( "__store_persistent_peer FAIL!![%d]\n", result);
1735 /* We need to store current peer
1736 because, persistent joining is excuted silencely without client event.*/
1737 unsigned char la_mac_addr[6];
1738 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1739 wfd_server_remember_connecting_peer(la_mac_addr);
1740 wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
1744 g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
1747 case WS_EVENT_STA_DISCONNECTED:
1749 GList *element = NULL;
1751 wfd_ws_print_connected_peer();
1753 element = g_list_find_custom(g_conn_peer_addr, event.peer_mac_address, glist_compare_peer_mac_cb);
1756 g_conn_peer_addr = g_list_remove(g_conn_peer_addr, element->data);
1757 WDP_LOGD( "disconnected peer[%s] is removed\n", event.peer_mac_address);
1758 wfd_ws_print_connected_peer();
1762 WDP_LOGD( "Something wrong.. disconnected peer[%s] is not in Table\n", event.peer_mac_address);
1764 wfd_macaddr_atoe(event.peer_intf_mac_address, g_disassoc_sta_mac);
1765 g_noti_cb(WFD_EVENT_SOFTAP_STA_DISASSOC);
1769 case WS_EVENT_INVITATION_REQ:
1771 unsigned char la_mac_addr[6];
1772 wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
1773 memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
1774 WDP_LOGD( "INVITATION REQ. RECEIVED: mac[" MACSTR"]\n", MAC2STR(g_incomming_peer_mac_address));
1775 wfd_ws_start_discovery(false, 0);
1777 g_noti_cb(WFD_EVENT_INVITE_REQUEST);
1781 case WS_EVENT_INVITATION_RSP:
1786 case WS_EVENT_WPS_FAIL:
1788 if (event.msg == WPS_ERROR_PASSWORD_MISMATCH) {
1789 WDP_LOGD("WPS_ERROR_PASSWORD_MISMATCH");
1790 g_noti_cb(WFD_EVENT_CREATE_LINK_AUTH_FAIL);
1800 __WDP_LOG_FUNC_EXIT__;
1805 int __convert_category_from_type(char *pri_dev_type)
1807 __WDP_LOG_FUNC_ENTER__;
1808 char *saveptr = NULL;
1811 if(pri_dev_type == NULL)
1813 WDP_LOGE( "Incorrect parameter\n");
1817 token = strtok_r(pri_dev_type, "-", &saveptr);
1820 WDP_LOGD( "Extracting failed\n");
1824 if(!strcmp(token, "255"))
1825 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_OTHER;
1826 else if(!strcmp(token, "11"))
1827 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_AUDIO;
1828 else if(!strcmp(token, "10"))
1829 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE;
1830 else if(!strcmp(token, "9"))
1831 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_GAME_DEVICE;
1832 else if(!strcmp(token, "8"))
1833 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_MULTIMEDIA_DEVICE;
1834 else if(!strcmp(token, "7"))
1835 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_DISPLAY;
1836 else if(!strcmp(token, "6"))
1837 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_NETWORK_INFRA;
1838 else if(!strcmp(token, "5"))
1839 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_STORAGE;
1840 else if(!strcmp(token, "4"))
1841 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_CAMERA;
1842 else if(!strcmp(token, "3"))
1843 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_PRINTER;
1844 else if(!strcmp(token, "2"))
1845 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_INPUT_DEVICE;
1846 else if(!strcmp(token, "1"))
1847 return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_COMPUTER;
1850 WDP_LOGD( "Unknown device type [%s]\n", token);
1853 __WDP_LOG_FUNC_EXIT__;
1858 int __wpa_ctrl_attach(int sockfd)
1860 __WDP_LOG_FUNC_ENTER__;
1863 char res_buffer[1024]={0,};
1864 int res_buffer_len=sizeof(res_buffer);
1867 strncpy(cmd, CMD_ATTACH, sizeof(cmd));
1868 result = __send_wpa_request(sockfd, cmd, (char*)res_buffer, res_buffer_len);
1869 WDP_LOGE( "__send_wpa_request(ATTACH) result=[%d]\n", result);
1872 WDP_LOGE( "__send_wpa_request FAILED!!\n");
1874 __WDP_LOG_FUNC_EXIT__;
1883 __convert_wps_config_methods_value(wifi_direct_wps_type_e wps_config_methods)
1885 __WDP_LOG_FUNC_ENTER__;
1887 WDP_LOGD("wps_config_methods [%d]\n", wps_config_methods);
1889 switch(wps_config_methods)
1891 case WIFI_DIRECT_WPS_TYPE_PBC:
1893 __WDP_LOG_FUNC_EXIT__;
1898 case WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY:
1900 __WDP_LOG_FUNC_EXIT__;
1905 case WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD:
1907 __WDP_LOG_FUNC_EXIT__;
1914 WDP_LOGD("Invalid input parameter!\n");
1915 __WDP_LOG_FUNC_EXIT__;
1924 __convert_device_type(char *ptr)
1926 __WDP_LOG_FUNC_ENTER__;
1930 char category_type[3] = {0,};
1934 WDP_LOGE( "ERROR : ptr is NULL!!\n");
1939 while(*p != '-') // take the first number before the first '-' (e.g. 1-0050F204-5)
1941 category_type[c++] = *p++;
1943 category_type[c]='\0';
1945 WDP_LOGD("category=[%d]\n", atoi(category_type));
1947 __WDP_LOG_FUNC_EXIT__;
1949 return atoi(category_type);
1953 __convert_secondary_device_type(char *ptr)
1955 __WDP_LOG_FUNC_ENTER__;
1959 char category_type[3] = {0,};
1963 WDP_LOGE( "ERROR : ptr is NULL!!\n");
1967 p = strstr(ptr, WIFI_ALLIANCE_OUI);
1970 WDP_LOGE( "ERROR : Unknown OUI, It's vendor specific device type..\n");
1973 p += strlen(WIFI_ALLIANCE_OUI); // // skip OUI (e.g. 1-0050F204-5)
1974 p ++; // skip the second '-' (e.g. 1-0050F204-5)
1979 category_type[c++] = *p++;
1981 category_type[c]='\0';
1983 WDP_LOGD("sub-category [%d]\n", atoi(category_type));
1985 __WDP_LOG_FUNC_EXIT__;
1987 return atoi(category_type);
1991 int __convert_freq_to_channel(char *freq_kHz)
1993 __WDP_LOG_FUNC_ENTER__;
1997 while(g_ws_op_channel_info[i].channel != 0)
1999 if (strcmp(g_ws_op_channel_info[i].freq, freq_kHz)==0)
2001 channel = g_ws_op_channel_info[i].channel;
2007 __WDP_LOG_FUNC_EXIT__;
2012 #if 1 // Threadsafe event handling.
2014 void __wfd_oem_callback(wfd_event_t event)
2016 // write header parts
2017 write(g_oem_pipe[1], &event, sizeof(event));
2022 void __wfd_oem_callback(wfd_event_t event_type)
2024 if (g_oem_event_callback != NULL)
2025 g_oem_event_callback(event_type);
2030 int __wfd_ws_reinvoke_persistent_group(int network_id)
2032 __WDP_LOG_FUNC_ENTER__;
2034 char cmd[64] = {0, };
2035 char res_buffer[1024]={0,};
2036 int res_buffer_len = sizeof(res_buffer);
2039 /* Persistent group mode */
2040 snprintf(cmd, sizeof(cmd), "%s %s%d", CMD_CREATE_GROUP, "persistent=", network_id);
2042 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2043 WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD persistent=%d) result=[%d]\n", network_id, result);
2047 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2048 __WDP_LOG_FUNC_EXIT__;
2052 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2054 __WDP_LOG_FUNC_EXIT__;
2058 WDP_LOGD( "Create p2p persistent group... \n");
2060 __WDP_LOG_FUNC_EXIT__;
2064 int wfd_ws_init(wfd_oem_event_cb event_callback)
2066 __WDP_LOG_FUNC_ENTER__;
2068 #if 1 // Threadsafe event handling
2069 if (pipe(g_oem_pipe) < 0) {
2070 WDP_LOGD( "pipe error : Error=[%s]\n", strerror(errno));
2074 GIOChannel* gio2 = g_io_channel_unix_new(g_oem_pipe[0]);
2075 g_io_add_watch(gio2, G_IO_IN, (GIOFunc)__wfd_oem_thread_safe_event_handler_cb, NULL);
2076 g_io_channel_unref(gio2);
2079 g_oem_event_callback = event_callback;
2081 g_noti_cb = __wfd_oem_callback;
2083 memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
2084 memset(g_incomming_peer_ssid, 0, sizeof(g_incomming_peer_ssid));
2086 __WDP_LOG_FUNC_EXIT__;
2090 int wfd_ws_destroy()
2092 __WDP_LOG_FUNC_ENTER__;
2094 // Do nothing upto now...
2096 __WDP_LOG_FUNC_EXIT__;
2100 int wfd_ws_activate()
2102 __WDP_LOG_FUNC_ENTER__;
2104 char cmd[128] = {0, };
2105 char res_buffer[1024]={0,};
2106 int res_buffer_len=sizeof(res_buffer);
2108 // Loading Driver, Excuting p2p_supplicant
2109 system("/usr/bin/wlan.sh p2p");
2110 system("/usr/sbin/p2p_supp.sh start");
2113 g_global_sockfd = __create_ctrl_intf("p2p_ctrl_global", "/var/run/p2p_global");
2114 if(g_global_sockfd < 0)
2116 WDP_LOGE( "Failed to create Global Control interface\n");
2120 strncpy(cmd, CMD_INTERFACE, sizeof(cmd));
2121 result = __send_wpa_request(g_global_sockfd, cmd, res_buffer, res_buffer_len);
2122 WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
2123 if(!strstr(res_buffer, "wlan0"))
2125 memset(cmd, 0x0, 128);
2126 memset(res_buffer, 0x0, 1024);
2128 snprintf(cmd, sizeof(cmd), "%s %s", CMD_INTERFACE_ADD, "wlan0\t/usr/etc/wifi-direct/p2p_suppl.conf\tnl80211\t/var/run/p2p_supplicant");
2129 result = __send_wpa_request(g_global_sockfd, cmd, res_buffer, res_buffer_len);
2130 WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
2132 memset(res_buffer, 0x0, 1024);
2141 g_control_sockfd = __create_ctrl_intf("p2p_ctrl_control", "/var/run/p2p_supplicant/wlan0");
2142 if (g_control_sockfd > 0) {
2144 g_monitor_sockfd = __create_ctrl_intf("p2p_ctrl_monitor", "/var/run/p2p_supplicant/wlan0");
2145 if (g_monitor_sockfd > 0)
2147 if (__wpa_ctrl_attach(g_monitor_sockfd) < 0)
2149 WDP_LOGE( "Failed to attach monitor socket! sockfd=[%d]", g_monitor_sockfd);
2155 WDP_LOGE( "Failed to attach control socket! sockfd=[%d]", g_control_sockfd);
2160 WDP_LOGE( "Failed to create socket !!\n");
2162 } while (count > 0);
2164 WDP_LOGD( "Successfully socket connected to server !!\n");
2168 gio3 = g_io_channel_unix_new(g_monitor_sockfd);
2169 g_source_id = g_io_add_watch(gio3, G_IO_IN | G_IO_ERR | G_IO_HUP, (GIOFunc) __ws_event_callback, NULL);
2170 g_io_channel_unref(gio3);
2171 WDP_LOGD( "Scoket is successfully registered to g_main_loop.\n");
2173 //wfd_ws_set_oem_loglevel(3);
2176 if(wfd_ws_dsp_init() == true)
2177 WDP_LOGD( "Success : wfd_ws_dsp_init() \n");
2179 WDP_LOGE( "Failed : wfd_ws_dsp_init()\n");
2181 __get_persistent_group_clients();
2183 __WDP_LOG_FUNC_EXIT__;
2187 int wfd_ws_deactivate()
2189 __WDP_LOG_FUNC_ENTER__;
2191 char cmd[32] = {0, };
2192 char res_buffer[1024]={0,};
2193 int res_buffer_len=sizeof(res_buffer);
2196 g_wps_event_block = 0;
2199 wfd_ws_cancel_discovery();
2201 // detach monitor interface
2202 strncpy(cmd, CMD_DETACH, sizeof(cmd));
2203 result = __send_wpa_request(g_monitor_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2204 WDP_LOGD( "__send_wpa_request(CMD_DETACH) result=[%d]\n", result);
2207 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2208 __WDP_LOG_FUNC_EXIT__;
2211 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2213 WDP_LOGE( "DETACH command Fail. result [%d], res_buffer [%s]\n", result, res_buffer);
2214 __WDP_LOG_FUNC_EXIT__;
2217 memset(cmd, 0x0, 32);
2218 memset(res_buffer, 0x0, 1024);
2220 // close control interface
2221 g_source_remove(g_source_id);
2222 unlink("/tmp/wpa_ctrl_monitor");
2223 if (g_monitor_sockfd >= 0)
2224 close(g_monitor_sockfd);
2226 // terminate wpasupplicant
2227 strncpy(cmd, CMD_TERMINATE, sizeof(cmd));
2228 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2229 WDP_LOGD( "__send_wpa_request(CMD_TERMINATE) result=[%d]\n", result);
2232 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2233 __WDP_LOG_FUNC_EXIT__;
2236 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2238 WDP_LOGE( "DETACH command Fail. result [%d], res_buffer [%s]\n", result, res_buffer);
2239 __WDP_LOG_FUNC_EXIT__;
2242 memset(cmd, 0x0, 32);
2243 memset(res_buffer, 0x0, 1024);
2245 unlink("/tmp/wpa_ctrl_control");
2246 if (g_control_sockfd >= 0)
2247 close(g_control_sockfd);
2249 wfd_ws_glist_reset_connected_peer();
2252 system("/usr/bin/wlan.sh stop");
2254 __WDP_LOG_FUNC_EXIT__;
2258 int wfd_ws_wps_pbc_start(unsigned char peer_addr[6])
2260 __WDP_LOG_FUNC_ENTER__;
2262 char cmd[40] = {0, };
2263 char res_buffer[1024]={0,};
2264 int res_buffer_len = sizeof(res_buffer);
2267 if (wfd_ws_is_groupowner()!=true)
2269 WDP_LOGE( "wps_pbc_start() can be called, only when device is go!!\n");
2270 __WDP_LOG_FUNC_EXIT__;
2274 char tmp_mac[6] = {0,};
2276 if (peer_addr == NULL) {
2277 WDP_LOGD("Peer address is NULL");
2278 if (memcmp(g_incomming_peer_mac_address, tmp_mac, 6) == 0) {
2279 WDP_LOGD("Incomming peer [" MACSTR "]", MAC2STR(g_incomming_peer_mac_address));
2280 snprintf(cmd, sizeof(cmd), "%s", CMD_WPS_PUSHBUTTON_START);
2282 WDP_LOGD("Incomming peer [" MACSTR "]", MAC2STR(g_incomming_peer_mac_address));
2283 snprintf(cmd, sizeof(cmd), "%s p2p_dev_addr=" MACSTR "", CMD_WPS_PUSHBUTTON_START, MAC2STR(g_incomming_peer_mac_address));
2285 } else if (memcmp(peer_addr, tmp_mac, 6) != 0){
2286 WDP_LOGD("Peer address [" MACSTR "]", MAC2STR(peer_addr));
2287 snprintf(cmd, sizeof(cmd), "%s p2p_dev_addr=" MACSTR "", CMD_WPS_PUSHBUTTON_START, MAC2STR(peer_addr));
2289 WDP_LOGE("Peer address is incorrent");
2293 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2294 WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
2297 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2298 __WDP_LOG_FUNC_EXIT__;
2302 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2304 __WDP_LOG_FUNC_EXIT__;
2308 WDP_LOGD( "start WPS PBC...\n");
2310 __WDP_LOG_FUNC_EXIT__;
2314 int wfd_ws_wps_pin_start(unsigned char peer_addr[6])
2316 __WDP_LOG_FUNC_ENTER__;
2318 char cmd[50] = {0, };
2319 char mac_str[18] = {0, };
2320 char res_buffer[1024]={0,};
2321 int res_buffer_len = sizeof(res_buffer);
2324 snprintf(mac_str, 18, MACSTR, MAC2STR(peer_addr));
2325 snprintf(cmd, sizeof(cmd),"%s %s %s", CMD_WPS_WPS_PIN_START, mac_str, g_wps_pin);
2326 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2327 WDP_LOGD( "__send_wpa_request(WPS_PIN) result=[%d]\n", result);
2330 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2331 __WDP_LOG_FUNC_EXIT__;
2335 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2337 __WDP_LOG_FUNC_EXIT__;
2341 WDP_LOGD( "start WPS PBC...\n");
2344 __WDP_LOG_FUNC_EXIT__;
2348 int wfd_ws_connect(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config)
2350 __WDP_LOG_FUNC_ENTER__;
2352 char cmd[64] = {0, };
2353 char mac_str[18] = {0, };
2354 char res_buffer[1024]={0,};
2355 int res_buffer_len = sizeof(res_buffer);
2358 wfd_server_control_t * wfd_server = wfd_server_get_control();
2359 WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
2361 if (wfd_ws_is_groupowner()==true)
2363 strncpy(cmd, CMD_WPS_PUSHBUTTON_START, sizeof(cmd));
2364 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2365 WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
2368 if (wfd_server->current_peer.is_group_owner)
2370 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2371 if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD ||
2372 wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
2373 snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, g_wps_pin);
2375 snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, __convert_wps_config_methods_value(wps_config));
2377 WDP_LOGD("Join command: [%s]", cmd);
2378 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2379 WDP_LOGD( "__send_wpa_request(CMD_CONNECT join) result=[%d]\n", result);
2383 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2384 WDP_LOGD( "MAC ADDR = [%s]\t PIN = [%s]\n",
2385 mac_str, g_wps_pin);
2387 if (wps_config == WIFI_DIRECT_WPS_TYPE_PBC) {
2388 WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PBC");
2389 snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CONNECT, mac_str, CMD_PBC_STRING);
2390 } else if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
2391 WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY");
2392 snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, CMD_DISPLAY_STRING);
2393 } else if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
2394 WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD");
2395 snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, CMD_KEYPAD_STRING);
2397 WDP_LOGD( "UNKNOWN CONFIG METHOD\n");
2401 WDP_LOGD( "COMMAND = [%s]\n", cmd);
2403 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2404 WDP_LOGD( "__send_wpa_request(P2P_CONNECT) result=[%d]\n", result);
2409 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2410 __WDP_LOG_FUNC_EXIT__;
2414 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2416 __WDP_LOG_FUNC_EXIT__;
2420 WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
2422 __WDP_LOG_FUNC_EXIT__;
2425 int wfd_ws_connect_for_go_neg(unsigned char mac_addr[6],
2426 wifi_direct_wps_type_e wps_config)
2428 __WDP_LOG_FUNC_ENTER__;
2429 char cmd[64] = {0, };
2430 char mac_str[18] = {0, };
2431 char res_buffer[1024]={0,};
2432 int res_buffer_len = sizeof(res_buffer);
2435 WDP_LOGD( "CONNECT REQUEST FOR GO NEGOTIATION");
2436 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2437 snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, __convert_wps_config_methods_value(wps_config));
2439 if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD ||
2440 wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
2441 WDP_LOGD( "CONFIG = [%d] \n", wps_config);
2443 WDP_LOGE( "Not expected CONFIG METHOD\n");
2447 WDP_LOGD( "COMMAND = [%s]****\n", cmd);
2448 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer,
2451 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2452 __WDP_LOG_FUNC_EXIT__;
2455 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) {
2456 __WDP_LOG_FUNC_EXIT__;
2459 WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
2460 __WDP_LOG_FUNC_EXIT__;
2464 /* for sending connection request in case Persistent mode enabled */
2465 int wfd_ws_connect_for_persistent_group(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config)
2467 __WDP_LOG_FUNC_ENTER__;
2469 char cmd[64] = {0, };
2470 char mac_str[18] = {0, };
2471 char res_buffer[1024]={0,};
2472 int res_buffer_len = sizeof(res_buffer);
2475 wfd_server_control_t * wfd_server = wfd_server_get_control();
2476 WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
2477 WDP_LOGD( "wfd_server->current_peer.is_persistent_go=[%d]\n", wfd_server->current_peer.is_persistent_go);
2481 WDP_LOGD( "[persistent mode!!!]\n");
2482 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2484 if (wfd_server->current_peer.is_group_owner) /* join group */
2486 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2487 snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, __convert_wps_config_methods_value(wps_config));
2488 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2489 WDP_LOGD( "__send_wpa_request(CMD_CONNECT join) result=[%d]\n", result);
2491 else /* Creating or reinvoking my persistent group and send invite req. */
2494 /* First, searching for peer in persistent client list : in case, My device is GO */
2495 network_id = __get_network_id_from_persistent_client_list_with_mac(mac_str);
2497 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 */
2498 network_id = __get_network_id_from_network_list_with_go_mac(mac_str);
2500 if (network_id < 0) /* If can not find peer anywhere, Create new persistent group */
2502 if (wfd_ws_create_group(NULL) != true)
2504 WDP_LOGE( "wfd_ws_create_group FAILED!!\n");
2505 __WDP_LOG_FUNC_EXIT__;
2509 if (wfd_ws_send_invite_request(mac_addr) != true)
2511 WDP_LOGE( "wfd_ws_send_invite_request FAILED!!\n");
2512 __WDP_LOG_FUNC_EXIT__;
2516 else /* Reinvoke persistent group and invite peer */
2518 if (__send_invite_request_with_network_id(network_id, mac_addr) != true)
2520 WDP_LOGE( "__send_invite_request_with_network_id FAILED!!\n");
2521 __WDP_LOG_FUNC_EXIT__;
2525 if (__wfd_ws_reinvoke_persistent_group(network_id) != true)
2527 WDP_LOGE( "__wfd_ws_reinvoke_persistent_group FAILED!!\n");
2528 __WDP_LOG_FUNC_EXIT__;
2533 int persistent_group_count = 0;
2534 wfd_persistent_group_info_s* plist;
2537 result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
2540 /* checking already created persistent group list */
2541 for(i=0; i<persistent_group_count; i++)
2543 WDP_LOGD( "plist[%d].go_mac_address=[%s]\n", i,plist[i].go_mac_address);
2544 if (strcmp(plist[i].go_mac_address, mac_str) == 0)
2546 WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
2547 snprintf(cmd, sizeof(cmd), "%s persistent=%d", CMD_CREATE_GROUP, plist[i].network_id);
2548 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2549 WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD persistent=%d) result=[%d]\n", plist[i].network_id, result);
2554 if (i == persistent_group_count) /* Can't find peer in persistent group list. Creation of new persistent group */
2556 /* Persistent group mode */
2557 snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CREATE_GROUP, "persistent", FREQUENCY_2G);
2558 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2559 WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD) result=[%d]\n", result);
2563 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2564 __WDP_LOG_FUNC_EXIT__;
2568 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2570 __WDP_LOG_FUNC_EXIT__;
2574 wfd_ws_send_invite_request(mac_addr);
2580 WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
2581 __WDP_LOG_FUNC_EXIT__;
2588 WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
2590 __WDP_LOG_FUNC_EXIT__;
2594 int wfd_ws_disconnect()
2596 __WDP_LOG_FUNC_ENTER__;
2598 char cmd[32] = {0, };
2599 char res_buffer[1024]={0,};
2600 int res_buffer_len = sizeof(res_buffer);
2603 g_wps_event_block = 0;
2605 snprintf(cmd, sizeof(cmd), "%s %s", CMD_GROUP_REMOVE, DEFAULT_IF_NAME);
2606 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2607 WDP_LOGD( "__send_wpa_request(P2P_GROUP_REMOVE) result=[%d]\n", result);
2611 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2612 __WDP_LOG_FUNC_EXIT__;
2616 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2618 __WDP_LOG_FUNC_EXIT__;
2622 WDP_LOGD( "disconnect... remove group [%s]\n", DEFAULT_IF_NAME);
2624 __WDP_LOG_FUNC_EXIT__;
2629 // TODO: should find how to disconnect with peer by peer_mac
2630 int wfd_ws_disconnect_sta(unsigned char mac_addr[6])
2632 __WDP_LOG_FUNC_ENTER__;
2636 result = wfd_ws_disconnect();
2638 __WDP_LOG_FUNC_EXIT__;
2642 bool wfd_ws_is_discovery_enabled()
2644 __WDP_LOG_FUNC_ENTER__;
2646 __WDP_LOG_FUNC_EXIT__;
2652 __WDP_LOG_FUNC_ENTER__;
2654 char cmd[16] = {0, };
2655 char res_buffer[1024]={0,};
2656 int res_buffer_len=sizeof(res_buffer);
2659 g_wps_event_block = 0;
2661 // Skip checking result..
2662 strncpy(cmd, CMD_FLUSH, sizeof(cmd));
2663 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2664 WDP_LOGD( "__send_wpa_request(P2P_FLUSH) result=[%d]\n", result);
2668 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2669 __WDP_LOG_FUNC_EXIT__;
2673 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2675 __WDP_LOG_FUNC_EXIT__;
2679 __WDP_LOG_FUNC_EXIT__;
2685 int wfd_ws_start_discovery(bool listen_only, int timeout)
2687 __WDP_LOG_FUNC_ENTER__;
2689 char cmd[16] = {0, };
2690 char res_buffer[1024]={0,};
2691 int res_buffer_len=sizeof(res_buffer);
2695 if (wfd_ws_is_groupowner()==false && wfd_ws_is_groupclient()==false)
2699 if (listen_only == true)
2702 snprintf(cmd, sizeof(cmd), "%s %d", CMD_START_LISTEN, timeout);
2704 strncpy(cmd, CMD_START_LISTEN, sizeof(cmd));
2706 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2707 WDP_LOGD( "__send_wpa_request(P2P_LISTEN) result=[%d]\n", result);
2711 strncpy(cmd, CMD_START_DISCOVER, sizeof(cmd));
2712 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2713 WDP_LOGD( "__send_wpa_request(P2P_FIND) result=[%d]\n", result);
2718 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2719 __WDP_LOG_FUNC_EXIT__;
2723 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2725 __WDP_LOG_FUNC_EXIT__;
2729 // to notify to the application.
2730 if (listen_only == true)
2731 g_noti_cb(WFD_EVENT_DISCOVER_START_LISTEN_ONLY);
2733 g_noti_cb(WFD_EVENT_DISCOVER_START_80211_SCAN);
2735 __WDP_LOG_FUNC_EXIT__;
2739 int wfd_ws_cancel_discovery()
2741 __WDP_LOG_FUNC_ENTER__;
2743 char cmd[16] = {0, };
2744 char res_buffer[1024]={0,};
2745 int res_buffer_len=sizeof(res_buffer);
2748 strncpy(cmd, CMD_CANCEL_DISCOVER, sizeof(cmd));
2749 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2750 WDP_LOGD( "__send_wpa_request(P2P_STOP_FIND) result=[%d]\n", result);
2754 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2755 __WDP_LOG_FUNC_EXIT__;
2759 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
2761 __WDP_LOG_FUNC_EXIT__;
2765 // to notify to the application.
2766 g_noti_cb(WFD_EVENT_DISCOVER_CANCEL);
2768 __WDP_LOG_FUNC_EXIT__;
2772 int wfd_ws_get_discovery_result(wfd_discovery_entry_s ** peer_list, int* peer_num)
2774 __WDP_LOG_FUNC_ENTER__;
2776 char cmd[40] = {0, };
2777 char mac_str[18] = {0, };
2778 char res_buffer[1024] = {0,};
2779 int res_buffer_len = sizeof(res_buffer);
2783 ws_discovered_peer_info_s ws_peer_list[MAX_PEER_NUM];
2784 static wfd_discovery_entry_s wfd_peer_list[16];
2786 memset(&ws_peer_list, 0, (sizeof(ws_discovered_peer_info_s)*MAX_PEER_NUM));
2787 memset(&wfd_peer_list, 0, (sizeof(wfd_discovery_entry_s)*16));
2789 /* Reading first discovered peer */
2790 strncpy(cmd, CMD_GET_FIRST_DISCOVERED_PEER, sizeof(cmd));
2791 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2792 WDP_LOGD( "__send_wpa_request(P2P_PEER FIRST) result=[%d]\n", result);
2795 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2798 __WDP_LOG_FUNC_EXIT__;
2802 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
2806 __WDP_LOG_FUNC_EXIT__;
2810 __parsing_peer(res_buffer, &ws_peer_list[peer_count]);
2813 /* Reading Next discovered peers */
2816 memset(cmd, 0x0, 40);
2817 memset(mac_str, 0x0, 18);
2818 memset(res_buffer, 0, sizeof(res_buffer));
2820 strncpy(mac_str, ws_peer_list[peer_count-1].mac, sizeof(mac_str));
2821 snprintf(cmd, sizeof(cmd), "%s%s", CMD_GET_NEXT_DISCOVERED_PEER, mac_str);
2822 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2823 WDP_LOGD( "__send_wpa_request(P2P_PEER NEXT-) result=[%d]\n", result);
2825 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
2828 __parsing_peer(res_buffer, &ws_peer_list[peer_count]);
2833 WDP_LOGD( "number of discovered peers: %d\n", peer_count);
2835 for(i=0; i<peer_count; i++)
2837 memset(&wfd_peer_list[i], 0, sizeof(wfd_discovery_entry_s));
2838 WDP_LOGD( "index [%d] MAC [%s] GOstate=[%s] groupCapab=[%x] devCapab=[%x] is_wfd_device[%d] Name[%s] type=[%s] ssid[%s]\n",
2840 ws_peer_list[i].mac,
2841 ws_peer_list[i].go_state,
2842 ws_peer_list[i].group_capab,
2843 ws_peer_list[i].dev_capab,
2844 ws_peer_list[i].is_wfd_device,
2845 ws_peer_list[i].device_name,
2846 ws_peer_list[i].pri_dev_type,
2847 ws_peer_list[i].oper_ssid);
2851 bool is_group_owner;
2852 char ssid[WIFI_DIRECT_MAX_SSID_LEN + 1];
2853 unsigned char mac_address[6];
2856 unsigned int services;
2857 bool is_persistent_go;
2858 unsigned char intf_mac_address[6];
2859 unsigned int wps_device_pwd_id;
2860 unsigned int wps_cfg_methods;
2861 unsigned int category;
2862 unsigned int subcategory;
2863 } wfd_discovery_entry_s;
2865 // Device MAC address
2866 unsigned char la_mac_addr1[6];
2868 wfd_macaddr_atoe(ws_peer_list[i].mac, la_mac_addr1);
2869 memcpy(wfd_peer_list[i].mac_address, (char*)(la_mac_addr1), sizeof(la_mac_addr1));
2871 // Interface MAC address
2872 unsigned char la_mac_addr2[6];
2874 wfd_macaddr_atoe(ws_peer_list[i].interface_addr, la_mac_addr2);
2875 memcpy(wfd_peer_list[i].intf_mac_address, (char*)(la_mac_addr2), sizeof(la_mac_addr2));
2877 // WPS Config method
2878 wfd_peer_list[i].wps_cfg_methods = 0;
2879 if ((ws_peer_list[i].config_methods & WPS_CONFIG_DISPLAY) > 0)
2880 wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
2881 if ((ws_peer_list[i].config_methods & WPS_CONFIG_PUSHBUTTON) > 0)
2882 wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PBC;
2883 if ((ws_peer_list[i].config_methods & WPS_CONFIG_KEYPAD) > 0)
2884 wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
2886 // Device name --> SSID
2887 strncpy(wfd_peer_list[i].device_name, ws_peer_list[i].device_name, DEVICE_NAME_LEN);
2888 wfd_peer_list[i].device_name[DEVICE_NAME_LEN-1] = '\0';
2891 if ((ws_peer_list[i].group_capab & GROUP_CAPAB_GROUP_OWNER) > 0) /* checking GO state */
2892 wfd_peer_list[i].is_group_owner = true;
2894 wfd_peer_list[i].is_group_owner = false;
2896 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));
2899 if ((ws_peer_list[i].group_capab & GROUP_CAPAB_PERSISTENT_GROUP) > 0) /* checking persistent GO state */
2900 wfd_peer_list[i].is_persistent_go = true;
2902 wfd_peer_list[i].is_persistent_go = false;
2905 if (strncmp(ws_peer_list[i].member_in_go_dev, "00:00:00:00:00:00", strlen("00:00:00:00:00:00"))!=0)
2906 wfd_peer_list[i].is_connected = true;
2908 wfd_peer_list[i].is_connected = false;
2911 // ToDo: convert freq to channel...
2912 wfd_peer_list[i].channel = ws_peer_list[i].listen_freq;
2914 // wps_device_pwd_id
2915 // ToDo: where to get it?
2916 wfd_peer_list[i].wps_device_pwd_id = 0;
2918 wfd_peer_list[i].category = __convert_device_type(ws_peer_list[i].pri_dev_type);
2919 wfd_peer_list[i].subcategory = __convert_secondary_device_type(ws_peer_list[i].pri_dev_type);
2922 *peer_num = peer_count;
2923 *peer_list = &wfd_peer_list[0];
2925 WDP_LOGE( "Getting discovery result is Completed.\n");
2927 __WDP_LOG_FUNC_EXIT__;
2932 int wfd_ws_get_peer_info(unsigned char *mac_addr, wfd_discovery_entry_s **peer)
2934 __WDP_LOG_FUNC_ENTER__;
2936 char cmd[32] = {0, };
2937 char mac_str[18] = {0, };
2938 char res_buffer[1024] = {0,};
2939 int res_buffer_len = sizeof(res_buffer);
2941 ws_discovered_peer_info_s ws_peer_info;
2942 wfd_discovery_entry_s* wfd_peer_info;
2944 memset(&ws_peer_info, 0x0, sizeof(ws_discovered_peer_info_s));
2945 wfd_peer_info = (wfd_discovery_entry_s *) calloc(1, sizeof(wfd_discovery_entry_s));
2947 /* Reading first discovered peer */
2948 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
2949 snprintf(cmd, sizeof(cmd),"%s %s", CMD_GET_PEER_INFO, mac_str);
2950 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
2951 WDP_LOGD( "__send_wpa_request(P2P_PEER) result=[%d]\n", result);
2954 WDP_LOGE( "__send_wpa_request FAILED!!\n");
2956 __WDP_LOG_FUNC_EXIT__;
2960 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
2963 __WDP_LOG_FUNC_EXIT__;
2967 // TODO: parsing peer info
2968 __parsing_peer(res_buffer, &ws_peer_info);
2970 WDP_LOGD( "MAC [%s] GOstate=[%s] groupCapab=[%x] devCapab=[%x] Name[%s] type=[%s] ssid[%s]\n",
2972 ws_peer_info.go_state,
2973 ws_peer_info.group_capab,
2974 ws_peer_info.dev_capab,
2975 ws_peer_info.device_name,
2976 ws_peer_info.pri_dev_type,
2977 ws_peer_info.oper_ssid);
2979 // Device MAC address
2980 unsigned char la_mac_addr1[6];
2982 wfd_macaddr_atoe(ws_peer_info.mac, la_mac_addr1);
2983 memcpy(wfd_peer_info->mac_address, (char*)(la_mac_addr1), sizeof(la_mac_addr1));
2985 // Interface MAC address
2986 unsigned char la_mac_addr2[6];
2988 wfd_macaddr_atoe(ws_peer_info.interface_addr, la_mac_addr2);
2989 memcpy(wfd_peer_info->intf_mac_address, (char*)(la_mac_addr2), sizeof(la_mac_addr2));
2991 // WPS Config method
2992 wfd_peer_info->wps_cfg_methods = 0;
2993 if ((ws_peer_info.config_methods & WPS_CONFIG_DISPLAY) > 0)
2994 wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
2995 if ((ws_peer_info.config_methods & WPS_CONFIG_PUSHBUTTON) > 0)
2996 wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PBC;
2997 if ((ws_peer_info.config_methods & WPS_CONFIG_KEYPAD) > 0)
2998 wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
3000 // Device name --> SSID
3001 strncpy(wfd_peer_info->device_name, ws_peer_info.device_name, DEVICE_NAME_LEN);
3002 wfd_peer_info->device_name[DEVICE_NAME_LEN-1] = '\0';
3005 if ((ws_peer_info.group_capab & GROUP_CAPAB_GROUP_OWNER) > 0) /* checking GO state */
3006 wfd_peer_info->is_group_owner = true;
3008 wfd_peer_info->is_group_owner = false;
3010 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));
3013 if ((ws_peer_info.group_capab & GROUP_CAPAB_PERSISTENT_GROUP) > 0) /* checking persistent GO state */
3014 wfd_peer_info->is_persistent_go = true;
3016 wfd_peer_info->is_persistent_go = false;
3019 if (strncmp(ws_peer_info.member_in_go_dev, "00:00:00:00:00:00", strlen("00:00:00:00:00:00"))!=0)
3020 wfd_peer_info->is_connected = true;
3022 wfd_peer_info->is_connected = false;
3025 // ToDo: convert freq to channel...
3026 wfd_peer_info->channel = ws_peer_info.listen_freq;
3028 // wps_device_pwd_id
3029 // ToDo: where to get it?
3030 wfd_peer_info->wps_device_pwd_id = 0;
3032 wfd_peer_info->category = __convert_device_type(ws_peer_info.pri_dev_type);
3033 wfd_peer_info->subcategory = __convert_secondary_device_type(ws_peer_info.pri_dev_type);
3035 *peer = wfd_peer_info;
3037 __WDP_LOG_FUNC_EXIT__;
3041 int wfd_ws_send_provision_discovery_request(unsigned char mac_addr[6], wifi_direct_wps_type_e config_method, int is_peer_go)
3043 __WDP_LOG_FUNC_ENTER__;
3045 char cmd[64] = {0, };
3046 char mac_str[18] = {0, };
3047 char res_buffer[1024]={0,};
3048 int res_buffer_len = sizeof(res_buffer);
3051 WDP_LOGD("Outgoing PROV_DISC");
3053 if (is_peer_go && config_method == WIFI_DIRECT_WPS_TYPE_PBC)
3055 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
3056 snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, __convert_wps_config_methods_value(config_method));
3057 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3058 WDP_LOGD("Join command: [%s]", cmd);
3059 WDP_LOGD( "__send_wpa_request(P2P_PROV_DISC) result=[%d]\n", result);
3063 snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
3064 snprintf(cmd, sizeof(cmd),"%s %s %s", CMD_SEND_PROVISION_DISCOVERY_REQ, mac_str, __convert_wps_config_methods_value(config_method));
3065 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3066 WDP_LOGD( "__send_wpa_request(P2P_PROV_DISC) result=[%d]\n", result);
3071 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3072 __WDP_LOG_FUNC_EXIT__;
3076 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3078 __WDP_LOG_FUNC_EXIT__;
3082 WDP_LOGD( "Provisioning... peer-MAC [%s]\n", mac_str);
3084 __WDP_LOG_FUNC_EXIT__;
3089 bool wfd_ws_get_go_dev_addr(char* p2p_device_address)
3091 __WDP_LOG_FUNC_ENTER__;
3093 char cmd[16] = {0, };
3094 char res_buffer[1024]={0,};
3095 int res_buffer_len = sizeof(res_buffer);
3098 if (p2p_device_address == NULL)
3100 WDP_LOGE( "Wrong param\n");
3101 __WDP_LOG_FUNC_EXIT__;
3105 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3106 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3107 WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
3111 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3112 __WDP_LOG_FUNC_EXIT__;
3116 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3118 __WDP_LOG_FUNC_EXIT__;
3122 char* ptr = strstr(res_buffer, "p2p_device_address=");
3125 WDP_LOGD( "Can't find p2p_device_address...\n");
3126 __WDP_LOG_FUNC_EXIT__;
3133 if (__get_item_value(ptr, item, value) == NULL)
3135 WDP_LOGD( "Can't wrong format to get p2p_device_address...\n");
3136 __WDP_LOG_FUNC_EXIT__;
3140 if (strcmp(item, "p2p_device_address")!=0)
3142 WDP_LOGD( "Can't get p2p_device_address.... item=[%s]\n", item);
3143 __WDP_LOG_FUNC_EXIT__;
3147 strncpy(p2p_device_address, value, sizeof(value));
3149 __WDP_LOG_FUNC_EXIT__;
3153 int wfd_ws_send_invite_request(unsigned char dev_mac_addr[6])
3155 __WDP_LOG_FUNC_ENTER__;
3157 char cmd[128] = {0, };
3158 char mac_str[18] = {0, };
3159 char res_buffer[1024]={0,};
3160 char p2p_device_address[32];
3161 int res_buffer_len = sizeof(res_buffer);
3164 /* invite request sometimes failed in listen only mode */
3165 wfd_server_control_t * wfd_server = wfd_server_get_control();
3166 if (wfd_server->config_data.listen_only)
3167 wfd_ws_start_discovery(false, 0);
3169 if(wfd_ws_get_go_dev_addr(p2p_device_address) == false)
3171 __WDP_LOG_FUNC_EXIT__;
3175 snprintf(mac_str, 18, MACSTR, MAC2STR(dev_mac_addr));
3176 snprintf(cmd, sizeof(cmd), "%s group=p2p-wlan0-0 peer=%s go_dev_addr=%s", CMD_SEND_INVITE_REQ, mac_str, p2p_device_address);
3178 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3179 WDP_LOGI( "__send_wpa_request(CMD_SEND_INVITE_REQ) result=[%d]\n", result);
3183 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3184 __WDP_LOG_FUNC_EXIT__;
3188 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3190 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3191 __WDP_LOG_FUNC_EXIT__;
3195 WDP_LOGD( "Invite... peer-MAC [%s]\n", mac_str);
3197 __WDP_LOG_FUNC_EXIT__;
3202 int wfd_ws_create_group(char* ssid)
3204 __WDP_LOG_FUNC_ENTER__;
3206 char cmd[64] = {0, };
3207 char res_buffer[1024]={0,};
3208 int res_buffer_len = sizeof(res_buffer);
3210 wfd_server_control_t * wfd_server = wfd_server_get_control();
3212 if (wfd_server->config_data.want_persistent_group)
3214 /* Persistent group mode */
3215 snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CREATE_GROUP, "persistent", FREQUENCY_2G);
3219 snprintf(cmd, sizeof(cmd), "%s %s", CMD_CREATE_GROUP, FREQUENCY_2G);
3222 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3223 WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD) result=[%d]\n", result);
3227 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3228 __WDP_LOG_FUNC_EXIT__;
3232 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3234 __WDP_LOG_FUNC_EXIT__;
3238 WDP_LOGD( "Create p2p group... \n");
3240 __WDP_LOG_FUNC_EXIT__;
3244 int wfd_ws_cancel_group()
3246 __WDP_LOG_FUNC_ENTER__;
3248 char cmd[30] = {0, };
3249 char res_buffer[1024]={0,};
3250 int res_buffer_len = sizeof(res_buffer);
3253 snprintf(cmd, sizeof(cmd), "%s %s", CMD_GROUP_REMOVE, DEFAULT_IF_NAME);
3255 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3256 WDP_LOGD( "__send_wpa_request(P2P_GROUP_REMOVE) result=[%d]\n", result);
3260 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3261 __WDP_LOG_FUNC_EXIT__;
3265 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3267 __WDP_LOG_FUNC_EXIT__;
3271 WDP_LOGD( "Remove p2p group... \n");
3273 __WDP_LOG_FUNC_EXIT__;
3277 int wfd_ws_activate_pushbutton()
3279 __WDP_LOG_FUNC_ENTER__;
3281 char cmd[8] = {0, };
3282 char res_buffer[1024]={0,};
3283 int res_buffer_len = sizeof(res_buffer);
3286 strncpy(cmd, CMD_WPS_PUSHBUTTON_START, sizeof(cmd));
3287 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3288 WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
3291 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3292 __WDP_LOG_FUNC_EXIT__;
3296 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3298 __WDP_LOG_FUNC_EXIT__;
3302 WDP_LOGD( "start WPS PBC...\n");
3304 __WDP_LOG_FUNC_EXIT__;
3308 bool wfd_ws_is_groupowner()
3310 __WDP_LOG_FUNC_ENTER__;
3312 char cmd[16] = {0, };
3313 char res_buffer[1024]={0,};
3314 int res_buffer_len = sizeof(res_buffer);
3317 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3318 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3319 WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
3323 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3324 __WDP_LOG_FUNC_EXIT__;
3328 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3330 __WDP_LOG_FUNC_EXIT__;
3334 if(strstr(res_buffer, "mode=P2P GO") == NULL)
3336 WDP_LOGD( "This device is not Groupowner\n");
3337 __WDP_LOG_FUNC_EXIT__;
3341 __WDP_LOG_FUNC_EXIT__;
3345 bool wfd_ws_is_groupclient()
3347 __WDP_LOG_FUNC_ENTER__;
3348 char cmd[16] = {0, };
3349 char res_buffer[1024]={0,};
3350 int res_buffer_len = sizeof(res_buffer);
3353 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3354 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3355 WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
3359 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3360 __WDP_LOG_FUNC_EXIT__;
3364 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3366 __WDP_LOG_FUNC_EXIT__;
3370 if(strstr(res_buffer, "mode=station") == NULL)
3372 WDP_LOGD( "This device is not client\n");
3373 __WDP_LOG_FUNC_EXIT__;
3377 __WDP_LOG_FUNC_EXIT__;
3381 int wfd_ws_get_ssid(char* ssid, int len)
3383 __WDP_LOG_FUNC_ENTER__;
3385 char cmd[12] = {0, };
3386 char tmp_ssid[64] = {0, };
3387 char res_buffer[1024]={0,};
3388 int res_buffer_len = sizeof(res_buffer);
3393 WDP_LOGE( "Incorrect parameter");
3397 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
3398 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3399 WDP_LOGD( "__send_wpa_request(STATUS) result=[%d]\n", result);
3403 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3404 __WDP_LOG_FUNC_EXIT__;
3408 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3410 __WDP_LOG_FUNC_EXIT__;
3414 result = __extract_value_str(res_buffer, "\nssid", (char*) tmp_ssid);
3417 WDP_LOGE( "Extracting value failed\n");
3420 WDP_LOGD( "###### ssid [%s] ###########\n", tmp_ssid);
3421 memcpy(ssid, tmp_ssid, len);
3424 __WDP_LOG_FUNC_EXIT__;
3428 char* wfd_ws_get_default_interface_name()
3430 __WDP_LOG_FUNC_ENTER__;
3432 __WDP_LOG_FUNC_EXIT__;
3434 return DEFAULT_IF_NAME;
3437 bool wfd_ws_dhcpc_get_ip_address(char *ipaddr_buf, int len, int is_IPv6)
3439 __WDP_LOG_FUNC_ENTER__;
3441 struct ifreq IfRequest;
3442 struct sockaddr_in* sin = NULL;
3445 if (ipaddr_buf == NULL)
3448 if((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0) {
3449 WDP_LOGE( "Failed to open socket\n");
3453 memset(IfRequest.ifr_name, 0x00, DEFAULT_IF_NAME_LEN);
3454 strncpy(IfRequest.ifr_name, DEFAULT_IF_NAME, DEFAULT_IF_NAME_LEN - 1);
3456 if(ioctl(fd, SIOCGIFADDR, &IfRequest) < 0) {
3457 WDP_LOGE( "Failed to get IP\n");
3462 sin = (struct sockaddr_in*)&IfRequest.ifr_broadaddr;
3463 if (ipaddr_buf != NULL)
3464 strncpy(ipaddr_buf, (char*)inet_ntoa(sin->sin_addr), len);
3466 __WDP_LOG_FUNC_EXIT__;
3471 char* wfd_ws_get_ip()
3473 __WDP_LOG_FUNC_ENTER__;
3475 char ip_string[20] = {0,};
3477 snprintf(ip_string, 20, "%s", g_local_interface_ip_address);
3478 WDP_LOGD( "################################################\n");
3479 WDP_LOGD( "###### IP = %s ###########\n", ip_string);
3480 WDP_LOGD( "################################################\n");
3482 __WDP_LOG_FUNC_EXIT__;
3486 int wfd_ws_set_wps_pin(char* pin)
3488 __WDP_LOG_FUNC_ENTER__;
3490 strncpy(g_wps_pin, pin, WPS_PIN_LEN);
3491 g_wps_pin[WPS_PIN_LEN-1] = '\0';
3492 WDP_LOGD( "SETTING WPS PIN = %s\n", \
3497 __WDP_LOG_FUNC_EXIT__;
3501 int wfd_ws_get_wps_pin(char* wps_pin, int len)
3503 __WDP_LOG_FUNC_ENTER__;
3505 if (wps_pin == NULL) {
3508 strncpy(wps_pin, g_wps_pin, WPS_PIN_LEN);
3509 wps_pin[WPS_PIN_LEN-1] = '\0';
3510 WDP_LOGD( "FILLED WPS PIN = %s\n", wps_pin);
3511 __WDP_LOG_FUNC_EXIT__;
3515 int wfd_ws_generate_wps_pin()
3517 __WDP_LOG_FUNC_ENTER__;
3519 __WDP_LOG_FUNC_EXIT__;
3525 int wfd_ws_set_ssid(char* ssid)
3527 __WDP_LOG_FUNC_ENTER__;
3529 char cmd[128] = {0, };
3530 char res_buffer[1024]={0,};
3531 int res_buffer_len = sizeof(res_buffer);
3534 if (ssid == NULL || strlen(ssid) == 0)
3536 WDP_LOGE( "Wrong SSID\n");
3537 __WDP_LOG_FUNC_EXIT__;
3541 snprintf(cmd, sizeof(cmd), "%s device_name %s", CMD_SET_PARAM, ssid);
3542 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3543 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3547 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3548 __WDP_LOG_FUNC_EXIT__;
3551 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3553 __WDP_LOG_FUNC_EXIT__;
3556 memset(cmd, 0x0, 128);
3557 memset(res_buffer, 0x0, 1024);
3559 snprintf(cmd, sizeof(cmd), "%s p2p_ssid_postfix %s", CMD_SET_PARAM, ssid);
3560 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3561 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3565 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3566 __WDP_LOG_FUNC_EXIT__;
3569 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3571 __WDP_LOG_FUNC_EXIT__;
3575 __WDP_LOG_FUNC_EXIT__;
3579 int wfd_ws_set_wpa_passphrase(char* wpa_key)
3581 __WDP_LOG_FUNC_ENTER__;
3583 __WDP_LOG_FUNC_EXIT__;
3587 int wfd_ws_get_supported_wps_mode()
3589 __WDP_LOG_FUNC_ENTER__;
3593 //TO-DO : supplicant CLI command should be supported.
3595 wps_config = WIFI_DIRECT_WPS_TYPE_PBC |WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY |WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
3599 __WDP_LOG_FUNC_EXIT__;
3603 int wfd_ws_get_connected_peers_count(int* peer_num)
3605 __WDP_LOG_FUNC_ENTER__;
3606 GList *element = NULL;
3609 element = g_list_first(g_conn_peer_addr);
3613 element = g_list_next(element);
3615 WDP_LOGD( "Connected peer number [%d]\n", *peer_num);
3616 __WDP_LOG_FUNC_EXIT__;
3621 int wfd_ws_get_connected_peers_info(wfd_connected_peer_info_s ** peer_list, int* peer_num)
3623 __WDP_LOG_FUNC_ENTER__;
3625 char cmd[32] = {0, };
3626 char res_buffer[1024]={0,};
3627 int res_buffer_len = sizeof(res_buffer);
3628 char pri_dev_type[16] ={0, };
3629 GList *element = NULL;
3632 if(peer_list == NULL || peer_num == NULL)
3634 WDP_LOGD( "Incorrect parameter\n");
3638 wfd_ws_get_connected_peers_count(peer_num);
3640 wfd_connected_peer_info_s *tmp_peer_list = NULL;
3642 tmp_peer_list = (wfd_connected_peer_info_s*) calloc(*peer_num, sizeof(wfd_connected_peer_info_s));
3643 if(tmp_peer_list == NULL)
3645 WDP_LOGD( "Memory allocatin failed\n");
3652 element = g_list_first(g_conn_peer_addr);
3655 WDP_LOGD( "element data is [%s]\n", (char*) element->data);
3656 memset(cmd, 0x0, 32);
3657 memset(res_buffer, 0x0, 1024);
3659 snprintf(cmd, sizeof(cmd), "%s %s", CMD_GET_PEER_INFO, (char*) element->data);
3660 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3661 WDP_LOGD( "__send_wpa_request(%s) result=[%d]\n", cmd, result);
3665 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3668 if (tmp_peer_list != NULL)
3669 free(tmp_peer_list);
3671 __WDP_LOG_FUNC_EXIT__;
3675 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3679 if (tmp_peer_list != NULL)
3680 free(tmp_peer_list);
3682 __WDP_LOG_FUNC_EXIT__;
3689 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN + 1];
3690 unsigned char ip_address[4];
3691 unsigned char mac_address[6];
3692 unsigned char intf_mac_address[6];
3693 unsigned int services;
3695 unsigned short category;
3697 } wfd_connected_peer_info_s;
3700 result = __extract_value_str(res_buffer, "device_name", (char*) tmp_peer_list[i].device_name);
3702 WDP_LOGE( "Extracting value failed\n");
3705 if (tmp_peer_list != NULL)
3706 free(tmp_peer_list);
3711 wfd_macaddr_atoe((char*) element->data, tmp_peer_list[i].mac_address);
3713 char intf_mac_address[18] = {0, };
3714 result = __extract_value_str(res_buffer, "interface_addr", (char*) intf_mac_address);
3717 WDP_LOGE( "Extracting value failed\n");
3720 if (tmp_peer_list != NULL)
3721 free(tmp_peer_list);
3725 wfd_macaddr_atoe((char*) intf_mac_address, tmp_peer_list[i].intf_mac_address);
3727 tmp_peer_list[i].services = 0;
3728 tmp_peer_list[i].is_p2p = true;
3730 result = __extract_value_str(res_buffer, "pri_dev_type", (char*) pri_dev_type);
3733 WDP_LOGE( "Extracting value failed\n");
3736 if (tmp_peer_list != NULL)
3737 free(tmp_peer_list);
3742 tmp_peer_list[i].category = __convert_category_from_type(pri_dev_type);
3743 if(tmp_peer_list[i].category < 0)
3745 WDP_LOGE( "Category converting error\n");
3748 if (tmp_peer_list != NULL)
3749 free(tmp_peer_list);
3754 element = g_list_next(element);
3758 *peer_list = tmp_peer_list;
3759 __WDP_LOG_FUNC_EXIT__;
3764 int wfd_ws_get_go_intent(int *p2p_go_intent)
3766 __WDP_LOG_FUNC_ENTER__;
3768 char cmd[32] = {0, };
3769 char res_buffer[1024]={0,};
3770 int res_buffer_len = sizeof(res_buffer);
3773 if (p2p_go_intent == NULL)
3775 WDP_LOGE( "p2p_go_intent is NULL\n", p2p_go_intent);
3776 __WDP_LOG_FUNC_EXIT__;
3780 snprintf(cmd, sizeof(cmd), "%s p2p_go_intent", CMD_GET_PARAM);
3781 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3782 WDP_LOGD( "__send_wpa_request(GET P2P_GO_INTENT) result=[%d]\n", result);
3786 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3787 __WDP_LOG_FUNC_EXIT__;
3791 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3793 __WDP_LOG_FUNC_EXIT__;
3797 *p2p_go_intent = atoi(res_buffer);
3799 __WDP_LOG_FUNC_EXIT__;
3803 int wfd_ws_set_go_intent(int go_intent)
3805 __WDP_LOG_FUNC_ENTER__;
3807 char cmd[32] = {0, };
3808 char res_buffer[1024]={0,};
3809 int res_buffer_len = sizeof(res_buffer);
3812 if (go_intent < 0 || go_intent > 15)
3814 WDP_LOGE( "Wrong p2p_go_intent [%d]\n", go_intent);
3815 __WDP_LOG_FUNC_EXIT__;
3819 snprintf(cmd, sizeof(cmd), "%s p2p_go_intent %d", CMD_SET_PARAM, go_intent);
3820 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3821 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3825 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3826 __WDP_LOG_FUNC_EXIT__;
3830 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3832 __WDP_LOG_FUNC_EXIT__;
3836 __WDP_LOG_FUNC_EXIT__;
3841 int wfd_ws_set_device_type(wifi_direct_primary_device_type_e primary_cat, wifi_direct_secondary_device_type_e sub_cat)
3843 __WDP_LOG_FUNC_ENTER__;
3845 char cmd[32] = {0, };
3846 char res_buffer[1024]={0,};
3847 int res_buffer_len = sizeof(res_buffer);
3850 snprintf(cmd, sizeof(cmd), "%s device_type %d", CMD_SET_PARAM, primary_cat);
3851 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3852 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3856 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3857 __WDP_LOG_FUNC_EXIT__;
3861 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3863 __WDP_LOG_FUNC_EXIT__;
3866 memset(cmd, 0x0, 32);
3867 memset(res_buffer, 0x0, 1024);
3869 snprintf(cmd, sizeof(cmd), "%s device_type %d", CMD_SET_PARAM, sub_cat);
3870 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3871 WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
3875 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3876 __WDP_LOG_FUNC_EXIT__;
3880 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3882 __WDP_LOG_FUNC_EXIT__;
3886 __WDP_LOG_FUNC_EXIT__;
3891 int wfd_ws_get_device_mac_address(unsigned char* device_mac)
3893 __WDP_LOG_FUNC_ENTER__;
3895 char cmd[8] = {0, };
3896 char device_address[18] = {0, };
3897 char res_buffer[1024]={0,};
3898 int res_buffer_len = sizeof(res_buffer);
3901 strncpy(cmd, CMD_STATUS, sizeof(cmd));
3902 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3903 WDP_LOGD( "__send_wpa_request(STATUS) result=[%d]\n", result);
3907 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3908 __WDP_LOG_FUNC_EXIT__;
3912 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3914 __WDP_LOG_FUNC_EXIT__;
3918 __extract_value_str(res_buffer, "p2p_device_address", (char*) device_address);
3919 if(strlen(device_address) ==18)
3921 wfd_macaddr_atoe((char*) device_address, device_mac);
3925 WDP_LOGE( "Extracting value failed\n");
3929 __WDP_LOG_FUNC_EXIT__;
3933 int wfd_ws_set_oem_loglevel(int is_increase)
3935 __WDP_LOG_FUNC_ENTER__;
3937 char cmd[16] = {0, };
3938 char res_buffer[1024]={0,};
3939 int res_buffer_len = sizeof(res_buffer);
3942 snprintf(cmd, sizeof(cmd), "%s %d", CMD_LOG_LEVEL, is_increase);
3943 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
3944 WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
3948 WDP_LOGE( "__send_wpa_request FAILED!!\n");
3949 __WDP_LOG_FUNC_EXIT__;
3953 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
3955 __WDP_LOG_FUNC_EXIT__;
3959 __WDP_LOG_FUNC_EXIT__;
3963 int wfd_ws_get_assoc_sta_mac(unsigned char *mac_addr)
3965 __WDP_LOG_FUNC_ENTER__;
3967 memcpy(mac_addr, g_assoc_sta_mac, 6);
3969 __WDP_LOG_FUNC_EXIT__;
3973 int wfd_ws_get_disassoc_sta_mac(unsigned char *mac_addr)
3975 __WDP_LOG_FUNC_ENTER__;
3976 memcpy(mac_addr, g_disassoc_sta_mac, 6);
3977 __WDP_LOG_FUNC_EXIT__;
3981 int wfd_ws_get_requestor_mac(unsigned char* mac_addr)
3983 __WDP_LOG_FUNC_ENTER__;
3985 memcpy(mac_addr, g_incomming_peer_mac_address, 6);
3987 __WDP_LOG_FUNC_EXIT__;
3991 int wfd_ws_get_operating_channel(void)
3993 __WDP_LOG_FUNC_ENTER__;
3995 char cmd[16] = {0, };
3996 char res_buffer[1024]={0,};
3997 int res_buffer_len = sizeof(res_buffer);
3999 char item[32] = {0, };
4000 char freq_value[32] = {0,};
4004 strncpy(cmd, CMD_STATUS_P2P, sizeof(cmd));
4005 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4006 WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
4010 WDP_LOGE( "__send_wpa_request FAILED!!\n");
4011 __WDP_LOG_FUNC_EXIT__;
4015 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4017 __WDP_LOG_FUNC_EXIT__;
4021 char* ptr = strstr(res_buffer, "frequency=");
4024 WDP_LOGD( "Can't find frequency field...\n");
4025 __WDP_LOG_FUNC_EXIT__;
4029 if (__get_item_value(ptr, item, freq_value) == NULL)
4031 WDP_LOGD( "Can't get value of frequency...\n");
4032 __WDP_LOG_FUNC_EXIT__;
4036 if (strcmp(item, "frequency")!=0)
4038 WDP_LOGD( "Can't get frequency.... item=[%s]\n", item);
4039 __WDP_LOG_FUNC_EXIT__;
4043 WDP_LOGD( "freq_value=[%s]\n", freq_value);
4045 channel = __convert_freq_to_channel(freq_value);
4047 WDP_LOGD( "channel=[%d]\n", channel);
4049 __WDP_LOG_FUNC_EXIT__;
4055 /* -------------------- Miracast ---------------------------*/
4058 int wfd_ws_dsp_init(void)
4060 __WDP_LOG_FUNC_ENTER__;
4062 char cmd[32] = {0, };
4063 char res_buffer[1024]={0,};
4064 int res_buffer_len = sizeof(res_buffer);
4068 char* dev_info = "0400";
4069 int ctrl_port = 2022;
4071 char* cpled_sink_status = "00";
4074 snprintf(cmd, sizeof(cmd), "%s enable %d", CMD_WFD_SET, enable);
4075 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4076 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4080 WDP_LOGE( "__send_wpa_request FAILED[param : enable]!!\n");
4081 __WDP_LOG_FUNC_EXIT__;
4084 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4086 __WDP_LOG_FUNC_EXIT__;
4090 /* param : dev_info */
4091 memset(cmd, 0x0, 32);
4092 memset(res_buffer, 0x0, 1024);
4094 snprintf(cmd, sizeof(cmd), "%s dev_info %s", CMD_WFD_SET, dev_info);
4095 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4096 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4100 WDP_LOGE( "__send_wpa_request FAILED[param : dev_info]!!\n");
4101 __WDP_LOG_FUNC_EXIT__;
4104 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4106 __WDP_LOG_FUNC_EXIT__;
4110 /* param : ctrl_port */
4111 memset(cmd, 0x0, 32);
4112 memset(res_buffer, 0x0, 1024);
4114 snprintf(cmd, sizeof(cmd), "%s ctrl_port %d", CMD_WFD_SET, ctrl_port);
4115 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4116 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4120 WDP_LOGE( "__send_wpa_request FAILED[param : ctrl_port]!!\n");
4121 __WDP_LOG_FUNC_EXIT__;
4124 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4126 __WDP_LOG_FUNC_EXIT__;
4130 /* param : max_tput */
4131 memset(cmd, 0x0, 32);
4132 memset(res_buffer, 0x0, 1024);
4134 snprintf(cmd, sizeof(cmd), "%s max_tput %d", CMD_WFD_SET, max_tput);
4135 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4136 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4140 WDP_LOGE( "__send_wpa_request FAILED[param : max_tput]!!\n");
4141 __WDP_LOG_FUNC_EXIT__;
4144 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4146 __WDP_LOG_FUNC_EXIT__;
4150 /* param : cpled_sink_status */
4151 memset(cmd, 0x0, 32);
4152 memset(res_buffer, 0x0, 1024);
4154 snprintf(cmd, sizeof(cmd), "%s cpled_sink_status %s", CMD_WFD_SET, cpled_sink_status);
4155 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4156 WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
4160 WDP_LOGE( "__send_wpa_request FAILED[param : cpled_sink_status]!!\n");
4161 __WDP_LOG_FUNC_EXIT__;
4164 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4166 __WDP_LOG_FUNC_EXIT__;
4170 __WDP_LOG_FUNC_EXIT__;
4175 int wfd_ws_get_persistent_group_info(wfd_persistent_group_info_s ** persistent_group_list, int* persistent_group_num)
4177 __WDP_LOG_FUNC_ENTER__;
4179 char cmd[16] = {0, };
4180 char res_buffer[1024] = {0,};
4181 int res_buffer_len = sizeof(res_buffer);
4184 ws_network_info_s ws_persistent_group_list[MAX_PERSISTENT_GROUP_NUM];
4185 wfd_persistent_group_info_s wfd_persistent_group_list[MAX_PERSISTENT_GROUP_NUM];
4187 memset(ws_persistent_group_list, 0, (sizeof(ws_network_info_s)*MAX_PERSISTENT_GROUP_NUM));
4188 memset(wfd_persistent_group_list, 0, (sizeof(wfd_persistent_group_info_s)*MAX_PERSISTENT_GROUP_NUM));
4190 /* Reading lists the configured networks, including stored information for persistent groups.
4191 The identifier in this is used with p2p_group_add and p2p_invite to indicate witch persistent
4192 group is to be reinvoked. */
4193 strncpy(cmd, CMD_GET_LIST_NETWORKS, sizeof(cmd));
4194 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4195 WDP_LOGD( "__send_wpa_request(LIST_NETWORKS) result=[%d]\n", result);
4198 WDP_LOGE( "__send_wpa_request FAILED!!\n");
4199 *persistent_group_num = 0;
4200 *persistent_group_list = NULL;
4201 __WDP_LOG_FUNC_EXIT__;
4205 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4207 *persistent_group_num = 0;
4208 *persistent_group_list = NULL;
4209 __WDP_LOG_FUNC_EXIT__;
4213 __parsing_persistent_group(res_buffer, ws_persistent_group_list, persistent_group_num);
4215 WDP_LOGD( "Persistent Group Count=%d\n", *persistent_group_num);
4216 for(i=0;i<(*persistent_group_num);i++)
4218 WDP_LOGD( "----persistent group [%d]----\n", i);
4219 WDP_LOGD( "network_id=%d\n", ws_persistent_group_list[i].network_id);
4220 WDP_LOGD( "ssid=%s\n", ws_persistent_group_list[i].ssid);
4221 WDP_LOGD( "bssid=%s\n", ws_persistent_group_list[i].bssid);
4222 WDP_LOGD( "flags=%s\n", ws_persistent_group_list[i].flags);
4225 // TODO: should filer by [PERSISTENT] value of flags.
4227 wfd_persistent_group_list[i].network_id = ws_persistent_group_list[i].network_id;
4228 strncpy(wfd_persistent_group_list[i].ssid, ws_persistent_group_list[i].ssid, NETWORK_SSID_LEN);
4229 wfd_persistent_group_list[i].ssid[NETWORK_SSID_LEN-1] = '\0';
4231 unsigned char la_mac_addr[6];
4232 wfd_macaddr_atoe(ws_persistent_group_list[i].bssid, la_mac_addr);
4233 memcpy(wfd_persistent_group_list[i].go_mac_address, la_mac_addr, 6);
4236 *persistent_group_list = &wfd_persistent_group_list[0];
4238 __WDP_LOG_FUNC_EXIT__;
4243 int wfd_ws_remove_persistent_group(wfd_persistent_group_info_s *persistent_group)
4245 __WDP_LOG_FUNC_ENTER__;
4246 char cmd[32] = {0, };
4247 char res_buffer[1024] = {0,};
4248 int res_buffer_len = sizeof(res_buffer);
4251 ws_network_info_s ws_persistent_group_list[MAX_PERSISTENT_GROUP_NUM];
4252 int persistent_group_num;
4253 char go_mac_str[18];
4255 memset(ws_persistent_group_list, 0, (sizeof(ws_network_info_s)*MAX_PERSISTENT_GROUP_NUM));
4256 memset(go_mac_str, 0, sizeof(go_mac_str));
4257 snprintf(go_mac_str, 18, MACSTR, MAC2STR(persistent_group->go_mac_address));
4259 strncpy(cmd, CMD_GET_LIST_NETWORKS, sizeof(cmd));
4260 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4261 WDP_LOGD( "__send_wpa_request(LIST_NETWORKS) result=[%d]\n", result);
4264 WDP_LOGE( "__send_wpa_request FAILED!!\n");
4265 __WDP_LOG_FUNC_EXIT__;
4269 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4271 __WDP_LOG_FUNC_EXIT__;
4275 __parsing_persistent_group(res_buffer, ws_persistent_group_list, &persistent_group_num);
4277 WDP_LOGD( "Persistent Group Count=%d\n", persistent_group_num);
4278 for(i=0;i<persistent_group_num;i++)
4280 WDP_LOGD( "----persistent group [%d]----\n", i);
4281 WDP_LOGD( "network_id=%d\n", ws_persistent_group_list[i].network_id);
4282 WDP_LOGD( "ssid=%s\n", ws_persistent_group_list[i].ssid);
4283 WDP_LOGD( "bssid=%s\n", ws_persistent_group_list[i].bssid);
4284 WDP_LOGD( "flags=%s\n", ws_persistent_group_list[i].flags);
4286 // TODO: should filer by [PERSISTENT] value of flags.
4289 WDP_LOGD( "persistent_group->ssid [%s]----\n", persistent_group->ssid);
4290 WDP_LOGD( "ws_persistent_group_list[i].ssid [%s]----\n", ws_persistent_group_list[i].ssid);
4291 WDP_LOGD( "go_mac_str [%s]----\n", go_mac_str);
4292 WDP_LOGD( "ws_persistent_group_list[i].bssid [%s]----\n", ws_persistent_group_list[i].bssid);
4294 if (strcmp(persistent_group->ssid, ws_persistent_group_list[i].ssid) == 0
4295 && strcmp(go_mac_str, ws_persistent_group_list[i].bssid) == 0)
4298 WDP_LOGD( "----Found persistent group [%d]----\n", i);
4300 memset(cmd, 0x0, sizeof(cmd));
4301 memset(res_buffer, 0x0, sizeof(res_buffer));
4303 snprintf(cmd, sizeof(cmd), "%s %d", CMD_REMOVE_NETWORK, ws_persistent_group_list[i].network_id);
4304 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4305 WDP_LOGD( "__send_wpa_request(CMD_REMOVE_NETWORK) result=[%d]\n", result);
4309 WDP_LOGE( "__send_wpa_request FAILED[CMD_REMOVE_NETWORK]!!\n");
4310 __WDP_LOG_FUNC_EXIT__;
4313 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4315 __WDP_LOG_FUNC_EXIT__;
4327 __WDP_LOG_FUNC_EXIT__;
4331 int wfd_ws_set_persistent_reconnect(bool enabled)
4333 __WDP_LOG_FUNC_ENTER__;
4335 char cmd[128] = {0, };
4336 char res_buffer[1024]={0,};
4337 int res_buffer_len = sizeof(res_buffer);
4340 snprintf(cmd, sizeof(cmd), "%s persistent_reconnect %d", CMD_SET_PARAM, enabled);
4341 result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
4342 WDP_LOGD( "__send_wpa_request(SET persistent_reconnect %d) result=[%d]\n", enabled, result);
4346 WDP_LOGE( "__send_wpa_request FAILED!!\n");
4347 __WDP_LOG_FUNC_EXIT__;
4350 if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
4352 __WDP_LOG_FUNC_EXIT__;
4356 __WDP_LOG_FUNC_EXIT__;