2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct event functions.
23 * @file wifi-direct-event.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
37 #include <wifi-direct-internal.h>
39 #include "wifi-direct-manager.h"
40 #include "wifi-direct-oem.h"
41 #include "wifi-direct-peer.h"
42 #include "wifi-direct-group.h"
43 #include "wifi-direct-session.h"
44 #include "wifi-direct-event.h"
45 #include "wifi-direct-client.h"
46 #include "wifi-direct-state.h"
47 #include "wifi-direct-util.h"
50 static int _wfd_event_check_socket(int sock)
56 p_fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL;
57 res = poll((struct pollfd *) &p_fd, 1, 1);
60 WDS_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
62 } else if (res == 0) {
63 WDS_LOGD( "poll timeout. socket is busy\n");
67 if (p_fd.revents & POLLERR) {
68 WDS_LOGE("Error! POLLERR from socket[%d]", sock);
70 } else if (p_fd.revents & POLLHUP) {
71 WDS_LOGE("Error! POLLHUP from socket[%d]", sock);
73 } else if (p_fd.revents & POLLNVAL) {
74 WDS_LOGE("Error! POLLNVAL from socket[%d]", sock);
76 } else if (p_fd.revents & POLLIN) {
77 WDS_LOGD("POLLIN from socket [%d]", sock);
79 } else if (p_fd.revents & POLLOUT) {
80 WDS_LOGD("POLLOUT from socket [%d]", sock);
85 WDS_LOGD("Unknown poll event [%d]", p_fd.revents);
89 static int _wfd_event_send_to_client(int sock, char *data, int data_len)
91 __WDS_LOG_FUNC_ENTER__;
93 int left_len = data_len;
97 if (sock < SOCK_FD_MIN || !data || data_len < 0) {
98 WDS_LOGE("Invalid parameter");
99 __WDS_LOG_FUNC_EXIT__;
103 res = _wfd_event_check_socket(sock);
105 WDS_LOGE("Socket error");
107 } else if (res > 0) {
108 WDS_LOGE("Socket is busy");
114 wbytes = write(sock, ptr, left_len);
116 WDS_LOGE("Failed to write data into socket[%d]. [%s]", sock, strerror(errno));
118 }else if (wbytes < left_len) {
119 WDS_LOGD("%d bytes left. Continue sending...", left_len - wbytes);
122 } else if (wbytes == left_len) {
123 WDS_LOGD("Succeeded to write data[%d bytes] into socket [%d]", wbytes, sock);
126 WDS_LOGE("Unknown error occurred. [%s]", strerror(errno));
131 __WDS_LOG_FUNC_EXIT__;
138 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
140 __WDS_LOG_FUNC_ENTER__;
141 wfd_device_s *peer = NULL;
143 if (!manager || !data) {
144 WDS_LOGE("Invalid parameter");
148 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
150 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
152 WDS_LOGE("Failed to add peer");
156 if (strcmp(peer->dev_name, data->name)) {
157 strncpy(peer->dev_name, data->name, DEV_NAME_LEN);
158 peer->dev_name[DEV_NAME_LEN] = '\0';
159 WDS_LOGD("Device name is changed [" MACSTR ": %s]", MAC2STR(peer->dev_addr), peer->dev_name);
162 memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
163 peer->pri_dev_type = data->pri_dev_type;
164 peer->sec_dev_type = data->sec_dev_type;
165 peer->config_methods = data->config_methods;
166 peer->dev_flags = data->dev_flags;
167 peer->group_flags = data->group_flags;
168 peer->dev_role = data->dev_role;
170 if(!peer->wifi_display)
171 peer->wifi_display = calloc(1, sizeof(wfd_display_info_s));
172 memcpy(peer->wifi_display, &data->wifi_display, sizeof(wfd_display_info_s));
175 gettimeofday(&tval, NULL);
176 peer->time = tval.tv_sec;
178 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
180 __WDS_LOG_FUNC_EXIT__;
184 static int hex2num(const char c)
186 if (c >= '0' && c <= '9')
188 if (c >= 'a' && c <= 'f')
190 if (c >= 'A' && c <= 'F')
195 static int hex2byte(const char *hex)
207 int hexstr2bin(const char *hex, int len, char *buf)
211 const char *ipos = hex;
214 for (i = 0; i < len; i++) {
224 static int _wfd_get_stlv_len(const char* value)
227 a = hex2byte(value +2);
230 if( a >= 0 && b >= 0)
231 return ( a << 8) | b;
236 static int _wfd_service_add(wfd_device_s *device, wifi_direct_service_type_e type, char *data)
238 __WDS_LOG_FUNC_ENTER__;
239 wfd_service_s *service = NULL;
243 temp = g_list_first(device->services);
245 service = temp->data;
247 if(type == service->service_type &&
248 !strcmp(data, service->service_string))
250 WDS_LOGD("Service found");
253 temp = g_list_next(temp);
258 WDS_LOGE("service already exist");
260 __WDS_LOG_FUNC_EXIT__;
263 service = (wfd_service_s*) calloc(1, sizeof(wfd_service_s));
264 service->service_string = data;
265 service->service_str_length = strlen(data);
266 service->service_type = type;
267 device->services = g_list_prepend(device->services, service);
269 __WDS_LOG_FUNC_EXIT__;
273 static int _wfd_update_service(wfd_device_s *peer, char * data, wifi_direct_service_type_e type, int length)
275 wfd_service_s * service;
280 if (!peer || !data) {
281 WDS_LOGE("Invalid parameter");
286 case WIFI_DIRECT_SERVICE_BONJOUR:
288 temp = strndup(data, length*2);
289 res = _wfd_service_add(peer, type, temp);
292 case WIFI_DIRECT_SERVICE_UPNP:
294 temp = calloc(1, length);
295 hexstr2bin(data +2, length - 1, temp);
296 temp[length - 1] = '\0';
298 ptr = strtok(temp, ",");
302 res = _wfd_service_add(peer, type, strndup(ptr, strlen(ptr)));
303 ptr = strtok(NULL, ",");
310 case WIFI_DIRECT_SERVICE_VENDORSPEC:
312 temp = calloc(1, length + 1);
313 hexstr2bin(data, length, temp);
316 res = _wfd_service_add(peer, type, temp);
328 static int _wfd_event_update_service(wfd_manager_s *manager, wfd_device_s *peer, char *data)
330 __WDS_LOG_FUNC_ENTER__;
335 wifi_direct_service_type_e service_tlv_type;
338 if (!peer || !data) {
339 WDS_LOGE("Invalid parameter");
342 end = data + strlen(data);
344 while(pos <= end -10){// This is raw data that is not passed any exception handling ex> length, value, ...
346 s_len = _wfd_get_stlv_len(pos);
348 if (pos + s_len*2 > end || s_len < 3) {
349 WDS_LOGD("Unexpected Response Data or length: %d", s_len);
353 service_tlv_type = hex2byte(pos);
354 if (service_tlv_type < 0) {
355 WDS_LOGD("Unexpected Response service type: %d", service_tlv_type);
358 }else if (service_tlv_type == 255)
359 service_tlv_type = WIFI_DIRECT_SERVICE_VENDORSPEC;
362 status = hex2byte(pos);
367 res = _wfd_update_service(peer, pos, service_tlv_type, s_len -3);
369 WDS_LOGE("Invalid type");
372 WDS_LOGD("Service Reaponse TLV status is not vaild status: %d", status);
375 __WDS_LOG_FUNC_EXIT__;
379 int wfd_process_event(void *user_data, void *data)
381 __WDS_LOG_FUNC_ENTER__;
382 wfd_manager_s *manager = (wfd_manager_s*) user_data;
383 wfd_oem_event_s *event = (wfd_oem_event_s*) data;
386 if (!manager || !event) {
387 WDS_LOGE("Invalid parameter");
391 WDS_LOGD("Event[%d] from " MACSTR, event->event_id, MAC2STR(event->dev_addr));
393 switch (event->event_id) {
394 case WFD_OEM_EVENT_DEACTIVATED:
395 manager->req_wps_mode = WFD_WPS_MODE_PBC;
397 case WFD_OEM_EVENT_PEER_FOUND:
399 wfd_oem_dev_data_s *edata = (wfd_oem_dev_data_s*) event->edata;
400 res = _wfd_event_update_peer(manager, edata);
402 WDS_LOGE("Failed to update peer data");
406 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
407 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
408 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
409 wifi_direct_client_noti_s noti;
410 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
411 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
412 noti.error = WIFI_DIRECT_ERROR_NONE;
413 wfd_client_send_event(manager, ¬i);
417 case WFD_OEM_EVENT_PROV_DISC_REQ:
418 case WFD_OEM_EVENT_PROV_DISC_RESP:
420 wfd_group_s *group = (wfd_group_s*) manager->group;
421 if ((group && group->member_count >= manager->max_station) ||
422 (wfd_manager_access_control(manager, event->dev_addr) == WFD_DEV_DENIED)) {
423 WDS_LOGD("Provision discovery is not granted");
427 wfd_device_s *peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
429 WDS_LOGD("Porv_disc from unknown peer. Add new peer");
430 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
432 WDS_LOGE("Failed to add peer for invitation");
435 peer->state = WFD_PEER_STATE_CONNECTING;
436 wfd_update_peer(manager, peer);
438 wfd_update_peer_time(manager, event->dev_addr);
440 res = wfd_session_process_event(manager, event);
442 WDS_LOGE("Failed to process event of session");
447 case WFD_OEM_EVENT_PEER_DISAPPEARED:
449 wfd_remove_peer(manager, event->dev_addr);
450 wifi_direct_client_noti_s noti;
451 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
452 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
453 noti.error = WIFI_DIRECT_ERROR_NONE;
454 wfd_client_send_event(manager, ¬i);
457 case WFD_OEM_EVENT_DISCOVERY_FINISHED:
459 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
460 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
461 WDS_LOGE("Notify finding stoped when discovering or activated. [%d]", manager->state);
465 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
466 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
467 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
469 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
470 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
472 manager->scan_mode = WFD_SCAN_MODE_NONE;
474 wifi_direct_client_noti_s noti;
475 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
476 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
477 noti.error = WIFI_DIRECT_ERROR_NONE;
478 wfd_client_send_event(manager, ¬i);
481 case WFD_OEM_EVENT_INVITATION_REQ:
483 wfd_dev_connection_flag_e flag = 0;
484 flag = wfd_manager_access_control(manager, event->dev_addr);
485 if (flag == WFD_DEV_DENIED) {
486 WDS_LOGD("Invitation request is not granted");
489 wfd_device_s *peer = NULL;
490 wfd_session_s *session = NULL;
491 wfd_oem_invite_data_s *edata = (wfd_oem_invite_data_s*) event->edata;
493 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
495 WDS_LOGD("Invitation from unknown peer. Add new peer");
496 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
498 WDS_LOGE("Failed to add peer for invitation");
502 peer->dev_role = WFD_DEV_ROLE_GO;
503 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
504 wfd_update_peer_time(manager, event->dev_addr);
506 session = wfd_create_session(manager, event->dev_addr,
507 manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
509 WDS_LOGE("Failed to create session");
512 session->type = SESSION_TYPE_INVITE;
513 wfd_session_timer(session, 1);
515 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
516 if(flag == WFD_DEV_UNKNOWN)
518 WDS_LOGD("device is not in access/deny list");
519 wifi_direct_client_noti_s noti;
520 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
521 noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;
522 noti.error = WIFI_DIRECT_ERROR_NONE;
523 snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
524 wfd_client_send_event(manager, ¬i);
526 WDS_LOGD("device is allowed");
527 wfd_session_start(session);
531 case WFD_OEM_EVENT_GO_NEG_REQ:
533 if (wfd_manager_access_control(manager, event->dev_addr) == WFD_DEV_DENIED) {
534 WDS_LOGD("GO negotiation is not granted");
538 case WFD_OEM_EVENT_GO_NEG_DONE:
539 case WFD_OEM_EVENT_WPS_DONE:
540 wfd_session_process_event(manager, event);
542 case WFD_OEM_EVENT_CONNECTED:
543 case WFD_OEM_EVENT_STA_CONNECTED:
545 // FIXME: Move this code to plugin
546 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
547 WDS_LOGD("Ignore this event");
551 if(wfd_manager_find_connected_peer(manager, event->intf_addr)) {
552 WDS_LOGD("Ignore this event");
556 wfd_session_s *session = (wfd_session_s*) manager->session;
558 WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]",
559 MAC2STR(event->dev_addr));
560 wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
561 wfd_destroy_group(manager, GROUP_IFNAME);
562 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
563 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
567 wfd_device_s *peer = wfd_session_get_peer(session);
569 WDS_LOGE("Peer not found");
573 wfd_group_s *group = (wfd_group_s*) manager->group;
575 group = wfd_create_pending_group(manager, event->intf_addr);
577 WDS_LOGE("Failed to create pending group");
580 manager->group = group;
582 wfd_group_add_member(group, peer->dev_addr);
584 session->state = SESSION_STATE_COMPLETED;
585 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
586 peer->state = WFD_PEER_STATE_CONNECTED;
588 if (event->event_id == WFD_OEM_EVENT_STA_CONNECTED) { // GO
589 wifi_direct_client_noti_s noti;
590 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
591 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
592 noti.error = WIFI_DIRECT_ERROR_NONE;
593 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
594 wfd_client_send_event(manager, ¬i);
596 wfd_util_dhcps_wait_ip_leased(peer);
597 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
598 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
599 wfd_destroy_session(manager);
603 case WFD_OEM_EVENT_DISCONNECTED:
604 case WFD_OEM_EVENT_STA_DISCONNECTED:
606 wfd_group_s *group = (wfd_group_s*) manager->group;
607 wfd_session_s *session = (wfd_session_s*) manager->session;
608 wfd_device_s *peer = NULL;
609 unsigned char peer_addr[MACADDR_LEN] = {0, };
610 wifi_direct_client_noti_s noti;
611 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
613 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
615 WDS_LOGE("Failed to find connected peer");
616 peer = wfd_session_get_peer(session);
618 WDS_LOGE("Failed to find connecting peer");
622 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
624 /* If state is not DISCONNECTING, connection is finished by peer */
625 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
626 wfd_group_remove_member(group, peer_addr);
627 if (group->member_count)
628 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
630 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
631 noti.error = WIFI_DIRECT_ERROR_NONE;
632 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
633 /* If there is no member, GO should be destroyed */
634 if (!group->member_count) {
635 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
636 wfd_destroy_group(manager, group->ifname);
638 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
639 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
640 noti.error = WIFI_DIRECT_ERROR_NONE;
641 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
642 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
643 /* Some devices(GO) send disconnection message before connection completed.
644 * This message should be ignored when device is not GO */
645 manager->local->dev_role == WFD_DEV_ROLE_GO) {
646 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
647 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
648 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
650 WDS_LOGE("Unexpected event. Ignore it");
653 wfd_client_send_event(manager, ¬i);
655 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
656 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
657 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
659 wfd_destroy_group(manager, GROUP_IFNAME);
660 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
661 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
663 wfd_destroy_session(manager);
666 case WFD_OEM_EVENT_GROUP_CREATED:
668 wfd_oem_group_data_s *edata = event->edata;
669 wfd_group_s *group = (wfd_group_s*) manager->group;
672 if (!manager->session) {
673 WDS_LOGE("Unexpected Event. Group should be removed(Client)");
674 wfd_oem_destroy_group(manager->oem_ops, event->ifname);
678 group = wfd_create_group(manager, event->ifname, event->dev_role, edata->go_dev_addr);
680 WDS_LOGE("Failed to create group");
684 if (!manager->session && !(group->flags & WFD_GROUP_FLAG_AUTONOMOUS)) {
685 WDS_LOGE("Unexpected Event. Group should be removed(Owner)");
686 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
690 if (group->pending) {
691 wfd_group_complete(manager, event->ifname, event->dev_role, edata->go_dev_addr);
693 WDS_LOGE("Unexpected event. Group already exist");
698 strncpy(group->ssid, edata->ssid, DEV_NAME_LEN);
699 group->ssid[DEV_NAME_LEN-1] = '\0';
700 strncpy(group->pass,edata->pass, PASSPHRASE_LEN);
701 group->pass[PASSPHRASE_LEN] = '\0';
702 group->freq = edata->freq;
703 manager->group = group;
704 manager->local->dev_role = event->dev_role;
706 wifi_direct_client_noti_s noti;
707 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
708 if (group->role == WFD_DEV_ROLE_GC) {
709 wfd_destroy_session(manager);
710 wfd_peer_clear_all(manager);
712 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
713 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
714 wfd_client_send_event(manager, ¬i);
715 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
716 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
721 case WFD_OEM_EVENT_GROUP_DESTROYED:
723 wifi_direct_client_noti_s noti;
724 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
725 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
726 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
727 noti.error = WIFI_DIRECT_ERROR_NONE;
728 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session){
729 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
730 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
731 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
732 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
733 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
734 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
735 noti.error = WIFI_DIRECT_ERROR_NONE;
737 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
740 wfd_client_send_event(manager, ¬i);
742 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
743 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
744 wfd_destroy_group(manager, event->ifname);
745 wfd_destroy_session(manager);
746 manager->local->dev_role = WFD_DEV_ROLE_NONE;
749 case WFD_OEM_EVENT_PROV_DISC_FAIL:
750 case WFD_OEM_EVENT_GO_NEG_FAIL:
751 case WFD_OEM_EVENT_WPS_FAIL:
752 case WFD_OEM_EVENT_KEY_NEG_FAIL:
754 wfd_session_s *session = (wfd_session_s*) manager->session;
756 WDS_LOGE("Unexpected event. Session not exist");
760 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
762 WDS_LOGE("Session do not has peer");
766 wifi_direct_client_noti_s noti;
767 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
768 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
769 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
770 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
771 wfd_client_send_event(manager, ¬i);
773 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
774 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
775 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
777 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
778 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
781 wfd_destroy_session(manager);
783 /* After connection failed, scan again */
784 wfd_oem_scan_param_s param;
785 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
786 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
788 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
789 wfd_oem_start_scan(manager->oem_ops, ¶m);
790 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
793 case WFD_OEM_EVENT_SERV_DISC_RESP:
795 wfd_device_s *peer = NULL;
796 if(event->edata_type != WFD_OEM_EDATA_TYPE_SERVICE)
798 WDS_LOGD("There is no service to register");
801 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
803 WDS_LOGD("serv_disc_resp from unknown peer. Discard it");
806 res = _wfd_event_update_service(manager, peer, (char*) event->edata);
808 WDS_LOGE("Failed to update peer service data");
813 WDS_LOGE("Unknown event [event ID: %d]", event->event_id);
817 __WDS_LOG_FUNC_EXIT__;