-/*\r
- * Network Configuration Module\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *\r
- */\r
-\r
-#include <errno.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <stdbool.h>\r
-#include <sys/types.h>\r
-#include <sys/socket.h>\r
-#include <unistd.h>\r
-\r
-#include <glib.h>\r
-\r
-#include "wifi-direct-service.h"\r
-#include "wifi-direct-event-handler.h"\r
-#include "wifi-direct-oem.h"\r
-#include "wifi-direct-internal.h"\r
-#include "wifi-direct-utils.h"\r
-\r
-char wfd_event_str[WFD_EVENT_MAX];\r
-\r
-char *__wfd_print_client_event(wfd_client_event_e event)\r
-{\r
- switch (event)\r
- {\r
- case WIFI_DIRECT_CLI_EVENT_ACTIVATION:\r
- return "ACTIVATION";\r
- case WIFI_DIRECT_CLI_EVENT_DEACTIVATION:\r
- return "DEACTIVATION";\r
- case WIFI_DIRECT_CLI_EVENT_DISCOVER_START:\r
- return "DISCOVER_START_80211_SCAN";\r
- case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY:\r
- return "DISCOVER_START_LISTEN_ONLY";\r
- case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN:\r
- return "DISCOVER_START_SEARCH_LISTEN";\r
- case WIFI_DIRECT_CLI_EVENT_DISCOVER_END:\r
- return "DISCOVER_END";\r
- case WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS:\r
- return "DISCOVER_FOUND_PEERS";\r
- case WIFI_DIRECT_CLI_EVENT_CONNECTION_START:\r
- return "CONNECTION_START";\r
- case WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ:\r
- return "CONNECTION_REQ";\r
- case WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP:\r
- return "CONNECTION_RSP";\r
- case WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ:\r
- return "CONNECTION_WPS_REQ";\r
- case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP:\r
- return "DISCONNECTION_RSP";\r
- case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND:\r
- return "DISCONNECTION_IND";\r
- case WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP:\r
- return "GROUP_CREATE_RSP";\r
- case WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP:\r
- return "GROUP_DESTROY_RSP";\r
- case WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND:\r
- return "IP_LEASED_IND";\r
- default:\r
- WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);\r
- return "INVALID EVENT";\r
- }\r
-}\r
-\r
-\r
-char *__wfd_server_print_event(wfd_event_t event)\r
-{\r
- switch (event)\r
- {\r
- case WFD_EVENT_DISCOVER_START_80211_SCAN:\r
- return "DISCOVER_START_80211_SCAN";\r
- case WFD_EVENT_DISCOVER_START_SEARCH_LISTEN:\r
- return "DISCOVER_START_SEARCH_LISTEN";\r
- case WFD_EVENT_DISCOVER_FOUND_PEERS:\r
- return "DISCOVER_FOUND_PEERS";\r
- case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:\r
- return "DISCOVER_FOUND_P2P_GROUPS";\r
- case WFD_EVENT_DISCOVER_CANCEL:\r
- return "DISCOVER_CANCEL";\r
- case WFD_EVENT_DISCOVER_COMPLETE:\r
- return "DISCOVER_COMPLETE";\r
- case WFD_EVENT_DISCOVER_FAIL:\r
- return "DISCOVER_FAIL";\r
- case WFD_EVENT_DISCOVER_RESUMED:\r
- return "DISCOVER_RESUMED";\r
- case WFD_EVENT_DISCOVER_SUSPENDED:\r
- return "DISCOVER_SUSPENDED";\r
- case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:\r
- return "DISCOVER_START_LISTEN_ONLY";\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST:\r
- return "PROV_DISCOVERY_REQUEST";\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:\r
- return "PROV_DISCOVERY_REQUEST_WPS_DISPLAY";\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:\r
- return "PROV_DISCOVERY_REQUEST_WPS_KEYPAD";\r
- case WFD_EVENT_PROV_DISCOVERY_RESPONSE:\r
- return "PROV_DISCOVERY_RESPONSE";\r
- case WFD_EVENT_PROV_DISCOVERY_TIMEOUT:\r
- return "PROV_DISCOVERY_TIMEOUT";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_START:\r
- return "GROUP_OWNER_NEGOTIATION_START";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_AP_ACK:\r
- return "GROUP_OWNER_NEGOTIATION_AP_ACK";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_STA_ACK:\r
- return "GROUP_OWNER_NEGOTIATION_STA_ACK";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED:\r
- return "GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_COMPLETE:\r
- return "GROUP_OWNER_NEGOTIATION_COMPLETE";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:\r
- return "GROUP_OWNER_NEGOTIATION_FAIL";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:\r
- return "GROUP_OWNER_NEGOTIATION_NO_PROV_INFO";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL:\r
- return "GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL";\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT:\r
- return "GROUP_OWNER_NEGOTIATION_FAIL_INTENT";\r
- case WFD_EVENT_CREATE_LINK_START:\r
- return "CREATE_LINK_START";\r
- case WFD_EVENT_CREATE_LINK_CANCEL:\r
- return "CREATE_LINK_CANCEL";\r
- case WFD_EVENT_CREATE_LINK_TIMEOUT:\r
- return "CREATE_LINK_TIMEOUT";\r
- case WFD_EVENT_CREATE_LINK_AUTH_FAIL:\r
- return "CREATE_LINK_AUTH_FAIL";\r
- case WFD_EVENT_CREATE_LINK_FAIL:\r
- return "CREATE_LINK_FAIL";\r
- case WFD_EVENT_CREATE_LINK_COMPLETE:\r
- return "CREATE_LINK_COMPLETE";\r
- case WFD_EVENT_CONNECT_PBC_START:\r
- return "CONNECT_PBC_START";\r
- case WFD_EVENT_PRIMARY_IF_DISCONNECTION:\r
- return "PRIMARY_IF_DISCONNECTION";\r
- case WFD_EVENT_SVC_REQ_RECEIVED:\r
- return "SVC_REQ_RECEIVED";\r
- case WFD_EVENT_SVC_RESP_RECEIVED:\r
- return "SVC_RESP_RECEIVED";\r
- case WFD_EVENT_SVC_COMEBACK_REQ_RECEIVED:\r
- return "SVC_COMEBACK_REQ_RECEIVED";\r
- case WFD_EVENT_SVC_COMEBACK_RESP_RECEIVED:\r
- return "SVC_COMEBACK_RESP_RECEIVED";\r
- case WFD_EVENT_DEV_DISCOVERABILITY_REQ:\r
- return "DEV_DISCOVERABILITY_REQ";\r
- case WFD_EVENT_DEV_DISCOVERABILITY_RSP:\r
- return "DEV_DISCOVERABILITY_RSP";\r
- case WFD_EVENT_GO_DISCOVERABILITY_REQ:\r
- return "GO_DISCOVERABILITY_REQ";\r
- case WFD_EVENT_SOFTAP_READY:\r
- return "SOFTAP_READY";\r
- case WFD_EVENT_SOFTAP_STOP:\r
- return "SOFTAP_STOP";\r
- case WFD_EVENT_IP_ASSIGNED:\r
- return "IP_ASSIGNED";\r
- case WFD_EVENT_IP_LEASED:\r
- return "IP_LEASED";\r
- case WFD_EVENT_INVITE_REQUEST:\r
- return "INVITE_REQUEST";\r
- case WFD_EVENT_INVITE_RESPONSE:\r
- return "INVITE_RESPONSE";\r
- default:\r
- WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);\r
- return "INVALID EVENT";\r
- }\r
-\r
-}\r
-\r
-void __wfd_server_print_connected_peer()\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- if (wfd_server->connected_peers[i].isUsed == 0)\r
- {\r
- WDS_LOGD( "Connected Peer[%d] isUsed=[%d]\n", i,\r
- wfd_server->connected_peers[i].isUsed);\r
- }\r
- else\r
- {\r
- WDS_LOGD( "Connected Peer[%d] isUsed=[%d] dev mac=" MACSTR " intf mac=" MACSTR " ip="IPSTR" device_name=%s\n" ,\r
- i,\r
- wfd_server->connected_peers[i].isUsed,\r
- MAC2STR(wfd_server->connected_peers[i].peer.mac_address),\r
- MAC2STR(wfd_server->connected_peers[i].int_address),\r
- IP2STR(wfd_server->connected_peers[i].ip_address),\r
- wfd_server->connected_peers[i].peer.device_name\r
- );\r
- }\r
- }\r
-}\r
-\r
-\r
-bool __wfd_get_ip_address(void *user_data)\r
-{\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- char ip_addr[64];\r
- if (wfd_oem_dhcpc_get_ip_address(ip_addr, 64, 0) == true)\r
- {\r
- wfd_event_t event;\r
- WDS_LOGE( "** Get IP address!!ip = %s\n", ip_addr);\r
- wfd_server->dhcp_ip_address_timer = 0;\r
-\r
- event = WFD_EVENT_IP_ASSIGNED;\r
- wfd_server_process_event(event);\r
- return false;\r
- }\r
- else\r
- {\r
- WDS_LOGE( "** Failed to get IP address!!Wait more...\n");\r
- return true;\r
- }\r
-}\r
-\r
-void wfd_server_start_dhcp_wait_timer()\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-\r
-#if 0\r
- //system("killall udhcpc;/usr/bin/udhcpc -i wl0.1 -s /usr/etc/wifi-direct/udhcp_script.non-autoip &");\r
-\r
- char cmdStr[256] = {0,};\r
- char *interface_name = NULL;\r
-\r
- interface_name = wfd_oem_get_default_interface_name();\r
- if (NULL == interface_name)\r
- WDS_LOGE( "ERROR : \default interface name is NULL !!!\n");\r
- else\r
- WDS_LOGE( "Interface name is [%s]\n", interface_name);\r
-\r
- sprintf(cmdStr, "killall udhcpc;/usr/bin/udhcpc -i %s -s /usr/etc/wifi-direct/udhcp_script.non-autoip &", interface_name);\r
- system(cmdStr);\r
-\r
-#else\r
-\r
- system("/usr/bin/wifi-direct-dhcp.sh client");\r
-\r
-#endif\r
-\r
- wfd_server->dhcp_ip_address_timer = g_timeout_add(1000, (GSourceFunc) __wfd_get_ip_address, NULL);\r
-}\r
-\r
-void wfd_server_cancel_dhcp_wait_timer()\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- if (wfd_server->dhcp_ip_address_timer > 0)\r
- {\r
- g_source_remove(wfd_server->dhcp_ip_address_timer);\r
- wfd_server->dhcp_ip_address_timer = 0;\r
- }\r
- else\r
- {\r
- WDS_LOGE( "** dhcp_wait_timer is already stopped...\n");\r
- }\r
-}\r
-\r
-void __wfd_server_send_client_event(wifi_direct_client_noti_s * noti)\r
-{\r
- int i = 0;\r
- int ret = 0;\r
- int len = sizeof(wifi_direct_client_noti_s);\r
-\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- WDS_LOGI( "__wfd_server_send_client_event(%d, %s)\n",\r
- noti->event, __wfd_print_client_event(noti->event));\r
-\r
- for (i = 0; i < WFD_MAX_CLIENTS; i++)\r
- {\r
- errno = 0;\r
- if ((wfd_server->client[i].isUsed == true)\r
- && (wfd_server->client[i].client_id > WFD_INVALID_ID)\r
- && (wfd_server->client[i].async_sockfd > 0))\r
- {\r
- WDS_LOGD( "Sending event to client[%d]: cid=[%d] sock=[%d] a-sock=[%d], dev_handle=[%d], sourceid=[%d]\n",\r
- i,\r
- wfd_server->client[i].client_id,\r
- wfd_server->client[i].sync_sockfd,\r
- wfd_server->client[i].async_sockfd,\r
- wfd_server->client[i].dev_handle,\r
- wfd_server->client[i].g_source_id);\r
-\r
- if (wfd_server_is_fd_writable(wfd_server->client[i].async_sockfd) <= 0)\r
- {\r
- continue;\r
- }\r
-\r
- ret = write(wfd_server->client[i].async_sockfd, (char *) noti, len);\r
- if (ret <= 0)\r
- {\r
- WDS_LOGF( "Error!!! writing to the socket. Error [%s] \n", strerror(errno));\r
- }\r
- else\r
- WDS_LOGD( "Event(%s) is Sent to client(id:%d) successfully!!!\n",\r
- __wfd_print_client_event(noti->event), wfd_server->client[i].client_id);\r
- }\r
- }\r
-}\r
-\r
-\r
-bool wfd_server_remember_connecting_peer(unsigned char device_mac[6])\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- wfd_discovery_entry_s *peer;\r
- int status;\r
-\r
- status = wfd_oem_get_peer_info(device_mac, &peer);\r
- if (status == true)\r
- {\r
- if (peer != NULL)\r
- {\r
- WDS_LOGD( "wfd_oem_get_peer_info() Success\n");\r
- memcpy(&wfd_server->current_peer, peer, sizeof(wfd_discovery_entry_s));\r
-\r
- __wfd_server_print_connected_peer();\r
- free(peer);\r
- WDS_LOGD( "peer " MACSTR" go=[%d] connected=[%d] ch=[%d] device_name=[%s]\n",\r
- MAC2STR(wfd_server->current_peer.mac_address),\r
- wfd_server->current_peer.is_group_owner,\r
- wfd_server->current_peer.is_connected,\r
- wfd_server->current_peer.channel,\r
- wfd_server->current_peer.device_name);\r
-\r
- \r
- return true;\r
- }\r
- }\r
-\r
- WDS_LOGE( "Remember Peer: Error!! can't find peer from the discovery result..\n");\r
- return false;\r
-}\r
-\r
-bool wfd_server_clear_connected_peer()\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
- unsigned char NULL_IP[4] = { 0, 0, 0, 0};\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- wfd_server->connected_peers[i].isUsed = 0;\r
- memcpy(wfd_server->connected_peers[i].ip_address, NULL_IP, 4);\r
- }\r
-\r
- wfd_server->connected_peer_count = 0;\r
- \r
- __wfd_server_print_connected_peer();\r
- return true;\r
-}\r
-\r
-\r
-void wfd_server_reset_connecting_peer()\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- unsigned char NULL_MAC[6] = { 0, 0, 0, 0, 0, 0 };\r
- memcpy(wfd_server->current_peer.mac_address, NULL_MAC, 6);\r
- __wfd_server_print_connected_peer();\r
-}\r
-\r
-void wfd_server_add_connected_peer(wfd_discovery_entry_s* peer, unsigned char interface_mac[6], char* ip_address)\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- if (wfd_server->connected_peers[i].isUsed == 0)\r
- {\r
- wfd_server->connected_peers[i].isUsed = 1;\r
- memcpy(&wfd_server->connected_peers[i].peer, peer, sizeof(wfd_discovery_entry_s));\r
- memcpy(wfd_server->connected_peers[i].int_address, interface_mac, 6);\r
- wfd_server->connected_peer_count++;\r
- break;\r
- }\r
- }\r
- __wfd_server_print_connected_peer();\r
-\r
-}\r
-\r
-void wfd_server_remove_connected_peer(wfd_discovery_entry_s * peer)\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- if (wfd_server->connected_peers[i].isUsed==1 &&\r
- memcmp(wfd_server->connected_peers[i].peer.mac_address, peer->mac_address, 6) == 0 )\r
- {\r
- wfd_server->connected_peers[i].isUsed = 0;\r
- wfd_server->connected_peer_count--;\r
- memset(&wfd_server->connected_peers[i], 0x00, sizeof(wfd_local_connected_peer_info_t));\r
- break;\r
- }\r
- }\r
- __wfd_server_print_connected_peer();\r
-}\r
-\r
-void wfd_server_remove_connected_peer_by_interface_mac(unsigned char interface_mac[6])\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- if (wfd_server->connected_peers[i].isUsed==1 &&\r
- memcmp(wfd_server->connected_peers[i].int_address, interface_mac, 6) == 0 )\r
- {\r
- wfd_server->connected_peers[i].isUsed = 0;\r
- wfd_server->connected_peer_count--;\r
- memset(&wfd_server->connected_peers[i], 0x00, sizeof(wfd_local_connected_peer_info_t));\r
- break;\r
- }\r
- }\r
- __wfd_server_print_connected_peer();\r
-}\r
-\r
-\r
-int wfd_server_is_connected_peer_by_device_mac(unsigned char device_mac[6])\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- if (wfd_server->connected_peers[i].isUsed==1 &&\r
- memcmp(wfd_server->connected_peers[i].peer.mac_address, device_mac, 6) == 0 )\r
- {\r
- return true;\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-wfd_local_connected_peer_info_t* \r
-wfd_server_get_connected_peer_by_device_mac(unsigned char device_mac[6])\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- if (wfd_server->connected_peers[i].isUsed==1 &&\r
- memcmp(wfd_server->connected_peers[i].peer.mac_address, device_mac, 6) == 0 )\r
- {\r
- return &wfd_server->connected_peers[i];\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-\r
-wfd_local_connected_peer_info_t* \r
-wfd_server_get_connected_peer_by_interface_mac(unsigned char int_mac[6])\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
-\r
- __wfd_server_print_connected_peer();\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- if (wfd_server->connected_peers[i].isUsed == 1 &&\r
- memcmp(wfd_server->connected_peers[i].int_address, int_mac, 6) == 0)\r
- {\r
- WDS_LOGD( "Found: peer[%d] device_name=[%s] int_mac=["MACSTR"] dev_mac=["MACSTR"] cat=[%d] ip=["IPSTR"]\n",\r
- i,\r
- wfd_server->connected_peers[i].peer.device_name,\r
- MAC2STR(wfd_server->connected_peers[i].int_address),\r
- MAC2STR(wfd_server->connected_peers[i].peer.mac_address),\r
- wfd_server->connected_peers[i].peer.category,\r
- IP2STR(wfd_server->connected_peers[i].ip_address));\r
-\r
- return &wfd_server->connected_peers[i];\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-\r
-int wfd_server_is_connected_peer_by_interface_mac(unsigned char interface_mac[6])\r
-{\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- int i;\r
-\r
- for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
- {\r
- if (wfd_server->connected_peers[i].isUsed==1 &&\r
- memcmp(wfd_server->connected_peers[i].int_address, interface_mac, 6) == 0 )\r
- {\r
- return true;\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-\r
-void wfd_server_process_event(wfd_event_t event)\r
-{\r
- wfd_server_control_t *wfd_server = wfd_server_get_control();\r
- wifi_direct_client_noti_s noti;\r
-\r
- __WDS_LOG_FUNC_ENTER__;\r
-\r
- memset(¬i, 0, sizeof(wifi_direct_client_noti_s));\r
-\r
- noti.event = event;\r
- noti.error = WIFI_DIRECT_ERROR_NONE;\r
-\r
- wifi_direct_state_e state = wfd_server_get_state();\r
-\r
- WDS_LOGI( "state=[%s] process event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));\r
-\r
- if (state == WIFI_DIRECT_STATE_CONNECTING)\r
- {\r
- switch (event)\r
- {\r
-#if 1\r
- //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:\r
- {\r
- unsigned char mac[6];\r
- wifi_direct_wps_type_e wps_config;\r
- \r
- wps_config = wfd_server->config_data.wps_config;\r
- \r
- wfd_oem_get_requestor_mac(mac);\r
- if (wfd_oem_connect(mac, wps_config) == true)\r
- {\r
- return;\r
- }\r
- else\r
- {\r
- if (wfd_oem_is_groupowner())\r
- {\r
- wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
- }\r
- else\r
- {\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- }\r
- \r
- snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(mac));\r
- wfd_server_reset_connecting_peer();\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;\r
- __wfd_server_send_client_event(¬i);\r
- }\r
- }\r
- break;\r
-#else\r
- //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:\r
- // fall down\r
-#endif\r
-\r
- // TODO: Do we need to make it, asynchronously?\r
- // Ignore provision discovery timeout, since provision request used syn API.\r
- // case WFD_EVENT_PROV_DISCOVERY_TIMEOUT:\r
-\r
- // Fail cases\r
- //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL:\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT:\r
- case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT:\r
- case WFD_EVENT_WPS_WRONG_PIN:\r
- case WFD_EVENT_WPS_TIMEOUT:\r
- case WFD_EVENT_WPS_SESSION_OVERLAP:\r
- case WFD_EVENT_CREATE_LINK_CANCEL:\r
- if (event == WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT) {\r
- if (wfd_server->connecting_120) {\r
- int wps_config = wfd_server->config_data.wps_config;\r
-\r
- if (wfd_server->config_data.want_persistent_group == true)\r
- wfd_oem_connect_for_persistent_group(wfd_server->current_peer.mac_address, wps_config);\r
- else\r
- wfd_oem_connect(wfd_server->current_peer.mac_address, wps_config);\r
- WDS_LOGD("Retry connection with " MACSTR, MAC2STR(wfd_server->current_peer.mac_address));\r
- break;\r
- }\r
- }\r
-\r
- if (wfd_oem_is_groupowner())\r
- {\r
- wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
- }\r
- else\r
- {\r
- wfd_server_cancel_dhcp_wait_timer();\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- }\r
- snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));\r
- wfd_server_reset_connecting_peer();\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;\r
- __wfd_server_send_client_event(¬i);\r
- //wfd_oem_start_discovery(true, 0);\r
- break;\r
-\r
- case WFD_EVENT_SOFTAP_FAIL:\r
- wfd_server_cancel_dhcp_wait_timer();\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- wfd_server_reset_connecting_peer();\r
- noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;\r
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;\r
- __wfd_server_send_client_event(¬i);\r
- break;\r
-\r
- case WFD_EVENT_CREATE_LINK_TIMEOUT:\r
- case WFD_EVENT_CREATE_LINK_AUTH_FAIL:\r
- case WFD_EVENT_CREATE_LINK_FAIL:\r
- if (wfd_oem_is_groupowner())\r
- {\r
- wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
- }\r
- else\r
- {\r
- wfd_server_cancel_dhcp_wait_timer();\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- }\r
- snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
- if (event == WFD_EVENT_CREATE_LINK_TIMEOUT)\r
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT;\r
- else if (event == WFD_EVENT_CREATE_LINK_AUTH_FAIL)\r
- noti.error = WIFI_DIRECT_ERROR_AUTH_FAILED;\r
- else if (event == WFD_EVENT_CREATE_LINK_FAIL)\r
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;\r
- wfd_server_reset_connecting_peer();\r
-\r
- if (wfd_oem_is_groupowner() == false)\r
- wfd_server_clear_connected_peer();\r
-\r
- __wfd_server_send_client_event(¬i);\r
- //wfd_oem_start_discovery(true, 0);\r
- break;\r
-\r
- case WFD_EVENT_DISCOVER_COMPLETE:\r
- wfd_server->config_data.listen_only = false;\r
-\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
- __wfd_server_send_client_event(¬i);\r
-\r
- // TODO: M-Project "find/scan" concept. First time, we start discovery during 30 seconds and then try again discovery with Listen only mode continuosly.\r
- //wfd_oem_start_discovery(true, 0);\r
- break;\r
-\r
- case WFD_EVENT_CREATE_LINK_COMPLETE:\r
- {\r
- if (wfd_oem_is_groupowner())\r
- {\r
- unsigned char intf_mac[6] = {0, };\r
-\r
- wfd_oem_get_assoc_sta_mac(intf_mac);\r
- \r
- wfd_server_add_connected_peer(&wfd_server->current_peer,\r
- intf_mac, NULL);\r
- wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
-\r
- wfd_local_connected_peer_info_t *peer = NULL;\r
- peer =\r
- wfd_server_get_connected_peer_by_interface_mac(intf_mac);\r
- WDS_LOGI(\r
- "Peer's Intf MAC is " MACSTR "\n",\r
- MAC2STR(intf_mac));\r
-\r
- if (peer == NULL)\r
- {\r
- WDS_LOGI(\r
- "Something wrong... Peer's Dev MAC is " MACSTR "\n",\r
- MAC2STR(peer->peer.mac_address));\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(wfd_server->current_peer.mac_address));\r
- }\r
- else\r
- {\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(peer->peer.mac_address));\r
- }\r
-\r
- wfd_server_reset_connecting_peer();\r
-\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
-\r
-\r
- __wfd_server_send_client_event(¬i);\r
- }\r
- else\r
- {\r
- wfd_connected_peer_info_s *peer_list = NULL;\r
-\r
- int peer_num = 0;\r
-\r
- wfd_server_clear_connected_peer();\r
-\r
- wfd_oem_get_connected_peers_info(&peer_list, &peer_num);\r
-\r
- if (peer_num == 1)\r
- {\r
- wfd_server_add_connected_peer(&wfd_server->current_peer,\r
- peer_list[0].intf_mac_address,\r
- NULL);\r
- }\r
- else\r
- {\r
- unsigned char intf_mac[6] = {0, };\r
- WDS_LOGI(\r
- "Something wrong. peer_num is [%d]\n",\r
- peer_num);\r
- wfd_server_add_connected_peer(&wfd_server->current_peer,\r
- intf_mac,\r
- NULL);\r
- }\r
-\r
- wfd_server_start_dhcp_wait_timer();\r
- }\r
- }\r
- break;\r
-\r
- case WFD_EVENT_IP_ASSIGNED:\r
- {\r
- // Update peer IP address which is DHCP server IP.\r
- char peer_ip_str[20];\r
- wfd_get_dhcpc_server_ip(peer_ip_str, 20);\r
- inet_aton(peer_ip_str, (struct in_addr*)&wfd_server->connected_peers[0].ip_address);\r
-\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(wfd_server->current_peer.mac_address));\r
- wfd_server_reset_connecting_peer();\r
- wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTED);\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
- __wfd_server_send_client_event(¬i);\r
-\r
- }\r
- break;\r
-\r
- case WFD_EVENT_CONNECT_PBC_START:\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;\r
-\r
- WDS_LOGI(\r
- "g_incomming_peer_mac_address is " MACSTR "\n",\r
- MAC2STR(g_incomming_peer_mac_address));\r
- //WDS_LOGI( "g_incomming_peer_ssid is [%s]\n", g_incomming_peer_ssid);\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(g_incomming_peer_mac_address));\r
- //strncpy(noti.param2, g_incomming_peer_ssid, strlen(g_incomming_peer_ssid));\r
-\r
- __wfd_server_send_client_event(¬i);\r
- break;\r
-\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST:\r
- if (wfd_oem_is_groupowner())\r
- {\r
- // provision request comes, when we sent 'invite'...\r
- wfd_oem_wps_pbc_start(NULL);\r
- }\r
- else\r
- {\r
- //Ignore provision request during connecting...\r
- }\r
- break;\r
-\r
- case WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY:\r
- case WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD:\r
- if (event == WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY) {\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;\r
- wfd_oem_connect(g_incomming_peer_mac_address, wfd_server->config_data.wps_config);\r
- }\r
- else if (event == WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD)\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;\r
- WDS_LOGI("g_incomming_peer_mac_address is [" MACSTR "]\n", MAC2STR(g_incomming_peer_mac_address));\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(g_incomming_peer_mac_address));\r
- __wfd_server_send_client_event(¬i);\r
- break;\r
-\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:\r
- if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY) {\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;\r
- wfd_oem_wps_pin_start(g_incomming_peer_mac_address);\r
- } else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD) {\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;\r
- }\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;\r
- WDS_LOGI("g_incomming_peer_mac_address is [" MACSTR "]\n", MAC2STR(g_incomming_peer_mac_address));\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(g_incomming_peer_mac_address));\r
- __wfd_server_send_client_event(¬i);\r
- break;\r
- default:\r
- WDS_LOGI(\r
- "Unprocessed event: state=[%s] event= [%s] \n",\r
- wfd_print_state(state),\r
- __wfd_server_print_event(noti.event));\r
- break;\r
- }\r
- }\r
- else if (state == WIFI_DIRECT_STATE_DISCONNECTING)\r
- {\r
- switch (event)\r
- {\r
- case WFD_EVENT_CREATE_LINK_CANCEL:\r
-\r
- if (wfd_oem_is_groupowner())\r
- {\r
- wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
- }\r
- else\r
- {\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- }\r
-\r
- WDS_LOGI( "Peer's Dev MAC is " MACSTR "\n",\r
- MAC2STR(wfd_server->current_peer.mac_address));\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(wfd_server->current_peer.mac_address));\r
-\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;\r
- wfd_server_reset_connecting_peer();\r
- wfd_server_clear_connected_peer();\r
- __wfd_server_send_client_event(¬i);\r
- //wfd_oem_start_discovery(true, 0);\r
- break;\r
- default:\r
- WDS_LOGI(\r
- "Unprocessed event: state=[%s] event= [%s] \n",\r
- wfd_print_state(state),\r
- __wfd_server_print_event(noti.event));\r
- break;\r
- }\r
- }\r
- else if (state == WIFI_DIRECT_STATE_CONNECTED ||\r
- state == WIFI_DIRECT_STATE_ACTIVATED ||\r
- state == WIFI_DIRECT_STATE_DISCOVERING ||\r
- state == WIFI_DIRECT_STATE_GROUP_OWNER)\r
- {\r
- switch (event)\r
- {\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST:\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:\r
- case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:\r
- {\r
- if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST)\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;\r
- else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY)\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;\r
- else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD)\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;\r
-\r
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;\r
- WDS_LOGI("g_incomming_peer_mac_address is " MACSTR "\n",\r
- MAC2STR(g_incomming_peer_mac_address));\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(g_incomming_peer_mac_address));\r
-\r
- __wfd_server_send_client_event(¬i);\r
- wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);\r
- }\r
- break;\r
-\r
- case WFD_EVENT_INVITE_REQUEST:\r
- {\r
- noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;\r
- WDS_LOGD("WIFI_DIRECT_CLI_EVENT_INVITATION_REQ");\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(g_incomming_peer_mac_address));\r
- __wfd_server_send_client_event(¬i);\r
- }\r
- break;\r
-\r
- case WFD_EVENT_SOFTAP_STA_DISASSOC:\r
- {\r
- if (wfd_oem_is_groupowner() == true)\r
- {\r
- int count = 0;\r
- unsigned char interface_mac[6];\r
- wfd_oem_get_disassoc_sta_mac(interface_mac);\r
-\r
- wfd_local_connected_peer_info_t *peer = NULL;\r
- peer =\r
- wfd_server_get_connected_peer_by_interface_mac(interface_mac);\r
- if (peer != NULL)\r
- {\r
- WDS_LOGI("Peer's Intf MAC: " MACSTR ", Device MAC:" MACSTR " \n",\r
- MAC2STR(interface_mac),\r
- MAC2STR(peer->peer.mac_address));\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(peer->peer.mac_address));\r
- }\r
- else\r
- {\r
- WDS_LOGI("Peer's Intf MAC: " MACSTR ", Device MAC:null \n",\r
- MAC2STR(interface_mac));\r
- memset(noti.param1, 0, 6);\r
- }\r
-\r
- wfd_server_remove_connected_peer_by_interface_mac(interface_mac);\r
- wfd_server_reset_connecting_peer();\r
-\r
- wfd_oem_get_connected_peers_count(&count);\r
- if (count == 0)\r
- {\r
- wfd_server->config_data.wps_config =\r
- WIFI_DIRECT_WPS_TYPE_PBC;\r
- if (wfd_oem_disconnect() == false)\r
- WDS_LOGF("Error!!! wfd_oem_disconnect() failed!!..\n");\r
- else\r
- wfd_server_set_state(WIFI_DIRECT_STATE_DISCONNECTING);\r
- }\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;\r
- __wfd_server_send_client_event(¬i);\r
- }\r
- else\r
- {\r
- WDS_LOGF("Error!!! DISASSOC event come..\n");\r
- }\r
- }\r
- break;\r
-\r
- case WFD_EVENT_PRIMARY_IF_DISCONNECTION:\r
- WDS_LOGD("Primary interface (wlan0) is down. Just let it up!\n");\r
- system("ifconfig wlan0 up");\r
- break;\r
-\r
- case WFD_EVENT_CREATE_LINK_CANCEL:\r
- {\r
- if (state == WIFI_DIRECT_STATE_GROUP_OWNER)\r
- {\r
- WDS_LOGI("Peer's Dev MAC is " MACSTR "\n",\r
- MAC2STR(wfd_server->current_peer.mac_address));\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(wfd_server->current_peer.mac_address));\r
-\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;\r
- __wfd_server_send_client_event(¬i);\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- }\r
- else\r
- {\r
- WDS_LOGD("message is ignored [%d] at state=[%d]\n",\r
- event, state);\r
- }\r
- wfd_server_clear_connected_peer();\r
-\r
- }\r
- break;\r
- case WFD_EVENT_CREATE_LINK_DOWN:\r
- {\r
- if (state >= WIFI_DIRECT_STATE_CONNECTED)\r
- {\r
- WDS_LOGI(\r
- "Peer's Intf MAC: " MACSTR ", Device MAC:" MACSTR " \n",\r
- MAC2STR(wfd_server->connected_peers[0].int_address),\r
- MAC2STR(wfd_server->connected_peers[0].peer.mac_address));\r
-\r
- snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
- MAC2STR(wfd_server->connected_peers[0].peer.mac_address));\r
-\r
- wfd_server_clear_connected_peer();\r
- wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;\r
- __wfd_server_send_client_event(¬i);\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- }\r
- else\r
- {\r
- WDS_LOGD(\r
- "message is ignored [%d] at state=[%d]\n",\r
- event, state);\r
- }\r
- }\r
- break;\r
- case WFD_EVENT_DISCOVER_START_80211_SCAN:\r
- wfd_server->config_data.listen_only = false;\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;\r
- __wfd_server_send_client_event(¬i);\r
- if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
- state == WIFI_DIRECT_STATE_DISCOVERING)\r
- wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);\r
- break;\r
-#if 0\r
- case WFD_EVENT_DISCOVER_START_SEARCH_LISTEN:\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN;\r
- __wfd_server_send_client_event(¬i);\r
- if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
- state == WIFI_DIRECT_STATE_DISCOVERING)\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- break;\r
-#endif\r
-\r
- case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:\r
- wfd_server->config_data.listen_only = true;\r
- \r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;\r
- __wfd_server_send_client_event(¬i);\r
- if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
- state == WIFI_DIRECT_STATE_DISCOVERING)\r
- wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);\r
- break;\r
-\r
- case WFD_EVENT_DISCOVER_CANCEL:\r
- case WFD_EVENT_DISCOVER_COMPLETE:\r
- case WFD_EVENT_DISCOVER_FAIL:\r
- wfd_server->config_data.listen_only = false;\r
- \r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
- __wfd_server_send_client_event(¬i);\r
- if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
- state == WIFI_DIRECT_STATE_DISCOVERING)\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- break;\r
-\r
- // TODO: M-Project "find/scan" concept. First time, we start discovery during 30 seconds and then try again discovery with Listen only mode continuosly.\r
-#if 0\r
- case WFD_EVENT_DISCOVER_COMPLETE:\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
- __wfd_server_send_client_event(¬i);\r
- wfd_oem_start_discovery(true, 0);\r
- break;\r
-#endif\r
-\r
- case WFD_EVENT_DISCOVER_FOUND_PEERS:\r
- case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:\r
- {\r
- if (state == WIFI_DIRECT_STATE_CONNECTED)\r
- {\r
- // Note:\r
- // In case of GC, when connected, interface_mac_address is not updated, since scan is stopped.\r
- // If scan is started (by user request), then we have changce to get the interface_mac_address.\r
- //\r
- unsigned char null_mac[6]={0,};\r
- if (memcmp(&wfd_server->connected_peers[0].int_address, &null_mac, 6)==0)\r
- {\r
- wfd_connected_peer_info_s *peer_list = NULL;\r
- int peer_num = 0;\r
-\r
- wfd_oem_get_connected_peers_info(&peer_list, &peer_num);\r
-\r
- if (peer_num == 1)\r
- {\r
- memcpy(&wfd_server->connected_peers[0].int_address,\r
- &peer_list[0].intf_mac_address,\r
- 6);\r
- }\r
- else\r
- {\r
- // Something wrong, and ignore it...\r
- }\r
- }\r
- }\r
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;\r
- __wfd_server_send_client_event(¬i);\r
- }\r
- break;\r
-\r
- case WFD_EVENT_SOFTAP_READY:\r
- {\r
- noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;\r
- __wfd_server_send_client_event(¬i);\r
- }\r
- break;\r
-\r
- case WFD_EVENT_SOFTAP_STOP:\r
- {\r
- noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;\r
- __wfd_server_send_client_event(¬i);\r
- wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
- }\r
- break;\r
-\r
- default:\r
- WDS_LOGI( "Unprocessed event: state=[%s] event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));\r
- break;\r
- }\r
- }\r
-\r
- __WDS_LOG_FUNC_EXIT__;\r
-}\r
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+#include <glib.h>
+
+#include "wifi-direct-service.h"
+#include "wifi-direct-event-handler.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-internal.h"
+#include "wifi-direct-utils.h"
+
+char wfd_event_str[WFD_EVENT_MAX];
+
+char *__wfd_print_client_event(wfd_client_event_e event)
+{
+ switch (event)
+ {
+ case WIFI_DIRECT_CLI_EVENT_ACTIVATION:
+ return "ACTIVATION";
+ case WIFI_DIRECT_CLI_EVENT_DEACTIVATION:
+ return "DEACTIVATION";
+ case WIFI_DIRECT_CLI_EVENT_DISCOVER_START:
+ return "DISCOVER_START_80211_SCAN";
+ case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY:
+ return "DISCOVER_START_LISTEN_ONLY";
+ case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN:
+ return "DISCOVER_START_SEARCH_LISTEN";
+ case WIFI_DIRECT_CLI_EVENT_DISCOVER_END:
+ return "DISCOVER_END";
+ case WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS:
+ return "DISCOVER_FOUND_PEERS";
+ case WIFI_DIRECT_CLI_EVENT_CONNECTION_START:
+ return "CONNECTION_START";
+ case WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ:
+ return "CONNECTION_REQ";
+ case WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP:
+ return "CONNECTION_RSP";
+ case WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ:
+ return "CONNECTION_WPS_REQ";
+ case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP:
+ return "DISCONNECTION_RSP";
+ case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND:
+ return "DISCONNECTION_IND";
+ case WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP:
+ return "GROUP_CREATE_RSP";
+ case WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP:
+ return "GROUP_DESTROY_RSP";
+ case WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND:
+ return "IP_LEASED_IND";
+ default:
+ WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);
+ return "INVALID EVENT";
+ }
+}
+
+
+char *__wfd_server_print_event(wfd_event_t event)
+{
+ switch (event)
+ {
+ case WFD_EVENT_DISCOVER_START_80211_SCAN:
+ return "DISCOVER_START_80211_SCAN";
+ case WFD_EVENT_DISCOVER_START_SEARCH_LISTEN:
+ return "DISCOVER_START_SEARCH_LISTEN";
+ case WFD_EVENT_DISCOVER_FOUND_PEERS:
+ return "DISCOVER_FOUND_PEERS";
+ case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:
+ return "DISCOVER_FOUND_P2P_GROUPS";
+ case WFD_EVENT_DISCOVER_CANCEL:
+ return "DISCOVER_CANCEL";
+ case WFD_EVENT_DISCOVER_COMPLETE:
+ return "DISCOVER_COMPLETE";
+ case WFD_EVENT_DISCOVER_FAIL:
+ return "DISCOVER_FAIL";
+ case WFD_EVENT_DISCOVER_RESUMED:
+ return "DISCOVER_RESUMED";
+ case WFD_EVENT_DISCOVER_SUSPENDED:
+ return "DISCOVER_SUSPENDED";
+ case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:
+ return "DISCOVER_START_LISTEN_ONLY";
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST:
+ return "PROV_DISCOVERY_REQUEST";
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:
+ return "PROV_DISCOVERY_REQUEST_WPS_DISPLAY";
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:
+ return "PROV_DISCOVERY_REQUEST_WPS_KEYPAD";
+ case WFD_EVENT_PROV_DISCOVERY_RESPONSE:
+ return "PROV_DISCOVERY_RESPONSE";
+ case WFD_EVENT_PROV_DISCOVERY_TIMEOUT:
+ return "PROV_DISCOVERY_TIMEOUT";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_START:
+ return "GROUP_OWNER_NEGOTIATION_START";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_AP_ACK:
+ return "GROUP_OWNER_NEGOTIATION_AP_ACK";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_STA_ACK:
+ return "GROUP_OWNER_NEGOTIATION_STA_ACK";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED:
+ return "GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_COMPLETE:
+ return "GROUP_OWNER_NEGOTIATION_COMPLETE";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:
+ return "GROUP_OWNER_NEGOTIATION_FAIL";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:
+ return "GROUP_OWNER_NEGOTIATION_NO_PROV_INFO";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL:
+ return "GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL";
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT:
+ return "GROUP_OWNER_NEGOTIATION_FAIL_INTENT";
+ case WFD_EVENT_CREATE_LINK_START:
+ return "CREATE_LINK_START";
+ case WFD_EVENT_CREATE_LINK_CANCEL:
+ return "CREATE_LINK_CANCEL";
+ case WFD_EVENT_CREATE_LINK_TIMEOUT:
+ return "CREATE_LINK_TIMEOUT";
+ case WFD_EVENT_CREATE_LINK_AUTH_FAIL:
+ return "CREATE_LINK_AUTH_FAIL";
+ case WFD_EVENT_CREATE_LINK_FAIL:
+ return "CREATE_LINK_FAIL";
+ case WFD_EVENT_CREATE_LINK_COMPLETE:
+ return "CREATE_LINK_COMPLETE";
+ case WFD_EVENT_CONNECT_PBC_START:
+ return "CONNECT_PBC_START";
+ case WFD_EVENT_PRIMARY_IF_DISCONNECTION:
+ return "PRIMARY_IF_DISCONNECTION";
+ case WFD_EVENT_SVC_REQ_RECEIVED:
+ return "SVC_REQ_RECEIVED";
+ case WFD_EVENT_SVC_RESP_RECEIVED:
+ return "SVC_RESP_RECEIVED";
+ case WFD_EVENT_SVC_COMEBACK_REQ_RECEIVED:
+ return "SVC_COMEBACK_REQ_RECEIVED";
+ case WFD_EVENT_SVC_COMEBACK_RESP_RECEIVED:
+ return "SVC_COMEBACK_RESP_RECEIVED";
+ case WFD_EVENT_DEV_DISCOVERABILITY_REQ:
+ return "DEV_DISCOVERABILITY_REQ";
+ case WFD_EVENT_DEV_DISCOVERABILITY_RSP:
+ return "DEV_DISCOVERABILITY_RSP";
+ case WFD_EVENT_GO_DISCOVERABILITY_REQ:
+ return "GO_DISCOVERABILITY_REQ";
+ case WFD_EVENT_SOFTAP_READY:
+ return "SOFTAP_READY";
+ case WFD_EVENT_SOFTAP_STOP:
+ return "SOFTAP_STOP";
+ case WFD_EVENT_IP_ASSIGNED:
+ return "IP_ASSIGNED";
+ case WFD_EVENT_IP_LEASED:
+ return "IP_LEASED";
+ case WFD_EVENT_INVITE_REQUEST:
+ return "INVITE_REQUEST";
+ case WFD_EVENT_INVITE_RESPONSE:
+ return "INVITE_RESPONSE";
+ default:
+ WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);
+ return "INVALID EVENT";
+ }
+
+}
+
+void __wfd_server_print_connected_peer()
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ if (wfd_server->connected_peers[i].isUsed == 0)
+ {
+ WDS_LOGD( "Connected Peer[%d] isUsed=[%d]\n", i,
+ wfd_server->connected_peers[i].isUsed);
+ }
+ else
+ {
+ WDS_LOGD( "Connected Peer[%d] isUsed=[%d] dev mac=" MACSTR " intf mac=" MACSTR " ip="IPSTR" device_name=%s\n" ,
+ i,
+ wfd_server->connected_peers[i].isUsed,
+ MAC2STR(wfd_server->connected_peers[i].peer.mac_address),
+ MAC2STR(wfd_server->connected_peers[i].int_address),
+ IP2STR(wfd_server->connected_peers[i].ip_address),
+ wfd_server->connected_peers[i].peer.device_name
+ );
+ }
+ }
+}
+
+
+bool __wfd_get_ip_address(void *user_data)
+{
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ char ip_addr[64];
+ if (wfd_oem_dhcpc_get_ip_address(ip_addr, 64, 0) == true)
+ {
+ wfd_event_t event;
+ WDS_LOGE( "** Get IP address!!ip = %s\n", ip_addr);
+ wfd_server->dhcp_ip_address_timer = 0;
+
+ event = WFD_EVENT_IP_ASSIGNED;
+ wfd_server_process_event(event);
+ return false;
+ }
+ else
+ {
+ WDS_LOGE( "** Failed to get IP address!!Wait more...\n");
+ return true;
+ }
+}
+
+void wfd_server_start_dhcp_wait_timer()
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+
+#if 0
+ //system("killall udhcpc;/usr/bin/udhcpc -i wl0.1 -s /usr/etc/wifi-direct/udhcp_script.non-autoip &");
+
+ char cmdStr[256] = {0,};
+ char *interface_name = NULL;
+
+ interface_name = wfd_oem_get_default_interface_name();
+ if (NULL == interface_name)
+ WDS_LOGE( "ERROR : \default interface name is NULL !!!\n");
+ else
+ WDS_LOGE( "Interface name is [%s]\n", interface_name);
+
+ sprintf(cmdStr, "killall udhcpc;/usr/bin/udhcpc -i %s -s /usr/etc/wifi-direct/udhcp_script.non-autoip &", interface_name);
+ system(cmdStr);
+
+#else
+
+ system("/usr/bin/wifi-direct-dhcp.sh client");
+
+#endif
+
+ wfd_server->dhcp_ip_address_timer = g_timeout_add(1000, (GSourceFunc) __wfd_get_ip_address, NULL);
+}
+
+void wfd_server_cancel_dhcp_wait_timer()
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ if (wfd_server->dhcp_ip_address_timer > 0)
+ {
+ g_source_remove(wfd_server->dhcp_ip_address_timer);
+ wfd_server->dhcp_ip_address_timer = 0;
+ }
+ else
+ {
+ WDS_LOGE( "** dhcp_wait_timer is already stopped...\n");
+ }
+}
+
+void __wfd_server_send_client_event(wifi_direct_client_noti_s * noti)
+{
+ int i = 0;
+ int ret = 0;
+ int len = sizeof(wifi_direct_client_noti_s);
+
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ WDS_LOGI( "__wfd_server_send_client_event(%d, %s)\n",
+ noti->event, __wfd_print_client_event(noti->event));
+
+ for (i = 0; i < WFD_MAX_CLIENTS; i++)
+ {
+ errno = 0;
+ if ((wfd_server->client[i].isUsed == true)
+ && (wfd_server->client[i].client_id > WFD_INVALID_ID)
+ && (wfd_server->client[i].async_sockfd > 0))
+ {
+ WDS_LOGD( "Sending event to client[%d]: cid=[%d] sock=[%d] a-sock=[%d], dev_handle=[%d], sourceid=[%d]\n",
+ i,
+ wfd_server->client[i].client_id,
+ wfd_server->client[i].sync_sockfd,
+ wfd_server->client[i].async_sockfd,
+ wfd_server->client[i].dev_handle,
+ wfd_server->client[i].g_source_id);
+
+ if (wfd_server_is_fd_writable(wfd_server->client[i].async_sockfd) <= 0)
+ {
+ continue;
+ }
+
+ ret = write(wfd_server->client[i].async_sockfd, (char *) noti, len);
+ if (ret <= 0)
+ {
+ WDS_LOGF( "Error!!! writing to the socket. Error [%s] \n", strerror(errno));
+ }
+ else
+ WDS_LOGD( "Event(%s) is Sent to client(id:%d) successfully!!!\n",
+ __wfd_print_client_event(noti->event), wfd_server->client[i].client_id);
+ }
+ }
+}
+
+
+bool wfd_server_remember_connecting_peer(unsigned char device_mac[6])
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ wfd_discovery_entry_s *peer;
+ int status;
+
+ status = wfd_oem_get_peer_info(device_mac, &peer);
+ if (status == true)
+ {
+ if (peer != NULL)
+ {
+ WDS_LOGD( "wfd_oem_get_peer_info() Success\n");
+ memcpy(&wfd_server->current_peer, peer, sizeof(wfd_discovery_entry_s));
+
+ __wfd_server_print_connected_peer();
+ free(peer);
+ WDS_LOGD( "peer " MACSTR" go=[%d] connected=[%d] ch=[%d] device_name=[%s]\n",
+ MAC2STR(wfd_server->current_peer.mac_address),
+ wfd_server->current_peer.is_group_owner,
+ wfd_server->current_peer.is_connected,
+ wfd_server->current_peer.channel,
+ wfd_server->current_peer.device_name);
+
+
+ return true;
+ }
+ }
+
+ WDS_LOGE( "Remember Peer: Error!! can't find peer from the discovery result..\n");
+ return false;
+}
+
+bool wfd_server_clear_connected_peer()
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+ unsigned char NULL_IP[4] = { 0, 0, 0, 0};
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ wfd_server->connected_peers[i].isUsed = 0;
+ memcpy(wfd_server->connected_peers[i].ip_address, NULL_IP, 4);
+ }
+
+ wfd_server->connected_peer_count = 0;
+
+ __wfd_server_print_connected_peer();
+ return true;
+}
+
+
+void wfd_server_reset_connecting_peer()
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ unsigned char NULL_MAC[6] = { 0, 0, 0, 0, 0, 0 };
+ memcpy(wfd_server->current_peer.mac_address, NULL_MAC, 6);
+ __wfd_server_print_connected_peer();
+}
+
+void wfd_server_add_connected_peer(wfd_discovery_entry_s* peer, unsigned char interface_mac[6], char* ip_address)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ if (wfd_server->connected_peers[i].isUsed == 0)
+ {
+ wfd_server->connected_peers[i].isUsed = 1;
+ memcpy(&wfd_server->connected_peers[i].peer, peer, sizeof(wfd_discovery_entry_s));
+ memcpy(wfd_server->connected_peers[i].int_address, interface_mac, 6);
+ wfd_server->connected_peer_count++;
+ break;
+ }
+ }
+ __wfd_server_print_connected_peer();
+
+}
+
+void wfd_server_remove_connected_peer(wfd_discovery_entry_s * peer)
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ if (wfd_server->connected_peers[i].isUsed==1 &&
+ memcmp(wfd_server->connected_peers[i].peer.mac_address, peer->mac_address, 6) == 0 )
+ {
+ wfd_server->connected_peers[i].isUsed = 0;
+ wfd_server->connected_peer_count--;
+ memset(&wfd_server->connected_peers[i], 0x00, sizeof(wfd_local_connected_peer_info_t));
+ break;
+ }
+ }
+ __wfd_server_print_connected_peer();
+}
+
+void wfd_server_remove_connected_peer_by_interface_mac(unsigned char interface_mac[6])
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ if (wfd_server->connected_peers[i].isUsed==1 &&
+ memcmp(wfd_server->connected_peers[i].int_address, interface_mac, 6) == 0 )
+ {
+ wfd_server->connected_peers[i].isUsed = 0;
+ wfd_server->connected_peer_count--;
+ memset(&wfd_server->connected_peers[i], 0x00, sizeof(wfd_local_connected_peer_info_t));
+ break;
+ }
+ }
+ __wfd_server_print_connected_peer();
+}
+
+
+int wfd_server_is_connected_peer_by_device_mac(unsigned char device_mac[6])
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ if (wfd_server->connected_peers[i].isUsed==1 &&
+ memcmp(wfd_server->connected_peers[i].peer.mac_address, device_mac, 6) == 0 )
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+wfd_local_connected_peer_info_t*
+wfd_server_get_connected_peer_by_device_mac(unsigned char device_mac[6])
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ if (wfd_server->connected_peers[i].isUsed==1 &&
+ memcmp(wfd_server->connected_peers[i].peer.mac_address, device_mac, 6) == 0 )
+ {
+ return &wfd_server->connected_peers[i];
+ }
+ }
+ return NULL;
+}
+
+
+wfd_local_connected_peer_info_t*
+wfd_server_get_connected_peer_by_interface_mac(unsigned char int_mac[6])
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+
+ __wfd_server_print_connected_peer();
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ if (wfd_server->connected_peers[i].isUsed == 1 &&
+ memcmp(wfd_server->connected_peers[i].int_address, int_mac, 6) == 0)
+ {
+ WDS_LOGD( "Found: peer[%d] device_name=[%s] int_mac=["MACSTR"] dev_mac=["MACSTR"] cat=[%d] ip=["IPSTR"]\n",
+ i,
+ wfd_server->connected_peers[i].peer.device_name,
+ MAC2STR(wfd_server->connected_peers[i].int_address),
+ MAC2STR(wfd_server->connected_peers[i].peer.mac_address),
+ wfd_server->connected_peers[i].peer.category,
+ IP2STR(wfd_server->connected_peers[i].ip_address));
+
+ return &wfd_server->connected_peers[i];
+ }
+ }
+ return NULL;
+}
+
+
+int wfd_server_is_connected_peer_by_interface_mac(unsigned char interface_mac[6])
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ int i;
+
+ for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
+ {
+ if (wfd_server->connected_peers[i].isUsed==1 &&
+ memcmp(wfd_server->connected_peers[i].int_address, interface_mac, 6) == 0 )
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+
+void wfd_server_process_event(wfd_event_t event)
+{
+ wfd_server_control_t *wfd_server = wfd_server_get_control();
+ wifi_direct_client_noti_s noti;
+
+ __WDS_LOG_FUNC_ENTER__;
+
+ memset(¬i, 0, sizeof(wifi_direct_client_noti_s));
+
+ noti.event = event;
+ noti.error = WIFI_DIRECT_ERROR_NONE;
+
+ wifi_direct_state_e state = wfd_server_get_state();
+
+ WDS_LOGI( "state=[%s] process event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));
+
+ if (state == WIFI_DIRECT_STATE_CONNECTING)
+ {
+ switch (event)
+ {
+#if 1
+ //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:
+ {
+ unsigned char mac[6];
+ wifi_direct_wps_type_e wps_config;
+
+ wps_config = wfd_server->config_data.wps_config;
+
+ wfd_oem_get_requestor_mac(mac);
+ if (wfd_oem_connect(mac, wps_config) == true)
+ {
+ return;
+ }
+ else
+ {
+ if (wfd_oem_is_groupowner())
+ {
+ wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ }
+ else
+ {
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+
+ snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(mac));
+ wfd_server_reset_connecting_peer();
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+ noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
+ __wfd_server_send_client_event(¬i);
+ }
+ }
+ break;
+#else
+ //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:
+ // fall down
+#endif
+
+ // TODO: Do we need to make it, asynchronously?
+ // Ignore provision discovery timeout, since provision request used syn API.
+ // case WFD_EVENT_PROV_DISCOVERY_TIMEOUT:
+
+ // Fail cases
+ //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL:
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT:
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT:
+ case WFD_EVENT_WPS_WRONG_PIN:
+ case WFD_EVENT_WPS_TIMEOUT:
+ case WFD_EVENT_WPS_SESSION_OVERLAP:
+ case WFD_EVENT_CREATE_LINK_CANCEL:
+ if (event == WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT) {
+ if (wfd_server->connecting_120) {
+ int wps_config = wfd_server->config_data.wps_config;
+
+ if (wfd_server->config_data.want_persistent_group == true)
+ wfd_oem_connect_for_persistent_group(wfd_server->current_peer.mac_address, wps_config);
+ else
+ wfd_oem_connect(wfd_server->current_peer.mac_address, wps_config);
+ WDS_LOGD("Retry connection with " MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
+ break;
+ }
+ }
+
+ if (wfd_oem_is_groupowner())
+ {
+ wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ }
+ else
+ {
+ wfd_server_cancel_dhcp_wait_timer();
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+ snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
+ wfd_server_reset_connecting_peer();
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+ noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
+ __wfd_server_send_client_event(¬i);
+ //wfd_oem_start_discovery(true, 0);
+ break;
+
+ case WFD_EVENT_SOFTAP_FAIL:
+ wfd_server_cancel_dhcp_wait_timer();
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ wfd_server_reset_connecting_peer();
+ noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
+ noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
+ __wfd_server_send_client_event(¬i);
+ break;
+
+ case WFD_EVENT_CREATE_LINK_TIMEOUT:
+ case WFD_EVENT_CREATE_LINK_AUTH_FAIL:
+ case WFD_EVENT_CREATE_LINK_FAIL:
+ if (wfd_oem_is_groupowner())
+ {
+ wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ }
+ else
+ {
+ wfd_server_cancel_dhcp_wait_timer();
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+ snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+ if (event == WFD_EVENT_CREATE_LINK_TIMEOUT)
+ noti.error = WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT;
+ else if (event == WFD_EVENT_CREATE_LINK_AUTH_FAIL)
+ noti.error = WIFI_DIRECT_ERROR_AUTH_FAILED;
+ else if (event == WFD_EVENT_CREATE_LINK_FAIL)
+ noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
+ wfd_server_reset_connecting_peer();
+
+ if (wfd_oem_is_groupowner() == false)
+ wfd_server_clear_connected_peer();
+
+ __wfd_server_send_client_event(¬i);
+ //wfd_oem_start_discovery(true, 0);
+ break;
+
+ case WFD_EVENT_DISCOVER_COMPLETE:
+ wfd_server->config_data.listen_only = false;
+
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
+ __wfd_server_send_client_event(¬i);
+
+ // TODO: M-Project "find/scan" concept. First time, we start discovery during 30 seconds and then try again discovery with Listen only mode continuosly.
+ //wfd_oem_start_discovery(true, 0);
+ break;
+
+ case WFD_EVENT_CREATE_LINK_COMPLETE:
+ {
+ if (wfd_oem_is_groupowner())
+ {
+ unsigned char intf_mac[6] = {0, };
+
+ wfd_oem_get_assoc_sta_mac(intf_mac);
+
+ wfd_server_add_connected_peer(&wfd_server->current_peer,
+ intf_mac, NULL);
+ wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+
+ wfd_local_connected_peer_info_t *peer = NULL;
+ peer =
+ wfd_server_get_connected_peer_by_interface_mac(intf_mac);
+ WDS_LOGI(
+ "Peer's Intf MAC is " MACSTR "\n",
+ MAC2STR(intf_mac));
+
+ if (peer == NULL)
+ {
+ WDS_LOGI(
+ "Something wrong... Peer's Dev MAC is " MACSTR "\n",
+ MAC2STR(peer->peer.mac_address));
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(wfd_server->current_peer.mac_address));
+ }
+ else
+ {
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(peer->peer.mac_address));
+ }
+
+ wfd_server_reset_connecting_peer();
+
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+
+
+ __wfd_server_send_client_event(¬i);
+ }
+ else
+ {
+ wfd_connected_peer_info_s *peer_list = NULL;
+
+ int peer_num = 0;
+
+ wfd_server_clear_connected_peer();
+
+ wfd_oem_get_connected_peers_info(&peer_list, &peer_num);
+
+ if (peer_num == 1)
+ {
+ wfd_server_add_connected_peer(&wfd_server->current_peer,
+ peer_list[0].intf_mac_address,
+ NULL);
+ }
+ else
+ {
+ unsigned char intf_mac[6] = {0, };
+ WDS_LOGI(
+ "Something wrong. peer_num is [%d]\n",
+ peer_num);
+ wfd_server_add_connected_peer(&wfd_server->current_peer,
+ intf_mac,
+ NULL);
+ }
+
+ wfd_server_start_dhcp_wait_timer();
+ }
+ }
+ break;
+
+ case WFD_EVENT_IP_ASSIGNED:
+ {
+ // Update peer IP address which is DHCP server IP.
+ char peer_ip_str[20];
+ wfd_get_dhcpc_server_ip(peer_ip_str, 20);
+ inet_aton(peer_ip_str, (struct in_addr*)&wfd_server->connected_peers[0].ip_address);
+
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
+ wfd_server_reset_connecting_peer();
+ wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTED);
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+ __wfd_server_send_client_event(¬i);
+
+ }
+ break;
+
+ case WFD_EVENT_CONNECT_PBC_START:
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
+
+ WDS_LOGI(
+ "g_incomming_peer_mac_address is " MACSTR "\n",
+ MAC2STR(g_incomming_peer_mac_address));
+ //WDS_LOGI( "g_incomming_peer_ssid is [%s]\n", g_incomming_peer_ssid);
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(g_incomming_peer_mac_address));
+ //strncpy(noti.param2, g_incomming_peer_ssid, strlen(g_incomming_peer_ssid));
+
+ __wfd_server_send_client_event(¬i);
+ break;
+
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST:
+ if (wfd_oem_is_groupowner())
+ {
+ // provision request comes, when we sent 'invite'...
+ wfd_oem_wps_pbc_start(NULL);
+ }
+ else
+ {
+ //Ignore provision request during connecting...
+ }
+ break;
+
+ case WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY:
+ case WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD:
+ if (event == WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY) {
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
+ wfd_oem_connect(g_incomming_peer_mac_address, wfd_server->config_data.wps_config);
+ }
+ else if (event == WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD)
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
+ WDS_LOGI("g_incomming_peer_mac_address is [" MACSTR "]\n", MAC2STR(g_incomming_peer_mac_address));
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(g_incomming_peer_mac_address));
+ __wfd_server_send_client_event(¬i);
+ break;
+
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:
+ if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY) {
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
+ wfd_oem_wps_pin_start(g_incomming_peer_mac_address);
+ } else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD) {
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
+ }
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
+ WDS_LOGI("g_incomming_peer_mac_address is [" MACSTR "]\n", MAC2STR(g_incomming_peer_mac_address));
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(g_incomming_peer_mac_address));
+ __wfd_server_send_client_event(¬i);
+ break;
+ default:
+ WDS_LOGI(
+ "Unprocessed event: state=[%s] event= [%s] \n",
+ wfd_print_state(state),
+ __wfd_server_print_event(noti.event));
+ break;
+ }
+ }
+ else if (state == WIFI_DIRECT_STATE_DISCONNECTING)
+ {
+ switch (event)
+ {
+ case WFD_EVENT_CREATE_LINK_CANCEL:
+
+ if (wfd_oem_is_groupowner())
+ {
+ wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ }
+ else
+ {
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+
+ WDS_LOGI( "Peer's Dev MAC is " MACSTR "\n",
+ MAC2STR(wfd_server->current_peer.mac_address));
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(wfd_server->current_peer.mac_address));
+
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+ noti.error = WIFI_DIRECT_ERROR_NONE;
+ wfd_server_reset_connecting_peer();
+ wfd_server_clear_connected_peer();
+ __wfd_server_send_client_event(¬i);
+ //wfd_oem_start_discovery(true, 0);
+ break;
+ case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:
+ if (wfd_oem_is_groupowner())
+ {
+ wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ }
+ else
+ {
+ wfd_server_cancel_dhcp_wait_timer();
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+ snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
+ wfd_server_reset_connecting_peer();
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+ noti.error = WIFI_DIRECT_ERROR_NONE;
+ __wfd_server_send_client_event(¬i);
+ break;
+ default:
+ WDS_LOGI(
+ "Unprocessed event: state=[%s] event= [%s] \n",
+ wfd_print_state(state),
+ __wfd_server_print_event(noti.event));
+ break;
+ }
+ }
+ else if (state == WIFI_DIRECT_STATE_CONNECTED ||
+ state == WIFI_DIRECT_STATE_ACTIVATED ||
+ state == WIFI_DIRECT_STATE_DISCOVERING ||
+ state == WIFI_DIRECT_STATE_GROUP_OWNER)
+ {
+ switch (event)
+ {
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST:
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:
+ case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:
+ {
+ if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST)
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;
+ else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY)
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
+ else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD)
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
+
+ noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
+ WDS_LOGI("g_incomming_peer_mac_address is " MACSTR "\n",
+ MAC2STR(g_incomming_peer_mac_address));
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(g_incomming_peer_mac_address));
+
+ __wfd_server_send_client_event(¬i);
+ wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
+ }
+ break;
+
+ case WFD_EVENT_INVITE_REQUEST:
+ {
+ noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;
+ WDS_LOGD("WIFI_DIRECT_CLI_EVENT_INVITATION_REQ");
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(g_incomming_peer_mac_address));
+ __wfd_server_send_client_event(¬i);
+ }
+ break;
+
+ case WFD_EVENT_SOFTAP_STA_DISASSOC:
+ {
+ if (wfd_oem_is_groupowner() == true)
+ {
+ int count = 0;
+ unsigned char interface_mac[6];
+ wfd_oem_get_disassoc_sta_mac(interface_mac);
+
+ wfd_local_connected_peer_info_t *peer = NULL;
+ peer =
+ wfd_server_get_connected_peer_by_interface_mac(interface_mac);
+ if (peer != NULL)
+ {
+ WDS_LOGI("Peer's Intf MAC: " MACSTR ", Device MAC:" MACSTR " \n",
+ MAC2STR(interface_mac),
+ MAC2STR(peer->peer.mac_address));
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(peer->peer.mac_address));
+ }
+ else
+ {
+ WDS_LOGI("Peer's Intf MAC: " MACSTR ", Device MAC:null \n",
+ MAC2STR(interface_mac));
+ memset(noti.param1, 0, 6);
+ }
+
+ wfd_server_remove_connected_peer_by_interface_mac(interface_mac);
+ wfd_server_reset_connecting_peer();
+
+ wfd_oem_get_connected_peers_count(&count);
+ if (count == 0)
+ {
+ wfd_server->config_data.wps_config =
+ WIFI_DIRECT_WPS_TYPE_PBC;
+ if (wfd_oem_disconnect() == false)
+ WDS_LOGF("Error!!! wfd_oem_disconnect() failed!!..\n");
+ else
+ wfd_server_set_state(WIFI_DIRECT_STATE_DISCONNECTING);
+ }
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
+ __wfd_server_send_client_event(¬i);
+ }
+ else
+ {
+ WDS_LOGF("Error!!! DISASSOC event come..\n");
+ }
+ }
+ break;
+
+ case WFD_EVENT_PRIMARY_IF_DISCONNECTION:
+ WDS_LOGD("Primary interface (wlan0) is down. Just let it up!\n");
+ system("ifconfig wlan0 up");
+ break;
+
+ case WFD_EVENT_CREATE_LINK_CANCEL:
+ {
+ if (state == WIFI_DIRECT_STATE_GROUP_OWNER)
+ {
+ WDS_LOGI("Peer's Dev MAC is " MACSTR "\n",
+ MAC2STR(wfd_server->current_peer.mac_address));
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(wfd_server->current_peer.mac_address));
+
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
+ __wfd_server_send_client_event(¬i);
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+ else
+ {
+ WDS_LOGD("message is ignored [%d] at state=[%d]\n",
+ event, state);
+ }
+ wfd_server_clear_connected_peer();
+
+ }
+ break;
+ case WFD_EVENT_CREATE_LINK_DOWN:
+ {
+ if (state >= WIFI_DIRECT_STATE_CONNECTED)
+ {
+ WDS_LOGI(
+ "Peer's Intf MAC: " MACSTR ", Device MAC:" MACSTR " \n",
+ MAC2STR(wfd_server->connected_peers[0].int_address),
+ MAC2STR(wfd_server->connected_peers[0].peer.mac_address));
+
+ snprintf(noti.param1, sizeof(noti.param1), MACSTR,
+ MAC2STR(wfd_server->connected_peers[0].peer.mac_address));
+
+ wfd_server_clear_connected_peer();
+ wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
+ __wfd_server_send_client_event(¬i);
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+ else
+ {
+ WDS_LOGD(
+ "message is ignored [%d] at state=[%d]\n",
+ event, state);
+ }
+ }
+ break;
+ case WFD_EVENT_DISCOVER_START_80211_SCAN:
+ wfd_server->config_data.listen_only = false;
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
+ __wfd_server_send_client_event(¬i);
+ if (state == WIFI_DIRECT_STATE_ACTIVATED ||
+ state == WIFI_DIRECT_STATE_DISCOVERING)
+ wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);
+ break;
+#if 0
+ case WFD_EVENT_DISCOVER_START_SEARCH_LISTEN:
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN;
+ __wfd_server_send_client_event(¬i);
+ if (state == WIFI_DIRECT_STATE_ACTIVATED ||
+ state == WIFI_DIRECT_STATE_DISCOVERING)
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ break;
+#endif
+
+ case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:
+ wfd_server->config_data.listen_only = true;
+
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;
+ __wfd_server_send_client_event(¬i);
+ if (state == WIFI_DIRECT_STATE_ACTIVATED ||
+ state == WIFI_DIRECT_STATE_DISCOVERING)
+ wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);
+ break;
+
+ case WFD_EVENT_DISCOVER_CANCEL:
+ case WFD_EVENT_DISCOVER_COMPLETE:
+ case WFD_EVENT_DISCOVER_FAIL:
+ wfd_server->config_data.listen_only = false;
+
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
+ __wfd_server_send_client_event(¬i);
+ if (state == WIFI_DIRECT_STATE_ACTIVATED ||
+ state == WIFI_DIRECT_STATE_DISCOVERING)
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ break;
+
+ // TODO: M-Project "find/scan" concept. First time, we start discovery during 30 seconds and then try again discovery with Listen only mode continuosly.
+#if 0
+ case WFD_EVENT_DISCOVER_COMPLETE:
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
+ __wfd_server_send_client_event(¬i);
+ wfd_oem_start_discovery(true, 0);
+ break;
+#endif
+
+ case WFD_EVENT_DISCOVER_FOUND_PEERS:
+ case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:
+ {
+ if (state == WIFI_DIRECT_STATE_CONNECTED)
+ {
+ // Note:
+ // In case of GC, when connected, interface_mac_address is not updated, since scan is stopped.
+ // If scan is started (by user request), then we have changce to get the interface_mac_address.
+ //
+ unsigned char null_mac[6]={0,};
+ if (memcmp(&wfd_server->connected_peers[0].int_address, &null_mac, 6)==0)
+ {
+ wfd_connected_peer_info_s *peer_list = NULL;
+ int peer_num = 0;
+
+ wfd_oem_get_connected_peers_info(&peer_list, &peer_num);
+
+ if (peer_num == 1)
+ {
+ memcpy(&wfd_server->connected_peers[0].int_address,
+ &peer_list[0].intf_mac_address,
+ 6);
+ }
+ else
+ {
+ // Something wrong, and ignore it...
+ }
+ }
+ }
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
+ __wfd_server_send_client_event(¬i);
+ }
+ break;
+
+ case WFD_EVENT_SOFTAP_READY:
+ {
+ noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
+ __wfd_server_send_client_event(¬i);
+ }
+ break;
+
+ case WFD_EVENT_SOFTAP_STOP:
+ {
+ noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
+ __wfd_server_send_client_event(¬i);
+ wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+ break;
+
+ default:
+ WDS_LOGI( "Unprocessed event: state=[%s] event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));
+ break;
+ }
+ }
+
+ __WDS_LOG_FUNC_EXIT__;
+}