[wifi-direct-manager] Start session at GONegotiationRequest. 99/70999/3
authorNishant Chaprana <n.chaprana@samsung.com>
Mon, 23 May 2016 14:03:46 +0000 (19:33 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Thu, 2 Jun 2016 07:13:17 +0000 (12:43 +0530)
Description: This patch starts session for PBC and KEYPAD connection
             request at GONegotiationRequest reception.

Currently connection session is started at ProvisionDiscoveryRequest event.
But it should be started when Peer send GoNegotiationRequest event because
until peer donot sends GONegotiationRequest we are not sure whether it wants
to initiate connection with us or not.

Change-Id: Ic27ad1f612f70932ae2f131f3342fd6cef1e37b8
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
packaging/wifi-direct-manager.spec
plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c
src/wifi-direct-event.c
src/wifi-direct-session.c

index e5d9897..4ffab3e 100755 (executable)
@@ -1,6 +1,6 @@
 Name:          wifi-direct-manager
 Summary:       Wi-Fi Direct manger
-Version:       1.2.159
+Version:       1.2.160
 Release:       1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
index 1c0507d..a31cf99 100755 (executable)
@@ -2974,7 +2974,7 @@ static int _ws_init_dbus_connection(void)
 #endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
 
        if (res < 0)
-                       WDP_LOGE("Failed to subscribe interface signal");
+               WDP_LOGE("Failed to subscribe interface signal");
        else
                WDP_LOGI("Successfully register signal filters");
 
index 780fe3a..8c0a127 100755 (executable)
@@ -291,7 +291,7 @@ static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s
        wfd_group_s *group = (wfd_group_s*) manager->group;
 
        if (group && group->role == WFD_DEV_ROLE_GC &&
-                                               event->event_id == WFD_OEM_EVENT_PROV_DISC_REQ) {
+                       event->event_id == WFD_OEM_EVENT_PROV_DISC_REQ) {
                WDS_LOGD("Device has GC role - ignore this provision request");
                __WDS_LOG_FUNC_EXIT__;
                return;
@@ -309,8 +309,6 @@ static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s
 
        res = _wfd_event_update_peer(manager, edata);
        peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
-       if (peer)
-               peer->state = WFD_PEER_STATE_CONNECTING;
 #else /* CTRL_IFACE_DBUS */
        peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
        if (!peer) {
@@ -321,12 +319,25 @@ static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s
                        __WDS_LOG_FUNC_EXIT__;
                        return;
                }
-               peer->state = WFD_PEER_STATE_CONNECTING;
                wfd_update_peer(manager, peer);
        }
        wfd_update_peer_time(manager, event->dev_addr);
 #endif /* CTRL_IFACE_DBUS */
 
+       if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
+               WDS_LOGI("TV is not GO, updated peer data only.");
+
+               manager->local->wps_mode = event->wps_mode;
+               if (event->wps_mode == WFD_WPS_MODE_PBC ||
+                               event->wps_mode == WFD_WPS_MODE_KEYPAD) {
+                       __WDS_LOG_FUNC_EXIT__;
+                       return;
+               }
+       }
+
+       if (peer)
+               peer->state = WFD_PEER_STATE_CONNECTING;
+
        res = wfd_session_process_event(manager, event);
        if (res < 0)
                WDS_LOGE("Failed to process event of session");
@@ -446,7 +457,6 @@ static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *ev
 {
        __WDS_LOG_FUNC_ENTER__;
 
-       wfd_session_s *session = NULL;
        wfd_group_s *group = (wfd_group_s*) manager->group;
        if (group && group->role == WFD_DEV_ROLE_GC) {
                WDS_LOGD("Device has GC role - ignore this go neg request");
@@ -495,36 +505,11 @@ static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *ev
 
        if (edata->wps_mode == 0)
                edata->wps_mode = 1;
-#endif /* CTRL_IFACE_DBUS */
 
-       session = (wfd_session_s*) manager->session;
-       if (!session) {
-               session = wfd_create_session(manager, event->dev_addr,
-#ifdef CTRL_IFACE_DBUS
-                                               event->wps_mode, SESSION_DIRECTION_INCOMING);
-#else /* CTRL_IFACE_DBUS */
-                                               edata->wps_mode, SESSION_DIRECTION_INCOMING);
+       event->wps_mode = edata->wps_mode;
 #endif /* CTRL_IFACE_DBUS */
-               if (!session) {
-                       WDS_LOGE("Failed to create session");
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-               session->type = SESSION_TYPE_NORMAL;
-               session->state = SESSION_STATE_GO_NEG;
-               wfd_session_timer(session, 1);
-               wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
 
-               char peer_mac_address[MACSTR_LEN+1] = {0, };
-               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
-               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
-                                            "Connection",
-                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
-                                                                   WFD_EVENT_CONNECTION_REQ,
-                                                                   peer_mac_address));
-       } else {
-               wfd_session_process_event(manager, event);
-       }
+       wfd_session_process_event(manager, event);
        __WDS_LOG_FUNC_EXIT__;
        return;
 }
index e1d2183..d0bd156 100755 (executable)
@@ -716,13 +716,12 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
        {
                int req_wps_mode = WFD_WPS_MODE_NONE;
 
-               if (event->wps_mode == WFD_WPS_MODE_DISPLAY) {
+               if (event->wps_mode == WFD_WPS_MODE_DISPLAY)
                        req_wps_mode = WFD_WPS_MODE_KEYPAD;
-               } else if (event->wps_mode == WFD_WPS_MODE_KEYPAD) {
+               else if (event->wps_mode == WFD_WPS_MODE_KEYPAD)
                        req_wps_mode = WFD_WPS_MODE_DISPLAY;
-               } else {
+               else
                        req_wps_mode = WFD_WPS_MODE_PBC;
-               }
 
                /* Only peer initiated connection or invitation session can be allowed */
                if (session) {
@@ -745,17 +744,17 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                }
 
                /* Update session */
-               if (event->wps_mode == WFD_WPS_MODE_DISPLAY) {
+               if (event->wps_mode == WFD_WPS_MODE_DISPLAY)
                        g_strlcpy(session->wps_pin, event->wps_pin, PINSTR_LEN + 1);
-               }
+
                session->state = SESSION_STATE_STARTED;
-               if (session->type == SESSION_TYPE_INVITE) {
+               if (session->type == SESSION_TYPE_INVITE)
                        WDS_LOGD("Invitation session");
-               } else if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
+               else if (WFD_DEV_ROLE_GO == manager->local->dev_role)
                        session->type = SESSION_TYPE_JOIN;
-               } else {
+               else
                        session->type = SESSION_TYPE_NORMAL;
-               }
+
                wfd_session_timer(session, 1);
 
                /* Update local device */
@@ -822,6 +821,7 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                } else {
                        session->req_wps_mode = WFD_WPS_MODE_PBC;
                }
+
                session->state = SESSION_STATE_STARTED;
                wfd_session_timer(session, 1);
 
@@ -854,16 +854,34 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                        WDS_LOGD("Start connection corresponding to OEM event [%d]", event->event_id);
                        res = wfd_session_connect(session);
                }
+
+               if (res < 0)
+                       _wfd_notify_session_failed(manager, event->dev_addr);
        }
-       if (res < 0)
-               _wfd_notify_session_failed(manager, event->dev_addr);
        break;
        case WFD_OEM_EVENT_GO_NEG_REQ:
+       {
                if (!session) {
-                       // TODO: check whether connection is started by negotiation not by prov_disc
-                       WDS_LOGE("Unexpected event. Session not exist [peer: " MACSECSTR "]",
-                                               MAC2SECSTR(event->dev_addr));
-                       break;
+                       session = wfd_create_session(manager, event->dev_addr,
+                                       event->wps_mode, SESSION_DIRECTION_INCOMING);
+                       if (!session) {
+                               WDS_LOGE("Failed to create session");
+                               __WDS_LOG_FUNC_EXIT__;
+                               break;
+                       }
+
+                       session->type = SESSION_TYPE_NORMAL;
+                       session->state = SESSION_STATE_GO_NEG;
+                       wfd_session_timer(session, 1);
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+
+                       char peer_mac_address[MACSTR_LEN+1] = {0, };
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                       "Connection",
+                                       g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                               WFD_EVENT_CONNECTION_REQ,
+                                               peer_mac_address));
                } else {
                        /* Sometimes, Provision Discovery response is not received.
                         * At this time, connection should be triggered by GO Negotiation request event */
@@ -878,38 +896,42 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                        if (res < 0)
                                _wfd_notify_session_failed(manager, event->dev_addr);
                }
-               break;
+       }
+       break;
        case WFD_OEM_EVENT_GO_NEG_DONE:
+       {
                if (!session) {
                        WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
-                                               MAC2SECSTR(event->dev_addr));
+                                       MAC2SECSTR(event->dev_addr));
                        break;
                } else {
                        manager->local->dev_role = event->dev_role;
                        session->state = SESSION_STATE_WPS;
                }
-
-               break;
+       }
+       break;
        case WFD_OEM_EVENT_WPS_DONE:
+       {
                if (!session) {
                        WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
-                                               MAC2SECSTR(event->dev_addr));
+                                       MAC2SECSTR(event->dev_addr));
                        break;
                } else {
                        session->state = SESSION_STATE_KEY_NEG;
                }
-
-               break;
+       }
+       break;
        case WFD_OEM_EVENT_STA_CONNECTED:
+       {
                if (!session) {
                        WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
-                                               MAC2SECSTR(event->dev_addr));
+                                       MAC2SECSTR(event->dev_addr));
                        break;
                } else {
                        session->state = SESSION_STATE_COMPLETED;
                }
-
-               break;
+       }
+       break;
        default:
                break;
        }