[wifi-direct-manager] This patch fixes below items. 82/74782/3
authorNishant Chaprana <n.chaprana@samsung.com>
Wed, 15 Jun 2016 12:31:08 +0000 (18:01 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Wed, 15 Jun 2016 12:49:59 +0000 (05:49 -0700)
1. Remove unused function parameters from wfd_destroy_group()
2. Remove GROUP_IFNAME hardcoding as group structure contains ifname in it.
3. Populate group->pending to identify whether group is created or not.
4. Call supplicant method to Destroy group only when group->pending is FALSE.
5. Check only group variable for validating whether group exists or not.

Change-Id: I61edc2b6e00c9614e36d082fa051ac90c2054c77
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
include/wifi-direct-group.h
src/wifi-direct-event.c
src/wifi-direct-group.c
src/wifi-direct-iface.c
src/wifi-direct-manager.c

index 56a3855..fad27cd 100755 (executable)
@@ -58,7 +58,7 @@ typedef struct {
 wfd_group_s *wfd_create_group(void *data, wfd_oem_event_s *group_info);
 wfd_group_s *wfd_create_pending_group(void *data, unsigned char * bssid);
 int wfd_group_complete(void *data, wfd_oem_event_s *group_info);
-int wfd_destroy_group(void * data, char *ifname);
+int wfd_destroy_group(void * data);
 int wfd_group_add_member(wfd_group_s *group, unsigned char *addr);
 int wfd_group_remove_member(wfd_group_s *group, unsigned char *addr);
 #if 0
index f67392f..920abd0 100755 (executable)
@@ -141,7 +141,7 @@ static void __wfd_process_deactivated(wfd_manager_s *manager, wfd_oem_event_s *e
                                     "Deactivation",
                                     g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
 
-       wfd_destroy_group(manager, GROUP_IFNAME);
+       wfd_destroy_group(manager);
        wfd_destroy_session(manager);
        wfd_peer_clear_all(manager);
        wfd_local_reset_data(manager);
@@ -429,7 +429,7 @@ static void __wfd_process_prov_disc_fail(wfd_manager_s *manager, wfd_oem_event_s
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_group_s *group = (wfd_group_s*) manager->group;
                if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
-                       wfd_destroy_group(manager, GROUP_IFNAME);
+                       wfd_destroy_group(manager);
 
                        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
                        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
@@ -571,7 +571,7 @@ static void __wfd_process_go_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *e
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
 
-       wfd_destroy_group(manager, GROUP_IFNAME);
+       wfd_destroy_group(manager);
        wfd_destroy_session(manager);
        manager->local->dev_role = WFD_DEV_ROLE_NONE;
        __WDS_LOG_FUNC_EXIT__;
@@ -638,7 +638,7 @@ static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *even
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_group_s *group = (wfd_group_s*) manager->group;
                if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
-                       wfd_destroy_group(manager, GROUP_IFNAME);
+                       wfd_destroy_group(manager);
 
                        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
                        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
@@ -710,7 +710,7 @@ static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_group_s *group = (wfd_group_s*) manager->group;
                if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
-                       wfd_destroy_group(manager, GROUP_IFNAME);
+                       wfd_destroy_group(manager);
 
                        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
                        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
@@ -870,7 +870,7 @@ static void __wfd_process_group_destroyed(wfd_manager_s *manager, wfd_oem_event_
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-       wfd_destroy_group(manager, event->ifname);
+       wfd_destroy_group(manager);
        wfd_destroy_session(manager);
        manager->local->dev_role = WFD_DEV_ROLE_NONE;
 
@@ -998,8 +998,10 @@ static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s
        if (!session) {
                WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
                                                                        MAC2SECSTR(event->dev_addr));
-               wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
-               wfd_destroy_group(manager, GROUP_IFNAME);
+               if (group) {
+                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                       wfd_destroy_group(manager);
+               }
                wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
                wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
                __WDS_LOG_FUNC_EXIT__;
@@ -1217,7 +1219,7 @@ static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event
        /* If there is no member, GO should be destroyed */
        if (!group->member_count) {
                wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-               wfd_destroy_group(manager, group->ifname);
+               wfd_destroy_group(manager);
                wfd_peer_clear_all(manager);
        }
 
index be7b200..6fc25ff 100755 (executable)
@@ -94,6 +94,7 @@ wfd_group_s *wfd_create_group(void *data, wfd_oem_event_s *group_info)
        manager->local->dev_role = group_info->dev_role;
 
        wfd_util_dhcps_start(group->ifname);
+       group->pending = FALSE;
        WDS_LOGD("Role is Group Owner. DHCP Server started");
 
        __WDS_LOG_FUNC_EXIT__;
@@ -130,6 +131,7 @@ wfd_group_s *wfd_create_pending_group(void *data, unsigned char * bssid)
 
        memcpy(group->bssid, bssid, MACADDR_LEN);
        group->flags &= WFD_GROUP_FLAG_NONE;
+       group->pending = TRUE;
 
        __WDS_LOG_FUNC_EXIT__;
        return group;
@@ -175,6 +177,7 @@ int wfd_group_complete(void *data, wfd_oem_event_s *group_info)
                group->flags |= WFD_GROUP_FLAG_PERSISTENT;
 
        manager->local->dev_role = group_info->dev_role;
+       group->pending = FALSE;
 
        session = manager->session;
        peer = wfd_session_get_peer(session);
@@ -227,7 +230,7 @@ int wfd_group_complete(void *data, wfd_oem_event_s *group_info)
        return 0;
 }
 
-int wfd_destroy_group(void *data, char *ifname)
+int wfd_destroy_group(void *data)
 {
        __WDS_LOG_FUNC_ENTER__;
        wfd_group_s *group = NULL;
@@ -236,7 +239,7 @@ int wfd_destroy_group(void *data, char *ifname)
        wfd_device_s *member = NULL;
        int count = 0;
 
-       if (!data || !ifname) {
+       if (!data) {
                WDS_LOGE("Invalid parameter");
                __WDS_LOG_FUNC_EXIT__;
                return -1;
@@ -250,11 +253,13 @@ int wfd_destroy_group(void *data, char *ifname)
        }
        manager->group = NULL;
 
-       wfd_util_ip_unset(group->ifname);
-       if (group->role == WFD_DEV_ROLE_GO)
-               wfd_util_dhcps_stop(group->ifname);
-       else
-               wfd_util_dhcpc_stop(group->ifname);
+       if (group->pending == FALSE) {
+               wfd_util_ip_unset(group->ifname);
+               if (group->role == WFD_DEV_ROLE_GO)
+                       wfd_util_dhcps_stop(group->ifname);
+               else
+                       wfd_util_dhcpc_stop(group->ifname);
+       }
        memset(manager->local->ip_addr, 0x0, IPADDR_LEN);
 
        temp = g_list_first(group->members);
@@ -440,12 +445,12 @@ int wfd_group_remove_member(wfd_group_s *group, unsigned char *addr)
        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_destroy_group(manager);
                        wfd_peer_clear_all(manager);
                }
        } else {
                wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-               wfd_destroy_group(manager, group->ifname);
+               wfd_destroy_group(manager);
                wfd_peer_clear_all(manager);
        }
 
index 8edc1b4..c776824 100755 (executable)
@@ -1027,7 +1027,7 @@ static void __wfd_manager_group_iface_handler(const gchar *method_name,
                ret = wfd_oem_create_group(manager->oem_ops, &param);
                if (ret < 0) {
                        WDS_LOGE("Failed to create group");
-                       wfd_destroy_group(manager, GROUP_IFNAME);
+                       wfd_destroy_group(manager);
                        ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
                        goto failed;
                }
@@ -1040,20 +1040,22 @@ static void __wfd_manager_group_iface_handler(const gchar *method_name,
 
        } else if (!g_strcmp0(method_name, "DestroyGroup")) {
                wfd_group_s *group = manager->group;
-               if (!group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+               if (!group) {
                        WDS_LOGE("Group not exist");
                        ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
                        goto failed;
                }
 
-               ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-               if (ret < 0) {
-                       WDS_LOGE("Failed to destroy group");
-                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       goto failed;
+               if (group->pending == FALSE) {
+                       ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                       if (ret < 0) {
+                               WDS_LOGE("Failed to destroy group");
+                               ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               goto failed;
+                       }
                }
 
-               ret = wfd_destroy_group(manager, group->ifname);
+               ret = wfd_destroy_group(manager);
                if (ret < 0)
                        WDS_LOGE("Failed to destroy group");
 
index 8b801f2..9972bb8 100755 (executable)
@@ -558,6 +558,7 @@ int wfd_manager_deactivate(wfd_manager_s *manager)
        __WDS_LOG_FUNC_ENTER__;
        int prev_state = 0;
        int res = 0;
+       wfd_group_s *group = NULL;
 
        if (!manager) {
                WDS_LOGE("Invalid parameter");
@@ -573,9 +574,12 @@ int wfd_manager_deactivate(wfd_manager_s *manager)
                WDS_LOGE("Failed to initialize miracast");
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
 
-       res = wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
-       if (res < 0)
-               WDS_LOGE("Failed to destroy group before deactivation");
+       group = (wfd_group_s*) manager->group;
+       if (group && group->pending == FALSE) {
+               res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+               if (res < 0)
+                       WDS_LOGE("Failed to destroy group before deactivation");
+       }
 
 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
        res = wfd_util_check_wifi_state();
@@ -609,7 +613,7 @@ int wfd_manager_deactivate(wfd_manager_s *manager)
 
        manager->req_wps_mode = WFD_WPS_MODE_PBC;
 
-       wfd_destroy_group(manager, GROUP_IFNAME);
+       wfd_destroy_group(manager);
        wfd_destroy_session(manager);
        wfd_peer_clear_all(manager);
        wfd_local_reset_data(manager);
@@ -890,7 +894,7 @@ int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
        wfd_group_remove_member(group, peer_addr);
        if (!group->member_count) {
                wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-               wfd_destroy_group(manager, group->ifname);
+               wfd_destroy_group(manager);
        }
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
@@ -944,7 +948,7 @@ int wfd_manager_disconnect_all(wfd_manager_s *manager)
        }
        WDS_LOGE("Succeeded to disconnect all peer");
 
-       wfd_destroy_group(manager, group->ifname);
+       wfd_destroy_group(manager);
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);