[wifi-direct-manager]Merge Tizen 2.4 for sync
[platform/core/connectivity/wifi-direct-manager.git] / src / wifi-direct-group.c
index 1ac096b..ea92764 100644 (file)
 
 #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;
@@ -69,12 +72,20 @@ wfd_group_s *wfd_create_group(void *data, char *ifname, int role, unsigned char
                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");
 
@@ -103,7 +114,7 @@ wfd_group_s *wfd_create_pending_group(void *data, unsigned char * bssid)
        }
 
        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__;
@@ -117,14 +128,16 @@ wfd_group_s *wfd_create_pending_group(void *data, unsigned char * bssid)
        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;
@@ -142,21 +155,38 @@ int wfd_group_complete(void *data, char *ifname, int role, unsigned char *go_dev
                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);
        }
 
@@ -191,30 +221,31 @@ int wfd_destroy_group(void *data, char *ifname)
                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__;
@@ -228,6 +259,7 @@ int wfd_group_get_channel(wfd_group_s *group)
        __WDS_LOG_FUNC_EXIT__;
        return group->freq;
 }
+#endif
 
 int wfd_group_is_autonomous(wfd_group_s *group)
 {
@@ -243,6 +275,7 @@ 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__;
@@ -272,6 +305,7 @@ int wfd_group_get_flags(wfd_group_s *group)
        __WDS_LOG_FUNC_EXIT__;
        return group->flags;
 }
+#endif
 
 wfd_device_s *wfd_group_find_member_by_addr(wfd_group_s *group, unsigned char *addr)
 {
@@ -299,7 +333,6 @@ wfd_device_s *wfd_group_find_member_by_addr(wfd_group_s *group, unsigned char *a
                        WDS_LOGD("Member found");
                        break;
                }
-next:
                temp = g_list_next(temp);
                member = NULL;
        }
@@ -360,13 +393,14 @@ int wfd_group_remove_member(wfd_group_s *group, unsigned char *addr)
 
        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__;