[wfd-manager]: Add support of wifi_direct_set_auto_group_removal() API 68/70568/3
authorManeesh Jain <maneesh.jain@samsung.com>
Thu, 19 May 2016 12:42:39 +0000 (18:12 +0530)
committerManeesh Jain <maneesh.jain@samsung.com>
Fri, 20 May 2016 06:37:39 +0000 (12:07 +0530)
Change-Id: Idff482f807e12faf45bf56b1da5614025c504a38
Signed-off-by: Maneesh Jain <maneesh.jain@samsung.com>
include/wifi-direct-manager.h
include/wifi-direct-util.h
src/wifi-direct-group.c
src/wifi-direct-iface.c
src/wifi-direct-manager.c
src/wifi-direct-session.c
src/wifi-direct-util.c

index 64f6c74..a763c81 100755 (executable)
@@ -187,6 +187,7 @@ typedef struct {
        void *oem_ops;
        void *plugin_handle;
        int session_timer;
+       gboolean auto_group_remove_enable;
 } wfd_manager_s;
 
 wfd_manager_s *wfd_get_manager();
index a7c71a3..67cab46 100755 (executable)
@@ -82,4 +82,6 @@ int wfd_util_dhcpc_get_server_ip(unsigned char* ip_addr);
 int wfd_util_ip_over_eap_assign(wfd_device_s *peer, const char *ifname);
 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
 int wfd_util_ip_unset(const char *ifname);
+gboolean wfd_util_is_remove_group_allowed(void);
+
 #endif /* __WIFI_DIRECT_UTIL_H__ */
index 3a64aee..3d88c92 100755 (executable)
@@ -404,6 +404,7 @@ int wfd_group_remove_member(wfd_group_s *group, unsigned char *addr)
 {
        __WDS_LOG_FUNC_ENTER__;
        wfd_device_s *member = NULL;
+       wfd_manager_s *manager = wfd_get_manager();
 
        if (!group || !addr) {
                WDS_LOGE("Invalid parameter");
@@ -429,6 +430,18 @@ 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())
+                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+
+       } else {
+               ;//Do Nothing
+       }
+
        __WDS_LOG_FUNC_EXIT__;
        return 0;
 }
index 9cac032..e07eb2f 100755 (executable)
@@ -306,6 +306,10 @@ const gchar wfd_manager_introspection_xml[] = {
                                "<arg type='i' name='session_timer' direction='in'/>"
                                "<arg type='i' name='error_code' direction='out'/>"
                        "</method>"
+                       "<method name='SetAutoGroupRemoval'>"
+                               "<arg type='b' name='enable' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
                "</interface>"
 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
                "<interface name='net.wifidirect.service'>"
@@ -1569,7 +1573,47 @@ static void __wfd_manager_config_iface_handler(const gchar *method_name,
                return_parameters = g_variant_new("(i)", ret);
                goto done;
 
-       } else {
+       } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
+               gboolean enable;
+
+
+               g_variant_get(parameters, "(b)", &enable);
+               WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
+                               enable ? "True" : "False");
+
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       goto failed;
+               }
+
+               if (enable) {
+                       manager->auto_group_remove_enable = TRUE;
+
+                       /* Enable Group destroy only if state is connecting */
+                       if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
+                               WDS_LOGE("Wi-Fi Direct state is CONNECTING");
+                               ret = WIFI_DIRECT_ERROR_NONE;
+                               return_parameters = g_variant_new("(i)", ret);
+                               goto done;
+                       }
+                       /* Remove group immediately if no connected peer found */
+                       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+                               wfd_group_s *group = (wfd_group_s*) manager->group;
+                               if (group && !group->member_count
+                                                 && wfd_util_is_remove_group_allowed())
+                                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                         }
+
+               } else
+                       manager->auto_group_remove_enable = FALSE;
+
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               return_parameters = g_variant_new("(i)", ret);
+               goto done;
+
+       }  else {
                WDS_LOGE("method not handled");
                ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
                goto failed;
index 69ba351..2e11712 100755 (executable)
@@ -783,9 +783,11 @@ int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_ad
        group = (wfd_group_s*) manager->group;
        if (group) {
                wfd_group_remove_member(group, peer_addr);
-               if ((wfd_group_is_autonomous(manager->group) != TRUE) && !group->member_count) {
-                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-                       wfd_destroy_group(manager, group->ifname);
+               if (!group->member_count) {
+                       if (wfd_util_is_remove_group_allowed()) {
+                               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                               wfd_destroy_group(manager, group->ifname);
+                       }
                } else {
                        wfd_oem_disconnect(manager->oem_ops, peer_addr);
                }
@@ -1475,6 +1477,7 @@ static wfd_manager_s *wfd_manager_init()
        manager->req_wps_mode = WFD_WPS_MODE_PBC;
        manager->max_station = 8;
        manager->session_timer = 120;
+       manager->auto_group_remove_enable = TRUE;
        res = _wfd_local_init_device(manager);
        if (res < 0) {
                WDS_LOGE("Failed to initialize local device");
index d8be621..038a0ea 100755 (executable)
@@ -77,8 +77,14 @@ static gboolean _session_timeout_cb(gpointer *user_data)
        wfd_session_cancel(session, peer_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);
+
+               wfd_group_s *group = (wfd_group_s*) manager->group;
+               if (group && wfd_util_is_remove_group_allowed()) {
+                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+               } else {
+                       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);
index 3023e7a..1c88306 100755 (executable)
@@ -1287,3 +1287,13 @@ int wfd_util_ip_unset(const char *ifname)
        __WDS_LOG_FUNC_EXIT__;
        return res;
 }
+
+gboolean wfd_util_is_remove_group_allowed(void)
+{
+       wfd_manager_s *manager = wfd_get_manager();
+
+       if (!manager->auto_group_remove_enable)
+               return FALSE;
+
+       return TRUE;
+}