2 * Network Configuration Module
\r
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
\r
6 * Licensed under the Apache License, Version 2.0 (the "License");
\r
7 * you may not use this file except in compliance with the License.
\r
8 * You may obtain a copy of the License at
\r
10 * http://www.apache.org/licenses/LICENSE-2.0
\r
12 * Unless required by applicable law or agreed to in writing, software
\r
13 * distributed under the License is distributed on an "AS IS" BASIS,
\r
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
15 * See the License for the specific language governing permissions and
\r
16 * limitations under the License.
\r
24 #include <stdbool.h>
\r
25 #include <sys/types.h>
\r
26 #include <sys/socket.h>
\r
31 #include "wifi-direct-service.h"
\r
32 #include "wifi-direct-event-handler.h"
\r
33 #include "wifi-direct-oem.h"
\r
34 #include "wifi-direct-internal.h"
\r
35 #include "wifi-direct-utils.h"
\r
37 char wfd_event_str[WFD_EVENT_MAX];
\r
39 char *__wfd_print_client_event(wfd_client_event_e event)
\r
43 case WIFI_DIRECT_CLI_EVENT_ACTIVATION:
\r
44 return "ACTIVATION";
\r
45 case WIFI_DIRECT_CLI_EVENT_DEACTIVATION:
\r
46 return "DEACTIVATION";
\r
47 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START:
\r
48 return "DISCOVER_START_80211_SCAN";
\r
49 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY:
\r
50 return "DISCOVER_START_LISTEN_ONLY";
\r
51 case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN:
\r
52 return "DISCOVER_START_SEARCH_LISTEN";
\r
53 case WIFI_DIRECT_CLI_EVENT_DISCOVER_END:
\r
54 return "DISCOVER_END";
\r
55 case WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS:
\r
56 return "DISCOVER_FOUND_PEERS";
\r
57 case WIFI_DIRECT_CLI_EVENT_CONNECTION_START:
\r
58 return "CONNECTION_START";
\r
59 case WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ:
\r
60 return "CONNECTION_REQ";
\r
61 case WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP:
\r
62 return "CONNECTION_RSP";
\r
63 case WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ:
\r
64 return "CONNECTION_WPS_REQ";
\r
65 case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP:
\r
66 return "DISCONNECTION_RSP";
\r
67 case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND:
\r
68 return "DISCONNECTION_IND";
\r
69 case WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP:
\r
70 return "GROUP_CREATE_RSP";
\r
71 case WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP:
\r
72 return "GROUP_DESTROY_RSP";
\r
73 case WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND:
\r
74 return "IP_LEASED_IND";
\r
76 WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);
\r
77 return "INVALID EVENT";
\r
82 char *__wfd_server_print_event(wfd_event_t event)
\r
86 case WFD_EVENT_DISCOVER_START_80211_SCAN:
\r
87 return "DISCOVER_START_80211_SCAN";
\r
88 case WFD_EVENT_DISCOVER_START_SEARCH_LISTEN:
\r
89 return "DISCOVER_START_SEARCH_LISTEN";
\r
90 case WFD_EVENT_DISCOVER_FOUND_PEERS:
\r
91 return "DISCOVER_FOUND_PEERS";
\r
92 case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:
\r
93 return "DISCOVER_FOUND_P2P_GROUPS";
\r
94 case WFD_EVENT_DISCOVER_CANCEL:
\r
95 return "DISCOVER_CANCEL";
\r
96 case WFD_EVENT_DISCOVER_COMPLETE:
\r
97 return "DISCOVER_COMPLETE";
\r
98 case WFD_EVENT_DISCOVER_FAIL:
\r
99 return "DISCOVER_FAIL";
\r
100 case WFD_EVENT_DISCOVER_RESUMED:
\r
101 return "DISCOVER_RESUMED";
\r
102 case WFD_EVENT_DISCOVER_SUSPENDED:
\r
103 return "DISCOVER_SUSPENDED";
\r
104 case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:
\r
105 return "DISCOVER_START_LISTEN_ONLY";
\r
106 case WFD_EVENT_PROV_DISCOVERY_REQUEST:
\r
107 return "PROV_DISCOVERY_REQUEST";
\r
108 case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:
\r
109 return "PROV_DISCOVERY_REQUEST_WPS_DISPLAY";
\r
110 case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:
\r
111 return "PROV_DISCOVERY_REQUEST_WPS_KEYPAD";
\r
112 case WFD_EVENT_PROV_DISCOVERY_RESPONSE:
\r
113 return "PROV_DISCOVERY_RESPONSE";
\r
114 case WFD_EVENT_PROV_DISCOVERY_TIMEOUT:
\r
115 return "PROV_DISCOVERY_TIMEOUT";
\r
116 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_START:
\r
117 return "GROUP_OWNER_NEGOTIATION_START";
\r
118 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_AP_ACK:
\r
119 return "GROUP_OWNER_NEGOTIATION_AP_ACK";
\r
120 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_STA_ACK:
\r
121 return "GROUP_OWNER_NEGOTIATION_STA_ACK";
\r
122 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED:
\r
123 return "GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED";
\r
124 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_COMPLETE:
\r
125 return "GROUP_OWNER_NEGOTIATION_COMPLETE";
\r
126 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:
\r
127 return "GROUP_OWNER_NEGOTIATION_FAIL";
\r
128 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:
\r
129 return "GROUP_OWNER_NEGOTIATION_NO_PROV_INFO";
\r
130 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL:
\r
131 return "GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL";
\r
132 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT:
\r
133 return "GROUP_OWNER_NEGOTIATION_FAIL_INTENT";
\r
134 case WFD_EVENT_CREATE_LINK_START:
\r
135 return "CREATE_LINK_START";
\r
136 case WFD_EVENT_CREATE_LINK_CANCEL:
\r
137 return "CREATE_LINK_CANCEL";
\r
138 case WFD_EVENT_CREATE_LINK_TIMEOUT:
\r
139 return "CREATE_LINK_TIMEOUT";
\r
140 case WFD_EVENT_CREATE_LINK_AUTH_FAIL:
\r
141 return "CREATE_LINK_AUTH_FAIL";
\r
142 case WFD_EVENT_CREATE_LINK_FAIL:
\r
143 return "CREATE_LINK_FAIL";
\r
144 case WFD_EVENT_CREATE_LINK_COMPLETE:
\r
145 return "CREATE_LINK_COMPLETE";
\r
146 case WFD_EVENT_CONNECT_PBC_START:
\r
147 return "CONNECT_PBC_START";
\r
148 case WFD_EVENT_PRIMARY_IF_DISCONNECTION:
\r
149 return "PRIMARY_IF_DISCONNECTION";
\r
150 case WFD_EVENT_SVC_REQ_RECEIVED:
\r
151 return "SVC_REQ_RECEIVED";
\r
152 case WFD_EVENT_SVC_RESP_RECEIVED:
\r
153 return "SVC_RESP_RECEIVED";
\r
154 case WFD_EVENT_SVC_COMEBACK_REQ_RECEIVED:
\r
155 return "SVC_COMEBACK_REQ_RECEIVED";
\r
156 case WFD_EVENT_SVC_COMEBACK_RESP_RECEIVED:
\r
157 return "SVC_COMEBACK_RESP_RECEIVED";
\r
158 case WFD_EVENT_DEV_DISCOVERABILITY_REQ:
\r
159 return "DEV_DISCOVERABILITY_REQ";
\r
160 case WFD_EVENT_DEV_DISCOVERABILITY_RSP:
\r
161 return "DEV_DISCOVERABILITY_RSP";
\r
162 case WFD_EVENT_GO_DISCOVERABILITY_REQ:
\r
163 return "GO_DISCOVERABILITY_REQ";
\r
164 case WFD_EVENT_SOFTAP_READY:
\r
165 return "SOFTAP_READY";
\r
166 case WFD_EVENT_SOFTAP_STOP:
\r
167 return "SOFTAP_STOP";
\r
168 case WFD_EVENT_IP_ASSIGNED:
\r
169 return "IP_ASSIGNED";
\r
170 case WFD_EVENT_IP_LEASED:
\r
171 return "IP_LEASED";
\r
172 case WFD_EVENT_INVITE_REQUEST:
\r
173 return "INVITE_REQUEST";
\r
174 case WFD_EVENT_INVITE_RESPONSE:
\r
175 return "INVITE_RESPONSE";
\r
177 WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);
\r
178 return "INVALID EVENT";
\r
183 void __wfd_server_print_connected_peer()
\r
185 __WDS_LOG_FUNC_ENTER__;
\r
187 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
190 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
192 if (wfd_server->connected_peers[i].isUsed == 0)
\r
194 WDS_LOGD( "Connected Peer[%d] isUsed=[%d]\n", i,
\r
195 wfd_server->connected_peers[i].isUsed);
\r
199 WDS_LOGD( "Connected Peer[%d] isUsed=[%d] dev mac=" MACSTR " intf mac=" MACSTR " ip="IPSTR" device_name=%s\n" ,
\r
201 wfd_server->connected_peers[i].isUsed,
\r
202 MAC2STR(wfd_server->connected_peers[i].peer.mac_address),
\r
203 MAC2STR(wfd_server->connected_peers[i].int_address),
\r
204 IP2STR(wfd_server->connected_peers[i].ip_address),
\r
205 wfd_server->connected_peers[i].peer.device_name
\r
212 bool __wfd_get_ip_address(void *user_data)
\r
214 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
216 if (wfd_oem_dhcpc_get_ip_address(ip_addr, 64, 0) == true)
\r
219 WDS_LOGE( "** Get IP address!!ip = %s\n", ip_addr);
\r
220 wfd_server->dhcp_ip_address_timer = 0;
\r
222 event = WFD_EVENT_IP_ASSIGNED;
\r
223 wfd_server_process_event(event);
\r
228 WDS_LOGE( "** Failed to get IP address!!Wait more...\n");
\r
233 void wfd_server_start_dhcp_wait_timer()
\r
235 __WDS_LOG_FUNC_ENTER__;
\r
236 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
239 //system("killall udhcpc;/usr/bin/udhcpc -i wl0.1 -s /usr/etc/wifi-direct/udhcp_script.non-autoip &");
\r
241 char cmdStr[256] = {0,};
\r
242 char *interface_name = NULL;
\r
244 interface_name = wfd_oem_get_default_interface_name();
\r
245 if (NULL == interface_name)
\r
246 WDS_LOGE( "ERROR : \default interface name is NULL !!!\n");
\r
248 WDS_LOGE( "Interface name is [%s]\n", interface_name);
\r
250 sprintf(cmdStr, "killall udhcpc;/usr/bin/udhcpc -i %s -s /usr/etc/wifi-direct/udhcp_script.non-autoip &", interface_name);
\r
255 system("/usr/bin/wifi-direct-dhcp.sh client");
\r
259 wfd_server->dhcp_ip_address_timer = g_timeout_add(1000, (GSourceFunc) __wfd_get_ip_address, NULL);
\r
262 void wfd_server_cancel_dhcp_wait_timer()
\r
264 __WDS_LOG_FUNC_ENTER__;
\r
266 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
267 if (wfd_server->dhcp_ip_address_timer > 0)
\r
269 g_source_remove(wfd_server->dhcp_ip_address_timer);
\r
270 wfd_server->dhcp_ip_address_timer = 0;
\r
274 WDS_LOGE( "** dhcp_wait_timer is already stopped...\n");
\r
278 void __wfd_server_send_client_event(wifi_direct_client_noti_s * noti)
\r
282 int len = sizeof(wifi_direct_client_noti_s);
\r
284 __WDS_LOG_FUNC_ENTER__;
\r
286 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
287 WDS_LOGI( "__wfd_server_send_client_event(%d, %s)\n",
\r
288 noti->event, __wfd_print_client_event(noti->event));
\r
290 for (i = 0; i < WFD_MAX_CLIENTS; i++)
\r
293 if ((wfd_server->client[i].isUsed == true)
\r
294 && (wfd_server->client[i].client_id > WFD_INVALID_ID)
\r
295 && (wfd_server->client[i].async_sockfd > 0))
\r
297 WDS_LOGD( "Sending event to client[%d]: cid=[%d] sock=[%d] a-sock=[%d], dev_handle=[%d], sourceid=[%d]\n",
\r
299 wfd_server->client[i].client_id,
\r
300 wfd_server->client[i].sync_sockfd,
\r
301 wfd_server->client[i].async_sockfd,
\r
302 wfd_server->client[i].dev_handle,
\r
303 wfd_server->client[i].g_source_id);
\r
305 if (wfd_server_is_fd_writable(wfd_server->client[i].async_sockfd) <= 0)
\r
310 ret = write(wfd_server->client[i].async_sockfd, (char *) noti, len);
\r
313 WDS_LOGF( "Error!!! writing to the socket. Error [%s] \n", strerror(errno));
\r
316 WDS_LOGD( "Event(%s) is Sent to client(id:%d) successfully!!!\n",
\r
317 __wfd_print_client_event(noti->event), wfd_server->client[i].client_id);
\r
323 bool wfd_server_remember_connecting_peer(unsigned char device_mac[6])
\r
325 __WDS_LOG_FUNC_ENTER__;
\r
326 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
327 wfd_discovery_entry_s *peer;
\r
330 status = wfd_oem_get_peer_info(device_mac, &peer);
\r
331 if (status == true)
\r
335 WDS_LOGD( "wfd_oem_get_peer_info() Success\n");
\r
336 memcpy(&wfd_server->current_peer, peer, sizeof(wfd_discovery_entry_s));
\r
338 __wfd_server_print_connected_peer();
\r
340 WDS_LOGD( "peer " MACSTR" go=[%d] connected=[%d] ch=[%d] device_name=[%s]\n",
\r
341 MAC2STR(wfd_server->current_peer.mac_address),
\r
342 wfd_server->current_peer.is_group_owner,
\r
343 wfd_server->current_peer.is_connected,
\r
344 wfd_server->current_peer.channel,
\r
345 wfd_server->current_peer.device_name);
\r
352 WDS_LOGE( "Remember Peer: Error!! can't find peer from the discovery result..\n");
\r
356 bool wfd_server_clear_connected_peer()
\r
358 __WDS_LOG_FUNC_ENTER__;
\r
359 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
361 unsigned char NULL_IP[4] = { 0, 0, 0, 0};
\r
363 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
365 wfd_server->connected_peers[i].isUsed = 0;
\r
366 memcpy(wfd_server->connected_peers[i].ip_address, NULL_IP, 4);
\r
369 wfd_server->connected_peer_count = 0;
\r
371 __wfd_server_print_connected_peer();
\r
376 void wfd_server_reset_connecting_peer()
\r
378 __WDS_LOG_FUNC_ENTER__;
\r
380 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
381 unsigned char NULL_MAC[6] = { 0, 0, 0, 0, 0, 0 };
\r
382 memcpy(wfd_server->current_peer.mac_address, NULL_MAC, 6);
\r
383 __wfd_server_print_connected_peer();
\r
386 void wfd_server_add_connected_peer(wfd_discovery_entry_s* peer, unsigned char interface_mac[6], char* ip_address)
\r
388 __WDS_LOG_FUNC_ENTER__;
\r
389 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
392 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
394 if (wfd_server->connected_peers[i].isUsed == 0)
\r
396 wfd_server->connected_peers[i].isUsed = 1;
\r
397 memcpy(&wfd_server->connected_peers[i].peer, peer, sizeof(wfd_discovery_entry_s));
\r
398 memcpy(wfd_server->connected_peers[i].int_address, interface_mac, 6);
\r
399 wfd_server->connected_peer_count++;
\r
403 __wfd_server_print_connected_peer();
\r
407 void wfd_server_remove_connected_peer(wfd_discovery_entry_s * peer)
\r
409 __WDS_LOG_FUNC_ENTER__;
\r
411 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
414 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
416 if (wfd_server->connected_peers[i].isUsed==1 &&
\r
417 memcmp(wfd_server->connected_peers[i].peer.mac_address, peer->mac_address, 6) == 0 )
\r
419 wfd_server->connected_peers[i].isUsed = 0;
\r
420 wfd_server->connected_peer_count--;
\r
421 memset(&wfd_server->connected_peers[i], 0x00, sizeof(wfd_local_connected_peer_info_t));
\r
425 __wfd_server_print_connected_peer();
\r
428 void wfd_server_remove_connected_peer_by_interface_mac(unsigned char interface_mac[6])
\r
430 __WDS_LOG_FUNC_ENTER__;
\r
432 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
435 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
437 if (wfd_server->connected_peers[i].isUsed==1 &&
\r
438 memcmp(wfd_server->connected_peers[i].int_address, interface_mac, 6) == 0 )
\r
440 wfd_server->connected_peers[i].isUsed = 0;
\r
441 wfd_server->connected_peer_count--;
\r
442 memset(&wfd_server->connected_peers[i], 0x00, sizeof(wfd_local_connected_peer_info_t));
\r
446 __wfd_server_print_connected_peer();
\r
450 int wfd_server_is_connected_peer_by_device_mac(unsigned char device_mac[6])
\r
452 __WDS_LOG_FUNC_ENTER__;
\r
454 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
457 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
459 if (wfd_server->connected_peers[i].isUsed==1 &&
\r
460 memcmp(wfd_server->connected_peers[i].peer.mac_address, device_mac, 6) == 0 )
\r
468 wfd_local_connected_peer_info_t*
\r
469 wfd_server_get_connected_peer_by_device_mac(unsigned char device_mac[6])
\r
471 __WDS_LOG_FUNC_ENTER__;
\r
473 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
476 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
478 if (wfd_server->connected_peers[i].isUsed==1 &&
\r
479 memcmp(wfd_server->connected_peers[i].peer.mac_address, device_mac, 6) == 0 )
\r
481 return &wfd_server->connected_peers[i];
\r
488 wfd_local_connected_peer_info_t*
\r
489 wfd_server_get_connected_peer_by_interface_mac(unsigned char int_mac[6])
\r
491 __WDS_LOG_FUNC_ENTER__;
\r
493 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
496 __wfd_server_print_connected_peer();
\r
498 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
500 if (wfd_server->connected_peers[i].isUsed == 1 &&
\r
501 memcmp(wfd_server->connected_peers[i].int_address, int_mac, 6) == 0)
\r
503 WDS_LOGD( "Found: peer[%d] device_name=[%s] int_mac=["MACSTR"] dev_mac=["MACSTR"] cat=[%d] ip=["IPSTR"]\n",
\r
505 wfd_server->connected_peers[i].peer.device_name,
\r
506 MAC2STR(wfd_server->connected_peers[i].int_address),
\r
507 MAC2STR(wfd_server->connected_peers[i].peer.mac_address),
\r
508 wfd_server->connected_peers[i].peer.category,
\r
509 IP2STR(wfd_server->connected_peers[i].ip_address));
\r
511 return &wfd_server->connected_peers[i];
\r
518 int wfd_server_is_connected_peer_by_interface_mac(unsigned char interface_mac[6])
\r
520 __WDS_LOG_FUNC_ENTER__;
\r
522 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
525 for (i = 0; i < WFD_MAX_ASSOC_STA; i++)
\r
527 if (wfd_server->connected_peers[i].isUsed==1 &&
\r
528 memcmp(wfd_server->connected_peers[i].int_address, interface_mac, 6) == 0 )
\r
537 void wfd_server_process_event(wfd_event_t event)
\r
539 wfd_server_control_t *wfd_server = wfd_server_get_control();
\r
540 wifi_direct_client_noti_s noti;
\r
542 __WDS_LOG_FUNC_ENTER__;
\r
544 memset(¬i, 0, sizeof(wifi_direct_client_noti_s));
\r
546 noti.event = event;
\r
547 noti.error = WIFI_DIRECT_ERROR_NONE;
\r
549 wifi_direct_state_e state = wfd_server_get_state();
\r
551 WDS_LOGI( "state=[%s] process event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));
\r
553 if (state == WIFI_DIRECT_STATE_CONNECTING)
\r
558 //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:
\r
559 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:
\r
561 unsigned char mac[6];
\r
562 wifi_direct_wps_type_e wps_config;
\r
564 wps_config = wfd_server->config_data.wps_config;
\r
566 wfd_oem_get_requestor_mac(mac);
\r
567 if (wfd_oem_connect(mac, wps_config) == true)
\r
573 if (wfd_oem_is_groupowner())
\r
575 wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
\r
579 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
582 snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(mac));
\r
583 wfd_server_reset_connecting_peer();
\r
584 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
\r
585 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
\r
586 __wfd_server_send_client_event(¬i);
\r
591 //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:
\r
592 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:
\r
596 // TODO: Do we need to make it, asynchronously?
\r
597 // Ignore provision discovery timeout, since provision request used syn API.
\r
598 // case WFD_EVENT_PROV_DISCOVERY_TIMEOUT:
\r
601 //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL:
\r
602 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:
\r
603 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT:
\r
604 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT:
\r
605 case WFD_EVENT_WPS_WRONG_PIN:
\r
606 case WFD_EVENT_WPS_TIMEOUT:
\r
607 case WFD_EVENT_WPS_SESSION_OVERLAP:
\r
608 case WFD_EVENT_CREATE_LINK_CANCEL:
\r
609 if (event == WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT) {
\r
610 if (wfd_server->connecting_120) {
\r
611 int wps_config = wfd_server->config_data.wps_config;
\r
613 if (wfd_server->config_data.want_persistent_group == true)
\r
614 wfd_oem_connect_for_persistent_group(wfd_server->current_peer.mac_address, wps_config);
\r
616 wfd_oem_connect(wfd_server->current_peer.mac_address, wps_config);
\r
617 WDS_LOGD("Retry connection with " MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
\r
622 if (wfd_oem_is_groupowner())
\r
624 wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
\r
628 wfd_server_cancel_dhcp_wait_timer();
\r
629 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
631 snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
\r
632 wfd_server_reset_connecting_peer();
\r
633 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
\r
634 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
\r
635 __wfd_server_send_client_event(¬i);
\r
636 //wfd_oem_start_discovery(true, 0);
\r
639 case WFD_EVENT_SOFTAP_FAIL:
\r
640 wfd_server_cancel_dhcp_wait_timer();
\r
641 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
642 wfd_server_reset_connecting_peer();
\r
643 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
\r
644 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
\r
645 __wfd_server_send_client_event(¬i);
\r
648 case WFD_EVENT_CREATE_LINK_TIMEOUT:
\r
649 case WFD_EVENT_CREATE_LINK_AUTH_FAIL:
\r
650 case WFD_EVENT_CREATE_LINK_FAIL:
\r
651 if (wfd_oem_is_groupowner())
\r
653 wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
\r
657 wfd_server_cancel_dhcp_wait_timer();
\r
658 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
660 snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
\r
661 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
\r
662 if (event == WFD_EVENT_CREATE_LINK_TIMEOUT)
\r
663 noti.error = WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT;
\r
664 else if (event == WFD_EVENT_CREATE_LINK_AUTH_FAIL)
\r
665 noti.error = WIFI_DIRECT_ERROR_AUTH_FAILED;
\r
666 else if (event == WFD_EVENT_CREATE_LINK_FAIL)
\r
667 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
\r
668 wfd_server_reset_connecting_peer();
\r
670 if (wfd_oem_is_groupowner() == false)
\r
671 wfd_server_clear_connected_peer();
\r
673 __wfd_server_send_client_event(¬i);
\r
674 //wfd_oem_start_discovery(true, 0);
\r
677 case WFD_EVENT_DISCOVER_COMPLETE:
\r
678 wfd_server->config_data.listen_only = false;
\r
680 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
\r
681 __wfd_server_send_client_event(¬i);
\r
683 // 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
684 //wfd_oem_start_discovery(true, 0);
\r
687 case WFD_EVENT_CREATE_LINK_COMPLETE:
\r
689 if (wfd_oem_is_groupowner())
\r
691 unsigned char intf_mac[6] = {0, };
\r
693 wfd_oem_get_assoc_sta_mac(intf_mac);
\r
695 wfd_server_add_connected_peer(&wfd_server->current_peer,
\r
697 wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
\r
699 wfd_local_connected_peer_info_t *peer = NULL;
\r
701 wfd_server_get_connected_peer_by_interface_mac(intf_mac);
\r
703 "Peer's Intf MAC is " MACSTR "\n",
\r
704 MAC2STR(intf_mac));
\r
709 "Something wrong... Peer's Dev MAC is " MACSTR "\n",
\r
710 MAC2STR(peer->peer.mac_address));
\r
711 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
712 MAC2STR(wfd_server->current_peer.mac_address));
\r
716 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
717 MAC2STR(peer->peer.mac_address));
\r
720 wfd_server_reset_connecting_peer();
\r
722 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
\r
725 __wfd_server_send_client_event(¬i);
\r
729 wfd_connected_peer_info_s *peer_list = NULL;
\r
733 wfd_server_clear_connected_peer();
\r
735 wfd_oem_get_connected_peers_info(&peer_list, &peer_num);
\r
739 wfd_server_add_connected_peer(&wfd_server->current_peer,
\r
740 peer_list[0].intf_mac_address,
\r
745 unsigned char intf_mac[6] = {0, };
\r
747 "Something wrong. peer_num is [%d]\n",
\r
749 wfd_server_add_connected_peer(&wfd_server->current_peer,
\r
754 wfd_server_start_dhcp_wait_timer();
\r
759 case WFD_EVENT_IP_ASSIGNED:
\r
761 // Update peer IP address which is DHCP server IP.
\r
762 char peer_ip_str[20];
\r
763 wfd_get_dhcpc_server_ip(peer_ip_str, 20);
\r
764 inet_aton(peer_ip_str, (struct in_addr*)&wfd_server->connected_peers[0].ip_address);
\r
766 snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
\r
767 wfd_server_reset_connecting_peer();
\r
768 wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTED);
\r
769 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
\r
770 __wfd_server_send_client_event(¬i);
\r
775 case WFD_EVENT_CONNECT_PBC_START:
\r
776 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
\r
779 "g_incomming_peer_mac_address is " MACSTR "\n",
\r
780 MAC2STR(g_incomming_peer_mac_address));
\r
781 //WDS_LOGI( "g_incomming_peer_ssid is [%s]\n", g_incomming_peer_ssid);
\r
782 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
783 MAC2STR(g_incomming_peer_mac_address));
\r
784 //strncpy(noti.param2, g_incomming_peer_ssid, strlen(g_incomming_peer_ssid));
\r
786 __wfd_server_send_client_event(¬i);
\r
789 case WFD_EVENT_PROV_DISCOVERY_REQUEST:
\r
790 if (wfd_oem_is_groupowner())
\r
792 // provision request comes, when we sent 'invite'...
\r
793 wfd_oem_wps_pbc_start(NULL);
\r
797 //Ignore provision request during connecting...
\r
801 case WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY:
\r
802 case WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD:
\r
803 if (event == WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY) {
\r
804 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
\r
805 wfd_oem_connect(g_incomming_peer_mac_address, wfd_server->config_data.wps_config);
\r
807 else if (event == WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD)
\r
808 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
\r
809 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
\r
810 WDS_LOGI("g_incomming_peer_mac_address is [" MACSTR "]\n", MAC2STR(g_incomming_peer_mac_address));
\r
811 snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(g_incomming_peer_mac_address));
\r
812 __wfd_server_send_client_event(¬i);
\r
815 case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:
\r
816 case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:
\r
817 if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY) {
\r
818 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
\r
819 wfd_oem_wps_pin_start(g_incomming_peer_mac_address);
\r
820 } else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD) {
\r
821 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
\r
823 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
\r
824 WDS_LOGI("g_incomming_peer_mac_address is [" MACSTR "]\n", MAC2STR(g_incomming_peer_mac_address));
\r
825 snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(g_incomming_peer_mac_address));
\r
826 __wfd_server_send_client_event(¬i);
\r
830 "Unprocessed event: state=[%s] event= [%s] \n",
\r
831 wfd_print_state(state),
\r
832 __wfd_server_print_event(noti.event));
\r
836 else if (state == WIFI_DIRECT_STATE_DISCONNECTING)
\r
840 case WFD_EVENT_CREATE_LINK_CANCEL:
\r
842 if (wfd_oem_is_groupowner())
\r
844 wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
\r
848 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
851 WDS_LOGI( "Peer's Dev MAC is " MACSTR "\n",
\r
852 MAC2STR(wfd_server->current_peer.mac_address));
\r
853 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
854 MAC2STR(wfd_server->current_peer.mac_address));
\r
856 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
\r
857 wfd_server_reset_connecting_peer();
\r
858 wfd_server_clear_connected_peer();
\r
859 __wfd_server_send_client_event(¬i);
\r
860 //wfd_oem_start_discovery(true, 0);
\r
864 "Unprocessed event: state=[%s] event= [%s] \n",
\r
865 wfd_print_state(state),
\r
866 __wfd_server_print_event(noti.event));
\r
870 else if (state == WIFI_DIRECT_STATE_CONNECTED ||
\r
871 state == WIFI_DIRECT_STATE_ACTIVATED ||
\r
872 state == WIFI_DIRECT_STATE_DISCOVERING ||
\r
873 state == WIFI_DIRECT_STATE_GROUP_OWNER)
\r
877 case WFD_EVENT_PROV_DISCOVERY_REQUEST:
\r
878 case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:
\r
879 case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:
\r
881 if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST)
\r
882 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;
\r
883 else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY)
\r
884 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
\r
885 else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD)
\r
886 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
\r
888 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
\r
889 WDS_LOGI("g_incomming_peer_mac_address is " MACSTR "\n",
\r
890 MAC2STR(g_incomming_peer_mac_address));
\r
891 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
892 MAC2STR(g_incomming_peer_mac_address));
\r
894 __wfd_server_send_client_event(¬i);
\r
895 wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
\r
899 case WFD_EVENT_INVITE_REQUEST:
\r
901 noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;
\r
902 WDS_LOGD("WIFI_DIRECT_CLI_EVENT_INVITATION_REQ");
\r
903 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
904 MAC2STR(g_incomming_peer_mac_address));
\r
905 __wfd_server_send_client_event(¬i);
\r
909 case WFD_EVENT_SOFTAP_STA_DISASSOC:
\r
911 if (wfd_oem_is_groupowner() == true)
\r
914 unsigned char interface_mac[6];
\r
915 wfd_oem_get_disassoc_sta_mac(interface_mac);
\r
917 wfd_local_connected_peer_info_t *peer = NULL;
\r
919 wfd_server_get_connected_peer_by_interface_mac(interface_mac);
\r
922 WDS_LOGI("Peer's Intf MAC: " MACSTR ", Device MAC:" MACSTR " \n",
\r
923 MAC2STR(interface_mac),
\r
924 MAC2STR(peer->peer.mac_address));
\r
925 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
926 MAC2STR(peer->peer.mac_address));
\r
930 WDS_LOGI("Peer's Intf MAC: " MACSTR ", Device MAC:null \n",
\r
931 MAC2STR(interface_mac));
\r
932 memset(noti.param1, 0, 6);
\r
935 wfd_server_remove_connected_peer_by_interface_mac(interface_mac);
\r
936 wfd_server_reset_connecting_peer();
\r
938 wfd_oem_get_connected_peers_count(&count);
\r
941 wfd_server->config_data.wps_config =
\r
942 WIFI_DIRECT_WPS_TYPE_PBC;
\r
943 if (wfd_oem_disconnect() == false)
\r
944 WDS_LOGF("Error!!! wfd_oem_disconnect() failed!!..\n");
\r
946 wfd_server_set_state(WIFI_DIRECT_STATE_DISCONNECTING);
\r
948 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
\r
949 __wfd_server_send_client_event(¬i);
\r
953 WDS_LOGF("Error!!! DISASSOC event come..\n");
\r
958 case WFD_EVENT_PRIMARY_IF_DISCONNECTION:
\r
959 WDS_LOGD("Primary interface (wlan0) is down. Just let it up!\n");
\r
960 system("ifconfig wlan0 up");
\r
963 case WFD_EVENT_CREATE_LINK_CANCEL:
\r
965 if (state == WIFI_DIRECT_STATE_GROUP_OWNER)
\r
967 WDS_LOGI("Peer's Dev MAC is " MACSTR "\n",
\r
968 MAC2STR(wfd_server->current_peer.mac_address));
\r
969 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
970 MAC2STR(wfd_server->current_peer.mac_address));
\r
972 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;
\r
973 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
\r
974 __wfd_server_send_client_event(¬i);
\r
975 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
979 WDS_LOGD("message is ignored [%d] at state=[%d]\n",
\r
982 wfd_server_clear_connected_peer();
\r
986 case WFD_EVENT_CREATE_LINK_DOWN:
\r
988 if (state >= WIFI_DIRECT_STATE_CONNECTED)
\r
991 "Peer's Intf MAC: " MACSTR ", Device MAC:" MACSTR " \n",
\r
992 MAC2STR(wfd_server->connected_peers[0].int_address),
\r
993 MAC2STR(wfd_server->connected_peers[0].peer.mac_address));
\r
995 snprintf(noti.param1, sizeof(noti.param1), MACSTR,
\r
996 MAC2STR(wfd_server->connected_peers[0].peer.mac_address));
\r
998 wfd_server_clear_connected_peer();
\r
999 wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;
\r
1000 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
\r
1001 __wfd_server_send_client_event(¬i);
\r
1002 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
1007 "message is ignored [%d] at state=[%d]\n",
\r
1012 case WFD_EVENT_DISCOVER_START_80211_SCAN:
\r
1013 wfd_server->config_data.listen_only = false;
\r
1014 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
\r
1015 __wfd_server_send_client_event(¬i);
\r
1016 if (state == WIFI_DIRECT_STATE_ACTIVATED ||
\r
1017 state == WIFI_DIRECT_STATE_DISCOVERING)
\r
1018 wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);
\r
1021 case WFD_EVENT_DISCOVER_START_SEARCH_LISTEN:
\r
1022 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN;
\r
1023 __wfd_server_send_client_event(¬i);
\r
1024 if (state == WIFI_DIRECT_STATE_ACTIVATED ||
\r
1025 state == WIFI_DIRECT_STATE_DISCOVERING)
\r
1026 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
1030 case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:
\r
1031 wfd_server->config_data.listen_only = true;
\r
1033 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;
\r
1034 __wfd_server_send_client_event(¬i);
\r
1035 if (state == WIFI_DIRECT_STATE_ACTIVATED ||
\r
1036 state == WIFI_DIRECT_STATE_DISCOVERING)
\r
1037 wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);
\r
1040 case WFD_EVENT_DISCOVER_CANCEL:
\r
1041 case WFD_EVENT_DISCOVER_COMPLETE:
\r
1042 case WFD_EVENT_DISCOVER_FAIL:
\r
1043 wfd_server->config_data.listen_only = false;
\r
1045 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
\r
1046 __wfd_server_send_client_event(¬i);
\r
1047 if (state == WIFI_DIRECT_STATE_ACTIVATED ||
\r
1048 state == WIFI_DIRECT_STATE_DISCOVERING)
\r
1049 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
1052 // 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
1054 case WFD_EVENT_DISCOVER_COMPLETE:
\r
1055 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
\r
1056 __wfd_server_send_client_event(¬i);
\r
1057 wfd_oem_start_discovery(true, 0);
\r
1061 case WFD_EVENT_DISCOVER_FOUND_PEERS:
\r
1062 case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:
\r
1064 if (state == WIFI_DIRECT_STATE_CONNECTED)
\r
1067 // In case of GC, when connected, interface_mac_address is not updated, since scan is stopped.
\r
1068 // If scan is started (by user request), then we have changce to get the interface_mac_address.
\r
1070 unsigned char null_mac[6]={0,};
\r
1071 if (memcmp(&wfd_server->connected_peers[0].int_address, &null_mac, 6)==0)
\r
1073 wfd_connected_peer_info_s *peer_list = NULL;
\r
1076 wfd_oem_get_connected_peers_info(&peer_list, &peer_num);
\r
1078 if (peer_num == 1)
\r
1080 memcpy(&wfd_server->connected_peers[0].int_address,
\r
1081 &peer_list[0].intf_mac_address,
\r
1086 // Something wrong, and ignore it...
\r
1090 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
\r
1091 __wfd_server_send_client_event(¬i);
\r
1095 case WFD_EVENT_SOFTAP_READY:
\r
1097 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
\r
1098 __wfd_server_send_client_event(¬i);
\r
1102 case WFD_EVENT_SOFTAP_STOP:
\r
1104 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
\r
1105 __wfd_server_send_client_event(¬i);
\r
1106 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
\r
1111 WDS_LOGI( "Unprocessed event: state=[%s] event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));
\r
1116 __WDS_LOG_FUNC_EXIT__;
\r