wifi-direct-manager refactoring 10/11110/1 accepted/tizen/ivi/stable accepted/tizen/mobile accepted/tizen/20131210.210048 accepted/tizen/mobile/20131216.220419 submit/tizen/20131210.024110
authorJiung Yu <jiung.yu@samsung.com>
Fri, 18 Oct 2013 11:50:27 +0000 (20:50 +0900)
committerJiung Yu <jiung.yu@samsung.com>
Fri, 18 Oct 2013 12:04:23 +0000 (21:04 +0900)
Change-Id: Id8474999ddf6d4d5d1f10c33dc844fc149710fe7
Signed-off-by: Yu jiung <jiung.yu@samsung.com>
65 files changed:
AUTHORS
CMakeLists.txt [changed mode: 0644->0755]
LICENSE.Flora [deleted file]
NOTICE
debian/changelog [deleted file]
debian/compat [deleted file]
debian/control [deleted file]
debian/rules [deleted file]
debian/wifi-direct-manager.install.in.armel [deleted file]
debian/wifi-direct-manager.install.in.i386 [deleted file]
debian/wifi-direct-manager.postinst [deleted file]
debian/wifi-direct-plugin-broadcom.install.in.armel [deleted file]
debian/wifi-direct-plugin-broadcom.install.in.i386 [deleted file]
debian/wifi-direct-plugin-wpasupplicant.install.in [deleted file]
files/dhcpd-notify.sh [changed mode: 0644->0755]
files/dhcpd.eth.conf [deleted file]
files/dhcpd.wl0.conf [deleted file]
files/p2p_supp.conf [moved from files/p2p_suppl.conf with 70% similarity]
files/p2p_supp.sh [changed mode: 0644->0755]
files/p2p_supplicant [deleted file]
files/udhcp_script.non-autoip
files/wifi-direct-dhcp.sh [changed mode: 0644->0755]
files/wifi-direct-server.sh [changed mode: 0644->0755]
include/wifi-direct-client.h [new file with mode: 0644]
include/wifi-direct-event.h [moved from src/include/wifi-direct-stub.h with 58% similarity]
include/wifi-direct-group.h [new file with mode: 0644]
include/wifi-direct-manager.h [new file with mode: 0644]
include/wifi-direct-peer.h [new file with mode: 0644]
include/wifi-direct-session.h [new file with mode: 0644]
include/wifi-direct-state.h [moved from src/include/wifi-direct-client-handler.h with 64% similarity]
include/wifi-direct-util.h [new file with mode: 0644]
oem/include/wifi-direct-oem.h [deleted file]
oem/wifi-direct-oem.c
oem/wifi-direct-oem.h [new file with mode: 0644]
packaging/wifi-direct-manager.changes
packaging/wifi-direct-manager.manifest [deleted file]
packaging/wifi-direct-manager.spec
plugin/wpasupplicant/CMakeLists.txt
plugin/wpasupplicant/include/wifi-direct-wpasupplicant.h [deleted file]
plugin/wpasupplicant/src/wifi-direct-plugin-emul.c [deleted file]
plugin/wpasupplicant/src/wifi-direct-plugin.c [deleted file]
plugin/wpasupplicant/wfd-plugin-wpasupplicant-emul.c [new file with mode: 0644]
plugin/wpasupplicant/wfd-plugin-wpasupplicant.c [new file with mode: 0644]
plugin/wpasupplicant/wfd-plugin-wpasupplicant.h [new file with mode: 0644]
src/.wifi-direct-manager.c.swp [new file with mode: 0755]
src/CMakeLists.txt [deleted file]
src/include/wifi-direct-event-handler.h [deleted file]
src/include/wifi-direct-service.h [deleted file]
src/include/wifi-direct-utils.h [deleted file]
src/wifi-direct-client-handler.c [deleted file]
src/wifi-direct-client.c [new file with mode: 0644]
src/wifi-direct-dhcp.c [deleted file]
src/wifi-direct-event-handler.c [deleted file]
src/wifi-direct-event.c [new file with mode: 0644]
src/wifi-direct-group.c [new file with mode: 0644]
src/wifi-direct-main.c [deleted file]
src/wifi-direct-manager.c [new file with mode: 0644]
src/wifi-direct-peer.c [new file with mode: 0644]
src/wifi-direct-session.c [new file with mode: 0644]
src/wifi-direct-state.c
src/wifi-direct-stub.c [deleted file]
src/wifi-direct-util.c [new file with mode: 0644]
src/wifi-direct-utils.c [deleted file]
wifi-direct-manager.manifest [new file with mode: 0644]
wifi-direct-plugin-wpasupplicant.manifest

diff --git a/AUTHORS b/AUTHORS
index 1929bb3..1b2f445 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,3 +1 @@
-Dongwook Lee <dwmax.lee@samsung.com>
-Sungsik Jang <sungsik.jang@samsung.com>
 Gibyoung Kim <lastkgb.kim@samsung.com>
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index c3adc3e..9d711f6
@@ -1,5 +1,5 @@
 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(wifi-direct-manager C)
+PROJECT(wfd-manager C)
 
 #SET(PREFIX $(CMAKE_INSTALL_PREFIX))
 SET(prefix "/usr")
@@ -7,5 +7,45 @@ SET(EXEC_PREFIX "\${prefix}")
 SET(LIBDIR "\${prefix}/lib")
 SET(INCLUDEDIR "\${prefix}/include")
 
-ADD_SUBDIRECTORY(src)
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED wifi-direct glib-2.0 gobject-2.0 dlog capi-appfw-application vconf)
+FOREACH(flag ${pkgs_CFLAGS})
+       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
+                                       ${CMAKE_SOURCE_DIR}/oem
+                                       )
+
+SET(CMAKE_C_FLAGS "${CMAKE_CFLAGS} ${EXTRA_CFLAGS} -g")
+SET(CMAKE_C_FLAGS_DEBUG "O0 -g")
+SET(CMAKE_C_FLAGS_RELEASE "O2")
+
+ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
+ADD_DEFINITIONS("-DUSE_DLOG")
+
+SET(SRCS
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-manager.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-state.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-client.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-peer.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-group.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-session.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-event.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-util.c
+       ${CMAKE_SOURCE_DIR}/oem/wifi-direct-oem.c
+       )
+
+ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -ldl)
+
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd.p2p.conf DESTINATION etc/wifi-direct)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/udhcp_script.non-autoip DESTINATION etc/wifi-direct)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd-notify.sh DESTINATION bin)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/wifi-direct-server.sh DESTINATION bin)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/wifi-direct-dhcp.sh DESTINATION bin)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_supp.sh DESTINATION sbin)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_supp.conf DESTINATION etc/wifi-direct)
+
 ADD_SUBDIRECTORY(plugin/wpasupplicant)
diff --git a/LICENSE.Flora b/LICENSE.Flora
deleted file mode 100644 (file)
index 4a0af40..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-Flora License
-
-Version 1.1, April, 2013
-
-http://floralicense.org/license/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction,
-and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by
-the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and
-all other entities that control, are controlled by, or are
-under common control with that entity. For the purposes of
-this definition, "control" means (i) the power, direct or indirect,
-to cause the direction or management of such entity,
-whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
-or more of the outstanding shares, or (iii) beneficial ownership of
-such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity
-exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications,
-including but not limited to software source code, documentation source,
-and configuration files.
-
-"Object" form shall mean any form resulting from mechanical
-transformation or translation of a Source form, including but
-not limited to compiled object code, generated documentation,
-and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form,
-made available under the License, as indicated by a copyright notice
-that is included in or attached to the work (an example is provided
-in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form,
-that is based on (or derived from) the Work and for which the editorial
-revisions, annotations, elaborations, or other modifications represent,
-as a whole, an original work of authorship. For the purposes of this License,
-Derivative Works shall not include works that remain separable from,
-or merely link (or bind by name) to the interfaces of, the Work and
-Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original
-version of the Work and any modifications or additions to that Work or
-Derivative Works thereof, that is intentionally submitted to Licensor
-for inclusion in the Work by the copyright owner or by an individual or
-Legal Entity authorized to submit on behalf of the copyright owner.
-For the purposes of this definition, "submitted" means any form of
-electronic, verbal, or written communication sent to the Licensor or
-its representatives, including but not limited to communication on
-electronic mailing lists, source code control systems, and issue
-tracking systems that are managed by, or on behalf of, the Licensor
-for the purpose of discussing and improving the Work, but excluding
-communication that is conspicuously marked or otherwise designated
-in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity
-on behalf of whom a Contribution has been received by Licensor and
-subsequently incorporated within the Work.
-
-"Tizen Certified Platform" shall mean a software platform that complies
-with the standards set forth in the Tizen Compliance Specification
-and passes the Tizen Compliance Tests as defined from time to time
-by the Tizen Technical Steering Group and certified by the Tizen
-Association or its designated agent.
-
-2. Grant of Copyright License.  Subject to the terms and conditions of
-this License, each Contributor hereby grants to You a perpetual,
-worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-copyright license to reproduce, prepare Derivative Works of,
-publicly display, publicly perform, sublicense, and distribute the
-Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License.  Subject to the terms and conditions of
-this License, each Contributor hereby grants to You a perpetual,
-worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-(except as stated in this section) patent license to make, have made,
-use, offer to sell, sell, import, and otherwise transfer the Work
-solely as incorporated into a Tizen Certified Platform, where such
-license applies only to those patent claims licensable by such
-Contributor that are necessarily infringed by their Contribution(s)
-alone or by combination of their Contribution(s) with the Work solely
-as incorporated into a Tizen Certified Platform to which such
-Contribution(s) was submitted. If You institute patent litigation
-against any entity (including a cross-claim or counterclaim
-in a lawsuit) alleging that the Work or a Contribution incorporated
-within the Work constitutes direct or contributory patent infringement,
-then any patent licenses granted to You under this License for that
-Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution.  You may reproduce and distribute copies of the
-Work or Derivative Works thereof pursuant to the copyright license
-above, in any medium, with or without modifications, and in Source or
-Object form, provided that You meet the following conditions:
-
-  1. You must give any other recipients of the Work or Derivative Works
-     a copy of this License; and
-  2. You must cause any modified files to carry prominent notices stating
-     that You changed the files; and
-  3. You must retain, in the Source form of any Derivative Works that
-     You distribute, all copyright, patent, trademark, and attribution
-     notices from the Source form of the Work, excluding those notices
-     that do not pertain to any part of the Derivative Works; and
-  4. If the Work includes a "NOTICE" text file as part of its distribution,
-     then any Derivative Works that You distribute must include a readable
-     copy of the attribution notices contained within such NOTICE file,
-     excluding those notices that do not pertain to any part of
-     the Derivative Works, in at least one of the following places:
-     within a NOTICE text file distributed as part of the Derivative Works;
-     within the Source form or documentation, if provided along with the
-     Derivative Works; or, within a display generated by the Derivative Works,
-     if and wherever such third-party notices normally appear.
-     The contents of the NOTICE file are for informational purposes only
-     and do not modify the License. You may add Your own attribution notices
-     within Derivative Works that You distribute, alongside or as an addendum
-     to the NOTICE text from the Work, provided that such additional attribution
-     notices cannot be construed as modifying the License. You may add Your own
-     copyright statement to Your modifications and may provide additional or
-     different license terms and conditions for use, reproduction, or
-     distribution of Your modifications, or for any such Derivative Works
-     as a whole, provided Your use, reproduction, and distribution of
-     the Work otherwise complies with the conditions stated in this License
-     and your own copyright statement or terms and conditions do not conflict
-     the conditions stated in the License including section 3.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-any Contribution intentionally submitted for inclusion in the Work
-by You to the Licensor shall be under the terms and conditions of
-this License, without any additional terms or conditions.
-Notwithstanding the above, nothing herein shall supersede or modify
-the terms of any separate license agreement you may have executed
-with Licensor regarding such Contributions.
-
-6. Trademarks.  This License does not grant permission to use the trade
-names, trademarks, service marks, or product names of the Licensor,
-except as required for reasonable and customary use in describing the
-origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-agreed to in writing, Licensor provides the Work (and each
-Contributor provides its Contributions) on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-implied, including, without limitation, any warranties or conditions
-of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-PARTICULAR PURPOSE. You are solely responsible for determining the
-appropriateness of using or redistributing the Work and assume any
-risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-whether in tort (including negligence), contract, or otherwise,
-unless required by applicable law (such as deliberate and grossly
-negligent acts) or agreed to in writing, shall any Contributor be
-liable to You for damages, including any direct, indirect, special,
-incidental, or consequential damages of any character arising as a
-result of this License or out of the use or inability to use the
-Work (including but not limited to damages for loss of goodwill,
-work stoppage, computer failure or malfunction, or any and all
-other commercial damages or losses), even if such Contributor
-has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-the Work or Derivative Works thereof, You may choose to offer,
-and charge a fee for, acceptance of support, warranty, indemnity,
-or other liability obligations and/or rights consistent with this
-License. However, in accepting such obligations, You may act only
-on Your own behalf and on Your sole responsibility, not on behalf
-of any other Contributor, and only if You agree to indemnify,
-defend, and hold each Contributor harmless for any liability
-incurred by, or claims asserted against, such Contributor by reason
-of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Flora License to your work
-
-To apply the Flora License to your work, attach the following
-boilerplate notice, with the fields enclosed by brackets "[]"
-replaced with your own identifying information. (Don't include
-the brackets!) The text should be enclosed in the appropriate
-comment syntax for the file format. We also recommend that a
-file or class name and description of purpose be included on the
-same "printed page" as the copyright notice for easier
-identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Flora License, Version 1.1 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://floralicense.org/license/
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/NOTICE b/NOTICE
index b177a85..ccdad52 100644 (file)
--- a/NOTICE
+++ b/NOTICE
@@ -1,6 +1,3 @@
 Copyright (c) Samsung Electronics Co., Ltd. All rights reserved.
 Except as noted, this software is licensed under Apache License, Version 2.
 Please, see the LICENSE file for Apache License terms and conditions.
-
-p2p_supplicant file is licensed Flora License, Version 1.1. Please, see the LICENSE.Flora
-file for Flora License, Version 1.1 terms and conditions.
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644 (file)
index e712fc4..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-wfi-direct-manager (0.6.24) precise; urgency=low
-
-  * SMACK manifest modified
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.24
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 10 May 2013 18:02:21+0900
-
-wfi-direct-manager (0.6.23) precise; urgency=low
-
-  * prevent issue fixed
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.23
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Mon, 6 May 2013 17:24:07+0900
-
-wfi-direct-manager (0.6.22) precise; urgency=low
-
-  * NOTICE file updated
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.22
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 3 May 2013 19:07:32 +0900
-
-wfi-direct-manager (0.6.21) precise; urgency=low
-
-  * Boilerplate updated
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.21
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Thu, 2 May 2013 18:02:12 +0900
-
-wfi-direct-manager (0.6.20) precise; urgency=low
-
-  * N_SE-36637(Incorrect popup displayed)
-  * Flora license file updated
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.20
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Mon, 29 Apr 2013 16:34:49 +0900
-
-wfi-direct-manager (0.6.19) precise; urgency=low
-
-  * License file changed
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.19
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Mon, 22 Apr 2013 20:29:32 +0900
-
-wfi-direct-manager (0.6.18) precise; urgency=low
-
-  * Fix prevent #38619
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.18
-
- -- sunil85.kim <isurit@sunil85.kim>  Mon, 22 Apr 2013 16:41:35 +0900
-
-wfi-direct-manager (0.6.17) precise; urgency=low
-
-  * Fix bug N_SE-34851(Keypad popup disappeared and connection stoped)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.17
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Thu, 18 Apr 2013 20:52:52 +0900
-
-wfi-direct-manager (0.6.16) precise; urgency=low
-
-  * Fix bug N_SE-32967(Status is not changed to 'Activated')
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.16
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Thu, 11 Apr 2013 16:06:45 +0900
-
-wfi-direct-manager (0.6.15) precise; urgency=low
-
-  * Fix bug N_SE-30232(Retry connection during 120 secs on MT side)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.15
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Wed, 03 Apr 2013 17:13:22 +0900
-
-wfi-direct-manager (0.6.14) precise; urgency=low
-
-  * Fix bug N_SE-26723(Send rejection message)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.14
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Sat, 30 Mar 2013 01:49:17 +0900
-
-wfi-direct-manager (0.6.13) precise; urgency=low
-
-  * Fix bug N_SE-30232(Retry connection during 120 secs)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.13
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 29 Mar 2013 21:46:28 +0900
-
-wfi-direct-manager (0.6.12) precise; urgency=low
-
-  * Flush discovered peer data when starting new scan
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.12
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 29 Mar 2013 16:28:05 +0900
-
-wfi-direct-manager (0.6.11) precise; urgency=low
-
-  * Flush discovered peer data when starting new scan
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.11
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Wed, 13 Mar 2013 13:53:42 +0900
-
-wfi-direct-manager (0.6.10) precise; urgency=low
-
-  * to fix incorrect error return when no connected peer exist
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.10
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Wed, 13 Mar 2013 10:44:52 +0900
-
-wfi-direct-manager (0.6.9) precise; urgency=low
-
-  * to fix PLM issue and prevent defect(private code sync)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.9
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Tue, 05 Mar 2013 21:46:11 +0900
-
-wfi-direct-manager (0.6.8) precise; urgency=low
-
-  * Remove prevent issue : Resource leak, Uninitialized pointer read
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.8
-
- -- Jaehyun Kim <jeik01@samsung.com>  Mon, 04 Feb 2013 20:53:18 +0900
-
-wfi-direct-manager (0.6.7) precise; urgency=low
-
-  * Remove prevent issue : Improper use of negative value
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.7
-
- -- Jaehyun Kim <jeik01@samsung.com>  Sun, 03 Feb 2013 23:16:38 +0900
-
-wfi-direct-manager (0.6.6) precise; urgency=low
-
-  * Fix resource leaks
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.6
-
- -- Jaehyun Kim <jeik01@samsung.com>  Sun, 03 Feb 2013 20:45:45 +0900
-
-wfi-direct-manager (0.6.5) precise; urgency=low
-
-  * Remove unuseful code
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.5
-
- -- Jaehyun Kim <jeik01@samsung.com>  Sun, 03 Feb 2013 17:29:47 +0900
-
-wfi-direct-manager (0.6.4) precise; urgency=low
-
-  * Fix bug of invitation behavior
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.4
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Sun, 3 Feb 2013 02:45:22 +0900
-
-wfi-direct-manager (0.6.3) precise; urgency=low
-
-  * SMACK is corrected
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.3
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Sat, 2 Feb 2013 19:38:15 +0900
-
-wfi-direct-manager (0.6.2) precise; urgency=low
-
-  * Fix bug(N_SE-23902)
-  * Fix Group Created event issue
-  * SMACK is applyed
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.2
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 1 Feb 2013 22:03:08 +0900
-
-wfi-direct-manager (0.6.1) precise; urgency=low
-
-  * Fix bug(N_SE-23716)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.1
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 1 Feb 2013 02:59:51 +0900
-
-wfi-direct-manager (0.6.0) precise; urgency=low
-
-  * Fix bug(N_SE-23485)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.6.0
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 25 Jan 2013 21:03:11 +0900
-
-wfi-direct-manager (0.5.9) precise; urgency=low
-
-  * Package Update
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.9
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 25 Jan 2013 21:03:11 +0900
-
-wfi-direct-manager (0.5.8) precise; urgency=low
-
-  * Fix bug(N_SE-22984)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.8
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 25 Jan 2013 16:37:42 +0900
-
-wfi-direct-manager (0.5.7) precise; urgency=low
-
-  * Fix bug(N_SE-21973)
-  * Add WPS PIN feature for GO
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.7
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Mon, 21 Jan 2013 17:40:19 +0900
-
-wfi-direct-manager (0.5.6) precise; urgency=low
-
-  * Add License files.
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.6
-
- -- sunil85.kim <isurit@sunil85.kim>  Wed, 23 Jan 2013 11:22:47 +0900
-
-wfi-direct-manager (0.5.5) precise; urgency=low
-
-  * Boiler plate at Wi-Fi-Direct-Manager
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.5
-
- -- sunil85.kim <isurit@sunil85.kim>  Mon, 21 Jan 2013 12:11:44 +0900
-
-wfi-direct-manager (0.5.4) precise; urgency=low
-
-  * Modify "Group create" bug when GO
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.4
-
- -- sunil85.kim <isurit@sunil85.kim>  Thu, 17 Jan 2013 16:59:22 +0900
-
-wfi-direct-manager (0.5.3) precise; urgency=low
-
-  * Fix bug(WPS PIN keypad not worked)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.3
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Sun, 23 Dec 2012 19:41:49 +0900
-
-wfi-direct-manager (0.5.2) precise; urgency=low
-
-  * Fix bug(WPS PIN Display not worked)
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.2
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Sat, 22 Dec 2012 18:50:04 +0900
-
-wifi-direct-manager (0.5.1) precise; urgency=low
-
-  * DLog macro is changed
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.1
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Tue, 18 Dec 2012 20:02:25 +0900
-
-wifi-direct-manager (0.5.0) precise; urgency=low
-
-  * Implementation of wifi_direct_get_device_name / wifi_direct_set_device_name
-  * fixed discovery problerm in case of lisen only mode.
-  * Implementation of persistent mode
-  * added timer for discovering.
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.5.0
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Tue, 11 Dec 2012 17:47:45 +0900
-
-wifi-direct-manager (0.4.0) precise; urgency=low
-
-  * Initial Update
-  * Git : framework/connectivity/wifi-direct-manager
-  * Tag : wifi-direct-manager_0.4.0
-
- -- Gibyoung Kim <lastkgb.kim@samsung.com>  Fri, 23 Nov 2012 21:35:21 +0900
-
diff --git a/debian/compat b/debian/compat
deleted file mode 100644 (file)
index 7ed6ff8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-5
diff --git a/debian/control b/debian/control
deleted file mode 100644 (file)
index d1840f1..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-Source: wifi-direct-manager
-Section: net
-Priority: extra
-Maintainer: Dongwook Lee <dwmax.lee@samsung.com>, Sungsik Jang <sungsik.jang@samsung.com>
-Uploaders: Dongwook Lee <dwmax.lee@samsung.com> Sungsik Jang <sungsik.jang@samsung.com>, Taeksu Shin <taeksu.shin@samsung.com>
-Build-Depends: debhelper (>= 5), libwifi-direct-dev, autotools-dev, libslp-setting-dev, libglib2.0-dev, dlog-dev, libdbus-glib-1-dev, capi-appfw-application-dev
-Standards-Version: 3.7.2
-
-Package: wifi-direct-manager
-Section: net
-Architecture: any 
-Depends: ${shlibs:Depends}, libslp-setting-0, libglib2.0-0
-Description: Wi-Fi Direct manager
-
-Package: wifi-direct-plugin-broadcom
-Section: net
-Architecture: any 
-Depends: ${shlibs:Depends}
-Description: Wi-Fi Direct plugin for Broadcom
-
-Package: wifi-direct-plugin-wpasupplicant
-Section: net
-Architecture: any 
-Depends: ${shlibs:Depends}
-Description: Wi-Fi Direct plugin for wpa supplicant
-
diff --git a/debian/rules b/debian/rules
deleted file mode 100755 (executable)
index 1e73c13..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Sample debian/rules that uses debhelper.
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-CFLAGS ?= -Wall -g
-CXXFLAGS ?=  -Wall -g
-LDFLAGS ?= 
-PREFIX ?= /usr
-DATADIR ?= /opt
-
-ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
-       CFLAGS += -O0
-       CXXFLAGS += -O0
-else
-       CFLAGS += -O2
-       CXXFLAGS += -O2
-endif
-
-CFLAGS += -DX1SETTING -D_DLOG_UTIL
-#LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed
-LDFLAGS += -Wl,--rpath=$(PREFIX)/lib
-
-
-configure: configure-stamp
-configure-stamp:
-       dh_testdir
-       # Add here commands to configure the package.
-       CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" cmake . -DCMAKE_INSTALL_PREFIX=$(PREFIX)
-
-       touch configure-stamp
-
-build: build-stamp
-
-build-stamp: configure-stamp 
-       dh_testdir
-
-       # Add here commands to compile the package.
-       $(MAKE) -j5
-
-       dpkg-architecture
-       echo "deb-arch = ${DEB_BUILD_ARCH}"
-
-       cp debian/wifi-direct-manager.install.in.${DEB_BUILD_ARCH} debian/wifi-direct-manager.install.in 
-       cp debian/wifi-direct-plugin-broadcom.install.in.${DEB_BUILD_ARCH} debian/wifi-direct-plugin-broadcom.install.in 
-               
-       for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
-               cat $$f > $${f%.in}; \
-               sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \
-               sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \
-        done
-       
-       touch $@
-
-clean:
-       dh_testdir
-       dh_testroot
-       rm -f build-stamp configure-stamp
-
-       # Add here commands to clean up after the build process.
-       -$(MAKE) clean
-       rm -rf CMakeCache.txt
-       rm -rf CMakeFiles
-       rm -rf cmake_install.cmake
-       rm -rf Makefile
-       rm -rf install_manifest.txt
-       
-       rm -rf src/CMakeCache.txt
-       rm -rf src/CMakeFiles
-       rm -rf src/cmake_install.cmake
-       rm -rf src/install_manifest.txt
-       rm -rf src/Makefile
-       
-       rm -rf plugin/broadcom/CMakeCache.txt
-       rm -rf plugin/broadcom/CMakeFiles
-       rm -rf plugin/boradcom/cmake_install.cmake
-       rm -rf plugin/broadcom/install_manifest.txt
-       rm -rf plugin/broadcom/Makefile
-
-       rm -rf plugin/wpasupplicant/CMakeCache.txt
-       rm -rf plugin/wpasupplicant/CMakeFiles
-       rm -rf plugin/wpasupplicant/cmake_install.cmake
-       rm -rf plugin/wpasupplicant/install_manifest.txt
-       rm -rf plugin/wpasupplicant/Makefile
-
-       for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
-               rm -f $${f%.in}; \
-       done
-
-       dh_clean 
-
-install: build
-       dh_testdir
-       dh_testroot
-       dh_clean -k 
-       dh_installdirs
-
-       # Add here commands to install the package into debian/wavplayer.
-       $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
-       dh_testdir
-       dh_testroot
-       dh_installchangelogs 
-       dh_installdocs
-       dh_installexamples
-       dh_install --sourcedir=debian/tmp
-#      dh_installmenu
-#      dh_installdebconf       
-#      dh_installlogrotate
-#      dh_installemacsen
-#      dh_installpam
-#      dh_installmime
-#      dh_python
-#      dh_installinit
-#      dh_installcron
-#      dh_installinfo
-       dh_installman
-       dh_link
-#      dh_strip --dbg-package=
-       dh_compress
-       dh_fixperms
-#      dh_perl
-       dh_makeshlibs
-       dh_installdeb
-       dh_shlibdeps
-       dh_gencontrol
-       dh_md5sums
-       dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/debian/wifi-direct-manager.install.in.armel b/debian/wifi-direct-manager.install.in.armel
deleted file mode 100644 (file)
index cc033b3..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-@PREFIX@/bin/wfd-manager
-@PREFIX@/etc/wifi-direct/dhcpd.p2p.conf
-@PREFIX@/etc/wifi-direct/dhcpd.wl0.conf
-@PREFIX@/etc/wifi-direct/dhcpd.eth.conf
-@PREFIX@/etc/wifi-direct/udhcp_script.non-autoip
-@PREFIX@/etc/wifi-direct/p2p_suppl.conf
-@PREFIX@/bin/dhcpd-notify.sh
-@PREFIX@/bin/wifi-direct-server.sh
-@PREFIX@/bin/wifi-direct-dhcp.sh
diff --git a/debian/wifi-direct-manager.install.in.i386 b/debian/wifi-direct-manager.install.in.i386
deleted file mode 100644 (file)
index cc033b3..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-@PREFIX@/bin/wfd-manager
-@PREFIX@/etc/wifi-direct/dhcpd.p2p.conf
-@PREFIX@/etc/wifi-direct/dhcpd.wl0.conf
-@PREFIX@/etc/wifi-direct/dhcpd.eth.conf
-@PREFIX@/etc/wifi-direct/udhcp_script.non-autoip
-@PREFIX@/etc/wifi-direct/p2p_suppl.conf
-@PREFIX@/bin/dhcpd-notify.sh
-@PREFIX@/bin/wifi-direct-server.sh
-@PREFIX@/bin/wifi-direct-dhcp.sh
diff --git a/debian/wifi-direct-manager.postinst b/debian/wifi-direct-manager.postinst
deleted file mode 100755 (executable)
index e1914bf..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-#
-
-chmod 644 /usr/etc/wifi-direct/dhcpd.p2p.conf
-chmod 644 /usr/etc/wifi-direct/dhcpd.wl0.conf
-chmod 644 /usr/etc/wifi-direct/dhcpd.eth.conf
-chmod 755 /usr/bin/dhcpd-notify.sh
-chmod 755 /usr/etc/wifi-direct/udhcp_script.non-autoip
-chmod 755 /usr/bin/wifi-direct-server.sh
-chmod 755 /usr/bin/wifi-direct-dhcp.sh
-
-/usr/bin/vconftool set -t int memory/wifi_direct/state 0 -u 5000 -i
-/usr/bin/vconftool set -t int memory/private/wifi_direct_manager/dhcp_ip_lease 0 -i
-/usr/bin/vconftool set -t string memory/private/wifi_direct_manager/dhcpc_server_ip 0.0.0.0 -i
-sync
-
diff --git a/debian/wifi-direct-plugin-broadcom.install.in.armel b/debian/wifi-direct-plugin-broadcom.install.in.armel
deleted file mode 100644 (file)
index 41c4c56..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-@PREFIX@/lib/wifi-direct-plugin-broadcom.so
-@PREFIX@/lib/libbcmp2p.so
-@PREFIX@/lib/libbcmp2papp.so
-@PREFIX@/lib/libwpscli.so
-#@PREFIX@/lib/libbcmcrypto.so
-@PREFIX@/lib/libbcmp2psig.so
diff --git a/debian/wifi-direct-plugin-broadcom.install.in.i386 b/debian/wifi-direct-plugin-broadcom.install.in.i386
deleted file mode 100644 (file)
index 4724ae4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@PREFIX@/lib/wifi-direct-plugin-broadcom.so
diff --git a/debian/wifi-direct-plugin-wpasupplicant.install.in b/debian/wifi-direct-plugin-wpasupplicant.install.in
deleted file mode 100644 (file)
index 887565a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@PREFIX@/lib/wifi-direct-plugin-wpasupplicant.so  
old mode 100644 (file)
new mode 100755 (executable)
diff --git a/files/dhcpd.eth.conf b/files/dhcpd.eth.conf
deleted file mode 100644 (file)
index 5f51a2f..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-start          192.168.49.20           #default: 192.168.0.20
-end            192.168.49.40           #default: 192.168.0.254
-interface      wlan0                   #default: wlan0
-max_leases     20                      #default: 254
-notify_file    /usr/bin/dhcpd-notify.sh
-
-option subnet  255.255.255.0
-option router  192.168.49.1
-option lease   864000                  # 10 days of seconds
diff --git a/files/dhcpd.wl0.conf b/files/dhcpd.wl0.conf
deleted file mode 100644 (file)
index 426f001..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-start          192.168.49.20           #default: 192.168.0.20
-end            192.168.49.40           #default: 192.168.0.254
-interface      wl0.1                   #default: wlan0
-max_leases     20                      #default: 254
-notify_file     /usr/bin/dhcpd-notify.sh
-
-
-option subnet  255.255.255.0
-option router  192.168.49.1
-option lease   864000                  # 10 days of seconds
similarity index 70%
rename from files/p2p_suppl.conf
rename to files/p2p_supp.conf
index 61d7003..1456e09 100644 (file)
@@ -1,13 +1,13 @@
 ##### p2p_supplicant configuration file template #####
 update_config=1
-ctrl_interface=/var/run/p2p_supplicant
+ctrl_interface=/var/run/wpa_supplicant
 eapol_version=1
 ap_scan=1
 p2p_listen_reg_class=81
 p2p_listen_channel=1
 p2p_oper_reg_class=115
 p2p_oper_channel=48
-device_name=TizenProxima
+device_name=Tizen
 device_type=10-0050F204-5
 config_methods=push_button
 driver_param=use_p2p_group_interface=1
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index fd83fab..8bba209
@@ -7,26 +7,26 @@ start()
 
        case $HARDWARE_MODEL in
                "SLP_PQ")       /bin/echo "This is PQ"
-                       /usr/sbin/p2p_supplicant -t -B -ddd -Dnl80211 -g/var/run/p2p_global -f/var/log/p2p_supplicant.log
+                       /usr/sbin/wpa_supplicant -t -B -ddd -g/var/run/wpa_global -f/var/log/p2p_supplicant.log
                ;;
                "U1SLP" | "U1HD")       /bin/echo "This is U1SLP"
-                       /usr/sbin/p2p_supplicant -t -B -ddd -Dwext -f/var/log/p2p_supplicant.log
+                       /usr/sbin/wpa_supplicant -t -B -ddd -Dwext -f/var/log/p2p_supplicant.log
                ;;
                "SLP7_C210")    /bin/echo "This is C210"
-                       /usr/sbin/p2p_supplicant -t -B -ddd -Dwext -f/var/log/p2p_supplicant.log
+                       /usr/sbin/wpa_supplicant -t -B -ddd -Dwext -f/var/log/p2p_supplicant.log
                ;;
                "SLP10_C210")
-                       /usr/sbin/p2p_supplicant -t -B -ddd -Dwext -f/var/log/p2p_supplicant.log
+                       /usr/sbin/wpa_supplicant -t -B -ddd -Dwext -f/var/log/p2p_supplicant.log
                ;;
                *)
-                       /usr/sbin/p2p_supplicant -t -B -ddd -Dnl80211 -g/var/run/p2p_global -f/var/log/p2p_supplicant.log
+                       /usr/sbin/wpa_supplicant -t -B -ddd -g/var/run/wpa_global -f/var/log/p2p_supplicant.log
                ;;
        esac
 }
 
 stop()
 {
-       killall p2p_supplicant
+       killall wpa_supplicant
 }
 
 case $1 in
diff --git a/files/p2p_supplicant b/files/p2p_supplicant
deleted file mode 100755 (executable)
index e4ca54f..0000000
Binary files a/files/p2p_supplicant and /dev/null differ
index 487415e..bbab6e2 100644 (file)
@@ -4,7 +4,6 @@
 
 [ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
 
-RESOLV_CONF="/etc/resolv.conf"
 TEMP_DHCP_FILE="/tmp/udhcpc_dyn.tmp"
 UDHCPC_LOG="/tmp/udhcpc_log"
 
@@ -33,12 +32,6 @@ case "$1" in
 #                      done
 #              fi
 
-               echo -n > $RESOLV_CONF
-               [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
-               for i in $dns ; do
-                       echo "adding dns $i" >> $UDHCPC_LOG
-                       echo nameserver $i >> $RESOLV_CONF
-               done
                echo serveraddr $serverid >> $TEMP_DHCP_FILE
                echo leasetime $lease >> $TEMP_DHCP_FILE
 
old mode 100644 (file)
new mode 100755 (executable)
index d33a2d8..2cc81d3
@@ -1,4 +1,5 @@
 #!/bin/sh
+INTERFACE_NAME="p2p-wlan0-0"
 INTERFACE_PREFIX="p2p"
 TARGET="REDWOOD"
 DEFAULT_IP="192.168.49.1"
@@ -26,7 +27,7 @@ if [ "${val}" -eq "1" ]; then
        TARGET="EMUL"
 fi
 
-interface=`ifconfig|grep ^${INTERFACE_PREFIX}|cut -d" " -f1`
+interface=`ifconfig|grep ^${INTERFACE_NAME}|cut -d" " -f1`
 echo "Target is ${TARGET} and interface ${INTERFACE_PREFIX}: ${interface}."
 
 start_dhcp_server()
old mode 100644 (file)
new mode 100755 (executable)
index 028d99a..a993eac
@@ -7,7 +7,6 @@ start_wifi_direct()
        if [ "X${target}" == "X" ]; then
                echo "${program} is not running"
                echo "Launching ${program}"
-               . /etc/profile.d/tizen_platform_env.sh
                /usr/bin/${program}&
                sleep 1
        else
diff --git a/include/wifi-direct-client.h b/include/wifi-direct-client.h
new file mode 100644 (file)
index 0000000..3c7166d
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct client functions and structures.
+ *
+ * @file               wifi-direct-client.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WIFI_DIRECT_CLIENT_H__
+#define __WIFI_DIRECT_CLIENT_H__
+
+#define WFD_SERVER_SOCK_PATH "/tmp/wfd_client_socket"
+#define WFD_SERVER_SOCK_MODE (S_IRWXU | S_IRWXG | S_IRWXO)
+#define WFD_MAX_CLIENT 16
+
+#define SOCK_FD_MIN 3
+#define WFD_POLL_TIMEOUT 2000
+
+typedef struct {
+       int ssock;
+       int asock;
+       int client_id;
+       int gsource_id;
+} wfd_client_s;
+
+int wfd_client_handler_deinit(wfd_manager_s *manager);
+int wfd_client_handler_init(wfd_manager_s *manager);
+int wfd_client_send_event(wfd_manager_s *manager, wifi_direct_client_noti_s *noti);
+
+#endif /* __WIFI_DIRECT_CLIENT_H__ */
similarity index 58%
rename from src/include/wifi-direct-stub.h
rename to include/wifi-direct-event.h
index 7f3fb5d..5447c08 100644 (file)
  *
  */
 
-#ifndef __WIFI_DIRECT_STUB_H_
-#define __WIFI_DIRECT_STUB_H_
+/**
+ * This file declares wifi direct event functions.
+ *
+ * @file               wifi-direct-event.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WIFI_DIRECT_EVENT_H__
+#define __WIFI_DIRECT_EVENT_H__
 
-#include "wifi-direct-internal.h"
-#include "wifi-direct-utils.h"
 
-int wfd_server_is_fd_writable(int fd);
-bool wfd_server_register_client(int sockfd);
-void wfd_server_process_client_request(wifi_direct_client_request_s * client_req);
-void wfd_server_reset_client(int sync_sockfd);
-void wfd_server_print_client();
-int wfd_server_read_socket_event(int sockfd, char* dataptr, int datalen);
 
-#endif         //__WIFI_DIRECT_STUB_H_
+int wfd_event_notify_clients(wfd_manager_s *manager, wifi_direct_client_noti_s *noti);
+int wfd_process_event(void *user_data, void *data);
 
+#endif /* __WIFI_DIRECT_EVENT_H__ */
diff --git a/include/wifi-direct-group.h b/include/wifi-direct-group.h
new file mode 100644 (file)
index 0000000..e0490e9
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct group functions and structures.
+ *
+ * @file               wifi-direct-group.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WIFI_DIRECT_GROUP_H__
+#define __WIFI_DIRECT_GROUP_H__
+
+#define IFACE_NAME_LEN 16
+
+typedef enum {
+       WFD_GROUP_ROLE_NONE,
+       WFD_GROUP_ROLE_GC,
+       WFD_GROUP_ROLE_GO,
+} wfd_group_role_e;
+
+typedef enum {
+       WFD_GROUP_FLAG_NONE,
+       WFD_GROUP_FLAG_PERSISTENT,
+       WFD_GROUP_FLAG_AUTONOMOUS,
+} wfd_group_flag_e;
+
+typedef struct {
+       int pending;
+       char ifname[IFACE_NAME_LEN+1];
+       char ssid[DEV_NAME_LEN+1];
+       unsigned char bssid[MACADDR_LEN];
+       unsigned char go_dev_addr[MACADDR_LEN];
+       int flags;              // Autonomous, Persistent
+       int role;               // local device role
+       int freq;               // MHz
+       GList *members;
+       int member_count;
+       char pass[PASSPHRASE_LEN+1];
+} wfd_group_s;
+
+
+wfd_group_s *wfd_create_group(void *data, char *ifname, int role, unsigned char *go_dev_addr);
+wfd_group_s *wfd_create_pending_group(void *data, unsigned char * bssid);
+int wfd_group_complete(void *data, char *ifname, int role, unsigned char *go_dev_addr);
+int wfd_destroy_group(void * data, char *ifname);
+int wfd_group_get_channel(void *data, unsigned char *bssid);
+int wfd_group_is_autonomous(void *data);
+int wfd_group_get_members();
+int wfd_group_make_persistent();
+int wfd_group_get_flags(void *data, unsigned char *bssid);
+wfd_device_s *wfd_group_find_peer_by_intf_addr(wfd_group_s *group, unsigned char *intf_addr);
+wfd_device_s *wfd_group_find_peer_by_dev_addr(wfd_group_s *group, unsigned char *dev_addr);
+int wfd_group_add_member(void *data, unsigned char *bssid, unsigned char *peer);
+int wfd_group_remove_member(void *data, unsigned char *bssid, unsigned char *peer);
+
+#endif /* __WIFI_DIRECT_GROUP_H__ */
diff --git a/include/wifi-direct-manager.h b/include/wifi-direct-manager.h
new file mode 100644 (file)
index 0000000..dc13c40
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct manager functions and structures.
+ *
+ * @file               wifi-direct-manager.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WIFI_DIRECT_MANAGER_H__
+#define __WIFI_DIRECT_MANAGER_H__
+
+#define DEFAULT_DEVICE_NAME "Tizen_Device"
+#define WFD_MAX_CLIENT 16
+#define WFD_MAX_STATION 8
+
+#define DEV_NAME_LEN 32
+#define MACADDR_LEN 6
+#define MACSTR_LEN 18
+#define IPADDR_LEN 4
+#define IPSTR_LEN 16
+#define PINSTR_LEN 8
+#define PASSPHRASE_LEN 8
+
+#if 0
+typedef enum {
+       WFD_STATE_DEACTIVATED,
+       WFD_STATE_ACTIVATED,
+       WFD_STATE_IDLE,                 // passive scaning
+       WFD_STATE_SCANNING,             // active scanning
+       WFD_STATE_CONNECTING,
+       WFD_STATE_CONNECTED,
+} wfd_state_e;
+#endif
+
+typedef enum {
+       WFD_WPS_MODE_NONE,
+       WFD_WPS_MODE_PBC = 0x1,
+       WFD_WPS_MODE_DISPLAY = 0x2,
+       WFD_WPS_MODE_KEYPAD = 0x4,
+} wfd_wps_mode_e;
+
+typedef enum {
+       WFD_DEV_ROLE_NONE,
+       WFD_DEV_ROLE_GC,
+       WFD_DEV_ROLE_GO,
+} wfd_dev_role_e;
+
+typedef enum {
+       WFD_SCAN_MODE_ACTIVE,
+       WFD_SCAN_MODE_PASSIVE,
+} wfd_scan_mode_e;
+
+typedef struct {
+       char dev_name[DEV_NAME_LEN+1];
+       unsigned char dev_addr[MACADDR_LEN];
+       unsigned char intf_addr[MACADDR_LEN];
+       unsigned char go_dev_addr[MACADDR_LEN];
+       int dev_role;
+       int config_methods;
+       int pri_dev_type;
+       int sec_dev_type;
+       int dev_flags;
+       int group_flags;
+       int wps_mode;
+
+       int wfd_dev_info;
+       int wfd_ctrl_port;
+       int wfd_max_tput;
+
+       unsigned char ip_addr[IPADDR_LEN];
+} wfd_device_s;
+
+typedef struct {
+       GMainLoop *main_loop;
+
+       int serv_sock;
+       unsigned int client_handle;     // for accept clients
+       GList *clients;
+       unsigned int client_count;
+
+       int state;
+       unsigned int exit_timer;
+
+       wfd_device_s *local;
+       int go_intent;
+       int req_wps_mode;
+       int max_station;
+       int autoconnection;
+       int scan_mode;
+
+       GList *peers;
+       unsigned int peer_count;
+
+       void *session;
+
+       void *group;
+
+       void *oem_ops;
+       void *plugin_handle;
+} wfd_manager_s;
+
+wfd_manager_s *wfd_get_manager();
+int wfd_local_reset_data(wfd_manager_s *manager);
+int wfd_local_get_dev_name(char *dev_name);
+int wfd_local_set_dev_name(char *dev_name);
+int wfd_local_get_dev_mac(unsigned char *dev_mac);
+int wfd_local_get_intf_mac(unsigned char *intf_mac);
+int wfd_local_get_ip_addr(char *ip_str);
+int wfd_local_get_supported_wps_mode(int *wps_mode);
+int wfd_local_set_req_wps_mode(int wps_mode);
+int wfd_local_get_wps_mode(int *wps_mode);
+int wfd_local_get_req_wps_mode(int *req_wps_mode);
+
+int wfd_manager_get_go_intent(int *go_intent);
+int wfd_manager_set_go_intent(int go_intent);
+int wfd_manager_get_max_station(int *max_station);
+int wfd_manager_set_max_station(int max_station);
+int wfd_manager_get_autoconnection(int *autoconnection);
+int wfd_manager_set_autoconnection(int autoconnection);
+int wfd_manager_get_req_wps_mode(int *req_wps_mode);
+int wfd_manager_set_req_wps_mode(int req_wps_mode);
+
+int wfd_manager_local_config_set(wfd_manager_s *manager);
+int wfd_manager_activate(wfd_manager_s *manager);
+int wfd_manager_deactivate(wfd_manager_s *manager);
+int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr);
+int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr);
+int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers);
+int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data);
+wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr);
+wfd_device_s *wfd_manager_get_current_peer(wfd_manager_s *manager);
+int wfd_manager_get_goup_ifname(char **ifname);
+
+#endif /* __WIFI_DIRECT_MANAGER_H__ */
diff --git a/include/wifi-direct-peer.h b/include/wifi-direct-peer.h
new file mode 100644 (file)
index 0000000..c25a471
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct peer functions.
+ *
+ * @file               wifi-direct-peer.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WIFI_DIRECT_PEER_H__
+#define __WIFI_DIRECT_PEER_H__
+
+
+wfd_device_s *wfd_add_peer(void *data, unsigned char *dev_addr, char *dev_name);
+int wfd_remove_peer(void *data, unsigned char *dev_addr);
+int wfd_peer_clear_all(void *data);
+wfd_device_s *wfd_peer_find_by_dev_addr(void *data, unsigned char *dev_addr);
+wfd_device_s *wfd_peer_find_by_intf_addr(void *data, unsigned char *intf_addr);
+wfd_device_s *wfd_peer_find_current_peer(void *data);
+int wfd_peer_set_data(unsigned char *dev_addr, int type, int data);
+int wfd_peer_get_data(unsigned char *dev_addr, int type, int data);
+
+#endif /* __WIFI_DIRECT_PEER_H__ */
diff --git a/include/wifi-direct-session.h b/include/wifi-direct-session.h
new file mode 100644 (file)
index 0000000..411966a
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct session functions and structures.
+ *
+ * @file               wifi-direct-session.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WIFI_DIRECT_SESSION_H__
+#define __WIFI_DIRECT_SESSION_H__
+
+typedef enum {
+       SESSION_STATE_CREATED,
+       SESSION_STATE_STARTED,
+       SESSION_STATE_GO_NEG,
+       SESSION_STATE_WPS,
+       SESSION_STATE_KEY_NEG,
+       SESSION_STATE_COMPLETED,
+       SESSION_STATE_STOPPED,
+} session_state_e;
+
+typedef enum {
+       SESSION_DIRECTION_INCOMING,
+       SESSION_DIRECTION_OUTGOING,
+} session_direction_e;
+
+typedef struct {
+       int state;
+       int timer;
+       int connecting_120;
+       int direction;
+       int invitation;
+       wfd_device_s *peer;
+       int wps_mode;
+       int req_wps_mode;
+       int go_intent;
+       int freq;
+       char wps_pin[PINSTR_LEN+1];
+} wfd_session_s;
+
+wfd_session_s *wfd_create_session(void *data, unsigned char *peer_addr, int wps_mode, int direction);
+int wfd_destroy_session(void *data);
+int wfd_session_start(wfd_session_s *session);
+int wfd_session_connect(wfd_session_s *session);
+int wfd_session_reject(wfd_session_s *session);
+int wfd_session_wps(wfd_session_s *session);
+int wfd_session_invite(wfd_session_s *session);
+int wfd_session_join(wfd_session_s *session);
+wfd_device_s *wfd_session_get_peer(wfd_session_s *session);
+unsigned char *wfd_session_get_peer_addr(wfd_session_s *session);
+int wfd_session_get_state(wfd_session_s *session);
+int wfd_session_stop(wfd_session_s *session);
+int wfd_session_complete(wfd_session_s *session);
+
+int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event);
+
+#endif /* __WIFI_DIRECT_SESSION_H__ */
similarity index 64%
rename from src/include/wifi-direct-client-handler.h
rename to include/wifi-direct-state.h
index a516730..472b47f 100644 (file)
  *
  */
 
-#ifndef __WIFI_DIRECT_CLIENT_HANDLER_H_
-#define __WIFI_DIRECT_CLIENT_HANDLER_H_
-
-#include "wifi-direct.h"
+/**
+ * This file declares wifi direct client functions.
+ *
+ * @file               wifi-direct-state.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
 
-//void wfd_server_process_client_request(wifi_direct_client_request_s * client_req);
+#ifndef __WIFI_DIRECT_STATE_H__
+#define __WIFI_DIRECT_STATE_H__
 
 
-#endif         //__WIFI_DIRECT_CLIENT_HANDLER_H_
+int wfd_state_set(wfd_manager_s *manager, int state);
+int wfd_state_get(wfd_manager_s *manager, int *state);
 
+#endif /* __WIFI_DIRECT_STATE_H__ */
diff --git a/include/wifi-direct-util.h b/include/wifi-direct-util.h
new file mode 100644 (file)
index 0000000..d5dc4db
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct util functions.
+ *
+ * @file               wifi-direct-util.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WIFI_DIRECT_UTIL_H__
+#define __WIFI_DIRECT_UTIL_H__
+
+#define DEFAULT_MAC_FILE_PATH "/opt/etc/.mac.info"
+#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
+#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
+#define IP2STR(a) (a)[0], (a)[1], (a)[2], (a)[3]
+#define IPSTR "%d.%d.%d.%d"
+
+#define VCONFKEY_DHCPS_IP_LEASE "memory/private/wifi_direct_manager/dhcp_ip_lease"
+#define VCONFKEY_DHCPC_SERVER_IP "memory/private/wifi_direct_manager/dhcpc_server_ip"
+#define DHCP_DUMP_FILE "/tmp/dhcp-client-table"
+#define MAX_DHCP_DUMP_SIZE 64    // Single lease format: [99:66:dd:00:11:aa 192.168.16.20 00:00:60]
+
+#ifdef USE_DLOG
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "WIFI_DIRECT_MANAGER"
+
+#define WDS_LOGV(format, args...) LOGV(format, ##args)
+#define WDS_LOGD(format, args...) LOGD(format, ##args)
+#define WDS_LOGI(format, args...) LOGI(format, ##args)
+#define WDS_LOGW(format, args...) LOGW(format, ##args)
+#define WDS_LOGE(format, args...) LOGE(format, ##args)
+#define WDS_LOGF(format, args...) LOGF(format, ##args)
+
+#define __WDS_LOG_FUNC_ENTER__ LOGV("Enter")
+#define __WDS_LOG_FUNC_EXIT__ LOGV("Quit")
+
+#else /* USE_DLOG */
+
+#define WDS_LOGV(format, args...)
+#define WDS_LOGD(format, args...)
+#define WDS_LOGI(format, args...)
+#define WDS_LOGW(format, args...)
+#define WDS_LOGE(format, args...)
+#define WDS_LOGF(format, args...)
+
+#define __WDS_LOG_FUNC_ENTER__
+#define __WDS_LOG_FUNC_EXIT__
+
+#endif /* USE_DLOG */
+
+int wfd_util_freq_to_channel(int freq);
+int wfd_util_get_phone_name(char *phone_name);
+void wfd_util_set_dev_name_notification();
+void wfd_util_unset_dev_name_notification();
+int wfd_util_check_wifi_state();
+int wfd_util_check_mobile_ap_state();
+int wfd_util_wifi_direct_activatable();
+int wfd_util_get_wifi_direct_state();
+int wfd_util_set_wifi_direct_state(int state);
+int wfd_util_get_local_dev_mac(unsigned char *dev_mac);
+int wfd_util_start_wifi_direct_popup();
+int wfd_util_dhcps_start();
+int wfd_util_dhcps_wait_ip_leased(wfd_device_s *peer);
+int wfd_util_dhcps_stop();
+int wfd_util_dhcpc_start(wfd_device_s *peer);
+int wfd_util_dhcpc_stop();
+int wfd_util_dhcpc_get_ip(char *ifname, unsigned char *ip_addr, int is_IPv6);
+int wfd_util_dhcpc_get_server_ip(unsigned char* ip_addr);
+
+#endif /* __WIFI_DIRECT_UTIL_H__ */
diff --git a/oem/include/wifi-direct-oem.h b/oem/include/wifi-direct-oem.h
deleted file mode 100644 (file)
index dd1ec3d..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifndef __WIFI_DIRECT_OEM_H_
-#define __WIFI_DIRECT_OEM_H_
-
-#include "wifi-direct.h"
-#include "wifi-direct-internal.h"
-#include "wifi-direct-event-handler.h"
-
-
-int wfd_oem_init(wfd_oem_event_cb event_callback);
-int wfd_oem_destroy(void);
-int wfd_oem_activate(void);
-int wfd_oem_deactivate(void);
-int wfd_oem_connect(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config);
-int wfd_oem_wps_pbc_start(unsigned char mac_addr[6]);
-int wfd_oem_wps_pin_start(unsigned char mac_addr[6]);
-int wfd_oem_disconnect(void);
-int wfd_oem_disconnect_sta(unsigned char mac_addr[6]);
-int wfd_oem_reject_connection(unsigned char mac_addr[6]);
-bool wfd_oem_is_discovery_enabled(void);
-int wfd_oem_start_discovery(bool listen_only, int timeout);
-int wfd_oem_cancel_discovery(void);
-int wfd_oem_get_discovery_result(wfd_discovery_entry_s ** peer_list, int* peer_num);
-int wfd_oem_get_peer_info(unsigned char *mac_addr, wfd_discovery_entry_s **peer);
-int wfd_oem_send_provision_discovery_request(unsigned char mac_addr[6], wifi_direct_wps_type_e config_method, int is_peer_go);
-int wfd_oem_send_invite_request(unsigned char dev_mac_addr[6]);
-int wfd_oem_create_group(char* ssid);
-int wfd_oem_cancel_group(void);
-int wfd_oem_activate_pushbutton(void);
-char* wfd_oem_get_default_interface_name(void);
-bool wfd_oem_dhcpc_get_ip_address(char *ipaddr_buf, int len, int is_IPv6);
-char* wfd_oem_get_ip(void);
-int wfd_oem_set_ssid(char* ssid);
-bool wfd_oem_is_groupowner(void);
-bool wfd_oem_is_groupclient(void);
-int wfd_oem_get_ssid(char* ssid, int len);
-char* wfd_oem_get_ip(void);
-int wfd_oem_set_wps_pin(char* pin);
-int wfd_oem_get_wps_pin(char* wps_pin, int len);
-int wfd_oem_generate_wps_pin(void);
-int wfd_oem_set_wpa_passphrase(char* wpa_key);
-int wfd_oem_get_supported_wps_mode(void);
-int wfd_oem_get_connected_peers_info(wfd_connected_peer_info_s ** peer_list, int* peer_num);
-int wfd_oem_get_connected_peers_count(int* peer_num);
-int wfd_oem_set_oem_loglevel(int is_increase);
-int wfd_oem_get_go_intent(int* intent); 
-int wfd_oem_set_go_intent(int intent); 
-int wfd_oem_set_device_type(wifi_direct_primary_device_type_e primary_cat, wifi_direct_secondary_device_type_e sub_cat);
-int wfd_oem_get_device_mac_address(unsigned char* device_mac);
-int wfd_oem_get_disassoc_sta_mac(unsigned char mac_addr[6]);
-int wfd_oem_get_assoc_sta_mac(unsigned char mac_addr[6]);
-int wfd_oem_get_requestor_mac(unsigned char mac_addr[6]);
-int wfd_oem_get_operating_channel(void);
-int wfd_oem_get_persistent_group_info(wfd_persistent_group_info_s ** persistent_group_list, int* persistent_group_num);
-int wfd_oem_remove_persistent_group(wfd_persistent_group_info_s * persistent_group);
-int wfd_oem_set_persistent_group_enabled(bool enabled);
-int wfd_oem_connect_for_persistent_group(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config);
-
-struct wfd_oem_operations {
-       int (*wfd_oem_init)(wfd_oem_event_cb event_callback);
-       int (*wfd_oem_destroy)(void);
-       int (*wfd_oem_activate)(void);
-       int (*wfd_oem_deactivate)(void);
-       int (*wfd_oem_connect)(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config);
-       int (*wfd_oem_wps_pbc_start)(unsigned char mac_addr[6]);
-       int (*wfd_oem_wps_pin_start)(unsigned char mac_addr[6]);
-       int (*wfd_oem_disconnect)(void);
-       int (*wfd_oem_disconnect_sta)(unsigned char mac_addr[6]);
-       int (*wfd_oem_reject_connection) (unsigned char mac_addr[6]);
-       bool (*wfd_oem_is_discovery_enabled)(void);
-       int (*wfd_oem_start_discovery)(bool listen_only, int timeout);
-       int (*wfd_oem_cancel_discovery)(void);
-       int (*wfd_oem_get_discovery_result)(wfd_discovery_entry_s ** peer_list, int* peer_num);
-       int (*wfd_oem_get_peer_info)(unsigned char *mac_addr, wfd_discovery_entry_s **peer);
-       int (*wfd_oem_send_provision_discovery_request)(unsigned char mac_addr[6], wifi_direct_wps_type_e config_method, int is_peer_go);
-       int (*wfd_oem_send_invite_request)(unsigned char dev_mac_addr[6]);
-       int (*wfd_oem_create_group)(char* ssid);
-       int (*wfd_oem_cancel_group)(void);
-       int (*wfd_oem_activate_pushbutton)(void);
-       char* (*wfd_oem_get_default_interface_name)(void);
-       bool (*wfd_oem_dhcpc_get_ip_address)(char *ipaddr_buf, int len, int is_IPv6);
-       char* (*wfd_oem_get_ip)(void);
-       int (*wfd_oem_set_ssid)(char* ssid);
-       bool (*wfd_oem_is_groupowner)(void);
-       bool (*wfd_oem_is_groupclient)(void);
-       int (*wfd_oem_get_ssid)(char* ssid, int len);
-       int (*wfd_oem_set_wps_pin)(char* pin);
-       int (*wfd_oem_get_wps_pin)(char* wps_pin, int len);
-       int (*wfd_oem_generate_wps_pin)(void);
-       int (*wfd_oem_set_wpa_passphrase)(char* wpa_key);
-       int (*wfd_oem_get_supported_wps_mode)(void);
-       int (*wfd_oem_get_connected_peers_info)(wfd_connected_peer_info_s ** peer_list, int* peer_num);
-       int (*wfd_oem_get_connected_peers_count)(int* peer_num);
-       int (*wfd_oem_set_oem_loglevel)(int is_increase);
-       int (*wfd_oem_get_go_intent)(int* intent);
-       int (*wfd_oem_set_go_intent)(int intent);
-       int (*wfd_oem_set_device_type)(wifi_direct_primary_device_type_e primary_cat, wifi_direct_secondary_device_type_e sub_cat);
-       int (*wfd_oem_get_device_mac_address)(unsigned char* device_mac);
-       int (*wfd_oem_get_disassoc_sta_mac)(unsigned char* mac_addr);
-       int (*wfd_oem_get_assoc_sta_mac)(unsigned char* mac_addr);
-       int (*wfd_oem_get_requestor_mac)(unsigned char* mac_addr);
-       int (*wfd_oem_get_operating_channel)(void);
-       int (*wfd_oem_get_persistent_group_info)(wfd_persistent_group_info_s ** persistent_group_list, int* persistent_group_num);
-       int (*wfd_oem_remove_persistent_group)(wfd_persistent_group_info_s * persistent_group);
-       int (*wfd_oem_set_persistent_group_enabled)(bool enabled);
-       int (*wfd_oem_connect_for_persistent_group)(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config);
-};
-
-extern unsigned char g_incomming_peer_mac_address[6];
-extern char g_incomming_peer_ssid[32 + 1];
-extern struct wfd_oem_operations *g_ops;
-
-
-int plugin_load(struct wfd_oem_operations **ops);
-
-#endif         //__WIFI_DIRECT_OEM_H_
-
index 5b9dd7c..31af062 100644 (file)
  *
  */
 
-#include <stdlib.h>
-#include <stdbool.h>
-
-#include "wifi-direct-oem.h"
-#include "wifi-direct-utils.h"
-#include "wifi-direct-service.h"
-
-unsigned char g_incomming_peer_mac_address[6];
-char g_incomming_peer_ssid[32 + 1];
-struct wfd_oem_operations *g_ops;
-
-int wfd_oem_init(wfd_oem_event_cb event_callback)
-{
-       if (NULL == g_ops->wfd_oem_init)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_init is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_init(event_callback));
-}
-
-int wfd_oem_destroy()
-{
-       if (NULL == g_ops->wfd_oem_destroy)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_destroy is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_destroy());
-}
-
-int wfd_oem_activate()
-{
-       if (NULL == g_ops->wfd_oem_activate)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_activate is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_activate());
-}
-
-int wfd_oem_deactivate()
-{
-       if (NULL == g_ops->wfd_oem_deactivate)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_deactivate is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_deactivate());
-}
-
-
-int wfd_oem_connect(unsigned char mac_addr[6], wifi_direct_wps_type_e  wps_config)
-{
-       if (NULL == g_ops->wfd_oem_connect)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_connect is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_connect(mac_addr, wps_config));
-}
-
-int wfd_oem_wps_pbc_start(unsigned char mac_addr[6])
-{
-       if (NULL == g_ops->wfd_oem_wps_pbc_start)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_wps_pbc_start is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_wps_pbc_start(mac_addr));
-}
-
-int wfd_oem_wps_pin_start(unsigned char mac_addr[6])
-{
-       if (NULL == g_ops->wfd_oem_wps_pin_start)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_wps_pin_start is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_wps_pin_start(mac_addr));
-}
-
-int wfd_oem_disconnect()
-{
-       if (NULL == g_ops->wfd_oem_disconnect)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_disconnect is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_disconnect());
-}
-
-
-int wfd_oem_disconnect_sta(unsigned char mac_addr[6])
-{
-       if (NULL == g_ops->wfd_oem_disconnect_sta)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_disconnect_sta is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_disconnect_sta(mac_addr));
-}
-
-int wfd_oem_reject_connection(unsigned char mac_addr[6])
-{
-       if (NULL == g_ops->wfd_oem_reject_connection)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_reject_connection is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_reject_connection(mac_addr));
-}
-
-bool wfd_oem_is_discovery_enabled()
-{
-       if (NULL == g_ops->wfd_oem_is_discovery_enabled)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_is_discovery_enabled is NULL!!\n");
-               return false;
-       }
-
-       return (g_ops->wfd_oem_is_discovery_enabled());
-}
-
-int wfd_oem_start_discovery(bool listen_only, int timeout)
-{
-       if (NULL == g_ops->wfd_oem_start_discovery)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_start_discovery is NULL!!\n");
-               return false;
-       }
+/**
+ * This file implements wifi direct oem functions.
+ *
+ * @file               wifi-direct-oem.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
 
-       return (g_ops->wfd_oem_start_discovery(listen_only, timeout));
-}
+#include <stdio.h>
 
-int wfd_oem_cancel_discovery()
-{
-       if (NULL == g_ops->wfd_oem_cancel_discovery)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_cancel_discovery is NULL!!\n");
-               return false;
-       }
+#include <glib.h>
 
-       wfd_timer_discovery_cancel();
+#include <wifi-direct-internal.h>
 
-       return (g_ops->wfd_oem_cancel_discovery());
-}
+#include "wifi-direct-manager.h"
+#include "wifi-direct-util.h"
+#include "wifi-direct-oem.h"
 
-int wfd_oem_get_discovery_result(wfd_discovery_entry_s ** peer_list, int* peer_num)
+int wfd_oem_init(wfd_oem_ops_s *ops, wfd_oem_event_cb event_callback, void *user_data)
 {
-       if (NULL == g_ops->wfd_oem_get_discovery_result)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_discovery_result is NULL!!\n");
-               return false;
+       if (!ops || !ops->init) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_discovery_result(peer_list, peer_num));
+       return ops->init(event_callback, user_data);
 }
 
-int wfd_oem_get_peer_info(unsigned char *mac_addr, wfd_discovery_entry_s **peer)
+int wfd_oem_deinit(wfd_oem_ops_s *ops)
 {
-       if (NULL == g_ops->wfd_oem_get_peer_info)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_peer_info is NULL!!\n");
-               return false;
+       if (!ops || !ops->deinit) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_peer_info(mac_addr, peer));
+       return ops->deinit();
 }
 
-int wfd_oem_send_provision_discovery_request(unsigned char mac_addr[6], wifi_direct_wps_type_e config_method, int is_peer_go)
+int wfd_oem_activate(wfd_oem_ops_s *ops)
 {
-       if (NULL == g_ops->wfd_oem_send_provision_discovery_request)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_send_provision_discovery_request is NULL!!\n");
-               return false;
+       if (!ops || !ops->activate) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_send_provision_discovery_request(mac_addr, config_method, is_peer_go));
+       return ops->activate();
 }
 
-int wfd_oem_send_invite_request(unsigned char dev_mac_addr[6])
+int wfd_oem_deactivate(wfd_oem_ops_s *ops)
 {
-       if (NULL == g_ops->wfd_oem_send_invite_request)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_send_invite_request is NULL!!\n");
-               return false;
+       if (!ops || !ops->deactivate) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_send_invite_request(dev_mac_addr));
+       return ops->deactivate();
 }
 
-
-int wfd_oem_create_group(char* ssid)
+int wfd_oem_start_scan(wfd_oem_ops_s *ops, wfd_oem_scan_param_s *param)
 {
-       if (NULL == g_ops->wfd_oem_create_group)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_create_group is NULL!!\n");
-               return false;
+       if (!ops || !ops->start_scan) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_create_group(ssid));
+       return ops->start_scan(param);
 }
 
-int wfd_oem_cancel_group()
+int wfd_oem_stop_scan(wfd_oem_ops_s *ops)
 {
-       if (NULL == g_ops->wfd_oem_cancel_group)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_cancel_group is NULL!!\n");
-               return false;
+       if (!ops || !ops->stop_scan) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_cancel_group());
+       return ops->stop_scan();
 }
 
-int wfd_oem_activate_pushbutton()
+int wfd_oem_get_visibility(wfd_oem_ops_s *ops, int *visibility)
 {
-       if (NULL == g_ops->wfd_oem_activate_pushbutton)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_activate_pushbutton is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_visibility) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_activate_pushbutton());
+       return ops->get_visibility(visibility);
 }
 
-bool wfd_oem_is_groupowner()
+int wfd_oem_set_visibility(wfd_oem_ops_s *ops, int visibility)
 {
-       if (NULL == g_ops->wfd_oem_is_groupowner)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_is_groupowner is NULL!!\n");
-               return false;
+       if (!ops || !ops->set_visibility) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_is_groupowner());
+       return ops->set_visibility(visibility);
 }
 
-bool wfd_oem_is_groupclient()
+int wfd_oem_get_scan_result(wfd_oem_ops_s *ops, GList **peers, int *peer_count)
 {
-       if (NULL == g_ops->wfd_oem_is_groupclient)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_is_groupclient is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_scan_result) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_is_groupclient());
+       return ops->get_scan_result(peers, peer_count);
 }
 
-#if 0
-int wfd_oem_get_link_status()
+int wfd_oem_get_peer_info(wfd_oem_ops_s *ops, unsigned char *peer_addr, wfd_oem_device_s **peer)
 {
-       if (NULL == g_ops->wfd_oem_get_link_status)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_link_status is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_peer_info) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_link_status());
+       return ops->get_peer_info(peer_addr, peer);
 }
-#endif
 
-int wfd_oem_get_ssid(char* ssid, int len)
+int wfd_oem_prov_disc_req(wfd_oem_ops_s *ops, unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
 {
-       if (NULL == g_ops->wfd_oem_get_ssid)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_ssid is NULL!!\n");
-               return false;
+       if (!ops || !ops->prov_disc_req) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_ssid(ssid, len));
+       return ops->prov_disc_req(peer_addr, wps_mode, join);
 }
 
-bool wfd_oem_dhcpc_get_ip_address(char *ipaddr_buf, int len, int is_IPv6)
+int wfd_oem_connect(wfd_oem_ops_s *ops, unsigned char *peer_addr, wfd_oem_conn_param_s *param)
 {
-       if (NULL == g_ops->wfd_oem_dhcpc_get_ip_address)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_dhcpc_get_ip_address is NULL!!\n");
-               return false;
+       if (!ops || !ops->connect) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_dhcpc_get_ip_address(ipaddr_buf, len, is_IPv6));
+       return ops->connect(peer_addr, param);
 }
 
-
-char* wfd_oem_get_default_interface_name()
+int wfd_oem_reject_connection(wfd_oem_ops_s *ops, unsigned char *peer_addr)
 {
-       if (NULL == g_ops->wfd_oem_get_default_interface_name)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_default_interface_name is NULL!!\n");
-               return false;
+       if (!ops || !ops->reject_connection) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_default_interface_name());
+       return ops->reject_connection(peer_addr);
 }
 
-char* wfd_oem_get_ip()
+int wfd_oem_cancel_connection(wfd_oem_ops_s *ops, unsigned char *peer_addr)
 {
-       if (NULL == g_ops->wfd_oem_get_ip)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_ip is NULL!!\n");
-               return false;
+       if (!ops || !ops->cancel_connection) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_ip());
+       return ops->cancel_connection(peer_addr);
 }
 
-int wfd_oem_set_wps_pin(char* pin)
+int wfd_oem_disconnect(wfd_oem_ops_s *ops, unsigned char *peer_addr)
 {
-       if (NULL == g_ops->wfd_oem_set_wps_pin)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_set_wps_pin is NULL!!\n");
-               return false;
+       if (!ops || !ops->disconnect) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_set_wps_pin(pin));
+       return ops->disconnect(peer_addr);
 }
 
-int wfd_oem_get_wps_pin(char* wps_pin, int len)
+int wfd_oem_get_connected_peers(wfd_oem_ops_s *ops, GList **peers, int *peer_count)
 {
-       if (NULL == g_ops->wfd_oem_get_wps_pin)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_wps_pin is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_connected_peers) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_wps_pin(wps_pin, len));
+       return ops->get_connected_peers(peers, peer_count);
 }
 
-int wfd_oem_generate_wps_pin()
+int wfd_oem_get_pin(wfd_oem_ops_s *ops, char *pin)
 {
-       if (NULL == g_ops->wfd_oem_generate_wps_pin)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_generate_wps_pin is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_pin) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_generate_wps_pin());
+       return ops->get_pin(pin);
 }
 
-
-int wfd_oem_set_ssid(char* ssid)
+int wfd_oem_set_pin(wfd_oem_ops_s *ops, char *pin)
 {
-       if (NULL == g_ops->wfd_oem_set_ssid)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_set_ssid is NULL!!\n");
-               return false;
+       if (!ops || !ops->set_pin) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_set_ssid(ssid));
+       return ops->set_pin(pin);
 }
-
-int wfd_oem_set_wpa_passphrase(char* wpa_key)
+//int wfd_oem_generate_pin(char *pin)
+int wfd_oem_get_supported_wps_mode(wfd_oem_ops_s *ops, int *wps_mode)
 {
-       if (NULL == g_ops->wfd_oem_set_wpa_passphrase)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_set_wpa_passphrase is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_supported_wps_mode) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_set_wpa_passphrase(wpa_key));
+       return ops->get_supported_wps_mode(wps_mode);
 }
 
-int wfd_oem_get_supported_wps_mode()
+int wfd_oem_create_group(wfd_oem_ops_s *ops, int persistent, int freq)
 {
-       if (NULL == g_ops->wfd_oem_get_supported_wps_mode)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_supported_wps_mode is NULL!!\n");
-               return false;
+       if (!ops || !ops->create_group) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_supported_wps_mode());
+       return ops->create_group(persistent, freq);
 }
 
-int wfd_oem_get_connected_peers_count(int* peer_num)
+int wfd_oem_destroy_group(wfd_oem_ops_s *ops, const char *ifname)
 {
-       if (NULL == g_ops->wfd_oem_get_connected_peers_count)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_connected_peers_count is NULL!!\n");
-               return false;
+       if (!ops || !ops->destroy_group) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_connected_peers_count(peer_num));
+       return ops->destroy_group(ifname);
 }
 
-
-int wfd_oem_get_connected_peers_info(wfd_connected_peer_info_s ** peer_list, int* peer_num)
+int wfd_oem_invite(wfd_oem_ops_s *ops, unsigned char *peer_addr, wfd_oem_invite_param_s *param)
 {
-       if (NULL == g_ops->wfd_oem_get_connected_peers_info)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_connected_peers_info is NULL!!\n");
-               return false;
+       if (!ops || !ops->invite) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_connected_peers_info(peer_list, peer_num));
+       return ops->invite(peer_addr, param);
 }
 
-
-int wfd_oem_get_go_intent(int* intent)
+int wfd_oem_wps_start(wfd_oem_ops_s *ops, unsigned char *peer_addr, int wps_mode, const char *pin)
 {
-       if (NULL == g_ops->wfd_oem_get_go_intent)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_go_intent is NULL!!\n");
-               return false;
+       if (!ops || !ops->wps_start) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_go_intent(intent));
+       return ops->wps_start(peer_addr, wps_mode, pin);
 }
 
-
-int wfd_oem_set_go_intent(int intent)
+int wfd_oem_enrollee_start(wfd_oem_ops_s *ops, unsigned char *peer_addr, int wps_mode, const char *pin)
 {
-       if (NULL == g_ops->wfd_oem_set_go_intent)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_set_go_intent is NULL!!\n");
-               return false;
+       if (!ops || !ops->enrollee_start) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_set_go_intent(intent));
+       return ops->enrollee_start(peer_addr, wps_mode, pin);
 }
 
-
-int wfd_oem_set_device_type(wifi_direct_primary_device_type_e primary_cat, wifi_direct_secondary_device_type_e sub_cat)
+int wfd_oem_get_dev_name(wfd_oem_ops_s *ops, char *dev_name)
 {
-       if (NULL == g_ops->wfd_oem_set_device_type)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_set_device_type is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_dev_name) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_set_device_type(primary_cat, sub_cat));
+       return ops->get_dev_name(dev_name);
 }
 
-
-int wfd_oem_get_device_mac_address(unsigned char* device_mac)
+int wfd_oem_set_dev_name(wfd_oem_ops_s *ops, char *dev_name)
 {
-       if (NULL == g_ops->wfd_oem_get_device_mac_address)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_device_mac_address is NULL!!\n");
-               return false;
+       if (!ops || !ops->set_dev_name) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_device_mac_address(device_mac));
+       return ops->set_dev_name(dev_name);
 }
 
-int wfd_oem_set_oem_loglevel(int is_increase)
+int wfd_oem_get_dev_mac(wfd_oem_ops_s *ops, char *dev_mac)
 {
-       if (NULL == g_ops->wfd_oem_set_oem_loglevel)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_set_oem_loglevel is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_dev_mac) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_set_oem_loglevel(is_increase));
+       return ops->get_dev_mac(dev_mac);
 }
 
-int wfd_oem_get_disassoc_sta_mac(unsigned char *mac_addr)
+int wfd_oem_get_dev_type(wfd_oem_ops_s *ops, int *pri_dev_type, int *sec_dev_type)
 {
-       if (NULL == g_ops->wfd_oem_get_disassoc_sta_mac)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_disassoc_sta_mac is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_dev_type) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_disassoc_sta_mac(mac_addr));
+       return ops->get_dev_type(pri_dev_type, sec_dev_type);
 }
 
-int wfd_oem_get_assoc_sta_mac(unsigned char *mac_addr)
+int wfd_oem_set_dev_type(wfd_oem_ops_s *ops, int pri_dev_type, int sec_dev_type)
 {
-       if (NULL == g_ops->wfd_oem_get_assoc_sta_mac)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_assoc_sta_mac is NULL!!\n");
-               return false;
+       if (!ops || !ops->set_dev_type) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_assoc_sta_mac(mac_addr));
+       return ops->set_dev_type(pri_dev_type, sec_dev_type);
 }
 
-int wfd_oem_get_requestor_mac(unsigned char *mac_addr)
+int wfd_oem_get_go_intent(wfd_oem_ops_s *ops, int *go_intent)
 {
-       if (NULL == g_ops->wfd_oem_get_requestor_mac)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_requestor_mac is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_go_intent) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_requestor_mac(mac_addr));
+       return ops->get_go_intent(go_intent);
 }
 
-int wfd_oem_get_operating_channel()
+int wfd_oem_set_go_intent(wfd_oem_ops_s *ops, int go_intent)
 {
-       if (NULL == g_ops->wfd_oem_get_operating_channel)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_operating_channel is NULL!!\n");
-               return false;
+       if (!ops || !ops->set_go_intent) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_operating_channel());
+       return ops->set_go_intent(go_intent);
 }
 
-int wfd_oem_get_persistent_group_info(wfd_persistent_group_info_s ** persistent_group_list, int* persistent_group_num)
+int wfd_oem_get_persistent_groups(wfd_oem_ops_s *ops, wfd_oem_persistent_group_s **groups, int *group_count)
 {
-       if (NULL == g_ops->wfd_oem_get_persistent_group_info)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_get_persistent_group_info is NULL!!\n");
-               return false;
+       if (!ops || !ops->get_persistent_groups) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_get_persistent_group_info(persistent_group_list, persistent_group_num));
+       return ops->get_persistent_groups(groups, group_count);
 }
 
-int wfd_oem_remove_persistent_group(wfd_persistent_group_info_s *persistent_group)
+int wfd_oem_remove_persistent_group(wfd_oem_ops_s *ops, char *ssid, unsigned char *bssid)
 {
-       if (NULL == g_ops->wfd_oem_remove_persistent_group)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_remove_persistent_group is NULL!!\n");
-               return false;
+       if (!ops || !ops->remove_persistent_group) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_remove_persistent_group(persistent_group));
-
-}
-
-int wfd_oem_set_persistent_group_enabled(bool enabled)
-{
-       if (NULL == g_ops->wfd_oem_set_persistent_group_enabled)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_set_persistent_group_enabled is NULL!!\n");
-               return false;
-       }
+       return ops->remove_persistent_group(ssid, bssid);
 
-       return (g_ops->wfd_oem_set_persistent_group_enabled(enabled));
 }
 
-int wfd_oem_connect_for_persistent_group(unsigned char mac_addr[6], wifi_direct_wps_type_e     wps_config)
+int wfd_oem_set_persistent_reconnect(wfd_oem_ops_s *ops, unsigned char *bssid, int reconnect)
 {
-       if (NULL == g_ops->wfd_oem_connect_for_persistent_group)
-       {
-               WDS_LOGE( "g_ops->wfd_oem_connect_for_persistent_group is NULL!!\n");
-               return false;
+       if (!ops || !ops->set_persistent_reconnect) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
        }
 
-       return (g_ops->wfd_oem_connect_for_persistent_group(mac_addr, wps_config));
+       return ops->set_persistent_reconnect(bssid, reconnect);
 }
 
diff --git a/oem/wifi-direct-oem.h b/oem/wifi-direct-oem.h
new file mode 100644 (file)
index 0000000..e26dcb7
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct oem functions and structures.
+ *
+ * @file               wifi-direct-ome.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WIFI_DIRECT_OEM_H__
+#define __WIFI_DIRECT_OEM_H__
+
+#define SUPPL_PLUGIN_PATH "/usr/lib/wifi-direct-plugin-wpasupplicant.so"
+
+#define OEM_MACSTR_LEN 18
+#define OEM_MACADDR_LEN 6
+#define OEM_PINSTR_LEN 8
+#define OEM_PASS_PHRASE_LEN 8
+#define OEM_DEV_NAME_LEN 32
+#define OEM_IFACE_NAME_LEN 16
+
+typedef enum {
+       WFD_OEM_EVENT_NONE,
+       WFD_OEM_EVENT_DEACTIVATED,
+       WFD_OEM_EVENT_PEER_FOUND,
+       WFD_OEM_EVENT_PEER_DISAPPEARED,
+       WFD_OEM_EVENT_DISCOVER_FINISHED,
+
+       WFD_OEM_EVENT_PROV_DISC_REQ,    // 5
+       WFD_OEM_EVENT_PROV_DISC_DISPLAY,
+       WFD_OEM_EVENT_PROV_DISC_KEYPAD,
+       WFD_OEM_EVENT_PROV_DISC_RESP,
+       WFD_OEM_EVENT_PROV_DISC_FAIL,
+
+       WFD_OEM_EVENT_GO_NEG_REQ,       // 10
+       WFD_OEM_EVENT_GO_NEG_FAIL,
+       WFD_OEM_EVENT_GO_NEG_DONE,
+       WFD_OEM_EVENT_WPS_FAIL,
+       WFD_OEM_EVENT_WPS_DONE,
+       WFD_OEM_EVENT_KEY_NEG_FAIL,     // 15
+       WFD_OEM_EVENT_KEY_NEG_DONE,
+
+       WFD_OEM_EVENT_CONN_FAIL,
+       WFD_OEM_EVENT_CONN_DONE,
+
+       WFD_OEM_EVENT_GROUP_CREATED,
+       WFD_OEM_EVENT_GROUP_DESTROYED,  // 20
+
+       WFD_OEM_EVENT_INVITATION_REQ,
+       WFD_OEM_EVENT_INVITATION_RES,
+       WFD_OEM_EVENT_STA_CONNECTED,
+       WFD_OEM_EVENT_STA_DISCONNECTED,
+
+       WFD_OEM_EVENT_CONNECTED,        // 25
+       WFD_OEM_EVENT_DISCONNECTED,
+
+       WFD_OEM_EVENT_TERMINATING,
+
+       WFD_OEM_EVENT_MAX,
+} wfd_oem_event_e;
+
+typedef struct {
+       char dev_name[OEM_DEV_NAME_LEN];
+       unsigned char dev_addr[OEM_MACADDR_LEN];
+       unsigned char intf_addr[OEM_MACADDR_LEN];
+       unsigned char go_dev_addr[OEM_MACADDR_LEN];
+       int dev_role;
+       int config_methods;
+       int pri_dev_type;
+       int sec_dev_type;
+       int dev_flags;
+       int group_flags;
+       int wps_mode;
+
+       int wfd_dev_info;
+       int wfd_ctrl_port;
+       int wfd_max_tput;
+} wfd_oem_device_s;
+
+typedef struct {
+       unsigned char p2p_dev_addr[OEM_MACADDR_LEN];
+       unsigned char p2p_intf_addr[OEM_MACADDR_LEN];
+       char name[OEM_DEV_NAME_LEN + 1];
+       int pri_dev_type;
+       int sec_dev_type;
+       int config_methods;
+       int dev_flags;
+       int group_flags;
+       int dev_role;
+       unsigned char p2p_go_addr[OEM_MACADDR_LEN];
+} wfd_oem_dev_data_s;
+
+typedef struct {
+       unsigned char peer_intf_addr[OEM_MACADDR_LEN];
+       int dev_pwd_id;
+       int status;
+       int error;
+} wfd_oem_conn_data_s;
+
+typedef struct {
+       unsigned char go_dev_addr[OEM_MACADDR_LEN];
+       unsigned char bssid[OEM_MACADDR_LEN];
+       int listen;
+       int status;
+} wfd_oem_invite_data_s;
+
+typedef struct {
+       char ssid[OEM_DEV_NAME_LEN+1];
+       int freq;
+       char pass[OEM_PASS_PHRASE_LEN+1];
+       unsigned char go_dev_addr[OEM_MACADDR_LEN];
+} wfd_oem_group_data_s;
+
+typedef struct {
+       int event_id;
+       unsigned char dev_addr[OEM_MACADDR_LEN];        // device address
+       unsigned char intf_addr[OEM_MACADDR_LEN];
+       int wps_mode;
+       char wps_pin[OEM_PINSTR_LEN+1]; // just for DISPLAY
+       char ifname[OEM_IFACE_NAME_LEN+1];
+       int dev_role;
+       int edata_type;
+       void *edata;
+} wfd_oem_event_s;
+
+typedef enum {
+       WFD_OEM_EDATA_TYPE_NONE,
+       WFD_OEM_EDATA_TYPE_DEVICE,
+       WFD_OEM_EDATA_TYPE_CONN,
+       WFD_OEM_EDATA_TYPE_INVITE,
+       WFD_OEM_EDATA_TYPE_GROUP,
+} ws_event_type_e;
+
+typedef enum {
+       WFD_OEM_SCAN_MODE_ACTIVE,
+       WFD_OEM_SCAN_MODE_PASSICE,
+} wfd_oem_scan_mode_e;
+
+typedef enum {
+       WFD_OEM_SCAN_TYPE_FULL,
+       WFD_OEM_SCAN_TYPE_SOCIAL,
+       WFD_OEM_SCAN_TYPE_SPECIFIC,
+} wfd_oem_scan_type_e;
+
+typedef enum {
+       WFD_OEM_WPS_MODE_NONE,
+       WFD_OEM_WPS_MODE_PBC = 0x1,
+       WFD_OEM_WPS_MODE_DISPLAY = 0x2,
+       WFD_OEM_WPS_MODE_KEYPAD = 0x4,
+} wfd_oem_wps_mode_e;
+
+#define WFD_OEM_GROUP_FLAG_GROUP_OWNER 0x1
+#define WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP 0x2
+
+typedef enum {
+       WFD_OEM_CONN_TYPE_NONE,
+       WFD_OEM_CONN_TYPE_JOIN,
+       WFD_OEM_CONN_TYPE_AUTH,
+       WFD_OEM_CONN_TYPE_PERSISTENT = 0x4,
+} wfd_oem_conn_flag_e;
+
+typedef enum {
+       WFD_OEM_DEV_ROLE_NONE,
+       WFD_OEM_DEV_ROLE_GC,
+       WFD_OEM_DEV_ROLE_GO,
+} wfd_oem_dev_role_e;
+
+typedef struct {
+       int scan_mode;
+       int scan_time;
+       int scan_type;
+       int freq;
+       int refresh;
+} wfd_oem_scan_param_s;
+
+typedef struct {
+       int wps_mode;
+       int conn_flags; // join, auth, persistent
+       int go_intent;
+       int freq;
+       char wps_pin[OEM_PINSTR_LEN+1];
+} wfd_oem_conn_param_s;
+
+typedef struct {
+       int net_id;
+       char *ifname;
+       unsigned char go_dev_addr[OEM_MACADDR_LEN];
+} wfd_oem_invite_param_s;
+
+typedef struct
+{
+       int network_id;
+       char ssid[OEM_DEV_NAME_LEN + 1];
+       unsigned char go_mac_address[OEM_MACADDR_LEN];
+} wfd_oem_persistent_group_s;
+
+typedef int (*wfd_oem_event_cb) (void *user_data, void *event);
+
+typedef struct _wfd_oem_ops_s {
+       int (*init) (wfd_oem_event_cb event_callback, void *user_data);
+       int (*deinit) (void);
+       int (*activate) (void);
+       int (*deactivate) (void);
+       int (*start_scan) (wfd_oem_scan_param_s *param);
+       int (*stop_scan) (void);
+       int (*get_visibility) (int *visibility);
+       int (*set_visibility) (int visibility);
+       int (*get_scan_result) (GList **peers, int *peer_count);
+       int (*get_peer_info) (unsigned char *peer_addr, wfd_oem_device_s **peer);
+       int (*prov_disc_req) (unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join);
+       int (*connect) (unsigned char *peer_addr, wfd_oem_conn_param_s *param);
+       int (*disconnect) (unsigned char *peer_addr);
+       int (*reject_connection) (unsigned char *peer_addr);
+       int (*cancel_connection) (unsigned char *peer_addr);
+       int (*get_connected_peers) (GList **peers, int *peer_count);
+       int (*wps_start) (unsigned char *peer_addr, int wps_mode, const char *pin);
+       int (*enrollee_start) (unsigned char *peer_addr, int wps_mode, const char *pin);
+       int (*get_pin) (char *pin);
+       int (*set_pin) (char *pin);
+//     int (*generate_pin) (char *pin);
+       int (*get_supported_wps_mode) (int *wps_mode);
+       int (*create_group) (int persistent, int freq);
+       int (*destroy_group) (const char *ifname);
+       int (*invite) (unsigned char *peer_addr, wfd_oem_invite_param_s *param);
+
+       int (*get_dev_name) (char *dev_name);
+       int (*set_dev_name) (char *dev_name);
+       int (*get_dev_mac) (char *dev_mac);
+       int (*get_dev_type) (int *pri_dev_type, int *sec_dev_type);
+       int (*set_dev_type) (int pri_dev_type, int sec_dev_type);
+       int (*get_go_intent) (int *go_intent);
+       int (*set_go_intent) (int go_intent);
+
+       int (*get_persistent_groups) (wfd_oem_persistent_group_s **groups, int *group_count);
+       int (*remove_persistent_group) (char *ssid, unsigned char *bssid);
+       int (*set_persistent_reconnect) (unsigned char *bssid, int reconnect);
+} wfd_oem_ops_s;
+
+int wfd_oem_init(wfd_oem_ops_s *ops, wfd_oem_event_cb event_callback, void *user_data);
+int wfd_oem_destroy(wfd_oem_ops_s *ops);
+int wfd_oem_activate(wfd_oem_ops_s *ops);
+int wfd_oem_deactivate(wfd_oem_ops_s *ops);
+int wfd_oem_start_scan(wfd_oem_ops_s *ops, wfd_oem_scan_param_s *param);
+int wfd_oem_stop_scan(wfd_oem_ops_s *ops);
+int wfd_oem_get_visibility(wfd_oem_ops_s *ops, int *visibility);
+int wfd_oem_set_visibility(wfd_oem_ops_s *ops, int visibility);
+int wfd_oem_get_scan_result(wfd_oem_ops_s *ops, GList **peers, int *peer_count);
+int wfd_oem_get_peer_info(wfd_oem_ops_s *ops, unsigned char *peer_addr, wfd_oem_device_s **peer);
+int wfd_oem_prov_disc_req(wfd_oem_ops_s *ops, unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join);
+int wfd_oem_connect(wfd_oem_ops_s *ops, unsigned char *peer_addr, wfd_oem_conn_param_s *param);
+int wfd_oem_disconnect(wfd_oem_ops_s *ops, unsigned char *peer_addr);
+int wfd_oem_reject_connection(wfd_oem_ops_s *ops, unsigned char *peer_addr);
+int wfd_oem_cancel_connection(wfd_oem_ops_s *ops, unsigned char *peer_addr);
+int wfd_oem_get_connected_peers(wfd_oem_ops_s *ops, GList **peers, int *peer_count);
+int wfd_oem_wps_start(wfd_oem_ops_s *ops, unsigned char *peer_addr, int wps_mode, const char *pin);
+int wfd_oem_enrollee_start(wfd_oem_ops_s *ops, unsigned char *peer_addr, int wps_mode, const char *pin);
+int wfd_oem_get_pin(wfd_oem_ops_s *ops, char *pin);
+int wfd_oem_set_pin(wfd_oem_ops_s *ops, char *pin);
+//int wfd_oem_generate_pin(wfd_oem_ops_s *ops, char *pin);
+int wfd_oem_get_supported_wps_mode(wfd_oem_ops_s *ops, int *wps_mode);
+int wfd_oem_create_group(wfd_oem_ops_s *ops, int persistent, int freq);
+int wfd_oem_destroy_group(wfd_oem_ops_s *ops, const char *ifname);
+int wfd_oem_invite(wfd_oem_ops_s *ops, unsigned char *peer_addr, wfd_oem_invite_param_s *param);
+
+int wfd_oem_get_dev_name(wfd_oem_ops_s *ops, char *dev_name);
+int wfd_oem_set_dev_name(wfd_oem_ops_s *ops, char *dev_name);
+int wfd_oem_get_dev_mac(wfd_oem_ops_s *ops, char *dev_mac);
+int wfd_oem_get_dev_type(wfd_oem_ops_s *ops, int *pri_dev_type, int *sec_dev_type);
+int wfd_oem_set_dev_type(wfd_oem_ops_s *ops, int priv_dev_type, int sec_dev_type);
+int wfd_oem_get_go_intent(wfd_oem_ops_s *ops, int *go_intent);
+int wfd_oem_set_go_intent(wfd_oem_ops_s *ops, int go_intent);
+
+int wfd_oem_get_persistent_groups(wfd_oem_ops_s *ops, wfd_oem_persistent_group_s **groups, int *group_count);
+int wfd_oem_remove_persistent_group(wfd_oem_ops_s *ops, char *ssid, unsigned char *bssid);
+int wfd_oem_set_persistent_reconnect(wfd_oem_ops_s *ops, unsigned char *bssid, int reconnect);
+
+#endif /* __WIFI_DIRECT_OEM_H__ */
index ebe0334..153b808 100644 (file)
-* Wed Sep 04 2013 Maciej Wereski <m.wereski@partner.samsung.com> accepted/tizen/20130710.221439@a4b94e1
-- Fix RPMLINT errors
-- resetting manifest requested domain to floor
-- Merge branch 'master' into tizen_2.1
-- SMACK manifest modified
-- Merge branch 'master' into tizen_2.1
-- printf removed
-- Merge branch 'master' into tizen_2.1
-- prevent issue fixed
-- Merge branch 'master' into tizen_2.1
-- NOTICE file updated
-- Merge branch 'master' into tizen_2.1
-- boilerplate updated
-- Merge branch 'master' into tizen_2.1
-- Fix defect(N_SE-36637) and License file updated
-- package update
-- License file changed
-- Fix prevent #38619
-- Fix prevent #38619
-- Merge branch 'master' into tizen_2.1
-- Fix bug N_SE-34851(Keypad popup disappeared and connection stoped)
-- Merge branch 'master' into tizen_2.1
-- Fix bug N_SE-32967(Status is not changed to 'Activated')
-- Merge branch 'master' into tizen_2.1
-- Fix bug(rejected) N_SE-30232
-- package update(Fix bug N_SE-26723)
-- Fix bug N_SE-26723(Send rejection message)
-- package update     Fix bug(TDIS-4906, N_SE-30232)
-- Fix bug N_SE-30232(Retry connection during 120 secs)
-- Merge "Fix bug TDIS-4906(Connection not established)"
-- Fix bug TDIS-4906(Connection not established)
-- Fix deprecated g_type_init and g_thread_init.
-- merge with master
-- Flush discovered peer data when starting new scan
-- to fix incorrect error return when no connected peer exist
-- Tizen 2.1 base
-- to fix close(0) issue and version update
-- to fix PLM issue(P130110-3379, P130112-0574)(private)
-- to fix Multi-connection defect(private)
-- to fix wfd-manager crash issue
-- fixed prevent issue(private)
-- Use right macro to build for emulator
-- Merge "Remove prevent issue : Resource leak, Uninitialized pointer read"
-- Fix bug of destination buffer size
-- Remove prevent issue : Resource leak, Uninitialized pointer read
-- Remove prevent issue : Improper use of negative value
-- Remove prevent issue
-- Fix resource leaks
-- Remove prevent issue
-- Remove unuseful code
-- Fix bug of invitation behavior
-- Merge branch 'master' into tizen_2.0
-- SMACK is corrected
-- Merge branch 'master' into tizen_2.0
-- Merge branch 'master' into tizen_2.0
-- Fix bug and Smack applyed
-- Merge branch 'master' into tizen_2.0
-- Fix bug(N_SE-23716)
-- Merge branch 'master' into tizen_2.0
-- Fix bug(N_SE-23485)
-- Merge branch 'master' into tizen_2.0
-- Package update
-- Merge branch 'master' into tizen_2.0
-- Fix bug(N_SE-22984)
-- Merge branch 'master' into tizen_2.0
-- Merge branch 'tizen_2.0' Copy p2p_supplicant License file at correct location
-- Package upload
-- Merge "Bug fix(N_SE-21973) WPS PIN feature is added for GO" into tizen_2.0
-- Bug fix(N_SE-21973) WPS PIN feature is added for GO
-- Merge branch 'master' into tizen_2.0
-- Add License files.
-- Merge branch 'master' into tizen_2.0
-- Boiler plate at Wi-Fi-Direct-Manager
-- Merge branch 'master' into tizen_2.0
-- Modify "Create group" bug when GO.
-- :Merge branch 'master' into tizen_2.0
-- Package upload
-- Fix bug for WPS PIN Keypad
-- Merge branch 'master' into tizen_2.0
-- fix bug JIRA N_SE-13829
-- Merge branch 'master' into tizen_2.0
-- Package upload(version 0.5.1)
-- DLog macro is changed
-- Package upload
-- Implementation of wifi_direct_get_device_name / wifi_direct_set_device_name fixed discovery problerm in case of lisen only mode. Implementation of persistent mode added timer for discovering.
-- Implementation of some APIs
-- Initial upload
+Mon, 14 Oct 2013 Gibyoung Kim <lastkgb.kim@samaung.com> (1.0.0)
+  * Premitive type of some variables were changed.
+  * Some local device functions were added.
+  * New API support(get_req_wps_type, set_req_wps_type)
+  * Fix bugs
 
+Mon, 23 Sep 2013 Jiung Yu <jiung.yu@samsung.com> (0.8.7)
+  * If device is GO, manager has wpa passphrase to handle WIFI_DIRECT_CMD_GET_WPA
+
+
+Mon, 02 Sep 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.8.6)
+  * Fix bug of display PIN
+
+Mon, 02 Sep 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.8.5)
+  * Fix bug of join(Keypad)
+
+Wed, 28 Aug 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.8.4)
+  * Macro is added for interface name
+  * Multi-group support is removed
+
+Thu, 22 Aug 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.8.3)
+  * Reject connection process is modified
+
+Thu, 22 Aug 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.8.2)
+  * Check socket before send message to wpasupplicant
+
+Wed, 21 Aug 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.8.1)
+  * Invitation process is modified
+
+Wed, 21 Aug 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.8.0)
+  * GET_CONFIG, SET_CURRENT_WPS_MODE API is modified(internally)
+
+Mon, 29 Jul 2013 Jiung Yu <jiung.yu@samsung.com> (0.7.11)
+  * add feature get_persistent_group
+
+Mon, 29 Jul 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.7.10)
+  * Activation function modified
+  * Event(peer found, provision discovery) processing separated
+  * Persistent features implemented
+  * Scan function modified
+  * Fix IPC bugs
+  * Fix DHCP bugs
+  * Fix vconf bugs
+
+Thu, 11 Jul 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.7.2)
+  * Add scan parameter
+  * fix bugs of disconnection(jiung)
+  * Remove not used files
+
+Thu, 20 Jun 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.7.1)
+  * Fix bug
+  *   - Invited device fails provision discovery request
+  *   - Rejecting connection fails
+  *   - Incomming session not destroyed after 120sec
+  *   - IP leased event not occurred
+
+Fri, 14 Jun 2013 Gibyoung Kim <lastkgb.kim@samsung.com> (0.7.0)
+  * New wifi-direct-manager uploaded
+
+Changes before version 0.7.0
+  * SMACK manifest modified
+  * prevent issue fixed
+  * NOTICE file updated
+  * Boilerplate updated
+  * N_SE-36637(Incorrect popup displayed)
+  * Flora license file updated
+  * License file changed
+  * Fix prevent #38619
+  * Fix bug N_SE-34851(Keypad popup disappeared and connection stoped)
+  * Fix bug N_SE-32967(Status is not changed to 'Activated')
+  * Fix bug N_SE-30232(Retry connection during 120 secs on MT side)
+  * Fix bug N_SE-26723(Send rejection message)
+  * Fix bug N_SE-30232(Retry connection during 120 secs)
+  * Flush discovered peer data when starting new scan
+  * Flush discovered peer data when starting new scan
+  * to fix incorrect error return when no connected peer exist
+  * to fix PLM issue and prevent defect(private code sync)
+  * Remove prevent issue : Resource leak, Uninitialized pointer read
+  * Remove prevent issue : Improper use of negative value
+  * Fix resource leaks
+  * Remove unuseful code
+  * Fix bug of invitation behavior
+  * SMACK is corrected
+  * Fix bug(N_SE-23902)
+  * Fix Group Created event issue
+  * SMACK is applyed
+  * Fix bug(N_SE-23716)
+  * Fix bug(N_SE-23485)
+  * Package Update
+  * Fix bug(N_SE-22984)
+  * Fix bug(N_SE-21973)
+  * Add WPS PIN feature for GO
+  * Modify "Group create" bug when GO
+  * Fix bug(WPS PIN keypad not worked)
+  * Fix bug(WPS PIN Display not worked)
+  * DLog macro is changed
+  * Implementation of wifi_direct_get_device_name / wifi_direct_set_device_name
+  * fixed discovery problerm in case of lisen only mode.
+  * Implementation of persistent mode
+  * added timer for discovering.
diff --git a/packaging/wifi-direct-manager.manifest b/packaging/wifi-direct-manager.manifest
deleted file mode 100644 (file)
index 017d22d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<manifest>
- <request>
-    <domain name="_"/>
- </request>
-</manifest>
index c98d98d..e979fed 100644 (file)
@@ -1,11 +1,10 @@
 Name:       wifi-direct-manager
 Summary:    Wi-Fi Direct manger
-Version:    0.6.24
+Version:    1.0.0
 Release:    1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
 Source0:    %{name}-%{version}.tar.gz
-Source1001:    wifi-direct-manager.manifest
 Requires(post): /usr/bin/vconftool
 BuildRequires:  pkgconfig(wifi-direct)
 BuildRequires:  pkgconfig(dbus-glib-1)
@@ -29,7 +28,6 @@ Wifi direct plugin for wpa supplicant
 
 %prep
 %setup -q
-cp %{SOURCE1001} .
 
 %build
 
@@ -46,7 +44,8 @@ export ARCH=i586
 %endif
 
 cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DARCHITECTURE=$ARCH
-make %{?jobs:-j%jobs}
+#make %{?jobs:-j%jobs}
+make %{?_smp_mflags}
 
 %install
 rm -rf %{buildroot}
@@ -57,12 +56,9 @@ rm -rf %{buildroot}
 mkdir -p %{buildroot}/usr/share/license
 cp %{_builddir}/%{buildsubdir}/LICENSE.APLv2 %{buildroot}/usr/share/license/%{name}
 cp %{_builddir}/%{buildsubdir}/LICENSE.APLv2 %{buildroot}/usr/share/license/wifi-direct-plugin-wpasupplicant
-cp %{_builddir}/%{buildsubdir}/LICENSE.Flora %{buildroot}/usr/share/license/p2p_supplicant
 
 %post
 chmod 644 /usr/etc/wifi-direct/dhcpd.p2p.conf
-chmod 644 /usr/etc/wifi-direct/dhcpd.wl0.conf
-chmod 644 /usr/etc/wifi-direct/dhcpd.eth.conf
 chmod 755 /usr/bin/dhcpd-notify.sh
 chmod 755 /usr/etc/wifi-direct/udhcp_script.non-autoip
 chmod 755 /usr/bin/wifi-direct-server.sh
@@ -80,10 +76,8 @@ vconftool set -t string memory/private/wifi_direct_manager/dhcpc_server_ip 0.0.0
 %defattr(-,root,root,-)
 %{_bindir}/wfd-manager
 /usr/etc/wifi-direct/dhcpd.p2p.conf
-/usr/etc/wifi-direct/dhcpd.wl0.conf
-/usr/etc/wifi-direct/dhcpd.eth.conf
 /usr/etc/wifi-direct/udhcp_script.non-autoip
-/usr/etc/wifi-direct/p2p_suppl.conf
+/usr/etc/wifi-direct/p2p_supp.conf
 %{_bindir}/dhcpd-notify.sh
 %{_bindir}/wifi-direct-server.sh
 %{_bindir}/wifi-direct-dhcp.sh
@@ -100,6 +94,4 @@ vconftool set -t string memory/private/wifi_direct_manager/dhcpc_server_ip 0.0.0
 %defattr(-,root,root,-)
 %{_libdir}/wifi-direct-plugin-wpasupplicant.so
 /usr/share/license/wifi-direct-plugin-wpasupplicant
-/usr/share/license/p2p_supplicant
-%attr(755,-,-) %{_sbindir}/p2p_supplicant
 
index 2a3ddde..1e8e652 100755 (executable)
@@ -3,32 +3,27 @@ PROJECT(wifi-direct-plugin-wpasupplicant C)
 
 # Set required packages
 INCLUDE(FindPkgConfig)
-pkg_check_modules(pkgs REQUIRED wifi-direct vconf glib-2.0 dbus-1 dbus-glib-1 gthread-2.0 dlog)
-
+pkg_check_modules(pkgs REQUIRED wifi-direct glib-2.0 dlog)
 FOREACH(flag ${pkgs_CFLAGS})
-       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag} -g -DUSE_DLOG")
+       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
 ENDFOREACH(flag)
 
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include
-               ${CMAKE_SOURCE_DIR}/oem/include
-               ${CMAKE_SOURCE_DIR}/src/include)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/oem)
 
-SET(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -Wall")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -g -Wall")
 SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
 SET(CMAKE_C_FLAGS_RELEASE "-O2")
 
 ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"")
-
+ADD_DEFINITIONS("-DUSE_DLOG")
 
 #EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
 SET(ARCH "${ARCHITECTURE}")
 IF("${ARCH}" MATCHES "^arm.*|.*86.*")
 
        SET(SRCS 
-               src/wifi-direct-plugin.c
-       )
-
-        MESSAGE("Build for Target")
+               wfd-plugin-wpasupplicant.c
+               )
 
        # library build
        ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
@@ -42,10 +37,8 @@ IF("${ARCH}" MATCHES "^arm.*|.*86.*")
 ELSE()
 
        SET(SRCS 
-               src/wifi-direct-plugin-emul.c
-       )
-
-        MESSAGE("Build for Emulator")
+               wfd-plugin-wpasupplicant-emul.c
+               )
 
        # library build
        ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
@@ -57,4 +50,3 @@ ELSE()
        INSTALL(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib)
 
 ENDIF()
-
diff --git a/plugin/wpasupplicant/include/wifi-direct-wpasupplicant.h b/plugin/wpasupplicant/include/wifi-direct-wpasupplicant.h
deleted file mode 100644 (file)
index 23d550d..0000000
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifndef __WFD_WPA_SUPPLICANT_H_
-#define __WFD_WPA_SUPPLICANT_H_
-
-#include <stdio.h>
-#include <stdbool.h>
-#include <string.h>
-#include <net/ethernet.h>
-
-#ifdef USE_DLOG
-#include <dlog.h>
-
-#undef LOG_TAG
-#define LOG_TAG "WIFI_DIRECT_PLUGIN"
-
-#define WDP_LOGV(format, args...) LOGV(format, ##args)
-#define WDP_LOGD(format, args...) LOGD(format, ##args)
-#define WDP_LOGI(format, args...) LOGI(format, ##args)
-#define WDP_LOGW(format, args...) LOGW(format, ##args)
-#define WDP_LOGE(format, args...) LOGE(format, ##args)
-#define WDP_LOGF(format, args...) LOGF(format, ##args)
-
-#define __WDP_LOG_FUNC_ENTER__ LOGV("Enter")
-#define __WDP_LOG_FUNC_EXIT__ LOGV("Quit")
-
-#else /** _DLOG_UTIL */
-
-#define WDP_LOGV(format, args...)
-#define WDP_LOGD(format, args...)
-#define WDP_LOGI(format, args...)
-#define WDP_LOGW(format, args...)
-#define WDP_LOGE(format, args...)
-#define WDP_LOGF(format, args...)
-
-#define __WDP_LOG_FUNC_ENTER__
-#define __WDP_LOG_FUNC_EXIT__
-
-#endif /** _DLOG_UTIL */
-
-#define DEFAULT_IF_NAME "p2p-wlan0-0"
-#define DEFAULT_IF_NAME_LEN 12
-#define DEFAULT_IP_LOG_PATH "/tmp/udhcpc_log"
-#define PERSISTENT_PEER_PATH "/opt/etc/persistent-peer"
-#define DEFAULT_SERVER_IP "192.168.16.1"
-#define FREQUENCY_2G "freq=2"
-#define MAX_PEER_NUM 10
-#define MAX_PERSISTENT_GROUP_NUM 20
-#define MACSTR_LEN 18
-#define WPS_METHOD_LEN 16
-#define DEVICE_NAME_LEN 64
-#define DEVICE_TYPE_LEN 18
-#define MANUFACTURER_LEN 64
-#define MODEL_NAME_LEN 64
-#define MODEL_NUMBER_LEN 64
-#define SERIAL_NUMBER_LEN 64
-#define GO_STATE_LEN 16
-#define PEER_FLAGS_LEN 128
-#define PEER_STATUS_LEN 16
-#define COUNTRY_CODE_LEN 8
-
-#define NETWORK_SSID_LEN 64
-#define NETWORK_BSSID_LEN 18
-#define NETWORK_FLAGS_LEN 32
-
-#define WPS_PIN_LEN 9
-
-#define BIT(n) 1<<(n-1)
-
-/* Device Capability bitmap */
-#define DEVICE_CAPAB_SERVICE_DISCOVERY         BIT(1)
-#define DEVICE_CAPAB_CLIENT_DISCOVERABILITY    BIT(2)
-#define DEVICE_CAPAB_CONCURRENT_OPER           BIT(3)
-#define DEVICE_CAPAB_INFRA_MANAGED             BIT(4)
-#define DEVICE_CAPAB_DEVICE_LIMIT              BIT(5)
-#define DEVICE_CAPAB_INVITATION_PROCEDURE      BIT(6)
-
-/* Group Capability bitmap */
-#define GROUP_CAPAB_GROUP_OWNER                BIT(1)
-#define GROUP_CAPAB_PERSISTENT_GROUP           BIT(2)
-#define GROUP_CAPAB_GROUP_LIMIT                BIT(3)
-#define GROUP_CAPAB_INTRA_BSS_DIST             BIT(4)
-#define GROUP_CAPAB_CROSS_CONN                 BIT(5)
-#define GROUP_CAPAB_PERSISTENT_RECONN          BIT(6)
-#define GROUP_CAPAB_GROUP_FORMATION            BIT(7)
-
-/* WPS config methods supported */
-#define WPS_CONFIG_DISPLAY         BIT(4)   //0x0008;
-#define WPS_CONFIG_PUSHBUTTON      BIT(8)   //0x0080;
-#define WPS_CONFIG_KEYPAD          BIT(9)   //0x0100;
-
-#define WIFI_ALLIANCE_OUI "0050F204"  // wifi direct spec Annex B.2
-
-typedef void (*wfd_noti_cb) (int event_type);
-
-#define CMD_INTERFACE "INTERFACES"
-#define CMD_INTERFACE_ADD "INTERFACE_ADD"
-#define CMD_INTERFACE_REMOVE "INTERFACE_REMOVE"
-#define CMD_ATTACH "ATTACH"
-#define CMD_DETACH "DETACH"
-#define CMD_START_DISCOVER "P2P_FIND"
-#define CMD_START_LISTEN "P2P_LISTEN"
-#define CMD_CANCEL_DISCOVER "P2P_STOP_FIND"
-#define CMD_FLUSH "P2P_FLUSH"
-#define CMD_GET_FIRST_DISCOVERED_PEER "P2P_PEER FIRST"
-#define CMD_GET_NEXT_DISCOVERED_PEER "P2P_PEER NEXT-"
-#define CMD_SEND_PROVISION_DISCOVERY_REQ "P2P_PROV_DISC"
-#define CMD_SEND_INVITE_REQ "P2P_INVITE"
-#define CMD_CREATE_GROUP "P2P_GROUP_ADD"
-#define CMD_CONNECT "P2P_CONNECT"
-#define CMD_REJECT "P2P_REJECT"
-#define CMD_PBC_STRING "pbc"
-#define CMD_DISPLAY_STRING "display"
-#define CMD_KEYPAD_STRING "keypad"
-#define CMD_WPS_PUSHBUTTON_START "WPS_PBC"
-#define CMD_WPS_WPS_PIN_START "WPS_PIN"
-#define CMD_GET_PEER_INFO "P2P_PEER"
-#define CMD_SET_PARAM "SET"
-#define CMD_GET_PARAM "GET"
-#define CMD_STATUS "STATUS"
-#define CMD_STATUS_P2P "STATUS P2P"
-#define CMD_LOG_LEVEL "LOG_LEVEL"
-#define CMD_GROUP_REMOVE "P2P_GROUP_REMOVE"
-#define CMD_QUIT "QUIT"
-#define CMD_TERMINATE "TERMINATE"
-#define CMD_GET_LIST_NETWORKS "LIST_NETWORKS"
-#define CMD_REMOVE_NETWORK "REMOVE_NETWORK"
-#define CMD_CANCEL "P2P_CANCEL"
-
-
-/*----- Miracast -----*/
-#define CMD_WFD_SET "WFD_SET"
-
-
-typedef enum
-{
-       WS_PEER_INFO_AGE,
-       WS_PEER_INFO_LISTEN_FREQ,
-       WS_PEER_INFO_LEVEL,
-       WS_PEER_INFO_WPS_METHOD,
-       WS_PEER_INFO_INTERFACE_ADDR,
-       WS_PEER_INFO_MEMBER_IN_GO_DEV,
-       WS_PEER_INFO_MEMBER_IN_GO_IFACE,
-       WS_PEER_INFO_PRI_DEV_TYPE,
-       WS_PEER_INFO_DEVICE_NAME,
-       WS_PEER_INFO_MANUFACTURER,
-       WS_PEER_INFO_MODEL_NAME,
-       WS_PEER_INFO_MODEL_NUMBER,
-       WS_PEER_INFO_SERIAL_NUMBER,
-       WS_PEER_INFO_CONFIG_METHODS,
-       WS_PEER_INFO_DEV_CAPAB,
-       WS_PEER_INFO_GROUP_CAPAB,
-       WS_PEER_INFO_GO_NEG_REQ_SENT,
-       WS_PEER_INFO_GO_STATE,
-       WS_PEER_INFO_DIALOG_TOKEN,
-       WS_PEER_INFO_INTENDED_ADDR,
-       WS_PEER_INFO_COUNTRY,
-       WS_PEER_INFO_OPER_FREQ,
-       WS_PEER_INFO_REQ_CONFIG_METHODS,
-       WS_PEER_INFO_FLAGS,
-       WS_PEER_INFO_STATUS,
-       WS_PEER_INFO_WAIT_COUNT,
-       WS_PEER_INFO_INVITATION_REQS,
-       WS_PEER_INFO_OPER_SSID,
-
-/*----- Miracast -----*/
-       WS_PEER_INFO_IS_WFD_DEVICE,
-       
-       WS_PEER_INFO_NONE
-} ws_field_id_e;
-
-typedef struct
-{
-       char* item_str;
-       ws_field_id_e item_id;
-} ws_field_id_s;
-
-ws_field_id_s g_ws_field_info[] =
-{
-       {"age", WS_PEER_INFO_AGE},
-       {"listen_freq", WS_PEER_INFO_LISTEN_FREQ},
-       {"level", WS_PEER_INFO_LEVEL},
-       {"wps_method", WS_PEER_INFO_WPS_METHOD},
-       {"interface_addr", WS_PEER_INFO_INTERFACE_ADDR},
-       {"member_in_go_dev", WS_PEER_INFO_MEMBER_IN_GO_DEV},
-       {"member_in_go_iface", WS_PEER_INFO_MEMBER_IN_GO_IFACE},
-       {"pri_dev_type", WS_PEER_INFO_PRI_DEV_TYPE},
-       {"device_name", WS_PEER_INFO_DEVICE_NAME},
-       {"manufacturer", WS_PEER_INFO_MANUFACTURER},
-       {"model_name", WS_PEER_INFO_MODEL_NAME},
-       {"model_number", WS_PEER_INFO_MODEL_NUMBER},
-       {"serial_number", WS_PEER_INFO_SERIAL_NUMBER},
-       {"config_methods", WS_PEER_INFO_CONFIG_METHODS},
-       {"dev_capab", WS_PEER_INFO_DEV_CAPAB},
-       {"group_capab", WS_PEER_INFO_GROUP_CAPAB},
-       {"go_neg_req_sent", WS_PEER_INFO_GO_NEG_REQ_SENT},
-       {"go_state", WS_PEER_INFO_GO_STATE},
-       {"dialog_token", WS_PEER_INFO_DIALOG_TOKEN},
-       {"intended_addr", WS_PEER_INFO_INTENDED_ADDR},
-       {"country", WS_PEER_INFO_COUNTRY},
-       {"oper_freq", WS_PEER_INFO_OPER_FREQ},
-       {"req_config_methods", WS_PEER_INFO_REQ_CONFIG_METHODS},
-       {"flags", WS_PEER_INFO_FLAGS},
-       {"status", WS_PEER_INFO_STATUS},
-       {"wait_count", WS_PEER_INFO_WAIT_COUNT},
-       {"invitation_reqs", WS_PEER_INFO_INVITATION_REQS},
-       {"oper_ssid", WS_PEER_INFO_OPER_SSID},
-       
-/*----- Miracast -----*/
-       {"is_wfd_device", WS_PEER_INFO_IS_WFD_DEVICE},
-       
-       {"", WS_PEER_INFO_NONE}
-};
-
-typedef struct
-{
-       char mac[MACSTR_LEN];
-       int age;
-       int listen_freq;
-       int level;
-       char wps_method[WPS_METHOD_LEN];
-       char interface_addr[MACSTR_LEN];
-       char member_in_go_dev[MACSTR_LEN];
-       char member_in_go_iface[MACSTR_LEN];
-       char pri_dev_type[DEVICE_TYPE_LEN];
-       char device_name[DEVICE_NAME_LEN];
-       char manufacturer[MANUFACTURER_LEN];
-       char model_name[MODEL_NAME_LEN];
-       char model_number[MODEL_NUMBER_LEN];
-       char serial_number[SERIAL_NUMBER_LEN];
-       unsigned int config_methods;
-       unsigned int dev_capab;
-       unsigned int group_capab;
-       unsigned int go_neg_req_sent;
-       char go_state[GO_STATE_LEN];
-       int dialog_token;
-       char intended_addr[MACSTR_LEN];
-       char country[COUNTRY_CODE_LEN];
-       unsigned int oper_freq;
-       unsigned int req_config_methods;
-       char flags[PEER_FLAGS_LEN];
-       char status[PEER_STATUS_LEN];
-       int wait_count;
-       int invitation_reqs;
-       char oper_ssid[DEVICE_NAME_LEN];
-
-/*----- Miracast -----*/
-       int is_wfd_device;
- } ws_discovered_peer_info_s;
-
-typedef struct
-{
-       int network_id;
-       char ssid[NETWORK_SSID_LEN];
-       char bssid[NETWORK_BSSID_LEN];
-       char flags[NETWORK_FLAGS_LEN];
- } ws_network_info_s;
-
-
-/** Event notification code */
-typedef enum {
-       WS_EVENT_NONE = 0,
-
-       WS_EVENT_DISCOVER_FOUND_PEER,
-
-       WS_EVENT_PROVISION_DISCOVERY_RESPONSE,
-       WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY,
-       WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD,
-       WS_EVENT_PROVISION_DISCOVERY_PBC_REQ,
-       WS_EVENT_PROVISION_DISCOVERY_DISPLAY,
-       WS_EVENT_PROVISION_DISCOVERY_KEYPAD,
-
-       WS_EVENT_GROUP_FORMATION_SUCCESS,
-       WS_EVENT_GROUP_FORMATION_FAILURE,
-
-       WS_EVENT_GROUP_STARTED,
-       WS_EVENT_PERSISTENT_GROUP_STARTED,
-       WS_EVENT_GROUP_REMOVED,
-
-       WS_EVENT_CONNECTED,
-       WS_EVENT_STA_CONNECTED,
-
-       WS_EVENT_DISCONNECTED,
-       WS_EVENT_STA_DISCONNECTED,
-
-       WS_EVENT_INVITATION_REQ,
-       WS_EVENT_INVITATION_RSP,
-
-       WS_EVENT_TERMINATING,
-       WS_EVENT_GO_NEG_REQUEST,
-       WS_EVENT_GO_NEG_FAILURE,
-
-       WS_EVENT_WPS_FAIL,
-
-} ws_event_id_e;
-
-typedef enum {
-       WPS_ERROR_NONE,
-
-       WPS_ERROR_OOBINFO_READ_FAIL,
-       WPS_ERROR_DECRYPTION_FAIL,
-       WPS_ERROR_2G_NOT_SUPPORTED,
-       WPS_ERROR_5G_NOT_SUPPORTED,
-       WPS_ERROR_WEAK_SIGNAL,
-       WPS_ERROR_NET_AUTH_FAIL,
-       WPS_ERROR_NET_ASSOC_FAIL,
-       WPS_ERROR_NO_DHCP_RESPONSE,
-       WPS_ERROR_DHCP_CONFIG_FAIL,
-       WPS_ERROR_IP_CONFLICT,
-
-       WPS_ERROR_REGISTRAT_CONN_FAIL,
-       WPS_ERROR_PBC_SESSION_OVERLAP,
-       WPS_ERROR_ROGUE_ACTIVITY,
-       WPS_ERROR_DEVICE_BUSY,
-       WPS_ERROR_SETUP_LOCKED,
-       WPS_ERROR_MESSAGE_TIMEOUT,
-       WPS_ERROR_SESSION_TIMEOUT,
-       WPS_ERROR_PASSWORD_MISMATCH,
-} ws_wps_msg_e;
-
-typedef struct
-{
-       char* str;
-       ws_event_id_e id;
-} ws_event_id_s;
-
-ws_event_id_s g_ws_event_info[] =
-{
-       // discovery
-       {"P2P-DEVICE-FOUND", WS_EVENT_DISCOVER_FOUND_PEER},
-
-       // provision discovery
-       {"P2P-PROV-DISC-PBC-RESP", WS_EVENT_PROVISION_DISCOVERY_RESPONSE},
-       {"P2P-PROV-DISC-PBC-REQ", WS_EVENT_PROVISION_DISCOVERY_PBC_REQ},
-       {"P2P-PROV-DISC-SHOW-PIN", WS_EVENT_PROVISION_DISCOVERY_DISPLAY},
-       {"P2P-PROV-DISC-ENTER-PIN", WS_EVENT_PROVISION_DISCOVERY_KEYPAD},
-
-       {"P2P-GROUP-FORMATION-SUCCESS", WS_EVENT_GROUP_FORMATION_SUCCESS},
-       {"P2P-GROUP-FORMATION-FAILURE", WS_EVENT_GROUP_FORMATION_FAILURE},
-
-       // connection
-       {"P2P-GROUP-STARTED", WS_EVENT_GROUP_STARTED},
-       {"P2P-GROUP-REMOVED", WS_EVENT_GROUP_REMOVED},
-
-       {"CTRL-EVENT-CONNECTED", WS_EVENT_CONNECTED},
-       {"AP-STA-CONNECTED", WS_EVENT_STA_CONNECTED},
-       {"CTRL-EVENT-DISCONNECTED", WS_EVENT_DISCONNECTED},
-       {"AP-STA-DISCONNECTED", WS_EVENT_STA_DISCONNECTED},
-
-       // invite
-       {"P2P-INVITATION-RECEIVED", WS_EVENT_INVITATION_REQ},
-       {"P2P-INVITATION-RESULT", WS_EVENT_INVITATION_RSP},
-       
-
-       {"CTRL-EVENT-TERMINATING", WS_EVENT_TERMINATING},
-       {"P2P-GO-NEG-REQUEST", WS_EVENT_GO_NEG_REQUEST},
-
-       {"P2P-GO-NEG-FAILURE", WS_EVENT_GO_NEG_FAILURE},
-       {"WPS-FAIL", WS_EVENT_WPS_FAIL},
-
-       {"", WS_EVENT_NONE}
-};
-
-typedef struct
-{
-       ws_event_id_e id;
-       char peer_mac_address[MACSTR_LEN];
-       char peer_intf_mac_address[MACSTR_LEN];
-       char peer_ssid[DEVICE_NAME_LEN];
-       char wps_pin[WPS_PIN_LEN];
-       int msg;
-} ws_event_s;
-
-typedef struct
-{
-       char* freq;
-       int channel;
-} ws_op_channel_s;
-
-ws_op_channel_s g_ws_op_channel_info[] =
-{
-       /* 2 GHz */
-       {"2412", 1},    {"2417", 2},    {"2422", 3},    {"2427", 4},    {"2432", 5},
-       {"2437", 6},    {"2442", 7},    {"2447", 8},    {"2452", 9},    {"2457", 10},
-       {"2462", 11},   {"2467", 12},   {"2472", 13},   {"2484", 14},
-
-       /* 5 GHz */
-       {"5180", 36},   {"5190", 38},   {"5200", 40},   {"5210", 42},   {"5220", 44},
-       {"5230", 46},   {"5240", 48},   {"5260", 52},   {"5280", 56},   {"5300", 60},
-       {"5320", 64},   {"5500", 100},  {"5520", 104},  {"5540", 108},  {"5560", 112},
-       {"5580", 116},  {"5600", 120},  {"5620", 124},  {"5640", 128},  {"5660", 132},
-       {"5680", 136},  {"5700", 140},  {"5745", 149},  {"5765", 153},  {"5785", 157},
-       {"5805", 161},  {"5825", 165},
-
-       {"", 0}
-};
-
-
-int wfd_ws_init(wfd_oem_event_cb event_callback);
-int wfd_ws_destroy();
-int wfd_ws_activate();
-int wfd_ws_deactivate();
-int wfd_ws_connect(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config);
-int wfd_ws_disconnect();
-int wfd_ws_disconnect_sta(unsigned char mac_addr[6]);
-int wfd_ws_reject_connection(unsigned char mac_addr[6]);
-int wfd_ws_wps_pbc_start(unsigned char mac_addr[6]);
-int wfd_ws_wps_pin_start(unsigned char mac_addr[6]);
-bool wfd_ws_is_discovery_enabled();
-int wfd_ws_start_discovery(bool listen_only, int timeout);
-int wfd_ws_cancel_discovery();
-int wfd_ws_get_discovery_result(wfd_discovery_entry_s ** peer_list, int* peer_num);
-int wfd_ws_get_peer_info(unsigned char *mac_addr, wfd_discovery_entry_s **peer);
-int wfd_ws_send_provision_discovery_request(unsigned char mac_addr[6], wifi_direct_wps_type_e config_method, int is_peer_go);
-int wfd_ws_send_invite_request(unsigned char dev_mac_addr[6]);
-int wfd_ws_create_group(char* ssid);
-int wfd_ws_cancel_group();
-int wfd_ws_activate_pushbutton();
-bool wfd_ws_is_groupowner();
-bool wfd_ws_is_groupclient();
-int wfd_ws_get_ssid(char* ssid, int len);
-char* wfd_ws_get_default_interface_name();
-bool wfd_ws_dhcpc_get_ip_address(char *ipaddr_buf, int len, int is_IPv6);
-char* wfd_ws_get_ip();
-int wfd_ws_set_wps_pin(char* pin);
-int wfd_ws_get_wps_pin(char* wps_pin, int len);
-int wfd_ws_generate_wps_pin();
-int wfd_ws_set_ssid(char* ssid);
-int wfd_ws_set_wpa_passphrase(char* wpa_key);
-int wfd_ws_get_supported_wps_mode();
-int wfd_ws_get_connected_peers_count(int* peer_num);
-int wfd_ws_get_connected_peers_info(wfd_connected_peer_info_s ** peer_list, int* peer_num);
-int wfd_ws_get_go_intent();
-int wfd_ws_set_go_intent(int go_intent);
-int wfd_ws_set_device_type(wifi_direct_primary_device_type_e primary_cat, wifi_direct_secondary_device_type_e sub_cat);
-int wfd_ws_get_device_mac_address(unsigned char* device_mac);
-int wfd_ws_set_oem_loglevel(int is_increase);
-int wfd_ws_get_assoc_sta_mac(unsigned char *mac_addr);
-int wfd_ws_get_disassoc_sta_mac(unsigned char *mac_addr);
-int wfd_ws_get_requestor_mac(unsigned char *mac_addr);
-int wfd_ws_get_operating_channel(void);
-bool wfd_ws_flush();
-bool wfd_ws_cancel();
-int wfd_ws_dsp_init(void);
-int wfd_ws_get_persistent_group_info(wfd_persistent_group_info_s ** persistent_group_list, int* persistent_group_num);
-int wfd_ws_remove_persistent_group(wfd_persistent_group_info_s *persistent_group);
-int wfd_ws_set_persistent_reconnect(bool enabled);
-int wfd_ws_connect_for_persistent_group(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config);
-
-#endif /** __WFD_WPA_SUPPLICANT_H_ */
-
diff --git a/plugin/wpasupplicant/src/wifi-direct-plugin-emul.c b/plugin/wpasupplicant/src/wifi-direct-plugin-emul.c
deleted file mode 100644 (file)
index d3518ee..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <stdlib.h>
-
-#include <glib.h>
-#include <glib-object.h>
-
-//#include "wifi-direct-utils.h"
-#include "wifi-direct-oem.h"
-#include "wifi-direct-service.h"
-#include "wifi-direct-wpasupplicant.h"
-
-
-unsigned char g_incomming_peer_mac_address[6] = {0,};
-char g_incomming_peer_ssid[32 + 1] = {0,};
-
-
-static struct wfd_oem_operations supplicant_ops =
-{
-       .wfd_oem_init = wfd_ws_init,
-       .wfd_oem_destroy = wfd_ws_destroy,
-       .wfd_oem_activate = wfd_ws_activate,
-       .wfd_oem_deactivate = wfd_ws_deactivate,
-       .wfd_oem_connect = wfd_ws_connect,
-       .wfd_oem_disconnect = wfd_ws_disconnect,
-       .wfd_oem_disconnect_sta = wfd_ws_disconnect_sta,
-       .wfd_oem_start_discovery = wfd_ws_start_discovery,
-       .wfd_oem_cancel_discovery = wfd_ws_cancel_discovery,
-       .wfd_oem_get_discovery_result = wfd_ws_get_discovery_result,
-       .wfd_oem_get_peer_info = wfd_ws_get_peer_info,
-       .wfd_oem_send_provision_discovery_request = wfd_ws_send_provision_discovery_request,
-       .wfd_oem_create_group = wfd_ws_create_group,
-       .wfd_oem_cancel_group = wfd_ws_cancel_group,
-       .wfd_oem_activate_pushbutton = wfd_ws_activate_pushbutton,
-       .wfd_oem_get_default_interface_name = wfd_ws_get_default_interface_name,
-       .wfd_oem_dhcpc_get_ip_address = wfd_ws_dhcpc_get_ip_address,
-       .wfd_oem_get_ip = wfd_ws_get_ip,
-       .wfd_oem_set_ssid = wfd_ws_set_ssid,
-       .wfd_oem_is_groupowner = wfd_ws_is_groupowner,
-       .wfd_oem_get_ssid = wfd_ws_get_ssid,
-       .wfd_oem_set_wps_pin = wfd_ws_set_wps_pin,
-       .wfd_oem_get_wps_pin = wfd_ws_get_wps_pin,
-       .wfd_oem_generate_wps_pin = wfd_ws_generate_wps_pin,
-       .wfd_oem_set_wpa_passphrase = wfd_ws_set_wpa_passphrase,
-       .wfd_oem_get_supported_wps_mode = wfd_ws_get_supported_wps_mode,
-       .wfd_oem_get_connected_peers_info = wfd_ws_get_connected_peers_info,
-       .wfd_oem_get_connected_peers_count = wfd_ws_get_connected_peers_count,
-       .wfd_oem_set_oem_loglevel = wfd_ws_set_oem_loglevel,
-       .wfd_oem_get_go_intent = wfd_ws_get_go_intent,
-       .wfd_oem_set_go_intent = wfd_ws_set_go_intent,
-       .wfd_oem_get_device_mac_address = wfd_ws_get_device_mac_address,
-       .wfd_oem_get_disassoc_sta_mac = wfd_ws_get_disassoc_sta_mac,
-       .wfd_oem_get_assoc_sta_mac = wfd_ws_get_assoc_sta_mac,
-       .wfd_oem_get_requestor_mac = wfd_ws_get_requestor_mac,
-       .wfd_oem_get_operating_channel = wfd_ws_get_operating_channel,
-       .wfd_oem_get_persistent_group_info = wfd_ws_get_persistent_group_info,
-       .wfd_oem_remove_persistent_group = wfd_ws_remove_persistent_group,
-       .wfd_oem_set_persistent_group_enabled = wfd_ws_set_persistent_reconnect,
-       .wfd_oem_connect_for_persistent_group = wfd_ws_connect_for_persistent_group,
-};
-
-
-#if 1  // Threadsafe event handling.
-
-void __wfd_ws_callback(wfd_event_t event)
-{
-
-}
-
-#else
-
-void __wfd_oem_callback(wfd_event_t event_type)
-{
-       if (g_oem_event_callback != NULL)
-               g_oem_event_callback(event_type);
-}
-
-#endif
-
-int wfd_ws_init(wfd_oem_event_cb event_callback)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_destroy()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       // Do nothing upto now...
-
-       __WDP_LOG_FUNC_EXIT__;
-       return false;
-}
-
-int wfd_ws_activate()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_deactivate()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_connect(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_disconnect()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_disconnect_sta(unsigned char mac_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-bool wfd_ws_is_discovery_enabled()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_start_discovery(bool listen_only, int timeout)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_cancel_discovery()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_get_discovery_result(wfd_discovery_entry_s ** peer_list, int* peer_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-
-}
-
-int wfd_ws_get_peer_info(unsigned char *mac_addr, wfd_discovery_entry_s **peer)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_send_provision_discovery_request(unsigned char mac_addr[6], wifi_direct_wps_type_e config_method, int is_peer_go)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_create_group(char* ssid)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_cancel_group()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_activate_pushbutton()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-bool wfd_ws_is_groupowner()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-bool wfd_ws_is_groupclient()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_get_ssid(char* ssid, int len)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-
-}
-
-bool wfd_ws_dhcpc_get_ip_address(char *ipaddr_buf, int len, int is_IPv6)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-char* wfd_ws_get_ip()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-
-}
-
-int wfd_ws_set_wps_pin(char* pin)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_get_wps_pin(char* wps_pin, int len)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_generate_wps_pin()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_set_ssid(char* ssid)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_set_wpa_passphrase(char* wpa_key)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_get_supported_wps_mode()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_get_connected_peers_count(int* peer_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_get_connected_peers_info(wfd_connected_peer_info_s ** peer_list, int* peer_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_get_go_intent(int* intent)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_set_go_intent(int go_intent)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_set_device_type(wifi_direct_primary_device_type_e primary_cat, wifi_direct_secondary_device_type_e sub_cat)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_get_device_mac_address(unsigned char* device_mac)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_set_oem_loglevel(int is_increase)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-
-int wfd_ws_get_assoc_sta_mac(unsigned char mac_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-int wfd_ws_get_disassoc_sta_mac(unsigned char mac_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_get_requestor_mac(unsigned char mac_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_get_operating_channel()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_get_persistent_group_info(wfd_persistent_group_info_s ** persistent_group_list, int* persistent_group_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_remove_persistent_group(wfd_persistent_group_info_s *persistent_group)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_set_persistent_reconnect(bool enabled)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
-int wfd_ws_connect_for_persistent_group(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       return false;
-}
-
diff --git a/plugin/wpasupplicant/src/wifi-direct-plugin.c b/plugin/wpasupplicant/src/wifi-direct-plugin.c
deleted file mode 100644 (file)
index 25db619..0000000
+++ /dev/null
@@ -1,4521 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <stdlib.h>
-#include <stdbool.h>
-#include <glib.h>
-#include <glib-object.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <sys/un.h>
-#include <sys/poll.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/ioctl.h>
-
-//#include "wifi-direct-utils.h"
-#include "wifi-direct-oem.h"
-#include "wifi-direct-service.h"
-#include "wifi-direct-wpasupplicant.h"
-
-#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
-#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
-
-int g_global_sockfd;
-int g_control_sockfd;
-int g_monitor_sockfd;
-int g_source_id;
-
-static char g_local_interface_ip_address[20];
-static wfd_noti_cb g_noti_cb;
-wfd_oem_event_cb g_oem_event_callback;
-int g_oem_pipe[2];
-GList *g_conn_peer_addr;
-static unsigned char g_assoc_sta_mac[6];
-static unsigned char g_disassoc_sta_mac[6];
-char g_wps_pin[WPS_PIN_LEN];
-static int g_wps_event_block;
-static unsigned char g_inviting_peer_mac_address[6];
-
-enum current_conn_direction
-{
-       CONN_DIRECTION_NONE,
-       CONN_DIRECTION_INCOMING,
-       CONN_DIRECTION_OUTGOING,
-};
-
-static struct wfd_oem_operations supplicant_ops =
-{
-       .wfd_oem_init = wfd_ws_init,
-       .wfd_oem_destroy = wfd_ws_destroy,
-       .wfd_oem_activate = wfd_ws_activate,
-       .wfd_oem_deactivate = wfd_ws_deactivate,
-       .wfd_oem_connect = wfd_ws_connect,
-       .wfd_oem_wps_pbc_start = wfd_ws_wps_pbc_start,
-       .wfd_oem_wps_pin_start = wfd_ws_wps_pin_start,
-       .wfd_oem_disconnect = wfd_ws_disconnect,
-       .wfd_oem_disconnect_sta = wfd_ws_disconnect_sta,
-       .wfd_oem_reject_connection = wfd_ws_reject_connection,
-       .wfd_oem_is_discovery_enabled = wfd_ws_is_discovery_enabled,
-       .wfd_oem_start_discovery = wfd_ws_start_discovery,
-       .wfd_oem_cancel_discovery = wfd_ws_cancel_discovery,
-       .wfd_oem_get_discovery_result = wfd_ws_get_discovery_result,
-       .wfd_oem_get_peer_info = wfd_ws_get_peer_info,
-       .wfd_oem_send_provision_discovery_request = wfd_ws_send_provision_discovery_request,
-       .wfd_oem_send_invite_request = wfd_ws_send_invite_request,
-       .wfd_oem_create_group = wfd_ws_create_group,
-       .wfd_oem_cancel_group = wfd_ws_cancel_group,
-       .wfd_oem_activate_pushbutton = wfd_ws_activate_pushbutton,
-       .wfd_oem_get_default_interface_name = wfd_ws_get_default_interface_name,
-       .wfd_oem_dhcpc_get_ip_address = wfd_ws_dhcpc_get_ip_address,
-       .wfd_oem_get_ip = wfd_ws_get_ip,
-       .wfd_oem_set_ssid = wfd_ws_set_ssid,
-       .wfd_oem_is_groupowner = wfd_ws_is_groupowner,
-       .wfd_oem_get_ssid = wfd_ws_get_ssid,
-       .wfd_oem_set_wps_pin = wfd_ws_set_wps_pin,
-       .wfd_oem_get_wps_pin = wfd_ws_get_wps_pin,
-       .wfd_oem_generate_wps_pin = wfd_ws_generate_wps_pin,
-       .wfd_oem_set_wpa_passphrase = wfd_ws_set_wpa_passphrase,
-       .wfd_oem_get_supported_wps_mode = wfd_ws_get_supported_wps_mode,
-       .wfd_oem_get_connected_peers_info = wfd_ws_get_connected_peers_info,
-       .wfd_oem_get_connected_peers_count = wfd_ws_get_connected_peers_count,
-       .wfd_oem_set_oem_loglevel = wfd_ws_set_oem_loglevel,
-       .wfd_oem_get_go_intent = wfd_ws_get_go_intent,
-       .wfd_oem_set_go_intent = wfd_ws_set_go_intent,
-       .wfd_oem_set_device_type = wfd_ws_set_device_type,
-       .wfd_oem_get_device_mac_address = wfd_ws_get_device_mac_address,
-       .wfd_oem_get_disassoc_sta_mac = wfd_ws_get_disassoc_sta_mac,
-       .wfd_oem_get_assoc_sta_mac = wfd_ws_get_assoc_sta_mac,
-       .wfd_oem_get_requestor_mac = wfd_ws_get_requestor_mac,
-       .wfd_oem_get_operating_channel = wfd_ws_get_operating_channel,
-       .wfd_oem_get_persistent_group_info = wfd_ws_get_persistent_group_info,
-       .wfd_oem_remove_persistent_group = wfd_ws_remove_persistent_group,
-       .wfd_oem_set_persistent_group_enabled = wfd_ws_set_persistent_reconnect,
-       .wfd_oem_connect_for_persistent_group = wfd_ws_connect_for_persistent_group,
-};
-
-static int wfd_ws_restart_discovery();
-
-int wfd_plugin_load( struct wfd_oem_operations **ops)
-{
-       *ops = &supplicant_ops;
-
-       return true;
-}
-
-static gboolean __wfd_oem_thread_safe_event_handler_cb(GIOChannel* source, GIOCondition condition, gpointer data)
-{
-       wfd_event_t event;
-       int n = 0;
-
-       // Read header part
-       n = read(g_oem_pipe[0], &event, sizeof(event));
-       if (n < 0)
-       {
-               WDP_LOGE( "pipe read error, Error=[%s]\n",strerror(errno));
-               return 0;  // false
-       }
-
-       if (g_oem_event_callback != NULL)
-               g_oem_event_callback(event);
-
-       return true;
-}
-
-int __send_wpa_request(int sockfd, char *cmd, char *reply, size_t reply_buf_len)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       int result = 0;
-       size_t cmd_len;
-
-       int pollret = 0;
-       struct pollfd pollfd;
-       int timeout = 6000; /** for 6.0 sec */
-
-       if (sockfd < 3 )
-       {
-               WDP_LOGE("Invalid argument sfd=[%d]\n", sockfd);
-               return false;
-       }
-
-       if(cmd == NULL)
-       {
-               WDP_LOGE("Invalid argument. Command is NULL\n");
-               return false;
-       }
-       cmd_len = strlen(cmd);
-       WDP_LOGI("cmd [%s] cmd_len[%d]\n", cmd, cmd_len);
-
-       result = write(sockfd, cmd, cmd_len);
-       if ( result < 0)
-       {
-               WDP_LOGE( "Send cmd failed: [%d]\n", result);
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       for (;;)
-       {
-               pollfd.fd = sockfd;
-               pollfd.events = POLLIN | POLLERR | POLLHUP;
-               pollret = poll(&pollfd, 1, timeout);
-
-               if (pollret == 0)
-               {
-                       WDP_LOGI( "POLLing timeout. Nothing to read.\n");
-                       __WDP_LOG_FUNC_EXIT__;
-                       return 0;
-               }
-               else if (pollret < 0)
-               {
-                       WDP_LOGE("Polling error [%d]\n", pollret);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return false;
-               }
-               else
-               {
-                       if (pollfd.revents == POLLIN)
-                       {
-                               WDP_LOGD("POLLIN \n");
-                               result = read(sockfd, (char *) reply, reply_buf_len);
-
-                               WDP_LOGD("sockfd %d retval %d\n", sockfd, result);
-                               WDP_LOGD("reply[%s]\n", reply);
-
-                               if (result < 0)
-                               {
-                                       WDP_LOGE( "Error!!! reading data, error [%s]\n", strerror(errno));
-                                       __WDP_LOG_FUNC_EXIT__;
-                                       return false;
-                               }
-                               break;
-                       }
-                       else
-                       {
-                               WDP_LOGD("POLL EVENT=%d ignored\n", pollfd.revents);
-                               __WDP_LOG_FUNC_EXIT__;
-                               return false;
-                       }
-               }
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return result;
-}
-
-
-int __create_ctrl_intf(char *ctrl_intf_name, char *path)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       struct sockaddr_un servAddr;
-       struct sockaddr_un localAddr;
-       char local_path[32] = {0, };
-       int sockfd = 0;
-       int len = 0;
-       int ret = 0;
-
-       snprintf(local_path, sizeof(local_path), "/tmp/%s", ctrl_intf_name);
-       unlink(local_path);
-
-       errno = 0;
-       if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
-       {
-               WDP_LOGE( "Error!!! creating sync socket. Error = [%s].\n", strerror(errno));
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       WDP_LOGI( "Created socket [%d]\n", sockfd);
-
-       memset(&servAddr, 0, sizeof(servAddr));
-       servAddr.sun_family = AF_UNIX;
-       strcpy(servAddr.sun_path, path);
-       len = sizeof(servAddr.sun_family) + strlen(path);
-
-       WDP_LOGD( "Connecting to server socket to register socket [%d]\n", sockfd);
-
-       memset(&localAddr, 0, sizeof(localAddr));
-       localAddr.sun_family = AF_UNIX;
-       strcpy(localAddr.sun_path, local_path);
-
-       if (bind(sockfd, (struct sockaddr*)&localAddr, sizeof(localAddr)) < 0)
-       {
-               WDP_LOGE( "Error!!! bind(). Error = [%s]. Try again..\n", strerror(errno));
-               
-               unlink(localAddr.sun_path);
-               if (bind(sockfd, (struct sockaddr*)&localAddr, sizeof(localAddr)) < 0)
-               {
-                       WDP_LOGE( "Error!!! bind(). Error = [%s]. Give up..\n", strerror(errno));
-                       close(sockfd);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-       }
-
-       errno = 0;
-       if ((ret = connect(sockfd, (struct sockaddr *) &servAddr, sizeof(servAddr))) < 0)
-       {
-
-               if (unlink(path) < 0)
-               {
-                       WDP_LOGE("unlink[ctrl_iface], Error=[%s]", strerror(errno));
-                       close(sockfd);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-
-               if (connect(sockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0)
-               {
-                       WDP_LOGE("bind[PF_UNIX], Error=[%s]", strerror(errno));
-                       close(sockfd);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-               WDP_LOGI( "Successfully replaced leftover ctrl_iface socket [%s]\n", path);
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-
-       return sockfd;
-}
-
-
-static int __read_socket_cb(int sockfd, char *dataptr, int datalen)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       int pollret = 0;
-       struct pollfd pollfd;
-       int timeout = 2000; /** for 2 sec */
-       int retval = 0;
-
-       WDP_LOGD( "Reading msg from socketfd=[%d]\n", sockfd);
-
-       if (sockfd <= 0)
-       {
-               WDP_LOGE( "Error!!! Invalid socket FD [%d]\n", sockfd);
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       if ((dataptr == NULL) || (datalen <= 0))
-       {
-               WDP_LOGE( "Error!!! Invalid parameter\n");
-               __WDP_LOG_FUNC_EXIT__;
-
-               return -1;
-       }
-
-       pollfd.fd = sockfd;
-       pollfd.events = POLLIN | POLLERR | POLLHUP;
-       pollret = poll(&pollfd, 1, timeout);
-
-       if (pollret > 0)
-       {
-               if (pollfd.revents == POLLIN)
-               {
-                       WDP_LOGD( "POLLIN\n");
-
-                       errno = 0;
-                       retval = read(sockfd, (char *) dataptr, datalen);
-                       WDP_LOGD( "sockfd %d retval %d\n", sockfd, retval);
-                       if (retval <= 0)
-                       {
-                               WDP_LOGD( "Error!!! reading data, Error=[%s]\n", strerror(errno));
-                       }
-                       __WDP_LOG_FUNC_EXIT__;
-                       return retval;
-               }
-               else if (pollfd.revents & POLLHUP)
-               {
-                       WDP_LOGD( "POLLHUP\n");
-                       __WDP_LOG_FUNC_EXIT__;
-
-                       return 0;
-               }
-               else if (pollfd.revents & POLLERR)
-               {
-                       WDP_LOGD( "POLLERR\n");
-                       __WDP_LOG_FUNC_EXIT__;
-                       return 0;
-               }
-       }
-       else if (pollret == 0)
-       {
-               WDP_LOGD( "POLLing timeout  \n");
-               __WDP_LOG_FUNC_EXIT__;
-               return 0;
-       }
-       else
-       {
-               WDP_LOGD( "Polling unknown error \n");
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return 1;
-}
-
-
-void __polling_ip(char *ipaddr_buf, int len, int is_IPv6)
-{
-       int i = 0;
-
-       while(i < 24) {
-               if (wfd_ws_dhcpc_get_ip_address(ipaddr_buf, len, is_IPv6) == true)
-               {
-                       return;
-               }
-               usleep(250);
-               i++;
-       }
-       WDP_LOGE( "** Failed to get IP address!!\n");
-}
-
-char* __get_event_str(char*ptr, char* event_str)
-{
-       char* p = ptr;
-       int c = 0;
-
-       event_str[0] = '\0';
-
-       if (p==NULL)
-               return NULL;
-
-       while(*p != '\n')
-       {
-               if (*p == '\0')
-               {
-                       event_str[c] = '\0';
-                       return NULL;
-               }
-
-               if (*p == ' ')
-                       break;
-
-               event_str[c++] = *p++;
-       }
-       event_str[c]='\0';
-       p++;
-
-       return p;
-}
-
-int __extract_value_str(char *str, char *key, char *value)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       char *tmp_str = NULL;
-       int i = 0;
-
-       if(value == NULL)
-               return -1;
-       
-       tmp_str = strstr(str, key);
-       if(tmp_str == NULL)
-       {
-               WDP_LOGE( "Key[%s] is not found\n", key);
-               return -1;
-       }
-       tmp_str = tmp_str + strlen(key) + 1;
-       //WDP_LOGD( "tmp_str [%s]\n", tmp_str);
-
-       for(i = 0; tmp_str[i]; i++)
-       {
-               if(tmp_str[i] == '\n' || tmp_str[i] == '\r' || tmp_str[i] == ' ')
-               {
-                       break;
-               }
-       }
-
-       memcpy(value, tmp_str, i);
-       value[i] = '\0';
-
-       WDP_LOGD( "extracted value [%s]\n", value);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return i;
-}
-
-
-int __is_white_space(char c)
-{
-       if (c < 32)
-               return 1;
-
-       return 0;
-}
-
-int __is_item_char(char c)
-{
-       if (c >= 'a' && c <= 'z')
-               return 1;
-
-       if (c >= 'A' && c <= 'Z')
-               return 1;
-
-       if (c >= '0' && c <= '9')
-               return 1;
-
-       if (c=='_')
-               return 1;
-
-       if (c=='-')
-               return 1;
-
-       if (c==':')
-               return 1;
-
-       if (c=='[')
-               return 1;
-
-       if (c==']')
-               return 1;
-
-       return 0;
-}
-
-
-char* __get_item_value(char*ptr, char* item, char* value)
-{
-       char* p = ptr;
-       int c = 0;
-
-       item[0] = '\0';
-       value[0]='\0';
-
-       if (p==NULL)
-               return NULL;
-
-       while(*p != '=')
-       {
-               if (*p == '\n')
-               {
-                       item[c] = '\0';
-                       return ++p;
-               }
-               if (*p == '\0')
-               {
-                       item[c] = '\0';
-                       return NULL;
-               }
-               if (__is_white_space(*p) || !__is_item_char(*p))
-                       p++;
-               else
-                       item[c++] = *p++;
-       }
-       item[c]='\0';
-       p++;
-
-       c=0;
-       while(*p != '\n')
-       {
-               if (*p == '\0')
-               {
-                       value[c] = '\0';
-                       return NULL;
-               }
-               if (__is_white_space(*p))
-                       p++;
-               else
-                       value[c++] = *p++;
-       }
-       value[c]='\0';
-       p++;
-
-       return p;
-}
-
-
-char* __get_persistent_group_value(char*ptr, ws_network_info_s* group)
-{
-       char* p = ptr;
-       int c;
-       char value[128];
-
-       if (p==NULL)
-               return NULL;
-
-       /* network_id */
-       c = 0;
-       memset(value, 0, sizeof(value));
-       while(__is_item_char(*p))
-       {
-               value[c++] = *p++;
-       }
-       group->network_id = atoi(value);
-
-       while(!__is_item_char(*p))
-       {
-               p++;
-       }
-
-       /* ssid */
-       c = 0;
-       memset(value, 0, sizeof(value));
-       while(__is_item_char(*p))
-       {
-               value[c++] = *p++;
-       }
-       strncpy(group->ssid, value, NETWORK_SSID_LEN);
-       group->ssid[NETWORK_SSID_LEN-1] = '\0';
-
-       while(!__is_item_char(*p))
-       {
-               p++;
-       }
-
-       /* bssid */
-       c = 0;
-       memset(value, 0, sizeof(value));
-       while(__is_item_char(*p))
-       {
-               value[c++] = *p++;
-       }
-       strncpy(group->bssid, value, NETWORK_BSSID_LEN);
-       group->bssid[NETWORK_BSSID_LEN-1] = '\0';
-
-       while(!__is_item_char(*p))
-       {
-               p++;
-       }
-
-       /* flags */
-       c = 0;
-       memset(value, 0x00, sizeof(value));
-       while(*p != '\n')
-       {
-               value[c++] = *p++;
-       }
-       strncpy(group->flags, value, NETWORK_FLAGS_LEN);
-       group->flags[NETWORK_FLAGS_LEN-1] = '\0';
-
-       p++;
-       return p;
-}
-
-
-int __parsing_peer(char* buf, ws_discovered_peer_info_s* peer)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char* ptr = buf;
-       char item[64];
-       char value[128];
-       int i;
-       int item_id;
-
-       memset(peer, 0, sizeof(ws_discovered_peer_info_s));
-
-       // Get mac address
-       strncpy(peer->mac, ptr, MACSTR_LEN);
-       peer->mac[MACSTR_LEN-1]='\0';
-       ptr += 17+1;
-
-       WDP_LOGD( "mac=%s\n", peer->mac);
-
-       for(;;)
-       {
-               ptr = __get_item_value(ptr, item, value);
-               if (ptr==NULL)
-                       break;
-
-               i=0;
-               item_id = WS_PEER_INFO_NONE;
-               while(g_ws_field_info[i].item_id != WS_PEER_INFO_NONE)
-               {
-                       if (strcmp(g_ws_field_info[i].item_str, item)==0)
-                       {
-                               item_id = g_ws_field_info[i].item_id;
-                               break;
-                       }
-                       i++;
-               }
-
-               switch(item_id)
-               {
-               case WS_PEER_INFO_AGE:
-                       peer->age = atoi(value);
-                       break;
-               case WS_PEER_INFO_LISTEN_FREQ:
-                       peer->listen_freq = atoi(value);
-                       break;
-               case WS_PEER_INFO_LEVEL:
-                       peer->level = atoi(value);
-                       break;
-               case WS_PEER_INFO_WPS_METHOD:
-                       strncpy(peer->wps_method, value, WPS_METHOD_LEN);
-                       peer->wps_method[WPS_METHOD_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_INTERFACE_ADDR:
-                       strncpy(peer->interface_addr, value, MACSTR_LEN);
-                       peer->interface_addr[MACSTR_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_MEMBER_IN_GO_DEV:
-                       strncpy(peer->member_in_go_dev, value, MACSTR_LEN);
-                       peer->member_in_go_dev[MACSTR_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_MEMBER_IN_GO_IFACE:
-                       strncpy(peer->member_in_go_iface, value, MACSTR_LEN);
-                       peer->member_in_go_iface[MACSTR_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_PRI_DEV_TYPE:
-                       strncpy(peer->pri_dev_type, value, DEVICE_TYPE_LEN);
-                       peer->pri_dev_type[DEVICE_TYPE_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_DEVICE_NAME:
-                       strncpy(peer->device_name, value, DEVICE_NAME_LEN);
-                       peer->device_name[DEVICE_NAME_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_MANUFACTURER:
-                       strncpy(peer->manufacturer, value, MANUFACTURER_LEN);
-                       peer->manufacturer[MANUFACTURER_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_MODEL_NAME:
-                       strncpy(peer->model_name, value, MODEL_NAME_LEN);
-                       peer->model_name[MODEL_NAME_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_MODEL_NUMBER:
-                       strncpy(peer->model_number, value, MODEL_NUMBER_LEN);
-                       peer->model_number[MODEL_NUMBER_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_SERIAL_NUMBER:
-                       strncpy(peer->serial_number, value, SERIAL_NUMBER_LEN);
-                       peer->serial_number[SERIAL_NUMBER_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_CONFIG_METHODS:
-                       {
-                               char* p = value;
-                               unsigned long int ret = 0;
-                               ret = strtoul(p, &p, 16);
-                               if (ret == ULONG_MAX)
-                               {
-                                       peer->config_methods = 0;
-                                       WDP_LOGE( "config_methods has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
-                               }
-                               else
-                               {
-                                       peer->config_methods = (unsigned int)ret;
-                                       WDP_LOGD( "config_methods value=[%x <- %s]\n", peer->config_methods, value);
-                               }
-                       }
-                       break;
-               case WS_PEER_INFO_DEV_CAPAB:
-                       {
-                               char* p = value;
-                               unsigned long int ret = 0;
-                               ret = strtoul(p, &p, 16);
-                               if (ret == ULONG_MAX)
-                               {
-                                       peer->dev_capab = 0;
-                                       WDP_LOGE( "device_capab has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
-                               }
-                               else
-                               {
-                                       peer->dev_capab = (unsigned int)ret;
-                                       WDP_LOGD( "device_capab value=[%x <- %s]\n", peer->dev_capab, value);
-                               }
-                       }
-                       break;
-               case WS_PEER_INFO_GROUP_CAPAB:
-                       {
-                               char* p = value;
-                               unsigned long int ret = 0;
-                               ret = strtoul(p, &p, 16);
-                               if (ret == ULONG_MAX)
-                               {
-                                       peer->group_capab = 0;
-                                       WDP_LOGE( "group_capab has wrong value=[%s], Error=[%s]\n", value, strerror(errno));
-                               }
-                               else
-                               {
-                                       peer->group_capab = (unsigned int)ret;
-                                       WDP_LOGD( "group_capab value=[%x <- %s]\n", peer->group_capab, value);
-                               }
-                       }
-                       break;
-               case WS_PEER_INFO_GO_NEG_REQ_SENT:
-                       peer->go_neg_req_sent = atoi(value);
-                       break;
-               case WS_PEER_INFO_GO_STATE:
-                       strncpy(peer->go_state, value, GO_STATE_LEN);
-                       peer->go_state[GO_STATE_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_DIALOG_TOKEN:
-                       peer->dialog_token = atoi(value);
-                       break;
-               case WS_PEER_INFO_INTENDED_ADDR:
-                       strncpy(peer->intended_addr, value, MACSTR_LEN);
-                       peer->intended_addr[MACSTR_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_COUNTRY:
-                       strncpy(peer->country, value, COUNTRY_CODE_LEN);
-                       peer->country[COUNTRY_CODE_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_OPER_FREQ:
-                       peer->oper_freq = atoi(value);
-                       break;
-               case WS_PEER_INFO_REQ_CONFIG_METHODS:
-                       peer->req_config_methods = atoi(value);
-                       break;
-               case WS_PEER_INFO_FLAGS:
-                       strncpy(peer->flags, value, PEER_FLAGS_LEN);
-                       peer->flags[PEER_FLAGS_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_STATUS:
-                       strncpy(peer->status, value, PEER_STATUS_LEN);
-                       peer->status[PEER_STATUS_LEN-1] = '\0';
-                       break;
-               case WS_PEER_INFO_WAIT_COUNT:
-                       peer->wait_count = atoi(value);
-                       break;
-               case WS_PEER_INFO_INVITATION_REQS:
-                       peer->invitation_reqs = atoi(value);
-                       break;
-               case WS_PEER_INFO_OPER_SSID:
-                       strncpy(peer->oper_ssid, value, DEVICE_NAME_LEN);
-                       peer->oper_ssid[DEVICE_NAME_LEN-1] = '\0';
-                       break;
-
-/*----- Miracast -----*/
-               case WS_PEER_INFO_IS_WFD_DEVICE:
-                       peer->is_wfd_device = atoi(value);
-                       break;
-
-               default:
-                       WDP_LOGD( "unknown field\n");
-                       break;
-               }
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-
-int __parsing_persistent_group(char* buf, ws_network_info_s ws_persistent_group_list[], int* persistent_group_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char* ptr = buf;
-       ws_network_info_s group;
-       int count;
-
-       memset(&group, 0, sizeof(ws_network_info_s));
-
-
-       // Passing first line : "network id / ssid / bssid / flags"
-       while (*ptr != '\n')
-       {
-               ptr++;
-       }
-       ptr++;
-
-       count = 0;
-       while(*ptr != '\0')
-       {
-               ptr = __get_persistent_group_value(ptr, &group);
-
-               ws_persistent_group_list[count].network_id = group.network_id;
-               snprintf(ws_persistent_group_list[count].ssid, NETWORK_SSID_LEN, "%s", group.ssid);
-               snprintf(ws_persistent_group_list[count].bssid, NETWORK_BSSID_LEN, "%s", group.bssid);
-               snprintf(ws_persistent_group_list[count].flags, NETWORK_FLAGS_LEN, "%s", group.flags);
-               count++;
-       }
-
-       *persistent_group_num = count;
-
-       __WDP_LOG_FUNC_EXIT__;
-       return 0;
-       
-}
-
-void __parsing_ws_event(char* buf, ws_event_s *event)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char* ptr = buf;
-       char event_str[64];
-       int i;
-       ws_field_id_e event_id;
-       int res = 0;
-
-       if (NULL == buf)
-       {
-               WDP_LOGE( "ERROR : buf is NULL!!\n");
-               return;
-       }
-
-       ptr = ptr +3;
-       ptr = __get_event_str(ptr, event_str);
-
-       WDP_LOGD( "event str [%s]\n", event_str);
-
-       i=0;
-       event_id = WS_EVENT_NONE;
-       while(g_ws_event_info[i].id != WS_EVENT_NONE)
-       {
-               if (strcmp(g_ws_event_info[i].str, event_str)==0)
-               {
-                       event_id = g_ws_event_info[i].id;
-                       break;
-               }
-               i++;
-       }
-
-       switch(event_id)
-       {
-               memset(event, 0, sizeof(ws_event_s));
-               
-               case WS_EVENT_DISCOVER_FOUND_PEER:
-                       event->id = WS_EVENT_DISCOVER_FOUND_PEER;
-                       WDP_LOGD( "WS EVENT : [WS_EVENT_DISCOVER_FOUND_PEER]\n");
-               break;
-
-               case WS_EVENT_PROVISION_DISCOVERY_RESPONSE:
-                       event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE;
-                       ptr = __get_event_str(ptr, event_str);
-                       strncpy(event->peer_mac_address, event_str, MACSTR_LEN);
-                       event->peer_mac_address[MACSTR_LEN-1] = '\0';
-                       WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE]\n");
-                       WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
-               break;
-
-               case WS_EVENT_PROVISION_DISCOVERY_PBC_REQ:
-                       event->id = WS_EVENT_PROVISION_DISCOVERY_PBC_REQ;
-                       res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
-                       if(res <= 0)
-                       {
-                               WDP_LOGE( "Failed to extract p2p_dev_addr");
-                               // TO-DO: stop parsing and make event callback function stop
-                               __WDP_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       res = __extract_value_str(ptr, "name" , event->peer_ssid);
-                       if(res <= 0)
-                       {
-                               WDP_LOGE( "Failed to extract name(ssid)");
-                               // TO-DO: stop parsing and make event callback function stop
-                               __WDP_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_PBC_REQ]\n");
-                       WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
-               break;
-
-               case WS_EVENT_PROVISION_DISCOVERY_DISPLAY:
-                       event->id = WS_EVENT_PROVISION_DISCOVERY_DISPLAY;
-                       res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
-                       if(res <= 0)
-                       {
-                               WDP_LOGD( "Failed to extract p2p_dev_addr");
-                               WDP_LOGD( "Prov disc Response : DISPLAY");
-                               event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY;
-                               ptr = __get_event_str(ptr, event_str);
-                               strncpy(event->peer_mac_address, event_str, MACSTR_LEN);
-                               event->peer_mac_address[MACSTR_LEN-1] = '\0';
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY]\n");
-                               WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
-                               ptr = __get_event_str(ptr, event_str);
-                               strncpy(event->wps_pin, event_str, WPS_PIN_LEN);
-                               event->wps_pin[WPS_PIN_LEN-1] = '\0';
-                               WDP_LOGD( "WS EVENT : [PIN : %s]\n", event_str);
-                               __WDP_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       ptr = __get_event_str(ptr, event_str); /* Stepping Mac Addr */
-                       ptr = __get_event_str(ptr, event_str); /* Stepping PIN */
-                       memset(event->wps_pin, 0x00, sizeof(event->wps_pin));
-                       strncpy(event->wps_pin, event_str, WPS_PIN_LEN);
-                       event->wps_pin[WPS_PIN_LEN-1] = '\0';
-                       WDP_LOGD( "WS EVENT : [PIN : %s]\n", event_str);
-
-                       res = __extract_value_str(ptr, "name" , event->peer_ssid);
-                       if(res <= 0)
-                       {
-                               WDP_LOGE( "Failed to extract name(ssid)");
-                               __WDP_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_DISPLAY]\n");
-                       WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
-               break;
-
-               case WS_EVENT_PROVISION_DISCOVERY_KEYPAD:
-                       event->id = WS_EVENT_PROVISION_DISCOVERY_KEYPAD;
-                       res = __extract_value_str(ptr, "p2p_dev_addr", event->peer_mac_address);
-                       if(res <= 0)
-                       {
-                               WDP_LOGD( "Failed to extract p2p_dev_addr");
-                               WDP_LOGD( "Prov disc Response : KEYPAD");
-                               event->id = WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD;
-                               ptr = __get_event_str(ptr, event_str);
-                               strncpy(event->peer_mac_address, event_str, MACSTR_LEN);
-                               event->peer_mac_address[MACSTR_LEN-1] = '\0';
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD]\n");
-                               WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
-                               __WDP_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       res = __extract_value_str(ptr, "name" , event->peer_ssid);
-                       if(res <= 0)
-                       {
-                               WDP_LOGE( "Failed to extract name(ssid)");
-                               __WDP_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       WDP_LOGD( "WS EVENT : [WS_EVENT_PROVISION_DISCOVERY_KEYPAD]\n");
-                       WDP_LOGD( "WS EVENT : [MAC : %s]\n", event_str);
-               break;
-
-               case WS_EVENT_GROUP_FORMATION_SUCCESS:
-               case WS_EVENT_GROUP_FORMATION_FAILURE:
-                       event->id = event_id;
-               break;
-
-               case WS_EVENT_GROUP_STARTED:
-                       {
-                               event->id = WS_EVENT_GROUP_STARTED;
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_GROUP_STARTED]\n");
-                               if (strstr(ptr, "client")) {
-                                       WDP_LOGD("[Group Client]");
-                                       int res = 0;
-                                       char *go_dev_addr = NULL;
-                                       go_dev_addr = (char*) calloc(1, MACSTR_LEN);
-                                       res = __extract_value_str(ptr, "go_dev_addr", go_dev_addr);
-                                       if(res > 0) {
-                                               strncpy(event->peer_mac_address, go_dev_addr, MACSTR_LEN);
-                                               event->peer_mac_address[MACSTR_LEN-1] = '\0';
-                                       }
-                                       free(go_dev_addr);
-                                       WDP_LOGD( "connected peer mac address [%s]", event->peer_mac_address);
-                               } else {
-                                       WDP_LOGD("[Group Owner]");
-                               }
-
-                               /* for checking persistent group */
-                               if (strstr(ptr, "PERSISTENT")) {
-                                       WDP_LOGD( "[PERSISTENT GROUP]");
-                                       event->id = WS_EVENT_PERSISTENT_GROUP_STARTED;
-                               }
-                       }
-               break;
-
-               case WS_EVENT_GROUP_REMOVED:
-                       event->id = WS_EVENT_GROUP_REMOVED;
-                       WDP_LOGD( "WS EVENT : [WS_EVENT_GROUP_REMOVED]\n");
-               break;
-
-               case WS_EVENT_TERMINATING:
-                       event->id = WS_EVENT_TERMINATING;
-                       WDP_LOGD( "WS EVENT : [WS_EVENT_TERMINATING]\n");
-               break;
-#if 1
-               case WS_EVENT_CONNECTED:
-                       {
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_CONNECTED]\n");
-                               int res = 0;
-                               char *intf_addr;
-                               intf_addr = (char*) calloc(1, MACSTR_LEN);
-                               event->id = WS_EVENT_CONNECTED;
-                               res = __extract_value_str(ptr, "to", intf_addr);
-                               if(res > 0)
-                                       wfd_macaddr_atoe(intf_addr, g_assoc_sta_mac);
-                               WDP_LOGD( "connected peer interface mac address [%s]", intf_addr);
-                               free(intf_addr);
-                       }
-               break;
-#endif
-               case WS_EVENT_STA_CONNECTED:
-                       {
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_STA_CONNECTED]\n");
-                               int res = 0;
-                               event->id = WS_EVENT_STA_CONNECTED;
-
-                               ptr = __get_event_str(ptr, event_str);
-                               strncpy(event->peer_intf_mac_address, event_str, MACSTR_LEN);
-                               event->peer_intf_mac_address[MACSTR_LEN-1] = '\0';
-
-                               res = __extract_value_str(ptr, "dev_addr", event->peer_mac_address);
-                               if (res < 0)
-                                       WDP_LOGD("Key %s is not found", "dev_addr");
-                               else if (res == 0)
-                                       WDP_LOGD("Empty value");
-                               else
-                                       WDP_LOGD( "connected peer mac address [%s]", event->peer_intf_mac_address);
-                       }
-               break;
-
-               case WS_EVENT_DISCONNECTED:
-                       {
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_DISCONNECTED]\n");
-                               int res = 0;
-                               char *intf_addr;
-                               intf_addr = (char*) calloc(1, MACSTR_LEN);
-                               event->id = WS_EVENT_DISCONNECTED;
-                               res = __extract_value_str(ptr, "to", intf_addr);
-                               if(res > 0) {
-                                       strncpy(event->peer_mac_address, intf_addr, MACSTR_LEN);
-                                       event->peer_mac_address[MACSTR_LEN-1] = '\0';
-                               }
-                               free(intf_addr);
-                               WDP_LOGD( "disconnected peer mac address [%s]", event->peer_mac_address);
-                       }
-               break;
-
-               case WS_EVENT_STA_DISCONNECTED:
-                       {
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_STA_DISCONNECTED]\n");
-                               int res = 0;
-                               event->id = WS_EVENT_STA_DISCONNECTED;
-
-                               ptr = __get_event_str(ptr, event_str);
-                               strncpy(event->peer_intf_mac_address, event_str, MACSTR_LEN);
-                               event->peer_intf_mac_address[MACSTR_LEN-1] = '\0';
-
-                               res = __extract_value_str(ptr, "dev_addr", event->peer_mac_address);
-                               if (res < 0)
-                                       WDP_LOGD("Key %s is not found", "dev_addr");
-                               else if (res == 0)
-                                       WDP_LOGD("Empty value");
-                               else
-                                       WDP_LOGD( "disconnected peer mac address [%s]", event->peer_intf_mac_address);
-                       }
-               break;
-
-               case WS_EVENT_INVITATION_REQ:
-                       {
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_INVITATION_REQ]\n");
-                               int res = 0;
-                               event->id = WS_EVENT_INVITATION_REQ;
-
-#if 1          
-                               res = __extract_value_str(ptr, "go_dev_addr", event->peer_mac_address);
-#else
-                               res = __extract_value_str(ptr, "bssid", event->peer_mac_address);
-#endif
-                               if(res <= 0)
-                               {
-                                       WDP_LOGE( "Failed to extract p2p_dev_addr");
-                                       __WDP_LOG_FUNC_EXIT__;
-                                       return;
-                               }
-                               WDP_LOGD( "WS EVENT : [GO MAC : %s]\n", event->peer_mac_address);
-                       }
-               break;
-
-               case WS_EVENT_INVITATION_RSP:
-                       {
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_INVITATION_RSP]\n");
-                               //int res = 0;
-                               event->id = WS_EVENT_INVITATION_RSP;
-
-#if 0          
-                               res = __extract_value_str(ptr, "status", );
-                               if(res <= 0)
-                               {
-                                   WDP_LOGE( "Failed to extract p2p_dev_addr");
-                                   return;
-                               }
-                               WDP_LOGD( "WS EVENT : [GO MAC : %s]\n", event->peer_mac_address);
-#endif
-
-                       }
-               break;
-               case WS_EVENT_GO_NEG_REQUEST:
-                       {
-                               WDP_LOGD( "WS EVENT : [WS_EVENT_GO_NEG_REQUEST]");
-
-                               event->id = WS_EVENT_GO_NEG_REQUEST;
-                               ptr = __get_event_str(ptr + 19, event_str);
-                               strncpy(event->peer_intf_mac_address, event_str, MACSTR_LEN);
-                               event->peer_intf_mac_address[MACSTR_LEN-1] = '\0';
-                       }
-               break;
-
-               case WS_EVENT_GO_NEG_FAILURE:
-                       {
-                               WDP_LOGD("WS EVENT : [WS_EVENT_GO_NEG_FAILURE]");
-                               char status[16] = {0, };
-                               event->id = WS_EVENT_GO_NEG_FAILURE;
-                               ptr = __extract_value_str(ptr, "status", status);
-                               event->msg = atoi(status);
-                               WDP_LOGD("Status [%d]", event->msg);
-                       }
-               break;
-
-               case WS_EVENT_WPS_FAIL:
-                       {
-                               WDP_LOGD("WS EVENT : [WS_EVENT_WPS_FAIL]");
-                               char config_error[4] = {0, };
-                               event->id = WS_EVENT_WPS_FAIL;
-                               ptr = __extract_value_str(ptr, "config_error", config_error);
-                               event->msg = atoi(config_error);
-                       }
-               break;
-
-               default:
-                       WDP_LOGE( "ERROR : unknown event !!\n");
-               break;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-
-       return;
-       
-}
-
-int __store_persistent_peer(int network_id, char* persistent_group_ssid, char* peer_mac_address)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char buf[100] = "";
-       FILE *fp = NULL;
-
-       snprintf(buf, sizeof(buf), "%d %s %s\n",network_id, persistent_group_ssid, peer_mac_address);
-
-       fp = fopen(PERSISTENT_PEER_PATH, "a");
-       if (NULL == fp)
-       {
-               WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-
-       //fseek(fp, 0, SEEK_END);
-       fputs(buf, fp);
-       fclose(fp);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-
-}
-
-int __get_network_id_from_network_list_with_ssid(char* persistent_group_ssid)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       int persistent_group_count = 0;
-       int i;
-       int result;
-       wfd_persistent_group_info_s* plist;
-       int network_id = -1;
-
-       WDP_LOGD( "search with persistent_group_ssid = [%s]\n",persistent_group_ssid);
-
-       result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
-       if (result == true)
-       {
-               if (persistent_group_count > 0)
-               {
-                       for(i=0; i<persistent_group_count; i++)
-                       {
-                               WDP_LOGD( "plist[%d].ssid=[%s]\n", i,plist[i].ssid);
-                               if (strcmp(plist[i].ssid, persistent_group_ssid) == 0)
-                               {
-                                       WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
-                                       network_id = plist[i].network_id;
-                                       free(plist);
-                                       return network_id;
-                               }
-                       }
-                       WDP_LOGE( "There is no Persistent Group has ssid[%s]\n", persistent_group_ssid);
-                       free(plist);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-               else
-               {
-                       WDP_LOGE( "have no Persistent Group!!\n");
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-       }
-       else
-       {
-               WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-}
-
-int __get_network_id_from_network_list_with_go_mac(char* go_mac_address)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       int persistent_group_count = 0;
-       int i;
-       int result;
-       wfd_persistent_group_info_s* plist;
-       char mac_str[18] = {0, };
-       int network_id = -1;
-
-       WDP_LOGD( "search with persistent_group go_mac_address = [%s]\n",go_mac_address);
-
-       result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
-       if (result == true)
-       {
-               if (persistent_group_count > 0)
-               {
-                       for(i=0; i<persistent_group_count; i++)
-                       {
-                               snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(plist[i].go_mac_address));
-                               WDP_LOGD( "plist[%d].go_mac_address=[%s]\n", i,mac_str);
-                               if (strcmp(mac_str, go_mac_address) == 0)
-                               {
-                                       WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
-                                       network_id = plist[i].network_id;
-                                       free(plist);
-                                       __WDP_LOG_FUNC_EXIT__;
-                                       return network_id;
-                               }
-                       }
-                       WDP_LOGE( "There is no Persistent Group has go mac[%s]\n", go_mac_address);
-                       free(plist);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-               else
-               {
-                       WDP_LOGE( "have no Persistent Group!!\n");
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-       }
-       else
-       {
-               WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-}
-
-
-int __get_network_id_from_persistent_client_list_with_mac(char* peer_mac_address)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       FILE *fp = NULL;
-       char buf[100] = "";
-       int n = 0;
-       int network_id;
-       char stored_ssid[NETWORK_SSID_LEN] = {0, };
-       char stored_peer_mac[MACSTR_LEN] = {0, };
-
-       fp = fopen(PERSISTENT_PEER_PATH, "r");
-       if (NULL == fp)
-       {
-               WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-
-       while(fgets(buf, 100, fp) != NULL)
-       {
-               n = sscanf(buf,"%d %s %s", &network_id, stored_ssid, stored_peer_mac);
-               WDP_LOGD( "network_id=[%d], ssid=[%s], peer_mac=[%s]\n",network_id, stored_ssid, stored_peer_mac);
-
-               if (strcmp(stored_peer_mac, peer_mac_address) == 0)
-               {
-                       fclose(fp);
-                       return network_id;
-               }
-       }
-       fclose(fp);
-
-       WDP_LOGD( "Can not find peer mac in persistent peer list\n");
-
-       __WDP_LOG_FUNC_EXIT__;
-       return -1;
-
-}
-
-bool __is_already_stored_persistent_client(int network_id, char* peer_mac_address)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       FILE *fp = NULL;
-       char buf[100] = "";
-       int n = 0;
-       int stored_network_id;
-       char stored_ssid[NETWORK_SSID_LEN] = {0, };
-       char stored_peer_mac[MACSTR_LEN] = {0, };
-
-       fp = fopen(PERSISTENT_PEER_PATH, "r");
-       if (NULL == fp)
-       {
-               WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-
-       while(fgets(buf, 100, fp) != NULL)
-       {
-               n = sscanf(buf,"%d %s %s", &stored_network_id, stored_ssid, stored_peer_mac);
-               WDP_LOGD( "stored_network_id=[%d], stored_ssid=[%s], stored_peer_mac=[%s]\n",stored_network_id, stored_ssid, stored_peer_mac);
-
-               if ((strcmp(stored_peer_mac, peer_mac_address) == 0)
-                       && (stored_network_id == network_id))
-               {
-                       WDP_LOGD( "found peer in persistent peer list\n");
-                       fclose(fp);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return true;
-               }
-       }
-       fclose(fp);
-
-       WDP_LOGD( "Can not find peer in persistent peer list\n");
-       __WDP_LOG_FUNC_EXIT__;
-       return false;
-
-}
-
-int __get_persistent_group_clients(void)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       FILE *fp = NULL;
-       char buf[100] = "";
-       int n = 0;
-       int network_id;
-       char ssid[NETWORK_SSID_LEN] = {0, };
-       char peer_mac[MACSTR_LEN] = {0, };
-
-       fp = fopen(PERSISTENT_PEER_PATH, "r");
-       if (NULL == fp)
-       {
-               WDP_LOGE( "ERROR : file open failed!! [persistent-peer]\n");
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-
-       while(fgets(buf, 100, fp) != NULL)
-       {
-               n = sscanf(buf,"%d %s %s", &network_id, ssid, peer_mac);
-               WDP_LOGD( "network_id=[%d], ssid=[%s], peer_mac=[%s]\n",network_id, ssid, peer_mac);
-       }
-       fclose(fp);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-
-}
-
-int __send_invite_request_with_network_id(int network_id, unsigned char dev_mac_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[128] = {0, };
-       char mac_str[MACSTR_LEN] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(mac_str, 18, MACSTR, MAC2STR(dev_mac_addr));
-       snprintf(cmd, sizeof(cmd), "%s persistent=%d peer=%s", CMD_SEND_INVITE_REQ, network_id, mac_str);
-
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(p2p_invite persistent=%d peer=%s) result=[%d]\n", network_id, mac_str, result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "Invite... peer-MAC [%s]\n", mac_str);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int glist_compare_peer_mac_cb(const void* data1, const void* data2)
-{
-       char *mac_str1 = (char*) data1;
-       char *mac_str2 = (char*) data2;
-       int r = 0;
-
-       if (data1==NULL || data2==NULL)
-       {
-               WDP_LOGE( "Error!! data is NULL\n");
-               return -1;
-       }
-
-       r = strcmp(mac_str1, mac_str2);
-       if (r==0)
-               return 0;
-       else
-               return 1;
-}
-
-void glist_print_connected_peer_cb(gpointer data, gpointer user_data)
-{
-       char *mac_str = (char*) data;
-       int count = *(int*)user_data;
-       WDP_LOGD( "Connected peer[%d] mac=[%s]\n", count, mac_str);
-       *(int*)user_data = count+1;
-}
-
-void wfd_ws_print_connected_peer()
-{
-       WDP_LOGD( "Connected Peer Table\n");
-       int count = 0;
-       g_list_foreach(g_conn_peer_addr, glist_print_connected_peer_cb, &count);        
-       WDP_LOGD( "Count=%d\n", count);
-}
-
-void wfd_ws_glist_reset_connected_peer()
-{
-       if(g_conn_peer_addr)
-       {
-               GList *element = NULL;
-
-               element = g_list_first(g_conn_peer_addr);
-               while(element)
-               {
-                       if(element->data)
-                               free((char*) element->data);
-                       element = g_list_next(element);
-               }
-               g_list_free(g_conn_peer_addr);
-               g_conn_peer_addr = NULL;
-       }
-}
-
-
-static gboolean __ws_event_callback(GIOChannel * source,
-                                                                                  GIOCondition condition,
-                                                                                  gpointer data)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       int sockfd = g_monitor_sockfd;
-       char buffer[4096] = {0, };
-       int n = 0;
-       ws_event_s event = {0,};
-
-       // Read socket
-       if ( (n = __read_socket_cb(sockfd, buffer, sizeof(buffer))) < 0)        
-       {
-               WDP_LOGE( "Error!!! Reading Async Event[%d]\n", sockfd);
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "Received Event:[%d, %s]\n", n, buffer);
-
-       __parsing_ws_event(buffer, &event);
-
-       WDP_LOGD( "EVENT ID = %d\n", event.id);
-
-       switch (event.id)
-       {
-               case WS_EVENT_DISCOVER_FOUND_PEER:
-                       g_noti_cb(WFD_EVENT_DISCOVER_FOUND_PEERS);
-               break;
-
-               case WS_EVENT_PROVISION_DISCOVERY_RESPONSE:
-               {
-                       unsigned char la_mac_addr[6];
-                       wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
-
-                       wfd_server_control_t * wfd_server = wfd_server_get_control();
-
-                       WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
-                       wfd_ws_connect(la_mac_addr, WIFI_DIRECT_WPS_TYPE_PBC);
-               }
-               break;
-
-               case WS_EVENT_PROVISION_DISCOVERY_RESPONSE_DISPLAY:
-               {
-                       if (g_wps_event_block)
-                               break;
-
-                       g_wps_event_block = 1;
-                       unsigned char la_mac_addr[6];
-                       wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
-                       memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
-                       memcpy(g_incomming_peer_mac_address, la_mac_addr, 6);
-                       memset(g_wps_pin, 0x00, sizeof(g_wps_pin));
-                       memcpy(&g_wps_pin, event.wps_pin, 8);
-                       WDP_LOGD( "MAC ADDR = " MACSTR "(a)\tPIN = %s\n", MAC2STR(g_incomming_peer_mac_address), g_wps_pin);
-                       g_noti_cb(WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY);
-               }
-               break;
-
-               case WS_EVENT_PROVISION_DISCOVERY_RESPONSE_KEYPAD:
-               {
-                       if (g_wps_event_block)
-                               break;
-
-                       g_wps_event_block = 1;
-                       unsigned char la_mac_addr[6];
-                       wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
-                       memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
-                       memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
-                       g_noti_cb(WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD);
-               }
-               break;
-
-
-               case WS_EVENT_PROVISION_DISCOVERY_PBC_REQ:
-               case WS_EVENT_PROVISION_DISCOVERY_DISPLAY:
-               case WS_EVENT_PROVISION_DISCOVERY_KEYPAD:
-               {
-                       if (g_wps_event_block)
-                               break;
-
-                       g_wps_event_block = 1;
-                       WDP_LOGD("Incomming PROV_DISC [%d]", event.id);
-                       unsigned char la_mac_addr[6];
-                       wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
-                       memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
-                       memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
-                       memset(g_incomming_peer_ssid, 0, sizeof(g_incomming_peer_ssid));
-                       strncpy(g_incomming_peer_ssid, event.peer_ssid, sizeof(g_incomming_peer_ssid));
-                       g_incomming_peer_ssid[32] = '\0';
-
-                       WDP_LOGD( "NEW PIN RECEIVED = %s\n", event.wps_pin);
-                       memset(g_wps_pin, 0x00, sizeof(g_wps_pin));
-                       strncpy(g_wps_pin, event.wps_pin, WPS_PIN_LEN);
-                       g_wps_pin[WPS_PIN_LEN-1] = '\0';
-
-                       WDP_LOGD( "Prov Req:  mac[" MACSTR"] ssid=[%s]\n",
-                               MAC2STR(g_incomming_peer_mac_address), g_incomming_peer_ssid);
-
-                       if (WS_EVENT_PROVISION_DISCOVERY_DISPLAY == event.id)
-                               g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY);
-                       else if (WS_EVENT_PROVISION_DISCOVERY_KEYPAD == event.id)
-                               g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD);
-                       else
-                               g_noti_cb(WFD_EVENT_PROV_DISCOVERY_REQUEST);
-               }
-               break;
-
-               case WS_EVENT_GROUP_FORMATION_SUCCESS:
-               case WS_EVENT_GROUP_FORMATION_FAILURE:
-                       g_wps_event_block = 0;
-               break;
-
-               case WS_EVENT_GROUP_STARTED:
-               {
-                       g_wps_event_block = 0;
-
-                       if(wfd_ws_is_groupowner())
-                       {
-                               WDP_LOGD(" CHECK : It's AP... \n");
-                               system("/usr/bin/wifi-direct-dhcp.sh server");
-                               __polling_ip(g_local_interface_ip_address, 20, FALSE);
-                               WDP_LOGE( "*** IP : %s\n", g_local_interface_ip_address);
-
-                               g_noti_cb(WFD_EVENT_SOFTAP_READY);
-                       }
-                       else
-                       {
-                               wfd_ws_glist_reset_connected_peer();
-
-                               g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
-                               WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
-
-                               g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
-                       }
-               }
-               break;
-
-               case WS_EVENT_PERSISTENT_GROUP_STARTED:
-               {
-                       if(wfd_ws_is_groupowner())
-                       {
-                               WDP_LOGD(" CHECK : It's AP... \n");
-                               system("/usr/bin/wifi-direct-dhcp.sh server");
-                               __polling_ip(g_local_interface_ip_address, 20, FALSE);
-                               WDP_LOGE( "*** IP : %s\n", g_local_interface_ip_address);
-
-                               g_noti_cb(WFD_EVENT_SOFTAP_READY);
-                       }
-                       else
-                       {
-                               wfd_ws_glist_reset_connected_peer();
-
-                               g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
-                               WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
-
-                               /* We need to store current peer
-                               because, persistent joining is excuted silencely without client event.*/
-                               unsigned char la_mac_addr[6];
-                               wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
-                               wfd_server_remember_connecting_peer(la_mac_addr);
-                               wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
-
-                               g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
-                       }
-               }
-               break;
-
-               case WS_EVENT_GROUP_REMOVED:
-               {
-                       system("/usr/bin/wifi-direct-dhcp.sh stop");
-                       g_noti_cb(WFD_EVENT_CREATE_LINK_CANCEL);
-                       g_noti_cb(WFD_EVENT_CREATE_LINK_DOWN);
-                       g_noti_cb(WFD_EVENT_SOFTAP_STOP);
-
-                       wfd_ws_glist_reset_connected_peer();
-#if 0                  
-                       wfd_ws_flush();
-#endif                 
-               }
-               break;
-
-               case WS_EVENT_TERMINATING:
-                       system("/usr/sbin/p2p_supp.sh stop");
-                       system("/usr/bin/wlan.sh stop");
-                       WDP_LOGE( "Device is Deactivated\n");
-               break;
-
-               case WS_EVENT_CONNECTED:
-                       {
-                               // Nothing
-                       }
-               break;
-
-               case WS_EVENT_DISCONNECTED:
-                       {
-                               GList *element = NULL;
-                               element = g_list_find(g_conn_peer_addr, event.peer_mac_address);
-                               if(element != NULL)
-                               {
-                                       g_conn_peer_addr = g_list_remove(g_conn_peer_addr, event.peer_mac_address);
-                                       WDP_LOGD( "disconnected peer[%s] is removed\n", event.peer_mac_address);
-                                       free((char*) element->data);
-                               }
-                       }
-               break;
-
-               case WS_EVENT_STA_CONNECTED:
-                       {
-                               g_wps_event_block = 0;
-                               GList *element = NULL;
-                               element = g_list_find_custom(g_conn_peer_addr, event.peer_mac_address, glist_compare_peer_mac_cb);
-                               if(element  == NULL)
-                               {
-                                       g_conn_peer_addr = g_list_append(g_conn_peer_addr, strdup(event.peer_mac_address));
-                                       WDP_LOGD( "connected peer[%s] is added\n", event.peer_mac_address);
-                               }
-
-                               wfd_ws_print_connected_peer();
-
-                               wfd_macaddr_atoe(event.peer_intf_mac_address, g_assoc_sta_mac);
-
-                               wfd_server_control_t * wfd_server = wfd_server_get_control();
-                               if (wfd_server->config_data.want_persistent_group == true)
-                               {
-                                       char g_persistent_group_ssid[64];
-                                       int network_id;
-                                       int result;
-
-                                       memset(g_persistent_group_ssid, 0, sizeof(g_persistent_group_ssid));
-                                       wfd_ws_get_ssid(g_persistent_group_ssid, 64);
-
-                                       /* find network id with ssid */
-                                       network_id = __get_network_id_from_network_list_with_ssid(g_persistent_group_ssid);
-                                       if (network_id < 0)     /* NOT Persistent group */
-                                       {
-                                               WDP_LOGD( "__get_network_id_from_network_list_with_ssid FAIL!![%d]\n", network_id);
-                                               WDP_LOGD( "[NOT Persistent Group]\n");
-                                       }
-                                       else    /* Persistent group */
-                                       {
-                                               /* checking peer list whether the peer is already stored or not */
-                                               if (__is_already_stored_persistent_client(network_id, event.peer_mac_address) == false)
-                                               {
-                                                       /* storing new persistent group client*/
-                                                       result = __store_persistent_peer(network_id, g_persistent_group_ssid, event.peer_mac_address);
-                                                       if (result != true)
-                                                               WDP_LOGD( "__store_persistent_peer FAIL!![%d]\n", result);
-                                               }
-
-                                               /* We need to store current peer
-                                               because, persistent joining is excuted silencely without client event.*/
-                                               unsigned char la_mac_addr[6];
-                                               wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
-                                               wfd_server_remember_connecting_peer(la_mac_addr);
-                                               wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
-                                       }
-                               }
-
-                               g_noti_cb(WFD_EVENT_CREATE_LINK_COMPLETE);
-                       }
-                       break;
-               case WS_EVENT_STA_DISCONNECTED:
-                       {
-                               GList *element = NULL;
-
-                               wfd_ws_print_connected_peer();
-
-                               element = g_list_find_custom(g_conn_peer_addr, event.peer_mac_address, glist_compare_peer_mac_cb);
-                               if(element != NULL)
-                               {
-                                       g_conn_peer_addr = g_list_remove(g_conn_peer_addr, element->data);
-                                       WDP_LOGD( "disconnected peer[%s] is removed\n", event.peer_mac_address);
-                                       wfd_ws_print_connected_peer();
-                               }
-                               else
-                               {
-                                       WDP_LOGD( "Something wrong.. disconnected peer[%s] is not in Table\n", event.peer_mac_address);
-                               }
-                               wfd_macaddr_atoe(event.peer_intf_mac_address, g_disassoc_sta_mac);
-                               g_noti_cb(WFD_EVENT_SOFTAP_STA_DISASSOC);
-                       }
-                       break;
-
-               case WS_EVENT_INVITATION_REQ:
-               {
-                       wfd_ws_restart_discovery();
-                       unsigned char la_mac_addr[6];
-                       wfd_macaddr_atoe(event.peer_mac_address, la_mac_addr);
-                       memcpy(&g_incomming_peer_mac_address, la_mac_addr, 6);
-                       WDP_LOGD( "INVITATION REQ. RECEIVED:  mac[" MACSTR"]\n", MAC2STR(g_incomming_peer_mac_address));
-                       memcpy(&g_inviting_peer_mac_address, la_mac_addr, 6);
-                       g_noti_cb(WFD_EVENT_INVITE_REQUEST);
-               }
-               break;
-
-               case WS_EVENT_INVITATION_RSP:
-                       {
-                       }
-               break;
-
-               case WS_EVENT_GO_NEG_FAILURE:
-                       {
-                               if (event.msg == -1) {
-                                       g_noti_cb(WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT);
-                                       break;
-                               }
-                               wfd_ws_cancel();
-                               wfd_ws_flush();
-                               g_noti_cb(WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL);
-                       }
-               break;
-
-               case WS_EVENT_WPS_FAIL:
-                       {
-                               if (event.msg == WPS_ERROR_PASSWORD_MISMATCH) {
-                                       WDP_LOGD("WPS_ERROR_PASSWORD_MISMATCH");
-                                       g_noti_cb(WFD_EVENT_CREATE_LINK_AUTH_FAIL);
-                               }
-                       }
-               break;
-               default:
-               break;
-
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-
-       return true;
-}
-
-unsigned short __convert_category_from_type(char *pri_dev_type)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       char *saveptr = NULL;
-       char *token = NULL;
-
-       if(pri_dev_type == NULL)
-       {
-               WDP_LOGE( "Incorrect parameter\n");
-               return 0;
-       }
-
-       token = strtok_r(pri_dev_type, "-", &saveptr);
-       if(token == NULL)
-       {
-               WDP_LOGD( "Extracting failed\n");
-               return 0;
-       }
-
-       if(!strcmp(token, "255"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_OTHER;
-       else if(!strcmp(token, "11"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_AUDIO;
-       else if(!strcmp(token, "10"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE;
-       else if(!strcmp(token, "9"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_GAME_DEVICE;
-       else if(!strcmp(token, "8"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_MULTIMEDIA_DEVICE;
-       else if(!strcmp(token, "7"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_DISPLAY;
-       else if(!strcmp(token, "6"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_NETWORK_INFRA;
-       else if(!strcmp(token, "5"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_STORAGE;
-       else if(!strcmp(token, "4"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_CAMERA;
-       else if(!strcmp(token, "3"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_PRINTER;
-       else if(!strcmp(token, "2"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_INPUT_DEVICE;
-       else if(!strcmp(token, "1"))
-               return WIFI_DIRECT_PRIMARY_DEVICE_TYPE_COMPUTER;
-       else
-       {
-               WDP_LOGD( "Unknown device type [%s]\n", token);
-               return 0;
-       }
-}
-
-
-int __wpa_ctrl_attach(int sockfd)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[8] = {0};
-       char res_buffer[1024]={0,};
-       int res_buffer_len=sizeof(res_buffer);
-       int result= 0;
-
-       snprintf(cmd, sizeof(cmd), CMD_ATTACH);
-       result = __send_wpa_request(sockfd, cmd, (char*)res_buffer,  res_buffer_len);
-       WDP_LOGE( "__send_wpa_request(ATTACH) result=[%d]\n", result);
-       
-       if (result < 0)
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-
-       __WDP_LOG_FUNC_EXIT__;
-
-       return result;
-}
-
-
-
-
-static char*
-__convert_wps_config_methods_value(wifi_direct_wps_type_e wps_config_methods)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       WDP_LOGD("wps_config_methods [%d]\n", wps_config_methods);
-
-       switch(wps_config_methods)
-       {
-               case WIFI_DIRECT_WPS_TYPE_PBC:
-               {
-                       __WDP_LOG_FUNC_EXIT__;
-                       return "pbc";
-               }
-               break;
-
-               case WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY:
-               {
-                       __WDP_LOG_FUNC_EXIT__;
-                       return "display";
-               }
-               break;
-
-               case WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD:
-               {
-                       __WDP_LOG_FUNC_EXIT__;
-                       return "keypad";
-               }
-               break;
-
-               default :
-               {
-                       WDP_LOGD("Invalid input parameter!\n");
-                       __WDP_LOG_FUNC_EXIT__;
-                       return "";
-               }
-               break;
-
-       }
-}
-
-static unsigned int
-__convert_device_type(char *ptr)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char* p = ptr;
-       int c = 0;
-       char category_type[3] = {0,};
-
-       if (p==NULL)
-       {
-               WDP_LOGE( "ERROR : ptr is NULL!!\n");
-               return 0;
-       }
-
-       c = 0;
-       while(*p != '-')   // take the first number before the first '-' (e.g. 1-0050F204-5)
-       {
-               category_type[c++] = *p++;
-       }
-       category_type[c]='\0';
-
-       WDP_LOGD("category=[%d]\n", atoi(category_type));
-       __WDP_LOG_FUNC_EXIT__;
-
-       return atoi(category_type);
-}
-
-static unsigned int
-__convert_secondary_device_type(char *ptr)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char* p = NULL;
-       int c = 0;
-       char category_type[3] = {0,};
-
-       if (ptr==NULL)
-       {
-               WDP_LOGE( "ERROR : ptr is NULL!!\n");
-               return 0;
-       }
-
-       p = strstr(ptr, WIFI_ALLIANCE_OUI);
-       if (p==NULL)
-       {
-               WDP_LOGE( "ERROR : Unknown OUI, It's vendor specific device type..\n");
-               return 0;
-       }
-       p += strlen(WIFI_ALLIANCE_OUI); // // skip OUI (e.g. 1-0050F204-5)
-       p ++;   // skip the second '-' (e.g. 1-0050F204-5)
-
-       c = 0;
-       while(*p != '\0')
-       {
-               category_type[c++] = *p++;
-       }
-       category_type[c]='\0';
-
-       WDP_LOGD("sub-category [%d]\n", atoi(category_type));
-
-       __WDP_LOG_FUNC_EXIT__;
-
-       return atoi(category_type);
-}
-
-
-int __convert_freq_to_channel(char *freq_kHz)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       int i = 0;
-       int channel = 0;
-
-       while(g_ws_op_channel_info[i].channel != 0)
-       {
-               if (strcmp(g_ws_op_channel_info[i].freq, freq_kHz)==0)
-               {
-                       channel = g_ws_op_channel_info[i].channel;
-                       break;
-               }
-               i++;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return channel;
-}
-
-
-#if 1  // Threadsafe event handling.
-
-void __wfd_oem_callback(wfd_event_t event)
-{
-       // write header parts
-       write(g_oem_pipe[1], &event, sizeof(event));
-}
-
-#else
-
-void __wfd_oem_callback(wfd_event_t event_type)
-{
-       if (g_oem_event_callback != NULL)
-               g_oem_event_callback(event_type);
-}
-
-#endif
-
-int __wfd_ws_reinvoke_persistent_group(int network_id)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[64] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       /* Persistent group mode */
-       snprintf(cmd, sizeof(cmd), "%s %s%d", CMD_CREATE_GROUP, "persistent=", network_id);
-
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD persistent=%d) result=[%d]\n", network_id, result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "Create p2p persistent group... \n");
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-static int __is_zero_addr(unsigned char *addr)
-{
-       if (!addr[0] && !addr[1] && !addr[2] &&
-               !addr[3] && !addr[4] && !addr[5]) {
-               WDP_LOGD("NULL address");
-               return true;
-       }
-       return false;
-}
-
-int wfd_ws_init(wfd_oem_event_cb event_callback)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-#if 1  // Threadsafe event handling
-       if (pipe(g_oem_pipe) < 0) {
-               WDP_LOGD( "pipe error : Error=[%s]\n", strerror(errno));
-               return false;
-       }
-
-       GIOChannel* gio2 = g_io_channel_unix_new(g_oem_pipe[0]);
-       g_io_add_watch(gio2, G_IO_IN, (GIOFunc)__wfd_oem_thread_safe_event_handler_cb, NULL);
-       g_io_channel_unref(gio2);
-#endif
-
-       g_oem_event_callback = event_callback;
-
-       g_noti_cb = __wfd_oem_callback;
-
-       memset(g_incomming_peer_mac_address, 0, sizeof(g_incomming_peer_mac_address));
-       memset(g_incomming_peer_ssid, 0, sizeof(g_incomming_peer_ssid));
-       memset(g_inviting_peer_mac_address, 0, sizeof(g_inviting_peer_mac_address));
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_destroy()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       // Do nothing upto now...
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_activate()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       int result = 0;
-       char cmd[128] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len=sizeof(res_buffer);
-
-       // Loading Driver,  Excuting p2p_supplicant
-       system("/usr/bin/wlan.sh p2p");
-       system("/usr/sbin/p2p_supp.sh start");
-
-       sleep(1);
-       g_global_sockfd = __create_ctrl_intf("p2p_ctrl_global", "/var/run/p2p_global");
-       if(g_global_sockfd < 0)
-       {
-               WDP_LOGE( "Failed to create Global Control interface\n");
-               return false;
-       }
-
-       snprintf(cmd, sizeof(cmd), CMD_INTERFACE);
-       result = __send_wpa_request(g_global_sockfd, cmd, res_buffer,  res_buffer_len);
-       WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
-       if(!strstr(res_buffer, "wlan0"))
-       {
-               memset(cmd, 0x0, 128);
-               memset(res_buffer, 0x0, 1024);
-
-               snprintf(cmd, sizeof(cmd), "%s %s", CMD_INTERFACE_ADD, "wlan0\t/usr/etc/wifi-direct/p2p_suppl.conf\tnl80211\t/var/run/p2p_supplicant");
-               result = __send_wpa_request(g_global_sockfd, cmd, res_buffer,  res_buffer_len);
-               WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
-       }
-       memset(res_buffer, 0x0, 1024);
-
-       // Creating Socket
-       int count = 10;
-       do
-       {
-               sleep(1);
-
-               // Sync Socket
-               g_control_sockfd = __create_ctrl_intf("p2p_ctrl_control", "/var/run/p2p_supplicant/wlan0");
-               if (g_control_sockfd > 0) {
-                       // Async Socket
-                       g_monitor_sockfd = __create_ctrl_intf("p2p_ctrl_monitor", "/var/run/p2p_supplicant/wlan0");
-                       if (g_monitor_sockfd > 0)
-                       {
-                               if (__wpa_ctrl_attach(g_monitor_sockfd) < 0)
-                               {
-                                       WDP_LOGE( "Failed to attach monitor socket! sockfd=[%d]", g_monitor_sockfd);
-                                       system("/usr/sbin/p2p_supp.sh stop");
-                                       system("/usr/bin/wlan.sh stop");
-                                       close(g_global_sockfd);
-                                       g_global_sockfd = -1;
-                                       close(g_control_sockfd);
-                                       g_control_sockfd = -1;
-                                       close(g_monitor_sockfd);
-                                       g_monitor_sockfd = -1;
-                                       return false;
-                               }
-                               break;
-                       } else {
-                               close(g_control_sockfd);
-                               g_control_sockfd = -1;
-                       }
-               } else {
-                       WDP_LOGE( "Failed to attach control socket! sockfd=[%d]", g_control_sockfd);
-               }
-               count--;
-
-               if (count == 0) {
-                       WDP_LOGE( "Failed to create socket !!\n");
-                       system("/usr/sbin/p2p_supp.sh stop");
-                       system("/usr/bin/wlan.sh stop");
-                       close(g_global_sockfd);
-                       g_global_sockfd = -1;
-                       return false;
-               }
-
-       } while (count > 0);
-       WDP_LOGD( "Successfully socket connected to server !!\n");
-
-       GIOChannel *gio3;
-       gio3 = g_io_channel_unix_new(g_monitor_sockfd);
-       g_source_id = g_io_add_watch(gio3, G_IO_IN | G_IO_ERR | G_IO_HUP, (GIOFunc) __ws_event_callback, NULL);
-       g_io_channel_unref(gio3);
-       WDP_LOGD( "Scoket is successfully registered to g_main_loop.\n");
-
-       //wfd_ws_set_oem_loglevel(3);
-
-       /* init miracast */
-       if(wfd_ws_dsp_init() == true)
-               WDP_LOGD( "Success : wfd_ws_dsp_init() \n");
-       else
-               WDP_LOGE( "Failed : wfd_ws_dsp_init()\n");
-
-       __get_persistent_group_clients();
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_deactivate()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[32] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len=sizeof(res_buffer);
-       int result = 0;
-
-       g_wps_event_block = 0;
-       memset(g_inviting_peer_mac_address, 0, sizeof(g_inviting_peer_mac_address));
-
-       // stop p2p_find
-       wfd_ws_cancel_discovery();
-
-       // detach monitor interface
-       snprintf(cmd, sizeof(cmd), CMD_DETACH);
-       result = __send_wpa_request(g_monitor_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_DETACH) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               WDP_LOGE( "DETACH command Fail. result [%d], res_buffer [%s]\n", result, res_buffer);
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       memset(cmd, 0x0, 32);
-       memset(res_buffer, 0x0, 1024);
-
-       // close control interface
-       g_source_remove(g_source_id);
-       unlink("/tmp/wpa_ctrl_monitor");
-       if (g_monitor_sockfd > 2)
-               close(g_monitor_sockfd);
-
-       // terminate wpasupplicant
-       snprintf(cmd, sizeof(cmd), CMD_TERMINATE);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_TERMINATE) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               WDP_LOGE( "DETACH command Fail. result [%d], res_buffer [%s]\n", result, res_buffer);
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       memset(cmd, 0x0, 32);
-       memset(res_buffer, 0x0, 1024);
-
-       unlink("/tmp/wpa_ctrl_control");
-       if (g_control_sockfd > 2)
-               close(g_control_sockfd);
-
-       wfd_ws_glist_reset_connected_peer();
-
-       // wlan.sh stop
-       system("/usr/bin/wlan.sh stop");
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_wps_pbc_start(unsigned char peer_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[40] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       if (wfd_ws_is_groupowner()!=true)
-       {
-               WDP_LOGE( "wps_pbc_start() can be called, only when device is go!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       char tmp_mac[6] = {0,};
-
-       if (peer_addr == NULL) {
-               WDP_LOGD("Peer address is NULL");
-               if (memcmp(g_incomming_peer_mac_address, tmp_mac, 6) == 0) {
-                       WDP_LOGD("Incomming peer [" MACSTR "]", MAC2STR(g_incomming_peer_mac_address));
-                       snprintf(cmd, sizeof(cmd), "%s", CMD_WPS_PUSHBUTTON_START);
-               } else {
-                       WDP_LOGD("Incomming peer [" MACSTR "]", MAC2STR(g_incomming_peer_mac_address));
-                       snprintf(cmd, sizeof(cmd), "%s p2p_dev_addr=" MACSTR "", CMD_WPS_PUSHBUTTON_START, MAC2STR(g_incomming_peer_mac_address));
-               }
-       } else if (memcmp(peer_addr, tmp_mac, 6) != 0){
-               WDP_LOGD("Peer address [" MACSTR "]", MAC2STR(peer_addr));
-               snprintf(cmd, sizeof(cmd), "%s p2p_dev_addr=" MACSTR "", CMD_WPS_PUSHBUTTON_START, MAC2STR(peer_addr));
-       } else {
-               WDP_LOGE("Peer address is incorrent");
-               return false;
-       }
-
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "start WPS PBC...\n");
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_wps_pin_start(unsigned char peer_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[50] = {0, };
-       char mac_str[18] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(mac_str, 18, MACSTR, MAC2STR(peer_addr));
-       snprintf(cmd, sizeof(cmd),"%s %s %s", CMD_WPS_WPS_PIN_START, mac_str, g_wps_pin);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(WPS_PIN) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "start WPS PBC...\n");
-
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_connect(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[64] = {0, };
-       char mac_str[MACSTR_LEN] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       wfd_server_control_t * wfd_server = wfd_server_get_control();
-       WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
-
-       if (wfd_ws_is_groupowner()==true)
-       {
-               snprintf(cmd, sizeof(cmd), CMD_WPS_PUSHBUTTON_START);
-               result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-               WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
-       }
-
-       snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
-       if (wfd_server->current_peer.is_group_owner || !__is_zero_addr(g_inviting_peer_mac_address))
-       {
-               if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD || 
-                       wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
-                       snprintf(cmd, sizeof(cmd),"WPS_ENROLLEE %s %s %s", mac_str, g_wps_pin, __convert_wps_config_methods_value(wps_config));
-               }else {
-                       snprintf(cmd, sizeof(cmd),"WPS_ENROLLEE %s pbc", mac_str);
-               }
-               WDP_LOGD("WPS Enrollee start, because GO is already known");
-               result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-               memset(g_inviting_peer_mac_address, 0, sizeof(g_inviting_peer_mac_address));
-               WDP_LOGD( "__send_wpa_request(WPS_ENROLLEE) result=[%d]\n", result);
-       }
-       else
-       {
-               WDP_LOGD( "MAC ADDR = [%s]\t PIN = [%s]\n",
-                               mac_str, g_wps_pin);
-
-               if (wps_config == WIFI_DIRECT_WPS_TYPE_PBC) {
-                       WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PBC");
-                       snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CONNECT, mac_str, CMD_PBC_STRING);
-               } else if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
-                       WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY");
-                       snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, CMD_DISPLAY_STRING);
-               } else if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
-                       WDP_LOGD("WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD");
-                       snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, CMD_KEYPAD_STRING);
-               } else {
-                       WDP_LOGD( "UNKNOWN CONFIG METHOD\n");
-                       return false;
-               }
-
-               WDP_LOGD( "COMMAND = [%s]\n", cmd);
-
-               result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-               WDP_LOGD( "__send_wpa_request(P2P_CONNECT) result=[%d]\n", result);
-       }
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-int wfd_ws_connect_for_go_neg(unsigned char mac_addr[6],
-               wifi_direct_wps_type_e wps_config)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       char cmd[64] = {0, };
-       char mac_str[MACSTR_LEN] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       WDP_LOGD( "CONNECT REQUEST FOR GO NEGOTIATION");
-       snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
-       snprintf(cmd, sizeof(cmd), "%s %s %s %s", CMD_CONNECT, mac_str, g_wps_pin, __convert_wps_config_methods_value(wps_config));
-
-       if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD ||
-                       wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) {
-               WDP_LOGD( "CONFIG = [%d] \n", wps_config);
-       } else {
-               WDP_LOGE( "Not expected CONFIG METHOD\n");
-               return false;
-       }
-
-       WDP_LOGD( "COMMAND = [%s]****\n", cmd);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer,
-                       res_buffer_len);
-       if (result < 0) {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0)) {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-/* for sending connection request in case Persistent mode enabled */
-int wfd_ws_connect_for_persistent_group(unsigned char mac_addr[6], wifi_direct_wps_type_e wps_config)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[64] = {0, };
-       char mac_str[MACSTR_LEN] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       wfd_server_control_t * wfd_server = wfd_server_get_control();
-       WDP_LOGD( "wfd_server->current_peer.is_group_owner=[%d]\n", wfd_server->current_peer.is_group_owner);
-       WDP_LOGD( "wfd_server->current_peer.is_persistent_go=[%d]\n", wfd_server->current_peer.is_persistent_go);
-
-       int network_id;
-
-       WDP_LOGD( "[persistent mode!!!]\n");
-       snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
-
-       if (wfd_server->current_peer.is_group_owner)    /* join group */
-       {
-               snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
-               snprintf(cmd, sizeof(cmd),"%s %s %s join", CMD_CONNECT, mac_str, __convert_wps_config_methods_value(wps_config));
-               result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-               WDP_LOGD( "__send_wpa_request(CMD_CONNECT join) result=[%d]\n", result);
-       }
-       else /* Creating or reinvoking my persistent group and send invite req. */
-       {
-#if 1
-               /*  First, searching for peer in persistent client list : in case, My device is GO */
-               network_id = __get_network_id_from_persistent_client_list_with_mac(mac_str);
-
-               if (network_id < 0)     /* If peer is not exist in client list, searching for peer in persistnet group GO list : in case, peer is GO */
-                       network_id = __get_network_id_from_network_list_with_go_mac(mac_str);
-
-               if (network_id < 0)     /* If can not find peer anywhere, Create new persistent group */
-               {
-                       if (wfd_ws_create_group(NULL) != true)
-                       {
-                               WDP_LOGE( "wfd_ws_create_group FAILED!!\n");
-                               __WDP_LOG_FUNC_EXIT__;
-                               return false;
-                       }
-
-                       if (wfd_ws_send_invite_request(mac_addr) != true)
-                       {
-                               WDP_LOGE( "wfd_ws_send_invite_request FAILED!!\n");
-                               __WDP_LOG_FUNC_EXIT__;
-                               return false;
-                       }
-               }
-               else    /* Reinvoke persistent group and invite peer */
-               {
-                       if (__send_invite_request_with_network_id(network_id, mac_addr) != true)
-                       {
-                               WDP_LOGE( "__send_invite_request_with_network_id FAILED!!\n");
-                               __WDP_LOG_FUNC_EXIT__;
-                               return false;
-                       }
-
-                       if (__wfd_ws_reinvoke_persistent_group(network_id) != true)
-                       {
-                               WDP_LOGE( "__wfd_ws_reinvoke_persistent_group FAILED!!\n");
-                               __WDP_LOG_FUNC_EXIT__;
-                               return false;
-                       }
-               }
-#else
-               int persistent_group_count = 0;
-               wfd_persistent_group_info_s* plist;
-               int i;
-
-               result = wfd_ws_get_persistent_group_info(&plist, &persistent_group_count);
-               if (result == true)
-               {
-                       /* checking already created persistent group list */
-                       for(i=0; i<persistent_group_count; i++)
-                       {
-                               WDP_LOGD( "plist[%d].go_mac_address=[%s]\n", i,plist[i].go_mac_address);
-                               if (strcmp(plist[i].go_mac_address, mac_str) == 0)
-                               {
-                                       WDP_LOGD( "Found peer in persistent group list [network id : %d]\n", plist[i].network_id);
-                                       snprintf(cmd, sizeof(cmd), "%s persistent=%d", CMD_CREATE_GROUP, plist[i].network_id);
-                                       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-                                       WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD persistent=%d) result=[%d]\n", plist[i].network_id, result);
-                                       break;
-                               }
-                       }
-
-                       if (i == persistent_group_count)        /* Can't find peer in persistent group list. Creation of new persistent group */
-                       {
-                               /* Persistent group mode */
-                               snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CREATE_GROUP, "persistent", FREQUENCY_2G);
-                               result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-                               WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD) result=[%d]\n", result);
-
-                               if (result < 0)
-                               {
-                                       WDP_LOGE( "__send_wpa_request FAILED!!\n");
-                                       __WDP_LOG_FUNC_EXIT__;
-                                       return false;
-                               }
-
-                               if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-                               {
-                                       __WDP_LOG_FUNC_EXIT__;
-                                       return false;
-                               }
-
-                               wfd_ws_send_invite_request(mac_addr);
-
-                       }
-               }
-               else
-               {
-                       WDP_LOGE( "Error!! wfd_ws_get_persistent_group_info() failed..\n");
-                       __WDP_LOG_FUNC_EXIT__;
-                       return false;
-               }
-#endif
-
-       }
-
-       WDP_LOGD( "Connecting... peer-MAC [%s]\n", mac_str);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_disconnect()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       char cmd[32] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       g_wps_event_block = 0;
-
-       snprintf(cmd, sizeof(cmd), "%s %s", CMD_GROUP_REMOVE, DEFAULT_IF_NAME);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_GROUP_REMOVE) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "disconnect... remove group [%s]\n", DEFAULT_IF_NAME);
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-// TODO: should find how to disconnect with peer by peer_mac
-int wfd_ws_disconnect_sta(unsigned char mac_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-       int result;
-
-       result = wfd_ws_disconnect();
-
-       __WDP_LOG_FUNC_EXIT__;
-       return result;
-}
-
-int wfd_ws_reject_connection(unsigned char mac_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-       char cmd[32] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       g_wps_event_block = 0;
-
-       snprintf(cmd, sizeof(cmd), "%s " MACSTR, CMD_REJECT, MAC2STR(mac_addr));
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD("__send_wpa_request(P2P_REJECT) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE("__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD("reject connection attempt by peer [" MACSTR "]", MAC2STR(mac_addr));
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-bool wfd_ws_cancel()
-{
-        __WDP_LOG_FUNC_ENTER__;
-        char cmd[16] = {0, };
-        char res_buffer[1024]={0,};
-        int res_buffer_len=sizeof(res_buffer);
-        int result = 0;
-
-        snprintf(cmd, sizeof(cmd), CMD_CANCEL);
-        result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-        WDP_LOGD("__send_wpa_request(CMD_CANCEL) result=[%d]\n", result);
-
-        if (result < 0)
-        {
-                WDP_LOGE("__send_wpa_request FAILED!!\n");
-                __WDP_LOG_FUNC_EXIT__;
-                return false;
-        }
-
-        if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-        {
-                __WDP_LOG_FUNC_EXIT__;
-                return false;
-        }
-
-        __WDP_LOG_FUNC_EXIT__;
-        return true;
-}
-
-bool wfd_ws_is_discovery_enabled()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       __WDP_LOG_FUNC_EXIT__;
-       return false;
-}
-
-bool wfd_ws_flush()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len=sizeof(res_buffer);
-       int result = 0;
-
-       g_wps_event_block = 0;
-
-       // Skip checking result..
-       snprintf(cmd, sizeof(cmd), CMD_FLUSH);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_FLUSH) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-
-int wfd_ws_start_discovery(bool listen_only, int timeout)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len=sizeof(res_buffer);
-       int result = 0;
-
-       if (listen_only == true)
-       {
-               if (timeout > 0)
-                       snprintf(cmd, sizeof(cmd), CMD_START_LISTEN " %d", timeout);
-               else
-                       snprintf(cmd, sizeof(cmd), CMD_START_LISTEN);
-
-                       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-                       WDP_LOGD( "__send_wpa_request(P2P_LISTEN) result=[%d]\n", result);
-       }
-       else
-       {
-               wfd_ws_flush();
-
-               snprintf(cmd, sizeof(cmd), CMD_START_DISCOVER);
-               result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-               WDP_LOGD( "__send_wpa_request(P2P_FIND) result=[%d]\n", result);
-       }
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       // to notify to the application.
-       if (listen_only == true)
-               g_noti_cb(WFD_EVENT_DISCOVER_START_LISTEN_ONLY);
-       else
-               g_noti_cb(WFD_EVENT_DISCOVER_START_80211_SCAN);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_restart_discovery()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len=sizeof(res_buffer);
-       int result = 0;
-
-       snprintf(cmd, sizeof(cmd), CMD_START_DISCOVER);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_FIND) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_cancel_discovery()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len=sizeof(res_buffer);
-       int result = 0;
-
-       snprintf(cmd, sizeof(cmd), CMD_CANCEL_DISCOVER);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_STOP_FIND) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       // to notify to the application.
-       g_noti_cb(WFD_EVENT_DISCOVER_CANCEL);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_get_discovery_result(wfd_discovery_entry_s ** peer_list, int* peer_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       
-       char cmd[40] = {0, };
-       char mac_str[MACSTR_LEN] = {0, };
-       char res_buffer[1024] = {0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result = 0;
-       int peer_count = 0;
-       int i;
-       ws_discovered_peer_info_s ws_peer_list[MAX_PEER_NUM];
-       static wfd_discovery_entry_s wfd_peer_list[16];
-
-       memset(&ws_peer_list, 0, (sizeof(ws_discovered_peer_info_s)*MAX_PEER_NUM));
-       memset(&wfd_peer_list, 0, (sizeof(wfd_discovery_entry_s)*16));
-       
-       /* Reading first discovered peer */
-       snprintf(cmd, sizeof(cmd), CMD_GET_FIRST_DISCOVERED_PEER);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_PEER FIRST) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               *peer_num = 0;
-               *peer_list = NULL;
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))    /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
-       {
-               *peer_num = 0;
-               *peer_list = NULL;
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __parsing_peer(res_buffer, &ws_peer_list[peer_count]);
-       peer_count++;
-
-       /* Reading Next discovered peers */
-       do
-       {
-               memset(cmd, 0x0, 40);
-               memset(mac_str, 0x0, MACSTR_LEN);
-               memset(res_buffer, 0, sizeof(res_buffer));
-
-               strncpy(mac_str, ws_peer_list[peer_count-1].mac, MACSTR_LEN);
-               mac_str[MACSTR_LEN-1] = '\0';
-               snprintf(cmd, sizeof(cmd), "%s%s", CMD_GET_NEXT_DISCOVERED_PEER, mac_str);
-               result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-               WDP_LOGD( "__send_wpa_request(P2P_PEER NEXT-) result=[%d]\n", result);
-
-               if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))    /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
-                       break;
-
-               __parsing_peer(res_buffer, &ws_peer_list[peer_count]);
-               peer_count++;
-
-       } while(peer_count < MAX_PEER_NUM);
-
-       WDP_LOGD( "number of discovered peers: %d\n", peer_count);
-
-       for(i=0; i<peer_count; i++)
-       {
-               memset(&wfd_peer_list[i], 0, sizeof(wfd_discovery_entry_s));
-               WDP_LOGD( "index [%d] MAC [%s] GOstate=[%s] groupCapab=[%x] devCapab=[%x] is_wfd_device[%d] Name[%s] type=[%s] ssid[%s]\n",
-                               i,
-                               ws_peer_list[i].mac,
-                               ws_peer_list[i].go_state,
-                               ws_peer_list[i].group_capab,
-                               ws_peer_list[i].dev_capab,
-                               ws_peer_list[i].is_wfd_device,
-                               ws_peer_list[i].device_name,
-                               ws_peer_list[i].pri_dev_type,
-                               ws_peer_list[i].oper_ssid);
-/*
-               typedef struct
-               {
-                       bool is_group_owner;
-                       char ssid[WIFI_DIRECT_MAX_SSID_LEN + 1];
-                       unsigned char mac_address[6];
-                       int channel;
-                       bool is_connected;
-                       unsigned int services;
-                       bool is_persistent_go;
-                       unsigned char intf_mac_address[6];
-                       unsigned int wps_device_pwd_id;
-                       unsigned int wps_cfg_methods;
-                       unsigned int category;
-                       unsigned int subcategory;
-               } wfd_discovery_entry_s;
-*/
-               // Device MAC address
-               unsigned char la_mac_addr[6];
-               memset(la_mac_addr, 0x0, sizeof(la_mac_addr));
-               wfd_macaddr_atoe(ws_peer_list[i].mac, la_mac_addr);
-               memcpy(wfd_peer_list[i].mac_address, (char*)(la_mac_addr), sizeof(la_mac_addr));
-
-               // Interface MAC address
-               memset(la_mac_addr, 0x0, sizeof(la_mac_addr));
-               wfd_macaddr_atoe(ws_peer_list[i].interface_addr, la_mac_addr);
-               memcpy(wfd_peer_list[i].intf_mac_address, (char*)(la_mac_addr), sizeof(la_mac_addr));
-
-               // WPS Config method
-               wfd_peer_list[i].wps_cfg_methods = 0;
-               if ((ws_peer_list[i].config_methods & WPS_CONFIG_DISPLAY) > 0)
-                       wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
-               if ((ws_peer_list[i].config_methods & WPS_CONFIG_PUSHBUTTON) > 0)
-                       wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PBC;
-               if ((ws_peer_list[i].config_methods & WPS_CONFIG_KEYPAD) > 0)
-                       wfd_peer_list[i].wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
-
-               // Device name --> SSID
-               strncpy(wfd_peer_list[i].device_name, ws_peer_list[i].device_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
-               wfd_peer_list[i].device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = '\0';
-
-               // is_group_owner
-               if ((ws_peer_list[i].group_capab & GROUP_CAPAB_GROUP_OWNER) > 0)  /* checking GO state */
-                       wfd_peer_list[i].is_group_owner = true;
-               else
-                       wfd_peer_list[i].is_group_owner = false;
-
-               WDP_LOGD( "GroupOwnerCapab: %x & %x = %d\n", ws_peer_list[i].group_capab, GROUP_CAPAB_GROUP_OWNER, (ws_peer_list[i].group_capab & GROUP_CAPAB_GROUP_OWNER));
-
-               // is_persistent_go
-               if ((ws_peer_list[i].group_capab & GROUP_CAPAB_PERSISTENT_GROUP) > 0)  /* checking persistent GO state */
-                       wfd_peer_list[i].is_persistent_go = true;
-               else
-                       wfd_peer_list[i].is_persistent_go = false;
-
-               // is_connected
-               if (strncmp(ws_peer_list[i].member_in_go_dev, "00:00:00:00:00:00", strlen("00:00:00:00:00:00"))!=0)
-                       wfd_peer_list[i].is_connected = true;
-               else
-                       wfd_peer_list[i].is_connected = false;
-
-               // Listen channel
-               // ToDo: convert freq to channel...
-               wfd_peer_list[i].channel = ws_peer_list[i].listen_freq;
-
-               // wps_device_pwd_id
-               // ToDo: where to get it?
-               wfd_peer_list[i].wps_device_pwd_id = 0;
-
-               wfd_peer_list[i].category = __convert_device_type(ws_peer_list[i].pri_dev_type);
-               wfd_peer_list[i].subcategory = __convert_secondary_device_type(ws_peer_list[i].pri_dev_type);
-       }
-
-       *peer_num = peer_count;
-       *peer_list = &wfd_peer_list[0];
-
-       WDP_LOGE( "Getting discovery result is Completed.\n");
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-
-}
-
-int wfd_ws_get_peer_info(unsigned char *mac_addr, wfd_discovery_entry_s **peer)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[32] = {0, };
-       char mac_str[MACSTR_LEN] = {0, };
-       char res_buffer[1024] = {0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result = 0;
-       ws_discovered_peer_info_s ws_peer_info;
-       wfd_discovery_entry_s* wfd_peer_info;
-
-       /* Reading first discovered peer */
-       snprintf(mac_str, 18, MACSTR, MAC2STR(mac_addr));
-       snprintf(cmd, sizeof(cmd),"%s %s", CMD_GET_PEER_INFO, mac_str);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_PEER) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               *peer = NULL;
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))    /* p2p_supplicant returns the 'FAIL' if there is no discovered peer. */
-       {
-               *peer = NULL;
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       memset(&ws_peer_info, 0x0, sizeof(ws_discovered_peer_info_s));
-       wfd_peer_info = (wfd_discovery_entry_s *) calloc(1, sizeof(wfd_discovery_entry_s));
-
-       // TODO: parsing peer info
-       __parsing_peer(res_buffer, &ws_peer_info);
-
-       WDP_LOGD( "MAC [%s] GOstate=[%s] groupCapab=[%x] devCapab=[%x] Name[%s] type=[%s] ssid[%s]\n",
-                       ws_peer_info.mac,
-                       ws_peer_info.go_state,
-                       ws_peer_info.group_capab,
-                       ws_peer_info.dev_capab,
-                       ws_peer_info.device_name,
-                       ws_peer_info.pri_dev_type,
-                       ws_peer_info.oper_ssid);
-
-       // Device MAC address
-       unsigned char la_mac_addr[6];
-       memset(la_mac_addr, 0x0, sizeof(la_mac_addr));
-       wfd_macaddr_atoe(ws_peer_info.mac, la_mac_addr);
-       memcpy(wfd_peer_info->mac_address, (char*)(la_mac_addr), sizeof(la_mac_addr));
-
-       // Interface MAC address
-       memset(la_mac_addr, 0x0, sizeof(la_mac_addr));
-       wfd_macaddr_atoe(ws_peer_info.interface_addr, la_mac_addr);
-       memcpy(wfd_peer_info->intf_mac_address, (char*)(la_mac_addr), sizeof(la_mac_addr));
-
-       // WPS Config method
-       wfd_peer_info->wps_cfg_methods = 0;
-       if ((ws_peer_info.config_methods & WPS_CONFIG_DISPLAY) > 0)
-               wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;
-       if ((ws_peer_info.config_methods & WPS_CONFIG_PUSHBUTTON) > 0)
-               wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PBC;
-       if ((ws_peer_info.config_methods & WPS_CONFIG_KEYPAD) > 0)
-               wfd_peer_info->wps_cfg_methods += WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
-
-       // Device name --> SSID
-       strncpy(wfd_peer_info->device_name, ws_peer_info.device_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
-       wfd_peer_info->device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = '\0';
-
-       // is_group_owner
-       if ((ws_peer_info.group_capab & GROUP_CAPAB_GROUP_OWNER) > 0)  /* checking GO state */
-               wfd_peer_info->is_group_owner = true;
-       else
-               wfd_peer_info->is_group_owner = false;
-
-       WDP_LOGD( "GroupOwnerCapab: %x & %x = %d\n", ws_peer_info.group_capab, GROUP_CAPAB_GROUP_OWNER, (ws_peer_info.group_capab & GROUP_CAPAB_GROUP_OWNER));
-
-       // is_persistent_go
-       if ((ws_peer_info.group_capab & GROUP_CAPAB_PERSISTENT_GROUP) > 0)  /* checking persistent GO state */
-               wfd_peer_info->is_persistent_go = true;
-       else
-               wfd_peer_info->is_persistent_go = false;
-
-       // is_connected
-       if (strncmp(ws_peer_info.member_in_go_dev, "00:00:00:00:00:00", strlen("00:00:00:00:00:00"))!=0)
-               wfd_peer_info->is_connected = true;
-       else
-               wfd_peer_info->is_connected = false;
-
-       // Listen channel
-       // ToDo: convert freq to channel...
-       wfd_peer_info->channel = ws_peer_info.listen_freq;
-
-       // wps_device_pwd_id
-       // ToDo: where to get it?
-       wfd_peer_info->wps_device_pwd_id = 0;
-
-       wfd_peer_info->category = __convert_device_type(ws_peer_info.pri_dev_type);
-       wfd_peer_info->subcategory = __convert_secondary_device_type(ws_peer_info.pri_dev_type);
-
-       *peer = wfd_peer_info;
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_send_provision_discovery_request(unsigned char mac_addr[6], wifi_direct_wps_type_e config_method, int is_peer_go)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[64] = {0, };
-       char mac_str[MACSTR_LEN] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       WDP_LOGD("Outgoing PROV_DISC");
-
-       snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
-       snprintf(cmd, sizeof(cmd),"%s %s %s", CMD_SEND_PROVISION_DISCOVERY_REQ, mac_str, __convert_wps_config_methods_value(config_method));
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_PROV_DISC) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "Provisioning... peer-MAC [%s]\n", mac_str);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-bool wfd_ws_get_go_dev_addr(char* p2p_device_address)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       if (p2p_device_address == NULL)
-       {
-               WDP_LOGE( "Wrong param\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       snprintf(cmd, sizeof(cmd), CMD_STATUS_P2P);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       char* ptr = strstr(res_buffer, "p2p_device_address=");
-       if (ptr==NULL)
-       {
-           WDP_LOGD( "Can't find p2p_device_address...\n");
-           __WDP_LOG_FUNC_EXIT__;
-           return false;
-       }
-
-       char item[32];
-       char value[MACSTR_LEN];
-
-       if (__get_item_value(ptr, item, value) == NULL)
-       {
-           WDP_LOGD( "Can't wrong format to get p2p_device_address...\n");
-           __WDP_LOG_FUNC_EXIT__;
-           return false;
-       }
-
-       if (strcmp(item, "p2p_device_address")!=0)
-       {
-           WDP_LOGD( "Can't get p2p_device_address.... item=[%s]\n", item);
-           __WDP_LOG_FUNC_EXIT__;
-           return false;
-       }
-
-       snprintf(p2p_device_address, MACSTR_LEN, "%s", value);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_send_invite_request(unsigned char dev_mac_addr[6])
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[128] = {0, };
-       char mac_str[MACSTR_LEN] = {0, };
-       char res_buffer[1024]={0,};
-       char p2p_device_address[MACSTR_LEN];
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       /* invite request sometimes failed in listen only mode */
-       wfd_server_control_t * wfd_server = wfd_server_get_control();
-
-       if(wfd_ws_get_go_dev_addr(p2p_device_address) == false)
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(dev_mac_addr));
-       snprintf(cmd, sizeof(cmd), "%s group=p2p-wlan0-0 peer=%s go_dev_addr=%s", CMD_SEND_INVITE_REQ, mac_str, p2p_device_address);
-
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGI( "__send_wpa_request(CMD_SEND_INVITE_REQ) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "Invite... peer-MAC [%s]\n", mac_str);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-int wfd_ws_create_group(char* ssid)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[64] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-       wfd_server_control_t * wfd_server = wfd_server_get_control();
-
-       if (wfd_server->config_data.want_persistent_group)
-       {
-               /* Persistent group mode */
-               snprintf(cmd, sizeof(cmd), "%s %s %s", CMD_CREATE_GROUP, "persistent", FREQUENCY_2G);
-       }
-       else
-       {
-               snprintf(cmd, sizeof(cmd), "%s %s", CMD_CREATE_GROUP, FREQUENCY_2G);
-       }
-
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_GROUP_ADD) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "Create p2p group... \n");
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_cancel_group()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[30] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(cmd, sizeof(cmd), "%s %s", CMD_GROUP_REMOVE, DEFAULT_IF_NAME);
-       
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(P2P_GROUP_REMOVE) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "Remove p2p group... \n");
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_activate_pushbutton()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[8] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(cmd, sizeof(cmd), CMD_WPS_PUSHBUTTON_START);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(WPS_PBC) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "start WPS PBC...\n");
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
- }
-
-bool wfd_ws_is_groupowner()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(cmd, sizeof(cmd), CMD_STATUS_P2P);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if(strstr(res_buffer, "mode=P2P GO") == NULL)
-       {
-           WDP_LOGD( "This device is not Groupowner\n");
-           __WDP_LOG_FUNC_EXIT__;
-           return false;
-       }
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-bool wfd_ws_is_groupclient()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(cmd, sizeof(cmd), CMD_STATUS_P2P);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if(strstr(res_buffer, "mode=station") == NULL)
-       {
-           WDP_LOGD( "This device is not client\n");
-           __WDP_LOG_FUNC_EXIT__;
-           return false;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_get_ssid(char* ssid, int len)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[12] = {0, };
-       char tmp_ssid[64] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       if(ssid == NULL)
-       {
-               WDP_LOGE( "Incorrect parameter");
-               return -1;
-       }
-
-       snprintf(cmd, sizeof(cmd), CMD_STATUS_P2P);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(STATUS) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       result = __extract_value_str(res_buffer, "\nssid", (char*) tmp_ssid);
-       if(result <= 0)
-       {
-               WDP_LOGE( "Extracting value failed\n");
-               return -1;
-       }
-       WDP_LOGD( "######    ssid [%s]         ###########\n", tmp_ssid);
-       memcpy(ssid, tmp_ssid, len);
-       ssid[len] = '\0';
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-char* wfd_ws_get_default_interface_name()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       __WDP_LOG_FUNC_EXIT__;
-       
-       return DEFAULT_IF_NAME;
-}
-
-bool wfd_ws_dhcpc_get_ip_address(char *ipaddr_buf, int len, int is_IPv6)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       struct ifreq IfRequest;
-       struct sockaddr_in* sin = NULL;
-       int fd;
-
-       if (ipaddr_buf == NULL)
-               return false;
-
-       fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
-       if(fd < 3) {
-               WDP_LOGE( "Failed to open socket\n");
-               return false;
-       }
-
-       memset(IfRequest.ifr_name, 0x00, DEFAULT_IF_NAME_LEN);
-       strncpy(IfRequest.ifr_name, DEFAULT_IF_NAME, DEFAULT_IF_NAME_LEN-1);
-       IfRequest.ifr_name[DEFAULT_IF_NAME_LEN-1] = '\0';
-
-       if(ioctl(fd, SIOCGIFADDR, &IfRequest) < 0) {
-               WDP_LOGE( "Failed to get IP\n");
-               if (fd > 2)
-                       close(fd);
-               return false;
-       }
-
-       sin = (struct sockaddr_in*) &IfRequest.ifr_broadaddr;
-       if (ipaddr_buf != NULL) {
-               strncpy(ipaddr_buf, (char*) inet_ntoa(sin->sin_addr), len);
-               ipaddr_buf[len-1] = '\0';
-       }
-
-       if (fd > 2)
-               close(fd);
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-char* wfd_ws_get_ip()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char *ip_string = NULL;
-
-       ip_string = (char*) calloc(1, 20);
-       if (!ip_string) {
-               WDP_LOGE("Failed to allocate memory for IP string");
-               return NULL;
-       }
-
-       snprintf(ip_string, 20, "%s", g_local_interface_ip_address);
-       WDP_LOGD( "################################################\n");
-       WDP_LOGD( "######    IP = %s         ###########\n", ip_string);
-       WDP_LOGD( "################################################\n");
-
-       __WDP_LOG_FUNC_EXIT__;
-       return ip_string;
-}
-
-int wfd_ws_set_wps_pin(char* pin)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       if (pin != NULL) {
-               strncpy(g_wps_pin, pin, WPS_PIN_LEN);
-               g_wps_pin[WPS_PIN_LEN-1] = '\0';
-               WDP_LOGD( "SETTING WPS PIN = %s\n", \
-                               g_wps_pin);
-       } else {
-               return false;
-       }
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
- }
-
-int wfd_ws_get_wps_pin(char* wps_pin, int len)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       if (wps_pin == NULL) {
-               return false;
-       }
-       strncpy(wps_pin, g_wps_pin, WPS_PIN_LEN);
-       wps_pin[WPS_PIN_LEN-1] = '\0';
-       WDP_LOGD( "FILLED WPS PIN = %s\n", wps_pin);
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_generate_wps_pin()
-{
-       __WDP_LOG_FUNC_ENTER__;
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-
-}
-
-
-int wfd_ws_set_ssid(char* ssid)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[128] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       if (ssid == NULL || strlen(ssid) == 0)
-       {
-               WDP_LOGE( "Wrong SSID\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       snprintf(cmd, sizeof(cmd), "%s device_name %s", CMD_SET_PARAM, ssid);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       memset(cmd, 0x0, 128);
-       memset(res_buffer, 0x0, 1024);
-
-       snprintf(cmd, sizeof(cmd), "%s p2p_ssid_postfix %s", CMD_SET_PARAM, ssid);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_set_wpa_passphrase(char* wpa_key)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_get_supported_wps_mode()
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       int wps_config;
-
-       //TO-DO : supplicant CLI command should be supported.
-
-       wps_config = WIFI_DIRECT_WPS_TYPE_PBC |WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY |WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;
-
-       return wps_config;
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_get_connected_peers_count(int* peer_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       GList *element = NULL;
-
-       *peer_num = 0;
-       element = g_list_first(g_conn_peer_addr);
-       while(element)
-       {
-               (*peer_num)++;
-               element = g_list_next(element);
-       }
-       WDP_LOGD( "Connected peer number [%d]\n", *peer_num);
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-int wfd_ws_get_connected_peers_info(wfd_connected_peer_info_s ** peer_list, int* peer_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       int i = 0;
-       char cmd[32] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       char pri_dev_type[16] ={0, };
-       GList *element = NULL;
-       int result;
-
-       if(peer_list == NULL || peer_num == NULL)
-       {
-               WDP_LOGD( "Incorrect parameter\n");
-               return false;
-       }
-
-       wfd_ws_get_connected_peers_count(peer_num);
-
-       wfd_connected_peer_info_s *tmp_peer_list = NULL;
-
-       tmp_peer_list = (wfd_connected_peer_info_s*) calloc(*peer_num, sizeof(wfd_connected_peer_info_s));
-       if(tmp_peer_list == NULL)
-       {
-               WDP_LOGD( "Memory allocatin failed\n");
-               *peer_list = NULL;
-               *peer_num = 0;
-
-               return false;
-       }
-
-       element = g_list_first(g_conn_peer_addr);
-       while(element)
-       {
-               WDP_LOGD( "element data is [%s]\n", (char*) element->data);
-               memset(cmd, 0x0, 32);
-               memset(res_buffer, 0x0, 1024);
-
-               snprintf(cmd, sizeof(cmd), "%s %s", CMD_GET_PEER_INFO, (char*) element->data);
-               result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-               WDP_LOGD( "__send_wpa_request(%s) result=[%d]\n", cmd, result);
-
-               if (result < 0)
-               {
-                       WDP_LOGE( "__send_wpa_request FAILED!!\n");
-                       *peer_list = NULL;
-                       *peer_num = 0;
-                       if (tmp_peer_list != NULL)
-                               free(tmp_peer_list);
-
-                       __WDP_LOG_FUNC_EXIT__;
-                       return false;
-               }
-
-               if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-               {
-                       *peer_list = NULL;
-                       *peer_num = 0;
-                       if (tmp_peer_list != NULL)
-                               free(tmp_peer_list);
-
-                       __WDP_LOG_FUNC_EXIT__;
-                       return false;
-               }
-
-               /*
-                       typedef struct
-                       {
-                               char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN + 1];
-                               unsigned char ip_address[4];
-                               unsigned char mac_address[6];
-                               unsigned char intf_mac_address[6];
-                               unsigned int services;
-                               bool is_p2p;
-                               unsigned short category;
-                               int channel;
-                       } wfd_connected_peer_info_s;
-                */
-
-               result = __extract_value_str(res_buffer, "device_name", (char*) tmp_peer_list[i].device_name);
-               if(result <= 0) {
-                       WDP_LOGE( "Extracting value failed\n");
-                       *peer_list = NULL;
-                       *peer_num = 0;
-                       if (tmp_peer_list != NULL)
-                               free(tmp_peer_list);
-
-                       return false;
-               }
-
-               wfd_macaddr_atoe((char*) element->data, tmp_peer_list[i].mac_address);
-
-               char intf_mac_address[MACSTR_LEN] = {0, };
-               result = __extract_value_str(res_buffer, "interface_addr", (char*) intf_mac_address);
-               if(result <= 0)
-               {
-                       WDP_LOGE( "Extracting value failed\n");
-                       *peer_list = NULL;
-                       *peer_num = 0;
-                       if (tmp_peer_list != NULL)
-                               free(tmp_peer_list);
-
-                       return false;
-               }
-               wfd_macaddr_atoe((char*) intf_mac_address, tmp_peer_list[i].intf_mac_address);
-
-               tmp_peer_list[i].services = 0;
-               tmp_peer_list[i].is_p2p = true;
-
-               result = __extract_value_str(res_buffer, "pri_dev_type", (char*) pri_dev_type);
-               if(result <= 0)
-               {
-                       WDP_LOGE( "Extracting value failed\n");
-                       *peer_list = NULL;
-                       *peer_num = 0;
-                       if (tmp_peer_list != NULL)
-                               free(tmp_peer_list);
-
-                       return false;
-               }
-
-               tmp_peer_list[i].category = __convert_category_from_type(pri_dev_type);
-               if(tmp_peer_list[i].category == 0)
-               {
-                       WDP_LOGE( "Category converting error\n");
-                       *peer_list = NULL;
-                       *peer_num = 0;
-                       if (tmp_peer_list != NULL)
-                               free(tmp_peer_list);
-
-                       return false;
-               }
-
-               element = g_list_next(element);
-               i++;
-       }
-
-       *peer_list = tmp_peer_list;
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-int wfd_ws_get_go_intent(int *p2p_go_intent)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[32] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       if (p2p_go_intent == NULL)
-       {
-               WDP_LOGE( "p2p_go_intent is NULL\n", p2p_go_intent);
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       snprintf(cmd, sizeof(cmd), "%s p2p_go_intent", CMD_GET_PARAM);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(GET P2P_GO_INTENT) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       *p2p_go_intent = atoi(res_buffer);
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_set_go_intent(int go_intent)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[32] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       if (go_intent < 0 || go_intent > 15)
-       {
-               WDP_LOGE( "Wrong p2p_go_intent [%d]\n", go_intent);
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       snprintf(cmd, sizeof(cmd), "%s p2p_go_intent %d", CMD_SET_PARAM, go_intent);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-int wfd_ws_set_device_type(wifi_direct_primary_device_type_e primary_cat, wifi_direct_secondary_device_type_e sub_cat)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[32] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(cmd, sizeof(cmd), "%s device_type %d", CMD_SET_PARAM, primary_cat);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       memset(cmd, 0x0, 32);
-       memset(res_buffer, 0x0, 1024);
-
-       snprintf(cmd, sizeof(cmd), "%s device_type %d", CMD_SET_PARAM, sub_cat);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_SET_PARAM) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-int wfd_ws_get_device_mac_address(unsigned char* device_mac)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[8] = {0, };
-       char device_address[MACSTR_LEN] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(cmd, sizeof(cmd), CMD_STATUS);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(STATUS) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       __extract_value_str(res_buffer, "p2p_device_address", (char*) device_address);
-       if(strlen(device_address) ==18)
-       {
-               wfd_macaddr_atoe((char*) device_address, device_mac);
-       }
-       else
-       {
-               WDP_LOGE( "Extracting value failed\n");
-               return -1;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-int wfd_ws_set_oem_loglevel(int is_increase)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-       snprintf(cmd, sizeof(cmd), "%s %d", CMD_LOG_LEVEL, is_increase);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer,  res_buffer_len);
-       WDP_LOGE( "__send_wpa_request(LOG_LEVEL) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_get_assoc_sta_mac(unsigned char *mac_addr)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       memcpy(mac_addr, g_assoc_sta_mac, 6);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_get_disassoc_sta_mac(unsigned char *mac_addr)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       memcpy(mac_addr, g_disassoc_sta_mac, 6);
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_get_requestor_mac(unsigned char* mac_addr)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       memcpy(mac_addr, g_incomming_peer_mac_address, 6);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_get_operating_channel(void)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[16] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-       char item[32] = {0, };
-       char freq_value[32] = {0,};
-       int channel;
-
-
-       snprintf(cmd, sizeof(cmd), CMD_STATUS_P2P);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(STATUS P2P) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       char* ptr = strstr(res_buffer, "frequency=");
-       if (ptr==NULL)
-       {
-               WDP_LOGD( "Can't find frequency field...\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if (__get_item_value(ptr, item, freq_value) == NULL)
-       {
-               WDP_LOGD( "Can't get value of frequency...\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if (strcmp(item, "frequency")!=0)
-       {
-               WDP_LOGD( "Can't get frequency.... item=[%s]\n", item);
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       WDP_LOGD( "freq_value=[%s]\n", freq_value);
-
-       channel = __convert_freq_to_channel(freq_value);
-
-       WDP_LOGD( "channel=[%d]\n", channel);
-
-       __WDP_LOG_FUNC_EXIT__;
-       return channel;
-
-}
-
-
-/* -------------------- Miracast ---------------------------*/
-
-
-int wfd_ws_dsp_init(void)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[32] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       int enable = 1;
-       char* dev_info = "0400";
-       int ctrl_port = 2022;
-       int max_tput = 40;
-       char* cpled_sink_status = "00";
-
-       /* param : enable*/
-       snprintf(cmd, sizeof(cmd), "%s enable %d", CMD_WFD_SET, enable);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED[param : enable]!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       /* param : dev_info */
-       memset(cmd, 0x0, 32);
-       memset(res_buffer, 0x0, 1024);
-
-       snprintf(cmd, sizeof(cmd), "%s dev_info %s", CMD_WFD_SET, dev_info);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED[param : dev_info]!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       /* param : ctrl_port */
-       memset(cmd, 0x0, 32);
-       memset(res_buffer, 0x0, 1024);
-
-       snprintf(cmd, sizeof(cmd), "%s ctrl_port %d", CMD_WFD_SET, ctrl_port);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED[param : ctrl_port]!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       /* param : max_tput */
-       memset(cmd, 0x0, 32);
-       memset(res_buffer, 0x0, 1024);
-
-       snprintf(cmd, sizeof(cmd), "%s max_tput %d", CMD_WFD_SET, max_tput);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED[param : max_tput]!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       /* param : cpled_sink_status */
-       memset(cmd, 0x0, 32);
-       memset(res_buffer, 0x0, 1024);
-
-       snprintf(cmd, sizeof(cmd), "%s cpled_sink_status %s", CMD_WFD_SET, cpled_sink_status);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(CMD_WFD_SET) result=[%d]\n", result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED[param : cpled_sink_status]!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-
-int wfd_ws_get_persistent_group_info(wfd_persistent_group_info_s **persistent_group_list, int *persistent_group_num)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       
-       char cmd[16] = {0, };
-       char res_buffer[1024] = {0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result = 0;
-       int i;
-       ws_network_info_s ws_persistent_group_list[MAX_PERSISTENT_GROUP_NUM];
-       wfd_persistent_group_info_s *wfd_persistent_group_list = NULL;
-
-       memset(ws_persistent_group_list, 0, (sizeof(ws_network_info_s)*MAX_PERSISTENT_GROUP_NUM));
-
-       /* Reading lists the configured networks, including stored information for persistent groups. 
-       The identifier in this is used with p2p_group_add and p2p_invite to indicate witch persistent
-       group is to be reinvoked. */
-       snprintf(cmd, sizeof(cmd), CMD_GET_LIST_NETWORKS);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(LIST_NETWORKS) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               *persistent_group_num = 0;
-               *persistent_group_list = NULL;
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               *persistent_group_num = 0;
-               *persistent_group_list = NULL;
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __parsing_persistent_group(res_buffer, ws_persistent_group_list, persistent_group_num);
-       WDP_LOGD( "Persistent Group Count=%d\n", *persistent_group_num);
-
-       if (*persistent_group_num == 0) {
-               WDP_LOGD("There is no persistent group");
-               *persistent_group_list = NULL;
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       wfd_persistent_group_list = (wfd_persistent_group_info_s*) calloc(*persistent_group_num,
-                                                                                                                               sizeof(wfd_persistent_group_info_s));
-       if (!wfd_persistent_group_list) {
-               WDP_LOGF("Failed to allocate memory for wfd_persistent_group_list");
-               *persistent_group_num = 0;
-               *persistent_group_list = NULL;
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       for(i=0;i<(*persistent_group_num);i++)
-       {
-               WDP_LOGD( "----persistent group [%d]----\n", i);                
-               WDP_LOGD( "network_id=%d\n", ws_persistent_group_list[i].network_id);
-               WDP_LOGD( "ssid=%s\n", ws_persistent_group_list[i].ssid);
-               WDP_LOGD( "bssid=%s\n", ws_persistent_group_list[i].bssid);
-               WDP_LOGD( "flags=%s\n", ws_persistent_group_list[i].flags);
-
-// TODO: should filer by [PERSISTENT] value of flags.
-
-               wfd_persistent_group_list[i].network_id = ws_persistent_group_list[i].network_id;
-               strncpy(wfd_persistent_group_list[i].ssid, ws_persistent_group_list[i].ssid, WIFI_DIRECT_MAX_SSID_LEN);
-               wfd_persistent_group_list[i].ssid[WIFI_DIRECT_MAX_SSID_LEN] = '\0';
-               
-               unsigned char la_mac_addr[6];
-               wfd_macaddr_atoe(ws_persistent_group_list[i].bssid, la_mac_addr);
-               memcpy(wfd_persistent_group_list[i].go_mac_address, la_mac_addr, 6);
-       }
-
-       *persistent_group_list = wfd_persistent_group_list;
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-
-}
-
-int wfd_ws_remove_persistent_group(wfd_persistent_group_info_s *persistent_group)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       char cmd[32] = {0, };
-       char res_buffer[1024] = {0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result = 0;
-       int i;
-       ws_network_info_s ws_persistent_group_list[MAX_PERSISTENT_GROUP_NUM];
-       int persistent_group_num;
-       char go_mac_str[18];
-       
-       memset(ws_persistent_group_list, 0x0, (sizeof(ws_network_info_s)*MAX_PERSISTENT_GROUP_NUM));
-       memset(go_mac_str, 0x0, sizeof(go_mac_str));
-       snprintf(go_mac_str, MACSTR_LEN, MACSTR, MAC2STR(persistent_group->go_mac_address));
-
-       snprintf(cmd, sizeof(cmd), CMD_GET_LIST_NETWORKS);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(LIST_NETWORKS) result=[%d]\n", result);
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __parsing_persistent_group(res_buffer, ws_persistent_group_list, &persistent_group_num);
-
-       WDP_LOGD( "Persistent Group Count=%d\n", persistent_group_num);
-       for(i=0;i<persistent_group_num;i++)
-       {
-               WDP_LOGD( "----persistent group [%d]----\n", i);                
-               WDP_LOGD( "network_id=%d\n", ws_persistent_group_list[i].network_id);
-               WDP_LOGD( "ssid=%s\n", ws_persistent_group_list[i].ssid);
-               WDP_LOGD( "bssid=%s\n", ws_persistent_group_list[i].bssid);
-               WDP_LOGD( "flags=%s\n", ws_persistent_group_list[i].flags);
-
-// TODO: should filer by [PERSISTENT] value of flags.
-
-
-                       WDP_LOGD( "persistent_group->ssid [%s]----\n", persistent_group->ssid);
-                       WDP_LOGD( "ws_persistent_group_list[i].ssid [%s]----\n", ws_persistent_group_list[i].ssid);
-                       WDP_LOGD( "go_mac_str [%s]----\n", go_mac_str);
-                       WDP_LOGD( "ws_persistent_group_list[i].bssid [%s]----\n", ws_persistent_group_list[i].bssid);
-
-               if (strcmp(persistent_group->ssid, ws_persistent_group_list[i].ssid) == 0
-                       && strcmp(go_mac_str, ws_persistent_group_list[i].bssid) == 0)
-               {
-               
-                       WDP_LOGD( "----Found persistent group [%d]----\n", i);
-                       
-                       memset(cmd, 0x0, sizeof(cmd));
-                       memset(res_buffer, 0x0, sizeof(res_buffer));
-
-                       snprintf(cmd, sizeof(cmd), "%s %d", CMD_REMOVE_NETWORK, ws_persistent_group_list[i].network_id);
-                       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-                       WDP_LOGD( "__send_wpa_request(CMD_REMOVE_NETWORK) result=[%d]\n", result);
-
-                       if (result < 0)
-                       {
-                               WDP_LOGE( "__send_wpa_request FAILED[CMD_REMOVE_NETWORK]!!\n");
-                               __WDP_LOG_FUNC_EXIT__;
-                               return false;
-                       }
-                       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-                       {
-                               __WDP_LOG_FUNC_EXIT__;
-                               return false;
-                       }
-
-
-                       break;
-               }
-
-       }
-
-
-       
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
-
-int wfd_ws_set_persistent_reconnect(bool enabled)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       char cmd[128] = {0, };
-       char res_buffer[1024]={0,};
-       int res_buffer_len = sizeof(res_buffer);
-       int result;
-
-       snprintf(cmd, sizeof(cmd), "%s persistent_reconnect %d", CMD_SET_PARAM, enabled);
-       result = __send_wpa_request(g_control_sockfd, cmd, (char*)res_buffer, res_buffer_len);
-       WDP_LOGD( "__send_wpa_request(SET persistent_reconnect %d) result=[%d]\n", enabled, result);
-
-       if (result < 0)
-       {
-               WDP_LOGE( "__send_wpa_request FAILED!!\n");
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-       if ( (result == 0) || (strncmp(res_buffer, "FAIL", 4) == 0))
-       {
-               __WDP_LOG_FUNC_EXIT__;
-               return false;
-       }
-
-       __WDP_LOG_FUNC_EXIT__;
-       return true;
-}
diff --git a/plugin/wpasupplicant/wfd-plugin-wpasupplicant-emul.c b/plugin/wpasupplicant/wfd-plugin-wpasupplicant-emul.c
new file mode 100644 (file)
index 0000000..768e33a
--- /dev/null
@@ -0,0 +1,325 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <poll.h>
+#include <errno.h>
+
+#include "wifi-direct-oem.h"
+#include "wfd-plugin-wpasupplicant.h"
+
+
+static struct wfd_oem_ops supplicant_ops = {
+       .init = ws_init,
+       .deinit = ws_deinit,
+       .activate = ws_activate,
+       .deactivate = ws_deactivate,
+
+       .start_scan = ws_start_scan,
+       .stop_scan = ws_stop_scan,
+       .get_visibility = ws_get_visibility,
+       .set_visibility = ws_set_visibility,
+       .get_scan_result = ws_get_scan_result,
+       .get_peer_info = ws_get_peer_info,
+
+       .prov_disc_req = ws_prov_disc_req,
+
+       .connect = ws_connect;
+       .disconnect = ws_disconnect,
+       .reject_connection = ws_reject_connection,
+       .cancel_connection = ws_cancel_connection,
+       .get_connected_peers = ws_get_connected_peers,
+       .get_pin = ws_get_pin,
+       .set_pin = ws_set_pin,
+       .get_supported_wps_mode = ws_get_supported_wps_mode,
+
+       .create_group = ws_create_group,
+       .destroy_group = ws_destroy_group,
+       .invite = ws_invite,
+       .wps_start = ws_wps_start,
+
+       .get_dev_name = ws_get_dev_name,
+       .set_dev_name = ws_set_dev_name,
+       .get_dev_mac = ws_get_dev_mac,
+       .get_dev_type = ws_get_dev_type,
+       .set_dev_type = ws_set_dev_type,
+       .get_go_intent = ws_get_go_intent,
+       .set_go_intent = ws_set_go_intent,
+       .get_persistent_groups = ws_get_persistent_groups,
+       .remove_persistent_group = ws_remove_persistent_group,
+       .set_persistent_reconnect = ws_set_persistent_reconnect,
+       };
+
+static ws_plugin_data_s *g_pd;
+
+int wfd_plugin_load( struct wfd_oem_ops_s **ops)
+{
+
+       return -1;
+}
+
+int ws_init(wfd_oem_event_cb callback, void *user_data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_deinit()
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_activate()
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_deactivate()
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_start_scan(wfd_oem_scan_param_s *param)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_stop_scan()
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_visibility(int *visibility)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_set_visibility(int visibility)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_scan_result(GList **peers, int *peer_count)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_peer_info(const char *peer_addr, wfd_oem_device_s **peer)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_connect(const char *peer_addr, wfd_oem_conn_param_s *param)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_disconnect(const char *peer_addr)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_reject_connection(unsigned char *peer_addr)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_cancel_connection(unsigned char *peer_addr)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_connected_peers(GList **peers, int *peer_count)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_pin(char *pin)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_set_pin(char *pin)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_supported_wps_mode()
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_create_group(int persistent, int freq)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_destroy_group(const char *ifname)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_invite(const char *peer_addr, wfd_oem_invite_param_s *param)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+// Only group owner can use this command
+int ws_wps_start(const char *peer_addr, int wps_mode, const char *pin)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_dev_name(char *dev_name)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_set_dev_name(char *dev_name)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_dev_mac(char *dev_mac)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_set_dev_type(int pri_dev_type, int sec_dev_type)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_go_intent(int *go_intent)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_set_go_intent(int go_intent)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_remove_persistent_group(const char *bssid)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_set_persistent_reconnect(const char *bssid, int reconnect)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
diff --git a/plugin/wpasupplicant/wfd-plugin-wpasupplicant.c b/plugin/wpasupplicant/wfd-plugin-wpasupplicant.c
new file mode 100644 (file)
index 0000000..99bfbf9
--- /dev/null
@@ -0,0 +1,2876 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct wpasupplicant plugin functions.
+ *
+ * @file               wfd_plugin_wpasupplicant.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#define _GNU_SOURCE
+#include <poll.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include "wifi-direct-oem.h"
+#include "wfd-plugin-wpasupplicant.h"
+
+ws_string_s ws_event_strs[] = {
+       // discovery
+       {"P2P-DEVICE-FOUND", WS_EVENT_DEVICE_FOUND},
+       {"P2P-DEVICE-LOST", WS_EVENT_DEVICE_LOST},
+       {"P2P-FIND-STOPPED", WS_EVENT_FIND_STOPED},
+
+       // provision discovery
+       {"P2P-PROV-DISC-PBC-REQ", WS_EVENT_PROV_DISC_PBC_REQ},
+       {"P2P-PROV-DISC-SHOW-PIN", WS_EVENT_PROV_DISC_SHOW_PIN},
+       {"P2P-PROV-DISC-ENTER-PIN", WS_EVENT_PROV_DISC_ENTER_PIN},
+       {"P2P-PROV-DISC-PBC-RESP", WS_EVENT_PROV_DISC_PBC_RESP},
+       {"P2P-PROV-DISC-FAILURE", WS_EVENT_PROV_DISC_FAILURE},
+
+       // connection
+       {"P2P-GO-NEG-REQUEST", WS_EVENT_GO_NEG_REQUEST},
+       {"P2P-GO-NEG-FAILURE", WS_EVENT_GO_NEG_FAILURE},
+       {"P2P-GO-NEG-SUCCESS", WS_EVENT_GO_NEG_SUCCESS},
+       {"WPS-FAIL", WS_EVENT_WPS_FAIL},
+       {"P2P-GROUP-FORMATION-FAILURE", WS_EVENT_GROUP_FORMATION_FAILURE},
+       {"WPS-SUCCESS", WS_EVENT_WPS_SUCCESS},
+       {"WPS-REG-SUCCESS", WS_EVENT_WPS_REG_SUCCESS},
+       {"P2P-GROUP-FORMATION-SUCCESS", WS_EVENT_GROUP_FORMATION_SUCCESS},
+
+       {"CTRL-EVENT-CONNECTED", WS_EVENT_CONNECTED},
+       {"AP-STA-CONNECTED", WS_EVENT_STA_CONNECTED},
+
+       // invite
+       {"P2P-INVITATION-RECEIVED", WS_EVENT_INVITATION_RECEIVED},
+       {"P2P-INVITATION-RESULT", WS_EVENT_INVITATION_RESULT},
+
+       {"CTRL-EVENT-DISCONNECTED", WS_EVENT_DISCONNECTED},
+       {"AP-STA-DISCONNECTED", WS_EVENT_STA_DISCONNECTED},
+
+       // group
+       {"P2P-GROUP-STARTED", WS_EVENT_GROUP_STARTED},
+       {"P2P-GROUP-REMOVED", WS_EVENT_GROUP_REMOVED},
+
+       {"CTRL-EVENT-TERMINATING", WS_EVENT_TERMINATING},
+       };
+
+ws_string_s ws_dev_info_strs[] = {
+       {"p2p_dev_addr", WS_DEV_INFO_P2P_DEV_ADDR},
+       {"name", WS_DEV_INFO_DEV_NAME},
+       {"pri_dev_type", WS_DEV_INFO_DEV_TYPE},
+       {"config_methods", WS_DEV_INFO_CONFIG_METHODS},
+       {"dev_capab", WS_DEV_INFO_DEV_CAP},
+       {"group_capab", WS_DEV_INFO_GROUP_CAP},
+       {"p2p_go_addr", WS_DEV_INFO_P2P_GO_ADDR},
+       {"", WS_DEV_INFO_LIMIT},
+       };
+
+ws_string_s ws_conn_info_strs[] = {
+       {"dev_passwd_id", WS_CONN_INFO_DEV_PWD_ID},
+       {"status", WS_CONN_INFO_STATUS},
+       {"config_error", WS_CONN_INFO_ERROR},
+       {"", WS_CONN_INFO_LIMIT},
+       };
+
+ws_string_s ws_invite_info_strs[] = {
+       {"sa", WS_INVITE_INFO_SRC_ADDR},
+       {"go_dev_addr", WS_INVITE_INFO_GO_DEV_ADDR},
+       {"bssid", WS_INVITE_INFO_BSSID},
+       {"listen", WS_INVITE_INFO_LISTEN},
+       {"status", WS_INVITE_INFO_STATUS},
+       {"", WS_INVITE_INFO_LIMIT},
+       };
+
+ws_string_s ws_group_info_strs[] = {
+       {"ssid", WS_GROUP_INFO_SSID},
+       {"freq", WS_GROUP_INFO_FREQ},
+       {"passphrase", WS_GROUP_INFO_PASS},
+       {"go_dev_addr", WS_GROUP_INFO_GO_DEV_ADDR},
+       {"status", WS_GROUP_INFO_STATUS},
+       {"", WS_GROUP_INFO_LIMIT},
+
+       };
+
+ws_string_s ws_peer_info_strs[] = {
+       {"age", WS_PEER_INFO_AGE},
+       {"listen_freq", WS_PEER_INFO_LISTEN_FREQ},
+       {"level", WS_PEER_INFO_LEVEL},
+       {"wps_method", WS_PEER_INFO_WPS_METHOD},
+       {"interface_addr", WS_PEER_INFO_INTERFACE_ADDR},
+       {"member_in_go_dev", WS_PEER_INFO_MEMBER_IN_GO_DEV},
+       {"member_in_go_iface", WS_PEER_INFO_MEMBER_IN_GO_IFACE},
+       {"pri_dev_type", WS_PEER_INFO_PRI_DEV_TYPE},
+       {"device_name", WS_PEER_INFO_DEVICE_NAME},
+       {"manufacturer", WS_PEER_INFO_MANUFACTURER},
+       {"model_name", WS_PEER_INFO_MODEL_NAME},
+       {"model_number", WS_PEER_INFO_MODEL_NUMBER},
+       {"serial_number", WS_PEER_INFO_SERIAL_NUMBER},
+       {"config_methods", WS_PEER_INFO_CONFIG_METHODS},
+       {"dev_capab", WS_PEER_INFO_DEV_CAPAB},
+       {"group_capab", WS_PEER_INFO_GROUP_CAPAB},
+       {"is_wfd_device", WS_PEER_INFO_IS_WFD_DEVICE},
+       {"go_neg_req_sent", WS_PEER_INFO_GO_NEG_REQ_SENT},
+       {"go_state", WS_PEER_INFO_GO_STATE},
+       {"dialog_token", WS_PEER_INFO_DIALOG_TOKEN},
+       {"intended_addr", WS_PEER_INFO_INTENDED_ADDR},
+       {"country", WS_PEER_INFO_COUNTRY},
+       {"oper_freq", WS_PEER_INFO_OPER_FREQ},
+       {"req_config_methods", WS_PEER_INFO_REQ_CONFIG_METHODS},
+       {"flags", WS_PEER_INFO_FLAGS},
+       {"status", WS_PEER_INFO_STATUS},
+       {"wait_count", WS_PEER_INFO_WAIT_COUNT},
+       {"invitation_reqs", WS_PEER_INFO_INVITATION_REQS},
+       };
+
+static wfd_oem_ops_s supplicant_ops = {
+       .init = ws_init,
+       .deinit = ws_deinit,
+       .activate = ws_activate,
+       .deactivate = ws_deactivate,
+
+       .start_scan = ws_start_scan,
+       .stop_scan = ws_stop_scan,
+       .get_visibility = ws_get_visibility,
+       .set_visibility = ws_set_visibility,
+       .get_scan_result = ws_get_scan_result,
+       .get_peer_info = ws_get_peer_info,
+
+       .prov_disc_req = ws_prov_disc_req,
+
+       .connect = ws_connect,
+       .disconnect = ws_disconnect,
+       .reject_connection = ws_reject_connection,
+       .cancel_connection = ws_cancel_connection,
+
+       .get_connected_peers = ws_get_connected_peers,
+       .get_pin = ws_get_pin,
+       .set_pin = ws_set_pin,
+       .get_supported_wps_mode = ws_get_supported_wps_mode,
+
+       .create_group = ws_create_group,
+       .destroy_group = ws_destroy_group,
+       .invite = ws_invite,
+       .wps_start = ws_wps_start,
+       .enrollee_start = ws_enrollee_start,
+
+       .get_dev_name = ws_get_dev_name,
+       .set_dev_name = ws_set_dev_name,
+       .get_dev_mac = ws_get_dev_mac,
+       .get_dev_type = ws_get_dev_type,
+       .set_dev_type = ws_set_dev_type,
+       .get_go_intent = ws_get_go_intent,
+       .set_go_intent = ws_set_go_intent,
+       .get_persistent_groups = ws_get_persistent_groups,
+       .remove_persistent_group = ws_remove_persistent_group,
+       .set_persistent_reconnect = ws_set_persistent_reconnect,
+       };
+
+static ws_plugin_data_s *g_pd;
+
+static gboolean ws_event_handler(GIOChannel *source,
+                                                          GIOCondition condition,
+                                                          gpointer data);
+
+
+int wfd_plugin_load(wfd_oem_ops_s **ops)
+{
+       if (!ops) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       *ops = &supplicant_ops;
+
+       return 0;
+}
+
+static int _ws_txt_to_devtype(char *txt, int *pri, int *sec)
+{
+       if (!txt || !pri || !sec) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (strlen(txt) > WS_DEVTYPESTR_LEN) {
+               WDP_LOGE("Device type string is invalid [%s]", txt);
+               return -1;
+       }
+
+       *pri = (int) strtoul(txt, &txt, 0);
+       *sec = (int) strtoul(txt+1, &txt, 16);
+
+       return 0;
+}
+
+static int _ws_txt_to_mac(char *txt, unsigned char *mac)
+{
+       int i = 0;
+
+       if (!txt || !mac) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       for (;;) {
+               mac[i++] = (char) strtoul(txt, &txt, 16);
+               if (!*txt++ || i == 6)
+                       break;
+       }
+
+       if (i != OEM_MACADDR_LEN)
+               return -1;
+
+       return 0;
+}
+
+static char *_ws_wps_to_txt(int wps_mode)
+{
+       switch (wps_mode) {
+       case WFD_OEM_WPS_MODE_PBC:
+               return WS_STR_PBC;
+               break;
+       case WFD_OEM_WPS_MODE_DISPLAY:
+               return WS_STR_DISPLAY;
+               break;
+       case WFD_OEM_WPS_MODE_KEYPAD:
+               return WS_STR_KEYPAD;
+               break;
+       default:
+               return "";
+               break;
+       }
+}
+
+static int _ws_check_socket(int sock)
+{
+       struct pollfd p_fd;
+       int res = 0;
+
+       p_fd.fd = sock;
+       p_fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL;
+       res = poll((struct pollfd *) &p_fd, 1, 1);
+
+       if (res < 0) {
+               WDP_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
+               return -1;
+       } else if (res == 0) {
+               WDP_LOGD( "poll timeout. socket is busy\n");
+               return 1;
+       } else {
+
+               if (p_fd.revents & POLLERR) {
+                       WDP_LOGF("Error! POLLERR from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLHUP) {
+                       WDP_LOGF("Error! POLLHUP from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLNVAL) {
+                       WDP_LOGF("Error! POLLNVAL from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLIN) {
+                       WDP_LOGD("POLLIN from socket [%d]", sock);
+                       return 0;
+               } else if (p_fd.revents & POLLOUT) {
+                       WDP_LOGD("POLLOUT from socket [%d]", sock);
+                       return 0;
+               }
+       }
+
+       WDP_LOGD("Unknown poll event [%d]", p_fd.revents);
+       return -1;
+}
+
+static int _ws_read_sock(int sock, char *data, int data_len)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       struct pollfd p_fd;
+       int p_ret = 0;
+       int rbytes = 0;
+
+       if(sock < SOCK_FD_MIN || !data || data_len <= 0) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       p_fd.fd = sock;
+       p_fd.events = POLLIN | POLLERR | POLLHUP;
+       p_ret = poll(&p_fd, 1, WS_POLL_TIMEOUT);
+
+       errno = 0;
+       if (p_ret > 0) {
+               if (p_fd.revents & POLLIN) {
+                       WDP_LOGD("POLLIN from socket [%d]", sock);
+                       errno = 0;
+                       rbytes = read(sock, data, data_len);
+                       if (rbytes < 0) {
+                               WDP_LOGE("Failed to read data from socket[%d]. [%s]", sock, strerror(errno));
+                               return -1;
+                       }
+                       WDP_LOGD("===== Read Data =====\n%s", data);
+
+                       __WDP_LOG_FUNC_EXIT__;
+                       return rbytes;
+               } else if (p_fd.revents & POLLERR) {
+                       WDP_LOGE("Error! POLLERR from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLHUP) {
+                       WDP_LOGE("Error! POLLHUP from socket[%d]", sock);
+                       return -1;
+               }
+       } else if (p_ret == 0) {
+               WDP_LOGE("Polling timeout from socket[%d]", sock);
+       } else {
+               WDP_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+static int _ws_send_cmd(int sock, char *cmd, char *reply, int reply_len)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int wbytes = 0;
+       int res = 0;
+
+       if (sock < SOCK_FD_MIN || !cmd || !reply || reply_len < 0) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+       WDP_LOGI("Sending command [%s]", cmd);
+
+       res = _ws_check_socket(sock);
+       if (res < 0) {
+               WDP_LOGE("Socket error");
+               return -1;
+       } else if (res > 0) {
+               WDP_LOGE("Socket is busy");
+               return -2;
+       }
+
+       errno = 0;
+       wbytes = write(sock, cmd, strlen(cmd));
+       if (wbytes < 0) {
+               WDP_LOGE("Failed to write into socket[%d]. [%s]", sock, strerror(errno));
+               return -1;
+       }
+
+       res = _ws_read_sock(sock, reply, reply_len);
+       if (res < 0) {
+               WDP_LOGE("Failed to read return for command");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _ws_flush()
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char reply[1024]={0,};
+       int res = 0;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       res = _ws_send_cmd(sock->ctrl_sock, WS_CMD_P2P_FLUSH, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to flush");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to flush");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _ws_cancel()
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char reply[1024]={0,};
+       int res = 0;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       res = _ws_send_cmd(sock->ctrl_sock, WS_CMD_P2P_CANCEL, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to cancel");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to cancel");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _create_ctrl_intf(char *ctrl_intf_path, char *supp_path)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       struct sockaddr_un srv_addr;
+       struct sockaddr_un local_addr;
+       int sock = 0;
+       int res = 0;
+
+       if(!ctrl_intf_path || !supp_path) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+       unlink(ctrl_intf_path);
+
+       errno = 0;
+       sock = socket(AF_UNIX, SOCK_DGRAM, 0);
+       if (sock < SOCK_FD_MIN) {
+               WDP_LOGE("Failed to create socket. [%s]", strerror(errno));
+               if (sock >= 0)
+                       close(sock);
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGI( "Succeeded to create socket [%d]\n", sock);
+
+       memset(&srv_addr, 0, sizeof(srv_addr));
+       srv_addr.sun_family = AF_UNIX;
+       snprintf(srv_addr.sun_path, sizeof(srv_addr.sun_path), supp_path);
+
+       memset(&local_addr, 0, sizeof(local_addr));
+       local_addr.sun_family = AF_UNIX;
+       snprintf(local_addr.sun_path, sizeof(local_addr.sun_path), ctrl_intf_path);
+
+       res = bind(sock, (struct sockaddr*) &local_addr, sizeof(local_addr));
+       if (res < 0)
+       {
+               WDP_LOGE("Failed to bind local socket [%s]. Try again...", strerror(errno));
+               unlink(ctrl_intf_path);
+
+               close(sock);
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       errno = 0;
+       res = connect(sock, (struct sockaddr*) &srv_addr, sizeof(srv_addr));
+       if (res < 0) {
+               WDP_LOGE("Failed to connect to server socket [%s]", strerror(errno));
+               close(sock);
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGI("Succeeded to connect to server socket [%d]", sock);
+
+       __WDP_LOG_FUNC_EXIT__;
+       return sock;
+}
+
+static int _attach_mon_intf(int sock)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       char cmd[8] = {0};
+       char reply[8]={0,};
+       int res= 0;
+
+       if (sock < SOCK_FD_MIN) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_ATTACH);
+       res = _ws_send_cmd(sock, cmd, reply,  sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE( "Failed to operate command(wpa_supplicant)");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _connect_to_supplicant(char *ifname, ws_sock_data_s **sock_data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = NULL;
+       int ctrl_sock = -1;
+       int mon_sock = -1;
+       char ctrl_path[32] = {0, };
+       char mon_path[32] = {0, };
+       char suppl_path[40] = {0, };
+       int res = 0;
+       int i = 0;
+
+       if (!ifname || !sock_data) {
+               WDP_LOGE("Invalie parameter");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (sock && sock->ctrl_sock > SOCK_FD_MIN) {
+               WDP_LOGE("Socket already connected [%d]", sock->ctrl_sock);
+               return -1;
+       }
+
+       errno = 0;
+       sock = (ws_sock_data_s*) calloc(1, sizeof(ws_sock_data_s));
+       if (!sock) {
+               WDP_LOGE("Failed to allocate memory for socket data", strerror(errno));
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       snprintf(ctrl_path, sizeof(ctrl_path), "/tmp/%s_control", ifname);
+       snprintf(mon_path, sizeof(mon_path), "/tmp/%s_monitor", ifname);
+       snprintf(suppl_path, sizeof(suppl_path), SUPPL_IFACE_PATH "%s", ifname);
+
+       for(i = 0; i < WS_CONN_RETRY_COUNT; i++) {
+               ctrl_sock = _create_ctrl_intf(ctrl_path, suppl_path);
+               if (ctrl_sock < 0) {
+                       WDP_LOGE("Failed to create control interface socket for %s", ifname);
+                       continue;
+               }
+               WDP_LOGD("Succeeded to create control interface socket[%d] for %s", ctrl_sock, ifname);
+
+               mon_sock = _create_ctrl_intf(mon_path, suppl_path);
+               if (mon_sock < 0) {
+                       WDP_LOGE("Failed to create monitor interface socket for %s", ifname);
+                       close(ctrl_sock);
+                       ctrl_sock = -1;
+                       continue;
+               }
+               WDP_LOGD("Succeeded to create monitor interface socket[%d] for %s", mon_sock, ifname);
+
+               res = _attach_mon_intf(mon_sock);
+               if (res < 0) {
+                       WDP_LOGE("Failed to attach monitor interface for event");
+                       continue;
+               }
+               WDP_LOGD("Succeeded to attach monitor interface for event");
+               break;
+       }
+
+       if (i == WS_CONN_RETRY_COUNT) {
+               if (ctrl_sock >= 0)
+                       close(ctrl_sock);
+               if (mon_sock >= 0)
+                       close(mon_sock);
+
+               free(sock);
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       sock->ctrl_sock = ctrl_sock;
+       sock->mon_sock = mon_sock;
+       sock->ifname = strdup(ifname);
+
+       GIOChannel *gio;
+       int gsource = 0;
+       gio = g_io_channel_unix_new(mon_sock);
+       gsource = g_io_add_watch(gio, G_IO_IN | G_IO_ERR | G_IO_HUP, (GIOFunc) ws_event_handler, sock);
+       g_io_channel_unref(gio);
+
+       sock->gsource = gsource;
+
+       *sock_data = sock;
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _disconnect_from_supplicant(char *ifname, ws_sock_data_s *sock_data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int res = 0;
+       char ctrl_path[32] = {0, };
+       char mon_path[32] = {0, };
+       char cmd[8] = {0, };
+       char reply[1024] = {0, };
+
+       if (!ifname || !sock_data) {
+               WDP_LOGE("Invalie parameter");
+               return -1;
+       }
+
+       // detach monitor interface
+       snprintf(cmd, sizeof(cmd), WS_CMD_DETACH);
+       res = _ws_send_cmd(sock_data->mon_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant. Keep going to close socket.");
+       } else {
+               if (!strncmp(reply, "FAIL", 4)) {
+                       WDP_LOGE( "Failed to detach monitor sock [%d]", sock_data->mon_sock);
+               }
+               WDP_LOGD("Succeeded to detach monitor sock for %s", ifname ? ifname : "NULL");
+       }
+
+       if (sock_data->gsource > 0)
+               g_source_remove(sock_data->gsource);
+       sock_data->gsource = 0;
+
+       // close control interface
+       snprintf(ctrl_path, sizeof(ctrl_path), "/tmp/%s_control", ifname);
+       snprintf(mon_path, sizeof(mon_path), "/tmp/%s_monitor", ifname);
+
+       if (sock_data->ctrl_sock >= 0)
+               close(sock_data->ctrl_sock);
+       sock_data->ctrl_sock = -1;
+       unlink(ctrl_path);
+
+       if (sock_data->mon_sock >= 0)
+               close(sock_data->mon_sock);
+       sock_data->mon_sock = -1;
+       unlink(mon_path);
+
+       if (sock_data->ifname)
+               free(sock_data->ifname);
+
+       free(sock_data);
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _extract_word(const char *data, char **value)
+{
+       int i = 0;
+
+       if(!data || !value) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       for(i = 0; data[i]; i++) {
+               if(data[i] == '\n' || data[i] == '\r' || data[i] == ' ' || data[i] == '\t') {
+                       break;
+               }
+       }
+
+       if (i > 0) {
+               *value = (char*) calloc(1, i+1);
+               strncpy(*value, data, i);
+               (*value)[i] = '\0';
+       }
+
+       return i;
+}
+
+static int _extract_value_str(const char *data, const char *key, char **value)
+{
+       char *tmp_str = NULL;
+       int i = 0;
+
+       if(!data || !key || !value) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       tmp_str = strstr(data, key);
+       if(!tmp_str) {
+               WDP_LOGE("Key[%s] is not found", key);
+               return -1;
+       }
+       tmp_str = tmp_str + strlen(key) + 1;
+
+       if (tmp_str[0] == '\'' || tmp_str[0] == '\"') {
+               tmp_str +=1;
+               for(i = 0; tmp_str[i]; i++) {
+                       if(tmp_str[i] == '\'' || tmp_str[i] == '\"')
+                               break;
+               }
+       } else {
+               for(i = 0; tmp_str[i]; i++) {
+                       if(tmp_str[i] == '\n' || tmp_str[i] == '\r' || tmp_str[i] == ' ')
+                               break;
+               }
+       }
+
+       if (i > 0) {
+               *value = (char*) calloc(1, i+1);
+               strncpy(*value, tmp_str, i);
+               (*value)[i] = '\0';
+               WDP_LOGV("Extracted string: %s", *value);
+               return i;
+       }
+
+       return 0;
+}
+
+static int _extract_peer_value_str(const char *data, const char *key, char **value)
+{
+       char *tmp_str = NULL;
+       int i = 0;
+
+       if(!data || !key || !value) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       tmp_str = strstr(data, key);
+       if(!tmp_str) {
+               WDP_LOGE("Key[%s] is not found", key);
+               return -1;
+       }
+       tmp_str = tmp_str + strlen(key) + 1;
+
+       for(i = 0; tmp_str[i]; i++) {
+               if(tmp_str[i] == '\n' || tmp_str[i] == '\r')
+                       break;
+       }
+
+       if (i > 0) {
+               *value = (char*) calloc(1, i+1);
+               strncpy(*value, tmp_str, i);
+               (*value)[i] = '\0';
+               WDP_LOGV("Extracted string: %s", *value);
+               return i;
+       }
+
+       return 0;
+}
+
+static int _parsing_peer_info(char *msg, wfd_oem_device_s *peer)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int i, info_cnt = 0;
+       ws_string_s infos[WS_PEER_INFO_LIMIT];
+       int config_methods = 0x00;
+       int group_capab = 0x00;
+       int res = 0;
+
+       if (!msg || !peer) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       _ws_txt_to_mac(msg, peer->dev_addr);
+       msg += OEM_MACSTR_LEN;
+
+       memset(infos, 0x0, (WS_PEER_INFO_LIMIT) * sizeof(ws_string_s));
+       for (i = 0; i < WS_PEER_INFO_LIMIT; i++) {
+               res = _extract_peer_value_str(msg, ws_peer_info_strs[i].string, &infos[info_cnt].string);
+               if (res > 0) {
+                       infos[info_cnt].index = ws_peer_info_strs[i].index;
+                       info_cnt++;
+               }
+       }
+
+       for (i = 0; i < info_cnt; i++) {
+               switch (infos[i].index){
+               case WS_PEER_INFO_AGE:
+                       break;
+               case WS_PEER_INFO_LISTEN_FREQ:
+                       break;
+               case WS_PEER_INFO_LEVEL:
+                       break;
+               case WS_PEER_INFO_WPS_METHOD:
+                       break;
+               case WS_PEER_INFO_INTERFACE_ADDR:
+                       break;
+               case WS_PEER_INFO_MEMBER_IN_GO_DEV:
+                       res = _ws_txt_to_mac(infos[i].string, peer->go_dev_addr);
+                       if (res < 0)
+                               memset(peer->go_dev_addr, 0x00, OEM_MACADDR_LEN);
+                       break;
+               case WS_PEER_INFO_MEMBER_IN_GO_IFACE:
+                       break;
+               case WS_PEER_INFO_PRI_DEV_TYPE:
+                       res = _ws_txt_to_devtype(infos[i].string, &peer->pri_dev_type, &peer->sec_dev_type);
+                       if (res < 0) {
+                               peer->pri_dev_type = 0;
+                               peer->sec_dev_type = 0;
+                       }
+                       break;
+               case WS_PEER_INFO_DEVICE_NAME:
+                       strncpy(peer->dev_name, infos[i].string, OEM_DEV_NAME_LEN);
+                       peer->dev_name[OEM_DEV_NAME_LEN] = '\0';
+                       break;
+               case WS_PEER_INFO_MANUFACTURER:
+                       break;
+               case WS_PEER_INFO_MODEL_NAME:
+                       break;
+               case WS_PEER_INFO_MODEL_NUMBER:
+                       break;
+               case WS_PEER_INFO_SERIAL_NUMBER:
+                       break;
+               case WS_PEER_INFO_CONFIG_METHODS:
+                       config_methods = (int) strtoul(infos[i].string, NULL, 16);
+                       if (config_methods & WS_CONFIG_METHOD_DISPLAY)
+                               peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
+                       if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
+                               peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
+                       if (config_methods & WS_CONFIG_METHOD_KEYPAD)
+                               peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
+                       break;
+               case WS_PEER_INFO_DEV_CAPAB:
+                       peer->dev_flags = (int) strtoul(infos[i].string, NULL, 16);
+                       break;
+               case WS_PEER_INFO_GROUP_CAPAB:
+                       group_capab = (int) strtoul(infos[i].string, NULL, 16);
+                       if (group_capab & WS_GROUP_CAP_GROUP_OWNER) {
+                               peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
+                               peer->dev_role = WFD_OEM_DEV_ROLE_GO;
+                       }
+                       if (group_capab & WS_GROUP_CAP_PERSISTENT_GROUP)
+                               peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
+                       break;
+               case WS_PEER_INFO_IS_WFD_DEVICE:
+                       break;
+               case WS_PEER_INFO_GO_NEG_REQ_SENT:
+                       break;
+               case WS_PEER_INFO_GO_STATE:
+                       break;
+               case WS_PEER_INFO_DIALOG_TOKEN:
+                       break;
+               case WS_PEER_INFO_INTENDED_ADDR:
+                       res = _ws_txt_to_mac(infos[i].string, peer->intf_addr);
+                       if (res < 0)
+                               memset(peer->intf_addr, 0x00, OEM_MACADDR_LEN);
+                       break;
+               case WS_PEER_INFO_COUNTRY:
+                       break;
+               case WS_PEER_INFO_OPER_FREQ:
+                       break;
+               case WS_PEER_INFO_REQ_CONFIG_METHODS:
+                       break;
+               case WS_PEER_INFO_FLAGS:
+                       break;
+               case WS_PEER_INFO_STATUS:
+                       break;
+               case WS_PEER_INFO_WAIT_COUNT:
+                       break;
+               case WS_PEER_INFO_INVITATION_REQS:
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       for(i = 0; i < info_cnt; i++) {
+               if (infos[i].string)
+                       free(infos[i].string);
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static wfd_oem_dev_data_s *_convert_msg_to_dev_info(char *msg)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int i;
+       int info_cnt = 0;
+       ws_string_s infos[WS_DEV_INFO_LIMIT];
+       wfd_oem_dev_data_s *edata = NULL;
+       int config_methods = 0x00;
+       int group_capab = 0x00;
+       int res = 0;
+
+       if (!msg) {
+               WDP_LOGE("Invalid parameter");
+               return NULL;
+       }
+       WDP_LOGD("msg to be converted [%s]", msg);
+
+       memset(infos, 0x0, (WS_DEV_INFO_LIMIT) * sizeof(ws_string_s));
+       for (i = 0; i < WS_DEV_INFO_LIMIT; i++) {
+               res = _extract_value_str(msg, ws_dev_info_strs[i].string, &infos[info_cnt].string);
+               if (res > 0) {
+                       infos[info_cnt].index = ws_dev_info_strs[i].index;
+                       WDP_LOGD("%dth info [%d:%s]", i, infos[info_cnt].index, infos[info_cnt].string);
+                       info_cnt++;
+               }
+       }
+
+       if (!info_cnt) {
+               WDP_LOGE("There is no item converted");
+               return NULL;
+       }
+
+       errno = 0;
+       edata = (wfd_oem_dev_data_s*) calloc(1, sizeof(wfd_oem_dev_data_s));
+       if (!edata) {
+               WDP_LOGE("Failed to allocate memory for device information [%s]", strerror(errno));
+               return NULL;
+       }
+
+       for (i = 0; i < info_cnt; i++) {
+               switch (infos[i].index) {
+               case WS_DEV_INFO_P2P_DEV_ADDR:
+                       res = _ws_txt_to_mac(infos[i].string, edata->p2p_dev_addr);
+                       if (res < 0)
+                               memset(edata->p2p_dev_addr, 0x00, OEM_MACADDR_LEN);
+                       break;
+               case WS_DEV_INFO_DEV_NAME:
+                       strncpy(edata->name, infos[i].string, OEM_DEV_NAME_LEN);
+                       edata->name[OEM_DEV_NAME_LEN] = '\0';
+                       break;
+               case WS_DEV_INFO_DEV_TYPE:
+                       res = _ws_txt_to_devtype(infos[i].string, &edata->pri_dev_type, &edata->sec_dev_type);
+                       if (res < 0) {
+                               edata->pri_dev_type = 0;
+                               edata->sec_dev_type = 0;
+                       }
+                       break;
+               case WS_DEV_INFO_CONFIG_METHODS:
+                       config_methods = (int) strtoul(infos[i].string, NULL, 16);
+                       if (config_methods & WS_CONFIG_METHOD_DISPLAY)
+                               edata->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
+                       if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
+                               edata->config_methods |= WFD_OEM_WPS_MODE_PBC;
+                       if (config_methods & WS_CONFIG_METHOD_KEYPAD)
+                               edata->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
+                       break;
+               case WS_DEV_INFO_DEV_CAP:
+                       edata->dev_flags = (int) strtoul(infos[i].string, NULL, 16);
+                       break;
+               case WS_DEV_INFO_GROUP_CAP:
+                       group_capab = (int) strtoul(infos[i].string, NULL, 16);
+                       if (group_capab & WS_GROUP_CAP_GROUP_OWNER) {
+                               edata->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
+                               edata->dev_role = WFD_OEM_DEV_ROLE_GO;
+                       }
+                       if (group_capab & WS_GROUP_CAP_PERSISTENT_GROUP)
+                               edata->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
+                       break;
+               case WS_DEV_INFO_P2P_GO_ADDR:
+                       edata->dev_role = WFD_OEM_DEV_ROLE_GC;
+                       res = _ws_txt_to_mac(infos[i].string, edata->p2p_go_addr);
+                       if (res < 0)
+                               memset(edata->p2p_go_addr, 0x00, OEM_MACADDR_LEN);
+                       break;
+               default:
+                       WDP_LOGE("Unknown parameter [%d:%s]", infos[i].index, infos[i].string);
+                       break;
+               }
+               if (infos[i].string)
+                       free(infos[i].string);
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return edata;
+}
+
+static wfd_oem_conn_data_s *_convert_msg_to_conn_info(char *msg)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int i;
+       int info_cnt = 0;
+       ws_string_s infos[WS_CONN_INFO_LIMIT];
+       wfd_oem_conn_data_s *edata = NULL;
+       int res = 0;
+
+       if (!msg) {
+               WDP_LOGE("Invalid parameter");
+               return NULL;
+       }
+       WDP_LOGD("msg to convert [%s]", msg);
+
+       memset(infos, 0x0, (WS_CONN_INFO_LIMIT) * sizeof(ws_string_s));
+       for (i = 0; i < WS_CONN_INFO_LIMIT; i++) {
+               res = _extract_value_str(msg, ws_conn_info_strs[i].string, &infos[info_cnt].string);
+               if (res > 0) {
+                       infos[info_cnt].index = ws_conn_info_strs[i].index;
+                       info_cnt++;
+               }
+       }
+
+       if (!info_cnt) {
+               WDP_LOGE("There is no item converted");
+               return NULL;
+       }
+
+       errno = 0;
+       edata = (wfd_oem_conn_data_s*) calloc(1, sizeof(wfd_oem_conn_data_s));
+       if (!edata) {
+               WDP_LOGE("Failed to allocate memory for connection information [%s]", strerror(errno));
+               return NULL;
+       }
+
+       for (i = 0; i < info_cnt; i++) {
+               switch (infos[i].index) {
+               case WS_CONN_INFO_DEV_PWD_ID:
+                       edata->dev_pwd_id = atoi(infos[i].string);
+                       break;
+               case WS_CONN_INFO_STATUS:
+                       edata->status = atoi(infos[i].string);
+                       break;
+               case WS_CONN_INFO_ERROR:
+                       edata->error = atoi(infos[i].string);
+                       break;
+               default:
+                       WDP_LOGE("Unknown information [%d:%s]", infos[i].index, infos[i].string);
+                       break;
+               }
+               if (infos[i].string)
+                       free(infos[i].string);
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return edata;
+}
+
+static wfd_oem_invite_data_s *_convert_msg_to_invite_info(char *msg)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int i;
+       int info_cnt = 0;
+       ws_string_s infos[WS_INVITE_INFO_LIMIT];
+       wfd_oem_invite_data_s *edata = NULL;
+       int res = 0;
+
+       if (!msg) {
+               WDP_LOGE("Invalid parameter");
+               return NULL;
+       }
+       WDP_LOGD("msg to convert [%s]", msg);
+
+       memset(infos, 0x0, (WS_INVITE_INFO_LIMIT) * sizeof(ws_string_s));
+       for (i = 0; i < WS_INVITE_INFO_LIMIT; i++) {
+               res = _extract_value_str(msg, ws_invite_info_strs[i].string, &infos[info_cnt].string);
+               if (res > 0) {
+                       infos[info_cnt].index = ws_invite_info_strs[i].index;
+                       info_cnt++;
+               }
+       }
+
+       if (!info_cnt) {
+               WDP_LOGE("There is no item converted");
+               return NULL;
+       }
+
+       errno = 0;
+       edata = (wfd_oem_invite_data_s*) calloc(1, sizeof(wfd_oem_invite_data_s));
+       if (!edata) {
+               WDP_LOGE("Failed to allocate memory for invite information [%s]", strerror(errno));
+               return NULL;
+       }
+
+       for (i = 0; i < info_cnt; i++) {
+               switch (infos[i].index) {
+               case WS_INVITE_INFO_GO_DEV_ADDR:
+                       res = _ws_txt_to_mac(infos[i].string, edata->go_dev_addr);
+                       if (res < 0)
+                               memset(edata->go_dev_addr, 0x00, OEM_MACADDR_LEN);
+                       break;
+               case WS_INVITE_INFO_BSSID:
+                       res = _ws_txt_to_mac(infos[i].string, edata->bssid);
+                       if (res < 0)
+                               memset(edata->bssid, 0x00, OEM_MACADDR_LEN);
+                       break;
+               case WS_INVITE_INFO_LISTEN:
+                       edata->listen = atoi(infos[i].string);
+                       break;
+               case WS_INVITE_INFO_STATUS:
+                       edata->status = atoi(infos[i].string);
+                       break;
+               default:
+                       WDP_LOGE("Unknown parameter [%d:%s]", infos[i].index, infos[i].string);
+                       break;
+               }
+               if (infos[i].string)
+                       free(infos[i].string);
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return edata;
+}
+
+static wfd_oem_group_data_s *_convert_msg_to_group_info(char *msg)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int i;
+       int info_cnt = 0;
+       ws_string_s infos[WS_GROUP_INFO_LIMIT];
+       wfd_oem_group_data_s *edata = NULL;
+       int res = 0;
+
+       if (!msg) {
+               WDP_LOGE("Invalid parameter");
+               return NULL;
+       }
+       WDP_LOGD("msg to convert [%s]", msg);
+
+       memset(infos, 0x0, WS_GROUP_INFO_LIMIT * sizeof(ws_string_s));
+       for (i = 0; i < WS_GROUP_INFO_LIMIT; i++) {
+               res = _extract_value_str(msg, ws_group_info_strs[i].string, &infos[info_cnt].string);
+               if (res > 0) {
+                       infos[info_cnt].index = ws_group_info_strs[i].index;
+                       info_cnt++;
+               }
+       }
+
+       if (!info_cnt) {
+               WDP_LOGE("There is no item converted");
+               return NULL;
+       }
+
+       errno = 0;
+       edata = (wfd_oem_group_data_s*) calloc(1, sizeof(wfd_oem_group_data_s));
+       if (!edata) {
+               WDP_LOGE("Failed to allocate memory for group information [%s]", strerror(errno));
+               return NULL;
+       }
+
+       for (i = 0; i < info_cnt; i++) {
+               switch (infos[i].index) {
+               case WS_GROUP_INFO_SSID:
+                       strncpy(edata->ssid, infos[i].string, OEM_DEV_NAME_LEN);
+                       edata->ssid[OEM_DEV_NAME_LEN] = '\0';
+                       break;
+               case WS_GROUP_INFO_FREQ:
+                       edata->freq = atoi(infos[i].string);
+                       break;
+               case WS_GROUP_INFO_PASS:
+                       strncpy(edata->pass, infos[i].string, OEM_PASS_PHRASE_LEN);
+                       edata->pass[OEM_PASS_PHRASE_LEN] = '\0';
+                       break;
+               case WS_GROUP_INFO_GO_DEV_ADDR:
+                       res = _ws_txt_to_mac(infos[i].string, edata->go_dev_addr);
+                       if (res < 0)
+                               memset(edata->go_dev_addr, 0x00, OEM_MACADDR_LEN);
+                       break;
+               default:
+                       WDP_LOGE("Unknown parameter [%d:%s]", infos[i].index, infos[i].string);
+                       break;
+               }
+               if (infos[i].string)
+                       free(infos[i].string);
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return edata;
+}
+
+static int _parsing_event_info(char *ifname, char *msg, wfd_oem_event_s *data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int i;
+       int res = 0;
+       char *info_str = NULL;
+
+       if (!msg || !data) {
+               WDP_LOGE("Invalid parameter");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Event message [%s]", msg);
+
+       // parsing event string
+       for(i = 0; i < WS_EVENT_LIMIT; i++) {
+               if (!strncmp(ws_event_strs[i].string, msg, strlen(ws_event_strs[i].string))) {
+                       break;
+               }
+       }
+       data->event_id = i;
+       WDP_LOGD("Event ID [%d]", i);
+
+       if (i == WS_EVENT_LIMIT) {
+               WDP_LOGE("Unknown event [%d]", i);
+               return 1;
+       }
+
+       // parsing event info
+       info_str = msg + strlen(ws_event_strs[i].string) + 1;
+       if (!strlen(info_str)) {
+               WDP_LOGD("Nothing to parse anymore");
+               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+               __WDP_LOG_FUNC_EXIT__;
+               return 0;
+       }
+
+       switch (data->event_id) {
+       case WS_EVENT_DEVICE_FOUND:
+               {
+                       _ws_txt_to_mac(info_str, data->dev_addr);
+                       info_str += OEM_MACSTR_LEN;
+
+                       wfd_oem_dev_data_s *edata = NULL;
+                       edata = _convert_msg_to_dev_info(info_str);
+                       if (!edata) {
+                               WDP_LOGE("Failed to convert information string to device data");
+                               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+                               break;
+                       }
+
+                       if (edata->dev_role == WFD_OEM_DEV_ROLE_GO) {
+                               memcpy(edata->p2p_intf_addr, data->dev_addr, OEM_MACADDR_LEN);
+                               memcpy(data->dev_addr, edata->p2p_dev_addr, OEM_MACADDR_LEN);
+                       }
+                       data->edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
+                       data->edata = (void*) edata;
+
+               }
+               break;
+       case WS_EVENT_PROV_DISC_PBC_REQ:
+       case WS_EVENT_PROV_DISC_SHOW_PIN:
+       case WS_EVENT_PROV_DISC_ENTER_PIN:
+       case WS_EVENT_PROV_DISC_PBC_RESP:
+               {
+                       _ws_txt_to_mac(info_str, data->dev_addr);
+                       info_str += OEM_MACSTR_LEN;
+
+                       if (data->event_id == WS_EVENT_PROV_DISC_PBC_REQ) {
+                               data->wps_mode = WFD_OEM_WPS_MODE_PBC;
+                       } else if (data->event_id == WS_EVENT_PROV_DISC_ENTER_PIN) {
+                               data->wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
+                       } else if (data->event_id == WS_EVENT_PROV_DISC_SHOW_PIN) {
+                               data->wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
+                               strncpy(data->wps_pin, info_str, OEM_PINSTR_LEN);
+                               data->wps_pin[OEM_PINSTR_LEN] = '\0';
+                               info_str += OEM_PINSTR_LEN +1;
+                       }
+
+                       data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+
+               }
+               break;
+       case WS_EVENT_DEVICE_LOST:
+               {
+                       char *temp_mac = NULL;
+                       res = _extract_value_str(info_str, "p2p_dev_addr", &temp_mac);
+                       if (res < 0) {
+                               WDP_LOGE("Failed to extract device address");
+                               break;
+                       }
+                       _ws_txt_to_mac(temp_mac, data->dev_addr);
+                       if (temp_mac)
+                               free(temp_mac);
+                       data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+               }
+               break;
+       case WS_EVENT_FIND_STOPED:
+               break;
+       case WS_EVENT_GO_NEG_REQUEST:
+               {
+                       _ws_txt_to_mac(info_str, data->dev_addr);
+                       info_str += OEM_MACSTR_LEN;
+
+                       if (!strlen(info_str)) {
+                               WDP_LOGD("Nothing to parse anymore");
+                               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+                               break;
+                       }
+
+                       wfd_oem_conn_data_s *edata = NULL;
+                       edata = _convert_msg_to_conn_info(info_str);
+                       if (!edata) {
+                               WDP_LOGE("Failed to convert information string to connection data");
+                               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+                               break;
+                       }
+                       data->edata_type = WFD_OEM_EDATA_TYPE_CONN;
+                       data->edata = (void*) edata;
+
+               }
+               break;
+       case WS_EVENT_GO_NEG_FAILURE:
+       case WS_EVENT_WPS_FAIL:         // M_id(msg), error(config_error)
+               break;
+       case WS_EVENT_GROUP_FORMATION_FAILURE:  // No incofmation sring
+       case WS_EVENT_GO_NEG_SUCCESS:
+       case WS_EVENT_WPS_SUCCESS:
+       case WS_EVENT_GROUP_FORMATION_SUCCESS:
+               /* No information string */
+               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+               break;
+       case WS_EVENT_WPS_REG_SUCCESS:  // "intf_addr"
+               /* Interface address of peer will come up */
+               break;
+       case WS_EVENT_CONNECTED:        // intf_addr(to)
+       case WS_EVENT_DISCONNECTED:
+               {
+                       /* Interface address of connected peer will come up */
+                       char *temp_mac = NULL;
+                       res = _extract_value_str(info_str, "to", &temp_mac);
+                       if (res < 0) {
+                               WDP_LOGE("Failed to extract interface address");
+                               break;
+                       }
+                       _ws_txt_to_mac(temp_mac, data->intf_addr);
+                       if (temp_mac)
+                               free(temp_mac);
+                       data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+               }
+               break;
+       case WS_EVENT_STA_CONNECTED:    // "intf_addr", dev_addr(dev_addr)
+       case WS_EVENT_STA_DISCONNECTED:
+               {
+                       /* Interface address of connected peer will come up */
+                       _ws_txt_to_mac(info_str, data->intf_addr);
+
+                       char *temp_mac = NULL;
+                       res = _extract_value_str(info_str, "p2p_dev_addr", &temp_mac);
+                       if (res < 0) {
+                               WDP_LOGE("Failed to extract interface address");
+                               break;
+                       }
+                       _ws_txt_to_mac(temp_mac, data->dev_addr);
+                       if (temp_mac)
+                               free(temp_mac);
+                       data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+               }
+               break;
+       case WS_EVENT_INVITATION_RECEIVED:
+       case WS_EVENT_INVITATION_RESULT:
+               {
+                       char *peer_addr_str = NULL;
+                       res = _extract_value_str(info_str, "sa", &peer_addr_str);
+                       if (res == 17/*(OEM_MACSTR_LEN-1)*/) {
+                               _ws_txt_to_mac(peer_addr_str, data->dev_addr);
+                               if (peer_addr_str)
+                                       free(peer_addr_str);
+                       } else if (res < 0) {
+                               WDP_LOGE("Failed to extract source address");
+                       } else {
+                               WDP_LOGE("Wrong source address");
+                               free(peer_addr_str);
+                       }
+
+                       if (!strlen(info_str)) {
+                               WDP_LOGD("Nothing to parse anymore");
+                               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+                               break;
+                       }
+
+                       wfd_oem_invite_data_s* edata = NULL;
+                       edata = _convert_msg_to_invite_info(info_str);
+                       if (!edata) {
+                               WDP_LOGE("Failed to convert information string to invite data");
+                               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+                               break;
+                       }
+
+                       data->edata_type = WFD_OEM_EDATA_TYPE_INVITE;
+                       data->edata = (void*) edata;
+
+               }
+               break;
+       case WS_EVENT_GROUP_STARTED:
+       case WS_EVENT_GROUP_REMOVED:
+               {
+                       char *ifname_str = NULL;
+                       res = _extract_word(info_str, &ifname_str);
+                       if (res < 0) {
+                               WDP_LOGE("Failed to extract event param string");
+                       } else if (res == 0) {
+                               WDP_LOGE("Nothing extracted");
+                               if (ifname_str)
+                                       free(ifname_str);
+                       } else {
+                               if (!ifname_str) {
+                                       WDP_LOGE("Parsing error(interface name)");
+                                       return -1;
+                               }
+                               strncpy(data->ifname, ifname_str, OEM_IFACE_NAME_LEN);
+                               data->ifname[OEM_IFACE_NAME_LEN] = '\0';
+
+                               info_str += strlen(ifname_str) + 1;
+                               if (ifname_str)
+                                       free(ifname_str);
+                       }
+
+                       char *dev_role_str = NULL;
+                       res = _extract_word(info_str, &dev_role_str);
+                       if (res < 0) {
+                               WDP_LOGE("Failed to extract event param string");
+                       } else if (res == 0) {
+                               WDP_LOGE("Nothing extracted");
+                               if (dev_role_str)
+                                       free(dev_role_str);
+                       } else {
+                               if (!dev_role_str) {
+                                       WDP_LOGE("Parsing error(device role)");
+                                       return -1;
+                               }
+                               if (!strncmp(dev_role_str, "GO", 2))
+                                       data->dev_role = WFD_OEM_DEV_ROLE_GO;
+                               else if (!strncmp(dev_role_str, "client", 6))
+                                       data->dev_role = WFD_OEM_DEV_ROLE_GC;
+                               else
+                                       WDP_LOGE("Unknown device role [%s]", dev_role_str);
+
+                               info_str += strlen(dev_role_str) + 1;
+                               if (dev_role_str)
+                                       free(dev_role_str);
+                       }
+
+                       if (!strlen(info_str)) {
+                               WDP_LOGD("Nothing to parse anymore");
+                               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+                               break;
+                       }
+
+                       wfd_oem_group_data_s* edata = NULL;
+                       edata= _convert_msg_to_group_info(info_str);
+                       if (!edata) {
+                               WDP_LOGE("Failed to convert information string to group data");
+                               data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
+                               break;
+                       }
+
+                       data->edata_type = WFD_OEM_EDATA_TYPE_GROUP;
+                       data->edata = (void*) edata;
+
+               }
+               break;
+       default:
+               WDP_LOGE("Unknown event");
+               break;
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static gboolean ws_event_handler(GIOChannel *source,
+                                                               GIOCondition condition,
+                                                               gpointer data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s * sd = (ws_sock_data_s*) data;
+       char msg[1024] = {0, };
+       char *param;
+       int event_id = -1;
+       wfd_oem_event_s *event = NULL;
+       int res = 0;
+
+       if (!sd) {
+               WDP_LOGE("Invalid parameter");
+               // TODO: if error count is more than 10, disconnect this interface and reset sock data
+               return FALSE;
+       }
+
+       res = _ws_read_sock(sd->mon_sock, msg, sizeof(msg));
+       if (res < 0) {
+               WDP_LOGE("Failed to read socket. [%d]", sd->mon_sock);
+               return FALSE;
+       }
+
+       errno = 0;
+       event = (wfd_oem_event_s*) calloc(1, sizeof(wfd_oem_event_s));
+       if (!event) {
+               WDP_LOGE("Failed to allocate memory for event. [%s]", strerror(errno));
+               return FALSE;
+       }
+
+       param = &msg[3];
+       res = _parsing_event_info(sd->ifname, param, event);
+       if (res < 0) {
+               WDP_LOGE("Failed to parse event string");
+               free(event);
+               return FALSE;
+       }
+
+       if (res == 1) {
+               // This means event->event_data is NULL
+       }
+
+       switch (event->event_id) {
+       case WS_EVENT_DEVICE_FOUND:
+               event_id = WFD_OEM_EVENT_PEER_FOUND;
+               break;
+       case WS_EVENT_DEVICE_LOST:
+               event_id = WFD_OEM_EVENT_PEER_DISAPPEARED;
+               break;
+       case WS_EVENT_FIND_STOPED:
+               event_id = WFD_OEM_EVENT_DISCOVER_FINISHED;
+               break;
+       case WS_EVENT_PROV_DISC_PBC_REQ:
+               event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
+               ws_stop_scan();
+               break;
+       case WS_EVENT_PROV_DISC_PBC_RESP:
+               event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
+               ws_stop_scan();
+               break;
+       case WS_EVENT_PROV_DISC_SHOW_PIN:
+               event_id = WFD_OEM_EVENT_PROV_DISC_DISPLAY;
+               ws_stop_scan();
+               break;
+       case WS_EVENT_PROV_DISC_ENTER_PIN:
+               event_id = WFD_OEM_EVENT_PROV_DISC_KEYPAD;
+               ws_stop_scan();
+               break;
+       case WS_EVENT_GO_NEG_REQUEST:
+               event_id = WFD_OEM_EVENT_GO_NEG_REQ;
+               break;
+       case WS_EVENT_GO_NEG_FAILURE:
+               event_id = WFD_OEM_EVENT_GO_NEG_FAIL;
+               _ws_cancel();
+               _ws_flush();
+               break;
+       case WS_EVENT_GO_NEG_SUCCESS:
+               event_id = WFD_OEM_EVENT_GO_NEG_DONE;
+               break;
+       case WS_EVENT_WPS_FAIL:
+       case WS_EVENT_GROUP_FORMATION_FAILURE:
+               event_id = WFD_OEM_EVENT_WPS_FAIL;
+               break;
+       case WS_EVENT_WPS_SUCCESS:
+       case WS_EVENT_WPS_REG_SUCCESS:
+       case WS_EVENT_GROUP_FORMATION_SUCCESS:
+               event_id = WFD_OEM_EVENT_WPS_DONE;
+               // TODO: connect to supplicant via group interface
+               break;
+       case WS_EVENT_CONNECTED:
+               event_id = WFD_OEM_EVENT_CONNECTED;
+               break;
+       case WS_EVENT_STA_CONNECTED:
+               event_id = WFD_OEM_EVENT_STA_CONNECTED;
+               break;
+       case WS_EVENT_GROUP_STARTED:
+               event_id = WFD_OEM_EVENT_GROUP_CREATED;
+               res = _connect_to_supplicant(GROUP_IFACE_NAME, &g_pd->group);
+               if (res < 0) {
+                       WDP_LOGE("Failed to connect to group interface of supplicant");
+                       goto done;
+               }
+               break;
+       case WS_EVENT_GROUP_REMOVED:
+               event_id = WFD_OEM_EVENT_GROUP_DESTROYED;
+               if (g_pd->group) {
+                       res = _disconnect_from_supplicant(GROUP_IFACE_NAME, g_pd->group);
+                       if (res < 0)
+                               WDP_LOGE("Failed to disconnect from group interface of supplicant");
+                       g_pd->group = NULL;
+               }
+               break;
+       case WS_EVENT_INVITATION_RECEIVED:
+               {
+                       wfd_oem_invite_data_s* edata = NULL;
+                       edata = (wfd_oem_invite_data_s*) event->edata;
+                       event_id = WFD_OEM_EVENT_INVITATION_REQ;
+                       ws_restart_scan(edata->listen);
+               }
+               break;
+       case WS_EVENT_INVITATION_RESULT:
+               event_id = WFD_OEM_EVENT_INVITATION_RES;
+               break;
+       case WS_EVENT_DISCONNECTED:
+               event_id = WFD_OEM_EVENT_DISCONNECTED;
+               break;
+       case WS_EVENT_STA_DISCONNECTED:
+               event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
+               break;
+       case WS_EVENT_TERMINATING:
+               event_id = WFD_OEM_EVENT_TERMINATING;
+               break;
+       default:
+               WDP_LOGD("Unknown event [%d]", event->event_id);
+               goto done;
+               break;
+       }
+       event->event_id = event_id;
+       g_pd->callback(g_pd->user_data, event);
+
+done:
+       if (event->edata)
+               free(event->edata);
+       free(event);
+
+       __WDP_LOG_FUNC_EXIT__;
+       return TRUE;
+}
+
+static int _ws_reset_plugin(ws_plugin_data_s *pd)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       if (!pd) {
+               WDP_LOGE("Invalid parameter");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (pd->activated)
+               ws_deactivate();
+
+       free(pd);
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_init(wfd_oem_event_cb callback, void *user_data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       if (g_pd)
+               _ws_reset_plugin(g_pd);
+
+       errno = 0;
+       g_pd = (ws_plugin_data_s*) calloc(1, sizeof(ws_plugin_data_s));
+       if (!g_pd) {
+               WDP_LOGE("Failed to allocate memory for plugin data. [%s]", strerror(errno));
+               return -1;
+       }
+
+       g_pd->callback = callback;
+       g_pd->user_data = user_data;
+       g_pd->initialized = TRUE;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_deinit()
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       if (g_pd) {
+               _ws_reset_plugin(g_pd);
+               g_pd = NULL;
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_activate()
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int global_sock = -1;
+       int res = 0;
+       char cmd[128] = {0, };
+       char reply[1024] = {0, };
+
+       /* load wlan driver and wpa_supplicant */
+       system("/usr/bin/wlan.sh p2p");
+       system("/usr/sbin/p2p_supp.sh start");
+
+       global_sock = _create_ctrl_intf(GLOBAL_INTF_PATH, SUPPL_GLOBAL_INTF_PATH);
+       if (global_sock < SOCK_FD_MIN) {
+               WDP_LOGE("Failed to create global socket");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to create global socket. [%d]", global_sock);
+
+       res = _ws_send_cmd(global_sock, WS_CMD_INTERFACES, reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (!strstr(reply, COMMON_IFACE_NAME)){
+               memset(cmd, 0x0, 128);
+               memset(reply, 0x0, 1024);
+
+               snprintf(cmd, sizeof(cmd), WS_CMD_INTERFACE_ADD "%s%s",
+                               COMMON_IFACE_NAME, "\t/usr/etc/wifi-direct/p2p_supp.conf\tnl80211\t/var/run/wpa_supplicant");
+               res = _ws_send_cmd(global_sock, cmd, reply, sizeof(reply));
+               if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       close(global_sock);
+                       system("/usr/sbin/p2p_supp.sh stop");
+                       system("/usr/bin/wlan.sh stop");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+               }
+
+               if (strstr(reply, "FAIL")) {
+                       WDP_LOGE("Failed to create %s interface", COMMON_IFACE_NAME);
+                       close(global_sock);
+                       system("/usr/sbin/p2p_supp.sh stop");
+                       system("/usr/bin/wlan.sh stop");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+               }
+               WDP_LOGD("Succeeded to create %s interface", COMMON_IFACE_NAME);
+       }
+       WDP_LOGD("%s interface exist", COMMON_IFACE_NAME);
+
+       res = _connect_to_supplicant(COMMON_IFACE_NAME, &g_pd->common);
+       if (res < 0) {
+               close(global_sock);
+               system("/usr/sbin/p2p_supp.sh stop");
+               system("/usr/bin/wlan.sh stop");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_pd->global_sock = global_sock;
+       g_pd->activated = TRUE;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_deactivate()
+{
+       __WDP_LOG_FUNC_ENTER__;
+       char cmd[32] = {0, };
+       char reply[1024]={0,};
+       int res = 0;
+       char ifname[OEM_IFACE_NAME_LEN];
+
+       if (!g_pd->activated) {
+               WDP_LOGE("Wi-Fi Direct is not activated");
+               return -1;
+       }
+
+       if (g_pd->group) {
+               _disconnect_from_supplicant(GROUP_IFACE_NAME, g_pd->group);
+               g_pd->group = NULL;
+       }
+
+       res = _disconnect_from_supplicant("wlan0", g_pd->common);
+       if (res < 0)
+               WDP_LOGE("Failed to disconnect common interface(%s) from supplicant. ", ifname);
+       g_pd->common = NULL;
+
+       // terminate wpasupplicant
+       snprintf(cmd, sizeof(cmd), WS_CMD_TERMINATE);
+       res = _ws_send_cmd(g_pd->global_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               system("/usr/sbin/p2p_supp.sh stop");
+               goto done;
+       }
+
+       if (!strncmp(reply, "FAIL", 4)) {
+               WDP_LOGE("Failed to terminate wpa_supplicant");
+               system("/usr/sbin/p2p_supp.sh stop");
+       }
+
+done:
+       unlink(GLOBAL_INTF_PATH);
+       if (g_pd->global_sock >= SOCK_FD_MIN)
+               close(g_pd->global_sock);
+       g_pd->global_sock = -1;
+
+       system("/usr/bin/wlan.sh stop");
+       g_pd->activated = FALSE;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_start_scan(wfd_oem_scan_param_s *param)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[32] = {0, };
+       char reply[1024] = {0, };
+       char time_str[4] = {0, };
+       int res = 0;
+
+       if (!param) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       if (param->refresh)
+               _ws_flush();
+
+       if (param->scan_time)
+               snprintf(time_str, 4, " %d", param->scan_time);
+
+       if (param->scan_mode == WFD_OEM_SCAN_MODE_ACTIVE)
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_FIND "%s", (param->scan_time > 0) ? time_str : "");
+       else
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_LISTEN);
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to start scan");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to start scan");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_restart_scan(int freq)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[32] = {0, };
+       char reply[1024] = {0, };
+       int res = 0;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       if (freq)
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_FIND " 2 freq=%d", freq);
+       else
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_FIND " 2");
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to start scan");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to start scan");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_stop_scan()
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char reply[1024] = {0, };
+       int res = 0;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       res = _ws_send_cmd(sock->ctrl_sock, WS_CMD_P2P_STOP_FIND, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to stop scan");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to stop scan");
+
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_visibility(int *visibility)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_set_visibility(int visibility)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_scan_result(GList **peers, int *peer_count)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[32] = {0, };
+       char reply[1024] = {0,};
+       wfd_oem_device_s *peer = NULL;
+       int res = 0;
+
+       if (!peers || !peer_count) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_P2P_PEER_FIRST);
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to get first peer info");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to get first peer info");
+
+       peer = (wfd_oem_device_s *) calloc(1, sizeof(wfd_oem_device_s));
+
+       res = _parsing_peer_info(reply, peer);
+       if (res < 0) {
+                       WDP_LOGE("Failed to parsing peer info");
+                       free(peer);
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       *peers = g_list_prepend(*peers, peer);
+
+       do {
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_PEER_NEXT MACSTR, MAC2STR(peer->dev_addr));
+               res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+               if (res < 0) {
+                               WDP_LOGE("Failed to send command to wpa_supplicant");
+                               break;
+               }
+
+               if (strstr(reply, "FAIL")) {
+                       WDP_LOGE("Failed to get first peer info");
+                       break;
+               }
+               WDP_LOGD("Succeeded to get first peer info");
+
+               peer = (wfd_oem_device_s *) calloc(1, sizeof(wfd_oem_device_s));
+
+               res = _parsing_peer_info(reply, peer);
+               if (res < 0) {
+                       WDP_LOGE("Failed to parsing peer info");
+                       free(peer);
+                       break;
+               }
+
+               *peers = g_list_prepend(*peers, peer);
+       } while(1);
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[32] = {0, };
+       char reply[1024] = {0,};
+       wfd_oem_device_s *ws_dev = NULL;
+       int res = 0;
+
+       if (!peer_addr || !peer) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_P2P_PEER MACSTR, MAC2STR(peer_addr));
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to get peer info [" MACSTR "]", MAC2STR(peer_addr));
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to get peer info [" MACSTR "]", MAC2STR(peer_addr));
+
+       ws_dev = (wfd_oem_device_s*) calloc(1, sizeof(wfd_oem_device_s));
+
+       // TODO: parsing peer info
+       res = _parsing_peer_info(reply, ws_dev);
+       if (res < 0) {
+               WDP_LOGE("Failed to parsing peer info");
+               free(ws_dev);
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *peer = ws_dev;
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[64] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       ws_stop_scan();
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_P2P_PROV_DISC MACSTR "%s",
+                                                       MAC2STR(peer_addr), _ws_wps_to_txt(wps_mode));
+
+       if (join)
+               strncat(cmd, WS_STR_JOIN, 5);
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to send provision discovery to peer[" MACSTR "]", MAC2STR(peer_addr));
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to send provision discovery to peer[" MACSTR "]", MAC2STR(peer_addr));
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_connect(unsigned char *peer_addr, wfd_oem_conn_param_s *param)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[64] = {0, };
+       char reply[1024] = {0, };
+       int res = 0;
+
+       if (!peer_addr) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       if (param->wps_pin[0] != '\0')
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_CONNECT MACSTR " %s%s" ,
+                                                       MAC2STR(peer_addr), param->wps_pin,
+                                                       _ws_wps_to_txt(param->wps_mode));
+       else
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_CONNECT MACSTR "%s",
+                                                       MAC2STR(peer_addr),
+                                                       _ws_wps_to_txt(param->wps_mode));
+
+       if (param->conn_flags & WFD_OEM_CONN_TYPE_JOIN)
+               strncat(cmd, WS_STR_JOIN, 5);
+       else if (param->conn_flags& WFD_OEM_CONN_TYPE_AUTH)
+               strncat(cmd, WS_STR_AUTH, 5);
+
+       if (param->conn_flags & WFD_OEM_CONN_TYPE_PERSISTENT)
+               strncat(cmd, WS_STR_PERSISTENT, 11);
+
+       WDP_LOGI("Connection command [%s]", cmd);
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to connect with peer[" MACSTR "]", MAC2STR(peer_addr));
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(peer_addr));
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_disconnect(unsigned char *peer_addr)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[32] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_P2P_GROUP_REMOVE "%s", GROUP_IFACE_NAME);
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to disconnect with peer[" MACSTR "]", MAC2STR(peer_addr));
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to send disconnection command to peer[" MACSTR "]", MAC2STR(peer_addr));
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_reject_connection(unsigned char *peer_addr)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[40] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_P2P_REJECT MACSTR, MAC2STR(peer_addr));
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to reject connection with peer[" MACSTR "]", MAC2STR(peer_addr));
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to send reject connection command to peer[" MACSTR "]", MAC2STR(peer_addr));
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_cancel_connection(unsigned char *peer_addr)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       _ws_cancel();
+       _ws_flush();
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_connected_peers(GList **peers, int *peer_count)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_pin(char *pin)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_set_pin(char *pin)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_supported_wps_mode()
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_create_group(int persistent, int freq)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[44] = {0, };
+       char reply[1024]={0,};
+       int res = 0;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       if (persistent)
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_GROUP_ADD WS_STR_PERSISTENT);
+       else
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_GROUP_ADD WS_STR_FREQ_2G);
+
+       // TODO: add frequency option
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to add group");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to add group");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_destroy_group(const char *ifname)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[32] = {0, };
+       char reply[1024]={0,};
+       int res = 0;
+
+       if (!ifname) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_P2P_GROUP_REMOVE "%s", ifname);
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to remove group");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to remove group");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->group;
+       char cmd[128] = {0, };
+       char reply[1024]={0,};
+       int res = 0;
+
+       if (!peer_addr || !param) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Group interface not connected");
+               return -1;
+       }
+
+       WDP_LOGD("Invite: Peer[" MACSTR "], GO Addr[" MACSTR "]", MAC2STR(peer_addr), MAC2STR(param->go_dev_addr));
+
+       if (param->net_id)
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_INVITE "persistent=%d peer=" MACSTR " go_dev_addr=" MACSTR,
+                                                               param->net_id, MAC2STR(peer_addr),
+                                                               MAC2STR(param->go_dev_addr));
+       else
+               snprintf(cmd, sizeof(cmd), WS_CMD_P2P_INVITE "group=%s peer=" MACSTR " go_dev_addr=" MACSTR,
+                                                               param->ifname, MAC2STR(peer_addr),
+                                                               MAC2STR(param->go_dev_addr));
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to invite peer");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to invite peer");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+// Only group owner can use this command
+int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->group;
+       char cmd[40] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       if (!peer_addr || !pin) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Group interface not connected");
+               return -1;
+       }
+
+       if (wps_mode == WFD_OEM_WPS_MODE_PBC)
+               snprintf(cmd, sizeof(cmd), WS_CMD_WPS_PBC "p2p_dev_addr=" MACSTR, MAC2STR(peer_addr));
+       else
+               snprintf(cmd, sizeof(cmd), WS_CMD_WPS_PIN MACSTR " %s", MAC2STR(peer_addr), pin);
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd,reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to start WPS");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to start WPS");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[64] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       if (!peer_addr || !pin) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       if (wps_mode == WFD_OEM_WPS_MODE_PBC)
+               snprintf(cmd, sizeof(cmd), WS_CMD_WPS_ENROLLEE MACSTR "%s",
+                                       MAC2STR(peer_addr), _ws_wps_to_txt(wps_mode));
+       else
+               snprintf(cmd, sizeof(cmd), WS_CMD_WPS_ENROLLEE MACSTR " %s%s",
+                                       MAC2STR(peer_addr), pin, _ws_wps_to_txt(wps_mode));
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd,reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to start WPS");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to start WPS");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_dev_name(char *dev_name)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_set_dev_name(char *dev_name)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[128] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       if (!dev_name || !strlen(dev_name)) {
+               WDP_LOGE( "Invalid parameter");
+               __WDP_LOG_FUNC_EXIT__;
+               return 1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_SET "device_name %s", dev_name);
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, (char*) reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to set device name");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to set device name");
+
+       memset(cmd, 0x0, 128);
+       memset(reply, 0x0, 1024);
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_SET "p2p_ssid_postfix %s", dev_name);
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, (char*) reply, sizeof(reply));
+       if (res < 0) {
+                       WDP_LOGE("Failed to send command to wpa_supplicant");
+                       __WDP_LOG_FUNC_EXIT__;
+                       return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to set SSID postfix");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to set SSID postfix");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_dev_mac(char *dev_mac)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_set_dev_type(int pri_dev_type, int sec_dev_type)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_go_intent(int *go_intent)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[80] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       if (go_intent == NULL)
+       {
+               WDP_LOGE("p2p_go_intent is NULL");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_GET "p2p_go_intent");
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, (char*) reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to set go intent");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *go_intent = atoi(reply);
+       WDP_LOGD("Succeeded to get go intent(%d)", *go_intent);
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_set_go_intent(int go_intent)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[80] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), WS_CMD_SET "p2p_go_intent %d", go_intent);
+
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, (char*) reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to set go intent");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to set go intent(%d)", go_intent);
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int _parsing_networks(char* buf, ws_network_info_s networks[], int *network_cnt)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       char *ptr = buf;
+       int count = 0;
+       char *tmp_str = NULL;
+       int res = 0;
+
+       // Passing first line : "network id / ssid / bssid / flags"
+       while (*ptr != '\n') {
+               ptr++;
+       }
+       ptr++;
+
+       count = 0;
+       while(*ptr != '\0') {
+               res = _extract_word(ptr, &tmp_str);
+               if (res > 0) {
+                       networks[count].network_id = atoi(tmp_str);
+                       free(tmp_str);
+                       tmp_str = NULL;
+                       ptr += res;
+               }
+               ptr++;
+
+               res = _extract_word(ptr, &tmp_str);
+               if (res > 0) {
+                       snprintf(networks[count].ssid, WS_SSID_LEN, tmp_str);
+                       free(tmp_str);
+                       tmp_str = NULL;
+                       ptr += res;
+               }
+               ptr++;
+
+               res = _extract_word(ptr, &tmp_str);
+               if (res > 0) {
+                       _ws_txt_to_mac(tmp_str, networks[count].bssid);
+                       free(tmp_str);
+                       tmp_str = NULL;
+                       ptr += res;
+               }
+               ptr++;
+
+               res = _extract_word(ptr, &tmp_str);
+               if (res > 0) {
+                       if (strstr(tmp_str, "CURRENT"))
+                               networks[count].flags |= WFD_OEM_NETFLAG_CURRENT;
+                       if (strstr(tmp_str, "DISABLED"))
+                               networks[count].flags |= WFD_OEM_NETFLAG_DISABLED;
+                       if (strstr(tmp_str, "TEMP-DISABLED"))
+                               networks[count].flags |= WFD_OEM_NETFLAG_TEMP_DISABLED;
+                       if (strstr(tmp_str, "P2P-PERSISTENT"))
+                               networks[count].flags |= WFD_OEM_NETFLAG_P2P_PERSISTENT;
+                       free(tmp_str);
+                       tmp_str = NULL;
+                       ptr += res;
+               }
+               ptr++;
+
+               count++;
+       }
+
+       *network_cnt = count;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[80] = {0, };
+       char reply[1024]={0,};
+       ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
+       wfd_oem_persistent_group_s *wfd_persistent_groups = NULL;
+       int res;
+       int i, cnt;
+
+       if (!groups || !group_count) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       memset(networks, 0, (sizeof(ws_network_info_s) * WS_MAX_PERSISTENT_COUNT));
+
+       /* Reading lists the configured networks, including stored information for persistent groups.
+       The identifier in this is used with p2p_group_add and p2p_invite to indicate witch persistent
+       group is to be reinvoked. */
+       snprintf(cmd, sizeof(cmd), WS_CMD_LIST_NETWORKS);
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, (char*) reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to get list of networks");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to get list of networks");
+
+       _parsing_networks(reply, networks, &cnt);
+       WDP_LOGD("Persistent Group Count=%d", cnt);
+       if (cnt > WS_MAX_PERSISTENT_COUNT) {
+               WDP_LOGE("Persistent group count exceeded or parsing error");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       wfd_persistent_groups = (wfd_oem_persistent_group_s*) calloc(1, cnt * sizeof(wfd_oem_persistent_group_s));
+       for(i = 0; i < cnt; i++) {
+               WDP_LOGD("----persistent group [%d]----", i);
+               WDP_LOGD("network_id=%d", networks[i].network_id);
+               WDP_LOGD("ssid=%s", networks[i].ssid);
+               WDP_LOGD("bssid=" MACSTR, MAC2STR(networks[i].bssid));
+               WDP_LOGD("flags=%x", networks[i].flags);
+
+               wfd_persistent_groups[i].network_id = networks[i].network_id;
+               strncpy(wfd_persistent_groups[i].ssid, networks[i].ssid, WS_SSID_LEN);
+               wfd_persistent_groups[i].ssid[WS_SSID_LEN] = '\0';
+               memcpy(wfd_persistent_groups[i].go_mac_address, networks[i].bssid, WS_MACADDR_LEN);
+       }
+
+       *group_count = cnt;
+       *groups = wfd_persistent_groups;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_remove_persistent_group(char *ssid, unsigned char *bssid)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[80] = {0, };
+       char reply[1024]={0,};
+       int res;
+       int i;
+       ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
+       int network_count;
+
+       if (!ssid || !bssid) {
+               WDP_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       memset(networks, 0, (sizeof(ws_network_info_s) * WS_MAX_PERSISTENT_COUNT));
+
+       strncpy(cmd, WS_CMD_LIST_NETWORKS, sizeof(cmd));
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, (char*) reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to get list of networks");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to get list of networks");
+
+       _parsing_networks(reply, networks, &network_count);
+
+       for(i=0;i<network_count;i++) {
+               WDP_LOGD("----persistent group [%d]----", i);
+               WDP_LOGD("network_id=%d", networks[i].network_id);
+               WDP_LOGD("ssid=%s", networks[i].ssid);
+               WDP_LOGD("bssid=" MACSTR, MAC2STR(networks[i].bssid));
+               WDP_LOGD("flags=%x", networks[i].flags);
+
+               if (!memcmp(bssid, networks[i].bssid, WS_MACADDR_LEN) && !strcmp(ssid, networks[i].ssid)) {
+
+                       WDP_LOGD("Persistent group found [%d: %s]", networks[i].network_id, ssid);
+
+                       memset(cmd, 0x0, sizeof(cmd));
+                       memset(reply, 0x0, sizeof(reply));
+
+                       snprintf(cmd, sizeof(cmd), WS_CMD_REMOVE_NETWORK " %d", networks[i].network_id);
+                       res = _ws_send_cmd(sock->ctrl_sock, cmd, (char*) reply, sizeof(reply));
+                       if (res < 0) {
+                               WDP_LOGE("Failed to send command to wpa_supplicant");
+                               __WDP_LOG_FUNC_EXIT__;
+                               return -1;
+                       }
+
+                       if (strstr(reply, "FAIL")) {
+                               WDP_LOGE("Failed to remove persistent group");
+                               __WDP_LOG_FUNC_EXIT__;
+                               return -1;
+                       }
+                       WDP_LOGD("Succeeded to remove persistent group");
+
+                       break;
+               }
+       }
+
+       if (i == network_count) {
+               WDP_LOGE("Persistent group not found [%s]", ssid);
+               return -1;
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       ws_sock_data_s *sock = g_pd->common;
+       char cmd[80] = {0, };
+       char reply[1024]={0,};
+       int res;
+
+       if (!sock) {
+               WDP_LOGE("Socket is NULL");
+               return -1;
+       }
+
+       snprintf(cmd, sizeof(cmd), "%s persistent_reconnect %d", WS_CMD_SET, reconnect);
+       res = _ws_send_cmd(sock->ctrl_sock, cmd, (char*) reply, sizeof(reply));
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (strstr(reply, "FAIL")) {
+               WDP_LOGE("Failed to register WFDS service");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDP_LOGD("Succeeded to register WFDS service");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
diff --git a/plugin/wpasupplicant/wfd-plugin-wpasupplicant.h b/plugin/wpasupplicant/wfd-plugin-wpasupplicant.h
new file mode 100644 (file)
index 0000000..d4c692a
--- /dev/null
@@ -0,0 +1,487 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct wpasupplicant plugin functions and structures.
+ *
+ * @file               wfd-plugin-wpasupplicant.h
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#ifndef __WFD_PLUGIN_WPASUPPLICANT_H__
+#define __WFD_PLUGIN_WPASUPPLICANT_H__
+
+
+#ifdef USE_DLOG
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "WIFI_DIRECT_PLUGIN"
+
+#define WDP_LOGV(format, args...) LOGV(format, ##args)
+#define WDP_LOGD(format, args...) LOGD(format, ##args)
+#define WDP_LOGI(format, args...) LOGI(format, ##args)
+#define WDP_LOGW(format, args...) LOGW(format, ##args)
+#define WDP_LOGE(format, args...) LOGE(format, ##args)
+#define WDP_LOGF(format, args...) LOGF(format, ##args)
+
+#define __WDP_LOG_FUNC_ENTER__ LOGV("Enter")
+#define __WDP_LOG_FUNC_EXIT__ LOGV("Quit")
+
+#else /* USE_DLOG */
+
+#define WDP_LOGV(format, args...)
+#define WDP_LOGD(format, args...)
+#define WDP_LOGI(format, args...)
+#define WDP_LOGW(format, args...)
+#define WDP_LOGE(format, args...)
+#define WDP_LOGF(format, args...)
+
+#define __WDP_LOG_FUNC_ENTER__
+#define __WDP_LOG_FUNC_EXIT__
+
+#endif /* USE_DLOG */
+
+#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
+#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
+
+#define GLOBAL_INTF_PATH "/tmp/wpa_ctrl_global"
+#define SUPPL_GLOBAL_INTF_PATH "/var/run/wpa_global"
+#define SUPPL_IFACE_PATH "/var/run/wpa_supplicant/"
+#define SOCK_FD_MIN 3
+
+#define COMMON_IFACE_NAME "wlan0"
+#define GROUP_IFACE_NAME "p2p-wlan0-0"
+
+#define WS_POLL_TIMEOUT 5000
+#define WS_CONN_RETRY_COUNT 10
+#define WS_PINSTR_LEN 8
+#define WS_DEVTYPESTR_LEN 14
+#define WS_SSID_LEN 32
+#define WS_MACSTR_LEN 18
+#define WS_MACADDR_LEN 6
+#define WS_NETFLAG_LEN 32
+#define WS_MAX_PERSISTENT_COUNT 20
+
+/* Config Method bitmap */
+#define WS_CONFIG_METHOD_DISPLAY 0x0008
+#define WS_CONFIG_METHOD_PUSHBUTTON 0x0080
+#define WS_CONFIG_METHOD_KEYPAD 0x0100
+
+/* wpa_supplicant command */
+#define WS_CMD_INTERFACES "INTERFACES"
+#define WS_CMD_INTERFACE_ADD "INTERFACE_ADD "
+#define WS_CMD_INTERFACE_REMOVE "INTERFACE_REMOVE"
+#define WS_CMD_ATTACH "ATTACH"
+#define WS_CMD_DETACH "DETACH"
+#define WS_CMD_P2P_FIND "P2P_FIND"
+#define WS_CMD_P2P_LISTEN "P2P_LISTEN"
+#define WS_CMD_P2P_STOP_FIND "P2P_STOP_FIND"
+#define WS_CMD_P2P_FLUSH "P2P_FLUSH"
+#define WS_CMD_P2P_CANCEL "P2P_CANCEL"
+#define WS_CMD_P2P_PEER "P2P_PEER "
+#define WS_CMD_P2P_PEER_FIRST "P2P_PEER FIRST"
+#define WS_CMD_P2P_PEER_NEXT "P2P_PEER NEXT-"
+#define WS_CMD_P2P_PROV_DISC "P2P_PROV_DISC "
+#define WS_CMD_P2P_INVITE "P2P_INVITE "
+#define WS_CMD_P2P_GROUP_ADD "P2P_GROUP_ADD"
+#define WS_CMD_P2P_GROUP_REMOVE "P2P_GROUP_REMOVE "
+#define WS_CMD_P2P_CONNECT "P2P_CONNECT "
+#define WS_CMD_P2P_REJECT "P2P_REJECT_CONNECTION "
+#define WS_CMD_WPS_PBC "WPS_PBC "
+#define WS_CMD_WPS_PIN "WPS_PIN "
+#define WS_CMD_WPS_ENROLLEE "WPS_ENROLLEE "
+#define WS_CMD_SET "SET "
+#define WS_CMD_GET "GET "
+#define WS_CMD_STATUS "STATUS"
+#define WS_CMD_STATUS_P2P "STATUS P2P"
+#define WS_CMD_LOG_LEVEL "LOG_LEVEL"
+#define WS_CMD_QUIT "QUIT"
+#define WS_CMD_TERMINATE "TERMINATE"
+#define WS_CMD_LIST_NETWORKS "LIST_NETWORKS"
+#define WS_CMD_REMOVE_NETWORK "REMOVE_NETWORK"
+
+#define WS_STR_PBC " pbc"
+#define WS_STR_DISPLAY " display"
+#define WS_STR_KEYPAD " keypad"
+#define WS_STR_JOIN " join"
+#define WS_STR_AUTH " auth"
+#define WS_STR_PERSISTENT " persistent"
+#define WS_STR_FREQ_2G " freq=2"
+
+typedef enum {
+       WS_IFTYPE_NONE,
+       WS_IFTYPE_STATION,
+       WS_IFTYPE_GROUP,
+} ws_iftype_e;
+
+typedef enum {
+       WS_PRI_DEV_TYPE_NONE,
+       WS_PRI_DEV_TYPE_COMPUTER = 1,
+       WS_PRI_DEV_TYPE_INPUT_DEVICE = 2,
+       WS_PRI_DEV_TYPE_PRINTER = 3,
+       WS_PRI_DEV_TYPE_CAMERA = 4,
+       WS_PRI_DEV_TYPE_STORAGE = 5,
+       WS_PRI_DEV_TYPE_NETWORK_INFRA = 6,
+       WS_PRI_DEV_TYPE_DISPLAY = 7,
+       WS_PRI_DEV_TYPE_MULTIMEDIA_DEVICE = 8,
+       WS_PRI_DEV_TYPE_GAME_DEVICE = 9,
+       WS_PRI_DEV_TYPE_TELEPHONE = 10,
+       WS_PRI_DEV_TYPE_AUDIO = 11,
+       WS_PRI_DEV_TYPE_OTHER = 255,
+} ws_device_type_e;
+
+typedef enum {
+       WS_EVENT_NONE = -1,
+
+       WS_EVENT_DEVICE_FOUND,
+       WS_EVENT_DEVICE_LOST,
+       WS_EVENT_FIND_STOPED,
+       WS_EVENT_PROV_DISC_PBC_REQ,
+       WS_EVENT_PROV_DISC_SHOW_PIN,
+       WS_EVENT_PROV_DISC_ENTER_PIN,   // 5
+       WS_EVENT_PROV_DISC_PBC_RESP,
+       WS_EVENT_PROV_DISC_FAILURE,
+
+       WS_EVENT_GO_NEG_REQUEST,
+       WS_EVENT_GO_NEG_FAILURE,
+       WS_EVENT_GO_NEG_SUCCESS,        // 10
+
+       WS_EVENT_WPS_FAIL,
+       WS_EVENT_GROUP_FORMATION_FAILURE,
+       WS_EVENT_WPS_SUCCESS,
+       WS_EVENT_WPS_REG_SUCCESS,
+       WS_EVENT_GROUP_FORMATION_SUCCESS,       // 15
+
+       WS_EVENT_CONNECTED,
+       WS_EVENT_STA_CONNECTED,
+
+       WS_EVENT_INVITATION_RECEIVED,
+       WS_EVENT_INVITATION_RESULT,
+
+       WS_EVENT_DISCONNECTED,  // 20
+       WS_EVENT_STA_DISCONNECTED,
+
+       WS_EVENT_GROUP_STARTED,
+       WS_EVENT_GROUP_REMOVED,
+
+       WS_EVENT_TERMINATING,
+
+       WS_EVENT_LIMIT,
+} ws_event_id_e;
+
+typedef enum {
+       WS_DEV_INFO_NONE = -1,
+
+       WS_DEV_INFO_P2P_DEV_ADDR,       // p2p_dev_addr=
+       WS_DEV_INFO_DEV_NAME,   // name=
+       WS_DEV_INFO_DEV_TYPE,   // pri_dev_type=
+       WS_DEV_INFO_CONFIG_METHODS,     // config_methods=
+       WS_DEV_INFO_DEV_CAP,    // dev_capab=
+       WS_DEV_INFO_GROUP_CAP,  // group_capab=
+       WS_DEV_INFO_P2P_GO_ADDR,        // p2p_go_addr=
+
+       WS_DEV_INFO_LIMIT,
+} ws_dev_info_id_e;
+
+typedef enum {
+       WS_CONN_INFO_NONE = -1,
+
+       WS_CONN_INFO_DEV_PWD_ID, // dev_passwd_id=
+       WS_CONN_INFO_STATUS,            // status=
+       WS_CONN_INFO_ERROR,             // config_error=
+
+       WS_CONN_INFO_LIMIT,
+} ws_conn_info_id_e;
+
+typedef enum {
+       WS_INVITE_INFO_NONE = -1,
+
+       WS_INVITE_INFO_SRC_ADDR,        // sa=
+       WS_INVITE_INFO_GO_DEV_ADDR,     // go_dev_addr=
+       WS_INVITE_INFO_BSSID,           // bssid=
+       WS_INVITE_INFO_LISTEN,  // listen=
+       WS_INVITE_INFO_STATUS,  // status=
+
+       WS_INVITE_INFO_LIMIT,
+} ws_invite_info_id_e;
+
+typedef enum {
+       WS_GROUP_INFO_NONE = -1,
+
+       WS_GROUP_INFO_SSID,     // ssid=
+       WS_GROUP_INFO_FREQ,     // freq=
+       WS_GROUP_INFO_PASS,     // passphrase=
+       WS_GROUP_INFO_GO_DEV_ADDR,      // go_dev_addr=
+       WS_GROUP_INFO_STATUS,           // status=
+
+       WS_GROUP_INFO_LIMIT,
+} ws_group_info_id_e;
+
+enum
+{
+       WS_PEER_INFO_NONE = -1,
+
+       WS_PEER_INFO_AGE,
+       WS_PEER_INFO_LISTEN_FREQ,
+       WS_PEER_INFO_LEVEL,
+       WS_PEER_INFO_WPS_METHOD,
+       WS_PEER_INFO_INTERFACE_ADDR,
+       WS_PEER_INFO_MEMBER_IN_GO_DEV,
+       WS_PEER_INFO_MEMBER_IN_GO_IFACE,
+       WS_PEER_INFO_PRI_DEV_TYPE,
+       WS_PEER_INFO_DEVICE_NAME,
+       WS_PEER_INFO_MANUFACTURER,
+       WS_PEER_INFO_MODEL_NAME,
+       WS_PEER_INFO_MODEL_NUMBER,
+       WS_PEER_INFO_SERIAL_NUMBER,
+       WS_PEER_INFO_CONFIG_METHODS,
+       WS_PEER_INFO_DEV_CAPAB,
+       WS_PEER_INFO_GROUP_CAPAB,
+       WS_PEER_INFO_IS_WFD_DEVICE,
+       WS_PEER_INFO_GO_NEG_REQ_SENT,
+       WS_PEER_INFO_GO_STATE,
+       WS_PEER_INFO_DIALOG_TOKEN,
+       WS_PEER_INFO_INTENDED_ADDR,
+       WS_PEER_INFO_COUNTRY,
+       WS_PEER_INFO_OPER_FREQ,
+       WS_PEER_INFO_REQ_CONFIG_METHODS,
+       WS_PEER_INFO_FLAGS,
+       WS_PEER_INFO_STATUS,
+       WS_PEER_INFO_WAIT_COUNT,
+       WS_PEER_INFO_INVITATION_REQS,
+
+       WS_PEER_INFO_LIMIT,
+} ws_peer_info_id_e;
+
+typedef enum {
+       /* The Service Discovery field shall be set to 1
+        * if the P2P Device supports Service Discovery,
+        * and is set to 0 otherwise. */
+       WS_DEVICE_CAP_SERVICE_DISCOVERY = 0x01,
+
+       /* Within a P2P Group Info attribute and a (Re)association
+        * request frame the P2P Client Discoverability field shall be set to 1
+        * when the P2P Device supports P2P Client Discoverability,
+        * and is set to 0 otherwise.
+        * This field shall be reserved and set to 0 in all other frames or uses. */
+       WS_DEVICE_CAP_CLIENT_DISCOVERABILITY = 0x02,
+
+       /* The Concurrent Operation field shall be set to 1
+        * when the P2P Device supports Concurrent Operation with WLAN,
+        * and is set to 0 otherwise. */
+       WS_DEVICE_CAP_CONCURRENT_OPERATION = 0x04,
+
+       /* The P2P Infrastructure Managed field shall be set to 1
+        * when the P2P interface of the P2P Device is capable of being
+        * managed by the WLAN (infrastructure network) based on
+        * P2P Coexistence Parameters, and set to 0 otherwise. */
+       WS_DEVICE_CAP_INFRASTRUCTURE_MANAGED = 0x08,
+
+       /* The P2P Device Limit field shall be set to 1
+        * when the P2P Device is unable to participate in additional P2P Groups,
+        * and set to 0 otherwise. */
+       WS_DEVICE_CAP_DEVICE_LIMIT = 0x10,
+
+       /* The P2P Invitation Procedure field shall be set to 1
+        * if the P2P Device is capable of processing P2P Invitation Procedure
+        * signaling, and set to 0 otherwise. */
+       WS_DEVICE_CAP_INVITATION_PROCEDURE = 0x20,
+} ws_device_cap_flag_e;
+
+typedef enum { 
+       /* The P2P Group Owner field shall be set to 1
+        * when the P2P Device is operating as a Group Owner,
+        * and set to 0 otherwise. */
+       WS_GROUP_CAP_GROUP_OWNER = 0x01,
+
+       /* The Persistent P2P Group field shall be set to 1
+        * when the P2P Device is hosting, or intends to host,
+        * a persistent P2P Group, and set to 0 otherwise. */
+       WS_GROUP_CAP_PERSISTENT_GROUP = 0x02,
+
+       /* The P2P Group Limit field shall be set to 1
+        * when the P2P Group Owner is unable to add additional Clients
+        * to its P2P Group, and set to 0 otherwise. */
+       WS_GROUP_CAP_GROUP_LIMIT = 0x04,
+
+       /* The Intra-BSS Distribution field shall be set to 1
+        * if the P2P Device is hosting, or intends to host,
+        * a P2P Group that provides a data distribution service
+        * between Clients in the P2P Group.
+        * The Intra-BSS Distribution field shall be set to 0,
+        * if the P2P Device is not a P2P Group Owner,
+        * or is not providing such a data distribution service. */
+       WS_GROUP_CAP_INTRA_BSS_DISTRIB = 0x08,
+
+       /* The Cross Connection field shall be set to 1
+        * if the P2P Device is hosting, or intends to host,
+        * a P2P Group that provides cross connection
+        * between the P2P Group and a WLAN.
+        * The Cross Connection field shall be set to 0
+        * if the P2P Device is not a P2P Group Owner,
+        * or is not providing a cross connection service. */
+       WS_GROUP_CAP_CROSS_CONNECTION = 0x10,
+
+       /* The Persistent Reconnect field shall be set to 1
+        * when the P2P Device is hosting, or intends to host,
+        * a persistent P2P Group that allows reconnection
+        * without user intervention, and set to 0 otherwise. */
+       WS_GROUP_CAP_PERSISTENT_RECONN = 0x20,
+
+       /* The Group Formation field shall be set to 1
+        * when the P2P Device is operating as a Group Owner
+        * in the Provisioning phase of Group Formation,
+        * and set to 0 otherwise. */
+       WS_GROUP_CAP_GROUP_FORMATION = 0x40,
+} ws_group_cap_flag_e;
+
+typedef enum {
+       /* If the Device Password ID is Default, the Enrollee should use
+        * its PIN password (from the label or display). This password may
+        * correspond to the label, display, or a user-defined password
+        * that has been configured to replace the original device password. */
+       DEV_PASSWD_ID_DEFAULT = 0x0000,
+
+       /* User-specified indicates that the user has overridden the password
+        * with a manually selected value. */
+       DEV_PASSWD_ID_USER_SPECIFIED = 0x0001,
+
+       /* Machine-specified indicates that the original PIN password has been
+        * overridden by a strong, machine-generated device password value. */
+       DEV_PASSWD_ID_MACHINE_SPECIFIED = 0x0002,
+
+       /* The Rekey value indicates that the device's 256-bit rekeying
+        * password will be used. */
+       DEV_PASSWD_ID_REKEY = 0x0003,
+
+       /* The PushButton value indicates that the PIN is the all-zero value
+        * reserved for the Push Button Configuration method. */
+       DEV_PASSWD_ID_PUSH_BUTTON = 0x0004,
+
+       /* The Registrar-specified value indicates a PIN that has been
+        * obtained from the Registrar (via a display or other out-of-band
+        * method). This value may be further augmented with the optional
+        * "Identity" attribute in M1. */
+       DEV_PASSWD_ID_REGISTRAR_SPECIFIED = 0x0005,     // ENTER-PIN
+} ws_dev_passwd_id_e;
+
+typedef enum {
+       WPS_ERROR_NONE,
+
+       WPS_ERROR_OOBINFO_READ_FAIL,
+       WPS_ERROR_DECRYPTION_FAIL,
+       WPS_ERROR_2G_NOT_SUPPORTED,
+       WPS_ERROR_5G_NOT_SUPPORTED,
+       WPS_ERROR_WEAK_SIGNAL,
+       WPS_ERROR_NET_AUTH_FAIL,
+       WPS_ERROR_NET_ASSOC_FAIL,
+       WPS_ERROR_NO_DHCP_RESPONSE,
+       WPS_ERROR_DHCP_CONFIG_FAIL,
+       WPS_ERROR_IP_CONFLICT,
+
+       WPS_ERROR_REGISTRAT_CONN_FAIL,
+       WPS_ERROR_PBC_SESSION_OVERLAP,
+       WPS_ERROR_ROGUE_ACTIVITY,
+       WPS_ERROR_DEVICE_BUSY,
+       WPS_ERROR_SETUP_LOCKED,
+       WPS_ERROR_MESSAGE_TIMEOUT,
+       WPS_ERROR_SESSION_TIMEOUT,
+       WPS_ERROR_PASSWORD_MISMATCH,
+} ws_wps_error_e;
+
+typedef struct {
+       char *string;
+       int index;
+} ws_string_s;
+
+typedef enum {
+       WFD_OEM_NETFLAG_CURRENT,
+       WFD_OEM_NETFLAG_DISABLED,
+       WFD_OEM_NETFLAG_TEMP_DISABLED,
+       WFD_OEM_NETFLAG_P2P_PERSISTENT,
+} ws_netowrk_flag_e;
+
+typedef struct {
+       int network_id;
+       char ssid[OEM_DEV_NAME_LEN+1];
+       unsigned char bssid[OEM_MACADDR_LEN];
+       int flags;
+} ws_network_info_s;
+
+typedef struct {
+       int iftype;
+       int ctrl_sock;
+       int mon_sock;
+       char *ifname;
+       int error_count;
+       int gsource;
+} ws_sock_data_s;
+
+typedef struct {
+       int initialized;        // check whether plugin is initialized or not. block init function if initialized
+       int activated;
+       int global_sock;
+       ws_sock_data_s *common;
+       ws_sock_data_s *group;
+       int group_cnt;
+       wfd_oem_event_cb callback;
+       void *user_data;
+} ws_plugin_data_s;
+
+int ws_init(wfd_oem_event_cb callback, void *user_data);
+int ws_deinit();
+int ws_activate();
+int ws_deactivate();
+int ws_start_scan(wfd_oem_scan_param_s *param);
+int ws_restart_scan(int freq);
+int ws_stop_scan();
+int ws_get_visibility(int *visibility);
+int ws_set_visibility(int visibility);
+int ws_get_scan_result(GList **peers, int *peer_count);
+int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer);
+int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join);
+int ws_connect(unsigned char *peer_addr, wfd_oem_conn_param_s *param);
+int ws_disconnect(unsigned char *peer_addr);
+int ws_reject_connection(unsigned char *peer_addr);
+int ws_cancel_connection(unsigned char *peer_addr);
+int ws_get_connected_peers(GList **peers, int *peer_count);
+int ws_get_pin(char *pin);
+int ws_set_pin(char *pin);
+int ws_get_supported_wps_mode();
+int ws_create_group(int persistent, int freq);
+int ws_destroy_group(const char *ifname);
+int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param);
+int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin);
+int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin);
+int ws_get_dev_name(char *dev_name);
+int ws_set_dev_name(char *dev_name);
+int ws_get_dev_mac(char *dev_mac);
+int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type);
+int ws_set_dev_type(int pri_dev_type, int sec_dev_type);
+int ws_get_go_intent(int *go_intent);
+int ws_set_go_intent(int go_intent);
+int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count);
+int ws_remove_persistent_group(char *ssid, unsigned char *bssid);
+int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect);
+
+
+
+#endif /* __WFD_PLUGIN_WPASUPPLICANT_H__ */
diff --git a/src/.wifi-direct-manager.c.swp b/src/.wifi-direct-manager.c.swp
new file mode 100755 (executable)
index 0000000..326a8ee
Binary files /dev/null and b/src/.wifi-direct-manager.c.swp differ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
deleted file mode 100644 (file)
index 81f2df1..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(wfd-manager C)
-
-# Global setting
-SET(VERSION 0.0)
-
-# Build type : Release
-IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
-       SET(CMAKE_BUILD_TYPE "Release")
-ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
-MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
-
-# Set required packages
-INCLUDE(FindPkgConfig)
-pkg_check_modules(pkgs REQUIRED wifi-direct vconf glib-2.0 dbus-1 dbus-glib-1 gthread-2.0 dlog capi-appfw-application)
-
-FOREACH(flag ${pkgs_CFLAGS})
-       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag} -g -DUSE_DLOG")
-ENDFOREACH(flag)
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/include
-               ${CMAKE_SOURCE_DIR}/oem/include)
-
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
-SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
-SET(CMAKE_C_FLAGS_RELEASE "-O2")
-
-#FIND_PROGRAM(UNAME NAMES uname)
-#EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
-SET(ARCH "${ARCHITECTURE}")
-IF("${ARCH}" STREQUAL "arm")
-       ADD_DEFINITIONS("-DTARGET")
-       MESSAGE("add -DTARGET")
-ENDIF("${ARCH}" STREQUAL "arm")
-
-ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
-
-# Linker flags
-#SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed")
-
-
-#EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
-message("${ARCH}")
-IF("${ARCH}" MATCHES "^arm.*|.*86.*")
-       SET(SRCS
-                wifi-direct-main.c
-                wifi-direct-utils.c
-                wifi-direct-stub.c
-                wifi-direct-state.c
-                wifi-direct-dhcp.c
-                wifi-direct-client-handler.c
-                wifi-direct-event-handler.c
-                ${CMAKE_SOURCE_DIR}/oem/wifi-direct-oem.c
-       )
-       MESSAGE("Build for Target")
-
-       ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
-
-       TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -ldl)
-
-       # pkgconfig file
-       SET(PREFIX ${CMAKE_INSTALL_PREFIX})
-
-       # Install
-       INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd.p2p.conf DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd.wl0.conf DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd.eth.conf DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/udhcp_script.non-autoip DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_suppl.conf DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd-notify.sh DESTINATION bin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/wifi-direct-server.sh DESTINATION bin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/wifi-direct-dhcp.sh DESTINATION bin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_supp.sh DESTINATION sbin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_supplicant DESTINATION sbin)
-
-ELSE()
-       SET(SRCS
-                wifi-direct-main.c
-                wifi-direct-utils.c
-                wifi-direct-stub.c
-                wifi-direct-state.c
-                wifi-direct-dhcp.c
-                wifi-direct-client-handler.c
-                wifi-direct-event-handler.c
-                ${CMAKE_SOURCE_DIR}/oem/wifi-direct-oem.c
-       )
-       MESSAGE("Build for Emulator")
-
-       ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
-       TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -ldl)
-
-       # pkgconfig file
-       SET(PREFIX ${CMAKE_INSTALL_PREFIX})
-
-       # Install
-       INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd.p2p.conf DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd.wl0.conf DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd.eth.conf DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/udhcp_script.non-autoip DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_suppl.conf DESTINATION etc/wifi-direct)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/dhcpd-notify.sh DESTINATION bin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/wifi-direct-server.sh DESTINATION bin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/wifi-direct-dhcp.sh DESTINATION bin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_supp.sh DESTINATION sbin)
-       INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_supplicant DESTINATION sbin)
-       
-ENDIF()
-
diff --git a/src/include/wifi-direct-event-handler.h b/src/include/wifi-direct-event-handler.h
deleted file mode 100644 (file)
index 5e988a0..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifndef __WIFI_DIRECT_EVENT_HANDLER_H_
-#define __WIFI_DIRECT_EVENT_HANDLER_H_
-
-/**
- * @enum wfd_event_t
- * Wi-Fi Direct event
- */
-typedef enum {
-       WFD_EVENT_INVALID = -1,
-       WFD_EVENT_DISCOVER_START_80211_SCAN,
-       WFD_EVENT_DISCOVER_START_SEARCH_LISTEN,
-       WFD_EVENT_DISCOVER_FOUND_PEERS,
-       WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS,
-       WFD_EVENT_DISCOVER_CANCEL,
-       WFD_EVENT_DISCOVER_COMPLETE,
-       WFD_EVENT_DISCOVER_FAIL,
-       WFD_EVENT_DISCOVER_RESUMED,
-       WFD_EVENT_DISCOVER_SUSPENDED,
-       WFD_EVENT_DISCOVER_START_LISTEN_ONLY,
-
-       WFD_EVENT_PROV_DISCOVERY_REQUEST,
-       WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY,
-       WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD,
-       WFD_EVENT_PROV_DISCOVERY_RESPONSE,
-       WFD_EVENT_PROV_DISCOVERY_TIMEOUT,
-       WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY,
-       WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD,
-
-       WFD_EVENT_INVITE_REQUEST,
-       WFD_EVENT_INVITE_RESPONSE,
-
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_START,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_AP_ACK,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_STA_ACK,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_COMPLETE,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL,
-       WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT,
-       WFD_EVENT_CREATE_LINK_START,
-       WFD_EVENT_CREATE_LINK_CANCEL,
-       WFD_EVENT_CREATE_LINK_DOWN,
-       WFD_EVENT_CREATE_LINK_TIMEOUT,
-       WFD_EVENT_CREATE_LINK_AUTH_FAIL,
-       WFD_EVENT_CREATE_LINK_FAIL,
-       WFD_EVENT_CREATE_LINK_COMPLETE,
-
-       WFD_EVENT_IP_ASSIGNED,
-       WFD_EVENT_IP_LEASED,
-       
-       WFD_EVENT_CONNECT_PBC_START,
-
-       WFD_EVENT_SOFTAP_START,
-       WFD_EVENT_SOFTAP_READY,
-       WFD_EVENT_SOFTAP_STA_ASSOC,
-       WFD_EVENT_SOFTAP_STA_DISASSOC,
-       WFD_EVENT_SOFTAP_FAIL,
-       WFD_EVENT_SOFTAP_STOP,
-
-       WFD_EVENT_WPS_START,
-       WFD_EVENT_WPS_STATUS_SCANNING,
-       WFD_EVENT_WPS_STATUS_SCANNING_OVER,
-       WFD_EVENT_WPS_STATUS_ASSOCIATING,
-       WFD_EVENT_WPS_STATUS_ASSOCIATED,
-       WFD_EVENT_WPS_STATUS_WPS_MSG_EXCHANGE,
-       WFD_EVENT_WPS_STATUS_DISCONNECTING,
-       WFD_EVENT_WPS_PROTOCOL_FAIL,
-       WFD_EVENT_WPS_FAIL,
-       WFD_EVENT_WPS_WRONG_PIN,
-       WFD_EVENT_WPS_TIMEOUT,
-       WFD_EVENT_WPS_SESSION_OVERLAP,
-       WFD_EVENT_WPS_COMPLETE,
-
-       WFD_EVENT_PRIMARY_IF_DISCONNECTION,
-       WFD_EVENT_SVC_REQ_RECEIVED,
-       WFD_EVENT_SVC_RESP_RECEIVED,
-       WFD_EVENT_SVC_COMEBACK_REQ_RECEIVED,
-       WFD_EVENT_SVC_COMEBACK_RESP_RECEIVED,
-       WFD_EVENT_DEV_DISCOVERABILITY_REQ,
-       WFD_EVENT_DEV_DISCOVERABILITY_RSP,
-       WFD_EVENT_GO_DISCOVERABILITY_REQ,
-
-       WFD_EVENT_MAX,
-} wfd_event_t;
-
-typedef void (*wfd_oem_event_cb) (wfd_event_t event);
-
-#endif                         //__WIFI_DIRECT_EVENT_HANDLER_H_
-
diff --git a/src/include/wifi-direct-service.h b/src/include/wifi-direct-service.h
deleted file mode 100644 (file)
index e84f148..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifndef __WIFI_DIRECT_SERVICE_H_
-#define __WIFI_DIRECT_SERVICE_H_
-
-#include "wifi-direct.h"
-#include "wifi-direct-internal.h"
-#include "wifi-direct-event-handler.h"
-//#include "wifi-direct-utils.h"
-
-/*****************************************************************************
- *     Macros
- *****************************************************************************/
-#define WFD_MAX_CLIENTS                16
-#define WFD_MAX_ASSOC_STA        8
-
-#define WFD_SERVER_SOCKET_PATH "/tmp/wfd_client_socket"
-
-/*****************************************************************************
- *     Definitions
- *****************************************************************************/
-
-typedef struct
-{
-       bool            isUsed;
-       int             client_id;
-       int             sync_sockfd;
-       int             async_sockfd;
-       int             dev_handle;
-       int                     g_source_id;
-} wfd_server_client_t;
-
-
-
-/**
- * @enum wfd_connected_dev_info_t
- * Wi-Fi Direct buffer structure to store device information of connected peer  */
-typedef struct
-{
-       /** Null-terminated device friendly name. */
-       char ssid[WIFI_DIRECT_MAX_SSID_LEN + 1];
-
-       /** Peer's P2P Device Address */
-       unsigned char mac_address[6];
-
-       /** Peer's P2P Interface Address.  Valid only if our device is a P2P GO. */
-       unsigned char   int_address[6];
-
-       /** Peer's P2P IP Address.  Valid only if our device is a P2P GO. */
-       unsigned char   ip_address[4];
-
-} wfd_connected_dev_info_t;
-
-
-/**
- * @enum wfd_connected_dev_info_t
- * Wi-Fi Direct buffer structure to store device information of connected peer  */
-typedef struct
-{
-    bool isUsed;
-
-    wfd_discovery_entry_s peer;
-
-    /** Peer's P2P Interface Address.  Valid only if our device is a P2P GO. */
-    unsigned char      int_address[6];
-
-    /** Peer's P2P IP Address.  Valid only if our device is a P2P GO. */
-    unsigned char      ip_address[4];
-} wfd_local_connected_peer_info_t;
-
-
-typedef struct
-{
-       wfd_server_client_t     client[WFD_MAX_CLIENTS];
-       int             active_clients;
-
-       int             sync_sockfd;
-       int             async_sockfd;
-
-       wfd_config_data_s       config_data;
-
-       wifi_direct_state_e     state;
-       int connecting_120;
-
-       wfd_discovery_entry_s current_peer;   // it is used during connecting/disconnecting
-
-       wfd_local_connected_peer_info_t connected_peers[WFD_MAX_ASSOC_STA];
-       int connected_peer_count;
-
-       int dhcp_pid;
-
-       void* mainloop;
-
-       /** Daemon timer */
-       int connection_timer;
-       int termination_timer;
-       int discovery_timer;
-
-       int dhcp_ip_address_timer;
-
-       /** Autonomous Group mode */
-       bool autonomous_group_owner;
-
-       void *plugin_handle;
-}wfd_server_control_t;
-
-
-/*****************************************************************************
- *     Functions
- *****************************************************************************/
-wfd_server_control_t * wfd_server_get_control();
-char * wfd_server_print_cmd(wifi_direct_cmd_e cmd);
-
-void wfd_refresh_wifi_direct_state(void *data);
-
-int wfd_server_check_valid(wifi_direct_cmd_e command);
-void wfd_server_set_state(int state);
-int wfd_server_get_state();
-void wfd_timer_connection_start();     
-void wfd_timer_connection_cancel();
-void wfd_termination_timer_start();
-void wfd_termination_timer_cancel();
-void wfd_timer_discovery_start(int seconds);
-void wfd_timer_discovery_cancel();
-
-int wfd_server_is_connected_peer_by_device_mac(unsigned char device_mac[6]);
-wfd_local_connected_peer_info_t*
-wfd_server_get_connected_peer_by_device_mac(unsigned char device_mac[6]);
-wfd_local_connected_peer_info_t*
-wfd_server_get_connected_peer_by_interface_mac(unsigned char int_mac[6]);
-int wfd_server_is_connected_peer_by_interface_mac(unsigned char interface_mac[6]);
-void wfd_server_remove_connected_peer_by_interface_mac(unsigned char interface_mac[6]);
-void wfd_server_remove_connected_peer(wfd_discovery_entry_s * peer);
-void wfd_server_add_connected_peer(wfd_discovery_entry_s* peer, unsigned char interface_mac[6], char* ip_address);
-void wfd_server_reset_connecting_peer();
-bool wfd_server_clear_connected_peer();
-bool wfd_server_remember_connecting_peer(unsigned char device_mac[6]);
-void wfd_server_process_event(wfd_event_t event);
-
-char *__wfd_server_print_event(wfd_event_t event);
-char *__wfd_print_client_event(wfd_client_event_e event);
-char *wfd_print_state(wifi_direct_state_e s);
-
-
-#endif                 //__WIFI_DIRECT_SERVICE_H_
diff --git a/src/include/wifi-direct-utils.h b/src/include/wifi-direct-utils.h
deleted file mode 100644 (file)
index 0177525..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifndef __WIFI_DIRECT_UTILS_H_ 
-#define __WIFI_DIRECT_UTILS_H_
-
-/*****************************************************************************
- *     Standard headers
- *****************************************************************************/
-
-/*****************************************************************************
- *     Platform headers
- *****************************************************************************/
-
-/*****************************************************************************
- *     Extern Functions
- *****************************************************************************/
-
-int wfd_macaddr_atoe(char *p, unsigned char mac[]);
-
-/*****************************************************************************
- *     Macros
- *****************************************************************************/
-
-#ifdef USE_DLOG
-#include <dlog.h>
-
-#undef LOG_TAG
-#define LOG_TAG "WIFI_DIRECT_MANAGER"
-
-#define WDS_LOGV(format, args...) LOGV(format, ##args)
-#define WDS_LOGD(format, args...) LOGD(format, ##args)
-#define WDS_LOGI(format, args...) LOGI(format, ##args)
-#define WDS_LOGW(format, args...) LOGW(format, ##args)
-#define WDS_LOGE(format, args...) LOGE(format, ##args)
-#define WDS_LOGF(format, args...) LOGF(format, ##args)
-
-#define __WDS_LOG_FUNC_ENTER__ LOGV("Enter")
-#define __WDS_LOG_FUNC_EXIT__ LOGV("Quit")
-
-#else /** _DLOG_UTIL */
-
-#define WDS_LOGV(format, args...)
-#define WDS_LOGD(format, args...)
-#define WDS_LOGI(format, args...)
-#define WDS_LOGW(format, args...)
-#define WDS_LOGE(format, args...)
-#define WDS_LOGF(format, args...)
-
-#define __WDS_LOG_FUNC_ENTER__
-#define __WDS_LOG_FUNC_EXIT__
-
-#endif /** _DLOG_UTIL */
-
-#endif /** __WIFI_DIRECT_UTILS_H_ */
diff --git a/src/wifi-direct-client-handler.c b/src/wifi-direct-client-handler.c
deleted file mode 100644 (file)
index b2e6b88..0000000
+++ /dev/null
@@ -1,1795 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <glib.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-#include <unistd.h>
-
-#include <vconf.h>
-#include <vconf-keys.h>
-
-#include "wifi-direct-client-handler.h"
-#include "wifi-direct-internal.h"
-#include "wifi-direct-service.h"
-#include "wifi-direct-stub.h"
-#include "wifi-direct-oem.h"
-
-
-
-int wfd_check_wifi_status()
-{
-       int wifi_state = 0;
-
-       /* vconf key and value (vconf-keys.h)
-#define VCONFKEY_WIFI_STATE "memory/wifi/state"
-enum {
-        VCONFKEY_WIFI_OFF = 0x00,
-        VCONFKEY_WIFI_UNCONNECTED,
-        VCONFKEY_WIFI_CONNECTED,
-        VCONFKEY_WIFI_TRANSFER,
-        VCONFKEY_WIFI_STATE_MAX
-};
-        */
-
-       /* Check wifi state again */
-       if (vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0)
-       {
-               WDS_LOGF( "Error reading vconf (%s)\n", VCONFKEY_WIFI_STATE);
-               return -1;
-       }
-       else
-       {
-               WDS_LOGF( "VCONFKEY_WIFI_STATE(%s) : %d\n", VCONFKEY_WIFI_STATE, wifi_state);
-               if (wifi_state > VCONFKEY_WIFI_OFF)
-               {
-                       WDS_LOGE( "Sorry. Wi-Fi is on\n");
-                       return 0;
-               }
-               WDS_LOGD( "OK. Wi-Fi is off\n");
-       }
-       return 1;
-}
-
-int wfd_check_mobile_ap_status()
-{
-       int mobile_ap_state = 0;
-
-       /* Check wifi state again */
-       if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &mobile_ap_state) < 0)
-       {
-               WDS_LOGF( "Error reading vconf (%s)\n", VCONFKEY_MOBILE_HOTSPOT_MODE);
-               return -1;
-       }
-       else
-       {
-               WDS_LOGF( "VCONFKEY_WIFI_STATE(%s) : %d\n", VCONFKEY_MOBILE_HOTSPOT_MODE, mobile_ap_state);
-               if (mobile_ap_state != VCONFKEY_MOBILE_HOTSPOT_MODE_NONE)
-               {
-                       WDS_LOGF( "Sorry. Mobile AP is on\n");
-                       return 0;
-               }
-               else
-               {
-                       WDS_LOGF( "OK. Mobile AP is off\n");
-               }
-       }
-       return 1;
-}
-
-
-int wfd_set_wifi_direct_state(int state)
-{
-       WDS_LOGF( "VCONFKEY_WIFI_DIRECT_STATE(%s) : %d\n", VCONFKEY_WIFI_DIRECT_STATE, state);
-
-       if (vconf_set_int(VCONFKEY_WIFI_DIRECT_STATE, state) < 0)
-       {
-               WDS_LOGE( "Error setting vconf (%s)\n", VCONFKEY_WIFI_DIRECT_STATE);
-               return -1;
-       }
-
-       return 1;
-}
-
-int wfd_check_wifi_direct_state()
-{
-       int wifi_direct_state = 0;
-
-       if (vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wifi_direct_state) < 0)
-       {
-               WDS_LOGF( "Error reading vconf (%s)\n", VCONFKEY_WIFI_DIRECT_STATE);
-               return -1;
-       }
-       else
-       {
-               WDS_LOGF( "VCONFKEY_WIFI_DIRECT_STATE(%s) : %d\n", VCONFKEY_WIFI_DIRECT_STATE, wifi_direct_state);
-
-               switch(wifi_direct_state)
-               {
-               case VCONFKEY_WIFI_DIRECT_DEACTIVATED:
-               {
-                       WDS_LOGD( "Wi-Fi direct is off\n");
-               }
-               break;
-
-               case VCONFKEY_WIFI_DIRECT_ACTIVATED:
-               {
-                       WDS_LOGD( "Wi-Fi direct is on\n");
-               }
-               break;
-
-               case VCONFKEY_WIFI_DIRECT_DISCOVERING:
-               {
-                       WDS_LOGD( "Wi-Fi direct is discovering\n");
-               }
-               break;
-
-               case VCONFKEY_WIFI_DIRECT_CONNECTED:
-               {
-                       WDS_LOGD( "Wi-Fi direct is connected\n");
-               }
-               break;
-
-               case VCONFKEY_WIFI_DIRECT_GROUP_OWNER:
-               {
-                       WDS_LOGD( "Wi-Fi direct is group owner\n");
-               }
-               break;
-
-               default:
-               {
-                       WDS_LOGF( "ERROR:Wi-Fi direct is unkown state\n");
-                       return -1;
-               }
-               break;
-               }
-       }
-       return wifi_direct_state;
-}
-
-
-int wfd_get_phone_device_name(char* str, int len)
-{
-       char* get_str = NULL;
-       if (str==NULL || len <=0)
-               return -1;
-
-       get_str = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
-
-       if (get_str == NULL)
-       {
-               WDS_LOGF( "Error reading vconf (%s)\n", VCONFKEY_SETAPPL_DEVICE_NAME_STR);
-               return -1;
-       }
-       else
-       {
-               WDS_LOGF( "VCONFKEY_WIFI_STATE(%s) : %d\n", VCONFKEY_SETAPPL_DEVICE_NAME_STR, get_str);
-               strncpy(str, get_str, len);
-               str[len-1] = '\0';
-               return 0;
-       }
-}
-
-
-void wfd_set_device_name()
-{
-       wfd_server_control_t * wfd_server = wfd_server_get_control();
-       char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN + 1];
-       wifi_direct_state_e state = wfd_server_get_state();
-
-       if (wfd_get_phone_device_name(device_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN) != -1)
-       {
-               strncpy(wfd_server->config_data.device_name, device_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
-               wfd_server->config_data.device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] ='\0';
-               wfd_oem_set_ssid(device_name);
-
-               // In WIFI_DIRECT_STATE_ACTIVATED  state, devie name will be applied immediately.
-               // In other sate, it will be set in next discovery start.
-               if (state == WIFI_DIRECT_STATE_ACTIVATED)
-               {
-                       wfd_oem_cancel_discovery();
-                       wfd_oem_start_discovery(false,0);
-               }
-               return;
-       }
-}
-
-void __wfd_device_name_change_cb(keynode_t *key, void* data)
-{
-       WDS_LOGD( "device name has been changed. change ssid (friendly name)..\n");
-       wfd_set_device_name();
-}
-
-int wfd_set_device_name_from_phone_name()
-{
-       wfd_set_device_name();
-       vconf_notify_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR, __wfd_device_name_change_cb, NULL);
-
-       return 0;
-}
-
-void __wfd_server_print_entry_list(wfd_discovery_entry_s * list, int num)
-{
-       int i = 0;
-
-       WDS_LOGD( "------------------------------------------\n");
-       for(i = 0; i < num; i++)
-       {
-               WDS_LOGD( "== Peer index : %d ==\n", i);
-               WDS_LOGD( "is Group Owner ? %s\n", list[i].is_group_owner ? "YES" : "NO");
-               WDS_LOGD( "is Connected ? %s\n", list[i].is_connected ? "YES" : "NO");
-               WDS_LOGD( "device_name : %s\n", list[i].device_name);
-               WDS_LOGD( "MAC address : " MACSTR "\n", MAC2STR(list[i].mac_address));
-               WDS_LOGD( "Iface address : " MACSTR "\n", MAC2STR(list[i].intf_mac_address));
-               WDS_LOGD( "Device type [%d/%d] ==\n", list[i].category, list[i].subcategory);
-               WDS_LOGD( "wps cfg method [%d] ==\n", list[i].wps_cfg_methods);
-       }
-       WDS_LOGD( "------------------------------------------\n");
-}
-
-void __wfd_server_print_connected_peer_info(wfd_connected_peer_info_s* list, int num)
-{
-       int i = 0;
-
-       WDS_LOGD( "------------------------------------------\n");
-       for(i = 0; i < num; i++)
-       {
-               WDS_LOGD( "CONN[%d] device_name=[%s]\n", 
-                               i,
-                               list[i].device_name);
-               WDS_LOGD( "         cat=[%d] svc=[%d] isp2p=[%d] channel=[%d]\n",
-                               list[i].category,
-                               list[i].services,
-                               list[i].is_p2p,
-                               list[i].channel);                               
-               WDS_LOGD( "         mac dev/Intf=[" MACSTR "/" MACSTR "]\n", 
-                               MAC2STR(list[i].mac_address),
-                               MAC2STR(list[i].intf_mac_address));
-               WDS_LOGD( "         IP =["IPSTR"]\n", 
-                               IP2STR(list[i].ip_address));
-       }
-       WDS_LOGD( "------------------------------------------\n");
-}
-
-wfd_server_client_t * wfd_server_find_client(int client_id)
-{
-       int i = 0;
-       wfd_server_control_t * wfd_server = wfd_server_get_control();
-
-       __WDS_LOG_FUNC_ENTER__;
-
-       for(i = 0; i < WFD_MAX_CLIENTS; i++)
-       {
-               if(wfd_server->client[i].client_id == client_id)
-               {
-                       WDS_LOGD( "index [%d] client id [%d]\n", i, wfd_server->client[i].client_id);
-                       return &(wfd_server->client[i]);
-               }
-       }
-
-       WDS_LOGE( "No Matching client!! client id [%d]\n", client_id);
-       return NULL;
-}
-
-int wfd_server_find_peer_by_macaddr(wfd_discovery_entry_s *plist, int entry_size, unsigned char macaddr[6])
-{
-       int i = 0;
-       __WDS_LOG_FUNC_ENTER__;
-
-       if (plist == NULL)
-               return -1;
-
-       if (entry_size < 0 || entry_size > WFD_MAX_CLIENTS)
-               return -2;
-
-       for(i = 0; i < entry_size; i++)
-       {
-               if(memcmp((void*)&plist[i].mac_address[0], (void*)&macaddr[0], sizeof(plist[i].mac_address))==0)
-               {
-                       return i;
-               }
-       }
-
-       WDS_LOGF( "No Matching client!! client mac addr\n");
-
-       return -3;
-}
-
-
-int wfd_server_send_response(int sockfd, void *data, int len)
-{
-       int ret_val = 0;
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-       wifi_direct_client_response_s *resp = (wifi_direct_client_response_s*) data;
-
-       __WDS_LOG_FUNC_ENTER__;
-
-       WDS_LOGD( "Send sync resp cmd=[%d], result=[%d], len=[%d]\n", resp->cmd, resp->result, len);
-
-       wfd_server->sync_sockfd = sockfd;
-
-       if (wfd_server_is_fd_writable(sockfd) <= 0)
-       {
-               WDS_LOGF( "socketfd[%d] write is not possible!! \n", sockfd);
-               return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
-       }
-
-       ret_val = write(sockfd, (char*)data, len);
-       if(ret_val <= 0)
-       {
-               WDS_LOGF( "socket write FAILED!!! [%s]\n", strerror(errno));
-               return WIFI_DIRECT_ERROR_COMMUNICATION_FAILED;
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-       return WIFI_DIRECT_ERROR_NONE;  
-}
-
-void wfd_server_process_client_request(wifi_direct_client_request_s * client_req)
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       int ret = WIFI_DIRECT_ERROR_NONE;
-       wifi_direct_client_response_s   resp;
-       wfd_server_control_t * wfd_server = wfd_server_get_control();
-       wfd_server_client_t * client = wfd_server_find_client(client_req->client_id);
-       wifi_direct_client_noti_s       noti;
-
-       if(client == NULL)
-       {
-               WDS_LOGF( "Invalid client id [%d]\n", client_req->client_id);
-               return ;
-       }
-
-       WDS_LOGD( "Requested Cmd [%d, %s]\n", client_req->cmd, wfd_server_print_cmd(client_req->cmd));
-
-       memset(&resp, 0, sizeof(wifi_direct_client_response_s));
-       resp.client_id = client_req->client_id;
-       resp.data_length = 0;
-       resp.cmd = client_req->cmd;
-
-       if (wfd_server_check_valid(client_req->cmd) == false) {
-               resp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-               WDS_LOGI( "Invalid command [%d] at state=[%d]\n", client_req->cmd, wfd_server->state);
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
-       switch(client_req->cmd)
-       {
-       case WIFI_DIRECT_CMD_DEREGISTER:
-       {
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-               wfd_server_reset_client(client_req->client_id);
-       }
-       break;
-       case WIFI_DIRECT_CMD_ACTIVATE:
-       {
-               if (wfd_check_wifi_status() == 0)
-               {
-                       resp.result = WIFI_DIRECT_ERROR_WIFI_USED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       return;
-               }
-               else if (wfd_check_mobile_ap_status() == 0)
-               {
-                       resp.result =WIFI_DIRECT_ERROR_MOBILE_AP_USED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       return;
-               }
-               else
-               {
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-
-                       int res = 0;
-                       wifi_direct_client_noti_s noti;
-                       memset(&noti, 0, sizeof(wifi_direct_client_noti_s));
-
-                       noti.event = WIFI_DIRECT_CLI_EVENT_ACTIVATION;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-
-                       // Initialize server db.
-                       {
-                               int i = -1;
-                               for(i=0;i<WFD_MAX_ASSOC_STA;i++)
-                               {
-                                       memset(&wfd_server->connected_peers[i], 0, sizeof(wfd_local_connected_peer_info_t));
-                                       wfd_server->connected_peers[i].isUsed = 0;
-                               }
-                               wfd_server->connected_peer_count = 0;
-                               memset(&wfd_server->current_peer, 0x00, sizeof(wfd_discovery_entry_s));
-                       }
-
-                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATING);
-
-                       res = wfd_oem_activate();
-
-                       WDS_LOGF( "Device handle from oem res=[%d]\n", res);
-
-                       if (res == false)
-                       {
-                               wfd_server_set_state(WIFI_DIRECT_STATE_DEACTIVATED);
-                               noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-                       else
-                       {
-                               wfd_set_device_name();
-                               wfd_oem_set_device_type(wfd_server->config_data.primary_dev_type,
-                                               wfd_server->config_data.secondary_dev_type);
-                               wfd_oem_set_go_intent(7);
-
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-
-                               noti.error = WIFI_DIRECT_ERROR_NONE;
-                       }
-
-                       __wfd_server_send_client_event(&noti);
-
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_DEACTIVATE:
-       {
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-               wfd_server_set_state(WIFI_DIRECT_STATE_DEACTIVATING);
-               wfd_oem_deactivate();
-               wfd_server_set_state(WIFI_DIRECT_STATE_DEACTIVATED);
-
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0, sizeof(wifi_direct_client_noti_s));
-
-               noti.event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               __wfd_server_send_client_event(&noti);
-
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_START_DISCOVERY:
-       {
-               bool listen_only = client_req->data.listen_only;
-               int timeout = client_req->data.timeout;
-               wifi_direct_state_e state = wfd_server_get_state();
-
-               WDS_LOGF( "Flag of Listen only : %s timeout[%d]\n", listen_only ? "ON" : "OFF", timeout);
-
-               if (wfd_oem_start_discovery(listen_only, timeout)==true)
-               {
-                       if (state == WIFI_DIRECT_STATE_ACTIVATED ||
-                                       state == WIFI_DIRECT_STATE_DISCOVERING)
-                               wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);
-
-                       if ( timeout>0 )
-                               wfd_timer_discovery_start(timeout);
-
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-
-               }
-               else
-               {
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
-       {
-               ret = wfd_oem_cancel_discovery();
-               if (ret == false)
-               {
-                       WDS_LOGE( "Error!! wfd_oem_cancel_discovery() failed..\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
-       {
-               int peer_count = 0;
-               int total_msg_len = 0;
-               wfd_discovery_entry_s* plist = NULL;
-
-               wifi_direct_state_e state = wfd_server_get_state();
-               if (state > WIFI_DIRECT_STATE_ACTIVATING)
-               {
-                       ret = wfd_oem_get_discovery_result(&plist, &peer_count);
-                       if (ret == false)
-                       {
-                               WDS_LOGE( "Error!! wfd_oem_get_discovery_result() failed..\n");
-                               resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                               __WDS_LOG_FUNC_EXIT__;
-                               return;
-                       }
-               }
-
-               total_msg_len = sizeof(wifi_direct_client_response_s) + (sizeof(wfd_discovery_entry_s) * peer_count);
-
-               WDS_LOGD( "Peer count : %d, total message size : %d\n", peer_count, total_msg_len);
-
-               char * msg = (char*)malloc(total_msg_len);
-               if(msg == NULL)
-               {
-                       WDS_LOGF( "Memory Allocation is FAILED!!!!!![%d]\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.param1 = peer_count;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-
-               memset(msg, 0, total_msg_len);
-               memcpy(msg, &resp, sizeof(wifi_direct_client_response_s));
-               if (peer_count && plist != NULL) {
-                       memcpy(msg + sizeof(wifi_direct_client_response_s), plist, sizeof(wfd_discovery_entry_s) * peer_count);
-                       __wfd_server_print_entry_list((wfd_discovery_entry_s*)plist, peer_count);
-               }
-
-               wfd_server_send_response(client->sync_sockfd, msg, total_msg_len);
-
-               g_free(msg);
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SEND_PROVISION_DISCOVERY_REQ:
-       {
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-#if 0
-               int peer_index = -1;
-               static wfd_discovery_entry_s plist[WFD_MAX_CLIENTS];
-               wifi_direct_wps_type_e  wps_config;
-               memset(&plist, 0, sizeof(wfd_discovery_entry_s) * WFD_MAX_CLIENTS);
-               int peer_count = 0;
-
-               // TODO: need to check mac address validation and wps config
-
-               wps_config = WIFI_DIRECT_WPS_TYPE_PBC;
-               if (wfd_oem_send_provision_discovery_request(client_req->data.mac_addr, wps_config) == true)
-               {
-                       wfd_server_remember_connecting_peer(client_req->data.mac_addr);
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               }
-               else
-               {
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-#endif
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_CONNECT:
-       {
-               wifi_direct_wps_type_e  wps_config;
-               int max_client;
-
-               max_client = wfd_server->config_data.max_clients;
-               WDS_LOGF( "max_client [%d] connected_peer_count[%d]\n", max_client, wfd_server->connected_peer_count);
-               if (wfd_server->connected_peer_count >= max_client)
-               {
-                       WDS_LOGF( "Error... available number of clients is full!!\n");
-                       resp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-               }
-               else
-               {
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-
-                       wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
-
-                       wfd_server_remember_connecting_peer(client_req->data.mac_addr);
-
-                       wps_config = wfd_server->config_data.wps_config;
-                       WDS_LOGI( "wps_config : %d\n", wps_config);
-
-                       if (wfd_server->config_data.want_persistent_group == true)
-                       {
-                               /* skip prov_disco_req() in persistent mode. reinvoke stored persistent group or create new persistent group */
-                               ret = wfd_oem_connect_for_persistent_group(client_req->data.mac_addr, wps_config);
-                               WDS_LOGI( "wfd_oem_connect_for_persistent_group: ret = %d\n", ret);
-                       }
-                       else
-                       {
-                               if (wfd_oem_is_groupowner() == true)
-                               {
-                                       wfd_oem_cancel_discovery();
-                                       ret = wfd_oem_send_invite_request(client_req->data.mac_addr);
-                                       WDS_LOGI( "Invite request: ret = %d\n", ret);
-                               }
-                               else
-                               {
-                                       ret = wfd_oem_send_provision_discovery_request(client_req->data.mac_addr, wps_config, wfd_server->current_peer.is_group_owner);
-                                       WDS_LOGI( "ProvisionDiscovery request: ret = %d\n", ret);
-                               }
-                       }
-
-                       if (ret == true)
-                       {
-                               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(client_req->data.mac_addr));
-
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
-                               noti.error = WIFI_DIRECT_ERROR_NONE;
-                       }
-                       else
-                       {
-                               if (wfd_oem_is_groupowner() == true)
-                               {
-                                       wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-                               }
-                               else
-                               {
-                                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-                               }
-
-                               WDS_LOGF( "Error... fail to connect\n");
-                               
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                               noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-
-                       __wfd_server_send_client_event(&noti);
-               }
-
-
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_DISCONNECT_ALL:
-       {
-               wfd_server_set_state(WIFI_DIRECT_STATE_DISCONNECTING);
-
-               // Response app first.
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-               
-               if (wfd_oem_disconnect())
-               {
-                       wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;  // set wps_config to default value
-               }
-               else
-               {
-                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-                       
-                       WDS_LOGF( "Error... wfd_oem_disconnect() failed\n");
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       __wfd_server_send_client_event(&noti);
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_DISCONNECT:
-       {
-               // Response app first.
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-
-               wfd_local_connected_peer_info_t* peer = NULL;
-               peer = wfd_server_get_connected_peer_by_device_mac(client_req->data.mac_addr);
-#if 0          
-               if (peer == NULL)
-               {
-                       WDS_LOGF( "Connected Peer not found!\n");
-                       resp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       break;
-               }
-#endif
-
-               if (wfd_oem_is_groupowner() == TRUE)
-               {
-                       if (NULL == peer)
-                       {
-                               if (wfd_oem_disconnect_sta(wfd_server->current_peer.intf_mac_address))
-                               {
-                                       wfd_server_remember_connecting_peer(client_req->data.mac_addr);
-                               }
-                               else
-                               {
-                                       WDS_LOGF( "Error... wfd_oem_disconnect() failed\n");
-                                       noti.event =WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                                       noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                                       __wfd_server_send_client_event(&noti);
-                               }
-                       }
-                       else
-                       {
-                               if (wfd_oem_disconnect_sta(peer->int_address))
-                               {
-                                       wfd_server_remember_connecting_peer(client_req->data.mac_addr);
-                               }
-                               else
-                               {
-                                       WDS_LOGF( "Error... wfd_oem_disconnect() failed\n");
-                                       noti.event =WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                                       noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                                       __wfd_server_send_client_event(&noti);
-                               }
-                       }
-
-               }
-               else
-               {
-                       if (wfd_server->state < WIFI_DIRECT_STATE_CONNECTED) {
-                               ret = wfd_oem_reject_connection(client_req->data.mac_addr);
-                               ret = wfd_oem_connect(client_req->data.mac_addr, wfd_server->config_data.wps_config);
-                       } else {
-                               ret = wfd_oem_disconnect();
-                       }
-                       wfd_server_set_state(WIFI_DIRECT_STATE_DISCONNECTING);
-               
-                       if (ret)
-                       {
-                               wfd_server_remember_connecting_peer(client_req->data.mac_addr);
-                               wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;        // set wps_config to default
-                       }
-                       else
-                       {
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-
-                               WDS_LOGF( "Error... wfd_oem_disconnect() failed\n");
-                               noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                               noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               __wfd_server_send_client_event(&noti);
-                       }
-
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_LINK_STATUS:
-       {
-               int status = wfd_server_get_state();
-               WDS_LOGD( "Link Status [%s]\n", wfd_print_state(status));
-               resp.param1 = status;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
-       {
-               wifi_direct_wps_type_e  wps_config;
-               int max_client;
-
-               max_client = wfd_server->config_data.max_clients;
-               WDS_LOGF( "max_client [%d] connected_peer_count[%d]\n", max_client, wfd_server->connected_peer_count);
-               if (wfd_server->connected_peer_count >= max_client)
-               {
-                       WDS_LOGF( "Error... available number of clients is full!!\n");
-                       resp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-               }
-               else
-               {
-                       wps_config = wfd_server->config_data.wps_config;
-
-                       WDS_LOGD( "Connect to peer %02x:%02x:%02x:%02x:%02x:%02x\n",
-                                       client_req->data.mac_addr[0],
-                                       client_req->data.mac_addr[1],
-                                       client_req->data.mac_addr[2],
-                                       client_req->data.mac_addr[3],
-                                       client_req->data.mac_addr[4],
-                                       client_req->data.mac_addr[5]);
-
-                       wfd_server_remember_connecting_peer(client_req->data.mac_addr);
-
-                       wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
-
-                       // Response app first.
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-
-                       if (wfd_oem_is_groupowner()) {
-                               if (wps_config == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY ||
-                                         wps_config == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD)
-                                       wfd_oem_wps_pin_start(client_req->data.mac_addr);
-                               else
-                                       wfd_oem_wps_pbc_start(client_req->data.mac_addr);
-                               break;
-                       }
-
-                       if (wfd_oem_connect(client_req->data.mac_addr, wps_config))
-                       {
-                               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(client_req->data.mac_addr));
-
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
-                               noti.error = WIFI_DIRECT_ERROR_NONE;
-                               
-                       }
-                       else
-                       {
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-                               WDS_LOGF( "Error: wfd_oem_connect() failed..\n");
-                               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(client_req->data.mac_addr));
-                               
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                               noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-
-                       __wfd_server_send_client_event(&noti);
-               
-
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_CONFIG:
-       {
-               int status = wfd_server_get_state();
-
-               resp.param1 = status;
-               resp.result = ret;
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(resp)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-               if (wfd_server_send_response(client->sync_sockfd,  &wfd_server->config_data, sizeof(wfd_config_data_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-               return;
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_CONFIG:
-       {
-               wfd_config_data_s config;
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)&config, sizeof(wfd_config_data_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.param1 = wfd_server_get_state();
-               resp.result = ret;
-
-               memcpy((void*)&wfd_server->config_data, (void*)&config, sizeof(wfd_config_data_s));
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_CREATE_GROUP:
-       {
-               wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);
-               ret = wfd_oem_create_group(wfd_server->config_data.device_name);
-               if (ret==false)
-               {
-                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               else
-               {
-                       wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-                       wfd_server->autonomous_group_owner = true;
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               }
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
-       {
-               wfd_oem_activate_pushbutton();
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_IS_GROUPOWNER:
-       {
-               int owner = wfd_oem_is_groupowner();
-               resp.param1 = owner;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_SSID:
-       {
-               char ssid[32+1];
-
-               if (wfd_oem_get_ssid(ssid, 32)==false)
-               {
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               else
-               {
-                       snprintf(resp.param2, sizeof(resp.param2), "%s", ssid);
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               }
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
-       {
-               snprintf(resp.param2, sizeof(resp.param2), "%s", wfd_server->config_data.device_name);
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
-       {
-               char    device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0,};
-
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)device_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               WDS_LOGI( "device_name = [%s]\n", device_name);
-
-               memset(wfd_server->config_data.device_name, 0, WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1);
-               strncpy(wfd_server->config_data.device_name, device_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
-               wfd_server->config_data.device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = '\0';
-               ret = wfd_oem_set_ssid(device_name);
-
-               if (ret == TRUE)
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               else
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_IP_ADDR:
-       {
-               char* ip_addr = wfd_oem_get_ip();
-               if (!ip_addr)
-                       snprintf(resp.param2, sizeof(resp.param2), "0.0.0.0");
-               else
-                       snprintf(resp.param2, sizeof(resp.param2), "%s", ip_addr);
-
-               if (ip_addr)
-                       free(ip_addr);
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_WPS_PIN:
-       {
-               char    pin[WIFI_DIRECT_WPS_PIN_LEN+1];
-
-               memset(pin, 0, WIFI_DIRECT_WPS_PIN_LEN+1);
-
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)pin, WIFI_DIRECT_WPS_PIN_LEN) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               WDS_LOGF( "PIN = [%s]\n", pin);
-
-               ret = wfd_oem_set_wps_pin(pin);
-
-               if (ret == TRUE)
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               else
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_WPS_PIN:
-       {
-               char    pin[WIFI_DIRECT_WPS_PIN_LEN+1];
-               memset(pin, 0, WIFI_DIRECT_WPS_PIN_LEN+1);
-
-               if (wfd_oem_get_wps_pin(pin, sizeof(pin)) == false)
-               {
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       WDS_LOGE( "wfd_oem_get_wps_pin() failed!\n");
-               }
-               else
-               {
-                       WDS_LOGD( "pin [%s]\n", pin);
-                       snprintf(resp.param2, sizeof(resp.param2), "%s", pin);
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               }
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
-       {
-
-               if (wfd_oem_generate_wps_pin() == false)
-               {
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       WDS_LOGE( "wfd_oem_generate_wps_pin() failed!\n");
-               }
-               else
-               {
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               }
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_SSID:
-       {
-               char    ssid[WIFI_DIRECT_MAX_SSID_LEN+1] = {0,};
-
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)ssid, WIFI_DIRECT_MAX_SSID_LEN) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               WDS_LOGD( "ssid = [%s]\n", ssid);
-
-               ret = wfd_oem_set_ssid(ssid);
-
-               if (ret == TRUE)
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               else
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_WPA:
-       {
-               char    new_wpa[64+1] = {0,};
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)new_wpa, 64) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               WDS_LOGD( "new_wpa = [%s]\n", new_wpa);
-
-               if (wfd_oem_set_wpa_passphrase(new_wpa) == false)
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
-       {
-               int wps_mode = wfd_oem_get_supported_wps_mode();
-               WDS_LOGF( "supported wps mode (%d)\n", wps_mode);
-               resp.param1 = wps_mode;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_CURRENT_WPS_MODE:
-       {
-               wifi_direct_wps_type_e wps_mode;
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)&wps_mode, sizeof(wifi_direct_wps_type_e)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               WDS_LOGF( "wps_mode (%d)\n", wps_mode);
-
-               resp.param1 = wfd_server_get_state();
-               resp.result = ret;
-
-               wfd_server->config_data.wps_config = wps_mode;
-                               
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
-       {
-               int total_msg_len = 0;
-               wfd_connected_peer_info_s* plist = NULL;
-               int peer_count = 0;
-               int i = 0, j = 0;
-
-               wifi_direct_state_e state = wfd_server_get_state();
-               ret = WIFI_DIRECT_ERROR_NONE;
-               if (state < WIFI_DIRECT_STATE_CONNECTED) {
-                       WDS_LOGE( "state != WIFI_DIRECT_STATE_CONNECTED\n");
-                       resp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       if (wfd_server_send_response(client->sync_sockfd, &resp,
-                                                                                       sizeof(wifi_direct_client_response_s)) < 0) {
-                               wfd_server_reset_client(client->sync_sockfd);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       break;
-
-               }
-               WDS_LOGD("WFD status [%d]", state);
-
-               peer_count = wfd_server->connected_peer_count;
-               if (peer_count <= 0) {
-                       if (state == WIFI_DIRECT_STATE_GROUP_OWNER) {
-                               resp.result = WIFI_DIRECT_ERROR_NONE;
-                               resp.param1 = 0;
-                       } else {
-                               resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-
-                       if (wfd_server_send_response(client->sync_sockfd, &resp,
-                                                                                       sizeof(wifi_direct_client_response_s)) < 0) {
-                               wfd_server_reset_client(client->sync_sockfd);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       break;
-               }
-               WDS_LOGD("Connected peer count [%d]", peer_count);
-
-               plist = (wfd_connected_peer_info_s*) calloc(peer_count, sizeof(wfd_connected_peer_info_s));
-               if(plist == NULL)
-               {
-                       WDS_LOGF( "Memory Allocation is FAILED!!!!!![%d]\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       if (wfd_server_send_response(client->sync_sockfd, &resp,
-                                                                                       sizeof(wifi_direct_client_response_s)) < 0) {
-                               wfd_server_reset_client(client->sync_sockfd);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       break;
-               }
-
-               for (i = 0, j = 0; j < peer_count && i < WFD_MAX_ASSOC_STA; i++) {
-                       if (wfd_server->connected_peers[i].isUsed == 0) {
-                               WDS_LOGD("Not used peer info [%s]", wfd_server->connected_peers[i].peer.device_name);
-                               continue;
-                       }
-                       WDS_LOGD("Connected peer info found [%s]", wfd_server->connected_peers[i].peer.device_name);
-
-                       strncpy(plist[j].device_name, wfd_server->connected_peers[i].peer.device_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
-                       plist[j].device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = '\0';
-                       memcpy(&plist[j].intf_mac_address[0], wfd_server->connected_peers[i].int_address, 6);
-                       memcpy(&plist[j].mac_address[0], wfd_server->connected_peers[i].peer.mac_address, 6);
-                       plist[j].services = wfd_server->connected_peers[i].peer.services;
-                       plist[j].is_p2p = 1;
-                       plist[j].category = wfd_server->connected_peers[i].peer.category;
-                       plist[j].channel = wfd_server->connected_peers[i].peer.channel;
-                       memcpy(&plist[j].ip_address[0], wfd_server->connected_peers[i].ip_address, 4);
-
-                       j++;
-               }
-               total_msg_len = sizeof(wifi_direct_client_response_s) + (sizeof(wfd_connected_peer_info_s) * peer_count);
-
-               WDS_LOGD( "Peer count : %d, total message size : %d\n", peer_count, total_msg_len);
-
-               char * msg = (char*)malloc(total_msg_len);
-               if(msg == NULL)
-               {
-                       WDS_LOGF( "Memory Allocation is FAILED!!!!!![%d]\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-                       {
-                               wfd_server_reset_client(client->sync_sockfd);
-                               g_free(plist);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return;
-                       }
-                       g_free(plist);
-                       break;
-               }
-
-               resp.param1 = peer_count;
-               resp.result = ret;
-
-               memset(msg, 0, total_msg_len);
-               memcpy(msg, &resp, sizeof(wifi_direct_client_response_s));
-               if (peer_count > 0)
-                       memcpy(msg + sizeof(wifi_direct_client_response_s), plist, sizeof(wfd_connected_peer_info_s) * peer_count);
-
-               __wfd_server_print_connected_peer_info((wfd_connected_peer_info_s*)plist, peer_count);
-
-               if (wfd_server_send_response(client->sync_sockfd, msg, total_msg_len) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       g_free(plist);
-                       g_free(msg);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-               g_free(plist);
-               g_free(msg);
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_CANCEL_GROUP:
-       {
-               ret = wfd_oem_cancel_group();
-               if (ret==false)
-               {
-                       //wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               else
-               {
-                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               }
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_GO_INTENT:
-       {
-               int intent;
-
-               ret = wfd_oem_get_go_intent(&intent);
-               if (ret == false)
-               {
-                       WDS_LOGE( "Error!! wfd_oem_get_go_intent() failed..\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.param1 = intent;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_GO_INTENT:
-       {
-               int intent;
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)&intent, sizeof(int)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               WDS_LOGF( "intent (%d)\n", intent);
-
-               ret = wfd_oem_set_go_intent(intent);
-
-               if (ret == false)
-               {
-                       WDS_LOGE( "Error!! wfd_oem_set_go_intent() failed..\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.param1 = wfd_server_get_state();
-               resp.result = ret;
-
-               wfd_server->config_data.group_owner_intent = intent;
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-               
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
-       {
-               int max_client;
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)&max_client, sizeof(int)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               WDS_LOGF( "max_client (%d)\n", max_client);
-
-               resp.param1 = wfd_server_get_state();
-
-               if (max_client > WFD_MAX_ASSOC_STA)
-               {
-                       WDS_LOGF( "ERROR : Max client number shold be under [%d]\n", WFD_MAX_ASSOC_STA);
-                       resp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
-               }
-               else
-               {
-                       wfd_server->config_data.max_clients = max_client;
-                       resp.result = WIFI_DIRECT_ERROR_NONE;
-               }
-
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
-       {
-               int max_client;
-
-               max_client = wfd_server->config_data.max_clients;
-               
-               WDS_LOGF( "max_client (%d)\n", max_client);
-               resp.param1 = max_client;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-
-       case WIFI_DIRECT_CMD_GET_DEVICE_MAC:
-       {
-
-               unsigned char device_mac[6] = {0,};
-
-               ret = wfd_oem_get_device_mac_address((unsigned char*)&device_mac);
-
-               if (ret == false)
-               {
-                       WDS_LOGE( "Error!! wfd_oem_get_device_mac_address() failed..\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               memcpy(resp.param2, device_mac, sizeof(device_mac));
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
-       {
-               int autonomous_group = wfd_server->autonomous_group_owner;
-               resp.param1 = autonomous_group;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
-       {
-               bool autoconnection_mode;
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)&autoconnection_mode, sizeof(bool)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               WDS_LOGF( "autoconnection_mode (%d)\n", autoconnection_mode);
-
-               resp.param1 = wfd_server_get_state();
-               resp.result = ret;
-
-               wfd_server->config_data.auto_connection = autoconnection_mode;
-                               
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
-       {
-               int auto_connection = (int)wfd_server->config_data.auto_connection;
-               resp.param1 = auto_connection;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
-       {
-#if 0
-               int discoverable = (int)wfd_oem_is_discovery_enabled();
-               resp.param1 = discoverable;
-#else
-               if ((wfd_server->state == WIFI_DIRECT_STATE_DISCOVERING)
-                       || (wfd_server->autonomous_group_owner == TRUE))
-                       resp.param1 = 1;
-               else
-                       resp.param1 = 0;
-#endif
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
-       {
-               int listen_only = (int)wfd_server->config_data.listen_only;
-               resp.param1 = listen_only;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL:
-       {
-               if (client_req->data.listen_only)
-                       wfd_oem_set_oem_loglevel(true);
-               else
-                       wfd_oem_set_oem_loglevel(false);
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_GET_OWN_GROUP_CHANNEL:
-       {
-               int operating_channel = wfd_oem_get_operating_channel();
-               WDS_LOGF( "operating_channel (%d)\n", operating_channel);
-               resp.param1 = operating_channel;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
-       {
-               wfd_server->config_data.want_persistent_group = true;
-               ret = wfd_oem_set_persistent_group_enabled(true);
-               if (ret == false)
-               {
-                       WDS_LOGE( "Error!! wfd_oem_set_persistent_group_enabled() failed..\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
-       {
-               wfd_server->config_data.want_persistent_group = false;
-               ret = wfd_oem_set_persistent_group_enabled(false);
-               if (ret == false)
-               {
-                       WDS_LOGE( "Error!! wfd_oem_set_persistent_group_enabled() failed..\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP:
-       {
-               int persistent_group_enabled = (int)wfd_server->config_data.want_persistent_group;
-               resp.param1 = persistent_group_enabled;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-
-       case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
-       {
-               int persistent_group_count = 0;
-               int total_msg_len = 0;
-               wfd_persistent_group_info_s *plist;
-               
-               ret = wfd_oem_get_persistent_group_info(&plist, &persistent_group_count);
-               if (ret == false)
-               {
-                       WDS_LOGE( "Error!! wfd_oem_get_persistent_group_info() failed..\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               total_msg_len = sizeof(wifi_direct_client_response_s) + (sizeof(wfd_persistent_group_info_s) * persistent_group_count);
-
-               WDS_LOGD( "persistent_group_count : %d, total message size : %d\n", persistent_group_count, total_msg_len);
-
-               char * msg = (char*) calloc(1, total_msg_len);
-               if(msg == NULL)
-               {
-                       WDS_LOGF( "Memory Allocation is FAILED!!!!!![%d]\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       if (plist)
-                               free(plist);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.param1 = persistent_group_count;
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-
-               memcpy(msg, &resp, sizeof(wifi_direct_client_response_s));
-               if (persistent_group_count > 0)
-                       memcpy(msg + sizeof(wifi_direct_client_response_s), plist, sizeof(wfd_persistent_group_info_s) * persistent_group_count);
-
-               wfd_server_send_response(client->sync_sockfd, msg, total_msg_len);
-               if (plist)
-                       free(plist);
-               free(msg);
-
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-       break;
-
-       case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
-       {
-               wfd_persistent_group_info_s persistent_group;
-               
-               if(wfd_server_read_socket_event(client->sync_sockfd, (char*)&persistent_group, sizeof(wfd_persistent_group_info_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               ret = wfd_oem_remove_persistent_group(&persistent_group);
-               if (ret == false)
-               {
-                       WDS_LOGE( "Error!! wfd_oem_remove_persistent_group() failed..\n");
-                       resp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s));
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-
-               resp.result = WIFI_DIRECT_ERROR_NONE;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-       }
-       break;
-
-       default:
-               WDS_LOGF( "Error!!! Invalid cmd = [%d] \n", client_req->cmd);
-               resp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-               if (wfd_server_send_response(client->sync_sockfd, &resp, sizeof(wifi_direct_client_response_s)) < 0)
-               {
-                       wfd_server_reset_client(client->sync_sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return;
-               }
-               break;
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-}
-
-
-
diff --git a/src/wifi-direct-client.c b/src/wifi-direct-client.c
new file mode 100644 (file)
index 0000000..8d09367
--- /dev/null
@@ -0,0 +1,1525 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct client functions.
+ *
+ * @file               wifi-direct-client.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/un.h>
+#include <poll.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include <wifi-direct.h>
+#include <wifi-direct-internal.h>
+
+#include "wifi-direct-manager.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-session.h"
+#include "wifi-direct-group.h"
+#include "wifi-direct-client.h"
+#include "wifi-direct-util.h"
+#include "wifi-direct-state.h"
+#include "wifi-direct-peer.h"
+
+
+static int _wfd_deregister_client(void *data, int client_id);
+static gboolean wfd_client_process_request(GIOChannel *source,
+                                                                       GIOCondition condition,
+                                                                       gpointer user_data);
+
+
+char *wfd_server_print_cmd(wifi_direct_cmd_e cmd)
+{
+       switch (cmd)
+       {
+       case WIFI_DIRECT_CMD_REGISTER:
+               return "WIFI_DIRECT_CMD_REGISTER";
+       case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
+               return "WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET";
+       case WIFI_DIRECT_CMD_DEREGISTER:
+               return "WIFI_DIRECT_CMD_DEREGISTER";
+       case WIFI_DIRECT_CMD_ACTIVATE:
+               return "WIFI_DIRECT_CMD_ACTIVATE";
+       case WIFI_DIRECT_CMD_DEACTIVATE:
+               return "WIFI_DIRECT_CMD_DEACTIVATE";
+       case WIFI_DIRECT_CMD_START_DISCOVERY:
+               return "WIFI_DIRECT_CMD_START_DISCOVERY";
+       case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
+               return "WIFI_DIRECT_CMD_CANCEL_DISCOVERY";
+       case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
+               return "WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT";
+       case WIFI_DIRECT_CMD_GET_LINK_STATUS:
+               return "WIFI_DIRECT_CMD_GET_LINK_STATUS";
+       case WIFI_DIRECT_CMD_CONNECT:
+               return "WIFI_DIRECT_CMD_CONNECT";
+
+       case WIFI_DIRECT_CMD_DISCONNECT_ALL:
+               return "WIFI_DIRECT_CMD_DISCONNECT_ALL";
+       case WIFI_DIRECT_CMD_CREATE_GROUP:
+               return "WIFI_DIRECT_CMD_CREATE_GROUP";
+       case WIFI_DIRECT_CMD_IS_GROUPOWNER:
+               return "WIFI_DIRECT_CMD_IS_GROUPOWNER";
+       case WIFI_DIRECT_CMD_GET_SSID:
+               return "WIFI_DIRECT_CMD_GET_SSID";
+       case WIFI_DIRECT_CMD_SET_SSID:
+               return "WIFI_DIRECT_CMD_SET_SSID";
+       case WIFI_DIRECT_CMD_GET_IP_ADDR:
+               return "WIFI_DIRECT_CMD_GET_IP_ADDR";
+       case WIFI_DIRECT_CMD_GET_CONFIG:
+               return "WIFI_DIRECT_CMD_GET_CONFIG";
+       case WIFI_DIRECT_CMD_SET_CONFIG:
+               return "WIFI_DIRECT_CMD_SET_CONFIG";
+       case WIFI_DIRECT_CMD_SEND_PROVISION_DISCOVERY_REQ:
+               return "WIFI_DIRECT_CMD_SEND_PROVISION_DISCOVERY_REQ";
+       case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
+               return "WIFI_DIRECT_CMD_SEND_CONNECT_REQ";
+
+       case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
+               return "WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON";
+       case WIFI_DIRECT_CMD_SET_WPS_PIN:
+               return "WIFI_DIRECT_CMD_SET_WPS_PIN";
+       case WIFI_DIRECT_CMD_GET_WPS_PIN:
+               return "WIFI_DIRECT_CMD_GET_WPS_PIN";
+       case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
+               return "WIFI_DIRECT_CMD_GENERATE_WPS_PIN";
+       case WIFI_DIRECT_CMD_GET_INCOMMING_PEER_INFO:
+               return "WIFI_DIRECT_CMD_GET_INCOMMING_PEER_INFO";
+       case WIFI_DIRECT_CMD_GET_PASSPHRASE:
+               return "WIFI_DIRECT_CMD_GET_PASSPHRASE";
+       case WIFI_DIRECT_CMD_SET_WPA:
+               return "WIFI_DIRECT_CMD_SET_WPA";
+       case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
+               return "WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE";
+       case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
+               return "WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE";
+       case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
+               return "WIFI_DIRECT_CMD_GET_REQ_WPS_MODE";
+       case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
+               return "WIFI_DIRECT_CMD_SET_REQ_WPS_MODE";
+       case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
+               return "WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO";
+       case WIFI_DIRECT_CMD_CANCEL_GROUP:
+               return "WIFI_DIRECT_CMD_CANCEL_GROUP";
+
+       case WIFI_DIRECT_CMD_DISCONNECT:
+               return "WIFI_DIRECT_CMD_DISCONNECT";
+       case WIFI_DIRECT_CMD_SET_GO_INTENT:
+               return "WIFI_DIRECT_CMD_SET_GO_INTENT";
+       case WIFI_DIRECT_CMD_GET_GO_INTENT:
+               return "WIFI_DIRECT_CMD_GET_GO_INTENT";
+       case WIFI_DIRECT_CMD_GET_DEVICE_MAC:
+               return "WIFI_DIRECT_CMD_GET_DEVICE_MAC";
+       case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
+               return "WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP";
+       case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
+               return "WIFI_DIRECT_CMD_SET_MAX_CLIENT";
+       case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
+               return "WIFI_DIRECT_CMD_GET_MAX_CLIENT";
+       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
+               return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE";
+
+       case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
+               return "WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE";
+       case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
+               return "WIFI_DIRECT_CMD_IS_DISCOVERABLE";
+       case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
+               return "WIFI_DIRECT_CMD_IS_LISTENING_ONLY";
+       case WIFI_DIRECT_CMD_GET_OWN_GROUP_CHANNEL:
+               return "WIFI_DIRECT_CMD_GET_OWN_GROUP_CHANNEL";
+       case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
+               return "WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP";
+       case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
+               return "WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP";
+       case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP:
+               return "WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP";
+       case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
+               return "WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO";
+       case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
+               return "WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP";
+       case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
+               return "WIFI_DIRECT_CMD_GET_DEVICE_NAME";
+
+       case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
+               return "WIFI_DIRECT_CMD_SET_DEVICE_NAME";
+       case WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL:
+               return "WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL";
+
+       default:
+               return "WIFI_DIRECT_CMD_INVALID";
+
+       }
+}
+
+static wfd_client_s *_wfd_client_find_by_id(GList *clients, int client_id)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_client_s *client = NULL;
+       GList *temp = NULL;
+       
+       if (!clients || client_id < 0) {
+               WDS_LOGE("Invalid parameter(client_id:%d)", client_id);
+               return NULL;
+       }
+
+       temp = g_list_first(clients);
+       while (temp) {
+               client = (wfd_client_s*) temp->data;
+               if (client->client_id == client_id) {
+                       WDS_LOGD("Client found. [%d]", client_id);
+                       break;
+               }
+               temp = g_list_next(temp);
+               client = NULL;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return client;
+}
+
+static int _wfd_client_check_socket(int sock)
+{
+       struct pollfd p_fd;
+       int res = 0;
+
+       p_fd.fd = sock;
+       p_fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL;
+       res = poll((struct pollfd *) &p_fd, 1, 1);
+
+       if (res < 0) {
+               WDS_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
+               return -1;
+       } else if (res == 0) {
+               WDS_LOGD( "poll timeout. socket is busy\n");
+               return 1;
+       } else {
+
+               if (p_fd.revents & POLLERR) {
+                       WDS_LOGE("Error! POLLERR from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLHUP) {
+                       WDS_LOGE("Error! POLLHUP from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLNVAL) {
+                       WDS_LOGE("Error! POLLNVAL from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLIN) {
+                       WDS_LOGD("POLLIN from socket [%d]", sock);
+                       return 0;
+               } else if (p_fd.revents & POLLOUT) {
+                       WDS_LOGD("POLLOUT from socket [%d]", sock);
+                       return 0;
+               }
+       }
+
+       WDS_LOGD("Unknown poll event [%d]", p_fd.revents);
+       return -1;
+}
+
+static int _wfd_send_to_client(int sock, char *data, int data_len)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int wbytes = 0;
+       int left_len = data_len;
+       char *ptr = data;
+       int res = 0;
+
+       if (sock < SOCK_FD_MIN || !data || data_len < 0) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       res = _wfd_client_check_socket(sock);
+       if (res < 0) {
+               WDS_LOGE("Socket error");
+               return -1;
+       } else if (res > 0) {
+               WDS_LOGE("Socket is busy");
+               return -2;
+       }
+
+       errno = 0;
+       while (left_len) {
+               wbytes = write(sock, ptr, left_len);
+               if (wbytes <= 0) {
+                       WDS_LOGE("Failed to write data into socket[%d]. [error=%s]", sock, strerror(errno));
+                       break;
+               }else if (wbytes < left_len) {
+                       WDS_LOGD("%d bytes left. Continue sending...", left_len - wbytes);
+                       left_len -= wbytes;
+                       ptr += wbytes;
+               } else if (wbytes == left_len) {
+                       WDS_LOGD("Succeeded to write data[%d bytes] into socket [%d]", wbytes, sock);
+                       left_len = 0;
+               } else {
+                       WDS_LOGE("Unknown error occurred. [%s]", strerror(errno));
+                       break;
+               }
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       if (left_len)
+               return -1;
+       else
+               return 0;
+}
+
+static int _wfd_read_from_client(int sock, char *data, int data_len)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int rbytes = 0;
+       int total_rbytes = 0;
+       int res = 0;
+
+       if(sock < SOCK_FD_MIN || !data || data_len <= 0) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       res = _wfd_client_check_socket(sock);
+       if (res < 0) {
+               WDS_LOGE("Socket error");
+               return -1;
+       } else if (res > 0) {
+               WDS_LOGE("Socket is busy");
+               return -2;
+       }
+
+       while(data_len) {
+               errno = 0;
+               rbytes = read(sock, data, data_len);
+               if (rbytes <= 0) {
+                       WDS_LOGE("Failed to read data from socket[%d]", sock);
+                       return -1;
+               }
+               total_rbytes += rbytes;
+               data += rbytes;
+               data_len -= rbytes;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return total_rbytes;
+}
+
+int wfd_client_send_event(wfd_manager_s *manager, wifi_direct_client_noti_s *noti)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int cnt = 0;
+       int res = 0;
+       wfd_client_s *client = NULL;
+       GList *temp = NULL;
+
+       if (!manager || !noti) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       temp = g_list_first(manager->clients);
+       while (temp) {
+               client = temp->data;
+               res = _wfd_send_to_client(client->asock, (char*) noti, sizeof(wifi_direct_client_noti_s));
+               if (res < 0) {
+                       WDS_LOGE("Failed to send Notification[%d] to client [%d]", noti->event, client->client_id);
+                       temp = g_list_next(temp);
+                       _wfd_deregister_client(manager, client->client_id);
+               } else {
+                       WDS_LOGD("Succeeded to send Notification [%d:%d] to client [%d]", noti->event,
+                                                                       noti->error, client->client_id);
+                       temp = g_list_next(temp);
+                       cnt++;
+               }
+               client = NULL;
+       }
+       WDS_LOGD("Notification[%d:%d] sent to %d clients, Not Sent [%d]",
+                                       noti->event, noti->error, cnt, manager->client_count - cnt);
+
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _wfd_register_client(void *data, int sock)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int rbytes = 0;
+       wifi_direct_client_request_s req;
+       wifi_direct_client_response_s rsp;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_client_s *client = NULL;
+       int res = 0;
+
+       if (sock < SOCK_FD_MIN) {
+               WDS_LOGE("Invalid argument");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       errno = 0;
+       rbytes = read(sock, (char*) &req, sizeof(wifi_direct_client_request_s));
+       if (rbytes <= 0) {
+               WDS_LOGE("Failed to read socket data from client. [%s]", strerror(errno));
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (req.cmd == WIFI_DIRECT_CMD_REGISTER) {
+               // TODO: check validity of command
+               client = _wfd_client_find_by_id(manager->clients, req.client_id);
+               if (client) {
+                       WDS_LOGE("Client already exist. client_id [%d]", sock);
+                       res = WIFI_DIRECT_ERROR_NOT_PERMITTED; // WIFI_DIRECT_ERROR_ALREADY_EXIST
+                       goto send_response;
+               }
+
+               client = (wfd_client_s*) calloc(1, sizeof(wfd_client_s));
+               client->client_id = sock;
+               client->ssock = sock;
+
+               GIOChannel *gio = NULL;
+               gio = g_io_channel_unix_new(sock);
+               client->gsource_id = g_io_add_watch(gio, G_IO_IN | G_IO_ERR | G_IO_HUP,
+                                                       (GIOFunc) wfd_client_process_request, (gpointer) sock);
+               g_io_channel_unref(gio);
+
+               manager->clients = g_list_prepend(manager->clients, (gpointer) client);
+               manager->client_count++;
+               WDS_LOGD("Client [%d] is added. %d client alive", client->client_id, manager->client_count);
+
+               res = WIFI_DIRECT_ERROR_NONE;
+               WDS_LOGD("New client[%d] added. Total count [%d]", client->client_id, manager->client_count);
+       } else if (req.cmd == WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET) {
+               client = _wfd_client_find_by_id(manager->clients, req.client_id);
+               if (!client) {
+                       WDS_LOGE("Client not found. client_id[%d]", req.client_id);
+                       res = WIFI_DIRECT_ERROR_NOT_PERMITTED; // WIFI_DIRECT_ERROR_UNKNOWN_CLIENT
+                       goto done;
+               }
+
+               client->asock = sock;
+               WDS_LOGD("Async socket[%d] for New client[%d] added.", sock, client->client_id);
+               goto done;
+       } else {
+               WDS_LOGE("Unknown command from client. [%d]", req.cmd);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+send_response:
+       rsp.cmd = req.cmd;
+       rsp.client_id = client->client_id;
+       rsp.result = res;
+       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(wifi_direct_client_response_s));
+       if (res < 0) {
+               WDS_LOGE("Failed to send response to client");
+               _wfd_deregister_client(manager, req.client_id);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+done:
+       __WDS_LOG_FUNC_EXIT__;
+       return 0; 
+}
+
+static int _wfd_deregister_client(void *data, int client_id)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_client_s *client = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+
+       client =  _wfd_client_find_by_id(manager->clients, client_id);
+       if (!client) {
+               WDS_LOGE("Failed to find client[%d]", client_id);
+               return -1;
+       }
+       manager->clients = g_list_remove(manager->clients, client);
+       manager->client_count--;
+       WDS_LOGD("Client [%d] is removed. %d client left", client->client_id, manager->client_count);
+
+       if (client->asock >= SOCK_FD_MIN)
+               close(client->asock);
+       client->asock = -1;
+       if (client->ssock >= SOCK_FD_MIN)
+               close(client->ssock);
+       client->ssock = -1;
+       g_source_remove(client->gsource_id);
+       client->gsource_id = 0;
+
+       if (client)
+               free(client);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _wfd_create_server_socket(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int sock;
+       struct sockaddr_un saddr;
+       int sock_opt = 1;
+       int res = 0;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter(NULL)");
+               return -1;
+       }
+
+       /* Server socket initialization */
+       unlink(WFD_SERVER_SOCK_PATH);
+
+       errno = 0;
+       sock = socket(AF_UNIX, SOCK_STREAM, 0);
+       if (sock < 0) {
+               WDS_LOGE("Failed to create server socket. [%s]", strerror(errno));
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       errno = 0;
+       res = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sock_opt, sizeof(sock_opt));
+       if (res == -1) {
+               WDS_LOGE("Failed to set socket option. [%s]", strerror(errno));
+               close(sock);
+               return -1;
+       }
+
+       memset(&saddr, 0x00, sizeof(saddr));
+       saddr.sun_family = AF_UNIX;
+       snprintf(saddr.sun_path, sizeof(saddr.sun_path), WFD_SERVER_SOCK_PATH);
+
+       errno = 0;
+       res = bind(sock, (struct sockaddr*) &saddr, sizeof(saddr));
+       if (res == -1) {
+               WDS_LOGE("Failed to bind server socket. [%s]", strerror(errno));
+               close(sock);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       errno = 0;
+       res = chmod(WFD_SERVER_SOCK_PATH, WFD_SERVER_SOCK_MODE);
+       if (res == -1) {
+               WDS_LOGE("Failed to change mode of server socket file. [%s]", strerror(errno));
+               close(sock);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       errno = 0;
+       res = listen(sock, WFD_MAX_CLIENT);
+       if (res == -1) {
+               WDS_LOGE("Failed to listen server socket. [%s]", strerror(errno));
+               close(sock);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       manager->serv_sock = sock;
+       WDS_LOGD("Succeeded to create server socket. [%d]", sock);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static gboolean _wfd_accept_client(GIOChannel *source,
+                                                                       GIOCondition condition,
+                                                                       gpointer user_data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) user_data;
+       int cli_sock = -1;
+       socklen_t cli_len = 0;
+       int res = 0;
+
+       if (!manager || manager->serv_sock < 0) {
+               WDS_LOGE("Invalid parameter");
+               return FALSE;
+       }
+
+       errno = 0;
+       cli_sock = accept(manager->serv_sock, NULL, &cli_len);
+       if (cli_sock == -1) {
+               WDS_LOGE("Failed to accept client. [%s]", strerror(errno));
+               return FALSE;
+       }
+
+       res = _wfd_register_client(manager, cli_sock);
+       if (res < 0) {
+               WDS_LOGE("Failed to register client.");
+               close(cli_sock);
+               return TRUE;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return TRUE;
+}
+
+int wfd_client_handler_init(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       GList *clients = manager->clients;
+       int res = 0;
+
+       if (clients) {
+               g_list_free(clients);
+               clients = NULL;
+       }
+
+       res = _wfd_create_server_socket(manager);
+       if (res < 0) {
+               WDS_LOGE("Failed to create server socket");
+               return -1;
+       }       
+
+       GIOChannel *gio = g_io_channel_unix_new(manager->serv_sock);
+       manager->client_handle = g_io_add_watch(gio, G_IO_IN,
+                                                       (GIOFunc) _wfd_accept_client, manager);
+       g_io_channel_unref(gio);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_client_handler_deinit(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       GList *temp = NULL;
+       wfd_client_s *client = NULL;
+
+       // TODO: remove event source watching GIOChannel
+       if (manager->serv_sock >= SOCK_FD_MIN)
+               close(manager->serv_sock);
+       manager->serv_sock = -1;
+
+       temp = g_list_first(manager->clients);
+       while(temp) {
+               client = temp->data;
+               if (client->ssock >= SOCK_FD_MIN)
+                       close(client->ssock);
+               client->ssock = -1;
+               if (client->asock >= SOCK_FD_MIN)
+                       close(client->asock);
+               client->asock = -1;
+               g_source_remove(client->gsource_id);
+               client->gsource_id = 0;
+               free(client);
+               temp = g_list_next(temp);
+       }
+       g_list_free(manager->clients);
+
+       manager->client_count = 0;
+       manager->clients = NULL;
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static gboolean wfd_client_process_request(GIOChannel *source,
+                                                                       GIOCondition condition,
+                                                                       gpointer user_data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int sock = (int) user_data;
+       wifi_direct_client_request_s req;
+       wifi_direct_client_response_s rsp;
+       char *extra_rsp = NULL;
+       wifi_direct_client_noti_s *noti = NULL;
+       wfd_manager_s *manager = wfd_get_manager();
+       int res = 0;
+
+       if (sock < SOCK_FD_MIN) {
+               WDS_LOGE("Invalid argument");
+               __WDS_LOG_FUNC_EXIT__;
+               return FALSE;
+       }
+
+       memset(&req, 0x0, sizeof(wifi_direct_client_request_s));
+       memset(&rsp, 0x0, sizeof(wifi_direct_client_response_s));
+
+       res = _wfd_read_from_client(sock, (char*) &req, sizeof(req));
+       if (res < 0) {
+               WDS_LOGE("Client socket Hanged up");
+               _wfd_deregister_client(manager, req.client_id);
+               __WDS_LOG_FUNC_EXIT__;
+               return FALSE;
+       } else if (res == 0) {
+               WDS_LOGE("Client socket busy");
+               return TRUE;
+       }
+       WDS_LOGD("Client request [%d:%s], %d bytes read from socket[%d]", req.cmd, wfd_server_print_cmd(req.cmd), res, sock);
+
+       rsp.cmd = req.cmd;
+       rsp.client_id = req.client_id;
+       rsp.result = WIFI_DIRECT_ERROR_NONE;
+
+       switch (req.cmd) {
+       case WIFI_DIRECT_CMD_DEREGISTER:        // manager
+               _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+
+               res = _wfd_deregister_client(manager, req.client_id);
+               if (res < 0) {
+                       WDS_LOGE("Failed to deregister client[%d]", sock);
+               }
+
+               goto done;
+               break;
+       case WIFI_DIRECT_CMD_ACTIVATE:  // manager (event)
+               if (manager->state > WIFI_DIRECT_STATE_DEACTIVATED) {
+                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       break;
+               }
+               rsp.result = wfd_util_wifi_direct_activatable();
+               if (rsp.result < 0)
+                       break;
+
+               res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+               if (res < 0) {
+                       WDS_LOGE("Failed to send response to client");
+                       _wfd_deregister_client(manager, req.client_id);
+                       __WDS_LOG_FUNC_EXIT__;
+                       return FALSE;
+               }
+
+               noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+               noti->event = WIFI_DIRECT_CLI_EVENT_ACTIVATION;
+               noti->error = wfd_manager_activate(manager);
+               res = wfd_client_send_event(manager, noti);
+               if (res < 0) {
+                       WDS_LOGE("Failed to send Notification to client");
+                       free(noti);
+                       __WDS_LOG_FUNC_EXIT__;
+                       return FALSE;
+               }
+               WDS_LOGD("Succeeded to send Notification[%d] to client", noti->event);
+
+               if (noti->error == WIFI_DIRECT_ERROR_NONE) {
+                       wfd_manager_local_config_set(manager);
+                       wfd_util_start_wifi_direct_popup();
+               }
+               free(noti);
+
+               goto done;
+               break;
+       case WIFI_DIRECT_CMD_DEACTIVATE:        // manager (event)
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       break;
+               }
+               res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+               if (res < 0) {
+                       WDS_LOGE("Failed to send response to client");
+                       _wfd_deregister_client(manager, req.client_id);
+                       __WDS_LOG_FUNC_EXIT__;
+                       return FALSE;
+               }
+
+               noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+               noti->event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
+               noti->error = wfd_manager_deactivate(manager);
+               res = wfd_client_send_event(manager, noti);
+               if (res < 0) {
+                       WDS_LOGE("Failed to send Notification to client");
+                       free(noti);
+                       __WDS_LOG_FUNC_EXIT__;
+                       return FALSE;
+               }
+               WDS_LOGD("Succeeded to send Notification[%d] to client", noti->event);
+               free(noti);
+               wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
+
+               wfd_peer_clear_all(manager);
+               WDS_LOGD("peer count[%d], peers[%d]", manager->peer_count, manager->peers);
+               wfd_destroy_group(manager, "all");
+               wfd_destroy_session(manager);
+               wfd_local_reset_data(manager);
+               goto done;
+               break;
+       case WIFI_DIRECT_CMD_GET_LINK_STATUS:
+               rsp.param1 = manager->state;
+               break;
+       case WIFI_DIRECT_CMD_START_DISCOVERY:
+               {
+                       if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+                                       manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+                                       manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
+                               WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       wfd_oem_scan_param_s param;
+                       memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
+                       param.scan_mode = req.data.int1;        // listen_only
+                       param.scan_time = req.data.int2;        // timeout
+                       if (manager->local->dev_role == WFD_DEV_ROLE_GO)
+                               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+
+                       res = wfd_oem_start_scan(manager->oem_ops, &param);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to start scan");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               break;
+                       }
+                       WDS_LOGE("Succeeded to start scan");
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
+
+                       noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+                       if (req.data.int1) {
+                               noti->event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;
+                               manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
+                       } else {
+                               noti->event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
+                               manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
+                       }
+                       noti->error = WIFI_DIRECT_ERROR_NONE;
+               }
+               break;
+       case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
+               if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+                               manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+                               manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
+                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       break;
+               }
+
+               res = wfd_oem_stop_scan(manager->oem_ops);
+               if (res < 0) {
+                       WDS_LOGE("Failed to stop scan");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       break;
+               }
+               WDS_LOGE("Succeeded to stop scan");
+
+               noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+               noti->event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
+               noti->error = WIFI_DIRECT_ERROR_NONE;
+               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);
+               }
+
+               break;
+       case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
+               rsp.param1 = manager->scan_mode == WFD_SCAN_MODE_PASSIVE;
+               break;
+       case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
+               {
+                       wfd_discovery_entry_s *peers = NULL;
+                       int peer_cnt = 0;
+                       peer_cnt = wfd_manager_get_peers(manager, &peers);
+                       WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
+                       if (peer_cnt < 0) {
+                               WDS_LOGE("Failed to get scan result");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               break;
+                       }
+                       rsp.param1 = peer_cnt;
+                       rsp.result = WIFI_DIRECT_ERROR_NONE;
+
+                       rsp.data_length = peer_cnt * sizeof(wfd_discovery_entry_s);
+                       extra_rsp = (char*) peers;
+                       WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
+               }
+               break;
+       case WIFI_DIRECT_CMD_CONNECT: //session (event)
+               {
+                       if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+                                       manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+                                       manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       wfd_group_s *group = (wfd_group_s*) manager->group;
+                       if (group && group->member_count >= manager->max_station) {
+                               rsp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
+                               break;
+                       }
+
+                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+                       if (res < 0) {
+                               WDS_LOGE("Failed to send response to client");
+                               _wfd_deregister_client(manager, req.client_id);
+                               __WDS_LOG_FUNC_EXIT__;
+                               return FALSE;
+                       }
+
+                       noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+                       res = wfd_manager_connect(manager, req.data.mac_addr);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to connet with peer " MACSTR, MAC2STR(req.data.mac_addr));
+                               noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+                               noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
+                       } else {
+                               noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
+                               noti->error = WIFI_DIRECT_ERROR_NONE;
+                               snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
+                       }
+                       goto send_notification;
+               }
+               break;
+       case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
+               {
+                       // TODO: check state
+                       wfd_group_s *group = (wfd_group_s*) manager->group;
+                       if (group && group->member_count >= manager->max_station) {
+                               rsp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
+                               goto send_response;
+                       }
+
+                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+                       if (res < 0) {
+                               WDS_LOGE("Failed to send response to client");
+                               _wfd_deregister_client(manager, req.client_id);
+                               __WDS_LOG_FUNC_EXIT__;
+                               return FALSE;
+                       }
+
+                       noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+                       res = wfd_manager_accept_connection(manager, req.data.mac_addr);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to connet with peer " MACSTR, MAC2STR(req.data.mac_addr));
+                               noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+                               noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
+                       } else {
+                               noti->event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
+                               noti->error = WIFI_DIRECT_ERROR_NONE;
+                               snprintf(noti->param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
+                       }
+                       goto send_notification;
+               }
+               break;
+       case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
+               {
+                       wfd_session_s *session = manager->session;
+                       if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+                               WDS_LOGE("It's not permitted with this state [%d]", manager->state);
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+                       if (res < 0) {
+                               WDS_LOGE("Failed to send response to client");
+                               _wfd_deregister_client(manager, req.client_id);
+                               __WDS_LOG_FUNC_EXIT__;
+                               return FALSE;
+                       }
+
+                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+                       if (res < 0) {
+                               WDS_LOGE("Failed to send response to client");
+                               _wfd_deregister_client(manager, req.client_id);
+                               __WDS_LOG_FUNC_EXIT__;
+                               return FALSE;
+                       }
+
+                       res = wfd_oem_cancel_connection(manager->oem_ops, NULL);
+                       wfd_peer_clear_all(manager);
+                       wfd_destroy_session(manager);
+                       goto done;
+               }
+               break;
+       case WIFI_DIRECT_CMD_REJECT_CONNECTION:
+               {
+                       wfd_session_s *session = manager->session;
+                       if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+                               WDS_LOGE("It's not permitted with this state [%d]", manager->state);
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+                       if (res < 0) {
+                               WDS_LOGE("Failed to send response to client");
+                               _wfd_deregister_client(manager, req.client_id);
+                               __WDS_LOG_FUNC_EXIT__;
+                               return FALSE;
+                       }
+
+                       res = wfd_session_stop(session);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to stop session");
+                               // TODO: Which event should be sent?
+                       }
+
+                       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);
+                       }
+
+                       /* After connection rejected by user, remove cache of all peer and scan again */
+                       wfd_peer_clear_all(manager);
+                       goto done;
+               }
+               break;
+       case WIFI_DIRECT_CMD_DISCONNECT:        // group, session
+               {
+                       wfd_group_s *group = (wfd_group_s*) manager->group;
+                       wfd_device_s *peer = NULL;
+
+                       if (manager->state < WIFI_DIRECT_STATE_CONNECTING || !group) {
+                               WDS_LOGE("It's not permitted with this state [%d]", manager->state);
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       peer = wfd_manager_find_connected_peer(manager, req.data.mac_addr);
+                       if (!peer) {
+                               WDS_LOGE("Connected peer not found");
+                               peer = wfd_manager_get_current_peer(manager);
+                               if (!peer) {
+                                       WDS_LOGE("Connecting peer not found");
+                                       rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+                               }
+                       }
+
+                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+                       if (res < 0) {
+                               WDS_LOGE("Failed to send response to client");
+                               _wfd_deregister_client(manager, req.client_id);
+                               __WDS_LOG_FUNC_EXIT__;
+                               return FALSE;
+                       }
+
+                       if (rsp.result != WIFI_DIRECT_ERROR_NONE)
+                               goto done;
+
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
+
+                       wfd_destroy_session(manager);
+                       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+                               res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr);
+                       } else {
+                               res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                       }
+                       if (res < 0) {
+                               WDS_LOGE("Failed to disconnect peer");
+                               noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+                               noti->event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+                               noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+
+                               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_CONNECTED);
+                                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+                               }
+                               goto send_notification;
+                       }
+                       goto done;
+               }
+               break;
+       case WIFI_DIRECT_CMD_DISCONNECT_ALL:
+               {
+                       if (manager->state < WIFI_DIRECT_STATE_CONNECTING) {
+                               WDS_LOGD("It's not connected state [%d]", manager->state);
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+                       if (res < 0) {
+                               WDS_LOGE("Failed to send response to client");
+                               _wfd_deregister_client(manager, req.client_id);
+                               __WDS_LOG_FUNC_EXIT__;
+                               return FALSE;
+                       }
+
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
+
+                       wfd_destroy_session(manager);
+                       res = wfd_oem_destroy_group(manager->oem_ops, "p2p-wlan0-0");
+                       if (res < 0) {
+                               WDS_LOGE("Failed to destroy group");
+                               noti = (wifi_direct_client_noti_s*) calloc(1, sizeof(wifi_direct_client_noti_s));
+                               noti->event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+                               noti->error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+
+                               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_CONNECTED);
+                                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+                               }
+                               goto send_notification;
+                       }
+                       goto done;
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
+               {
+                       // even though status is not CONNECTED, this command can be excuted only when group exist
+                       if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+                               WDS_LOGD("It's not connected state [%d]", manager->state);
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       wfd_connected_peer_info_s *peers = NULL;
+                       int peer_cnt = 0;
+                       peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
+                       WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
+                       if (peer_cnt < 0) {
+                               WDS_LOGE("Failed to get scan result");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               break;
+                       }
+                       rsp.param1 = peer_cnt;
+                       rsp.result = WIFI_DIRECT_ERROR_NONE;
+
+                       rsp.data_length = peer_cnt * sizeof(wfd_connected_peer_info_s);
+                       extra_rsp = (char*) peers;
+                       WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_IP_ADDR:       // group
+               res = wfd_local_get_ip_addr(rsp.param2);
+               if (res < 0) {
+                       WDS_LOGE("Failed to get local IP address");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_SEND_PROVISION_DISCOVERY_REQ:
+               break;
+       case WIFI_DIRECT_CMD_CREATE_GROUP:      // group
+               {
+                       wfd_group_s *group = manager->group;
+                       if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                               WDS_LOGE("Group already exist");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       group = wfd_create_pending_group(manager, manager->local->intf_addr);
+                       if (!group) {
+                               WDS_LOGE("Failed to create pending group");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       }
+                       group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
+
+                       res = wfd_oem_create_group(manager->oem_ops, 0, 0);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to create group");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       }
+               }
+               break;
+       case WIFI_DIRECT_CMD_CANCEL_GROUP:
+               {
+                       wfd_group_s *group = manager->group;
+                       if (!group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+                               WDS_LOGE("Group not exist");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to destroy group");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               break;
+                       }
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+               }
+               break;
+       case WIFI_DIRECT_CMD_IS_GROUPOWNER:
+               {
+                       wfd_device_s *local = manager->local;
+                       rsp.param1 = local->dev_role == WFD_DEV_ROLE_GO;
+               }
+               break;
+       case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
+               {
+                       wfd_group_s *group = manager->group;
+                       if (!group) {
+                               WDS_LOGE("Group not exist");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+                       rsp.param1 = group->flags & WFD_GROUP_FLAG_AUTONOMOUS;
+               }
+               break;
+       case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP:
+               {
+                       wfd_group_s *group = manager->group;
+                       if (!group) {
+                               WDS_LOGE("Group not exist");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+                       rsp.param1 = group->flags & WFD_GROUP_FLAG_PERSISTENT;
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_OWN_GROUP_CHANNEL:
+               {
+                       wfd_group_s *group = manager->group;
+                       if (!group) {
+                               WDS_LOGE("Group not exist");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+                       rsp.param1 = wfd_util_freq_to_channel(group->freq);
+                       // TODO: check channel value
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO: // group
+               {
+                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                               WDS_LOGE("Wi-Fi Direct is not activated.");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       int persistent_group_count = 0;
+                       wfd_persistent_group_info_s *plist;
+
+                       res = wfd_oem_get_persistent_groups(manager->oem_ops, &plist, &persistent_group_count);
+                       if (res < 0) {
+                               WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               break;
+                       }
+
+                       rsp.param1 = persistent_group_count;
+                       rsp.result = WIFI_DIRECT_ERROR_NONE;
+                       rsp.data_length = persistent_group_count * sizeof(wfd_persistent_group_info_s);
+                       extra_rsp = (char*) plist;
+                       WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
+               }
+               break;
+       case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       break;
+               }
+
+               res = wfd_oem_set_persistent_reconnect(manager->oem_ops, NULL, TRUE);
+               if (res < 0) {
+                       WDS_LOGE("Failed to activate persistent group");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       break;
+               }
+
+               res = wfd_oem_set_persistent_reconnect(manager->oem_ops, NULL, FALSE);
+               if (res < 0) {
+                       WDS_LOGE("Failed to activate persistent group");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:   // group
+               {
+                       wfd_persistent_group_info_s persistent_group;
+
+                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                               WDS_LOGE("Wi-Fi Direct is not activated.");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               _wfd_read_from_client(sock, (char*) &persistent_group, sizeof(wfd_persistent_group_info_s));
+                               break;
+                       }
+
+                       res = _wfd_read_from_client(sock, (char*) &persistent_group, sizeof(wfd_persistent_group_info_s));
+                       if (res == -2) {
+                               WDS_LOGE("Client socket Hanged up");
+                               _wfd_deregister_client(manager, sock);
+                               return FALSE;
+                       } else if (res == -1) {
+                               WDS_LOGE("Failed to read socket [%d]", sock);
+                               return TRUE;
+                       }
+                       WDS_LOGD("Remove persistent group [%s]", persistent_group.ssid);
+
+                       res = wfd_oem_remove_persistent_group(manager->oem_ops,
+                                                                       persistent_group.ssid, persistent_group.go_mac_address);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to remove persistent group");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       }
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_SSID:
+       case WIFI_DIRECT_CMD_GET_DEVICE_NAME:   // manager (sync)
+               res = wfd_local_get_dev_name(rsp.param2);
+               if (res < 0) {
+                       WDS_LOGE("Failed to get device name");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_SET_SSID:
+       case WIFI_DIRECT_CMD_SET_DEVICE_NAME:   // manager (sync)
+               {
+                       char dev_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = {0, };
+                       res = _wfd_read_from_client(sock, dev_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to set device name");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               break;
+                       }
+
+                       res = wfd_local_set_dev_name(dev_name);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to set device name");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       }
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_DEVICE_MAC:    // manager (sync)
+               {
+                       unsigned char mac[MACADDR_LEN] = {0, };
+                       res = wfd_local_get_dev_mac(mac);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to get device mac");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               break;
+                       }
+                       memcpy(rsp.param2, mac, sizeof(mac));
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_GO_INTENT:     // manager (sync)
+               res = wfd_manager_get_go_intent(&rsp.param1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to get GO intent");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_SET_GO_INTENT:     // manager (sync)
+               res = wfd_manager_set_go_intent(req.data.int1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to set GO intent");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
+               res = wfd_manager_get_max_station(&rsp.param1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to get max station");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
+               res = wfd_manager_set_max_station(req.data.int1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to set max station");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
+               res = wfd_manager_get_autoconnection(&rsp.param1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to get autoconnection");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:   // manager (sync)
+               res = wfd_manager_set_autoconnection(req.data.int1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to set autoconnection");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
+               if (manager->state == WIFI_DIRECT_STATE_DISCOVERING
+                               || wfd_group_is_autonomous(manager->group) == 1)
+                       rsp.param1 = TRUE;
+               else
+                       rsp.param1 = FALSE;
+               break;
+       case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:    // manager (sync)
+               res = wfd_local_get_supported_wps_mode(&rsp.param1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to get supported wps mode");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
+               res = wfd_local_get_wps_mode(&rsp.param1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to get wps mode");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
+               res = wfd_manager_get_req_wps_mode(&rsp.param1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to get request wps mode");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
+               res = wfd_manager_set_req_wps_mode(req.data.int1);
+               if (res < 0) {
+                       WDS_LOGE("Failed to set request wps mode");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
+               if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+                       WDS_LOGE("Wi-Fi Direct is not Group Owner.");
+                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       break;
+               }
+
+               res = wfd_oem_wps_start(manager->oem_ops, NULL, WFD_WPS_MODE_PBC, NULL);
+               if (res < 0) {
+                       WDS_LOGE("Failed to start wps");
+                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_PASSPHRASE:
+               {
+                       wfd_group_s *group = manager->group;
+                       if (!group) {
+                               WDS_LOGE("Group not exist");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+                       if (group->role == WFD_DEV_ROLE_GC) {
+                               WDS_LOGE("Device is not GO");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+                       snprintf(rsp.param2, PASSPHRASE_LEN, "%s", group->pass);
+               }
+               break;
+       case WIFI_DIRECT_CMD_GET_WPS_PIN:       // session
+               {
+                       wfd_session_s *session = (wfd_session_s*) manager->session;
+                       if (!session) {
+                               WDS_LOGE("Session not exist");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               break;
+                       }
+
+                       if (session->wps_pin[0] == '\0') {
+                               WDS_LOGE("WPS PIN is not set");
+                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                               break;
+                       }
+                       snprintf(rsp.param2, sizeof(rsp.param2), "%s", session->wps_pin);
+               }
+               break;
+       case WIFI_DIRECT_CMD_SET_WPS_PIN:       // session
+               {
+                       char pin[PINSTR_LEN+1] = {0, };
+                       wfd_session_s *session = (wfd_session_s*) manager->session;
+                       if (!session) {
+                               WDS_LOGE("Session not exist");
+                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                               _wfd_read_from_client(sock, pin, PINSTR_LEN);
+                               break;
+                       }
+
+                       res = _wfd_read_from_client(sock, session->wps_pin, PINSTR_LEN);
+                       if (res == -2) {
+                               WDS_LOGE("Client socket Hanged up");
+                               _wfd_deregister_client(manager, sock);
+                               return FALSE;
+                       } else if (res == -1) {
+                               WDS_LOGE("Failed to read socket [%d]", sock);
+                               return TRUE;
+                       }
+                       session->wps_pin[PINSTR_LEN] = '\0';
+                       WDS_LOGD("PIN string [%s]", session->wps_pin);
+               }
+               break;
+       case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:  // manager
+               // TODO: implement in plugin
+               break;
+       default:
+               WDS_LOGE("Unknown command[%d]", req.cmd);
+               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+               break;
+       }
+
+send_response:
+       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
+       if (res < 0) {
+               WDS_LOGE("Failed to send response to client");
+               if (noti)
+                       free(noti);
+               _wfd_deregister_client(manager, req.client_id);
+               __WDS_LOG_FUNC_EXIT__;
+               return FALSE;
+       }
+
+       if (rsp.data_length > 0) {
+               res = _wfd_send_to_client(sock, (char*) extra_rsp, rsp.data_length);
+               if (res < 0) {
+                       WDS_LOGE("Failed to send extra response data to client");
+                       free(extra_rsp);
+                       if (noti)
+                               free(noti);
+                       _wfd_deregister_client(manager, req.client_id);
+                       __WDS_LOG_FUNC_EXIT__;
+                       return FALSE;
+               }
+               if (extra_rsp)
+                       free(extra_rsp);
+       }
+
+send_notification:
+       if (noti) {
+               res = wfd_client_send_event(manager, noti);
+               if (res < 0) {
+                       WDS_LOGE("Failed to send Notification to client");
+                       free(noti);
+                       __WDS_LOG_FUNC_EXIT__;
+                       return FALSE;
+               }
+               WDS_LOGD("Succeeded to send Notification[%d] to client", noti->event);
+               free(noti);
+       }
+
+done:
+
+       __WDS_LOG_FUNC_EXIT__;
+       return TRUE;
+}
+
diff --git a/src/wifi-direct-dhcp.c b/src/wifi-direct-dhcp.c
deleted file mode 100644 (file)
index 92887a0..0000000
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <glib.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-#include <unistd.h>
-
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <errno.h>
-#include <linux/wireless.h>
-#include <sys/ioctl.h>
-#include <glib.h>
-#include <glib-object.h>
-#include <sys/wait.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include <vconf.h>
-#include <vconf-keys.h>
-
-#include "wifi-direct.h"
-#include "wifi-direct-client-handler.h"
-#include "wifi-direct-internal.h"
-#include "wifi-direct-service.h"
-#include "wifi-direct-stub.h"
-#include "wifi-direct-oem.h"
-
-#if 0
-
-#define IF_BUF_LEN             30
-#define NET_BUF_LEN            10
-
-
-#define DRIVER_DELAY   250000  /* micro seconds */
-
-#define SOFTAP_SSID_LEN                32
-#define SOFTAP_PASSWD_LEN      64
-#define SOFTAP_IP_ADDR_LEN     20
-#define SOFTAP_STR_BSSID_LEN   18
-#define INTERFACE_NAME_LEN     10
-
-/* Network Interface */
-#define WIFID_IF  "wl0.1"
-
-#define IP_ADDRESS_SOFTAP      "192.168.61.1"
-
-#define RET_FAILURE     (-1)
-#define RET_SUCCESS     (0)
-#define MAX_BUF_SIZE    (256u)
-#define WFD_BSSID_LEN   32
-#define MOBILE_AP_WIFI_MAX_DEVICE 8
-#define DNSMASQ_CONF_LEN       1024
-
-#define DNSMASQ_CONF   "dhcp-range=set:red,192.168.61.21,192.168.61.150\n" \
-                       "dhcp-range=set:green,192.168.130.2,192.168.130.150\n" \
-                       "dhcp-range=set:blue,192.168.129.4,192.168.129.150\n"\
-                       "dhcp-option=option:dns-server,%s\n" \
-                       "dhcp-option=tag:red,option:router,192.168.61.1\n" \
-                       "dhcp-option=tag:green,option:router,192.168.130.1\n" \
-                       "dhcp-option=tag:blue,option:router,192.168.129.3\n"
-
-
-#define DNSMASQ_CONF_FILE      "/tmp/dnsmasq.conf"
-#define RESOLV_CONF_FILE       "/etc/resolv.conf"
-
-#define DNSMASQ_LEASES_FILE    "/var/lib/misc/dnsmasq.leasess"
-
-
-typedef struct
-{
-       unsigned int number;            /* Number of connected device */
-       /* BSSID list of connected device */
-       char bssid[MOBILE_AP_WIFI_MAX_DEVICE][WFD_BSSID_LEN];
-} softap_device_info_t;
-
-
-static int __issue_ioctl(int sock_fd, char *if_name, char *cmd, char *buf)
-{
-       int ret_val = RET_SUCCESS;
-       struct iwreq iwr;
-
-       memset(buf, 0, MAX_BUF_SIZE);
-       memset(&iwr, 0, sizeof(iwr));
-
-       /* Configure ioctl parameters */
-       g_strlcpy(iwr.ifr_name, if_name, IFNAMSIZ);
-       g_strlcpy(buf, cmd, MAX_BUF_SIZE);
-       iwr.u.data.pointer = buf;
-       iwr.u.data.length = MAX_BUF_SIZE;
-
-       /* Print the command buffer. */
-       //MH_AGENT_LOG (MH_LOW, "iwr.u.data.length = %d\n", iwr.u.data.length);
-       //__print_buf (iwr.u.data.pointer, iwr.u.data.length, 16);
-
-       usleep(DRIVER_DELAY);
-       /* Issue ioctl */
-       if ((ioctl(sock_fd, SIOCSIWPRIV, &iwr)) < 0)
-       {
-               WDS_LOGF( "ioctl failed...!!!\n");
-               ret_val = RET_FAILURE;
-       }
-
-       /* Print the return buffer. */
-       //MH_AGENT_LOG (MH_LOW, "iwr.u.data.length = %d\n", iwr.u.data.length);
-       //__print_buf (iwr.u.data.pointer, iwr.u.data.length, 16);
-
-       return ret_val;
-}
-
-
-int _wfd_core_set_ip_address(const char *if_name, const char *ip_address)
-{
-       struct ifreq ifr;
-       struct sockaddr_in addr;
-       int sock_fd;
-
-       WDS_LOGD( "if_name : %s ip address :%s\n", if_name, ip_address);
-
-       if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-       {
-               WDS_LOGF( "socket open failed!!!\n");
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-
-       g_strlcpy(ifr.ifr_name, if_name, IFNAMSIZ);
-
-       memset(&addr, 0, sizeof(struct sockaddr));
-       addr.sin_family = AF_INET;
-       addr.sin_port = 0;
-       addr.sin_addr.s_addr = inet_addr(ip_address);
-
-       memcpy(&ifr.ifr_addr, &addr, sizeof(struct sockaddr));
-       if (ioctl(sock_fd, SIOCSIFADDR, &ifr) < 0)
-       {
-               WDS_LOGF( "ioctl failed...!!!\n");
-               close(sock_fd);
-               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
-       }
-
-       if (ioctl(sock_fd, SIOCGIFFLAGS, &ifr) < 0)
-       {
-               WDS_LOGF( "ioctl failed...!!!\n");
-               close(sock_fd);
-               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
-       }
-
-       ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
-       if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) < 0)
-       {
-               WDS_LOGF( "ioctl failed...!!!\n");
-               close(sock_fd);
-               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
-       }
-
-       close(sock_fd);
-
-       return WIFI_DIRECT_ERROR_NONE;
-}
-
-
-int _mh_core_get_device_info(softap_device_info_t * di)
-{
-       int sock_fd;
-       char *if_name = WIFID_IF;
-       char cmd[MAX_BUF_SIZE];
-       char buf[MAX_BUF_SIZE] = { 0 };
-       int ret_status = WIFI_DIRECT_ERROR_NONE;
-
-       char *buf_ptr = NULL;
-       unsigned int sta_count = 0;
-       int i;
-
-       WDS_LOGF( "+\n");
-
-       if ((sock_fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
-       {
-               WDS_LOGF( "Failed to open socket...!!!\n");
-               di->number = 0;
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-
-       snprintf(cmd, MAX_BUF_SIZE, "AP_GET_STA_LIST");
-       ret_status = __issue_ioctl(sock_fd, if_name, cmd, buf);
-       if (ret_status < 0)
-       {
-               WDS_LOGF( "__issue_ioctl failed...!!!\n");
-               di->number = 0;
-               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
-       }
-
-       buf_ptr = buf;
-
-       sscanf(buf_ptr, "%02x", &sta_count);
-       buf_ptr += 2;
-       WDS_LOGF( "connected station : %d\n", sta_count);
-
-       di->number = sta_count;
-
-       for (i = 0; i < di->number; i++)
-       {
-               unsigned int l_bssid[WFD_BSSID_LEN];
-               sscanf(buf_ptr, "%02X%02X%02X%02X%02X%02X", &l_bssid[0],
-                          &l_bssid[1], &l_bssid[2], &l_bssid[3], &l_bssid[4], &l_bssid[5]);
-               snprintf(di->bssid[i], WFD_BSSID_LEN,
-                                "%02X:%02X:%02X:%02X:%02X:%02X",
-                                l_bssid[0], l_bssid[1], l_bssid[2],
-                                l_bssid[3], l_bssid[4], l_bssid[5]);
-
-               WDS_LOGF( "STA[%d] address[%s]\n", i,
-                                          di->bssid[i]);
-
-               buf_ptr += 12;
-       }
-
-       close(sock_fd);
-
-       return ret_status;
-}
-
-int _mh_core_execute_dhcp_server()
-{
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       char buf[DNSMASQ_CONF_LEN] = "";
-       char dns_server[SOFTAP_IP_ADDR_LEN] = { 0, };
-       FILE *fp = NULL;
-       pid_t pid;
-
-       snprintf(buf, DNSMASQ_CONF_LEN, DNSMASQ_CONF, dns_server);
-
-       fp = fopen(DNSMASQ_CONF_FILE, "w");
-       if (NULL == fp)
-       {
-               WDS_LOGF( "Could not create the file.\n");
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-
-       fputs(buf, fp);
-       fclose(fp);
-
-       if ((pid = fork()) < 0)
-       {
-               WDS_LOGF( "fork failed\n");
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-
-       if (!pid)
-       {
-               if (execl("/usr/bin/dnsmasq", "/usr/bin/dnsmasq", "-d", "-p",
-                                 "0", "-C", DNSMASQ_CONF_FILE, (char *) NULL))
-               {
-                       WDS_LOGF( "execl failed\n");
-               }
-
-               WDS_LOGF( "Should not get here!");
-               return WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-       }
-       else
-       {
-               WDS_LOGF( "child pid : %d\n", pid);
-               wfd_server->dhcp_pid = pid;
-       }
-
-       return WIFI_DIRECT_ERROR_NONE;
-}
-
-int _mh_core_terminate_dhcp_server()
-{
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       kill(wfd_server->dhcp_pid, SIGTERM);
-       waitpid(wfd_server->dhcp_pid, NULL, 0);
-
-       return WIFI_DIRECT_ERROR_NONE;
-}
-#endif
-
-#define VCONFKEY_DHCP_IP_LEASE "memory/private/wifi_direct_manager/dhcp_ip_lease"
-#define DHCP_DUMP_FILE "/tmp/dhcp-client-table"
-#define MAX_DHCP_DUMP_SIZE 64    // Single lease format: [99:66:dd:00:11:aa 192.168.16.20 00:00:60]
-
-void __wfd_DHCP_lease_add_cb(keynode_t *key, void* data)
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-       wifi_direct_client_noti_s noti;
-       FILE *fp = NULL;
-       char buf[MAX_DHCP_DUMP_SIZE];
-       char ip_str[20];
-       char mac_str[20];
-       unsigned char mac_hex[6];
-       int n = 0;
-       int i = 0;
-
-       WDS_LOGD( "DHCP: IP is leased..\n");
-       memset(&noti, 0, sizeof(wifi_direct_client_noti_s));
-
-       if (wfd_oem_is_groupowner() == FALSE)
-       {
-               WDS_LOGD( "DHCP: Ignore event. and Kill DHPC server\n");
-               system("wifi-direct-dhcp.sh stop");
-               return;
-       }
-
-       fp = fopen(DHCP_DUMP_FILE, "r");
-       if (NULL == fp)
-       {
-               WDS_LOGF( "Could not read the file [%s].\n",DHCP_DUMP_FILE);
-               return;
-       }
-
-    while(fgets(buf, MAX_DHCP_DUMP_SIZE, fp) != NULL)
-    {
-        n = sscanf(buf,"%s %s", mac_str, ip_str);
-       WDS_LOGE( "ip=[%s], mac=[%s].\n",ip_str, mac_str);
-        if (n != 2)
-        {
-               continue;
-        }
-        wfd_macaddr_atoe(mac_str, mac_hex);
-        for(i=0; i<WFD_MAX_ASSOC_STA; i++)
-        {
-
-               if (wfd_server->connected_peers[i].isUsed == 1 &&
-                               memcmp(mac_hex, wfd_server->connected_peers[i].int_address, 6) == 0)
-               {
-                       WDS_LOGD( "Found peer: interface mac=[%s].\n",mac_str);
-                       WDS_LOGD( "device mac=["MACSTR"]\n",MAC2STR(wfd_server->connected_peers[i].peer.mac_address));
-
-                       inet_aton(ip_str, (struct in_addr*)&wfd_server->connected_peers[i].ip_address);
-                       WDS_LOGD( "Fill IP: ip=[%s].\n",ip_str);
-
-                       //Send event to client with [dev_mac, ip]
-                       noti.event = WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND;
-                       snprintf(noti.param1, 64, MACSTR, MAC2STR(wfd_server->connected_peers[i].peer.mac_address));
-                       snprintf(noti.param2, 64, "%s", ip_str);
-                       __wfd_server_send_client_event(&noti);
-                       break;
-               }
-        }
-        if (i==WFD_MAX_ASSOC_STA)
-               WDS_LOGE( "Can't find peer from table\n");
-
-        __wfd_server_print_connected_peer();
-    }
-       fclose(fp);
-
-       __WDS_LOG_FUNC_EXIT__;
-}
-
-
-#define VCONFKEY_DHCPC_SERVER_IP "memory/private/wifi_direct_manager/dhcpc_server_ip"
-int wfd_get_dhcpc_server_ip(char* str, int len)
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       char* get_str = NULL;
-       if (str==NULL || len <=0)
-               return -1;
-
-       get_str = vconf_get_str(VCONFKEY_DHCPC_SERVER_IP);
-
-       if (get_str == NULL)
-       {
-               WDS_LOGE( "Error reading vconf (%s)\n", VCONFKEY_DHCPC_SERVER_IP);
-               return -1;
-       }
-       else
-       {
-               WDS_LOGD("VCONFKEY_WIFI_STATE(%s) : %d\n", VCONFKEY_DHCPC_SERVER_IP, get_str);
-               snprintf(str, len, get_str);
-               return 0;
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-
-       return 0;
-
-}
-
-
-int wfd_set_DHCP_event_handler()
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-
-       vconf_set_int(VCONFKEY_DHCP_IP_LEASE, 0);
-       vconf_notify_key_changed(VCONFKEY_DHCP_IP_LEASE, __wfd_DHCP_lease_add_cb, NULL);
-
-       __WDS_LOG_FUNC_EXIT__;
-       
-       return 0;
-}
-
-
diff --git a/src/wifi-direct-event-handler.c b/src/wifi-direct-event-handler.c
deleted file mode 100644 (file)
index b7a36b9..0000000
+++ /dev/null
@@ -1,1117 +0,0 @@
-/*\r
- * Network Configuration Module\r
- *\r
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *\r
- */\r
-\r
-#include <errno.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <stdbool.h>\r
-#include <sys/types.h>\r
-#include <sys/socket.h>\r
-#include <unistd.h>\r
-\r
-#include <glib.h>\r
-\r
-#include "wifi-direct-service.h"\r
-#include "wifi-direct-event-handler.h"\r
-#include "wifi-direct-oem.h"\r
-#include "wifi-direct-internal.h"\r
-#include "wifi-direct-utils.h"\r
-\r
-char wfd_event_str[WFD_EVENT_MAX];\r
-\r
-char *__wfd_print_client_event(wfd_client_event_e event)\r
-{\r
-       switch (event)\r
-       {\r
-       case WIFI_DIRECT_CLI_EVENT_ACTIVATION:\r
-               return "ACTIVATION";\r
-       case WIFI_DIRECT_CLI_EVENT_DEACTIVATION:\r
-               return "DEACTIVATION";\r
-       case WIFI_DIRECT_CLI_EVENT_DISCOVER_START:\r
-               return "DISCOVER_START_80211_SCAN";\r
-       case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY:\r
-               return "DISCOVER_START_LISTEN_ONLY";\r
-       case WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN:\r
-               return "DISCOVER_START_SEARCH_LISTEN";\r
-       case WIFI_DIRECT_CLI_EVENT_DISCOVER_END:\r
-               return "DISCOVER_END";\r
-       case WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS:\r
-               return "DISCOVER_FOUND_PEERS";\r
-       case WIFI_DIRECT_CLI_EVENT_CONNECTION_START:\r
-               return "CONNECTION_START";\r
-       case WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ:\r
-               return "CONNECTION_REQ";\r
-       case WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP:\r
-               return "CONNECTION_RSP";\r
-       case WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ:\r
-               return "CONNECTION_WPS_REQ";\r
-       case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP:\r
-               return "DISCONNECTION_RSP";\r
-       case WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND:\r
-               return "DISCONNECTION_IND";\r
-       case WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP:\r
-               return "GROUP_CREATE_RSP";\r
-       case WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP:\r
-               return "GROUP_DESTROY_RSP";\r
-       case WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND:\r
-               return "IP_LEASED_IND";\r
-       default:\r
-               WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);\r
-               return "INVALID EVENT";\r
-       }\r
-}\r
-\r
-\r
-char *__wfd_server_print_event(wfd_event_t event)\r
-{\r
-       switch (event)\r
-       {\r
-       case WFD_EVENT_DISCOVER_START_80211_SCAN:\r
-               return "DISCOVER_START_80211_SCAN";\r
-       case WFD_EVENT_DISCOVER_START_SEARCH_LISTEN:\r
-               return "DISCOVER_START_SEARCH_LISTEN";\r
-       case WFD_EVENT_DISCOVER_FOUND_PEERS:\r
-               return "DISCOVER_FOUND_PEERS";\r
-       case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:\r
-               return "DISCOVER_FOUND_P2P_GROUPS";\r
-       case WFD_EVENT_DISCOVER_CANCEL:\r
-               return "DISCOVER_CANCEL";\r
-       case WFD_EVENT_DISCOVER_COMPLETE:\r
-               return "DISCOVER_COMPLETE";\r
-       case WFD_EVENT_DISCOVER_FAIL:\r
-               return "DISCOVER_FAIL";\r
-       case WFD_EVENT_DISCOVER_RESUMED:\r
-               return "DISCOVER_RESUMED";\r
-       case WFD_EVENT_DISCOVER_SUSPENDED:\r
-               return "DISCOVER_SUSPENDED";\r
-       case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:\r
-               return "DISCOVER_START_LISTEN_ONLY";\r
-       case WFD_EVENT_PROV_DISCOVERY_REQUEST:\r
-               return "PROV_DISCOVERY_REQUEST";\r
-       case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:\r
-               return "PROV_DISCOVERY_REQUEST_WPS_DISPLAY";\r
-       case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:\r
-               return "PROV_DISCOVERY_REQUEST_WPS_KEYPAD";\r
-       case WFD_EVENT_PROV_DISCOVERY_RESPONSE:\r
-               return "PROV_DISCOVERY_RESPONSE";\r
-       case WFD_EVENT_PROV_DISCOVERY_TIMEOUT:\r
-               return "PROV_DISCOVERY_TIMEOUT";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_START:\r
-               return "GROUP_OWNER_NEGOTIATION_START";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_AP_ACK:\r
-               return "GROUP_OWNER_NEGOTIATION_AP_ACK";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_STA_ACK:\r
-               return "GROUP_OWNER_NEGOTIATION_STA_ACK";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED:\r
-               return "GROUP_OWNER_NEGOTIATION_REQUEST_RECEIVED";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_COMPLETE:\r
-               return "GROUP_OWNER_NEGOTIATION_COMPLETE";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:\r
-               return "GROUP_OWNER_NEGOTIATION_FAIL";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:\r
-               return "GROUP_OWNER_NEGOTIATION_NO_PROV_INFO";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL:\r
-               return "GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL";\r
-       case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT:\r
-               return "GROUP_OWNER_NEGOTIATION_FAIL_INTENT";\r
-       case WFD_EVENT_CREATE_LINK_START:\r
-               return "CREATE_LINK_START";\r
-       case WFD_EVENT_CREATE_LINK_CANCEL:\r
-               return "CREATE_LINK_CANCEL";\r
-       case WFD_EVENT_CREATE_LINK_TIMEOUT:\r
-               return "CREATE_LINK_TIMEOUT";\r
-       case WFD_EVENT_CREATE_LINK_AUTH_FAIL:\r
-               return "CREATE_LINK_AUTH_FAIL";\r
-       case WFD_EVENT_CREATE_LINK_FAIL:\r
-               return "CREATE_LINK_FAIL";\r
-       case WFD_EVENT_CREATE_LINK_COMPLETE:\r
-               return "CREATE_LINK_COMPLETE";\r
-       case WFD_EVENT_CONNECT_PBC_START:\r
-               return "CONNECT_PBC_START";\r
-       case WFD_EVENT_PRIMARY_IF_DISCONNECTION:\r
-               return "PRIMARY_IF_DISCONNECTION";\r
-       case WFD_EVENT_SVC_REQ_RECEIVED:\r
-               return "SVC_REQ_RECEIVED";\r
-       case WFD_EVENT_SVC_RESP_RECEIVED:\r
-               return "SVC_RESP_RECEIVED";\r
-       case WFD_EVENT_SVC_COMEBACK_REQ_RECEIVED:\r
-               return "SVC_COMEBACK_REQ_RECEIVED";\r
-       case WFD_EVENT_SVC_COMEBACK_RESP_RECEIVED:\r
-               return "SVC_COMEBACK_RESP_RECEIVED";\r
-       case WFD_EVENT_DEV_DISCOVERABILITY_REQ:\r
-               return "DEV_DISCOVERABILITY_REQ";\r
-       case WFD_EVENT_DEV_DISCOVERABILITY_RSP:\r
-               return "DEV_DISCOVERABILITY_RSP";\r
-       case WFD_EVENT_GO_DISCOVERABILITY_REQ:\r
-               return "GO_DISCOVERABILITY_REQ";\r
-       case WFD_EVENT_SOFTAP_READY:\r
-               return "SOFTAP_READY";\r
-       case WFD_EVENT_SOFTAP_STOP:\r
-               return "SOFTAP_STOP";\r
-       case WFD_EVENT_IP_ASSIGNED:\r
-               return "IP_ASSIGNED";\r
-       case WFD_EVENT_IP_LEASED:\r
-               return "IP_LEASED";\r
-       case WFD_EVENT_INVITE_REQUEST:\r
-               return "INVITE_REQUEST";\r
-       case WFD_EVENT_INVITE_RESPONSE:\r
-               return "INVITE_RESPONSE";\r
-       default:\r
-               WDS_LOGF( "Error!!! Invalid Event (%d) \n", event);\r
-               return "INVALID EVENT";\r
-       }\r
-\r
-}\r
-\r
-void __wfd_server_print_connected_peer()\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               if (wfd_server->connected_peers[i].isUsed == 0)\r
-               {\r
-                       WDS_LOGD( "Connected Peer[%d] isUsed=[%d]\n", i,\r
-                                                  wfd_server->connected_peers[i].isUsed);\r
-               }\r
-               else\r
-               {\r
-                       WDS_LOGD( "Connected Peer[%d] isUsed=[%d] dev mac=" MACSTR " intf mac=" MACSTR " ip="IPSTR" device_name=%s\n" ,\r
-                                       i,\r
-                                       wfd_server->connected_peers[i].isUsed,\r
-                                       MAC2STR(wfd_server->connected_peers[i].peer.mac_address),\r
-                                       MAC2STR(wfd_server->connected_peers[i].int_address),\r
-                                       IP2STR(wfd_server->connected_peers[i].ip_address),\r
-                                       wfd_server->connected_peers[i].peer.device_name\r
-                       );\r
-               }\r
-       }\r
-}\r
-\r
-\r
-bool __wfd_get_ip_address(void *user_data)\r
-{\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       char ip_addr[64];\r
-       if (wfd_oem_dhcpc_get_ip_address(ip_addr, 64, 0) == true)\r
-       {\r
-               wfd_event_t event;\r
-               WDS_LOGE( "** Get IP address!!ip = %s\n", ip_addr);\r
-               wfd_server->dhcp_ip_address_timer = 0;\r
-\r
-               event = WFD_EVENT_IP_ASSIGNED;\r
-               wfd_server_process_event(event);\r
-               return false;\r
-       }\r
-       else\r
-       {\r
-               WDS_LOGE( "** Failed to get IP address!!Wait more...\n");\r
-               return true;\r
-       }\r
-}\r
-\r
-void wfd_server_start_dhcp_wait_timer()\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-\r
-#if 0\r
-       //system("killall udhcpc;/usr/bin/udhcpc -i wl0.1 -s /usr/etc/wifi-direct/udhcp_script.non-autoip &");\r
-\r
-       char cmdStr[256] = {0,};\r
-       char *interface_name = NULL;\r
-\r
-       interface_name = wfd_oem_get_default_interface_name();\r
-       if (NULL == interface_name)\r
-               WDS_LOGE( "ERROR : \default interface name is NULL !!!\n");\r
-       else\r
-               WDS_LOGE( "Interface name is [%s]\n", interface_name);\r
-\r
-       sprintf(cmdStr, "killall udhcpc;/usr/bin/udhcpc -i %s -s /usr/etc/wifi-direct/udhcp_script.non-autoip &", interface_name);\r
-       system(cmdStr);\r
-\r
-#else\r
-\r
-       system("/usr/bin/wifi-direct-dhcp.sh client");\r
-\r
-#endif\r
-\r
-       wfd_server->dhcp_ip_address_timer = g_timeout_add(1000, (GSourceFunc) __wfd_get_ip_address, NULL);\r
-}\r
-\r
-void wfd_server_cancel_dhcp_wait_timer()\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       if (wfd_server->dhcp_ip_address_timer > 0)\r
-       {\r
-               g_source_remove(wfd_server->dhcp_ip_address_timer);\r
-               wfd_server->dhcp_ip_address_timer = 0;\r
-       }\r
-       else\r
-       {\r
-               WDS_LOGE( "** dhcp_wait_timer is already stopped...\n");\r
-       }\r
-}\r
-\r
-void __wfd_server_send_client_event(wifi_direct_client_noti_s * noti)\r
-{\r
-       int i = 0;\r
-       int ret = 0;\r
-       int len = sizeof(wifi_direct_client_noti_s);\r
-\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       WDS_LOGI( "__wfd_server_send_client_event(%d, %s)\n",\r
-                                  noti->event, __wfd_print_client_event(noti->event));\r
-\r
-       for (i = 0; i < WFD_MAX_CLIENTS; i++)\r
-       {\r
-               errno = 0;\r
-               if ((wfd_server->client[i].isUsed == true)\r
-                       && (wfd_server->client[i].client_id > WFD_INVALID_ID)\r
-                       && (wfd_server->client[i].async_sockfd > 0))\r
-               {\r
-                       WDS_LOGD( "Sending event to client[%d]: cid=[%d] sock=[%d] a-sock=[%d], dev_handle=[%d], sourceid=[%d]\n",\r
-                                       i,\r
-                                       wfd_server->client[i].client_id,\r
-                                       wfd_server->client[i].sync_sockfd,\r
-                                       wfd_server->client[i].async_sockfd,\r
-                                       wfd_server->client[i].dev_handle,\r
-                                       wfd_server->client[i].g_source_id);\r
-\r
-                       if (wfd_server_is_fd_writable(wfd_server->client[i].async_sockfd) <= 0)\r
-                       {\r
-                               continue;\r
-                       }\r
-\r
-                       ret = write(wfd_server->client[i].async_sockfd, (char *) noti, len);\r
-                       if (ret <= 0)\r
-                       {\r
-                               WDS_LOGF( "Error!!! writing to the socket. Error [%s] \n", strerror(errno));\r
-                       }\r
-                       else\r
-                               WDS_LOGD( "Event(%s) is Sent to client(id:%d) successfully!!!\n",\r
-                                               __wfd_print_client_event(noti->event), wfd_server->client[i].client_id);\r
-               }\r
-       }\r
-}\r
-\r
-\r
-bool wfd_server_remember_connecting_peer(unsigned char device_mac[6])\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       wfd_discovery_entry_s *peer;\r
-       int status;\r
-\r
-       status = wfd_oem_get_peer_info(device_mac, &peer);\r
-       if (status == true)\r
-       {\r
-               if (peer != NULL)\r
-               {\r
-                       WDS_LOGD( "wfd_oem_get_peer_info() Success\n");\r
-                       memcpy(&wfd_server->current_peer, peer, sizeof(wfd_discovery_entry_s));\r
-\r
-                       __wfd_server_print_connected_peer();\r
-                       free(peer);\r
-                       WDS_LOGD( "peer " MACSTR" go=[%d] connected=[%d] ch=[%d] device_name=[%s]\n",\r
-                                       MAC2STR(wfd_server->current_peer.mac_address),\r
-                                       wfd_server->current_peer.is_group_owner,\r
-                                       wfd_server->current_peer.is_connected,\r
-                                       wfd_server->current_peer.channel,\r
-                                       wfd_server->current_peer.device_name);\r
-\r
-                       \r
-                       return true;\r
-               }\r
-       }\r
-\r
-       WDS_LOGE( "Remember Peer: Error!! can't find peer from the discovery result..\n");\r
-       return false;\r
-}\r
-\r
-bool wfd_server_clear_connected_peer()\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-       unsigned char NULL_IP[4] = { 0, 0, 0, 0};\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               wfd_server->connected_peers[i].isUsed = 0;\r
-               memcpy(wfd_server->connected_peers[i].ip_address, NULL_IP, 4);\r
-       }\r
-\r
-       wfd_server->connected_peer_count = 0;\r
-               \r
-       __wfd_server_print_connected_peer();\r
-       return true;\r
-}\r
-\r
-\r
-void wfd_server_reset_connecting_peer()\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       unsigned char NULL_MAC[6] = { 0, 0, 0, 0, 0, 0 };\r
-       memcpy(wfd_server->current_peer.mac_address, NULL_MAC, 6);\r
-       __wfd_server_print_connected_peer();\r
-}\r
-\r
-void wfd_server_add_connected_peer(wfd_discovery_entry_s* peer, unsigned char interface_mac[6], char* ip_address)\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               if (wfd_server->connected_peers[i].isUsed == 0)\r
-               {\r
-                       wfd_server->connected_peers[i].isUsed = 1;\r
-                       memcpy(&wfd_server->connected_peers[i].peer, peer, sizeof(wfd_discovery_entry_s));\r
-                       memcpy(wfd_server->connected_peers[i].int_address, interface_mac, 6);\r
-                       wfd_server->connected_peer_count++;\r
-                       break;\r
-               }\r
-       }\r
-       __wfd_server_print_connected_peer();\r
-\r
-}\r
-\r
-void wfd_server_remove_connected_peer(wfd_discovery_entry_s * peer)\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               if (wfd_server->connected_peers[i].isUsed==1 &&\r
-                               memcmp(wfd_server->connected_peers[i].peer.mac_address, peer->mac_address, 6) == 0 )\r
-               {\r
-                       wfd_server->connected_peers[i].isUsed = 0;\r
-                       wfd_server->connected_peer_count--;\r
-                       memset(&wfd_server->connected_peers[i], 0x00, sizeof(wfd_local_connected_peer_info_t));\r
-                       break;\r
-               }\r
-       }\r
-       __wfd_server_print_connected_peer();\r
-}\r
-\r
-void wfd_server_remove_connected_peer_by_interface_mac(unsigned char interface_mac[6])\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               if (wfd_server->connected_peers[i].isUsed==1 &&\r
-                               memcmp(wfd_server->connected_peers[i].int_address, interface_mac, 6) == 0 )\r
-               {\r
-                       wfd_server->connected_peers[i].isUsed = 0;\r
-                       wfd_server->connected_peer_count--;\r
-                       memset(&wfd_server->connected_peers[i], 0x00, sizeof(wfd_local_connected_peer_info_t));\r
-                       break;\r
-               }\r
-       }\r
-       __wfd_server_print_connected_peer();\r
-}\r
-\r
-\r
-int wfd_server_is_connected_peer_by_device_mac(unsigned char device_mac[6])\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               if (wfd_server->connected_peers[i].isUsed==1 &&\r
-                               memcmp(wfd_server->connected_peers[i].peer.mac_address, device_mac, 6) == 0 )\r
-               {\r
-                       return true;\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-wfd_local_connected_peer_info_t* \r
-wfd_server_get_connected_peer_by_device_mac(unsigned char device_mac[6])\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               if (wfd_server->connected_peers[i].isUsed==1 &&\r
-                               memcmp(wfd_server->connected_peers[i].peer.mac_address, device_mac, 6) == 0 )\r
-               {\r
-                       return &wfd_server->connected_peers[i];\r
-               }\r
-       }\r
-       return NULL;\r
-}\r
-\r
-\r
-wfd_local_connected_peer_info_t* \r
-wfd_server_get_connected_peer_by_interface_mac(unsigned char int_mac[6])\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-\r
-       __wfd_server_print_connected_peer();\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               if (wfd_server->connected_peers[i].isUsed == 1 &&\r
-                       memcmp(wfd_server->connected_peers[i].int_address, int_mac, 6) == 0)\r
-               {\r
-                       WDS_LOGD( "Found: peer[%d] device_name=[%s] int_mac=["MACSTR"] dev_mac=["MACSTR"] cat=[%d] ip=["IPSTR"]\n",\r
-                                       i,\r
-                                       wfd_server->connected_peers[i].peer.device_name,\r
-                                       MAC2STR(wfd_server->connected_peers[i].int_address),\r
-                                       MAC2STR(wfd_server->connected_peers[i].peer.mac_address),\r
-                                       wfd_server->connected_peers[i].peer.category,\r
-                                       IP2STR(wfd_server->connected_peers[i].ip_address));\r
-\r
-                       return &wfd_server->connected_peers[i];\r
-               }\r
-       }\r
-       return NULL;\r
-}\r
-\r
-\r
-int wfd_server_is_connected_peer_by_interface_mac(unsigned char interface_mac[6])\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       int i;\r
-\r
-       for (i = 0; i < WFD_MAX_ASSOC_STA; i++)\r
-       {\r
-               if (wfd_server->connected_peers[i].isUsed==1 &&\r
-                               memcmp(wfd_server->connected_peers[i].int_address, interface_mac, 6) == 0 )\r
-               {\r
-                       return true;\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-\r
-void wfd_server_process_event(wfd_event_t event)\r
-{\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       wifi_direct_client_noti_s noti;\r
-\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       memset(&noti, 0, sizeof(wifi_direct_client_noti_s));\r
-\r
-       noti.event = event;\r
-       noti.error = WIFI_DIRECT_ERROR_NONE;\r
-\r
-       wifi_direct_state_e state = wfd_server_get_state();\r
-\r
-       WDS_LOGI( "state=[%s] process event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));\r
-\r
-       if (state == WIFI_DIRECT_STATE_CONNECTING)\r
-       {\r
-               switch (event)\r
-               {\r
-#if 1\r
-               //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:\r
-               case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:\r
-               {\r
-                       unsigned char mac[6];\r
-                       wifi_direct_wps_type_e  wps_config;\r
-               \r
-                       wps_config = wfd_server->config_data.wps_config;\r
-                       \r
-                       wfd_oem_get_requestor_mac(mac);\r
-                       if (wfd_oem_connect(mac, wps_config) == true)\r
-                       {\r
-                               return;\r
-                       }\r
-                       else\r
-                       {\r
-                               if (wfd_oem_is_groupowner())\r
-                               {\r
-                                       wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
-                               }\r
-                               else\r
-                               {\r
-                                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                               }\r
-                               \r
-                               snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(mac));\r
-                               wfd_server_reset_connecting_peer();\r
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
-                               noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;\r
-                               __wfd_server_send_client_event(&noti);\r
-                       }\r
-               }\r
-               break;\r
-#else\r
-                       //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_NO_PROV_INFO:\r
-               case WFD_EVENT_GROUP_OWNER_NEGOTIATION_ALREADY_CONNECTED:\r
-                       // fall down\r
-#endif\r
-\r
-                       // TODO: Do we need to make it, asynchronously?\r
-                       // Ignore provision discovery timeout, since provision request used syn API.\r
-                       // case WFD_EVENT_PROV_DISCOVERY_TIMEOUT:\r
-\r
-                       // Fail cases\r
-                       //case WFD_EVENT_GROUP_OWNER_NEGOTIATION_INFO_UNAVAIL:\r
-               case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL:\r
-               case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_INTENT:\r
-               case WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT:\r
-               case WFD_EVENT_WPS_WRONG_PIN:\r
-               case WFD_EVENT_WPS_TIMEOUT:\r
-               case WFD_EVENT_WPS_SESSION_OVERLAP:\r
-               case WFD_EVENT_CREATE_LINK_CANCEL:\r
-                       if (event == WFD_EVENT_GROUP_OWNER_NEGOTIATION_FAIL_TIMEOUT) {\r
-                               if (wfd_server->connecting_120) {\r
-                                       int wps_config = wfd_server->config_data.wps_config;\r
-\r
-                                       if (wfd_server->config_data.want_persistent_group == true)\r
-                                               wfd_oem_connect_for_persistent_group(wfd_server->current_peer.mac_address, wps_config);\r
-                                       else\r
-                                               wfd_oem_connect(wfd_server->current_peer.mac_address, wps_config);\r
-                                       WDS_LOGD("Retry connection with " MACSTR, MAC2STR(wfd_server->current_peer.mac_address));\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-                       if (wfd_oem_is_groupowner())\r
-                       {\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
-                       }\r
-                       else\r
-                       {\r
-                               wfd_server_cancel_dhcp_wait_timer();\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                       }\r
-                       snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));\r
-                       wfd_server_reset_connecting_peer();\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
-                       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;\r
-                       __wfd_server_send_client_event(&noti);\r
-                       //wfd_oem_start_discovery(true, 0);\r
-                       break;\r
-\r
-               case WFD_EVENT_SOFTAP_FAIL:\r
-                       wfd_server_cancel_dhcp_wait_timer();\r
-                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                       wfd_server_reset_connecting_peer();\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;\r
-                       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;\r
-                       __wfd_server_send_client_event(&noti);\r
-                       break;\r
-\r
-               case WFD_EVENT_CREATE_LINK_TIMEOUT:\r
-               case WFD_EVENT_CREATE_LINK_AUTH_FAIL:\r
-               case WFD_EVENT_CREATE_LINK_FAIL:\r
-                       if (wfd_oem_is_groupowner())\r
-                       {\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
-                       }\r
-                       else\r
-                       {\r
-                               wfd_server_cancel_dhcp_wait_timer();\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                       }\r
-                       snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
-                       if (event == WFD_EVENT_CREATE_LINK_TIMEOUT)\r
-                               noti.error = WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT;\r
-                       else if (event == WFD_EVENT_CREATE_LINK_AUTH_FAIL)\r
-                               noti.error = WIFI_DIRECT_ERROR_AUTH_FAILED;\r
-                       else if (event == WFD_EVENT_CREATE_LINK_FAIL)\r
-                               noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;\r
-                       wfd_server_reset_connecting_peer();\r
-\r
-                       if (wfd_oem_is_groupowner() == false)\r
-                               wfd_server_clear_connected_peer();\r
-\r
-                       __wfd_server_send_client_event(&noti);\r
-                       //wfd_oem_start_discovery(true, 0);\r
-                       break;\r
-\r
-               case WFD_EVENT_DISCOVER_COMPLETE:\r
-                       wfd_server->config_data.listen_only = false;\r
-\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
-                       __wfd_server_send_client_event(&noti);\r
-\r
-                       // TODO:  M-Project "find/scan" concept. First time, we start discovery during 30 seconds  and then try again discovery with Listen only mode continuosly.\r
-                       //wfd_oem_start_discovery(true, 0);\r
-                       break;\r
-\r
-               case WFD_EVENT_CREATE_LINK_COMPLETE:\r
-                       {\r
-                               if (wfd_oem_is_groupowner())\r
-                               {\r
-                                       unsigned char intf_mac[6] = {0, };\r
-\r
-                                       wfd_oem_get_assoc_sta_mac(intf_mac);\r
-                                       \r
-                                       wfd_server_add_connected_peer(&wfd_server->current_peer,\r
-                                                                                                 intf_mac, NULL);\r
-                                       wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
-\r
-                                       wfd_local_connected_peer_info_t *peer = NULL;\r
-                                       peer =\r
-                                               wfd_server_get_connected_peer_by_interface_mac(intf_mac);\r
-                                       WDS_LOGI(\r
-                                                                  "Peer's Intf MAC is " MACSTR "\n",\r
-                                                                  MAC2STR(intf_mac));\r
-\r
-                                       if (peer == NULL)\r
-                                       {\r
-                                               WDS_LOGI(\r
-                                                                          "Something wrong... Peer's Dev MAC is " MACSTR "\n",\r
-                                                                          MAC2STR(peer->peer.mac_address));\r
-                                               snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                                                MAC2STR(wfd_server->current_peer.mac_address));\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                                                MAC2STR(peer->peer.mac_address));\r
-                                       }\r
-\r
-                                       wfd_server_reset_connecting_peer();\r
-\r
-                                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
-\r
-\r
-                                       __wfd_server_send_client_event(&noti);\r
-                               }\r
-                               else\r
-                               {\r
-                                       wfd_connected_peer_info_s *peer_list = NULL;\r
-\r
-                                       int peer_num = 0;\r
-\r
-                                       wfd_server_clear_connected_peer();\r
-\r
-                                       wfd_oem_get_connected_peers_info(&peer_list, &peer_num);\r
-\r
-                                       if (peer_num == 1)\r
-                                       {\r
-                                               wfd_server_add_connected_peer(&wfd_server->current_peer,\r
-                                                                         peer_list[0].intf_mac_address,\r
-                                                                         NULL);\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               unsigned char intf_mac[6] = {0, };\r
-                                               WDS_LOGI(\r
-                                                                          "Something wrong. peer_num is [%d]\n",\r
-                                                                          peer_num);\r
-                                               wfd_server_add_connected_peer(&wfd_server->current_peer,\r
-                                                                               intf_mac,\r
-                                                                               NULL);\r
-                                       }\r
-\r
-                                       wfd_server_start_dhcp_wait_timer();\r
-                               }\r
-                       }\r
-                       break;\r
-\r
-               case WFD_EVENT_IP_ASSIGNED:\r
-               {\r
-                               // Update peer IP address which is DHCP server IP.\r
-                               char peer_ip_str[20];\r
-                               wfd_get_dhcpc_server_ip(peer_ip_str, 20);\r
-                               inet_aton(peer_ip_str, (struct in_addr*)&wfd_server->connected_peers[0].ip_address);\r
-\r
-                               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(wfd_server->current_peer.mac_address));\r
-                               wfd_server_reset_connecting_peer();\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTED);\r
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;\r
-                               __wfd_server_send_client_event(&noti);\r
-\r
-                       }\r
-                       break;\r
-\r
-               case WFD_EVENT_CONNECT_PBC_START:\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;\r
-\r
-                       WDS_LOGI(\r
-                                                  "g_incomming_peer_mac_address is " MACSTR "\n",\r
-                                                  MAC2STR(g_incomming_peer_mac_address));\r
-                       //WDS_LOGI( "g_incomming_peer_ssid is [%s]\n", g_incomming_peer_ssid);\r
-                       snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                        MAC2STR(g_incomming_peer_mac_address));\r
-                       //strncpy(noti.param2, g_incomming_peer_ssid, strlen(g_incomming_peer_ssid));\r
-\r
-                       __wfd_server_send_client_event(&noti);\r
-                       break;\r
-\r
-               case WFD_EVENT_PROV_DISCOVERY_REQUEST:\r
-                       if (wfd_oem_is_groupowner())\r
-                       {\r
-                               // provision request comes, when we sent 'invite'...\r
-                               wfd_oem_wps_pbc_start(NULL);\r
-                       }\r
-                       else\r
-                       {\r
-                               //Ignore provision request during connecting...\r
-                       }\r
-                       break;\r
-\r
-               case WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY:\r
-               case WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD:\r
-                       if (event == WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_DISPLAY) {\r
-                               wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;\r
-                               wfd_oem_connect(g_incomming_peer_mac_address, wfd_server->config_data.wps_config);\r
-                       }\r
-                       else if (event == WFD_EVENT_PROV_DISCOVERY_RESPONSE_WPS_KEYPAD)\r
-                               wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;\r
-                       WDS_LOGI("g_incomming_peer_mac_address is [" MACSTR "]\n", MAC2STR(g_incomming_peer_mac_address));\r
-                       snprintf(noti.param1, sizeof(noti.param1), MACSTR,       MAC2STR(g_incomming_peer_mac_address));\r
-                       __wfd_server_send_client_event(&noti);\r
-                       break;\r
-\r
-               case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:\r
-               case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:\r
-                       if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY) {\r
-                               wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;\r
-                               wfd_oem_wps_pin_start(g_incomming_peer_mac_address);\r
-                       } else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD) {\r
-                               wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;\r
-                       }\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;\r
-                       WDS_LOGI("g_incomming_peer_mac_address is [" MACSTR "]\n", MAC2STR(g_incomming_peer_mac_address));\r
-                       snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(g_incomming_peer_mac_address));\r
-                       __wfd_server_send_client_event(&noti);\r
-               break;\r
-               default:\r
-                       WDS_LOGI(\r
-                                                  "Unprocessed event: state=[%s] event= [%s] \n",\r
-                                                  wfd_print_state(state),\r
-                                                  __wfd_server_print_event(noti.event));\r
-                       break;\r
-               }\r
-       }\r
-       else if (state == WIFI_DIRECT_STATE_DISCONNECTING)\r
-       {\r
-               switch (event)\r
-               {\r
-               case WFD_EVENT_CREATE_LINK_CANCEL:\r
-\r
-                       if (wfd_oem_is_groupowner())\r
-                       {\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);\r
-                       }\r
-                       else\r
-                       {\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                       }\r
-\r
-                       WDS_LOGI( "Peer's Dev MAC is " MACSTR "\n",\r
-                                                  MAC2STR(wfd_server->current_peer.mac_address));\r
-                       snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                        MAC2STR(wfd_server->current_peer.mac_address));\r
-\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;\r
-                       wfd_server_reset_connecting_peer();\r
-                       wfd_server_clear_connected_peer();\r
-                       __wfd_server_send_client_event(&noti);\r
-                       //wfd_oem_start_discovery(true, 0);\r
-                       break;\r
-               default:\r
-                       WDS_LOGI(\r
-                                                  "Unprocessed event: state=[%s] event= [%s] \n",\r
-                                                  wfd_print_state(state),\r
-                                                  __wfd_server_print_event(noti.event));\r
-                       break;\r
-               }\r
-       }\r
-       else if (state == WIFI_DIRECT_STATE_CONNECTED ||\r
-                        state == WIFI_DIRECT_STATE_ACTIVATED ||\r
-                        state == WIFI_DIRECT_STATE_DISCOVERING ||\r
-                        state == WIFI_DIRECT_STATE_GROUP_OWNER)\r
-       {\r
-               switch (event)\r
-               {\r
-               case WFD_EVENT_PROV_DISCOVERY_REQUEST:\r
-               case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY:\r
-               case WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD:\r
-                       {\r
-                               if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST)\r
-                                       wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;\r
-                               else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_DISPLAY)\r
-                                       wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY;\r
-                               else if (event == WFD_EVENT_PROV_DISCOVERY_REQUEST_WPS_KEYPAD)\r
-                                       wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD;\r
-\r
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;\r
-                               WDS_LOGI("g_incomming_peer_mac_address is " MACSTR "\n",\r
-                                                          MAC2STR(g_incomming_peer_mac_address));\r
-                               snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                                MAC2STR(g_incomming_peer_mac_address));\r
-\r
-                               __wfd_server_send_client_event(&noti);\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_CONNECTING);\r
-                       }\r
-                       break;\r
-\r
-               case WFD_EVENT_INVITE_REQUEST:\r
-                       {\r
-                               noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;\r
-                               WDS_LOGD("WIFI_DIRECT_CLI_EVENT_INVITATION_REQ");\r
-                               snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                                MAC2STR(g_incomming_peer_mac_address));\r
-                               __wfd_server_send_client_event(&noti);\r
-                       }\r
-                       break;\r
-\r
-               case WFD_EVENT_SOFTAP_STA_DISASSOC:\r
-                       {\r
-                               if (wfd_oem_is_groupowner() == true)\r
-                               {\r
-                                       int count = 0;\r
-                                       unsigned char interface_mac[6];\r
-                                       wfd_oem_get_disassoc_sta_mac(interface_mac);\r
-\r
-                                       wfd_local_connected_peer_info_t *peer = NULL;\r
-                                       peer =\r
-                                               wfd_server_get_connected_peer_by_interface_mac(interface_mac);\r
-                                       if (peer != NULL)\r
-                                       {\r
-                                               WDS_LOGI("Peer's Intf MAC: " MACSTR ", Device MAC:" MACSTR " \n",\r
-                                                                       MAC2STR(interface_mac),\r
-                                                                       MAC2STR(peer->peer.mac_address));\r
-                                               snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                                                MAC2STR(peer->peer.mac_address));\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               WDS_LOGI("Peer's Intf MAC: " MACSTR ", Device MAC:null \n",\r
-                                                                       MAC2STR(interface_mac));\r
-                                               memset(noti.param1, 0, 6);\r
-                                       }\r
-\r
-                                       wfd_server_remove_connected_peer_by_interface_mac(interface_mac);\r
-                                       wfd_server_reset_connecting_peer();\r
-\r
-                                       wfd_oem_get_connected_peers_count(&count);\r
-                                       if (count == 0)\r
-                                       {\r
-                                               wfd_server->config_data.wps_config =\r
-                                                       WIFI_DIRECT_WPS_TYPE_PBC;\r
-                                               if (wfd_oem_disconnect() == false)\r
-                                                       WDS_LOGF("Error!!! wfd_oem_disconnect() failed!!..\n");\r
-                                               else\r
-                                                       wfd_server_set_state(WIFI_DIRECT_STATE_DISCONNECTING);\r
-                                       }\r
-                                       noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;\r
-                                       __wfd_server_send_client_event(&noti);\r
-                               }\r
-                               else\r
-                               {\r
-                                       WDS_LOGF("Error!!! DISASSOC event come..\n");\r
-                               }\r
-                       }\r
-                       break;\r
-\r
-               case WFD_EVENT_PRIMARY_IF_DISCONNECTION:\r
-                       WDS_LOGD("Primary interface (wlan0) is down. Just let it up!\n");\r
-                       system("ifconfig wlan0 up");\r
-                       break;\r
-\r
-               case WFD_EVENT_CREATE_LINK_CANCEL:\r
-                       {\r
-                               if (state == WIFI_DIRECT_STATE_GROUP_OWNER)\r
-                               {\r
-                                       WDS_LOGI("Peer's Dev MAC is " MACSTR "\n",\r
-                                                                  MAC2STR(wfd_server->current_peer.mac_address));\r
-                                       snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                                        MAC2STR(wfd_server->current_peer.mac_address));\r
-\r
-                                       wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;\r
-                                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;\r
-                                       __wfd_server_send_client_event(&noti);\r
-                                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                               }\r
-                               else\r
-                               {\r
-                                       WDS_LOGD("message is ignored [%d] at state=[%d]\n",\r
-                                                               event, state);\r
-                               }\r
-                               wfd_server_clear_connected_peer();\r
-\r
-                       }\r
-                       break;\r
-               case WFD_EVENT_CREATE_LINK_DOWN:\r
-                       {\r
-                               if (state >= WIFI_DIRECT_STATE_CONNECTED)\r
-                               {\r
-                                       WDS_LOGI(\r
-                                                                  "Peer's Intf MAC: " MACSTR ", Device MAC:" MACSTR " \n",\r
-                                                                  MAC2STR(wfd_server->connected_peers[0].int_address),\r
-                                                                  MAC2STR(wfd_server->connected_peers[0].peer.mac_address));\r
-\r
-                                       snprintf(noti.param1, sizeof(noti.param1), MACSTR,\r
-                                                        MAC2STR(wfd_server->connected_peers[0].peer.mac_address));\r
-\r
-                                       wfd_server_clear_connected_peer();\r
-                                       wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;\r
-                                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;\r
-                                       __wfd_server_send_client_event(&noti);\r
-                                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                               }\r
-                               else\r
-                               {\r
-                                       WDS_LOGD(\r
-                                                                  "message is ignored [%d] at state=[%d]\n",\r
-                                                                  event, state);\r
-                               }\r
-                       }\r
-                       break;\r
-               case WFD_EVENT_DISCOVER_START_80211_SCAN:\r
-                       wfd_server->config_data.listen_only = false;\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;\r
-                       __wfd_server_send_client_event(&noti);\r
-                       if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DISCOVERING)\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);\r
-                       break;\r
-#if 0\r
-               case WFD_EVENT_DISCOVER_START_SEARCH_LISTEN:\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN;\r
-                       __wfd_server_send_client_event(&noti);\r
-                       if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DISCOVERING)\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                       break;\r
-#endif\r
-\r
-               case WFD_EVENT_DISCOVER_START_LISTEN_ONLY:\r
-                       wfd_server->config_data.listen_only = true;\r
-               \r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;\r
-                       __wfd_server_send_client_event(&noti);\r
-                       if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DISCOVERING)\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_DISCOVERING);\r
-                       break;\r
-\r
-               case WFD_EVENT_DISCOVER_CANCEL:\r
-               case WFD_EVENT_DISCOVER_COMPLETE:\r
-               case WFD_EVENT_DISCOVER_FAIL:\r
-                       wfd_server->config_data.listen_only = false;\r
-               \r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
-                       __wfd_server_send_client_event(&noti);\r
-                       if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DISCOVERING)\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                       break;\r
-\r
-                       // TODO:  M-Project "find/scan" concept. First time, we start discovery during 30 seconds  and then try again discovery with Listen only mode continuosly.\r
-#if 0\r
-               case WFD_EVENT_DISCOVER_COMPLETE:\r
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;\r
-                       __wfd_server_send_client_event(&noti);\r
-                       wfd_oem_start_discovery(true, 0);\r
-                       break;\r
-#endif\r
-\r
-               case WFD_EVENT_DISCOVER_FOUND_PEERS:\r
-               case WFD_EVENT_DISCOVER_FOUND_P2P_GROUPS:\r
-                       {\r
-                               if (state == WIFI_DIRECT_STATE_CONNECTED)\r
-                               {\r
-                                       // Note:\r
-                                       // In case of GC, when connected, interface_mac_address is not updated, since scan is stopped.\r
-                                       // If scan is started (by user request), then we have changce to get the interface_mac_address.\r
-                                       //\r
-                                       unsigned char null_mac[6]={0,};\r
-                                       if (memcmp(&wfd_server->connected_peers[0].int_address, &null_mac, 6)==0)\r
-                                       {\r
-                                               wfd_connected_peer_info_s *peer_list = NULL;\r
-                                               int peer_num = 0;\r
-\r
-                                               wfd_oem_get_connected_peers_info(&peer_list, &peer_num);\r
-\r
-                                               if (peer_num == 1)\r
-                                               {\r
-                                                       memcpy(&wfd_server->connected_peers[0].int_address,\r
-                                                                       &peer_list[0].intf_mac_address,\r
-                                                                       6);\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       // Something wrong, and ignore it...\r
-                                               }\r
-                                       }\r
-                               }\r
-                               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;\r
-                               __wfd_server_send_client_event(&noti);\r
-                       }\r
-                       break;\r
-\r
-               case WFD_EVENT_SOFTAP_READY:\r
-                       {\r
-                               noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;\r
-                               __wfd_server_send_client_event(&noti);\r
-                       }\r
-                       break;\r
-\r
-               case WFD_EVENT_SOFTAP_STOP:\r
-                       {\r
-                               noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;\r
-                               __wfd_server_send_client_event(&noti);\r
-                               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);\r
-                       }\r
-                       break;\r
-\r
-               default:\r
-                       WDS_LOGI( "Unprocessed event: state=[%s] event= [%s] \n", wfd_print_state(state), __wfd_server_print_event(noti.event));\r
-                       break;\r
-               }\r
-       }\r
-\r
-       __WDS_LOG_FUNC_EXIT__;\r
-}\r
diff --git a/src/wifi-direct-event.c b/src/wifi-direct-event.c
new file mode 100644 (file)
index 0000000..8969ad6
--- /dev/null
@@ -0,0 +1,588 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct event functions.
+ *
+ * @file               wifi-direct-event.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <poll.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include <wifi-direct-internal.h>
+
+#include "wifi-direct-manager.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-peer.h"
+#include "wifi-direct-group.h"
+#include "wifi-direct-session.h"
+#include "wifi-direct-event.h"
+#include "wifi-direct-client.h"
+#include "wifi-direct-state.h"
+#include "wifi-direct-util.h"
+
+
+static int _wfd_event_check_socket(int sock)
+{
+       struct pollfd p_fd;
+       int res = 0;
+
+       p_fd.fd = sock;
+       p_fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL;
+       res = poll((struct pollfd *) &p_fd, 1, 1);
+
+       if (res < 0) {
+               WDS_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
+               return -1;
+       } else if (res == 0) {
+               WDS_LOGD( "poll timeout. socket is busy\n");
+               return 1;
+       } else {
+
+               if (p_fd.revents & POLLERR) {
+                       WDS_LOGE("Error! POLLERR from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLHUP) {
+                       WDS_LOGE("Error! POLLHUP from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLNVAL) {
+                       WDS_LOGE("Error! POLLNVAL from socket[%d]", sock);
+                       return -1;
+               } else if (p_fd.revents & POLLIN) {
+                       WDS_LOGD("POLLIN from socket [%d]", sock);
+                       return 0;
+               } else if (p_fd.revents & POLLOUT) {
+                       WDS_LOGD("POLLOUT from socket [%d]", sock);
+                       return 0;
+               }
+       }
+
+       WDS_LOGD("Unknown poll event [%d]", p_fd.revents);
+       return -1;
+}
+
+static int _wfd_event_send_to_client(int sock, char *data, int data_len)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int wbytes = 0;
+       int left_len = data_len;
+       char *ptr = data;
+       int res = 0;
+
+       if (sock < SOCK_FD_MIN || !data || data_len < 0) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       res = _wfd_event_check_socket(sock);
+       if (res < 0) {
+               WDS_LOGE("Socket error");
+               return -1;
+       } else if (res > 0) {
+               WDS_LOGE("Socket is busy");
+               return -2;
+       }
+
+       errno = 0;
+       while (left_len) {
+               wbytes = write(sock, ptr, left_len);
+               if (wbytes <= 0) {
+                       WDS_LOGE("Failed to write data into socket[%d]. [%s]", sock, strerror(errno));
+                       break;
+               }else if (wbytes < left_len) {
+                       WDS_LOGD("%d bytes left. Continue sending...", left_len - wbytes);
+                       left_len -= wbytes;
+                       ptr += wbytes;
+               } else if (wbytes == left_len) {
+                       WDS_LOGD("Succeeded to write data[%d bytes] into socket [%d]", wbytes, sock);
+                       left_len = 0;
+               } else {
+                       WDS_LOGE("Unknown error occurred. [%s]", strerror(errno));
+                       break;
+               }
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       if (left_len)
+               return -1;
+       else
+               return 0;
+}
+
+int wfd_event_notify_clients(wfd_manager_s *manager, wifi_direct_client_noti_s *noti)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       GList *temp = NULL;
+       wfd_client_s *client = NULL;
+       int noti_cnt = 0;
+       int res = 0;
+
+       if (!manager || !noti) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       temp = g_list_first(manager->clients);
+       while (temp) {
+               client = temp->data;
+               if (!client) {
+                       WDS_LOGE("Invalid client");
+                       goto next_client;
+               }
+               res = _wfd_event_send_to_client(client->asock, (char*) noti, sizeof(wifi_direct_client_noti_s));
+               if (res < 0) {
+                       WDS_LOGE("Failed to send notification to client[%d]", client->client_id);
+                       goto next_client;
+               }
+               noti_cnt++;
+next_client:
+               temp = g_list_next(temp);
+               client = NULL;
+       }
+       WDS_LOGD("Notification[%d:%d] sent to %d clients", noti->event, noti->error, noti_cnt);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *peer = NULL;
+
+       if (!manager || !data) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
+       if (!peer) {
+               peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
+               if (!peer) {
+                       WDS_LOGE("Failed to add peer");
+                       return -1;
+               }
+       } else {
+               if (strcmp(peer->dev_name, data->name)) {
+                       strncpy(peer->dev_name, data->name, DEV_NAME_LEN);
+                       peer->dev_name[DEV_NAME_LEN] = '\0';
+                       WDS_LOGD("Device name is changed [" MACSTR ": %s]", MAC2STR(peer->dev_addr), peer->dev_name);
+               }
+       }
+       memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
+       peer->pri_dev_type = data->pri_dev_type;
+       peer->sec_dev_type = data->sec_dev_type;
+       peer->config_methods = data->config_methods;
+       peer->dev_flags = data->dev_flags;
+       peer->group_flags = data->group_flags;
+       peer->dev_role = data->dev_role;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_process_event(void *user_data, void *data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) user_data;
+       wfd_oem_event_s *event = (wfd_oem_event_s*) data;
+       int res = 0;
+
+       if (!manager || !event) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       WDS_LOGD("Event[%d] from " MACSTR, event->event_id, MAC2STR(event->dev_addr));
+
+       switch (event->event_id) {
+       case WFD_OEM_EVENT_DEACTIVATED:
+               break;
+       case WFD_OEM_EVENT_PEER_FOUND:
+       {
+               wfd_oem_dev_data_s *edata = (wfd_oem_dev_data_s*) event->edata;
+               res = _wfd_event_update_peer(manager, edata);
+               if (res < 0) {
+                       WDS_LOGE("Failed to update peer data");
+                       break;
+               }
+
+               if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
+                               manager->state != WIFI_DIRECT_STATE_CONNECTING &&
+                               manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
+                       wifi_direct_client_noti_s noti;
+                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
+                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       wfd_event_notify_clients(manager, &noti);
+               }
+       }
+       break;
+       case WFD_OEM_EVENT_PROV_DISC_REQ:
+       case WFD_OEM_EVENT_PROV_DISC_RESP:
+       case WFD_OEM_EVENT_PROV_DISC_DISPLAY:
+       case WFD_OEM_EVENT_PROV_DISC_KEYPAD:
+       {
+               wfd_device_s *peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
+               if (!peer) {
+                       WDS_LOGD("Porv_disc from unknown peer. Add new peer");
+                       peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
+                       if (!peer) {
+                               WDS_LOGE("Failed to add peer for invitation");
+                               return -1;
+                       }
+               }
+
+               res = wfd_session_process_event(manager, event);
+               if (res < 0) {
+                       WDS_LOGE("Failed to process event of session");
+                       break;
+               }
+       }
+       break;
+       case WFD_OEM_EVENT_PEER_DISAPPEARED:
+       {
+               wfd_remove_peer(manager, event->dev_addr);
+               wifi_direct_client_noti_s noti;
+               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
+               noti.error = WIFI_DIRECT_ERROR_NONE;
+               wfd_event_notify_clients(manager, &noti);
+       }
+       break;
+       case WFD_OEM_EVENT_DISCOVER_FINISHED:
+       {
+               if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+                               manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Notify finding stoped when discovering or activated. [%d]", manager->state);
+                       break;
+               }
+
+               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);
+               }
+
+               wifi_direct_client_noti_s noti;
+               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
+               noti.error = WIFI_DIRECT_ERROR_NONE;
+               wfd_event_notify_clients(manager, &noti);
+       }
+       break;
+       case WFD_OEM_EVENT_INVITATION_REQ:
+       {
+               wfd_device_s *peer = NULL;
+               wfd_session_s *session = NULL;
+               peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
+               if (!peer) {
+                       WDS_LOGD("Invitation from unknown peer. Add new peer");
+                       peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
+                       if (!peer) {
+                               WDS_LOGE("Failed to add peer for invitation");
+                               return -1;
+                       }
+               }
+               wfd_oem_invite_data_s *edata = (wfd_oem_dev_data_s*) event->edata;
+               peer->dev_role = WFD_DEV_ROLE_GO;
+               memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
+
+               session = wfd_create_session(manager, event->dev_addr,
+                                               manager->local->wps_mode, SESSION_DIRECTION_INCOMING);
+               if (!session) {
+                       WDS_LOGE("Failed to create session");
+                       return -1;
+               }
+               session->invitation = 1;
+
+               wifi_direct_client_noti_s noti;
+               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+               noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;
+               noti.error = WIFI_DIRECT_ERROR_NONE;
+               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
+               wfd_event_notify_clients(manager, &noti);
+       }
+       break;
+       case WFD_OEM_EVENT_GO_NEG_REQ:
+       case WFD_OEM_EVENT_GO_NEG_DONE:
+       case WFD_OEM_EVENT_WPS_DONE:
+               wfd_session_process_event(manager, event);
+       break;
+       case WFD_OEM_EVENT_CONNECTED:
+       case WFD_OEM_EVENT_STA_CONNECTED:
+       {
+               // Move this code to plugin
+               unsigned char intf_addr[MACADDR_LEN] = {0, };
+               wfd_local_get_intf_mac(intf_addr);
+               if (!memcmp(event->intf_addr, intf_addr, MACADDR_LEN)) {
+                       WDS_LOGD("Ignore this event");
+                       break;
+               }
+
+               wfd_session_s *session = (wfd_session_s*) manager->session;
+               if (!session) {
+                       WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]",
+                                                                               MAC2STR(event->dev_addr));
+                       return -1;
+               } 
+               // TODO: check whether here is complete location. How about Group Created event
+               session->state = SESSION_STATE_COMPLETED;
+
+               wfd_group_s *group = (wfd_group_s*) manager->group;
+               if (!group) {
+                       group = wfd_create_pending_group(manager, event->intf_addr);
+                       if (!group) {
+                               WDS_LOGE("Failed to create pending group");
+                               return -1;
+                       }
+                       manager->group = group;
+               }
+
+               wfd_device_s *peer = session->peer;
+               if (!peer) {
+                       WDS_LOGE("Peer not found");
+                       // TODO: remove pending group
+                       return -1;
+               }
+               memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
+
+               group->members = g_list_prepend(group->members, peer);
+               group->member_count++;
+
+               manager->peers = g_list_remove(manager->peers, peer);
+               manager->peer_count--;
+
+               if (event->event_id == WFD_OEM_EVENT_STA_CONNECTED) {   // GO
+                       wifi_direct_client_noti_s noti;
+                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+                       wfd_event_notify_clients(manager, &noti);
+
+                       wfd_util_dhcps_wait_ip_leased(peer);
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_destroy_session(manager);
+               }
+       }
+       break;
+       case WFD_OEM_EVENT_DISCONNECTED:
+       case WFD_OEM_EVENT_STA_DISCONNECTED:
+       {
+               wfd_group_s *group = NULL;
+               wfd_device_s *peer = NULL;
+               group = (wfd_group_s*) manager->group;
+               if (!group) {
+                       WDS_LOGE("Group not found");
+                       break;
+               }
+
+               peer = wfd_group_find_peer_by_intf_addr(group, event->intf_addr);
+               if (!peer) {
+                       WDS_LOGE("Failed to find peer by interface address");
+                       break;
+               }
+
+               group->members = g_list_remove(group->members, peer);
+               group->member_count--;
+
+               wifi_direct_client_noti_s noti;
+               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+               /* If state is not DISCONNECTING, connection is finished by peer */
+               if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+                       if (group->member_count)
+                               noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
+                       else
+                               noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
+                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+                       wfd_event_notify_clients(manager, &noti);
+               } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
+                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+                       wfd_event_notify_clients(manager, &noti);
+               }
+
+               if (group->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);
+               }
+
+               if (!group->member_count && group->role == WFD_DEV_ROLE_GO)
+                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+
+               if (peer)
+                       free(peer);
+       }
+       break;
+       case WFD_OEM_EVENT_GROUP_CREATED:
+       {
+               wfd_oem_group_data_s *edata = NULL;
+               edata = event->edata;
+
+               wfd_group_s *group = NULL;
+               group = (wfd_group_s*) manager->group;
+               if (!group) {
+                       group = wfd_create_group(manager, event->ifname, event->dev_role, edata->go_dev_addr /* event->intf_addr */);
+                       if (!group) {
+                               WDS_LOGE("Failed to create group");
+                               break;
+                       }
+               } else {
+                       if (group->pending) {
+                               wfd_group_complete(manager, event->ifname, event->dev_role, edata->go_dev_addr);
+                       } else {
+                               // TODO: ignore it
+                               WDS_LOGE("Unexpected event. Group already exist");
+                               break;
+                       }
+               }
+
+               strncpy(group->ssid, edata->ssid, DEV_NAME_LEN);
+               group->ssid[DEV_NAME_LEN-1] = '\0';
+               strncpy(group->pass,edata->pass, PASSPHRASE_LEN);
+               group->pass[PASSPHRASE_LEN] = '\0';
+               group->freq = edata->freq;
+               manager->group = group;
+
+               wifi_direct_client_noti_s noti;
+               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+               if (group->role == WFD_DEV_ROLE_GC) {
+                       if (!manager->session) {
+                               WDS_LOGE("Unexpected Event. Group should be removed(Client)");
+                               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                               break;
+                       }
+                       wfd_peer_clear_all(manager);
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+                       wfd_destroy_session(manager);
+                       manager->local->dev_role = WFD_DEV_ROLE_GC;
+               } else {
+                       if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
+                               noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
+                               wfd_event_notify_clients(manager, &noti);
+                       } else if (!manager->session) {
+                               WDS_LOGE("Unexpected Event. Group should be removed(Owner)");
+                               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                               break;
+                       }
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+                       manager->local->dev_role = WFD_DEV_ROLE_GO;
+               }
+       }
+       break;
+       case WFD_OEM_EVENT_GROUP_DESTROYED:
+       {
+               wfd_group_s *group = (wfd_group_s*) manager->group;
+               if (!group) {
+                       WDS_LOGE("Unexpected event. Group not found. But set state");
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+                       break;
+               }
+
+               if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING &&
+                               group->role == WFD_DEV_ROLE_GO) {
+                       wifi_direct_client_noti_s noti;
+                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       wfd_event_notify_clients(manager, &noti);
+               } else {
+                       wifi_direct_client_noti_s noti;
+                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+                       noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
+                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       wfd_event_notify_clients(manager, &noti);
+               }
+
+               res = wfd_destroy_group(manager, event->ifname);
+               if (res < 0) {
+                       WDS_LOGE("Failed to destroy group");
+                       break;
+               }
+
+               wfd_destroy_session(manager);
+               manager->local->dev_role = WFD_DEV_ROLE_NONE;
+               memset(manager->local->ip_addr, 0x0, IPADDR_LEN);
+               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+       }
+       break;
+       case WFD_OEM_EVENT_GO_NEG_FAIL:
+       case WFD_OEM_EVENT_WPS_FAIL:
+       case WFD_OEM_EVENT_KEY_NEG_FAIL:
+       {
+               wfd_session_s *session = (wfd_session_s*) manager->session;
+               if (!session) {
+                       WDS_LOGE("Unexpected event. Session not exist");
+                       break;
+               }
+
+               unsigned char *peer_addr = wfd_session_get_peer_addr(session);
+               if (!peer_addr) {
+                       WDS_LOGE("Session do not has peer");
+                       break;
+               }
+
+               wfd_destroy_session(manager);
+               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);
+               }
+
+               /* After connection failed, scan again */
+               wfd_oem_scan_param_s param;
+               memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
+               param.scan_mode = WFD_SCAN_MODE_ACTIVE;
+               param.scan_time = 2;
+               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+               wfd_oem_start_scan(manager->oem_ops, &param);   }
+       break;
+       default:
+               WDS_LOGE("Unknown event [event ID: %d]", event->event_id);
+       break;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
diff --git a/src/wifi-direct-group.c b/src/wifi-direct-group.c
new file mode 100644 (file)
index 0000000..aa81d58
--- /dev/null
@@ -0,0 +1,430 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct group functions.
+ *
+ * @file               wifi-direct-group.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include <wifi-direct-internal.h>
+
+#include "wifi-direct-manager.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-group.h"
+#include "wifi-direct-util.h"
+#include "wifi-direct-session.h"
+#include "wifi-direct-event.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)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+
+       if (!data || !ifname || !go_dev_addr) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       errno = 0;
+       group = (wfd_group_s*) calloc(1, sizeof(wfd_group_s));
+       if (!group) {
+               WDS_LOGE("Failed to allocate memory for group. [%s]", strerror(errno));
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       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);
+       group->pending = 0;
+
+       if (!manager->session)
+               group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
+       wfd_util_dhcps_start();
+       WDS_LOGD("Role is Group Owner. DHCP Server started");
+
+       manager->local->dev_role = role;        // temporary
+       __WDS_LOG_FUNC_EXIT__;
+       return group;
+}
+
+// Used for CTRL-EVENT_CONNECTED event that comes before group created
+wfd_group_s *wfd_create_pending_group(void *data, unsigned char * bssid)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+
+       if (!data || !bssid) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       group = manager->group;
+       if (group) {
+               WDS_LOGE("Group already exist");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       errno = 0;
+       group = (wfd_group_s*) calloc(1, sizeof(wfd_group_s));
+       if (!group) {
+               WDS_LOGE("Failed to allocate memory for group. [%s]", strerror(errno));
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       memcpy(group->bssid, bssid, MACADDR_LEN);
+       group->pending = 1;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return group;
+}
+
+int wfd_group_complete(void *data, char *ifname, int role, unsigned char *go_dev_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_group_s *group = NULL;
+       wfd_device_s *peer = NULL;
+
+       if (!manager || !ifname || !go_dev_addr) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       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;
+       }
+
+       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);
+       group->pending = 0;
+
+       peer = wfd_group_find_peer_by_dev_addr(group, go_dev_addr);
+       wfd_util_dhcpc_start(peer);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_destroy_group(void *data, char *ifname)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       GList *temp = NULL;
+       wfd_device_s *member = NULL;
+       int count = 0;
+
+       if (!data || !ifname) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       group = manager->group;
+       if (!group) {
+               WDS_LOGE("Group not exist");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       manager->group = NULL;
+
+       if (group->role == WFD_DEV_ROLE_GO)
+               wfd_util_dhcps_stop();
+       else
+               wfd_util_dhcpc_stop();
+
+       temp = g_list_first(group->members);
+       while(temp && count < group->member_count) {
+               member = temp->data;
+               //member->my_group = 0;
+               WDS_LOGD("%dth member[%s] freed", count, member->dev_name);
+               if (member)     // Temporary. Sometimes manager crashed
+                       free(member);
+               temp = g_list_next(temp);
+               count++;
+       }
+       g_list_free(group->members);
+
+       free(group);
+
+       manager->local->dev_role = WFD_DEV_ROLE_NONE;
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_group_get_channel(void *data, unsigned char *bssid)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+
+       if (!data || !bssid) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       group = manager->group;
+       if (!group) {
+               WDS_LOGE("Group not found [bssid: " MACSTR "]", MAC2STR(bssid));
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return group->freq;
+}
+
+int wfd_group_is_autonomous(void *data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+
+       if (!data) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       group = manager->group;
+       if (!group) {
+               WDS_LOGE("Group not found");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return group->flags & WFD_GROUP_FLAG_AUTONOMOUS;;
+}
+
+int wfd_group_get_members()
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_group_make_persistent()
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_group_get_flags(void *data, unsigned char *bssid)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+
+       if (!data || !bssid) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       group = manager->group;
+       if (!group) {
+               WDS_LOGE("Group not found [bssid: " MACSTR "]", MAC2STR(bssid));
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return group->flags;
+}
+
+wfd_device_s *wfd_group_find_peer_by_dev_addr(wfd_group_s *group, unsigned char *dev_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       GList *temp = NULL;
+       wfd_device_s *member = NULL;
+
+       if (!group || !dev_addr) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       if (group->member_count == 0) {
+               WDS_LOGE("There is no members");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       temp = g_list_first(group->members);
+       while (temp) {
+               member = temp->data;
+               if (!memcmp(member->dev_addr, dev_addr, MACADDR_LEN)) {
+                       WDS_LOGD("Member found");
+                       break;
+               }
+               temp = g_list_next(temp);
+               member = NULL;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return member;
+}
+
+wfd_device_s *wfd_group_find_peer_by_intf_addr(wfd_group_s *group, unsigned char *intf_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       GList *temp = NULL;
+       wfd_device_s *member = NULL;
+
+       if (!group || !intf_addr) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       if (group->member_count == 0) {
+               WDS_LOGE("There is no members");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       temp = g_list_first(group->members);
+       while (temp) {
+               member = temp->data;
+               if (!memcmp(member->intf_addr, intf_addr, MACADDR_LEN)) {
+                       WDS_LOGD("Member found");
+                       break;
+               }
+               temp = g_list_next(temp);
+               member = NULL;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return member;
+}
+
+int wfd_group_add_member(void *data, unsigned char *bssid, unsigned char *peer)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       unsigned char *member = NULL;
+
+       if (!data || !bssid || !peer) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       group = manager->group;
+       if (!group) {
+               WDS_LOGE("Group not found [bssid: " MACSTR "]", MAC2STR(bssid));
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       member = (unsigned char*) calloc(1, MACADDR_LEN);
+       group->members = g_list_prepend(group->members, member);
+       group->member_count++;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_group_remove_member(void *data, unsigned char *bssid, unsigned char *peer)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       GList *temp = NULL;
+       unsigned char *member = NULL;
+
+       if (!data || !bssid || !peer) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       group = manager->group;
+       if (!group) {
+               WDS_LOGE("Group not found [bssid: " MACSTR "]", MAC2STR(bssid));
+               __WDS_LOG_FUNC_EXIT__;
+               return  -1;
+       }
+
+       if (group->member_count == 0) {
+               WDS_LOGE("There is no members");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       temp = g_list_first(group->members);
+       while (temp) {
+               member = temp->data;
+               if (!memcmp(member, peer, MACADDR_LEN)) {
+                       WDS_LOGD("Member found [MAC: " MACSTR "]", peer);
+                       break;
+               }
+               temp = g_list_next(temp);
+               member = NULL;
+       }
+
+       if (!member) {
+               WDS_LOGE("Member not found [MAC: " MACSTR "]", peer);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       group->members = g_list_remove(group->members, member);
+       free(member);
+       group->member_count--;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
diff --git a/src/wifi-direct-main.c b/src/wifi-direct-main.c
deleted file mode 100644 (file)
index 6c4990e..0000000
+++ /dev/null
@@ -1,682 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-
-/*****************************************************************************
- *     Standard headers
- *****************************************************************************/
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/socket.h>
-#include <string.h>
-#include <stdbool.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <errno.h>
-#include <linux/unistd.h>
-#include <glib.h>
-#include <glib-object.h>
-#include <sys/stat.h>
-#include <dlfcn.h>
-#include <sys/utsname.h>
-
-/*****************************************************************************
- *     Platform headers
- *****************************************************************************/
-#include "vconf-keys.h"
-
-/*****************************************************************************
- *     Wi-Fi Direct Server headers
- *****************************************************************************/
-#include "wifi-direct.h"
-#include "wifi-direct-stub.h"
-#include "wifi-direct-service.h"
-#include "wifi-direct-utils.h"
-#include "wifi-direct-event-handler.h"
-#include "wifi-direct-oem.h"
-
-/*****************************************************************************
- *     Wi-Fi Macros
- *****************************************************************************/
-
-
-/*****************************************************************************
- *     Wi-Fi Global variables
- *****************************************************************************/
-wfd_server_control_t g_wfd_server;
-
-
-void wfd_server_process_event(wfd_event_t event);
-
-
-char *wfd_server_print_cmd(wifi_direct_cmd_e cmd)
-{
-       switch (cmd)
-       {
-       case WIFI_DIRECT_CMD_REGISTER:
-               return "WIFI_DIRECT_CMD_REGISTER";
-       case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
-               return "WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET";
-       case WIFI_DIRECT_CMD_DEREGISTER:
-               return "WIFI_DIRECT_CMD_DEREGISTER";
-       case WIFI_DIRECT_CMD_ACTIVATE:
-               return "WIFI_DIRECT_CMD_ACTIVATE";
-       case WIFI_DIRECT_CMD_DEACTIVATE:
-               return "WIFI_DIRECT_CMD_DEACTIVATE";
-       case WIFI_DIRECT_CMD_START_DISCOVERY:
-               return "WIFI_DIRECT_CMD_START_DISCOVERY";
-       case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
-               return "WIFI_DIRECT_CMD_CANCEL_DISCOVERY";
-       case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
-               return "WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT";
-       case WIFI_DIRECT_CMD_GET_LINK_STATUS:
-               return "WIFI_DIRECT_CMD_GET_LINK_STATUS";
-       case WIFI_DIRECT_CMD_CONNECT:
-               return "WIFI_DIRECT_CMD_CONNECT";
-
-       case WIFI_DIRECT_CMD_DISCONNECT_ALL:
-               return "WIFI_DIRECT_CMD_DISCONNECT_ALL";
-       case WIFI_DIRECT_CMD_CREATE_GROUP:
-               return "WIFI_DIRECT_CMD_CREATE_GROUP";
-       case WIFI_DIRECT_CMD_IS_GROUPOWNER:
-               return "WIFI_DIRECT_CMD_IS_GROUPOWNER";
-       case WIFI_DIRECT_CMD_GET_SSID:
-               return "WIFI_DIRECT_CMD_GET_SSID";
-       case WIFI_DIRECT_CMD_SET_SSID:
-               return "WIFI_DIRECT_CMD_SET_SSID";
-       case WIFI_DIRECT_CMD_GET_IP_ADDR:
-               return "WIFI_DIRECT_CMD_GET_IP_ADDR";
-       case WIFI_DIRECT_CMD_GET_CONFIG:
-               return "WIFI_DIRECT_CMD_GET_CONFIG";
-       case WIFI_DIRECT_CMD_SET_CONFIG:
-               return "WIFI_DIRECT_CMD_SET_CONFIG";
-       case WIFI_DIRECT_CMD_SEND_PROVISION_DISCOVERY_REQ:
-               return "WIFI_DIRECT_CMD_SEND_PROVISION_DISCOVERY_REQ";
-       case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
-               return "WIFI_DIRECT_CMD_SEND_CONNECT_REQ";
-
-       case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
-               return "WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON";
-       case WIFI_DIRECT_CMD_SET_WPS_PIN:
-               return "WIFI_DIRECT_CMD_SET_WPS_PIN";
-       case WIFI_DIRECT_CMD_GET_WPS_PIN:
-               return "WIFI_DIRECT_CMD_GET_WPS_PIN";
-       case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
-               return "WIFI_DIRECT_CMD_GENERATE_WPS_PIN";
-       case WIFI_DIRECT_CMD_GET_INCOMMING_PEER_INFO:
-               return "WIFI_DIRECT_CMD_GET_INCOMMING_PEER_INFO";
-       case WIFI_DIRECT_CMD_SET_WPA:
-               return "WIFI_DIRECT_CMD_SET_WPA";
-       case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
-               return "WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE";
-       case WIFI_DIRECT_CMD_SET_CURRENT_WPS_MODE:
-               return "WIFI_DIRECT_CMD_SET_CURRENT_WPS_MODE";
-       case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
-               return "WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO";
-       case WIFI_DIRECT_CMD_CANCEL_GROUP:
-               return "WIFI_DIRECT_CMD_CANCEL_GROUP";
-
-       case WIFI_DIRECT_CMD_DISCONNECT:
-               return "WIFI_DIRECT_CMD_DISCONNECT";
-       case WIFI_DIRECT_CMD_SET_GO_INTENT:
-               return "WIFI_DIRECT_CMD_SET_GO_INTENT";
-       case WIFI_DIRECT_CMD_GET_GO_INTENT:
-               return "WIFI_DIRECT_CMD_GET_GO_INTENT";
-       case WIFI_DIRECT_CMD_GET_DEVICE_MAC:
-               return "WIFI_DIRECT_CMD_GET_DEVICE_MAC";
-       case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
-               return "WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP";
-       case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
-               return "WIFI_DIRECT_CMD_SET_MAX_CLIENT";
-       case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
-               return "WIFI_DIRECT_CMD_GET_MAX_CLIENT";
-       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
-               return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE";
-       case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
-               return "WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE";
-       case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
-               return "WIFI_DIRECT_CMD_IS_DISCOVERABLE";
-       case WIFI_DIRECT_CMD_GET_OWN_GROUP_CHANNEL:
-               return "WIFI_DIRECT_CMD_GET_OWN_GROUP_CHANNEL";
-       case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
-               return "WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP";
-       case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP:
-               return "WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP";
-       case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
-               return "WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO";
-       case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
-               return "WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP";
-       case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
-               return "WIFI_DIRECT_CMD_GET_DEVICE_NAME";
-       case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
-               return "WIFI_DIRECT_CMD_SET_DEVICE_NAME";
-       case WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL:
-               return "WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL";
-
-       default:
-               return "WIFI_DIRECT_CMD_INVALID";
-
-       }
-}
-
-wfd_server_control_t *wfd_server_get_control()
-{
-       return &g_wfd_server;
-}
-
-static gboolean wfd_server_accept_client_socket(GIOChannel* source, GIOCondition condition, gpointer data)
-{
-       int clientfd = -1;
-       socklen_t clientlen = 0;
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-       int servfd = wfd_server->async_sockfd;
-
-       __WDS_LOG_FUNC_ENTER__;
-
-       if (servfd < 0)
-       {
-               WDS_LOGE("Invalid sockfd argument = [%d]", servfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       errno = 0;
-       clientfd = accept(servfd, NULL, &clientlen);
-       if (clientfd == -1)
-       {
-               WDS_LOGE("Failed to accept client socket. Error = [%s]. Server socket = [%d]", strerror(errno), servfd);
-
-               int ret = 0;
-               char req[10] = "";
-               int reqlen = 10;
-
-               errno = 0;
-               ret = read(servfd, req, reqlen);
-               if (ret == 0)
-               {
-                       WDS_LOGD("Server Socket got closed");
-               }
-               else if (ret < 0)
-               {
-                       WDS_LOGE( "Failed to read server socket. Error = [%s]", strerror(errno));
-               }
-               else
-                       WDS_LOGD( "Read [%d] data\n", ret);
-
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       WDS_LOGD("Succeeded to accept client: [%d]", clientfd);
-
-       if (!(wfd_server_register_client(clientfd)))
-       {
-               WDS_LOGE("Failed to add new client\n");
-               close(clientfd);
-       }
-       __WDS_LOG_FUNC_EXIT__;
-       return true;
-}
-
-static int wfd_server_create_socket(void)
-{
-       int len = 0;
-       int sockfd = -1;
-       struct sockaddr_un servAddr;
-       mode_t sock_mode;
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       __WDS_LOG_FUNC_ENTER__;
-
-       /** It is safe to Unlink the path.*/
-       unlink(WFD_SERVER_SOCKET_PATH);
-       errno = 0;
-       sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);
-       if (sockfd < 3)
-       {
-               WDS_LOGE( "Failed to create UNIX socket. Error = [%s]", strerror(errno));
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       memset(&servAddr, 0, sizeof(servAddr));
-       servAddr.sun_family = AF_UNIX;
-       strcpy(servAddr.sun_path, WFD_SERVER_SOCKET_PATH);
-       len = sizeof(servAddr.sun_family) + strlen(WFD_SERVER_SOCKET_PATH);
-
-       errno = 0;
-
-       sock_mode = (S_IRWXU | S_IRWXG | S_IRWXO);
-
-       if (bind(sockfd, (struct sockaddr *) &servAddr, len) == -1)
-       {
-               WDS_LOGE( "Failed to bind server socket. Error = [%s]", strerror(errno));
-               if (sockfd > 2)
-                       close(sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       WDS_LOGD("Succeeded to bind server socket.");
-
-       if (chmod(WFD_SERVER_SOCKET_PATH, sock_mode) < 0)
-       {
-               WDS_LOGD( "Failed to change server socket file mode");
-               if (sockfd > 2)
-                       close(sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       errno = 0;
-       if (listen(sockfd, WFD_MAX_CLIENTS) == -1)
-       {
-               WDS_LOGF( "Failed to listen server socket. Error = [%s]", strerror(errno));
-               if (sockfd > 2)
-                       close(sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       wfd_server->async_sockfd = sockfd;
-
-       WDS_LOGD( "Succeeded to create server socket [%d]", sockfd);
-       __WDS_LOG_FUNC_EXIT__;
-       return 1;
-}
-
-static void *wfd_load_plugin()
-{
-       void *handle;
-       struct utsname kernel_info;
-       int res;    
-
-       res = uname(&kernel_info);
-       if(res != 0)
-               WDS_LOGE("Failed to detect target type");
-       else
-               WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
-
-       handle = dlopen("/usr/lib/wifi-direct-plugin-wpasupplicant.so", RTLD_NOW);
-       if (!handle) {
-               WDS_LOGE("Failed to open shared object");
-               fputs(dlerror(), stderr);
-               return NULL;
-       }
-
-       int (*plugin_load)(struct wfd_oem_operations **ops) = NULL;
-       plugin_load = (int (*)(struct wfd_oem_operations **ops))dlsym(handle, "wfd_plugin_load");
-
-       if (!plugin_load) {
-               WDS_LOGF( "Failed to load symbol. Error = [%s]", strerror(errno));
-               dlclose(handle);
-               return NULL;
-       }
-
-       struct wfd_oem_operations *temp_ops;
-       (*plugin_load)(&temp_ops);
-       g_ops = temp_ops;
-
-       return handle;
-}
-
-
-/*****************************************************************************
- *     Wi-Fi Global Function Definition
- *****************************************************************************/
-
-static int wfd_server_init(void)
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       memset(&g_wfd_server, 0x00, sizeof(wfd_server_control_t));
-       g_wfd_server.async_sockfd = -1;
-       g_wfd_server.sync_sockfd = -1;
-
-       // ToDo: Read them from repository.
-       g_wfd_server.config_data.channel = 11;
-       g_wfd_server.config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;
-       g_wfd_server.config_data.auto_connection = false;
-       g_wfd_server.config_data.want_persistent_group = false;
-       g_wfd_server.config_data.max_clients = WFD_MAX_ASSOC_STA;
-       g_wfd_server.config_data.hide_SSID = false;
-       g_wfd_server.config_data.group_owner_intent = 8;
-       g_wfd_server.config_data.primary_dev_type = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE;  // Telephone
-       g_wfd_server.config_data.secondary_dev_type = WIFI_DIRECT_SECONDARY_DEVICE_TYPE_PHONE_SM_DUAL;  // smart phone dual mode (wifi and cellular)
-
-       g_wfd_server.plugin_handle = wfd_load_plugin();
-       if (g_wfd_server.plugin_handle == NULL)
-               return -1;
-
-       wfd_oem_init(wfd_server_process_event);
-
-       wfd_set_device_name_from_phone_name();
-
-       wfd_set_DHCP_event_handler();
-
-       if (wfd_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED) < 0)
-               WDS_LOGE( "Failed to  set Wi-Fi Direct state");
-
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-static int wfd_server_destroy()
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       if (g_wfd_server.async_sockfd>0)
-               close(g_wfd_server.async_sockfd);
-       unlink(WFD_SERVER_SOCKET_PATH);
-
-       memset(&g_wfd_server, 0, sizeof(wfd_server_control_t));
-
-       wfd_oem_destroy();
-
-       if (g_wfd_server.plugin_handle != NULL)
-               dlclose(g_wfd_server.plugin_handle);
-
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-static gboolean wfd_connection_timeout_cb(void *user_data)
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-       wifi_direct_client_noti_s noti;
-
-       g_source_remove(wfd_server->connection_timer);
-       wfd_server->connection_timer = 0;
-       wfd_server->connecting_120 = 0;
-       wfd_oem_reject_connection(wfd_server->current_peer.mac_address);
-
-       if (wfd_oem_is_groupowner())
-               wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-       else
-               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-
-#if 0
-       // disconnect the peer to reset state.
-       if (wfd_oem_is_groupowner() == TRUE)
-       {
-               WDS_LOGD( "Peer's Intf MAC is " MACSTR "\n", MAC2STR(wfd_server->current_peer.intf_mac_address));
-               if ( NULL == wfd_server->current_peer.intf_mac_address )
-                       WDS_LOGF( "[wfd_server->current_peer.intf_mac_address] is Null!\n");
-
-               if (wfd_oem_disconnect_sta(wfd_server->current_peer.intf_mac_address) == FALSE)
-                       WDS_LOGF( "Error... wfd_oem_disconnect_sta() failed\n");
-       }
-       else
-       {
-               wfd_server_set_state(WIFI_DIRECT_STATE_DISCONNECTING);
-
-               if (wfd_oem_disconnect() == TRUE)
-               {
-                       wfd_server->config_data.wps_config = WIFI_DIRECT_WPS_TYPE_PBC;  // set wps_config to default
-               }
-               else
-               {
-                       wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-                       WDS_LOGF( "Error... wfd_oem_disconnect() failed\n");
-               }
-       }
-#endif
-
-       memset(&noti, 0, sizeof(wifi_direct_client_noti_s));
-       snprintf(noti.param1, sizeof(noti.param1),MACSTR, MAC2STR(wfd_server->current_peer.mac_address));
-
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT;
-
-       wfd_server_reset_connecting_peer();
-       wfd_server_clear_connected_peer();
-
-       __wfd_server_send_client_event(&noti);
-
-       __WDS_LOG_FUNC_EXIT__;
-       return FALSE;
-}
-
-void wfd_timer_connection_start()
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       if (wfd_server->connection_timer > 0)
-               g_source_remove(wfd_server->connection_timer);
-
-       wfd_server->connection_timer = 0;
-       wfd_server->connecting_120 = 1;
-
-       wfd_server->connection_timer = g_timeout_add(120000 /* 120 seconds*/, (GSourceFunc)wfd_connection_timeout_cb , NULL);
-
-       __WDS_LOG_FUNC_EXIT__;
-}
-
-void wfd_timer_connection_cancel()
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       if (wfd_server->connection_timer > 0)
-               g_source_remove(wfd_server->connection_timer);
-
-       wfd_server->connection_timer = 0;
-
-       __WDS_LOG_FUNC_EXIT__;
-}
-
-
-static gboolean wfd_termination_timeout_cb(void *user_data)
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       if (wfd_server->active_clients > 0)
-       {
-               WDS_LOGD( "There is an active clients(Num=[%d]). Run timer again...", wfd_server->active_clients);
-               // Restart timer by returning true.
-               return TRUE;
-       }
-
-       int state = wfd_server_get_state();
-
-       if (state != WIFI_DIRECT_STATE_DEACTIVATED)
-       {
-               WDS_LOGD( "State is not 'deactivated' ( state=[%d] ).  Cancel timer.", state);
-               // Cancel timer by returning false.
-               return FALSE;
-       }
-
-       if (wfd_server->async_sockfd > 0)
-               close(wfd_server->async_sockfd);
-
-       g_main_quit(wfd_server->mainloop);
-
-       WDS_LOGD( "g_main_quit()...");
-       __WDS_LOG_FUNC_EXIT__;
-
-       // Cancel timer by returning false.
-       return FALSE;
-}
-
-
-void wfd_termination_timer_start()
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       if (wfd_server->termination_timer > 0)
-       {
-               g_source_remove(wfd_server->termination_timer);
-               WDS_LOGD( "Termination timer is restarted..\n");
-       }
-       else
-       {
-               WDS_LOGD( "Termination timer is started..\n");
-       }
-
-       wfd_server->termination_timer = 0;
-
-       wfd_server->termination_timer = g_timeout_add(120000 /* 120 seconds*/, (GSourceFunc)wfd_termination_timeout_cb , NULL);
-
-
-       __WDS_LOG_FUNC_EXIT__;
-}
-
-
-void wfd_termination_timer_cancel()
-{
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       if (wfd_server->termination_timer > 0)
-               g_source_remove(wfd_server->termination_timer);
-
-       wfd_server->termination_timer = 0;
-       WDS_LOGD( "Termination timer is canceled..\n");
-
-       __WDS_LOG_FUNC_EXIT__;
-}
-
-static gboolean wfd_discovery_timeout_cb(void *user_data)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-       int ret;
-
-       g_source_remove(wfd_server->discovery_timer);
-       wfd_server->discovery_timer = 0;
-
-       if (wfd_oem_is_groupowner())
-       {
-               wfd_server_set_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-       }
-       else
-       {
-               wfd_server_set_state(WIFI_DIRECT_STATE_ACTIVATED);
-       }
-
-       ret = wfd_oem_cancel_discovery();
-       if (ret == false)
-       {
-               WDS_LOGE( "Error!! wfd_oem_cancel_discovery() failed..\n");
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-       return FALSE;
-}
-
-void wfd_timer_discovery_start(int seconds)
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       if (wfd_server->discovery_timer> 0)
-               g_source_remove(wfd_server->discovery_timer);
-
-       wfd_server->discovery_timer = 0;
-
-       wfd_server->discovery_timer = g_timeout_add((seconds*1000), (GSourceFunc)wfd_discovery_timeout_cb , NULL);
-
-       __WDS_LOG_FUNC_EXIT__;
-}
-
-void wfd_timer_discovery_cancel()
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       if (wfd_server->discovery_timer > 0)
-               g_source_remove(wfd_server->discovery_timer);
-
-       wfd_server->discovery_timer = 0;
-
-       __WDS_LOG_FUNC_EXIT__;
-}
-
-int main(gint argc, gchar * argv[])
-{
-       GMainLoop *mainloop = NULL;
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-       int i = -1;
-
-       __WDS_LOG_FUNC_ENTER__;
-
-       WDS_LOGD("========================================\n");
-       WDS_LOGD("=                                                     =\n");
-       WDS_LOGD("=         WiFi Direct Server                  =\n");
-       WDS_LOGD("=                                                     =\n");
-       WDS_LOGD("========================================\n");
-
-       for (i = 0; i < argc; i++)
-               WDS_LOGD( "arg[%d]= %s", i, argv[i]);
-
-#if !GLIB_CHECK_VERSION (2, 31, 0)
-       if (!g_thread_supported())
-               g_thread_init(NULL);
-#endif
-
-#if !GLIB_CHECK_VERSION(2,35,0)
-       g_type_init();
-#endif
-
-       mainloop = g_main_loop_new(NULL, FALSE);
-
-       wfd_server_init();
-
-       if (wfd_server_create_socket() == -1)
-       {
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       GIOChannel* gio2 = g_io_channel_unix_new(wfd_server->async_sockfd);
-       g_io_add_watch(gio2, G_IO_IN, (GIOFunc)wfd_server_accept_client_socket, NULL);
-       g_io_channel_unref(gio2);
-
-
-       wfd_server->mainloop = mainloop;
-       wfd_termination_timer_start();
-
-       g_main_loop_run(mainloop);
-
-       WDS_LOGD( "Leave g_main_loop_run()...");
-
-       wfd_server_destroy();
-
-       WDS_LOGD( "WLAN engine is destroyed...");
-
-       WDS_LOGD( "=================================");
-       WDS_LOGD( "     Quit WiFi Direct Manager main()");
-       WDS_LOGD( "=================================");
-       WDS_LOGD( "Bye...\n");
-
-       __WDS_LOG_FUNC_EXIT__;
-
-       return 0;
-}
diff --git a/src/wifi-direct-manager.c b/src/wifi-direct-manager.c
new file mode 100644 (file)
index 0000000..7b7f6b6
--- /dev/null
@@ -0,0 +1,1020 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct manager functions.
+ *
+ * @file               wifi-direct-manager.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <sys/utsname.h>
+#include <errno.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <wifi-direct.h>
+#include <wifi-direct-internal.h>
+
+#include "wifi-direct-manager.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-session.h"
+#include "wifi-direct-group.h"
+#include "wifi-direct-peer.h"
+#include "wifi-direct-state.h"
+#include "wifi-direct-client.h"
+#include "wifi-direct-event.h"
+#include "wifi-direct-util.h"
+
+wfd_manager_s *g_manager;
+
+wfd_manager_s *wfd_get_manager()
+{
+       return g_manager;
+}
+
+static gboolean _wfd_exit_timeout_cb(void *user_data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) user_data;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return TRUE;
+       }
+
+       if (manager->client_count > 0) {
+               WDS_LOGD("Client count [%d]", manager->client_count);
+               return TRUE;
+       }
+
+       if (manager->state == WIFI_DIRECT_STATE_DEACTIVATED) {
+               WDS_LOGD("Terminate Wi-Fi Direct Manager");
+               g_main_quit(manager->main_loop);
+       }
+       manager->exit_timer = 0;
+       WDS_LOGD( "Stop exit timer. State [%d]", manager->state);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return FALSE;
+}
+
+static int _wfd_local_init_device(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = NULL;
+       int res = 0;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       errno = 0;
+       local = (wfd_device_s*) calloc(1, sizeof(wfd_device_s));
+       if (!local) {
+               WDS_LOGE("Failed to allocate memory for local device [%s]", strerror(errno));
+               return -1;
+       }
+       
+       res = wfd_util_get_phone_name(local->dev_name);
+       if (res < 0) {
+               WDS_LOGE("Failed to get phone name of local device. Use default device name");
+               strncpy(local->dev_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN);
+               local->dev_name[DEV_NAME_LEN] = '\0';
+       }
+       WDS_LOGD("Local Device name [%s]", local->dev_name);
+       wfd_util_set_dev_name_notification();
+
+       res = wfd_util_get_local_dev_mac(local->dev_addr);
+       if (res < 0) {
+               WDS_LOGE("Failed to get local device MAC address");
+       }
+
+       memcpy(local->intf_addr, local->dev_addr, MACADDR_LEN);
+       local->intf_addr[4] ^= 0x80;
+       WDS_LOGD("Local Interface MAC address [" MACSTR "]", MAC2STR(local->intf_addr));
+
+       local->config_methods = WFD_WPS_MODE_PBC | WFD_WPS_MODE_DISPLAY | WFD_WPS_MODE_KEYPAD;
+       local->wps_mode = WFD_WPS_MODE_PBC;
+       // TODO: initialize other local device datas
+       manager->local = local;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _wfd_local_deinit_device(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       wfd_util_unset_dev_name_notification();
+
+       if (manager->local)
+               free(manager->local);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_reset_data(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = manager->local;
+
+       /* init local device data */
+       local->dev_role = WFD_DEV_ROLE_NONE;
+       local->wps_mode = WFD_WPS_MODE_PBC;
+       memset(local->go_dev_addr, 0x0, MACADDR_LEN);
+       memset(local->ip_addr, 0x0, IPADDR_LEN);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_get_dev_name(char *dev_name)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (!dev_name) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       strncpy(dev_name, local->dev_name, DEV_NAME_LEN);
+       dev_name[DEV_NAME_LEN-1] = '\0';
+       WDS_LOGD("Local device name [%s]", dev_name);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_set_dev_name(char *dev_name)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (!dev_name) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       strncpy(local->dev_name, dev_name, DEV_NAME_LEN);
+       local->dev_name[DEV_NAME_LEN-1] = '\0';
+
+       if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED) {
+               wfd_oem_set_dev_name(g_manager->oem_ops, dev_name);
+
+               wfd_oem_scan_param_s param;
+               param.scan_mode = WFD_SCAN_MODE_ACTIVE;
+               param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
+               param.scan_time = 5;
+               param.refresh = TRUE;
+               wfd_oem_start_scan(g_manager->oem_ops, &param);
+               WDS_LOGD("Device name changed. Active scan started");
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_get_dev_mac(unsigned char *dev_mac)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (!dev_mac) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       memcpy(dev_mac, local->dev_addr, MACADDR_LEN);
+       WDS_LOGD("Local device MAC address [" MACSTR "]", MAC2STR(dev_mac));
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_get_intf_mac(unsigned char *intf_mac)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (!intf_mac) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       memcpy(intf_mac, local->intf_addr, MACADDR_LEN);
+       WDS_LOGD("Local interface MAC address [" MACSTR "]", MAC2STR(intf_mac));
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_get_ip_addr(char *ip_str)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (!ip_str) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(local->ip_addr));
+       WDS_LOGD("Local IP address [" IPSTR "]", IP2STR(local->ip_addr));
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_get_supported_wps_mode(int *config_methods)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (!config_methods) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *config_methods = local->config_methods;
+       WDS_LOGD("Local config method [0x%x]", *config_methods);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_get_wps_mode(int *wps_mode)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (!wps_mode) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *wps_mode = local->wps_mode;
+       WDS_LOGD("Local wps mode [0x%x]", *wps_mode);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_local_set_wps_mode(int wps_mode)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (!wps_mode) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       local->wps_mode = wps_mode;
+       WDS_LOGD("Local wps mode [0x%x]", wps_mode);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_get_go_intent(int *go_intent)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       if (!go_intent) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *go_intent = g_manager->go_intent;
+       WDS_LOGD("Local GO intent [%d]", *go_intent);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_set_go_intent(int go_intent)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (go_intent < 0 || go_intent > 15) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_manager->go_intent = go_intent;
+       if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED)
+               wfd_oem_set_go_intent(g_manager->oem_ops, go_intent);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_get_max_station(int *max_station)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!max_station) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *max_station = g_manager->max_station;
+       WDS_LOGD("Local max station[%d]", *max_station);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_set_max_station(int max_station)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (max_station < 1) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_manager->max_station = max_station;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_get_autoconnection(int *autoconnection)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       if (!autoconnection) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *autoconnection = g_manager->autoconnection;
+       WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE":"FALSE");
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_set_autoconnection(int autoconnection)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       if (autoconnection < 0) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_manager->autoconnection = autoconnection;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_get_req_wps_mode(int *req_wps_mode)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!req_wps_mode) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *req_wps_mode = g_manager->req_wps_mode;
+       WDS_LOGD("Requested wps mode [0x%x]", *req_wps_mode);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_set_req_wps_mode(int req_wps_mode)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = g_manager->local;
+
+       if (req_wps_mode != WIFI_DIRECT_WPS_TYPE_PBC &&
+                       req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY &&
+                       req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_manager->req_wps_mode = req_wps_mode;
+       WDS_LOGD("Requested wps mode [0x%x]", req_wps_mode);
+       if (req_wps_mode == WFD_WPS_MODE_DISPLAY)
+               local->wps_mode = WFD_WPS_MODE_KEYPAD;
+       else if (req_wps_mode == WFD_WPS_MODE_KEYPAD)
+               local->wps_mode = WFD_WPS_MODE_DISPLAY;
+       else
+               local->wps_mode = req_wps_mode;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_local_config_set(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *local = NULL;
+       int res = 0;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       local = manager->local;
+
+       local->wps_mode = WFD_WPS_MODE_PBC;
+       WDS_LOGD("Device name set as %s", local->dev_name);
+       wfd_oem_set_dev_type(manager->oem_ops, local->pri_dev_type, local->sec_dev_type);
+       wfd_oem_set_go_intent(manager->oem_ops, manager->go_intent);
+       wfd_oem_set_dev_name(manager->oem_ops, local->dev_name);
+
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_activate(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = 0;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       if (manager->state > WIFI_DIRECT_STATE_ACTIVATING) {
+               WDS_LOGE("Already activated");
+               return 1;
+       }
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATING);
+
+       res = wfd_oem_activate(manager->oem_ops);
+       if (res < 0) {
+               WDS_LOGE("Failed to activate");
+               wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+       WDS_LOGE("Succeeded to activate");
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_deactivate(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = 0;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       if (manager->state < WIFI_DIRECT_STATE_ACTIVATING) {
+               WDS_LOGE("Already deactivated");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATING);
+
+       res = wfd_oem_deactivate(manager->oem_ops);
+       if (res < 0) {
+               WDS_LOGE("Failed to deactivate");
+               // TODO: check state setting is correct
+               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+       WDS_LOGE("Succeeded to deactivate");
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_session_s *session = NULL;
+       int res = 0;
+
+       if (!manager || !peer_addr) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       session = (wfd_session_s*) manager->session;
+       if (session && !session->invitation) {
+               WDS_LOGE("Session already exist or not an invitaion session");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       if (!session) {
+               session = wfd_create_session(manager, peer_addr,
+                                       manager->local->wps_mode, SESSION_DIRECTION_OUTGOING);
+               if (!session) {
+                       WDS_LOGE("Failed to create new session");
+                       return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
+       }
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO && !session->invitation) {
+               session->invitation = 1;
+               res = wfd_session_invite(session);
+       } else {
+               /* joining to group or starting connection with PD */
+               /* In case of invitation session PD should be started
+                * peer->dev_role == WFD_DEV_ROLE_GO
+                * session->direction == SESSION_DIRECTION_INCOMING
+                * session->invitation == TRUE;
+                */
+               res = wfd_session_start(session);
+       }
+       if (res < 0) {
+               WDS_LOGE("Failed to start session");
+
+               wfd_destroy_session(manager);
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_session_s *session = NULL;
+       wfd_device_s *peer = NULL;
+       int res = 0;
+
+       if (!manager || !peer_addr) {
+               WDS_LOGE("Invalid parameter");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Session not found");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
+       if (!peer) {
+               WDS_LOGE("Peer is NULL");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       // TODO: check peer_addr with session's peer_addr
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+               /* Peer want to join my group(Peer sent PD) */
+               WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");
+               res = wfd_session_wps(session);
+       } else if (peer->dev_role == WFD_DEV_ROLE_GO) {
+               /* FIX ME: When Enter PIN or Display event comes up from supplicant
+                * manager send Connection WPS Req event to client.
+                * So, application use accept_connection API.
+                * This is odd situation. We need new client event such as WPS_KEYPAD/WPS_DISPLAY for application.
+                * We can correct alien code below with new client event */
+               if (session->direction == SESSION_DIRECTION_OUTGOING) {
+                       WDS_LOGD("Peer device is GO, WPS_Enrollee will be started");
+                       wfd_session_wps(manager->session);
+               } else {
+                       WDS_LOGD("Peer device is GO, so Prov_Disc will be started");
+                       wfd_session_start(session);
+               }
+       } else {
+               /* Prov_disc_req received. GO Negotiation will be started */
+               WDS_LOGD("My device is Device, so Negotiation will be started");
+               res = wfd_session_connect(session);
+       }
+       if (res < 0) {
+               WDS_LOGE("Failed to start session");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
+
+int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       GList *temp = NULL;
+       wfd_device_s *peer = NULL;
+       wfd_discovery_entry_s *peers = NULL;
+       int peer_count = 0;
+       int count = 0;
+       int res = 0;
+
+       if (!manager || !peers_data) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       peer_count = manager->peer_count;
+       if (peer_count < 0)
+               return -1;
+       else if (peer_count == 0)
+               return 0;
+
+       errno = 0;
+       peers = (wfd_discovery_entry_s*) calloc(peer_count, sizeof(wfd_discovery_entry_s));
+       if (!peers) {
+               WDS_LOGF("Failed to allocate memory for peer data. [%s]", strerror(errno));
+               return -1;
+       }
+
+       temp = g_list_first(manager->peers);
+       while (temp && count < peer_count) {
+               peer = temp->data;
+               {
+                       strncpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN);
+                       peers[count].device_name[DEV_NAME_LEN] = '\0';
+                       memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
+                       memcpy(peers[count].intf_mac_address, peer->intf_addr, MACADDR_LEN);
+                       peers[count].channel = 1;
+                       peers[count].services = 0;
+                       peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
+                       peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
+                       peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
+                       peers[count].wps_device_pwd_id = 0;
+                       peers[count].wps_cfg_methods = peer->config_methods;
+                       peers[count].category = peer->pri_dev_type;
+                       peers[count].subcategory = peer->sec_dev_type;
+                       peers[count].is_wfd_device = 0;
+                       count++;
+                       WDS_LOGD("%dth peer [%d]", count, peer->dev_name);
+               }
+               temp = g_list_next(temp);
+               peer = NULL;
+       }
+       WDS_LOGD("%d peers converted", count);
+
+       *peers_data = peers;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return count;
+}
+
+int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_connected_peer_info_s *peers = NULL;
+       wfd_group_s *group = NULL;
+       wfd_device_s *peer = NULL;
+       GList *temp = NULL;
+       int peer_count = 0;
+       int count = 0;
+
+       if (!manager || !peers_data) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       group = manager->group;
+       if (!group) {
+               WDS_LOGE("Group not exist");
+               return -1;
+       }
+
+       peer_count = group->member_count;
+       if (peer_count == 0) {
+               WDS_LOGD("Member not exist");
+               return 0;
+       }
+
+       errno = 0;
+       peers = (wfd_connected_peer_info_s*) calloc(peer_count, sizeof(wfd_connected_peer_info_s));
+       if (!peers) {
+               WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", strerror(errno));
+               return -1;
+       }
+
+       temp = g_list_first(group->members);
+       while (temp && count < group->member_count) {
+               peer = temp->data;
+               {
+                       strncpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN);
+                       peers[count].device_name[DEV_NAME_LEN] = '\0';
+                       memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
+                       memcpy(peers[count].intf_mac_address, peer->intf_addr, MACADDR_LEN);
+                       memcpy(peers[count].ip_address, peer->ip_addr, IPADDR_LEN);
+                       peers[count].category = peer->pri_dev_type;
+                       peers[count].channel = 1;
+                       peers[count].is_p2p = 1;
+                       peers[count].services = 0;
+                       WDS_LOGD("%dth member converted[%s]", count, peers[count].device_name);
+                       count++;
+               }
+               temp = g_list_next(temp);
+               peer = NULL;
+       }
+       WDS_LOGD("%d members converted", count);
+
+       *peers_data = peers;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return count;
+}
+
+wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *peer = NULL;
+
+       if (!manager || !peer_addr) {
+               WDS_LOGE("Invalid parameter");
+               return NULL;
+       }
+
+       peer = wfd_group_find_peer_by_dev_addr(manager->group, peer_addr);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return peer;
+}
+
+wfd_device_s *wfd_manager_get_current_peer(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_session_s *session = NULL;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       session = manager->session;
+       if (session && session->peer) {
+               __WDS_LOG_FUNC_EXIT__;
+               return session->peer;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return NULL;
+}
+
+int wfd_manager_get_goup_ifname(char **ifname)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_group_s *group = g_manager->group;
+
+       if (!ifname) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (!group) {
+               WDS_LOGE("Group not exist");
+               return -1;
+       }
+
+       *ifname = group->ifname;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static wfd_manager_s *wfd_manager_init()
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = NULL;
+       int res = 0;
+
+       manager = (wfd_manager_s*) calloc(1, sizeof(wfd_manager_s));
+       if (!manager) {
+               WDS_LOGE("Failed to allocate memory for wfd_manager structure");
+               return NULL;
+       }
+
+       manager->go_intent = 7;
+       manager->req_wps_mode = WFD_WPS_MODE_PBC;
+       manager->max_station = 8;
+
+       res = _wfd_local_init_device(manager);
+       if (res < 0) {
+               WDS_LOGE("Failed to initialize local device");
+               free(manager);
+               return NULL;            // really stop manager?
+       }
+       WDS_LOGD("Succeeded to initialize local device");
+
+       manager->exit_timer = g_timeout_add(120000, 
+                                               (GSourceFunc) _wfd_exit_timeout_cb, manager);
+       WDS_LOGD("Exit timer started");
+
+       __WDS_LOG_FUNC_EXIT__;
+       return manager;
+}
+
+int wfd_manager_deinit(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (manager->exit_timer > 0)
+               g_source_remove(manager->exit_timer);
+       manager->exit_timer = 0;
+
+       _wfd_local_deinit_device(manager);
+
+       if (manager)
+               free(manager);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static void *wfd_plugin_init(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       void *handle;
+       struct utsname kernel_info;
+       int res;    
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       res = uname(&kernel_info);
+       if (res) {
+               WDS_LOGE("Failed to detect target type");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+       WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
+
+       errno = 0;
+       handle = dlopen(SUPPL_PLUGIN_PATH, RTLD_NOW);
+       if (!handle) {
+               WDS_LOGE("Failed to open shared object. [%s]", dlerror());
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       errno = 0;
+       int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
+       plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_plugin_load");
+       if (!plugin_load) {
+               WDS_LOGE( "Failed to load symbol. Error = [%s]", strerror(errno));
+               dlclose(handle);
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       wfd_oem_ops_s *temp_ops;
+       (*plugin_load)(&temp_ops);
+       manager->oem_ops = temp_ops;
+
+       res = wfd_oem_init(temp_ops, (wfd_oem_event_cb) wfd_process_event, manager);
+       if (res < 0) {
+               WDS_LOGE("Failed to initialize OEM");
+               dlclose(handle);
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+       WDS_LOGD("Succeeded to initialize OEM");
+
+       __WDS_LOG_FUNC_EXIT__;
+       return handle;
+}
+
+static int wfd_plugin_deinit(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!manager || !manager->plugin_handle) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       dlclose(manager->plugin_handle);
+       manager->plugin_handle = NULL;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int main(int argc, char *argv[])
+{
+       __WDS_LOG_FUNC_ENTER__;
+       GMainLoop *main_loop = NULL;
+       int res = 0;
+
+       if (!g_thread_supported())
+               g_thread_init(NULL);
+
+       g_type_init();
+
+       // TODO: Parsing argument
+       /* Wi-Fi direct connection for S-Beam can be optimized using argument */
+
+       g_manager = wfd_manager_init();
+       if (!g_manager) {
+               WDS_LOGE("Failed to initialize wifi-direct manager");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDS_LOGD("Succeeded to initialize manager");
+
+       g_manager->plugin_handle = wfd_plugin_init(g_manager);
+       if (!g_manager->plugin_handle) {
+               WDS_LOGE("Failed to initialize plugin");
+               wfd_manager_deinit(g_manager);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDS_LOGD("Succeeded to load plugin");
+
+       res = wfd_client_handler_init(g_manager);
+       if (res < 0) {
+               WDS_LOGE("Failed to initialize client handler");
+               wfd_plugin_deinit(g_manager);
+               wfd_manager_deinit(g_manager);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDS_LOGD("Succeeded to initialize client handler");
+
+       main_loop = g_main_loop_new(NULL, FALSE);
+       if (main_loop == NULL) {
+               WDS_LOGE("Failed to create GMainLoop structure");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       g_manager->main_loop = main_loop;
+
+       g_main_loop_run(main_loop);
+
+       wfd_client_handler_deinit(g_manager);
+       wfd_plugin_deinit(g_manager);
+       wfd_manager_deinit(g_manager);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
diff --git a/src/wifi-direct-peer.c b/src/wifi-direct-peer.c
new file mode 100644 (file)
index 0000000..c842703
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct peer functions.
+ *
+ * @file               wifi-direct-peer.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+#include <wifi-direct-internal.h>
+
+#include "wifi-direct-manager.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-util.h"
+#include "wifi-direct-peer.h"
+#include "wifi-direct-session.h"
+
+
+wfd_device_s *wfd_add_peer(void *data, unsigned char *dev_addr, char *dev_name)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_device_s *peer = NULL;
+
+       if (!data || !dev_addr || !dev_name) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       peer = wfd_peer_find_by_dev_addr(manager, dev_addr);
+       if (peer) {
+               WDS_LOGE("Peer already exist[" MACSTR "]", MAC2STR(dev_addr));
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       peer = (wfd_device_s*) calloc(1, sizeof(wfd_device_s));
+       memcpy(peer->dev_addr, dev_addr, MACADDR_LEN);
+       strncpy(peer->dev_name, dev_name, DEV_NAME_LEN);
+       peer->dev_name[DEV_NAME_LEN-1] = '\0';
+
+       manager->peers = g_list_prepend(manager->peers, peer);
+       manager->peer_count++;
+       WDS_LOGD("peer_count[%d]", manager->peer_count);
+       __WDS_LOG_FUNC_EXIT__;
+       return peer;
+}
+
+int wfd_remove_peer(void *data, unsigned char *dev_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_device_s *peer = NULL;
+
+       if (!data || !dev_addr) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       peer = wfd_peer_find_by_dev_addr(manager, dev_addr);
+       if (!peer) {
+               WDS_LOGE("Failed to find peer device");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       manager->peers = g_list_remove(manager->peers, peer);
+       manager->peer_count--;
+
+       free(peer);
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_peer_clear_all(void *data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_device_s *peer = NULL;
+       GList *temp = NULL;
+
+       if (manager->peer_count == 0) {
+               WDS_LOGD("Peer not exist");
+               return -1;
+       }
+
+       temp = g_list_first(manager->peers);
+       while(temp) {
+               peer = (wfd_device_s*) temp->data;
+               free(peer);
+               temp = g_list_next(temp);
+               manager->peer_count--;
+       }
+       g_list_free(manager->peers);
+       manager->peers = NULL;
+
+       if (manager->peer_count){
+               WDS_LOGE("Peer count is not synced. left count=%d", manager->peer_count);
+               manager->peer_count = 0;
+               return 1;
+       }
+       
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+wfd_device_s *wfd_peer_find_by_dev_addr(void *data, unsigned char *dev_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_device_s *peer = NULL;
+       GList *temp = NULL;
+
+       if (!data || !dev_addr) {
+               WDS_LOGE("Invalid parameter");
+               return NULL;
+       }
+
+       if (manager->peer_count == 0) {
+               WDS_LOGE("There is no peer data");
+               return NULL;
+       }
+
+       temp = g_list_first(manager->peers);
+       while (temp) {
+               peer = temp->data;
+               if (!memcmp(peer->dev_addr, dev_addr, MACADDR_LEN)) {
+                       WDS_LOGD("Peer device found[" MACSTR "]", MAC2STR(dev_addr));
+                       break;
+               }
+               temp = g_list_next(temp);
+               peer = NULL;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return peer;
+}
+
+wfd_device_s *wfd_peer_find_by_intf_addr(void *data, unsigned char *intf_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_device_s *peer = NULL;
+       GList *temp = NULL;
+
+       if (!data || !intf_addr) {
+               WDS_LOGE("Invalid parameter");
+               return NULL;
+       }
+
+       if (manager->peer_count == 0) {
+               WDS_LOGE("There is no peer data");
+               return NULL;
+       }
+
+       temp = g_list_first(manager->peers);
+       while (temp) {
+               peer = temp->data;
+               if (!memcmp(peer->intf_addr, intf_addr, MACADDR_LEN)) {
+                       WDS_LOGD("Peer device found[" MACSTR "]", MAC2STR(intf_addr));
+                       break;
+               }
+               temp = g_list_next(temp);
+               peer = NULL;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return peer;
+}
+
+wfd_device_s *wfd_peer_find_current_peer(void *data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *peer = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return NULL;
+       }
+       
+       wfd_session_s *session = manager->session;
+       if (!session) {
+               WDS_LOGE("Session not found");
+               return NULL;
+       }
+
+       peer = session->peer;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return peer;
+}
+
+int wfd_peer_set_data(unsigned char *dev_addr, int type, int data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_peer_get_data(unsigned char *dev_addr, int type, int data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
diff --git a/src/wifi-direct-session.c b/src/wifi-direct-session.c
new file mode 100644 (file)
index 0000000..b22d37b
--- /dev/null
@@ -0,0 +1,718 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct session functions.
+ *
+ * @file               wifi-direct-session.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+#include <wifi-direct-internal.h>
+
+#include "wifi-direct-manager.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-peer.h"
+#include "wifi-direct-group.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-util.h"
+#include "wifi-direct-session.h"
+#include "wifi-direct-event.h"
+#include "wifi-direct-state.h"
+
+
+static gboolean _session_timeout_cb(gpointer *user_data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = (wfd_session_s*) manager->session;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               return FALSE;
+       }
+
+       session->connecting_120 = 0;
+       session->timer = 0;
+       wfd_destroy_session(manager);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return FALSE;
+}
+
+static int _session_timer(wfd_session_s *session, int start)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (start) {
+               session->connecting_120 = 1;
+               if (session->timer > 0) {
+                       WDS_LOGE("Session timer already started");
+                       __WDS_LOG_FUNC_EXIT__;
+                       return -1;
+               }
+               session->timer = g_timeout_add(120000,
+                                                       (GSourceFunc) _session_timeout_cb,
+                                                       session);
+               WDS_LOGD("Session timer started");
+       } else {
+               session->connecting_120 = 0;
+               if (session->timer > 0) {
+                       g_source_remove(session->timer);
+                       session->timer = 0;
+                       WDS_LOGD("Session timer stoped");
+               }
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+// Check the session instance which has same peer address, before using this function
+wfd_session_s *wfd_create_session(void *data, unsigned char *peer_addr, int wps_mode, int direction)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_session_s *session = NULL;
+       wfd_device_s *peer = NULL;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+
+       if (!data || !peer_addr) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       session = (wfd_session_s*) calloc(1, sizeof(wfd_session_s));
+       if (!session) {
+               WDS_LOGE("Failed to allocate memory for session");
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+
+       peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
+       if (!peer) {
+               WDS_LOGE("Failed to find peer info[" MACSTR "]", MAC2STR(peer_addr));
+               free(session);
+               __WDS_LOG_FUNC_EXIT__;
+               return NULL;
+       }
+       session->peer = peer;
+       session->wps_mode = wps_mode;
+       if (wps_mode == WFD_WPS_MODE_DISPLAY)
+               session->req_wps_mode = WFD_WPS_MODE_KEYPAD;
+       else if (wps_mode == WFD_WPS_MODE_KEYPAD)
+               session->req_wps_mode = WFD_WPS_MODE_DISPLAY;
+       else
+               session->req_wps_mode = wps_mode;
+       session->direction = direction;
+       session->state = SESSION_STATE_CREATED;
+
+       manager->session = session;
+       manager->local->wps_mode = wps_mode;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return session;
+}
+
+int wfd_destroy_session(void *data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) data;
+       wfd_session_s *session = NULL;
+       wfd_device_s *peer = NULL;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Session not found");
+               return -1;
+       }
+       _session_timer(session, 0);
+       peer = session->peer;
+       
+       if (session->state != SESSION_STATE_COMPLETED) {
+               wifi_direct_client_noti_s noti;
+               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+               noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
+               snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+               wfd_event_notify_clients(manager, &noti);
+       }
+
+       free(session);
+       manager->session = NULL;
+       manager->local->wps_mode = WFD_WPS_MODE_PBC;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_start(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *peer = NULL;
+       int join = 0;
+       int res = 0;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       // Check: Invitation Received in Incomming case -> send prov_disc join
+       // Check: User select peer to connect with in Outgoing case -> send prov_disc wps_mdde
+
+       session->state = SESSION_STATE_STARTED;
+       peer = session->peer;
+       if (peer->dev_role == WFD_DEV_ROLE_GO || session->invitation)
+               join = 1;
+       res = wfd_oem_prov_disc_req(manager->oem_ops, peer->dev_addr,
+                                       session->req_wps_mode, join);
+       if (res < 0) {
+               WDS_LOGE("Failed to send provision discovery request to peer [" MACSTR "]",
+                                                                       MAC2STR(peer->dev_addr));
+               wfd_destroy_session(manager);
+               // TODO: send notification to App
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       _session_timer(session, 1);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_stop(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *peer = NULL;
+       int res = 0;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (session->state > SESSION_STATE_CREATED) {
+               peer = session->peer;
+               if (session->direction == SESSION_DIRECTION_INCOMING) {
+                       res  = wfd_oem_reject_connection(manager->oem_ops, peer->dev_addr);
+               } else if (session->direction == SESSION_DIRECTION_OUTGOING) {
+                       res = wfd_oem_cancel_connection(manager->oem_ops, peer->dev_addr);
+               }
+               if (res < 0) {
+                       WDS_LOGE("Failed to reject or cancel connection");
+                       __WDS_LOG_FUNC_EXIT__;
+                       return -1;
+               }
+       }
+
+       session->state = SESSION_STATE_STOPPED;
+       wfd_destroy_session(manager);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+/* In case of incomming session, when user accept connection request, this function should be called.
+ * In case of outgoing session, when prov_disc response arrived, this function should be called.
+ * Even though peer is GO, we can use this function, which can decide using join itself.
+ */
+int wfd_session_connect(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_oem_conn_param_s param;
+       wfd_device_s *peer = NULL;
+       int res = 0;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (session->state > SESSION_STATE_GO_NEG) {
+               WDS_LOGE("Session already starts GO Negotiation");
+               return -1;
+       }
+
+       session->state = SESSION_STATE_GO_NEG;
+       peer = session->peer;
+
+       memset(&param, 0x00, sizeof(wfd_oem_conn_param_s));
+       param.wps_mode = session->wps_mode;
+       if (peer->dev_role == WFD_DEV_ROLE_GO)
+               param.conn_flags |= WFD_OEM_CONN_TYPE_JOIN;
+       param.go_intent = session->go_intent;
+       param.freq = session->freq;
+       if (session->wps_pin[0] != '\0') {
+               strncpy(param.wps_pin, session->wps_pin, OEM_PINSTR_LEN);
+               param.wps_pin[OEM_PINSTR_LEN] = '\0';
+       }
+
+       res = wfd_oem_connect(manager->oem_ops, peer->dev_addr, &param);
+       if (res < 0) {
+               WDS_LOGE("Failed to connect peer [" MACSTR "]", MAC2STR(peer->dev_addr));
+               wfd_destroy_session(manager);
+               // TODO: send notification to App
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       _session_timer(session, 1);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_reject(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *peer = NULL;
+       int res = 0;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (session->state < SESSION_STATE_STARTED) {
+               WDS_LOGE("Session is not started");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (session->direction != SESSION_DIRECTION_INCOMING) {
+               WDS_LOGE("Cannot reject with outgoing connection");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       // TODO: check session status and do proper work
+       // for example, reject prov_disc, reject nego, stop wps, etc.
+       peer = session->peer;
+       res = wfd_oem_reject_connection(manager->oem_ops, peer->dev_addr);
+       if (res < 0) {
+               WDS_LOGE("Failed to reject connection");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       wfd_destroy_session(manager);
+       // TODO: send notification to App
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_join(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_oem_conn_param_s param;
+       wfd_device_s *peer = NULL;
+       int res = 0;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       session->state = SESSION_STATE_WPS;
+       peer = session->peer;
+
+       memset(&param, 0x00, sizeof(wfd_oem_conn_param_s));
+       param.wps_mode = session->wps_mode;
+       if (peer->dev_role == WFD_DEV_ROLE_GO)
+               param.conn_flags |= WFD_OEM_CONN_TYPE_JOIN;
+       param.go_intent = session->go_intent;
+       param.freq = session->freq;
+       memcpy(param.wps_pin, session->wps_pin, OEM_PINSTR_LEN);
+
+       res = wfd_oem_connect(manager->oem_ops, peer->dev_addr, &param);
+       if (res < 0) {
+               WDS_LOGE("Failed to join with peer [" MACSTR "]", MAC2STR(peer->dev_addr));
+               wfd_destroy_session(manager);
+               // TODO: send notification to App
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       _session_timer(session, 1);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_invite(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_oem_invite_param_s param;
+       wfd_device_s *peer = NULL;
+       wfd_group_s *group = NULL;
+       int res = 0;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       peer = session->peer;
+       group = (wfd_group_s*) manager->group;
+
+       memset(&param, 0x00, sizeof(wfd_oem_invite_param_s));
+       param.ifname = strdup(group->ifname);
+       memcpy(param.go_dev_addr, group->go_dev_addr, MACADDR_LEN);
+
+       WDS_LOGD("Invite: Peer[" MACSTR "], GO Addr[" MACSTR "]", MAC2STR(peer->dev_addr), MAC2STR(param.go_dev_addr));
+
+       res = wfd_oem_invite(manager->oem_ops, peer->dev_addr, &param);
+       if (res < 0) {
+               WDS_LOGE("Failed to invite with peer [" MACSTR "]", MAC2STR(peer->dev_addr));
+               wfd_destroy_session(manager);
+               // TODO: send notification to App
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       _session_timer(session, 1);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_wps(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *peer = NULL;
+       int res = 0;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (session->state > SESSION_STATE_WPS) {
+               WDS_LOGE("Session already starts WPS");
+               return -1;
+       }
+
+       session->state = SESSION_STATE_WPS;
+       peer = session->peer;
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+               WDS_LOGD("My device is GO, so WPS will be started. WPS mode[%d]", session->wps_mode);
+               res = wfd_oem_wps_start(manager->oem_ops, peer->dev_addr, session->wps_mode, session->wps_pin);
+       } else {
+               WDS_LOGD("My device is not GO, so Enrollee will be started. WPS mode[%d]", session->wps_mode);
+               res = wfd_oem_enrollee_start(manager->oem_ops, peer->dev_addr, session->wps_mode, session->wps_pin);
+       }
+       if (res < 0) {
+               WDS_LOGE("Failed to start wps with peer [" MACSTR "]", MAC2STR(peer->dev_addr));
+               wfd_destroy_session(manager);
+               // TODO: send notification to App
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+wfd_device_s *wfd_session_get_peer(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *peer = NULL;
+
+       if (!session) {
+               WDS_LOGE("Invalid parameter");
+               return NULL;
+       }
+       
+       peer = session->peer;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return peer;
+}
+
+unsigned char *wfd_session_get_peer_addr(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_device_s *peer = NULL;
+
+       if (!session || !session->peer) {
+               WDS_LOGE("Invalid parameter");
+               return NULL;
+       }
+       
+       peer = session->peer;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return peer->dev_addr;
+}
+
+int wfd_session_get_wps_pin(wfd_session_s *session, unsigned char *pin)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_set_wps_pin(wfd_session_s *session, unsigned char *pin)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_set_freq(wfd_session_s *session, int freq)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_get_state(wfd_session_s *session)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_set_state(wfd_session_s *session, int state)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_session_s *session = NULL;
+
+       if (!manager || !event) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       WDS_LOGD("event ID [%d]", event->event_id);
+       session = manager->session;
+
+       switch (event->event_id) {
+       case WFD_OEM_EVENT_PROV_DISC_REQ:
+       case WFD_OEM_EVENT_PROV_DISC_DISPLAY:
+       case WFD_OEM_EVENT_PROV_DISC_KEYPAD:
+       {
+               if (!session) {
+                       session = wfd_create_session(manager, event->dev_addr,
+                                                                               event->wps_mode, SESSION_DIRECTION_INCOMING);
+                       if (!session) {
+                               WDS_LOGE("Failed to create session with peer [" MACSTR "]", MAC2STR(event->dev_addr));
+                               break;
+                       }
+
+                       /* Update session */
+                       if (event->wps_mode == WFD_OEM_WPS_MODE_DISPLAY) {
+                               strncpy(session->wps_pin, event->wps_pin, PINSTR_LEN);
+                               session->wps_pin[PINSTR_LEN] = '\0';
+                       }
+                       session->state = SESSION_STATE_STARTED;
+                       _session_timer(session, 1);
+
+                       manager->local->wps_mode = event->wps_mode;
+
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+
+                       wifi_direct_client_noti_s noti;
+                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
+                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
+                       wfd_event_notify_clients(manager, &noti);
+               } else {
+                       if (session->state > SESSION_STATE_STARTED) {
+                               WDS_LOGE("Unexpected event. Session is already started");
+                               break;
+                       }
+
+                       session->wps_mode = event->wps_mode;
+                       if (event->wps_mode == WFD_WPS_MODE_DISPLAY) {
+                               session->req_wps_mode = WFD_WPS_MODE_KEYPAD;
+                               strncpy(session->wps_pin, event->wps_pin, PINSTR_LEN);
+                               session->wps_pin[PINSTR_LEN] = '\0';
+                       } else if (event->wps_mode == WFD_WPS_MODE_KEYPAD) {
+                               session->req_wps_mode = WFD_WPS_MODE_DISPLAY;
+                       } else {
+                               session->req_wps_mode = WFD_WPS_MODE_PBC;
+                       }
+                       session->state = SESSION_STATE_STARTED;
+                       _session_timer(session, 1);
+
+                       manager->local->wps_mode = event->wps_mode;
+                       WDS_LOGD("Local WPS mode is %d", session->wps_mode);
+
+                       if (session->wps_mode != WFD_WPS_MODE_PBC) {
+                               wifi_direct_client_noti_s noti;
+                               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
+                               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
+                               wfd_event_notify_clients(manager, &noti);
+                               if (session->wps_mode == WFD_WPS_MODE_KEYPAD)
+                                       break;
+                       }
+
+                       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+                               WDS_LOGD("Start WPS corresponding to OEM event [%d]", event->event_id);
+                               wfd_session_wps(session);
+                       } else if (session->peer->dev_role == WFD_DEV_ROLE_GO) {
+                               WDS_LOGD("Start WPS(join) corresponding to OEM event [%d]", event->event_id);
+                               wfd_session_join(session);
+                       } else {
+                               WDS_LOGD("Start connection corresponding to OEM event [%d]", event->event_id);
+                               wfd_session_connect(session);
+                       }
+               }
+       }
+       break;
+       case WFD_OEM_EVENT_PROV_DISC_RESP:
+               if (!session) {
+                       WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]", MAC2STR(event->dev_addr));
+                       break;
+               }
+
+               if (session->state > SESSION_STATE_STARTED) {
+                       WDS_LOGE("Unexpected event. Session is already started");
+                       break;
+               }
+               session->state = SESSION_STATE_STARTED;
+
+               if (session->peer->dev_role == WFD_DEV_ROLE_GO) {
+                       WDS_LOGD("Start joining corresponding to OEM event [%d]", event->event_id);
+                       wfd_session_join(session);
+               } else if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+                       WDS_LOGD("Start WPS corresponding to OEM event [%d]", event->event_id);
+                       wfd_session_wps(session);
+               } else {
+                       WDS_LOGD("Start connection corresponding to OEM event [%d]", event->event_id);
+                       wfd_session_connect(session);
+               }
+               break;
+       case WFD_OEM_EVENT_GO_NEG_REQ:
+               if (!session) {         // TODO: check whether connection is started by negotiation not by prov_disc
+                       WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]", MAC2STR(event->dev_addr));
+                       break;
+               } else {
+                       /* Sometimes, Provision Discovery response is not received.
+                        * At this time, connection should be triggered by GO Negotiation request event */
+                       if (session->direction == SESSION_DIRECTION_OUTGOING)
+                               wfd_session_connect(session);
+               }
+               
+               break;
+       case WFD_OEM_EVENT_GO_NEG_DONE:
+               if (!session) {
+                       WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]", MAC2STR(event->dev_addr));
+                       break;
+               } else {
+                       session->state = SESSION_STATE_WPS;
+               }
+               
+               break;
+       case WFD_OEM_EVENT_WPS_DONE:
+               if (!session) {
+                       WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]", MAC2STR(event->dev_addr));
+                       break;
+               } else {
+                       session->state = SESSION_STATE_KEY_NEG;
+               }
+               
+               break;
+       case WFD_OEM_EVENT_CONNECTED:
+       {
+               if (!session) {
+                       WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]", MAC2STR(event->dev_addr));
+                       break;
+               } else {
+                       wfd_group_s *group = manager->group;
+                       if (!group) {
+                               group = wfd_create_pending_group(manager, event->intf_addr);
+                               if (!group) {
+                                       WDS_LOGE("Failed to create pending group");
+                                       break;
+                               }
+                               manager->group = group;
+                       } else {        // multiconnection, additional client connected
+                               WDS_LOGE("Unexpected event. Group already exist");
+                               //wfd_group_add_member(manager, event->intf_addr, peer->dev_addr);
+                               break;
+                       }
+                       session->state = SESSION_STATE_COMPLETED;
+               }
+       }
+       break;
+       case WFD_OEM_EVENT_STA_CONNECTED:
+               if (!session) {
+                       WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSTR "]", MAC2STR(event->dev_addr));
+                       break;
+               } else {
+                       session->state = SESSION_STATE_COMPLETED;
+               }
+               
+               break;
+       default:
+               break;
+       }
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
index a89e361..407d576 100644 (file)
  *
  */
 
-#include <glib.h>\r
-#include <errno.h>\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <stdbool.h>\r
-#include <unistd.h>\r
-\r
-#include "vconf-keys.h"\r
-\r
-#include "wifi-direct-service.h"\r
-#include "wifi-direct-utils.h"\r
-\r
-#include <app_service.h>\r
-\r
-int wfd_server_check_valid(wifi_direct_cmd_e cmd)\r
-{\r
-       int state;\r
-       int valid = false;\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       state = wfd_server->state;\r
-       switch (cmd)\r
-       {\r
-       case WIFI_DIRECT_CMD_ACTIVATE:\r
-               {\r
-                       if (state == WIFI_DIRECT_STATE_DEACTIVATED)\r
-                               valid = true;\r
-                       else\r
-                               valid = false;\r
-               }\r
-               break;\r
-       case WIFI_DIRECT_CMD_DEACTIVATE:\r
-               {\r
-                       if (state == WIFI_DIRECT_STATE_DEACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DEACTIVATING ||\r
-                               state == WIFI_DIRECT_STATE_ACTIVATING)\r
-                               valid = false;\r
-                       else\r
-                               valid = true;\r
-               }\r
-               break;\r
-       case WIFI_DIRECT_CMD_START_DISCOVERY:\r
-       case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:\r
-               {\r
-                       if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DISCOVERING ||\r
-                               state == WIFI_DIRECT_STATE_CONNECTED ||\r
-                               state == WIFI_DIRECT_STATE_GROUP_OWNER)\r
-                               valid = true;\r
-                       else\r
-                               valid = false;\r
-               }\r
-               break;\r
-       case WIFI_DIRECT_CMD_CONNECT:\r
-               {\r
-                       if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DISCOVERING ||\r
-                               state == WIFI_DIRECT_STATE_GROUP_OWNER)\r
-                               valid = true;\r
-                       else\r
-                               valid = false;\r
-               }\r
-               break;\r
-       case WIFI_DIRECT_CMD_CREATE_GROUP:\r
-               {\r
-                       if (state == WIFI_DIRECT_STATE_ACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DISCOVERING)\r
-                               valid = true;\r
-                       else\r
-                               valid = false;\r
-               }\r
-               break;\r
-       case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:\r
-       case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:\r
-       case WIFI_DIRECT_CMD_GET_GO_INTENT:\r
-       case WIFI_DIRECT_CMD_SET_GO_INTENT:\r
-       case WIFI_DIRECT_CMD_IS_DISCOVERABLE:\r
-       case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:\r
-       case WIFI_DIRECT_CMD_GET_OWN_GROUP_CHANNEL:\r
-       case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:\r
-       case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:\r
-               {\r
-                       if (state == WIFI_DIRECT_STATE_DEACTIVATED ||\r
-                               state == WIFI_DIRECT_STATE_DEACTIVATING ||\r
-                               state == WIFI_DIRECT_STATE_ACTIVATING)\r
-                               valid = false;\r
-                       else\r
-                               valid = true;\r
-               }\r
-               break;\r
-\r
-       case WIFI_DIRECT_CMD_CANCEL_GROUP:\r
-               {\r
-                       if (state == WIFI_DIRECT_STATE_GROUP_OWNER)\r
-                               valid = true;\r
-                       else if ((state == WIFI_DIRECT_STATE_CONNECTING) && (wfd_server->autonomous_group_owner == true))\r
-                               valid = true;\r
-                       else\r
-                               valid = false;\r
-               }\r
-               break;\r
-\r
-       case WIFI_DIRECT_CMD_DISCONNECT:\r
-               {\r
-                       if (state == WIFI_DIRECT_STATE_GROUP_OWNER ||\r
-                               state == WIFI_DIRECT_STATE_CONNECTED ||\r
-                               state == WIFI_DIRECT_STATE_CONNECTING)\r
-                               valid = true;\r
-                       else\r
-                               valid = false;\r
-               }\r
-               break;\r
-\r
-       case WIFI_DIRECT_CMD_GET_SSID:\r
-               {\r
-                       if (state < WIFI_DIRECT_STATE_CONNECTED)\r
-                               valid = false;\r
-                       else\r
-                               valid = true;\r
-               }\r
-               break;\r
-\r
-       default:\r
-               valid = true;\r
-               break;\r
-       }\r
-\r
-       __WDS_LOG_FUNC_EXIT__;\r
-\r
-       return valid;\r
-}\r
-\r
-#if 0\r
-void start_wifi_direct_service()\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       //system("launch_app org.tizen.fileshare-service");\r
-       service_h service;\r
-       service_create(&service);\r
-       service_set_operation(service, SERVICE_OPERATION_DEFAULT);\r
-       service_set_package(service, "org.tizen.fileshare-service");\r
-       service_send_launch_request(service, NULL, NULL);\r
-       service_destroy(service);\r
-\r
-       __WDS_LOG_FUNC_EXIT__;\r
-       \r
-}\r
-#endif\r
-\r
-void stop_wifi_direct_service()\r
-{\r
-       // 2012-01-04: Dongwook. Let ftm-serviced quit by itself for gracefull termination.\r
-       // system("killall ftm-serviced");\r
-}\r
-\r
-void start_wifi_direct_ui_appl()\r
-{\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       //system("launch_app org.tizen.wifi-direct-popup");\r
-       service_h service;\r
-       service_create(&service);\r
-       service_set_operation(service, SERVICE_OPERATION_DEFAULT);\r
-       service_set_package(service, "org.tizen.wifi-direct-popup");\r
-       service_send_launch_request(service, NULL, NULL);\r
-       service_destroy(service);\r
-\r
-       __WDS_LOG_FUNC_EXIT__;\r
-\r
-}\r
-\r
-\r
-void stop_wifi_direct_ui_appl()\r
-{\r
-       // 2012-02-24: Dongwook. Let wifi-direct-popup quit by itself for gracefull termination.\r
-       // system("killall wifi-direct-popup");\r
-}\r
-\r
-\r
-\r
-void wfd_server_set_state(int state)\r
-{\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-\r
-       __WDS_LOG_FUNC_ENTER__;\r
-\r
-       if (state < WIFI_DIRECT_STATE_DEACTIVATED\r
-               || state > WIFI_DIRECT_STATE_GROUP_OWNER)\r
-       {\r
-               WDS_LOGF( "Error : Invalid State\n");\r
-               return;\r
-       }\r
-\r
-       WDS_LOGF( "State Change: [%d,%s] ---->[%d,%s]\n",\r
-                                  wfd_server->state, wfd_print_state(wfd_server->state),\r
-                                  state, wfd_print_state(state));\r
-\r
-       if (wfd_server->state != WIFI_DIRECT_STATE_CONNECTING &&\r
-               state == WIFI_DIRECT_STATE_CONNECTING)\r
-       {\r
-\r
-               // stop timer for discover\r
-               wfd_timer_discovery_cancel();\r
-\r
-               // start timer for connection\r
-               wfd_timer_connection_start();\r
-       }\r
-#if 0\r
-       if (wfd_server->state < WIFI_DIRECT_STATE_CONNECTED &&\r
-               state >= WIFI_DIRECT_STATE_CONNECTED)\r
-       {\r
-               start_wifi_direct_service();\r
-       }\r
-#endif\r
-       if (wfd_server->state == WIFI_DIRECT_STATE_CONNECTING &&\r
-               state != WIFI_DIRECT_STATE_CONNECTING)\r
-       {\r
-               // stop timer for connection\r
-               wfd_timer_connection_cancel();\r
-       }\r
-\r
-       if (wfd_server->state >= WIFI_DIRECT_STATE_CONNECTED &&\r
-               state < WIFI_DIRECT_STATE_CONNECTED)\r
-       {\r
-               stop_wifi_direct_service();\r
-       }\r
-\r
-       if (wfd_server->state != WIFI_DIRECT_STATE_DEACTIVATED &&\r
-               state == WIFI_DIRECT_STATE_DEACTIVATED)\r
-       {\r
-               wfd_termination_timer_start();\r
-               wfd_timer_discovery_cancel();\r
-       }\r
-       else\r
-       {\r
-               wfd_termination_timer_cancel();\r
-       }\r
-\r
-       if (wfd_server->state < WIFI_DIRECT_STATE_ACTIVATED &&\r
-               state == WIFI_DIRECT_STATE_ACTIVATED)\r
-       {\r
-               start_wifi_direct_ui_appl();\r
-       }\r
-\r
-       // Reset autonomous group owner flag\r
-       if (wfd_server->state == WIFI_DIRECT_STATE_GROUP_OWNER &&\r
-               state != WIFI_DIRECT_STATE_GROUP_OWNER)\r
-       {\r
-               if (wfd_server->autonomous_group_owner == true)\r
-               {\r
-                       WDS_LOGD( "[Reset autonomous group owner flag]\n");\r
-                       wfd_server->autonomous_group_owner = false;\r
-               }\r
-       }\r
-\r
-\r
-       wfd_server->state = state;\r
-\r
-#if 0\r
-       // Check discovery state...\r
-       if (state == WIFI_DIRECT_STATE_ACTIVATED\r
-               && wfd_oem_is_discovery_enabled() == true)\r
-       {\r
-               WDS_LOGD( "state is changed to [WIFI_DIRECT_STATE_DISCOVERING]\n");\r
-               wfd_server->state = WIFI_DIRECT_STATE_DISCOVERING;\r
-       }\r
-#endif\r
-\r
-       switch (wfd_server->state)\r
-       {\r
-               //if (wfd_check_wifi_direct_state() < 0)\r
-               //WDS_LOGF( "wfd_check_wifi_direct_state() failed\n");\r
-\r
-       case WIFI_DIRECT_STATE_DEACTIVATED:\r
-               {\r
-                       if (wfd_set_wifi_direct_state(VCONFKEY_WIFI_DIRECT_DEACTIVATED) < 0)\r
-                               WDS_LOGF( "wfd_set_wifi_direct_state() failed\n");\r
-                       else\r
-                               stop_wifi_direct_ui_appl();\r
-               }\r
-               break;\r
-\r
-       case WIFI_DIRECT_STATE_ACTIVATED:\r
-               {\r
-                       if (wfd_set_wifi_direct_state(VCONFKEY_WIFI_DIRECT_ACTIVATED) < 0)\r
-                               WDS_LOGF( "wfd_set_wifi_direct_state() failed\n");\r
-               }\r
-               break;\r
-\r
-       case WIFI_DIRECT_STATE_DISCOVERING:\r
-               {\r
-                       if (wfd_set_wifi_direct_state(VCONFKEY_WIFI_DIRECT_DISCOVERING) < 0)\r
-                               WDS_LOGF( "wfd_set_wifi_direct_state() failed\n");\r
-               }\r
-               break;\r
-\r
-       case WIFI_DIRECT_STATE_CONNECTED:\r
-               {\r
-                       if (wfd_set_wifi_direct_state(VCONFKEY_WIFI_DIRECT_CONNECTED) < 0)\r
-                               WDS_LOGF( "wfd_set_wifi_direct_state() failed\n");\r
-               }\r
-               break;\r
-\r
-       case WIFI_DIRECT_STATE_GROUP_OWNER:\r
-               {\r
-                       if (wfd_set_wifi_direct_state(VCONFKEY_WIFI_DIRECT_GROUP_OWNER) < 0)\r
-                               WDS_LOGF( "wfd_set_wifi_direct_state() failed\n");\r
-               }
-               break;
+/**
+ * This file implements wifi direct state functions.
+ *
+ * @file               wifi-direct-state.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+
+#include <glib.h>
+
+#include <wifi-direct.h>
+#include <wifi-direct-internal.h>
+
+#include "wifi-direct-manager.h"
+#include "wifi-direct-state.h"
+#include "wifi-direct-util.h"
+
+
+static char *_wfd_state_string(int state)
+{
+       switch (state) {
+               case WIFI_DIRECT_STATE_DEACTIVATED:
+                       return "DEACTIVATED";
+               case WIFI_DIRECT_STATE_DEACTIVATING:
+                       return "DEACTIVATING";
+               case WIFI_DIRECT_STATE_ACTIVATING:
+                       return "ACTIVATING";
+               case WIFI_DIRECT_STATE_ACTIVATED:
+                       return "ACTIVATED";
+               case WIFI_DIRECT_STATE_DISCOVERING:
+                       return "DISCOVERING";
+               case WIFI_DIRECT_STATE_CONNECTING:
+                       return "CONNECTING";
+               case WIFI_DIRECT_STATE_DISCONNECTING:
+                       return "DISCONNECTING";
+               case WIFI_DIRECT_STATE_CONNECTED:
+                       return "CONNECTED";
+               case WIFI_DIRECT_STATE_GROUP_OWNER:
+                       return "GROUP_OWNER";
+               default:
+                       return "Unknown State";
+       }
+       
+}
+int wfd_state_set(wfd_manager_s *manager, int state)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!manager || state < WIFI_DIRECT_STATE_DEACTIVATED || state > WIFI_DIRECT_STATE_GROUP_OWNER) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       WDS_LOGD("wifi-direct-manager state set [%s] -> [%s]",
+                               _wfd_state_string(manager->state), _wfd_state_string(state));
+       manager->state = state;
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_state_get(wfd_manager_s *manager, int *state)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!manager || !state) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       *state = manager->state;
+       WDS_LOGD("wifi-direct-manager state is %d", *state);
 
-       // for Net-Config can check the status of wifi-direct 
-       case WIFI_DIRECT_STATE_ACTIVATING:
-               {
-                       if (wfd_set_wifi_direct_state(VCONFKEY_WIFI_DIRECT_ACTIVATED) < 0)
-                               WDS_LOGF( "wfd_set_wifi_direct_state() failed\n");\r
-               }\r
-               break;\r
-\r
-       default:\r
-               break;\r
-       }\r
-\r
-       __WDS_LOG_FUNC_EXIT__;\r
-\r
-       return;\r
-}\r
-\r
-int wfd_server_get_state()\r
-{\r
-       wfd_server_control_t *wfd_server = wfd_server_get_control();\r
-       return wfd_server->state;\r
-}\r
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
diff --git a/src/wifi-direct-stub.c b/src/wifi-direct-stub.c
deleted file mode 100644 (file)
index 07f6ce9..0000000
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <glib.h>
-#include <sys/poll.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-#include <unistd.h>
-#include <sys/poll.h>
-
-#include "wifi-direct-client-handler.h"
-#include "wifi-direct-service.h"
-#include "wifi-direct-internal.h"
-#include "wifi-direct-stub.h"
-
-bool wfd_server_client_request_callback(GIOChannel* source, GIOCondition condition, gpointer data);
-
-
-int wfd_server_is_fd_writable(int fd)
-{
-       struct pollfd pevent;
-       int retval = 0;
-
-       pevent.fd = fd;
-       pevent.events = POLLERR | POLLHUP | POLLNVAL | POLLOUT;
-       retval = poll((struct pollfd *) &pevent, 1, 1);
-
-       if (retval < 0)
-       {
-               WDS_LOGD( "fd [%d]: poll error ret=[%d] !!\n", fd, retval);
-               return -1;
-       }
-       else if (retval == 0)
-       {
-               // fd might be busy.
-               WDS_LOGD( "poll timeout. fd is busy\n");
-               return 0;
-       }
-
-       if (pevent.revents & POLLERR)
-       {
-               WDS_LOGD( "fd [%d]: POLLERR !!\n", fd);
-               return -1;
-       }
-       else if (pevent.revents & POLLHUP)
-       {
-               WDS_LOGD( "fd [%d]: POLLHUP !!\n", fd);
-               return -1;
-       }
-       else if (pevent.revents & POLLNVAL)
-       {
-               WDS_LOGD( "fd [%d]: POLLNVAL !!\n", fd);
-               return -1;
-       }
-       else if (pevent.revents & POLLOUT)
-       {
-               // fd is writable..
-               // WDS_LOGD( "fd [%d]: POLLOUT !!\n", fd);
-               return 1;
-       }
-
-       return -1;
-}
-
-
-int wfd_server_read_socket_event(int sockfd, char *dataptr, int datalen)
-{
-       int pollret = 0;
-       struct pollfd pollfd;
-       int timeout = 1000;                     /* For 1 sec */
-       int retval = 0;
-       int total_data_recd = 0;
-
-       __WDS_LOG_FUNC_ENTER__;
-
-       if (sockfd < 0)
-       {
-               WDS_LOGE( "Error!!! Invalid socket FD [%d]\n", sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       pollfd.fd = sockfd;
-       pollfd.events = POLLIN | POLLERR | POLLHUP;
-       pollret = poll(&pollfd, 1, timeout);
-
-       WDS_LOGD( "POLL ret = %d\n", pollret);
-
-       if (pollret > 0)
-       {
-               if (pollfd.revents == POLLIN)
-               {
-                       WDS_LOGD( "POLLIN \n");
-
-                       while (datalen)
-                       {
-                               errno = 0;
-                               retval = read(sockfd, (char*)dataptr, datalen);
-                               WDS_LOGD( "sockfd %d retval %d\n",sockfd,retval);
-                               if (retval <= 0)
-                               {
-                                       WDS_LOGE( "Error!!! reading data, error [%s]\n", strerror(errno));
-                                       __WDS_LOG_FUNC_EXIT__;
-                                       return retval;
-                               }
-                               total_data_recd += retval;
-                               dataptr += retval;
-                               datalen -= retval;
-                       }
-                       __WDS_LOG_FUNC_EXIT__;
-                       return total_data_recd;
-               }
-               else if (pollfd.revents & POLLHUP)
-               {
-                       WDS_LOGE( "Error!!! POLLHUP: connection disconnected fd=[%d]\n", sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-               else if (pollfd.revents & POLLERR)
-               {
-                       WDS_LOGE( "Error!!! POLLERR: error happens at the socket. fd=[%d]\n", sockfd);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-       }
-       else if (pollret == 0)
-       {
-               WDS_LOGD( "POLLing timeout fd=[%d]\n", sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-       else
-       {
-               WDS_LOGE( "Error!!! Polling unknown error fd=[%d]\n", sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-void wfd_server_reset_client(int sync_sockfd)
-{
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-       int index = 0;
-
-       __WDS_LOG_FUNC_ENTER__;
-
-       for (index = 0; index < WFD_MAX_CLIENTS; index++)
-       {
-               if ((wfd_server->client[index].isUsed == TRUE) &&
-                       (wfd_server->client[index].sync_sockfd == sync_sockfd))
-               {
-                       WDS_LOGI(
-                                       "Reset client[%d]: ClientID=%d, socketfd=(%d,%d), handle=[%d] total active clients = [%d]\n",
-                                       index,
-                                       wfd_server->client[index].client_id,
-                                       wfd_server->client[index].sync_sockfd,
-                                       wfd_server->client[index].async_sockfd,
-                                       wfd_server->client[index].dev_handle,
-                                       wfd_server->active_clients-1);
-
-                       g_source_remove(wfd_server->client[index].g_source_id);
-
-                       // Protect standard input / output / error
-                       if (wfd_server->client[index].async_sockfd > 2)
-                               close(wfd_server->client[index].async_sockfd);
-
-                       if (wfd_server->client[index].sync_sockfd > 2)
-                               close(wfd_server->client[index].sync_sockfd);
-
-                       /* Reset Entity */
-                       wfd_server->client[index].isUsed = FALSE;
-                       wfd_server->client[index].client_id = -1;
-                       wfd_server->client[index].sync_sockfd = -1;
-                       wfd_server->client[index].async_sockfd = -1;
-                       wfd_server->client[index].g_source_id = -1;
-                       wfd_server->client[index].dev_handle = -1;
-
-                       wfd_server->active_clients--;
-                       break;
-               }
-       }
-
-       if (wfd_server->active_clients == 0)
-               wfd_termination_timer_start();
-
-       if (index == WFD_MAX_CLIENTS)
-       {
-               WDS_LOGE("Error!!! Reset client fail: socketfd=%d is not found\n", sync_sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-       return;
-}
-
-void wfd_server_print_client()
-{
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-       int index = 0;
-
-       WDS_LOGI( "--------------------\n");
-       for (index = 0; index < WFD_MAX_CLIENTS; index++)
-       {
-               if (wfd_server->client[index].isUsed == TRUE)
-               {
-                       WDS_LOGI(
-                                       "+ CLIENT[%d]: ClientID=%d, sktfd=(%d,%d), g_src_id= [%d]\n",
-                                       index,
-                                       wfd_server->client[index].client_id,
-                                       wfd_server->client[index].sync_sockfd,
-                                       wfd_server->client[index].async_sockfd,
-                                       wfd_server->client[index].g_source_id
-                                       );
-               }
-       }
-       WDS_LOGI( "Total active client=[%d]\n", wfd_server->active_clients);
-       WDS_LOGI( "--------------------\n");
-
-       __WDS_LOG_FUNC_EXIT__;
-       return;
-}
-
-
-
-bool wfd_server_client_request_callback(GIOChannel* source, GIOCondition condition, gpointer data)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int sockfd = (int) data;
-       wifi_direct_client_request_s client_req;
-       int req_len = sizeof(wifi_direct_client_request_s);
-
-       memset(&client_req, 0x00, req_len);
-
-       if (wfd_server_read_socket_event(sockfd, (char *) &client_req, req_len) < 0)
-       {
-               wfd_server_reset_client(sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       wfd_server_process_client_request(&client_req);
-
-       __WDS_LOG_FUNC_EXIT__;
-       return TRUE;
-}
-
-
-/* Function to connect client with wfd_server */
-bool wfd_server_register_client(int sockfd)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int index = 0;
-       int status = 0;
-       wifi_direct_client_request_s register_req;
-       wifi_direct_client_response_s register_rsp;
-       wfd_server_control_t *wfd_server = wfd_server_get_control();
-
-       if (sockfd <= 0)
-       {
-               WDS_LOGE( "Error!!! Invalid sockfd argument = [%d] \n", sockfd);
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       /** Read the Register socket type*/
-       errno = 0;
-       status = read(sockfd, (char*)&register_req, sizeof(wifi_direct_client_request_s));
-       if(status <= 0)
-       {
-               WDS_LOGE( "Error!!! reading data, error [%s]\n", strerror(errno));
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       if (register_req.cmd == WIFI_DIRECT_CMD_REGISTER)
-       {
-               WDS_LOGD( "Client socket for sync data transfer, from client [%d] \n", register_req.client_id);
-
-               for (index = 0; index < WFD_MAX_CLIENTS; index++)
-               {
-                       if (wfd_server->client[index].isUsed == FALSE)
-                       {
-                               /*Send Client id to the application */
-                               int datasent = 0;
-
-                               memset(&register_rsp, 0, sizeof(wifi_direct_client_response_s));
-                               register_rsp.cmd = WIFI_DIRECT_CMD_REGISTER;
-                               register_rsp.client_id = sockfd;
-                               register_rsp.result = WIFI_DIRECT_ERROR_NONE;
-                               errno = 0;
-                               datasent = write(sockfd, (char*)&register_rsp, sizeof(wifi_direct_client_response_s));
-
-                               WDS_LOGD(
-                                               "Written RSP of [%d] data into client socket [%d], errinfo [%s] \n",
-                                               datasent, sockfd, strerror(errno));
-
-                               /** register socket watcher to g_main_loop */
-                               GIOChannel* gio;
-                               gio = g_io_channel_unix_new(sockfd);
-                               int source_id = g_io_add_watch(gio, G_IO_IN | G_IO_ERR | G_IO_HUP,
-                                               (GIOFunc)wfd_server_client_request_callback, (gpointer)sockfd);
-
-                               /** Found Free Entity */
-                               wfd_server->client[index].isUsed = TRUE;
-                               wfd_server->client[index].client_id = sockfd;
-                               wfd_server->client[index].sync_sockfd = sockfd;
-                               wfd_server->client[index].g_source_id = source_id;
-
-                               wfd_server->active_clients++;
-
-                               WDS_LOGD( "Client stored in index [%d], total active clients = [%d]\n", index, wfd_server->active_clients);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return TRUE;
-                       }
-               }
-
-               if (index == WFD_MAX_CLIENTS)
-               {
-                       int datasent = 0;
-                       memset(&register_rsp, 0, sizeof(wifi_direct_client_response_s));
-                       register_rsp.cmd = WIFI_DIRECT_CMD_REGISTER;
-                       register_rsp.client_id = sockfd;
-                       register_rsp.result = WIFI_DIRECT_ERROR_RESOURCE_BUSY;
-                       errno = 0;
-                       datasent = write(sockfd, (char*)&register_rsp, sizeof(wifi_direct_client_response_s));
-
-                       WDS_LOGE( "Error!!! Too Many Client\n");
-                       __WDS_LOG_FUNC_EXIT__;
-                       return FALSE;
-               }
-       }
-       else if (register_req.cmd == WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET)
-       {
-               WDS_LOGD( "Client socket for Async Event notification from client [%d]\n", register_req.client_id);
-
-               for (index = 0; index < WFD_MAX_CLIENTS; index++)
-               {
-                       if ((wfd_server->client[index].isUsed == TRUE)
-                               && (wfd_server->client[index].client_id ==
-                                       register_req.client_id))
-                       {
-                               wfd_server->client[index].async_sockfd = sockfd;
-
-                               WDS_LOGD( "Client stored in index [%d], total active clients = [%d]\n", index, wfd_server->active_clients);
-
-                               wfd_server_print_client();
-
-                               __WDS_LOG_FUNC_EXIT__;
-                               return TRUE;
-                       }
-               }
-
-               if (index == WFD_MAX_CLIENTS)
-               {
-                       WDS_LOGE( "Error!!! Client not found \n");
-                       __WDS_LOG_FUNC_EXIT__;
-                       return FALSE;
-               }
-       }
-       else
-       {
-               WDS_LOGE( "Error!!! Received unknown command [%d] \n", register_req.cmd);
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       WDS_LOGE( "Error!!! Unknown...\n");
-       __WDS_LOG_FUNC_EXIT__;
-       return FALSE;
-}
diff --git a/src/wifi-direct-util.c b/src/wifi-direct-util.c
new file mode 100644 (file)
index 0000000..da61e5c
--- /dev/null
@@ -0,0 +1,611 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct utility functions.
+ *
+ * @file               wifi-direct-util.c
+ * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
+ * @version    0.7
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include <vconf.h>
+#include <app_service.h>
+#include <wifi-direct.h>
+#include <wifi-direct-internal.h>
+
+#include "wifi-direct-manager.h"
+#include "wifi-direct-state.h"
+#include "wifi-direct-event.h"
+#include "wifi-direct-util.h"
+
+static int _txt_to_mac(char *txt, unsigned char *mac)
+{
+       int i = 0;
+
+       for (;;) {
+               mac[i++] = (char) strtoul(txt, &txt, 16);
+               if (!*txt++ || i == 6)
+                       break;
+       }
+
+       if (i != MACADDR_LEN)
+               return -1;
+
+       WDS_LOGD("Converted MAC address [" MACSTR "]", MAC2STR(mac));
+       return 0;
+}
+
+static int _txt_to_ip(char *txt, unsigned char *ip)
+{
+       int i = 0;
+
+       for (;;) {
+               ip[i++] = (char) strtoul(txt, &txt, 10);
+               if (!*txt++ || i == 4)
+                       break;
+       }
+
+       if (i != 4)
+               return -1;
+
+       WDS_LOGD("Converted IP address [" IPSTR "]", IP2STR(ip));
+       return 0;
+}
+
+int wfd_util_freq_to_channel(int freq)
+{
+       if (freq < 2412 || freq > 5825) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       if (freq >= 5180)
+               return 36 + (freq - 5180)/5;
+       else if (freq <= 2472)
+               return 1 + (freq - 2412)/5;
+       else if (freq == 2484)
+               return 14;
+       else
+               return -1;
+}
+
+int wfd_util_get_phone_name(char *phone_name)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       char *name = NULL;
+
+       name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
+       if (!name) {
+               WDS_LOGE( "Failed to get vconf value for %s", VCONFKEY_SETAPPL_DEVICE_NAME_STR);
+               return -1;
+       }
+       strncpy(phone_name, name, DEV_NAME_LEN);
+       phone_name[DEV_NAME_LEN] = '\0';
+
+       WDS_LOGD( "[%s: %s]", VCONFKEY_SETAPPL_DEVICE_NAME_STR, phone_name);
+       free(name);
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+void _wfd_util_dev_name_changed_cb(keynode_t *key, void* data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       char dev_name[DEV_NAME_LEN] = {0, };
+       int res = 0;
+
+       res = wfd_util_get_phone_name(dev_name);
+       if (res < 0) {
+               WDS_LOGE("Failed to get phone name(vconf)");
+               return;
+       }
+       WDS_LOGD("Device name changed as [%s]", dev_name);
+
+       res = wfd_local_set_dev_name(dev_name);
+       if (res < 0)
+               WDS_LOGE("Failed to set device name");
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
+
+void wfd_util_set_dev_name_notification()
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       vconf_notify_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR, _wfd_util_dev_name_changed_cb, NULL);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
+
+void wfd_util_unset_dev_name_notification()
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR, _wfd_util_dev_name_changed_cb);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
+
+int wfd_util_check_wifi_state()
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int wifi_state = 0;
+       int res = 0;
+
+       /* vconf key and value (vconf-keys.h)
+#define VCONFKEY_WIFI_STATE "memory/wifi/state"
+enum {
+        VCONFKEY_WIFI_OFF = 0x00,
+        VCONFKEY_WIFI_UNCONNECTED,
+        VCONFKEY_WIFI_CONNECTED,
+        VCONFKEY_WIFI_TRANSFER,
+        VCONFKEY_WIFI_STATE_MAX
+};
+        */
+
+       res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
+       if (res < 0) {
+               WDS_LOGE("Failed to get vconf value [%s]", VCONFKEY_WIFI_STATE);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDS_LOGD("[%s: %d]", VCONFKEY_WIFI_STATE, wifi_state);
+
+       if (wifi_state > VCONFKEY_WIFI_OFF) {
+               WDS_LOGD("Wi-Fi is on");
+               __WDS_LOG_FUNC_EXIT__;
+               return 1;
+       }
+       WDS_LOGD( "OK. Wi-Fi is off\n");
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_check_mobile_ap_state()
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int mobile_ap_state = 0;
+       int res = 0;
+
+       res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &mobile_ap_state);
+       if (res < 0) {
+               WDS_LOGE("Failed to get vconf value[%s]", VCONFKEY_MOBILE_HOTSPOT_MODE);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDS_LOGD("[%s: %d]", VCONFKEY_MOBILE_HOTSPOT_MODE, mobile_ap_state);
+
+       if (mobile_ap_state != VCONFKEY_MOBILE_HOTSPOT_MODE_NONE) {
+               WDS_LOGD("Mobile AP is on");
+               __WDS_LOG_FUNC_EXIT__;
+               return 1;
+       }
+       WDS_LOGD( "OK. Mobile AP is off\n");
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_wifi_direct_activatable()
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = 0;
+
+       res = wfd_util_check_wifi_state();
+       if (res < 0) {
+               WDS_LOGE("Failed to check Wi-Fi state");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       } else if (res > 0) {
+               WDS_LOGE("Wi-Fi is On");
+               return WIFI_DIRECT_ERROR_WIFI_USED;
+       } else {
+               WDS_LOGE("Wi-Fi is Off");
+               return WIFI_DIRECT_ERROR_NONE;
+       }
+
+       res = wfd_util_check_mobile_ap_state();
+       if (res < 0) {
+               WDS_LOGE("Failed to check Mobile AP state");
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       } else if (res > 0) {
+               WDS_LOGE("Mobile AP is On");
+               return WIFI_DIRECT_ERROR_MOBILE_AP_USED;
+       } else {
+               WDS_LOGE("Mobile AP is Off");
+               return WIFI_DIRECT_ERROR_NONE;
+       }
+}
+
+int wfd_util_get_wifi_direct_state()
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int state = 0;
+       int res = 0;
+
+       res = vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &state);
+       if (res < 0) {
+               WDS_LOGE("Failed to get vconf value [%s]\n", VCONFKEY_WIFI_DIRECT_STATE);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return state;
+}
+
+int wfd_util_set_wifi_direct_state(int state)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int vconf_state = 0;
+       int res = 0;
+
+       // TODO: check validity of state
+
+       if (state == WIFI_DIRECT_STATE_ACTIVATED)
+               vconf_state = VCONFKEY_WIFI_DIRECT_ACTIVATED;
+       else if (state == WIFI_DIRECT_STATE_DEACTIVATED)
+               vconf_state= VCONFKEY_WIFI_DIRECT_DEACTIVATED;
+       else if (state == WIFI_DIRECT_STATE_CONNECTED)
+               vconf_state = VCONFKEY_WIFI_DIRECT_CONNECTED;
+       else if (state == WIFI_DIRECT_STATE_GROUP_OWNER)
+               vconf_state = VCONFKEY_WIFI_DIRECT_GROUP_OWNER;
+       else if (state == WIFI_DIRECT_STATE_DISCOVERING)
+               vconf_state = VCONFKEY_WIFI_DIRECT_DISCOVERING;
+       WDS_LOGD("Vconf key set [%s: %d]", VCONFKEY_WIFI_DIRECT_STATE, vconf_state);
+
+       res = vconf_set_int(VCONFKEY_WIFI_DIRECT_STATE, vconf_state);
+       if (res < 0) {
+               WDS_LOGE("Failed to set vconf [%s]", VCONFKEY_WIFI_DIRECT_STATE);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_get_local_dev_mac(unsigned char *dev_mac)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       FILE *fd = NULL;
+       char local_mac[MACSTR_LEN] = {0, };
+       char *ptr = NULL;
+       int res = 0;
+
+       errno = 0;
+       fd = fopen(DEFAULT_MAC_FILE_PATH, "r");
+       if (!fd) {
+               WDS_LOGE("Failed to open MAC info file (%s)", strerror(errno));
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       errno = 0;
+       ptr = fgets(local_mac, MACSTR_LEN, fd);
+       if (!ptr) {
+               WDS_LOGE("Failed to read file or no data read(%s)", strerror(errno));
+               fclose(fd);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       WDS_LOGD("Local MAC address [%s]", ptr);
+
+       res = _txt_to_mac(local_mac, dev_mac);
+       if (res < 0) {
+               WDS_LOGE("Failed to convert text to MAC address");
+               fclose(fd);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       dev_mac[0] |= 0x2;
+       WDS_LOGD("Local Device MAC address [" MACSTR "]", MAC2STR(dev_mac));
+
+       fclose(fd);
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_start_wifi_direct_popup()
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       service_h service;
+       service_create(&service);
+       service_set_operation(service, SERVICE_OPERATION_DEFAULT);
+       service_set_package(service, "org.tizen.wifi-direct-popup");
+       service_send_launch_request(service, NULL, NULL);
+       service_destroy(service);
+       WDS_LOGD("Succeeded to launch wifi-direct-popup");
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+
+static void _dhcps_ip_leased_cb(keynode_t *key, void* data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *peer = (wfd_device_s*) data;
+       wifi_direct_client_noti_s noti;
+       FILE *fp = NULL;
+       char buf[MAX_DHCP_DUMP_SIZE];
+       char ip_str[IPSTR_LEN];
+       char intf_str[MACSTR_LEN];
+       unsigned char intf_addr[MACADDR_LEN];
+       int n = 0;
+
+       if (!peer) {
+               WDS_LOGD("Invalid parameter");
+               return;
+       }
+       WDS_LOGD("DHCP server: IP leased");
+       memset(&noti, 0, sizeof(wifi_direct_client_noti_s));
+
+       errno = 0;
+       fp = fopen(DHCP_DUMP_FILE, "r");
+       if (NULL == fp) {
+               WDS_LOGE("Could not read the file(%s). [%s]", DHCP_DUMP_FILE, strerror(errno));
+               return;
+       }
+
+       while(fgets(buf, MAX_DHCP_DUMP_SIZE, fp) != NULL) {
+               WDS_LOGD("Read line [%s]", buf);
+               n = sscanf(buf,"%s %s", intf_str, ip_str);
+               WDS_LOGD("ip=[%s], mac=[%s]",ip_str, intf_str);
+               if (n != 2) {
+                       continue;
+               }
+               _txt_to_mac(intf_str, intf_addr);
+               if (!memcmp(peer->intf_addr, intf_addr, MACADDR_LEN)) {
+                       WDS_LOGD("Peer intf mac found");
+                       _txt_to_ip(ip_str, peer->ip_addr);
+                       noti.event = WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND;
+                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+                       snprintf(noti.param2, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
+                       wfd_event_notify_clients(manager, &noti);
+                       break;
+               } else {
+                       WDS_LOGE("Different interface address peer[" MACSTR "] vs dhcp[" MACSTR "]", MAC2STR(peer->intf_addr), MAC2STR(intf_addr));
+               }
+       }
+       fclose(fp);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
+
+static gboolean _polling_ip(gpointer user_data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *local = (wfd_device_s*) manager->local;
+       wfd_device_s *peer = (wfd_device_s*) user_data;
+       char *ifname = NULL;
+       static int count = 0;
+       int res = 0;
+
+       if (count > 28) {
+               WDS_LOGE("Failed to get IP");
+               count = 0;
+               __WDS_LOG_FUNC_EXIT__;
+               return FALSE;
+       }
+       res = wfd_manager_get_goup_ifname(&ifname);
+       if (res < 0 || !ifname) {
+               WDS_LOGE("Failed to get group interface name");
+               return FALSE;
+       }
+
+       res = wfd_util_dhcpc_get_ip(ifname, local->ip_addr, 0);
+       if (res < 0) {
+               WDS_LOGE("Failed to get local IP for interface %s(count=%d)", ifname, count++);
+               __WDS_LOG_FUNC_EXIT__;
+               return TRUE;
+       }
+       WDS_LOGD("Succeeded to get local(client) IP [" IPSTR "] for iface[%s]",
+                                   IP2STR(local->ip_addr), ifname);
+
+       res = wfd_util_dhcpc_get_server_ip(peer->ip_addr);
+       if (res < 0) {
+               WDS_LOGE("Failed to get peer(server) IP(count=%d)", count++);
+               __WDS_LOG_FUNC_EXIT__;
+               return TRUE;
+       }
+       WDS_LOGD("Succeeded to get server IP [" IPSTR "]", IP2STR(peer->ip_addr));
+       count = 0;
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+       wifi_direct_client_noti_s noti;
+       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
+       noti.error = WIFI_DIRECT_ERROR_NONE;
+       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+       wfd_event_notify_clients(manager, &noti);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return FALSE;
+}
+
+int wfd_util_dhcps_start()
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = 0;
+
+       vconf_set_int(VCONFKEY_DHCPS_IP_LEASE, 0);
+       res = system("/usr/bin/wifi-direct-dhcp.sh server");
+       WDS_LOGD("[/usr/bin/wifi-direct-dhcp.sh server] returns %d", res);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_dhcps_wait_ip_leased(wfd_device_s *peer)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (!peer) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       vconf_set_int(VCONFKEY_DHCPS_IP_LEASE, 0);
+       vconf_notify_key_changed(VCONFKEY_DHCPS_IP_LEASE, _dhcps_ip_leased_cb, peer);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_dhcps_stop()
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = 0;
+
+       vconf_ignore_key_changed(VCONFKEY_DHCPS_IP_LEASE, _dhcps_ip_leased_cb);
+       vconf_set_int(VCONFKEY_DHCPS_IP_LEASE, 0);
+
+       res = system("/usr/bin/wifi-direct-dhcp.sh stop");
+       WDS_LOGD("[/usr/bin/wifi-direct-dhcp.sh stop] returns %d", res);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_dhcpc_start(wfd_device_s *peer)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = 0;
+
+       if (!peer) {
+               WDS_LOGE("Invalid parameter");
+               return -1;
+       }
+
+       res = system("/usr/bin/wifi-direct-dhcp.sh client");
+       WDS_LOGD("[/usr/bin/wifi-direct-dhcp.sh client] returns %d", res);
+       g_timeout_add(250, (GSourceFunc) _polling_ip, peer);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_dhcpc_stop()
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = 0;
+
+       res = system("/usr/bin/wifi-direct-dhcp.sh stop");
+       WDS_LOGD("[/usr/bin/wifi-direct-dhcp.sh stop] returns %d", res);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_dhcpc_get_ip(char *ifname, unsigned char *ip_addr, int is_IPv6)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       struct ifreq ifr;
+       struct sockaddr_in *sin = NULL;
+       char *ip_str = NULL;
+       int sock = -1;
+       int res = -1;
+
+       if (!ifname || !ip_addr) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       errno = 0;
+       sock = socket(AF_INET, SOCK_DGRAM, 0);
+       if (sock < 0) {
+               WDS_LOGE("Failed to create socket. [%s]", strerror(errno));
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       ifr.ifr_addr.sa_family = AF_INET;
+       memset(ifr.ifr_name, 0x00, 16);
+       strncpy(ifr.ifr_name, ifname, IFNAMSIZ-1);
+
+       errno = 0;
+       res = ioctl(sock, SIOCGIFADDR, &ifr);
+       if (res < 0) {
+               WDS_LOGE("Failed to get IP from socket. [%s]", strerror(errno));
+               close(sock);
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       close(sock);
+
+       sin = (struct sockaddr_in*) &ifr.ifr_broadaddr;
+       ip_str = inet_ntoa(sin->sin_addr);
+       _txt_to_ip(ip_str, ip_addr);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_util_dhcpc_get_server_ip(unsigned char* ip_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       char* get_str = NULL;
+       int count = 0;
+
+       if (!ip_addr) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       while(count < 10) {
+               get_str = vconf_get_str(VCONFKEY_DHCPC_SERVER_IP);
+               if (!get_str) {
+                       WDS_LOGE("Failed to get vconf value[%s]", VCONFKEY_DHCPC_SERVER_IP);
+                       __WDS_LOG_FUNC_EXIT__;
+                       return -1;
+               }
+               WDS_LOGD("VCONFKEY_DHCPC_SERVER_IP(%s) : %s\n", VCONFKEY_DHCPC_SERVER_IP, get_str);
+               _txt_to_ip(get_str, ip_addr);
+               if (*ip_addr)
+                       break;
+               count++;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
diff --git a/src/wifi-direct-utils.c b/src/wifi-direct-utils.c
deleted file mode 100644 (file)
index 8acbab3..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-#include <errno.h>
-#include <sys/time.h>
-
-#define _GNU_SOURCE            
-#include <unistd.h>
-#include <sys/syscall.h>               
-
-
-#include "wifi-direct-utils.h"
-#include "wifi-direct-service.h"
-
-int wfd_gettid()
-{
-#ifdef __NR_gettid
-       return syscall(__NR_gettid);
-#else
-       WDS_LOGE("__NR_gettid is not defined, please include linux/unistd.h ");
-       return -1;
-#endif
-}
-
-char *wfd_trim_path(const char *filewithpath)
-{
-       static char *filename[100];
-       char *strptr = NULL;
-       int start = 0;
-       const char *space = "                                        ";
-       int len = strlen(filewithpath);
-
-       if (len >= 20)
-       {
-               strptr = (char *) filewithpath + (len - 20);
-               start = 0;
-       }
-       else
-       {
-               strptr = (char *) filewithpath;
-               start = 20 - len;
-       }
-       strncpy((char *) filename, space, strlen(space));
-       strncpy((char *) filename + start, strptr, 50);
-
-       return (char *) filename;
-}
-
-char *wfd_debug_print(char *file, int line, char *format, ...)
-{
-       static char buffer_internal[512];
-       char prefix_buffer[64];
-       char *prefix;
-       va_list args;
-       char buf[512];
-       int header_max = 35;
-
-       va_start(args, format);
-       vsnprintf(buf, 512, format, args);
-       va_end(args);
-
-       snprintf(prefix_buffer, 64, "[%s:%d,%d]", file, line, wfd_gettid());
-       int len = 0;
-       len = strlen(prefix_buffer);
-       if (len > header_max)
-       {
-               prefix = prefix_buffer + (len - header_max);
-       }
-       else
-       {
-               prefix = prefix_buffer;
-       }
-
-       snprintf(buffer_internal, 512, "%s%s", prefix, buf);
-
-       return buffer_internal;
-}
-
-char *wfd_print_state(wifi_direct_state_e s)
-{
-       switch (s)
-       {
-       case WIFI_DIRECT_STATE_DEACTIVATED:
-               return "DEACTIVATED";
-               break;
-
-       case WIFI_DIRECT_STATE_DEACTIVATING:
-               return "DEACTIVATING";
-               break;
-       case WIFI_DIRECT_STATE_ACTIVATING:
-               return "ACTIVATING";
-               break;
-       case WIFI_DIRECT_STATE_ACTIVATED:
-               return "ACTIVATED";
-               break;
-       case WIFI_DIRECT_STATE_DISCOVERING:
-               return "DISCOVERING";
-               break;
-       case WIFI_DIRECT_STATE_CONNECTING:
-               return "CONNECTING";
-               break;
-       case WIFI_DIRECT_STATE_DISCONNECTING:
-               return "DISCONNECTING";
-               break;
-       case WIFI_DIRECT_STATE_CONNECTED:
-               return "CONNECTED";
-               break;
-       case WIFI_DIRECT_STATE_GROUP_OWNER:
-               return "GROUP OWNER";
-               break;
-       default:
-               return "Unknown";
-       }
-}
-
-int wfd_macaddr_atoe(char *p, unsigned char mac[])
-{
-       int i = 0;
-
-       WDS_LOGD("MAC [%s]\n", p);
-
-       for (;;)
-       {
-               mac[i++] = (char) strtoul(p, &p, 16);
-               if (!*p++ || i == 6)
-                       break;
-       }
-
-       return (i == 6);
-}
-
diff --git a/wifi-direct-manager.manifest b/wifi-direct-manager.manifest
new file mode 100644 (file)
index 0000000..0bda959
--- /dev/null
@@ -0,0 +1,17 @@
+<manifest>
+       <define>
+               <domain name="wifi_direct_manager" policy="restricted" plist="wifi-direct-plugin-wpasupplicant"/>
+               <permit>
+                       <smack permit="system::use_internet" type="w"/>
+               </permit>
+       </define>
+       <assign>
+               <filesystem path="/usr/bin/wifi-direct-server.sh" label="_" />
+               <filesystem path="/usr/bin/wifi-direct-dhcp.sh" label="_" />
+               <filesystem path="/usr/bin/dhcpd-notify.sh" label="_" />
+               <filesystem path="/usr/sbin/p2p_supp.sh" label="_" />
+       </assign>
+       <request>
+               <domain name="wifi_direct_manager"/>
+       </request>
+</manifest>
index 5a65127..18e4228 100644 (file)
@@ -4,6 +4,6 @@
        </request>
        <assign>
                <filesystem path="/usr/lib/wifi-direct-plugin-wpasupplicant.so" label="_"/>
-               <filesystem path="/usr/sbin/p2p_supplicant" label="_"/>
+               <filesystem path="/usr/sbin/wpa_supplicant" label="_"/>
        </assign>
 </manifest>