{
__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
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;
}
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;
}
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);
}
memcpy(group->bssid, bssid, MACADDR_LEN);
- group->pending = 1;
+ group->flags &= WFD_GROUP_FLAG_NONE;
__WDS_LOG_FUNC_EXIT__;
return group;
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;
}
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);
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__;