b7a36b94f078a235704bdc45d72867f551f06e1d
[framework/connectivity/wifi-direct-manager.git] / src / wifi-direct-event-handler.c
1 /*\r
2  * Network Configuration Module\r
3  *\r
4  * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
5  *\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
9  *\r
10  * http://www.apache.org/licenses/LICENSE-2.0\r
11  *\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
17  *\r
18  */\r
19 \r
20 #include <errno.h>\r
21 #include <stdio.h>\r
22 #include <stdlib.h>\r
23 #include <string.h>\r
24 #include <stdbool.h>\r
25 #include <sys/types.h>\r
26 #include <sys/socket.h>\r
27 #include <unistd.h>\r
28 \r
29 #include <glib.h>\r
30 \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
36 \r
37 char wfd_event_str[WFD_EVENT_MAX];\r
38 \r
39 char *__wfd_print_client_event(wfd_client_event_e event)\r
40 {\r
41         switch (event)\r
42         {\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
75         default:\r
76                 WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);\r
77                 return "INVALID EVENT";\r
78         }\r
79 }\r
80 \r
81 \r
82 char *__wfd_server_print_event(wfd_event_t event)\r
83 {\r
84         switch (event)\r
85         {\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
176         default:\r
177                 WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);\r
178                 return "INVALID EVENT";\r
179         }\r
180 \r
181 }\r
182 \r
183 void __wfd_server_print_connected_peer()\r
184 {\r
185         __WDS_LOG_FUNC_ENTER__;\r
186 \r
187         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
188         int i;\r
189 \r
190         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
191         {\r
192                 if (wfd_server->connected_peers[i].isUsed == 0)\r
193                 {\r
194                         WDS_LOGD( "Connected Peer[%d] isUsed=[%d]\n", i,\r
195                                                    wfd_server->connected_peers[i].isUsed);\r
196                 }\r
197                 else\r
198                 {\r
199                         WDS_LOGD( "Connected Peer[%d] isUsed=[%d] dev mac=" MACSTR " intf mac=" MACSTR " ip="IPSTR" device_name=%s\n" ,\r
200                                         i,\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
206                         );\r
207                 }\r
208         }\r
209 }\r
210 \r
211 \r
212 bool __wfd_get_ip_address(void *user_data)\r
213 {\r
214         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
215         char ip_addr[64];\r
216         if (wfd_oem_dhcpc_get_ip_address(ip_addr, 64, 0) == true)\r
217         {\r
218                 wfd_event_t event;\r
219                 WDS_LOGE( "** Get IP address!!ip = %s\n", ip_addr);\r
220                 wfd_server->dhcp_ip_address_timer = 0;\r
221 \r
222                 event = WFD_EVENT_IP_ASSIGNED;\r
223                 wfd_server_process_event(event);\r
224                 return false;\r
225         }\r
226         else\r
227         {\r
228                 WDS_LOGE( "** Failed to get IP address!!Wait more...\n");\r
229                 return true;\r
230         }\r
231 }\r
232 \r
233 void wfd_server_start_dhcp_wait_timer()\r
234 {\r
235         __WDS_LOG_FUNC_ENTER__;\r
236         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
237 \r
238 #if 0\r
239         //system("killall udhcpc;/usr/bin/udhcpc -i wl0.1 -s /usr/etc/wifi-direct/udhcp_script.non-autoip &");\r
240 \r
241         char cmdStr[256] = {0,};\r
242         char *interface_name = NULL;\r
243 \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
247         else\r
248                 WDS_LOGE( "Interface name is [%s]\n", interface_name);\r
249 \r
250         sprintf(cmdStr, "killall udhcpc;/usr/bin/udhcpc -i %s -s /usr/etc/wifi-direct/udhcp_script.non-autoip &", interface_name);\r
251         system(cmdStr);\r
252 \r
253 #else\r
254 \r
255         system("/usr/bin/wifi-direct-dhcp.sh client");\r
256 \r
257 #endif\r
258 \r
259         wfd_server->dhcp_ip_address_timer = g_timeout_add(1000, (GSourceFunc) __wfd_get_ip_address, NULL);\r
260 }\r
261 \r
262 void wfd_server_cancel_dhcp_wait_timer()\r
263 {\r
264         __WDS_LOG_FUNC_ENTER__;\r
265 \r
266         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
267         if (wfd_server->dhcp_ip_address_timer > 0)\r
268         {\r
269                 g_source_remove(wfd_server->dhcp_ip_address_timer);\r
270                 wfd_server->dhcp_ip_address_timer = 0;\r
271         }\r
272         else\r
273         {\r
274                 WDS_LOGE( "** dhcp_wait_timer is already stopped...\n");\r
275         }\r
276 }\r
277 \r
278 void __wfd_server_send_client_event(wifi_direct_client_noti_s * noti)\r
279 {\r
280         int i = 0;\r
281         int ret = 0;\r
282         int len = sizeof(wifi_direct_client_noti_s);\r
283 \r
284         __WDS_LOG_FUNC_ENTER__;\r
285 \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
289 \r
290         for (i = 0; i < WFD_MAX_CLIENTS; i++)\r
291         {\r
292                 errno = 0;\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
296                 {\r
297                         WDS_LOGD( "Sending event to client[%d]: cid=[%d] sock=[%d] a-sock=[%d], dev_handle=[%d], sourceid=[%d]\n",\r
298                                         i,\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
304 \r
305                         if (wfd_server_is_fd_writable(wfd_server->client[i].async_sockfd) <= 0)\r
306                         {\r
307                                 continue;\r
308                         }\r
309 \r
310                         ret = write(wfd_server->client[i].async_sockfd, (char *) noti, len);\r
311                         if (ret <= 0)\r
312                         {\r
313                                 WDS_LOGF( "Error!!! writing to the socket. Error [%s] \n", strerror(errno));\r
314                         }\r
315                         else\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
318                 }\r
319         }\r
320 }\r
321 \r
322 \r
323 bool wfd_server_remember_connecting_peer(unsigned char device_mac[6])\r
324 {\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
328         int status;\r
329 \r
330         status = wfd_oem_get_peer_info(device_mac, &peer);\r
331         if (status == true)\r
332         {\r
333                 if (peer != NULL)\r
334                 {\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
337 \r
338                         __wfd_server_print_connected_peer();\r
339                         free(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
346 \r
347                         \r
348                         return true;\r
349                 }\r
350         }\r
351 \r
352         WDS_LOGE( "Remember Peer: Error!! can't find peer from the discovery result..\n");\r
353         return false;\r
354 }\r
355 \r
356 bool wfd_server_clear_connected_peer()\r
357 {\r
358         __WDS_LOG_FUNC_ENTER__;\r
359         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
360         int i;\r
361         unsigned char NULL_IP[4] = { 0, 0, 0, 0};\r
362 \r
363         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
364         {\r
365                 wfd_server->connected_peers[i].isUsed = 0;\r
366                 memcpy(wfd_server->connected_peers[i].ip_address, NULL_IP, 4);\r
367         }\r
368 \r
369         wfd_server->connected_peer_count = 0;\r
370                 \r
371         __wfd_server_print_connected_peer();\r
372         return true;\r
373 }\r
374 \r
375 \r
376 void wfd_server_reset_connecting_peer()\r
377 {\r
378         __WDS_LOG_FUNC_ENTER__;\r
379 \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
384 }\r
385 \r
386 void wfd_server_add_connected_peer(wfd_discovery_entry_s* peer, unsigned char interface_mac[6], char* ip_address)\r
387 {\r
388         __WDS_LOG_FUNC_ENTER__;\r
389         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
390         int i;\r
391 \r
392         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
393         {\r
394                 if (wfd_server->connected_peers[i].isUsed == 0)\r
395                 {\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
400                         break;\r
401                 }\r
402         }\r
403         __wfd_server_print_connected_peer();\r
404 \r
405 }\r
406 \r
407 void wfd_server_remove_connected_peer(wfd_discovery_entry_s * peer)\r
408 {\r
409         __WDS_LOG_FUNC_ENTER__;\r
410 \r
411         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
412         int i;\r
413 \r
414         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
415         {\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
418                 {\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
422                         break;\r
423                 }\r
424         }\r
425         __wfd_server_print_connected_peer();\r
426 }\r
427 \r
428 void wfd_server_remove_connected_peer_by_interface_mac(unsigned char interface_mac[6])\r
429 {\r
430         __WDS_LOG_FUNC_ENTER__;\r
431 \r
432         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
433         int i;\r
434 \r
435         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
436         {\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
439                 {\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
443                         break;\r
444                 }\r
445         }\r
446         __wfd_server_print_connected_peer();\r
447 }\r
448 \r
449 \r
450 int wfd_server_is_connected_peer_by_device_mac(unsigned char device_mac[6])\r
451 {\r
452         __WDS_LOG_FUNC_ENTER__;\r
453 \r
454         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
455         int i;\r
456 \r
457         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
458         {\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
461                 {\r
462                         return true;\r
463                 }\r
464         }\r
465         return false;\r
466 }\r
467 \r
468 wfd_local_connected_peer_info_t* \r
469 wfd_server_get_connected_peer_by_device_mac(unsigned char device_mac[6])\r
470 {\r
471         __WDS_LOG_FUNC_ENTER__;\r
472 \r
473         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
474         int i;\r
475 \r
476         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
477         {\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
480                 {\r
481                         return &wfd_server->connected_peers[i];\r
482                 }\r
483         }\r
484         return NULL;\r
485 }\r
486 \r
487 \r
488 wfd_local_connected_peer_info_t* \r
489 wfd_server_get_connected_peer_by_interface_mac(unsigned char int_mac[6])\r
490 {\r
491         __WDS_LOG_FUNC_ENTER__;\r
492 \r
493         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
494         int i;\r
495 \r
496         __wfd_server_print_connected_peer();\r
497 \r
498         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
499         {\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
502                 {\r
503                         WDS_LOGD( "Found: peer[%d] device_name=[%s] int_mac=["MACSTR"] dev_mac=["MACSTR"] cat=[%d] ip=["IPSTR"]\n",\r
504                                         i,\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
510 \r
511                         return &wfd_server->connected_peers[i];\r
512                 }\r
513         }\r
514         return NULL;\r
515 }\r
516 \r
517 \r
518 int wfd_server_is_connected_peer_by_interface_mac(unsigned char interface_mac[6])\r
519 {\r
520         __WDS_LOG_FUNC_ENTER__;\r
521 \r
522         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
523         int i;\r
524 \r
525         for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
526         {\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
529                 {\r
530                         return true;\r
531                 }\r
532         }\r
533         return false;\r
534 }\r
535 \r
536 \r
537 void wfd_server_process_event(wfd_event_t event)\r
538 {\r
539         wfd_server_control_t *wfd_server = wfd_server_get_control();\r
540         wifi_direct_client_noti_s noti;\r
541 \r
542         __WDS_LOG_FUNC_ENTER__;\r
543 \r
544         memset(&noti, 0, sizeof(wifi_direct_client_noti_s));\r
545 \r
546         noti.event = event;\r
547         noti.error = WIFI_DIRECT_ERROR_NONE;\r
548 \r
549         wifi_direct_state_e state = wfd_server_get_state();\r
550 \r
551         WDS_LOGI( "state=[%s] process event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));\r
552 \r
553         if (state == WIFI_DIRECT_STATE_CONNECTING)\r
554         {\r
555                 switch (event)\r
556                 {\r
557 #if 1\r
558                 //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:\r
559                 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:\r
560                 {\r
561                         unsigned char mac[6];\r
562                         wifi_direct_wps_type_e  wps_config;\r
563                 \r
564                         wps_config = wfd_server->config_data.wps_config;\r
565                         \r
566                         wfd_oem_get_requestor_mac(mac);\r
567                         if (wfd_oem_connect(mac, wps_config) == true)\r
568                         {\r
569                                 return;\r
570                         }\r
571                         else\r
572                         {\r
573                                 if (wfd_oem_is_groupowner())\r
574                                 {\r
575                                         wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
576                                 }\r
577                                 else\r
578                                 {\r
579                                         wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
580                                 }\r
581                                 \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(&noti);\r
587                         }\r
588                 }\r
589                 break;\r
590 #else\r
591                         //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:\r
592                 case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:\r
593                         // fall down\r
594 #endif\r
595 \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
599 \r
600                         // Fail cases\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
612 \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
615                                         else\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
618                                         break;\r
619                                 }\r
620                         }\r
621 \r
622                         if (wfd_oem_is_groupowner())\r
623                         {\r
624                                 wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
625                         }\r
626                         else\r
627                         {\r
628                                 wfd_server_cancel_dhcp_wait_timer();\r
629                                 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
630                         }\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(&noti);\r
636                         //wfd_oem_start_discovery(true, 0);\r
637                         break;\r
638 \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(&noti);\r
646                         break;\r
647 \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
652                         {\r
653                                 wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
654                         }\r
655                         else\r
656                         {\r
657                                 wfd_server_cancel_dhcp_wait_timer();\r
658                                 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
659                         }\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
669 \r
670                         if (wfd_oem_is_groupowner() == false)\r
671                                 wfd_server_clear_connected_peer();\r
672 \r
673                         __wfd_server_send_client_event(&noti);\r
674                         //wfd_oem_start_discovery(true, 0);\r
675                         break;\r
676 \r
677                 case WFD_EVENT_DISCOVER_COMPLETE:\r
678                         wfd_server->config_data.listen_only = false;\r
679 \r
680                         noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
681                         __wfd_server_send_client_event(&noti);\r
682 \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
685                         break;\r
686 \r
687                 case WFD_EVENT_CREATE_LINK_COMPLETE:\r
688                         {\r
689                                 if (wfd_oem_is_groupowner())\r
690                                 {\r
691                                         unsigned char intf_mac[6] = {0, };\r
692 \r
693                                         wfd_oem_get_assoc_sta_mac(intf_mac);\r
694                                         \r
695                                         wfd_server_add_connected_peer(&wfd_server->current_peer,\r
696                                                                                                   intf_mac, NULL);\r
697                                         wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
698 \r
699                                         wfd_local_connected_peer_info_t *peer = NULL;\r
700                                         peer =\r
701                                                 wfd_server_get_connected_peer_by_interface_mac(intf_mac);\r
702                                         WDS_LOGI(\r
703                                                                    "Peer's Intf MAC is " MACSTR "\n",\r
704                                                                    MAC2STR(intf_mac));\r
705 \r
706                                         if (peer == NULL)\r
707                                         {\r
708                                                 WDS_LOGI(\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
713                                         }\r
714                                         else\r
715                                         {\r
716                                                 snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
717                                                                  MAC2STR(peer->peer.mac_address));\r
718                                         }\r
719 \r
720                                         wfd_server_reset_connecting_peer();\r
721 \r
722                                         noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
723 \r
724 \r
725                                         __wfd_server_send_client_event(&noti);\r
726                                 }\r
727                                 else\r
728                                 {\r
729                                         wfd_connected_peer_info_s *peer_list = NULL;\r
730 \r
731                                         int peer_num = 0;\r
732 \r
733                                         wfd_server_clear_connected_peer();\r
734 \r
735                                         wfd_oem_get_connected_peers_info(&peer_list, &peer_num);\r
736 \r
737                                         if (peer_num == 1)\r
738                                         {\r
739                                                 wfd_server_add_connected_peer(&wfd_server->current_peer,\r
740                                                                           peer_list[0].intf_mac_address,\r
741                                                                           NULL);\r
742                                         }\r
743                                         else\r
744                                         {\r
745                                                 unsigned char intf_mac[6] = {0, };\r
746                                                 WDS_LOGI(\r
747                                                                            "Something wrong. peer_num is [%d]\n",\r
748                                                                            peer_num);\r
749                                                 wfd_server_add_connected_peer(&wfd_server->current_peer,\r
750                                                                                 intf_mac,\r
751                                                                                 NULL);\r
752                                         }\r
753 \r
754                                         wfd_server_start_dhcp_wait_timer();\r
755                                 }\r
756                         }\r
757                         break;\r
758 \r
759                 case WFD_EVENT_IP_ASSIGNED:\r
760                 {\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
765 \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(&noti);\r
771 \r
772                         }\r
773                         break;\r
774 \r
775                 case WFD_EVENT_CONNECT_PBC_START:\r
776                         noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;\r
777 \r
778                         WDS_LOGI(\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
785 \r
786                         __wfd_server_send_client_event(&noti);\r
787                         break;\r
788 \r
789                 case WFD_EVENT_PROV_DISCOVERY_REQUEST:\r
790                         if (wfd_oem_is_groupowner())\r
791                         {\r
792                                 // provision request comes, when we sent 'invite'...\r
793                                 wfd_oem_wps_pbc_start(NULL);\r
794                         }\r
795                         else\r
796                         {\r
797                                 //Ignore provision request during connecting...\r
798                         }\r
799                         break;\r
800 \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
806                         }\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(&noti);\r
813                         break;\r
814 \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
822                         }\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(&noti);\r
827                 break;\r
828                 default:\r
829                         WDS_LOGI(\r
830                                                    "Unprocessed event: state=[%s] event= [%s] \n",\r
831                                                    wfd_print_state(state),\r
832                                                    __wfd_server_print_event(noti.event));\r
833                         break;\r
834                 }\r
835         }\r
836         else if (state == WIFI_DIRECT_STATE_DISCONNECTING)\r
837         {\r
838                 switch (event)\r
839                 {\r
840                 case WFD_EVENT_CREATE_LINK_CANCEL:\r
841 \r
842                         if (wfd_oem_is_groupowner())\r
843                         {\r
844                                 wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
845                         }\r
846                         else\r
847                         {\r
848                                 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
849                         }\r
850 \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
855 \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(&noti);\r
860                         //wfd_oem_start_discovery(true, 0);\r
861                         break;\r
862                 default:\r
863                         WDS_LOGI(\r
864                                                    "Unprocessed event: state=[%s] event= [%s] \n",\r
865                                                    wfd_print_state(state),\r
866                                                    __wfd_server_print_event(noti.event));\r
867                         break;\r
868                 }\r
869         }\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
874         {\r
875                 switch (event)\r
876                 {\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
880                         {\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
887 \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
893 \r
894                                 __wfd_server_send_client_event(&noti);\r
895                                 wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);\r
896                         }\r
897                         break;\r
898 \r
899                 case WFD_EVENT_INVITE_REQUEST:\r
900                         {\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(&noti);\r
906                         }\r
907                         break;\r
908 \r
909                 case WFD_EVENT_SOFTAP_STA_DISASSOC:\r
910                         {\r
911                                 if (wfd_oem_is_groupowner() == true)\r
912                                 {\r
913                                         int count = 0;\r
914                                         unsigned char interface_mac[6];\r
915                                         wfd_oem_get_disassoc_sta_mac(interface_mac);\r
916 \r
917                                         wfd_local_connected_peer_info_t *peer = NULL;\r
918                                         peer =\r
919                                                 wfd_server_get_connected_peer_by_interface_mac(interface_mac);\r
920                                         if (peer != NULL)\r
921                                         {\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
927                                         }\r
928                                         else\r
929                                         {\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
933                                         }\r
934 \r
935                                         wfd_server_remove_connected_peer_by_interface_mac(interface_mac);\r
936                                         wfd_server_reset_connecting_peer();\r
937 \r
938                                         wfd_oem_get_connected_peers_count(&count);\r
939                                         if (count == 0)\r
940                                         {\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
945                                                 else\r
946                                                         wfd_server_set_state(WIFI_DIRECT_STATE_DISCONNECTING);\r
947                                         }\r
948                                         noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;\r
949                                         __wfd_server_send_client_event(&noti);\r
950                                 }\r
951                                 else\r
952                                 {\r
953                                         WDS_LOGF("Error!!! DISASSOC event come..\n");\r
954                                 }\r
955                         }\r
956                         break;\r
957 \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
961                         break;\r
962 \r
963                 case WFD_EVENT_CREATE_LINK_CANCEL:\r
964                         {\r
965                                 if (state == WIFI_DIRECT_STATE_GROUP_OWNER)\r
966                                 {\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
971 \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(&noti);\r
975                                         wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
976                                 }\r
977                                 else\r
978                                 {\r
979                                         WDS_LOGD("message is ignored [%d] at state=[%d]\n",\r
980                                                                 event, state);\r
981                                 }\r
982                                 wfd_server_clear_connected_peer();\r
983 \r
984                         }\r
985                         break;\r
986                 case WFD_EVENT_CREATE_LINK_DOWN:\r
987                         {\r
988                                 if (state >= WIFI_DIRECT_STATE_CONNECTED)\r
989                                 {\r
990                                         WDS_LOGI(\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
994 \r
995                                         snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
996                                                          MAC2STR(wfd_server->connected_peers[0].peer.mac_address));\r
997 \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(&noti);\r
1002                                         wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
1003                                 }\r
1004                                 else\r
1005                                 {\r
1006                                         WDS_LOGD(\r
1007                                                                    "message is ignored [%d] at state=[%d]\n",\r
1008                                                                    event, state);\r
1009                                 }\r
1010                         }\r
1011                         break;\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(&noti);\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
1019                         break;\r
1020 #if 0\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(&noti);\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
1027                         break;\r
1028 #endif\r
1029 \r
1030                 case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:\r
1031                         wfd_server->config_data.listen_only = true;\r
1032                 \r
1033                         noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;\r
1034                         __wfd_server_send_client_event(&noti);\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
1038                         break;\r
1039 \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
1044                 \r
1045                         noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
1046                         __wfd_server_send_client_event(&noti);\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
1050                         break;\r
1051 \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
1053 #if 0\r
1054                 case WFD_EVENT_DISCOVER_COMPLETE:\r
1055                         noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
1056                         __wfd_server_send_client_event(&noti);\r
1057                         wfd_oem_start_discovery(true, 0);\r
1058                         break;\r
1059 #endif\r
1060 \r
1061                 case WFD_EVENT_DISCOVER_FOUND_PEERS:\r
1062                 case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:\r
1063                         {\r
1064                                 if (state == WIFI_DIRECT_STATE_CONNECTED)\r
1065                                 {\r
1066                                         // Note:\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
1069                                         //\r
1070                                         unsigned char null_mac[6]={0,};\r
1071                                         if (memcmp(&wfd_server->connected_peers[0].int_address, &null_mac, 6)==0)\r
1072                                         {\r
1073                                                 wfd_connected_peer_info_s *peer_list = NULL;\r
1074                                                 int peer_num = 0;\r
1075 \r
1076                                                 wfd_oem_get_connected_peers_info(&peer_list, &peer_num);\r
1077 \r
1078                                                 if (peer_num == 1)\r
1079                                                 {\r
1080                                                         memcpy(&wfd_server->connected_peers[0].int_address,\r
1081                                                                         &peer_list[0].intf_mac_address,\r
1082                                                                         6);\r
1083                                                 }\r
1084                                                 else\r
1085                                                 {\r
1086                                                         // Something wrong, and ignore it...\r
1087                                                 }\r
1088                                         }\r
1089                                 }\r
1090                                 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;\r
1091                                 __wfd_server_send_client_event(&noti);\r
1092                         }\r
1093                         break;\r
1094 \r
1095                 case WFD_EVENT_SOFTAP_READY:\r
1096                         {\r
1097                                 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;\r
1098                                 __wfd_server_send_client_event(&noti);\r
1099                         }\r
1100                         break;\r
1101 \r
1102                 case WFD_EVENT_SOFTAP_STOP:\r
1103                         {\r
1104                                 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;\r
1105                                 __wfd_server_send_client_event(&noti);\r
1106                                 wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
1107                         }\r
1108                         break;\r
1109 \r
1110                 default:\r
1111                         WDS_LOGI( "Unprocessed event: state=[%s] event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));\r
1112                         break;\r
1113                 }\r
1114         }\r
1115 \r
1116         __WDS_LOG_FUNC_EXIT__;\r
1117 }\r