void *oem_ops;
void *plugin_handle;
int session_timer;
+ gboolean auto_group_remove_enable;
} wfd_manager_s;
wfd_manager_s *wfd_get_manager();
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__ */
{
__WDS_LOG_FUNC_ENTER__;
wfd_device_s *member = NULL;
+ wfd_manager_s *manager = wfd_get_manager();
if (!group || !addr) {
WDS_LOGE("Invalid parameter");
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;
}
"<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'>"
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;
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);
}
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");
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);
__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;
+}