[Support Legacy Connection] Process legacy connection. 64/72064/2 accepted/tizen/common/20160602.140304 accepted/tizen/ivi/20160602.231004 accepted/tizen/mobile/20160602.231028 accepted/tizen/tv/20160602.230949 accepted/tizen/wearable/20160602.230942 submit/tizen/20160602.082230
authorNishant Chaprana <n.chaprana@samsung.com>
Mon, 30 May 2016 11:01:12 +0000 (16:31 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Thu, 2 Jun 2016 07:27:46 +0000 (12:57 +0530)
This patch processes legacy connection and shares legacy peer info
with application.
Only peer interface address and Assigned IP address are available
So only these information are provided to applicaiton.
"LEGACY-PEER" is sent in Device Name if peer is a legacy peer.

Change-Id: I0501ef91f7b4a9b718a62bc1a850ab6eff3d122d
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
packaging/wifi-direct-manager.spec
src/wifi-direct-event.c
src/wifi-direct-group.c

index 5d8f6d2..aa464ad 100755 (executable)
@@ -1,6 +1,6 @@
 Name:          wifi-direct-manager
 Summary:       Wi-Fi Direct manger
-Version:       1.2.164
+Version:       1.2.165
 Release:       1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
index 937dc6b..e2b4ee3 100755 (executable)
@@ -769,53 +769,21 @@ static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s
 {
        __WDS_LOG_FUNC_ENTER__;
 
-       wfd_group_s *group = NULL;
-       wfd_session_s *session = NULL;
-
-       group = (wfd_group_s*) manager->group;
-       session = (wfd_session_s*)manager->session;
-#ifdef CTRL_IFACE_DBUS
-       if(event->dev_role == WFD_DEV_ROLE_GC && !group) {
+       wfd_group_s *group = (wfd_group_s*) manager->group;
+       wfd_session_s *session = (wfd_session_s*) manager->session;
 
+       if (!group) {
                group = wfd_create_pending_group(manager, event->intf_addr);
                if (!group) {
                        WDS_LOGE("Failed to create pending group");
                        __WDS_LOG_FUNC_EXIT__;
                        return;
                }
+
                manager->group = group;
        }
-#endif /* CTRL_IFACE_DBUS */
-       if (!group) {
-               if (!session) {
-                       WDS_LOGE("Unexpected Event. Group should be removed(Client)");
-                       wfd_oem_destroy_group(manager->oem_ops, event->ifname);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
 
-               group = wfd_create_group(manager, event);
-               if (!group) {
-                       WDS_LOGE("Failed to create group");
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       } else {
-               if (!session && !(group->flags & WFD_GROUP_FLAG_AUTONOMOUS)) {
-                       WDS_LOGE("Unexpected Event. Group should be removed(Owner)");
-                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               if (group->pending) {
-                       wfd_group_complete(manager, event);
-               } else {
-                       WDS_LOGE("Unexpected event. Group already exist");
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
+       wfd_group_complete(manager, event);
 
        if (group->role == WFD_DEV_ROLE_GC && session) {
 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
@@ -993,6 +961,30 @@ static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s
 
        if (ISZEROMACADDR(event->dev_addr)) {
                WDS_LOGD("Legacy Peer Connected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
+
+               peer = wfd_peer_find_by_dev_addr(manager, event->intf_addr);
+               if (!peer) {
+                       WDS_LOGI("Add legacy peer");
+                       peer = wfd_add_peer(manager, event->intf_addr, "LEGACY-PEER");
+                       if (!peer) {
+                               WDS_LOGE("Failed to add Legacy peer.");
+                               __WDS_LOG_FUNC_EXIT__;
+                               return;
+                       }
+               }
+
+               memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
+               peer->state = WFD_PEER_STATE_CONNECTED;
+               wfd_group_add_member(group, peer->dev_addr);
+
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Connection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                   WFD_EVENT_CONNECTION_RSP,
+                                                                   peer_mac_address));
+
+               wfd_util_dhcps_wait_ip_leased(peer);
                __WDS_LOG_FUNC_EXIT__;
                return;
        }
@@ -1094,6 +1086,22 @@ static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event
 
        if (ISZEROMACADDR(event->dev_addr)) {
                WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Disconnection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                   WFD_EVENT_DISCONNECTION_IND,
+                                                                   peer_mac_address));
+
+               wfd_group_remove_member(group, event->intf_addr);
+
+               if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+               } else {
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+               }
                __WDS_LOG_FUNC_EXIT__;
                return;
        }
index 3d88c92..8c9e4bb 100755 (executable)
@@ -83,7 +83,6 @@ wfd_group_s *wfd_create_group(void *data, wfd_oem_event_s *group_info)
        group->ifname[IFACE_NAME_LEN] = '\0';
        group->role = group_info->dev_role;
        memcpy(group->go_dev_addr, edata->go_dev_addr, MACADDR_LEN);
-       group->pending = 0;
 
        g_strlcpy(group->ssid, edata->ssid, DEV_NAME_LEN + 1);
        g_strlcpy(group->passphrase, edata->pass, PASSPHRASE_LEN_MAX + 1);
@@ -129,7 +128,7 @@ wfd_group_s *wfd_create_pending_group(void *data, unsigned char * bssid)
        }
 
        memcpy(group->bssid, bssid, MACADDR_LEN);
-       group->pending = 1;
+       group->flags &= WFD_GROUP_FLAG_NONE;
 
        __WDS_LOG_FUNC_EXIT__;
        return group;
@@ -159,11 +158,6 @@ int wfd_group_complete(void *data, wfd_oem_event_s *group_info)
        group = manager->group;
        if (!group) {
                WDS_LOGE("Group not found");
-               return -1;
-       }
-
-       if (!group->pending) {
-               WDS_LOGE("This is not pending group");
                __WDS_LOG_FUNC_EXIT__;
                return -1;
        }
@@ -171,45 +165,58 @@ int wfd_group_complete(void *data, wfd_oem_event_s *group_info)
        g_strlcpy(group->ifname, group_info->ifname, IFACE_NAME_LEN + 1);
        group->role = group_info->dev_role;
        memcpy(group->go_dev_addr, edata->go_dev_addr, MACADDR_LEN);
-       group->pending = 0;
 
        g_strlcpy(group->ssid, edata->ssid, DEV_NAME_LEN + 1);
        g_strlcpy(group->passphrase, edata->pass, PASSPHRASE_LEN_MAX + 1);
        memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
        group->freq = edata->freq;
+       if (edata->is_persistent)
+               group->flags |= WFD_GROUP_FLAG_PERSISTENT;
 
        manager->local->dev_role = group_info->dev_role;
 
        session = manager->session;
        peer = wfd_session_get_peer(session);
        if (!peer && !(group->flags & WFD_GROUP_FLAG_AUTONOMOUS)) {
-               WDS_LOGD("Failed to find peer by device address[" MACSECSTR "]",
-                                               MAC2SECSTR(edata->go_dev_addr));
-               return -1;
+               if (!session && (group->flags & WFD_GROUP_FLAG_PERSISTENT)) {
+                       WDS_LOGE("Group created by supplicant is persistent group.");
+                       /**
+                        * TODO: Add handling for Reinvoked Persistent Group.
+                        */
+                       __WDS_LOG_FUNC_EXIT__;
+                       return -1;
+               } else {
+                       WDS_LOGD("Failed to find peer by device address[" MACSECSTR "]",
+                                                       MAC2SECSTR(edata->go_dev_addr));
+                       __WDS_LOG_FUNC_EXIT__;
+                       return -1;
+               }
        }
 
        if (group->role == WFD_DEV_ROLE_GO) {
                wfd_util_dhcps_start(group->ifname);
                WDS_LOGD("Role is Group Owner. DHCP Server started");
        } else {
-               if(!peer) {
+               if (!peer) {
                        WDS_LOGE("Peer is not in the session");
+                       __WDS_LOG_FUNC_EXIT__;
                        return -1;
                }
+
                WDS_LOGD("Role is Group Client.complete session and add peer to member");
                memcpy(peer->intf_addr, group->go_dev_addr, MACADDR_LEN);
                wfd_group_add_member(group, peer->dev_addr);
                session->state = SESSION_STATE_COMPLETED;
-               /* memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN); */
                peer->state = WFD_PEER_STATE_CONNECTED;
 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
-               if(edata->ip_addr[3] && edata->ip_addr_go[3]) {
+               if (edata->ip_addr[3] && edata->ip_addr_go[3]) {
                        peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
                        memcpy(peer->client_ip_addr, edata->ip_addr, IPADDR_LEN);
                        WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
                        memcpy(peer->go_ip_addr, edata->ip_addr_go, IPADDR_LEN);
                        WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
                }
+
                if(peer->ip_type != WFD_IP_TYPE_OVER_EAPOL)
 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
                wfd_util_dhcpc_start(group->ifname, peer);
@@ -430,16 +437,16 @@ int wfd_group_remove_member(wfd_group_s *group, unsigned char *addr)
        g_free(member);
        group->member_count--;
 
-       if (manager->local->dev_role == WFD_DEV_ROLE_GC) {
-               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-
-       } else if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-
-               if (wfd_util_is_remove_group_allowed())
+       if (group->role == WFD_DEV_ROLE_GO) {
+               if (!group->member_count && wfd_util_is_remove_group_allowed()) {
                        wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-
+                       wfd_destroy_group(manager, group->ifname);
+                       wfd_peer_clear_all(manager);
+               }
        } else {
-               ;//Do Nothing
+               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+               wfd_destroy_group(manager, group->ifname);
+               wfd_peer_clear_all(manager);
        }
 
        __WDS_LOG_FUNC_EXIT__;