#include <glib.h>
-#include <wifi-direct-internal.h>
+#include <wifi-direct.h>
+#include "wifi-direct-ipc.h"
#include "wifi-direct-manager.h"
+#include "wifi-direct-state.h"
#include "wifi-direct-peer.h"
#include "wifi-direct-oem.h"
#include "wifi-direct-group.h"
#include "wifi-direct-client.h"
// Check the group instance which has same interface name, before using this function
-wfd_group_s *wfd_create_group(void *data, char *ifname, int role, unsigned char *go_dev_addr)
+wfd_group_s *wfd_create_group(void *data, wfd_oem_event_s *group_info)
{
__WDS_LOG_FUNC_ENTER__;
wfd_group_s *group = NULL;
wfd_manager_s *manager = (wfd_manager_s*) data;
+ wfd_oem_group_data_s *edata = (wfd_oem_group_data_s *)group_info->edata;
- if (!manager || !ifname || !go_dev_addr) {
+ if (!manager || !group_info || !edata) {
WDS_LOGE("Invalid parameter");
__WDS_LOG_FUNC_EXIT__;
return NULL;
return NULL;
}
- memcpy(group->ifname, ifname, IFACE_NAME_LEN);
+ memcpy(group->ifname, group_info->ifname, IFACE_NAME_LEN);
group->ifname[IFACE_NAME_LEN] = '\0';
- group->role = role;
- memcpy(group->go_dev_addr, go_dev_addr, MACADDR_LEN);
+ 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 +1);
+ memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN +1);
+ group->freq = edata->freq;
+
+ manager->group = group;
+ manager->local->dev_role = group_info->dev_role;
+
wfd_util_dhcps_start();
WDS_LOGD("Role is Group Owner. DHCP Server started");
}
errno = 0;
- group = (wfd_group_s*) calloc(1, sizeof(wfd_group_s));
+ group = (wfd_group_s*) g_try_malloc0(sizeof(wfd_group_s));
if (!group) {
WDS_LOGE("Failed to allocate memory for group. [%s]", strerror(errno));
__WDS_LOG_FUNC_EXIT__;
return group;
}
-int wfd_group_complete(void *data, char *ifname, int role, unsigned char *go_dev_addr)
+int wfd_group_complete(void *data, wfd_oem_event_s *group_info)
{
__WDS_LOG_FUNC_ENTER__;
wfd_manager_s *manager = (wfd_manager_s*) data;
+ wfd_oem_group_data_s *edata = (wfd_oem_group_data_s *)group_info->edata;
+ wfd_session_s *session = NULL;
wfd_group_s *group = NULL;
wfd_device_s *peer = NULL;
- if (!manager || !ifname || !go_dev_addr) {
+ if (!manager || !group_info || !edata) {
WDS_LOGE("Invalid parameter");
__WDS_LOG_FUNC_EXIT__;
return -1;
return -1;
}
- memcpy(group->ifname, ifname, IFACE_NAME_LEN);
- group->ifname[IFACE_NAME_LEN] = '\0';
- group->role = role;
- memcpy(group->go_dev_addr, go_dev_addr, MACADDR_LEN);
+ 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;
- peer = wfd_session_get_peer(manager->session);
+ g_strlcpy(group->ssid, edata->ssid, DEV_NAME_LEN + 1);
+ g_strlcpy(group->passphrase, edata->pass, PASSPHRASE_LEN +1);
+ memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN +1);
+ group->freq = edata->freq;
+
+ 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_LOGE("Failed to find peer by device address[" MACSTR "]", go_dev_addr);
+ WDS_LOGD("Failed to find peer by device address[" MACSECSTR "]",
+ MAC2SECSTR(edata->go_dev_addr));
return -1;
}
+
if (group->role == WFD_DEV_ROLE_GO) {
wfd_util_dhcps_start();
WDS_LOGD("Role is Group Owner. DHCP Server started");
} else {
+#ifdef CTRL_IFACE_DBUS
+ 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;
+#endif /* CTRL_IFACE_DBUS */
wfd_util_dhcpc_start(peer);
}
wfd_util_dhcps_stop();
else
wfd_util_dhcpc_stop();
+ memset(manager->local->ip_addr, 0x0, IPADDR_LEN);
temp = g_list_first(group->members);
while(temp && count < group->member_count) {
member = temp->data;
- WDS_LOGD("%dth member[%s] freed", count, member->dev_name);
- if (member) // Temporary. Sometimes manager crashed
- {
- wfd_manager_init_service(member);
- if(member->wifi_display)
- free(member->wifi_display);
- free(member);
- }
+ WDS_LOGD("%dth member[%s] will be removed", count, member->dev_name);
+ g_free(member);
+ member = NULL;
temp = g_list_next(temp);
count++;
}
- g_list_free(group->members);
- free(group);
+ if (group->members) {
+ g_list_free(group->members);
+ group->members = NULL;
+ }
+
+ g_free(group);
manager->local->dev_role = WFD_DEV_ROLE_NONE;
__WDS_LOG_FUNC_EXIT__;
return 0;
}
+#if 0
int wfd_group_get_channel(wfd_group_s *group)
{
__WDS_LOG_FUNC_ENTER__;
__WDS_LOG_FUNC_EXIT__;
return group->freq;
}
+#endif
int wfd_group_is_autonomous(wfd_group_s *group)
{
return group->flags & WFD_GROUP_FLAG_AUTONOMOUS;;
}
+#if 0
int wfd_group_get_members()
{
__WDS_LOG_FUNC_ENTER__;
__WDS_LOG_FUNC_EXIT__;
return group->flags;
}
+#endif
wfd_device_s *wfd_group_find_member_by_addr(wfd_group_s *group, unsigned char *addr)
{
WDS_LOGD("Member found");
break;
}
-next:
temp = g_list_next(temp);
member = NULL;
}
member = wfd_group_find_member_by_addr(group, addr);
if (!member) {
- WDS_LOGE("Member not found [MAC: " MACSTR "]", addr);
+ WDS_LOGD("Member not found [MAC: " MACSECSTR "]",
+ MAC2SECSTR(addr));
__WDS_LOG_FUNC_EXIT__;
return -1;
}
group->members = g_list_remove(group->members, member);
- free(member);
+ g_free(member);
group->member_count--;
__WDS_LOG_FUNC_EXIT__;