summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaehyun Kim <jeik01.kim@samsung.com>2012-08-21 21:11:58 +0900
committerJaehyun Kim <jeik01.kim@samsung.com>2012-08-21 21:11:58 +0900
commita67df736d6819e30c4054afdded099ff354f0028 (patch)
tree9a4e819422666c201c33ce7a99745110ee43bd43
parent69fe91df0090d16f47fe1fc064504aff69b11ea7 (diff)
downloadwifi-master.tar.gz
wifi-master.tar.bz2
wifi-master.zip
-rw-r--r--AUTHORS2
-rw-r--r--CMakeLists.txt96
-rw-r--r--LICENSE204
-rw-r--r--capi-network-wifi.pc.in14
-rw-r--r--debian/capi-network-wifi-dev.install4
-rw-r--r--debian/capi-network-wifi.install1
-rw-r--r--debian/changelog31
-rw-r--r--debian/compat1
-rw-r--r--debian/control21
-rwxr-xr-xdebian/rules67
-rw-r--r--include/net_wifi_private.h73
-rw-r--r--include/wifi.h1076
-rw-r--r--packaging/capi-network-wifi.spec57
-rwxr-xr-xsrc/libnetwork.c668
-rwxr-xr-xsrc/net_wifi.c352
-rwxr-xr-xsrc/net_wifi_ap.c1071
-rw-r--r--test/CMakeLists.txt17
-rw-r--r--test/wifi_test.c540
18 files changed, 4295 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..ee5aeac
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+JaeHyun Kim <jeik01.kim@samsung.com>
+ByungWoo Lee <bw1212.lee@samsung.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..bfff87f
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,96 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+SET(fw_name "capi-network-wifi")
+
+PROJECT(${fw_name})
+
+SET(CMAKE_INSTALL_PREFIX /usr)
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+
+SET(INC_DIR include)
+INCLUDE_DIRECTORIES(${INC_DIR})
+
+SET(dependents "dlog vconf capi-base-common glib-2.0 network")
+SET(pc_dependents "capi-base-common")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(${fw_name} REQUIRED ${dependents})
+FOREACH(flag ${${fw_name}_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
+
+IF("${ARCH}" STREQUAL "arm")
+ ADD_DEFINITIONS("-DTARGET")
+ENDIF("${ARCH}" STREQUAL "arm")
+
+ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
+ADD_DEFINITIONS("-DTIZEN_DEBUG")
+
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib")
+
+aux_source_directory(src SOURCES)
+ADD_LIBRARY(${fw_name} SHARED ${SOURCES})
+
+TARGET_LINK_LIBRARIES(${fw_name} ${${fw_name}_LDFLAGS})
+
+SET_TARGET_PROPERTIES(${fw_name}
+ PROPERTIES
+ VERSION ${FULLVER}
+ SOVERSION ${MAJORVER}
+ CLEAN_DIRECT_OUTPUT 1
+)
+
+INSTALL(TARGETS ${fw_name} DESTINATION lib)
+INSTALL(
+ DIRECTORY ${INC_DIR}/ DESTINATION include/network
+ FILES_MATCHING
+ PATTERN "*_private.h" EXCLUDE
+ PATTERN "${INC_DIR}/*.h"
+ )
+
+SET(PC_NAME ${fw_name})
+SET(PC_REQUIRED ${pc_dependents})
+SET(PC_LDFLAGS -l${fw_name})
+
+CONFIGURE_FILE(
+ ${fw_name}.pc.in
+ ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc
+ @ONLY
+)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION lib/pkgconfig)
+
+ADD_SUBDIRECTORY(test)
+
+IF(UNIX)
+
+ADD_CUSTOM_TARGET (distclean @echo cleaning for source distribution)
+ADD_CUSTOM_COMMAND(
+ DEPENDS clean
+ COMMENT "distribution clean"
+ COMMAND find
+ ARGS .
+ -not -name config.cmake -and \(
+ -name tester.c -or
+ -name Testing -or
+ -name CMakeFiles -or
+ -name cmake.depends -or
+ -name cmake.check_depends -or
+ -name CMakeCache.txt -or
+ -name cmake.check_cache -or
+ -name *.cmake -or
+ -name Makefile -or
+ -name core -or
+ -name core.* -or
+ -name gmon.out -or
+ -name install_manifest.txt -or
+ -name *.pc -or
+ -name *~ \)
+ | grep -v TC | xargs rm -rf
+ TARGET distclean
+ VERBATIM
+)
+
+ENDIF(UNIX)
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a06208b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,204 @@
+Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ 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.
+
+ 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,
+ 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 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 in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) 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
+
+ (d) 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.
+
+ 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 Apache License to your work.
+
+ To apply the Apache 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 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.
+
diff --git a/capi-network-wifi.pc.in b/capi-network-wifi.pc.in
new file mode 100644
index 0000000..127da21
--- /dev/null
+++ b/capi-network-wifi.pc.in
@@ -0,0 +1,14 @@
+# Package Information for pkg-config
+
+prefix=@PREFIX@
+exec_prefix=/usr
+libdir=/usr/lib
+includedir=/usr/include/network
+
+Name: @PC_NAME@
+Description: @PACKAGE_DESCRIPTION@
+Version: @VERSION@
+Requires: @PC_REQUIRED@
+Libs: -L${libdir} @PC_LDFLAGS@
+Cflags: -I${includedir}
+
diff --git a/debian/capi-network-wifi-dev.install b/debian/capi-network-wifi-dev.install
new file mode 100644
index 0000000..761a28b
--- /dev/null
+++ b/debian/capi-network-wifi-dev.install
@@ -0,0 +1,4 @@
+/usr/include/*
+/usr/include/*/*
+/usr/lib/pkgconfig/*.pc
+
diff --git a/debian/capi-network-wifi.install b/debian/capi-network-wifi.install
new file mode 100644
index 0000000..4a755a4
--- /dev/null
+++ b/debian/capi-network-wifi.install
@@ -0,0 +1 @@
+/usr/lib/lib*.so*
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..30b7a6b
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,31 @@
+capi-network-wifi (0.1.1-2) unstable; urgency=low
+
+ * Ad UTC files
+ * Git: api/wifi
+ * Tag: capi-network-wifi_0.1.1-2
+
+ -- JaeHyun Kim <jeik01.kim@samsung.com> Wed, 04 Jul 2012 11:41:10 +0900
+
+capi-network-wifi (0.1.1-1) unstable; urgency=low
+
+ * Add AP initialization functions for user creation
+ * Git: api/wifi
+ * Tag: capi-network-wifi_0.1.1-1
+
+ -- JaeHyun Kim <jeik01.kim@samsung.com> Mon, 02 Jul 2012 11:01:10 +0900
+
+capi-network-wifi (0.1.1-0) unstable; urgency=low
+
+ * Package implementation
+ * Git: api/wifi
+ * Tag: capi-network-wifi_0.1.1-0
+
+ -- JaeHyun Kim <jeik01.kim@samsung.com> Mon, 21 May 2012 19:31:01 +0900
+
+capi-network-wifi (0.1.0-1) unstable; urgency=low
+
+ * Initial Upload
+ * Git: api/wifi
+ * Tag: capi-network-wifi_0.1.0-1
+
+ -- JaeHyun Kim <jeik01.kim@samsung.com> Mon, 09 Apr 2012 20:54:57 +0900
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..7fb1ee7
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,21 @@
+Source: capi-network-wifi
+Section: libs
+Priority: extra
+Maintainer: JaeHyun Kim <jeik01.kim@samsung.com>
+Build-Depends: debhelper (>= 5), dlog-dev, capi-base-common-dev, libvconf-dev, libglib2.0-dev, libdbus-glib-1-dev, libnetwork-dev
+
+Package: capi-network-wifi
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Network Wi-Fi library in TIZEN C API
+
+Package: capi-network-wifi-dev
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, capi-network-wifi (= ${Source-Version}), capi-base-common-dev
+Description: Network Wi-Fi library in TIZEN C API (DEV)
+
+Package: capi-network-wifi-dbg
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, capi-network-wifi (= ${Source-Version})
+Description: Network Wi-Fi library in TIZEN C API (DBG)
+
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..3ae0922
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,67 @@
+#!/usr/bin/make -f
+
+CFLAGS = -Wall -g
+FULLVER ?= $(shell dpkg-parsechangelog | grep Version: | cut -d ' ' -f 2 | cut -d '-' -f 1)
+MAJORVER ?= $(shell echo $(FULLVER) | cut -d '.' -f 1)
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+CMAKE_ROOT_DIR ?= $(CURDIR)
+CMAKE_BUILD_DIR ?= $(CURDIR)/cmake_build_tmp
+
+configure: configure-stamp
+configure-stamp:
+ dh_testdir
+ mkdir -p $(CMAKE_BUILD_DIR) && cd $(CMAKE_BUILD_DIR) && cmake .. -DFULLVER=${FULLVER} -DMAJORVER=${MAJORVER}
+ touch configure-stamp
+
+
+build: build-stamp
+build-stamp: configure-stamp
+ dh_testdir
+ cd $(CMAKE_BUILD_DIR) && $(MAKE)
+ touch $@
+
+clean:
+ cd $(CMAKE_ROOT_DIR)
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp configure-stamp
+ rm -f `find . -name *.pc`
+ rm -rf $(CMAKE_BUILD_DIR)
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ cd $(CMAKE_BUILD_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
+
+binary-indep: build install
+
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs
+ dh_installdocs
+ dh_installexamples
+ dh_install --sourcedir=debian/tmp
+ dh_installman
+ dh_link
+ dh_strip --dbg-package=capi-network-wifi-dbg
+ dh_fixperms
+ 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/include/net_wifi_private.h b/include/net_wifi_private.h
new file mode 100644
index 0000000..0f4fc9c
--- /dev/null
+++ b/include/net_wifi_private.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2011 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 __NET_CONNECTION_PRIVATE_H__ /* To prevent inclusion of a header file twice */
+#define __NET_CONNECTION_PRIVATE_H__
+
+#include <dlog.h>
+#include <network-cm-intf.h>
+#include <network-wifi-intf.h>
+#include "wifi.h"
+
+#define TIZEN_NET_CONNECTION "net_wifi"
+
+#define WIFI_INFO LOG_VERBOSE
+#define WIFI_ERROR LOG_ERROR
+#define WIFI_WARN LOG_WARN
+
+#define WIFI_LOG(log_level, format, args...) \
+ SLOG(log_level,TIZEN_NET_CONNECTION, "[%s][Ln: %d] " format, __FILE__, __LINE__, ##args)
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+bool _wifi_libnet_init(void);
+bool _wifi_libnet_deinit(void);
+int _wifi_activate(void);
+int _wifi_deactivate(void);
+
+bool _wifi_libnet_check_ap_validity(wifi_ap_h ap_h);
+void _wifi_libnet_add_to_ap_list(wifi_ap_h ap_h);
+void _wifi_libnet_remove_from_ap_list(wifi_ap_h ap_h);
+bool _wifi_libnet_check_profile_name_validity(const char *profile_name);
+
+bool _wifi_libnet_get_wifi_state(wifi_connection_state_e* connection_state);
+int _wifi_libnet_get_intf_name(char** name);
+int _wifi_libnet_scan_request(wifi_scan_finished_cb callback, void* user_data);
+int _wifi_libnet_get_connected_profile(wifi_ap_h *ap);
+bool _wifi_libnet_foreach_found_aps(wifi_found_ap_cb callback, void *user_data);
+
+int _wifi_libnet_open_profile(wifi_ap_h ap_h);
+int _wifi_libnet_close_profile(wifi_ap_h ap_h);
+int _wifi_libnet_connect_with_wps(wifi_ap_h ap_h, wifi_wps_type_e type, const char *pin);
+
+int _wifi_set_power_on_off_cb(wifi_device_state_changed_cb callback, void *user_data);
+int _wifi_unset_power_on_off_cb(void);
+int _wifi_set_background_scan_cb(wifi_scan_finished_cb callback, void *user_data);
+int _wifi_unset_background_scan_cb(void);
+int _wifi_set_connection_state_cb(wifi_connection_state_changed_cb callback, void *user_data);
+int _wifi_unset_connection_state_cb();
+
+int _wifi_update_ap_info(net_profile_info_t *ap_info);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
diff --git a/include/wifi.h b/include/wifi.h
new file mode 100644
index 0000000..5c132e8
--- /dev/null
+++ b/include/wifi.h
@@ -0,0 +1,1076 @@
+/*
+* Copyright (c) 2011 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 __TIZEN_NETWORK_WIFI_H__
+#define __TIZEN_NETWORK_WIFI_H__
+
+#include <tizen.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_MODULE
+* @{
+*/
+
+/**
+* @brief The Wi-Fi error type
+*/
+typedef enum
+{
+ WIFI_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */
+ WIFI_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */
+ WIFI_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory error */
+ WIFI_ERROR_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION, /**< Invalid operation */
+ WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED = TIZEN_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED, /**< Address family not supported */
+ WIFI_ERROR_OPERATION_FAILED = TIZEN_ERROR_NETWORK_CLASS|0x0301, /**< Operation failed */
+ WIFI_ERROR_NO_CONNECTION = TIZEN_ERROR_NETWORK_CLASS|0x0302, /**< There is no connected AP */
+} wifi_error_e;
+
+/**
+* @brief The state of Wi-Fi connection
+*/
+typedef enum
+{
+ WIFI_CONNECTION_STATE_CONNECTING = 0, /**< Trying to connect(association/configuration) */
+ WIFI_CONNECTION_STATE_CONNECTED = 1, /**< Wi-Fi is connected to an AP(ready/online) */
+ WIFI_CONNECTION_STATE_DISCONNECTING = 2, /**< Trying to disconnect(connected, but disconnecting process is on going) */
+ WIFI_CONNECTION_STATE_DISCONNECTED = 3, /**< Wi-Fi is disconnected */
+} wifi_connection_state_e;
+
+/**
+* @brief The WPS(Wi-Fi Protected Setup) type
+*/
+typedef enum
+{
+ WIFI_WPS_TYPE_PBC = 0, /**< PBC */
+ WIFI_WPS_TYPE_PIN = 1, /**< PIN */
+} wifi_wps_type_e;
+
+/**
+* @brief The state of Wi-Fi device
+*/
+typedef enum
+{
+ WIFI_DEVICE_STATE_DEACTIVATED = 0, /**< Wi-Fi is Deactivated */
+ WIFI_DEVICE_STATE_ACTIVATED = 1, /**< Wi-Fi is activated */
+} wifi_device_state_e;
+
+/**
+* @brief The RSSI level
+*/
+typedef enum
+{
+ WIFI_RSSI_LEVEL_0 = 0, /**< level 0 */
+ WIFI_RSSI_LEVEL_1 = 1, /**< level 1 */
+ WIFI_RSSI_LEVEL_2 = 2, /**< level 2 */
+ WIFI_RSSI_LEVEL_3 = 3, /**< level 3 */
+ WIFI_RSSI_LEVEL_4 = 4, /**< level 4 */
+} wifi_rssi_level_e;
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_AP_NETWORK_MODULE
+* @{
+*/
+
+/**
+* @brief Net IP configuration Type
+*/
+typedef enum
+{
+ WIFI_IP_CONFIG_TYPE_NONE = 0, /**< Not defined */
+ WIFI_IP_CONFIG_TYPE_STATIC = 1, /**< Manual IP configuration */
+ WIFI_IP_CONFIG_TYPE_DYNAMIC = 2, /**< Config IP using DHCP client*/
+ WIFI_IP_CONFIG_TYPE_AUTO = 3, /**< Config IP from Auto IP pool (169.254/16). Later with DHCP client, if available */
+ WIFI_IP_CONFIG_TYPE_FIXED = 4, /**< Indicates an IP address that can not be modified */
+} wifi_ip_config_type_e;
+
+/**
+* @brief Address type
+*/
+typedef enum
+{
+ WIFI_ADDRESS_FAMILY_IPV4 = 0, /**< IPV4 Address family */
+ WIFI_ADDRESS_FAMILY_IPV6 = 1, /**< IPV6 Address family */
+} wifi_address_family_e;
+
+/**
+* @brief This enumeration defines the proxy method type.
+*/
+typedef enum
+{
+ WIFI_PROXY_TYPE_DIRECT = 0, /**< Direct connection */
+ WIFI_PROXY_TYPE_AUTO = 1, /**< Auto configuration(Use PAC file). If URL property is not set, DHCP/WPAD auto-discover will be tried */
+ WIFI_PROXY_TYPE_MANUAL = 2 /**< Manual configuration */
+} wifi_proxy_type_e;
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_AP_SECURITY_MODULE
+* @{
+*/
+
+/**
+* @brief Below security modes are used in infrastructure and ad-hoc mode
+* For now all EAP security mechanisms are provided only in infrastructure mode
+*/
+typedef enum
+{
+ WIFI_SECURITY_TYPE_NONE = 0, /**< Security disabled */
+ WIFI_SECURITY_TYPE_WEP = 1, /**< WEP */
+ WIFI_SECURITY_TYPE_WPA_PSK = 2, /**< WPA-PSK */
+ WIFI_SECURITY_TYPE_WPA2_PSK = 3, /**< WPA2-PSK */
+ WIFI_SECURITY_TYPE_EAP = 4, /**< EAP */
+} wifi_security_type_e;
+
+/**
+* @brief Below encryption modes are used in infrastructure and ad-hoc mode
+*/
+typedef enum
+{
+ WIFI_ENCRYPTION_TYPE_NONE = 0, /**< Encryption disabled */
+ WIFI_ENCRYPTION_TYPE_WEP = 1, /**< WEP */
+ WIFI_ENCRYPTION_TYPE_TKIP = 2, /**< TKIP */
+ WIFI_ENCRYPTION_TYPE_AES = 3, /**< AES */
+ WIFI_ENCRYPTION_TYPE_TKIP_AES_MIXED = 4, /**< TKIP and AES are both supported */
+} wifi_encryption_type_e;
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_AP_SECURITY_EAP_MODULE
+* @{
+*/
+
+/**
+* @brief EAP type
+*/
+typedef enum
+{
+ WIFI_EAP_TYPE_PEAP = 0, /**< EAP PEAP type */
+ WIFI_EAP_TYPE_TLS = 1, /**< EAP TLS type */
+ WIFI_EAP_TYPE_TTLS = 2, /**< EAP TTLS type */
+ WIFI_EAP_TYPE_SIM = 3, /**< EAP SIM type */
+ WIFI_EAP_TYPE_AKA = 4, /**< EAP AKA type */
+} wifi_eap_type_e;
+
+/**
+* @brief EAP phase2 authentication type
+*/
+typedef enum
+{
+ WIFI_EAP_AUTH_TYPE_NONE = 0, /**< EAP phase2 authentication none */
+ WIFI_EAP_AUTH_TYPE_PAP = 1, /**< EAP phase2 authentication PAP */
+ WIFI_EAP_AUTH_TYPE_MSCHAP = 2, /**< EAP phase2 authentication MSCHAP */
+ WIFI_EAP_AUTH_TYPE_MSCHAPV2 = 3, /**< EAP phase2 authentication MSCHAPv2 */
+ WIFI_EAP_AUTH_TYPE_GTC = 4, /**< EAP phase2 authentication GTC */
+ WIFI_EAP_AUTH_TYPE_MD5 = 5, /**< EAP phase2 authentication MD5 */
+} wifi_eap_auth_type_e;
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_AP_MODULE
+* @{
+*/
+
+/**
+* @brief The handle for Wi-Fi access point.
+*/
+typedef void* wifi_ap_h;
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_MODULE
+* @{
+*/
+
+/**
+* @brief Called when you get the found access point repeatedly.
+* @remarks @a ap is valid only in this function. In order to use the ap outside this function, you must copy the ap with wifi_ap_clone().
+* @param[in] ap The access point
+* @param[in] user_data The user data passed from the request function
+* @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop
+* @pre wifi_foreach_found_aps() will invoke this callback.
+* @see wifi_foreach_found_aps()
+*/
+typedef bool(*wifi_found_ap_cb)(wifi_ap_h ap, void* user_data);
+
+/**
+* @brief Called when the device state is changed.
+* @param[in] error_code The error code
+* @param[in] state The device state
+* @param[in] is_requested Indicates whether this change is requested by you
+* @param[in] user_data The user data passed from the callback registration function
+* @see wifi_set_device_state_changed_cb()
+* @see wifi_unset_device_state_changed_cb()
+*/
+typedef void(*wifi_device_state_changed_cb)(wifi_error_e error_code, wifi_device_state_e state, bool is_requested, void* user_data);
+
+/**
+* @brief Called when the scan is finished.
+* @param[in] error_code The error code
+* @param[in] user_data The user data passed from the callback registration function
+* @see wifi_scan()
+* @see wifi_set_background_scan_cb()
+* @see wifi_unset_background_scan_cb()
+*/
+typedef void(*wifi_scan_finished_cb)(wifi_error_e error_code, void* user_data);
+
+/**
+* @brief Called when the connection state is changed.
+* @param[in] error_code The error code
+* @param[in] state The connection state
+* @param[in] ap The access point
+* @param[in] is_requested Indicates whether this change is requested by you
+* @param[in] user_data The user data passed from the callback registration function
+* @see wifi_set_connection_state_changed_cb()
+* @see wifi_unset_connection_state_changed_cb()
+*/
+typedef void(*wifi_connection_state_changed_cb)(wifi_error_e error_code, wifi_connection_state_e state, wifi_ap_h ap, bool is_requested, void* user_data);
+
+/**
+* @brief Called when the RSSI of connected Wi-Fi changed.
+* @param[in] rssi_level The level of RSSI
+* @param[in] user_data The user data passed from the callback registration function
+* @see wifi_set_rssi_level_changed_cb()
+* @see wifi_unset_rssi_level_changed_cb()
+*/
+typedef void(*wifi_rssi_level_changed_cb)(wifi_rssi_level_e rssi_level, void* user_data);
+
+/**
+* @brief Initializes Wi-Fi
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_initialize(void);
+
+/**
+* @brief Deinitializes Wi-Fi
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_deinitialize(void);
+
+/**
+* @brief Activates Wi-Fi, asynchronously.
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_activate(void);
+
+/**
+* @brief Deactivates Wi-Fi, asynchronously.
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_deactivate(void);
+
+/**
+* @brief Check whether Wi-Fi is activated
+* @param[out] is_requested Indicates whether wifi is activated or not
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_is_activated(bool* activated);
+
+/**
+* @brief Gets connection state
+* @param[out] connection_state The connection state
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_get_connection_state(wifi_connection_state_e* connection_state);
+
+/**
+* @brief Gets the local MAC address.
+* @remarks @a mac_address must be released with free() by you.
+* @param[out] mac_address The mac address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_get_mac_address(char** mac_address);
+
+/**
+* @brief Gets the name of network interface.
+* @remarks @a name must be released with free() by you.
+* @param[out] name The name of network interface
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_get_network_interface_name(char** name);
+
+/**
+* @brief Starts scan, asynchronously.
+* @param[in] callback The callback function to be called
+* @param[in] user_data The user data passed to the callback function
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @post This function invokes wifi_scan_finished_cb().
+*/
+int wifi_scan(wifi_scan_finished_cb callback, void* user_data);
+
+/**
+* @brief Gets the handle of connected access point.
+* @remarks @a handle must be released with wifi_ap_destroy().
+* @param[out] ap The handle of access point
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_NO_CONNECTION There is no connected AP
+*/
+int wifi_get_connected_ap(wifi_ap_h* ap);
+
+/**
+* @brief Gets the result of scan.
+* @param[in] callback The callback to be called
+* @param[in] user_data The user data passed to the callback function
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @post This function invokes wifi_found_ap_cb().
+*/
+int wifi_foreach_found_aps(wifi_found_ap_cb callback, void* user_data);
+
+/**
+* @brief Connects the access point, asynchronously.
+* @param[in] ap The handle of access point
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @post This function invokes wifi_connection_state_changed_cb().
+*/
+int wifi_connect(wifi_ap_h ap);
+
+/**
+* @brief Disconnects the access point, asynchronously.
+* @param[in] ap The handle of access point
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @post This function invokes wifi_connection_state_changed_cb().
+*/
+int wifi_disconnect(wifi_ap_h ap);
+
+/**
+* @brief Connects the access point with WPS, asynchronously.
+* @param[in] ap The handle of access point
+* @param[in] type The type of WPS
+* @param[in] pin The pin value, which is valid only when type is WIFI_WPS_TYPE_PIN.
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @post This function invokes wifi_connection_state_changed_cb().
+*/
+int wifi_connect_with_wps(wifi_ap_h ap, wifi_wps_type_e type, const char* pin);
+
+/**
+* @brief Deletes the information of stored access point.
+* @details If an AP is connected, then connection information will be stored.
+* This information is used when a connection to that AP is established automatically.
+* @param[in] ap The handle of access point
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_forget_ap(wifi_ap_h ap);
+
+/**
+* @brief Registers the callback called when the device state is changed.
+* @param[in] callback The callback function to be called
+* @param[in] user_data The user data passed to the callback function
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+*/
+int wifi_set_device_state_changed_cb(wifi_device_state_changed_cb callback, void* user_data);
+
+/**
+* @brief Unregisters the callback called when the device state is changed.
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_unset_device_state_changed_cb(void);
+
+/**
+* @brief Registers the callback called when the background scan is finished periodically.
+* @param[in] callback The callback function to be called
+* @param[in] user_data The user data passed to the callback function
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+*/
+int wifi_set_background_scan_cb(wifi_scan_finished_cb callback, void* user_data);
+
+/**
+* @brief Unregisters the callback called when the scan is finished periodically.
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_unset_background_scan_cb(void);
+
+/**
+* @brief Registers the callback called when the connection state is changed.
+* @param[in] callback The callback function to be called
+* @param[in] user_data The user data passed to the callback function
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+*/
+int wifi_set_connection_state_changed_cb(wifi_connection_state_changed_cb callback, void* user_data);
+
+/**
+* @brief Unregisters the callback called when the connection state is changed.
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_unset_connection_state_changed_cb(void);
+
+/**
+* @brief Registers callback called when the RSSI of connected Wi-Fi changed.
+* @param[in] callback The callback function to be called
+* @param[in] user_data The user data passed to the callback function
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+*/
+int wifi_set_rssi_level_changed_cb(wifi_rssi_level_changed_cb callback, void* user_data);
+
+/**
+* @brief Unregisters callback called when the RSSI of connected Wi-Fi changed.
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_unset_rssi_level_changed_cb(void);
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_AP_MODULE
+* @{
+*/
+
+/**
+* @brief Creates the handle of access point.
+* @remarks @a ap must be released with wifi_ap_destroy().
+* @param[in] essid The ESSID(Extended Service Set Identifier)
+* @param[out] ap The handle of access point
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @see wifi_ap_destroy()
+*/
+int wifi_ap_create(const char* essid, wifi_ap_h* ap);
+
+/**
+* @brief Destroys the handle of access point.
+* @param[in] ap The handle of access point
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @see wifi_ap_create()
+*/
+int wifi_ap_destroy(wifi_ap_h ap);
+
+/**
+* @brief Clons the handle of access point.
+* @remarks @a cloned_ap must be released with wifi_ap_destroy().
+* @param[out] cloned_ap The handle of cloned access point
+* @param[in] origin The handle of origin access point
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @see wifi_ap_destroy()
+*/
+int wifi_ap_clone(wifi_ap_h* cloned_ap, wifi_ap_h origin);
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_AP_NETWORK_MODULE
+* @{
+*/
+
+/**
+* @brief Gets ESSID(Extended Service Set Identifier).
+* @remarks @a essid must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[out] essid The ESSID
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+*/
+int wifi_ap_get_essid(wifi_ap_h ap, char** essid);
+
+/**
+* @brief Gets BSSID(Basic Service Set Identifier).
+* @remarks @a bssid must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[out] bssid The BSSID
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+*/
+int wifi_ap_get_bssid(wifi_ap_h ap, char** bssid);
+
+/**
+* @brief Gets the RSSI.
+* @param[in] ap The handle of access point
+* @param[out] rssi The RSSI
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_rssi(wifi_ap_h ap, int* rssi);
+
+/**
+* @brief Gets the Frequency band (MHz).
+* @param[in] ap The handle of access point
+* @param[out] frequency The frequency
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_frequency(wifi_ap_h ap, int* frequency);
+
+/**
+* @brief Gets the max speed (Mbps).
+* @param[in] ap The handle of access point
+* @param[out] max_speed The max speed
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_max_speed(wifi_ap_h ap, int* max_speed);
+
+/**
+* @brief Indicates whether the access point is favorite or not.
+* @param[in] ap The handle of access point
+* @param[out] favourite Indicates whether access point is favorite or not.
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_is_favorite(wifi_ap_h ap, bool* favorite);
+
+/**
+* @brief Gets the connection state.
+* @param[in] ap The handle of access point
+* @param[out] state The connection state
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_connection_state(wifi_ap_h ap, wifi_connection_state_e* state);
+
+/**
+* @brief Gets the config type of IP.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[out] type The type of IP config
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_get_ip_config_type(wifi_ap_h ap, wifi_address_family_e address_family, wifi_ip_config_type_e* type);
+
+/**
+* @brief Sets the config type of IP.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[in] type The type of IP config
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_set_ip_config_type(wifi_ap_h ap, wifi_address_family_e address_family, wifi_ip_config_type_e type);
+
+/**
+* @brief Gets the IP address.
+* @remarks @a ip_address must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[out] ip_address The IP address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_get_ip_address(wifi_ap_h ap, wifi_address_family_e address_family, char** ip_address);
+
+/**
+* @brief Sets the IP address.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[in] ip_address The IP address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_set_ip_address(wifi_ap_h ap, wifi_address_family_e address_family, const char* ip_address);
+
+/**
+* @brief Gets the subnet mask.
+* @remarks @a subnet_mask must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[out] subnet_mask The subnet mask
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_get_subnet_mask(wifi_ap_h ap, wifi_address_family_e address_family, char** subnet_mask);
+
+/**
+* @brief Sets the subnet mask.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[in] subnet_mask The subnet mask
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_set_subnet_mask(wifi_ap_h ap, wifi_address_family_e address_family, const char* subnet_mask);
+
+/**
+* @brief Gets the gateway address.
+* @remarks @a gateway_address must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[out] gateway_address The gateway address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_get_gateway_address(wifi_ap_h ap, wifi_address_family_e address_family, char** gateway_address);
+
+/**
+* @brief Sets the gateway address.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[in] gateway_address The gateway address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_set_gateway_address(wifi_ap_h ap, wifi_address_family_e address_family, const char* gateway_address);
+
+/**
+* @brief Gets the proxy address.
+* @remarks @a proxy_address must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[out] proxy_address The proxy address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_get_proxy_address(wifi_ap_h ap, wifi_address_family_e address_family, char** proxy_address);
+
+/**
+* @brief Sets the proxy address.
+* @param[in] ap The handle of access point
+* @param[in] address_family The address family
+* @param[in] proxy_address The proxy address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_set_proxy_address(wifi_ap_h ap, wifi_address_family_e address_family, const char* proxy_address);
+
+/**
+* @brief Gets the Proxy type.
+* @param[in] ap The handle of access point
+* @param[out] type The type of proxy
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_proxy_type(wifi_ap_h ap, wifi_proxy_type_e* type);
+
+/**
+* @brief Sets the Proxy address.
+* @param[in] ap The handle of access point
+* @param[in] type The type of proxy
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_set_proxy_type(wifi_ap_h ap, wifi_proxy_type_e proxy_type);
+
+/**
+* @brief Gets the DNS address.
+* @remarks The allowance of DNS address is 2. @a dns_address must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[in] order The order of DNS address. It starts from 1, which means first DNS address.
+* @param[in] address_family The address family
+* @param[out] dns_address The DNS address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_get_dns_address(wifi_ap_h ap, int order, wifi_address_family_e address_family, char** dns_address);
+
+/**
+* @brief Sets the DNS address.
+* @remarks The allowance of DNS address is 2.
+* @param[in] ap The handle of access point
+* @param[in] order The order of DNS address. It starts from 1, which means first DNS address.
+* @param[in] address_family The address family
+* @param[in] dns_address The DNS address
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+* @retval #WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED Address family not supported
+*/
+int wifi_ap_set_dns_address(wifi_ap_h ap, int order, wifi_address_family_e address_family, const char* dns_address);
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_AP_SECURITY_MODULE
+* @{
+*/
+
+/**
+* @brief Gets the security mode of Wi-Fi.
+* @param[in] ap The handle of access point
+* @param[out] type The type of Wi-Fi security
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_security_type(wifi_ap_h ap, wifi_security_type_e* type);
+
+/**
+* @brief Sets the security mode of Wi-Fi.
+* @param[in] ap The handle of access point
+* @param[in] type The type of Wi-Fi security
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_set_security_type(wifi_ap_h ap, wifi_security_type_e type);
+
+/**
+* @brief Gets the encryption type of Wi-Fi.
+* @param[in] ap The handle of access point
+* @param[out] type The type of Wi-Fi encryption
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_encryption_type(wifi_ap_h ap, wifi_encryption_type_e* type);
+
+/**
+* @brief Sets the encryption type of Wi-Fi.
+* @param[in] ap The handle of access point
+* @param[in] type The type of Wi-Fi encryption
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_set_encryption_type(wifi_ap_h ap, wifi_encryption_type_e type);
+
+/**
+* @brief Indicates whether the passphrase is required or not.
+* @param[in] ap The handle of access point
+* @param[out] required Indicates whether passphrase is required or not
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_is_passphrase_required(wifi_ap_h ap, bool* required);
+
+/**
+* @brief Sets the passphrase.
+* @param[in] ap The handle of access point
+* @param[in] passphrase The passphrase of access point
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_set_passphrase(wifi_ap_h ap, const char* passphrase);
+
+/**
+* @brief Indicates whether the WPS is supported or not.
+* @param[in] ap The handle of access point
+* @param[out] supported Indicates whether WPS is supported or not
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_is_wps_supported(wifi_ap_h ap, bool* supported);
+
+/**
+* @}
+*/
+
+
+/**
+* @addtogroup CAPI_NETWORK_WIFI_AP_SECURITY_EAP_MODULE
+* @{
+*/
+
+/**
+* @brief Sets the passphrase of EAP.
+* @param[in] ap The handle of access point
+* @param[in] user_name The user name
+* @param[in] password The password
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_set_eap_passphrase(wifi_ap_h ap, const char* user_name, const char* password);
+
+/**
+* @brief Gets the CA Certificate of EAP.
+* @remarks @a file must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[out] file The file path of CA Certificate
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_get_eap_ca_cert_file(wifi_ap_h ap, char** file);
+
+/**
+* @brief Sets the CA Certificate of EAP.
+* @param[in] ap The handle of access point
+* @param[in] file The file path of CA Certificate
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_set_eap_ca_cert_file(wifi_ap_h ap, const char* file);
+
+/**
+* @brief Gets the Client Certificate of EAP.
+* @remarks @a file must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[out] file The file path of Client Certificate
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_get_eap_client_cert_file(wifi_ap_h ap, char** file);
+
+/**
+* @brief Sets the CA Certificate of EAP.
+* @param[in] ap The handle of access point
+* @param[in] file The file path of Client Certificate
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_set_eap_client_cert_file(wifi_ap_h ap, const char* file);
+
+/**
+* @brief Gets the private key file of EAP.
+* @remarks @a file must be released with free() by you.
+* @param[in] ap The handle of access point
+* @param[out] file The file path of private key
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_OUT_OF_MEMORY Out of memory
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_get_eap_private_key_file(wifi_ap_h ap, char** file);
+
+/**
+* @brief Sets the private key information of EAP.
+* @param[in] ap The handle of access point
+* @param[in] file The file path of private key
+* @param[in] password The password
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_set_eap_private_key_info(wifi_ap_h ap, const char* file, const char* password);
+
+/**
+* @brief Gets the EAP type of Wi-Fi.
+* @param[in] ap The handle of access point
+* @param[out] type The type of EAP
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_eap_type(wifi_ap_h ap, wifi_eap_type_e* type);
+
+/**
+* @brief Sets the EAP type of Wi-Fi.
+* @param[in] ap The handle of access point
+* @param[in] type The type of EAP
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_set_eap_type(wifi_ap_h ap, wifi_eap_type_e type);
+
+/**
+* @brief Gets the type of EAP phase2 authentication of Wi-Fi.
+* @param[in] ap The handle of access point
+* @param[out] type The type of EAP phase2 authentication
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+* @retval #WIFI_ERROR_OPERATION_FAILED Operation failed
+*/
+int wifi_ap_get_eap_auth_type(wifi_ap_h ap, wifi_eap_auth_type_e* type);
+
+/**
+* @brief Sets the type of EAP phase2 authentication of Wi-Fi.
+* @param[in] ap The handle of access point
+* @param[in] type The type of EAP phase2 authentication
+* @return 0 on success, otherwise negative error value.
+* @retval #WIFI_ERROR_NONE Successful
+* @retval #WIFI_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #WIFI_ERROR_INVALID_OPERATION Invalid operation
+*/
+int wifi_ap_set_eap_auth_type(wifi_ap_h ap, wifi_eap_auth_type_e type);
+
+/**
+* @}
+*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_NETWORK_WIFI_H__ */
diff --git a/packaging/capi-network-wifi.spec b/packaging/capi-network-wifi.spec
new file mode 100644
index 0000000..6788e36
--- /dev/null
+++ b/packaging/capi-network-wifi.spec
@@ -0,0 +1,57 @@
+#sbs-git:api/wifi
+
+Name: capi-network-wifi
+Summary: Network Wi-Fi library in TIZEN C API
+Version: 0.1.1_2
+Release: 1
+Group: System/Network
+License: Apache License Version 2.0
+Source0: %{name}-%{version}.tar.gz
+BuildRequires: cmake
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(capi-base-common)
+BuildRequires: pkgconfig(network)
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+
+%description
+Network Wi-Fi library in Tizen C API
+
+%package devel
+Summary: Network Wi-Fi library in Tizen C API (Development)
+Group: System/Network
+Requires: %{name} = %{version}-%{release}
+
+%description devel
+Network Wi-Fi library in Tizen C API (Development)
+
+
+%prep
+%setup -q
+
+
+%build
+MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
+cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
+
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+%make_install
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+
+%files
+%{_libdir}/libcapi-network-wifi.so.*
+
+%files devel
+%{_includedir}/network/*.h
+%{_libdir}/pkgconfig/*.pc
+%{_libdir}/libcapi-network-wifi.so
diff --git a/src/libnetwork.c b/src/libnetwork.c
new file mode 100755
index 0000000..86b11b5
--- /dev/null
+++ b/src/libnetwork.c
@@ -0,0 +1,668 @@
+/*
+ * Copyright (c) 2011 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 <string.h>
+#include <ctype.h>
+#include <glib.h>
+#include "net_wifi_private.h"
+
+static GSList *ap_handle_list = NULL;
+
+struct _wifi_cb_s {
+ wifi_device_state_changed_cb device_state_cb;
+ void *device_state_user_data;
+ wifi_scan_finished_cb bg_scan_cb;
+ void *bg_scan_user_data;
+ wifi_scan_finished_cb scan_request_cb;
+ void *scan_request_user_data;
+ wifi_connection_state_changed_cb connection_state_cb;
+ void *connection_state_user_data;
+};
+
+struct _profile_list_s {
+ int count;
+ net_profile_info_t *profiles;
+};
+
+static struct _wifi_cb_s wifi_callbacks = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+static struct _profile_list_s profile_iterator = {0, NULL};
+
+
+static void __libnet_clear_profile_list(struct _profile_list_s *profile_list)
+{
+ if (profile_list->count > 0)
+ g_free(profile_list->profiles);
+
+ profile_list->count = 0;
+ profile_list->profiles = NULL;
+}
+
+static void __libnet_update_profile_iterator(void)
+{
+ struct _profile_list_s wifi_profiles = {0, NULL};
+
+ __libnet_clear_profile_list(&profile_iterator);
+
+ net_get_profile_list(NET_DEVICE_WIFI, &wifi_profiles.profiles, &wifi_profiles.count);
+ WIFI_LOG(WIFI_INFO, "Wifi profile count : %d\n", wifi_profiles.count);
+
+ if (wifi_profiles.count == 0)
+ return;
+
+ profile_iterator.count = wifi_profiles.count;
+ profile_iterator.profiles = wifi_profiles.profiles;
+}
+
+static void __libnet_convert_profile_info_to_wifi_info(net_wifi_connection_info_t *wifi_info,
+ net_profile_info_t *ap_info)
+{
+ g_strlcpy(wifi_info->essid, ap_info->ProfileInfo.Wlan.essid, NET_WLAN_ESSID_LEN+1);
+ wifi_info->wlan_mode = ap_info->ProfileInfo.Wlan.wlan_mode;
+ memcpy(&wifi_info->security_info, &ap_info->ProfileInfo.Wlan.security_info, sizeof(wlan_security_info_t));
+}
+
+static int __libnet_connect_with_wifi_info(net_profile_info_t *ap_info)
+{
+ net_wifi_connection_info_t wifi_info;
+ memset(&wifi_info, 0, sizeof(net_wifi_connection_info_t));
+
+ __libnet_convert_profile_info_to_wifi_info(&wifi_info, ap_info);
+
+ if (net_open_connection_with_wifi_info(&wifi_info) != NET_ERR_NONE)
+ return WIFI_ERROR_OPERATION_FAILED;
+
+ return WIFI_ERROR_NONE;
+}
+
+static void __libnet_state_changed_cb(char *profile_name, net_profile_info_t *profile_info,
+ wifi_error_e error, wifi_connection_state_e state, bool is_requested)
+{
+ if (profile_name == NULL)
+ return;
+
+ if (profile_info == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Error!! Profile info not found! : %s\n", profile_name);
+ return;
+ }
+
+ ap_handle_list = g_slist_append(ap_handle_list, (wifi_ap_h)profile_info);
+
+ if (wifi_callbacks.connection_state_cb)
+ wifi_callbacks.connection_state_cb(error, state, (wifi_ap_h)profile_info,
+ is_requested, wifi_callbacks.connection_state_user_data);
+
+ ap_handle_list = g_slist_remove(ap_handle_list, (wifi_ap_h)profile_info);
+}
+
+static void __libnet_power_on_off_cb(net_event_info_t *event_cb, bool is_requested)
+{
+ if (wifi_callbacks.device_state_cb == NULL)
+ return;
+
+ wifi_error_e error_code = WIFI_ERROR_NONE;
+ wifi_device_state_e state;
+ net_wifi_state_t *wifi_state = (net_wifi_state_t*)event_cb->Data;
+
+ if (event_cb->Error == NET_ERR_NONE &&
+ event_cb->Datalength == sizeof(net_wifi_state_t)) {
+
+ if (*wifi_state == WIFI_ON) {
+ WIFI_LOG(WIFI_INFO, "Wi-Fi State : Power ON\n");
+ state = WIFI_DEVICE_STATE_ACTIVATED;
+ } else if (*wifi_state == WIFI_OFF) {
+ WIFI_LOG(WIFI_INFO, "Wi-Fi State : Power OFF\n");
+ state = WIFI_DEVICE_STATE_DEACTIVATED;
+ } else {
+ WIFI_LOG(WIFI_INFO, "Wi-Fi State : Unknown\n");
+ error_code = WIFI_ERROR_OPERATION_FAILED;
+ state = WIFI_DEVICE_STATE_DEACTIVATED;
+ }
+ } else {
+ WIFI_LOG(WIFI_ERROR, "Wi-Fi Power on/off request failed! Error [%d]\n", event_cb->Error);
+ error_code = WIFI_ERROR_OPERATION_FAILED;
+ state = WIFI_DEVICE_STATE_DEACTIVATED;
+ }
+
+ wifi_callbacks.device_state_cb(error_code, state, is_requested, wifi_callbacks.device_state_user_data);
+}
+
+static void __libnet_scan_cb(net_event_info_t *event_cb, bool is_requested)
+{
+ wifi_error_e error_code = WIFI_ERROR_NONE;
+
+ if (event_cb->Error != NET_ERR_NONE) {
+ WIFI_LOG(WIFI_ERROR, "Scan failed!, Error [%d]\n", event_cb->Error);
+ error_code = WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ if (wifi_callbacks.scan_request_cb) {
+ wifi_callbacks.scan_request_cb(error_code, wifi_callbacks.scan_request_user_data);
+ wifi_callbacks.scan_request_cb = NULL;
+ wifi_callbacks.scan_request_user_data = NULL;
+ return;
+ }
+
+ if (wifi_callbacks.bg_scan_cb != NULL)
+ wifi_callbacks.bg_scan_cb(error_code, wifi_callbacks.bg_scan_user_data);
+}
+
+static void __libnet_evt_cb(net_event_info_t *event_cb, void *user_data)
+{
+ bool is_requested = false;
+ net_profile_info_t *prof_info_p = NULL;
+ net_profile_info_t prof_info;
+
+ switch (event_cb->Event) {
+ case NET_EVENT_OPEN_RSP:
+ case NET_EVENT_WIFI_WPS_RSP:
+ is_requested = true;
+ case NET_EVENT_OPEN_IND:
+ if (strstr(event_cb->ProfileName, "/wifi_") == NULL) return;
+
+ WIFI_LOG(WIFI_INFO,
+ "Received ACTIVATION(Open RSP/IND) response: %d \n", event_cb->Error);
+
+ switch (event_cb->Error) {
+ case NET_ERR_NONE:
+ WIFI_LOG(WIFI_INFO, "Activation succeeded\n");
+
+ if (event_cb->Datalength == sizeof(net_profile_info_t))
+ prof_info_p = (net_profile_info_t*)event_cb->Data;
+
+ __libnet_state_changed_cb(event_cb->ProfileName, prof_info_p,
+ WIFI_ERROR_NONE,
+ WIFI_CONNECTION_STATE_CONNECTED,
+ is_requested);
+ return;
+ case NET_ERR_TIME_OUT:
+ WIFI_LOG(WIFI_ERROR, "Request time out!\n");
+ break;
+ case NET_ERR_OPERATION_ABORTED:
+ WIFI_LOG(WIFI_ERROR, "Connction is aborted!\n");
+ break;
+ case NET_ERR_UNKNOWN_METHOD:
+ WIFI_LOG(WIFI_ERROR, "Method not found!\n");
+ break;
+ case NET_ERR_UNKNOWN:
+ WIFI_LOG(WIFI_ERROR, "Activation Failed!\n");
+ break;
+ default:
+ WIFI_LOG(WIFI_ERROR, "Unknown Error!\n");
+ break;
+ }
+
+ if (net_get_profile_info(event_cb->ProfileName, &prof_info) == NET_ERR_NONE)
+ __libnet_state_changed_cb(event_cb->ProfileName, &prof_info,
+ WIFI_ERROR_OPERATION_FAILED,
+ WIFI_CONNECTION_STATE_DISCONNECTED,
+ is_requested);
+ else
+ __libnet_state_changed_cb(event_cb->ProfileName, NULL,
+ WIFI_ERROR_OPERATION_FAILED,
+ WIFI_CONNECTION_STATE_DISCONNECTED,
+ is_requested);
+
+ break;
+ case NET_EVENT_CLOSE_RSP:
+ is_requested = true;
+ case NET_EVENT_CLOSE_IND:
+ if (strstr(event_cb->ProfileName, "/wifi_") == NULL) return;
+
+ WIFI_LOG(WIFI_INFO, "Got Close RSP/IND\n");
+
+ switch (event_cb->Error) {
+ case NET_ERR_NONE:
+ /* Successful PDP Deactivation */
+ WIFI_LOG(WIFI_INFO, "Deactivation succeeded!\n");
+ if (net_get_profile_info(event_cb->ProfileName, &prof_info) == NET_ERR_NONE)
+ __libnet_state_changed_cb(event_cb->ProfileName, &prof_info,
+ WIFI_ERROR_NONE,
+ WIFI_CONNECTION_STATE_DISCONNECTED,
+ is_requested);
+ else
+ __libnet_state_changed_cb(event_cb->ProfileName, NULL,
+ WIFI_ERROR_NONE,
+ WIFI_CONNECTION_STATE_DISCONNECTED,
+ is_requested);
+ return;
+ case NET_ERR_TIME_OUT:
+ WIFI_LOG(WIFI_ERROR, "Request time out!\n");
+ break;
+ case NET_ERR_IN_PROGRESS:
+ WIFI_LOG(WIFI_ERROR, "Disconncting is in progress!\n");
+ break;
+ case NET_ERR_OPERATION_ABORTED:
+ WIFI_LOG(WIFI_ERROR, "Disconnction is aborted!\n");
+ break;
+ case NET_ERR_UNKNOWN_METHOD:
+ WIFI_LOG(WIFI_ERROR, "Service not found!\n");
+ break;
+ case NET_ERR_UNKNOWN:
+ WIFI_LOG(WIFI_ERROR, "Deactivation Failed!\n");
+ break;
+ default:
+ WIFI_LOG(WIFI_ERROR, "Unknown Error!\n");
+ break;
+ }
+
+ if (net_get_profile_info(event_cb->ProfileName, &prof_info) == NET_ERR_NONE)
+ __libnet_state_changed_cb(event_cb->ProfileName, &prof_info,
+ WIFI_ERROR_OPERATION_FAILED,
+ WIFI_CONNECTION_STATE_DISCONNECTED,
+ is_requested);
+ else
+ __libnet_state_changed_cb(event_cb->ProfileName, NULL,
+ WIFI_ERROR_OPERATION_FAILED,
+ WIFI_CONNECTION_STATE_DISCONNECTED,
+ is_requested);
+
+ break;
+ case NET_EVENT_NET_STATE_IND:
+ if (strstr(event_cb->ProfileName, "/wifi_") == NULL) return;
+
+ WIFI_LOG(WIFI_INFO, "Got State changed IND\n");
+ net_state_type_t *profile_state = (net_state_type_t*)event_cb->Data;
+
+ if (event_cb->Error == NET_ERR_NONE &&
+ event_cb->Datalength == sizeof(net_state_type_t)) {
+ switch (*profile_state) {
+ case NET_STATE_TYPE_ASSOCIATION:
+ WIFI_LOG(WIFI_INFO,
+ "Profile State : Association, profile name : %s\n",
+ event_cb->ProfileName);
+ break;
+ case NET_STATE_TYPE_CONFIGURATION:
+ WIFI_LOG(WIFI_INFO,
+ "Profile State : Configuration, profile name : %s\n",
+ event_cb->ProfileName);
+ break;
+ case NET_STATE_TYPE_IDLE:
+ case NET_STATE_TYPE_FAILURE:
+ case NET_STATE_TYPE_READY:
+ case NET_STATE_TYPE_ONLINE:
+ case NET_STATE_TYPE_DISCONNECT:
+ case NET_STATE_TYPE_UNKNOWN:
+ default:
+ WIFI_LOG(WIFI_INFO,
+ "Profile State : %d, profile name : %s\n", *profile_state,
+ event_cb->ProfileName);
+ return;
+ }
+
+ if (net_get_profile_info(event_cb->ProfileName, &prof_info) == NET_ERR_NONE)
+ __libnet_state_changed_cb(event_cb->ProfileName, &prof_info,
+ WIFI_ERROR_NONE,
+ WIFI_CONNECTION_STATE_CONNECTING,
+ is_requested);
+ else
+ __libnet_state_changed_cb(event_cb->ProfileName, NULL,
+ WIFI_ERROR_NONE,
+ WIFI_CONNECTION_STATE_CONNECTING,
+ is_requested);
+ }
+
+ break;
+ case NET_EVENT_WIFI_SCAN_RSP:
+ case NET_EVENT_WIFI_SCAN_IND:
+ WIFI_LOG(WIFI_ERROR, "Got wifi scan IND\n");
+ __libnet_scan_cb(event_cb, is_requested);
+ break;
+ case NET_EVENT_WIFI_POWER_RSP:
+ is_requested = true;
+ case NET_EVENT_WIFI_POWER_IND:
+ WIFI_LOG(WIFI_ERROR, "Got wifi power IND\n");
+ __libnet_power_on_off_cb(event_cb, is_requested);
+ break;
+ default :
+ WIFI_LOG(WIFI_ERROR, "Error! Unknown Event\n\n");
+ }
+}
+
+bool _wifi_libnet_init(void)
+{
+ int rv;
+
+ rv = net_register_client_ext((net_event_cb_t)__libnet_evt_cb, NET_DEVICE_WIFI, NULL);
+ if (rv != NET_ERR_NONE)
+ return false;
+
+ return true;
+}
+
+bool _wifi_libnet_deinit(void)
+{
+ if (net_deregister_client_ext(NET_DEVICE_WIFI) != NET_ERR_NONE)
+ return false;
+
+ __libnet_clear_profile_list(&profile_iterator);
+ g_slist_free_full(ap_handle_list, g_free);
+ memset(&wifi_callbacks, 0, sizeof(struct _wifi_cb_s));
+
+ return true;
+}
+
+int _wifi_activate(void)
+{
+ int rv;
+
+ rv = net_wifi_power_on();
+ if (rv == NET_ERR_NONE)
+ return WIFI_ERROR_NONE;
+ else if (rv == NET_ERR_INVALID_OPERATION)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ return WIFI_ERROR_OPERATION_FAILED;
+}
+
+int _wifi_deactivate(void)
+{
+ int rv;
+
+ rv = net_wifi_power_off();
+ if (rv == NET_ERR_NONE)
+ return WIFI_ERROR_NONE;
+ else if (rv == NET_ERR_INVALID_OPERATION)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ return WIFI_ERROR_OPERATION_FAILED;
+}
+
+bool _wifi_libnet_check_ap_validity(wifi_ap_h ap_h)
+{
+ GSList *list;
+ int i = 0;
+
+ for (list = ap_handle_list; list; list = list->next)
+ if (ap_h == list->data) return true;
+
+ for (;i < profile_iterator.count;i++)
+ if (ap_h == &profile_iterator.profiles[i]) return true;
+
+ return false;
+}
+
+void _wifi_libnet_add_to_ap_list(wifi_ap_h ap_h)
+{
+ ap_handle_list = g_slist_append(ap_handle_list, ap_h);
+}
+
+void _wifi_libnet_remove_from_ap_list(wifi_ap_h ap_h)
+{
+ ap_handle_list = g_slist_remove(ap_handle_list, ap_h);
+ g_free(ap_h);
+}
+
+bool _wifi_libnet_check_profile_name_validity(const char *profile_name)
+{
+ const char *profile_header = "/net/connman/service/wifi_";
+ int i = 0;
+ int string_len = 0;
+
+ if (profile_name == NULL || strlen(profile_name) <= strlen(profile_header)) {
+ WIFI_LOG(WIFI_ERROR, "Error!!! Profile name is invalid\n");
+ return false;
+ }
+
+ string_len = strlen(profile_name);
+
+ if (strncmp(profile_header, profile_name, strlen(profile_header)) == 0) {
+ for (;i < string_len;i++) {
+ if (isgraph(profile_name[i]) == 0) {
+ WIFI_LOG(WIFI_ERROR, "Error!!! Profile name is invalid\n");
+ return false;
+ }
+ }
+ } else {
+ WIFI_LOG(WIFI_ERROR, "Error!!! Profile name is invalid\n");
+ return false;
+ }
+
+ return NET_ERR_NONE;
+}
+
+bool _wifi_libnet_get_wifi_state(wifi_connection_state_e* connection_state)
+{
+ net_wifi_state_t wlan_state = 0;
+ net_profile_name_t profile_name;
+
+ if (net_get_wifi_state(&wlan_state, &profile_name) != NET_ERR_NONE) {
+ WIFI_LOG(WIFI_ERROR, "Error!! net_get_wifi_state() failed.\n");
+ return false;
+ }
+
+ switch (wlan_state) {
+ case WIFI_OFF:
+ case WIFI_ON:
+ *connection_state = WIFI_CONNECTION_STATE_DISCONNECTED;
+ break;
+ case WIFI_CONNECTING:
+ *connection_state = WIFI_CONNECTION_STATE_CONNECTING;
+ break;
+ case WIFI_CONNECTED:
+ *connection_state = WIFI_CONNECTION_STATE_CONNECTED;
+ break;
+ case WIFI_DISCONNECTING:
+ *connection_state = WIFI_CONNECTION_STATE_DISCONNECTING;
+ break;
+ default :
+ WIFI_LOG(WIFI_ERROR, "Error!! Unknown state\n");
+ return false;
+ }
+
+ return true;
+}
+
+int _wifi_libnet_get_intf_name(char** name)
+{
+ if (profile_iterator.count == 0)
+ __libnet_update_profile_iterator();
+
+ if (profile_iterator.count == 0) {
+ WIFI_LOG(WIFI_ERROR, "Error!! There is no AP\n");
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ *name = g_strdup(profile_iterator.profiles->ProfileInfo.Wlan.net_info.DevName);
+ if (*name == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_libnet_scan_request(wifi_scan_finished_cb callback, void* user_data)
+{
+ int rv;
+ rv = net_scan_wifi();
+
+ if (rv == NET_ERR_NONE) {
+ wifi_callbacks.scan_request_cb = callback;
+ wifi_callbacks.scan_request_user_data = user_data;
+ return WIFI_ERROR_NONE;
+ } else if (rv == NET_ERR_INVALID_OPERATION)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ return WIFI_ERROR_OPERATION_FAILED;
+}
+
+int _wifi_libnet_get_connected_profile(wifi_ap_h *ap)
+{
+ int i = 0;
+ wifi_ap_h ap_h = NULL;
+
+ __libnet_update_profile_iterator();
+
+ for (;i < profile_iterator.count;i++) {
+ if (profile_iterator.profiles[i].ProfileState == NET_STATE_TYPE_ONLINE ||
+ profile_iterator.profiles[i].ProfileState == NET_STATE_TYPE_READY) {
+ ap_h = (wifi_ap_h)(&profile_iterator.profiles[i]);
+ break;
+ }
+ }
+
+ if (ap_h == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Error!! There is no connected AP.\n");
+ return WIFI_ERROR_NO_CONNECTION;
+ }
+
+ *ap = g_try_malloc0(sizeof(net_profile_info_t));
+ if (*ap == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ memcpy(*ap, ap_h, sizeof(net_profile_info_t));
+
+ _wifi_libnet_add_to_ap_list(*ap);
+
+ return WIFI_ERROR_NONE;
+}
+
+bool _wifi_libnet_foreach_found_aps(wifi_found_ap_cb callback, void *user_data)
+{
+ int i = 0;
+ bool rv = true;
+
+ __libnet_update_profile_iterator();
+
+ if (profile_iterator.count == 0) {
+ WIFI_LOG(WIFI_INFO, "There is no APs.\n");
+ return true;
+ }
+
+ for (;i < profile_iterator.count;i++) {
+ rv = callback((wifi_ap_h)(&profile_iterator.profiles[i]), user_data);
+ if (rv == false) break;
+ }
+
+ return true;
+}
+
+int _wifi_libnet_open_profile(wifi_ap_h ap_h)
+{
+ net_profile_info_t *ap_info = ap_h;
+
+ if (ap_info->ProfileInfo.Wlan.security_info.sec_mode == WLAN_SEC_MODE_IEEE8021X)
+ return __libnet_connect_with_wifi_info(ap_info);
+ else if (_wifi_libnet_check_profile_name_validity(ap_info->ProfileName) == false)
+ return __libnet_connect_with_wifi_info(ap_info);
+ else if (net_open_connection_with_profile(ap_info->ProfileName) != NET_ERR_NONE)
+ return WIFI_ERROR_OPERATION_FAILED;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_libnet_close_profile(wifi_ap_h ap_h)
+{
+ net_profile_info_t *ap_info = ap_h;
+
+ if (net_close_connection(ap_info->ProfileName) != NET_ERR_NONE)
+ return WIFI_ERROR_OPERATION_FAILED;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_libnet_connect_with_wps(wifi_ap_h ap_h, wifi_wps_type_e type, const char *pin)
+{
+ net_profile_info_t *ap_info = ap_h;
+ net_wifi_wps_info_t wps_info;
+ memset(&wps_info, 0 , sizeof(net_wifi_wps_info_t));
+
+ if (type == WIFI_WPS_TYPE_PIN) {
+ wps_info.type = WIFI_WPS_PIN;
+ g_strlcpy(wps_info.pin, pin, NET_WLAN_MAX_WPSPIN_LEN+1);
+ } else
+ wps_info.type = WIFI_WPS_PBC;
+
+ if (net_wifi_enroll_wps(ap_info->ProfileName, &wps_info) != NET_ERR_NONE)
+ return WIFI_ERROR_OPERATION_FAILED;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_set_power_on_off_cb(wifi_device_state_changed_cb callback, void *user_data)
+{
+ if (wifi_callbacks.device_state_cb)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ wifi_callbacks.device_state_cb = callback;
+ wifi_callbacks.device_state_user_data = user_data;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_unset_power_on_off_cb(void)
+{
+ if (wifi_callbacks.device_state_cb == NULL)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ wifi_callbacks.device_state_cb = NULL;
+ wifi_callbacks.device_state_user_data = NULL;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_set_background_scan_cb(wifi_scan_finished_cb callback, void *user_data)
+{
+ if (wifi_callbacks.bg_scan_cb)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ wifi_callbacks.bg_scan_cb = callback;
+ wifi_callbacks.bg_scan_user_data = user_data;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_unset_background_scan_cb(void)
+{
+ if (wifi_callbacks.bg_scan_cb == NULL)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ wifi_callbacks.bg_scan_cb = NULL;
+ wifi_callbacks.bg_scan_user_data = NULL;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_set_connection_state_cb(wifi_connection_state_changed_cb callback, void *user_data)
+{
+ if (wifi_callbacks.connection_state_cb)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ wifi_callbacks.connection_state_cb = callback;
+ wifi_callbacks.connection_state_user_data = user_data;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_unset_connection_state_cb()
+{
+ if (wifi_callbacks.connection_state_cb == NULL)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ wifi_callbacks.connection_state_cb = NULL;
+ wifi_callbacks.connection_state_user_data = NULL;
+
+ return WIFI_ERROR_NONE;
+}
+
+int _wifi_update_ap_info(net_profile_info_t *ap_info)
+{
+ if (net_modify_profile(ap_info->ProfileName, ap_info) != NET_ERR_NONE)
+ return WIFI_ERROR_OPERATION_FAILED;
+
+ return WIFI_ERROR_NONE;
+}
+
+
diff --git a/src/net_wifi.c b/src/net_wifi.c
new file mode 100755
index 0000000..e36f429
--- /dev/null
+++ b/src/net_wifi.c
@@ -0,0 +1,352 @@
+/*
+ * Copyright (c) 2011 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 <string.h>
+#include <glib.h>
+#include <vconf/vconf.h>
+#include "net_wifi_private.h"
+
+static bool is_init = false;
+static wifi_rssi_level_changed_cb rssi_level_changed_cb = NULL;
+static void *rssi_level_changed_user_data = NULL;
+
+
+static void __rssi_level_changed_cb(keynode_t *node, void *user_data)
+{
+ int rssi_level = vconf_keynode_get_int(node);
+ rssi_level_changed_cb(rssi_level, rssi_level_changed_user_data);
+}
+
+int wifi_initialize(void)
+{
+ if (is_init) {
+ WIFI_LOG(WIFI_ERROR, "Already initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ if (_wifi_libnet_init() == false) {
+ WIFI_LOG(WIFI_ERROR, "Init failed!\n");
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ is_init = true;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_deinitialize(void)
+{
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ if (_wifi_libnet_deinit() == false) {
+ WIFI_LOG(WIFI_ERROR, "Deinit failed!\n");
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ is_init = false;
+ wifi_unset_rssi_level_changed_cb();
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_activate(void)
+{
+ int rv;
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ rv = _wifi_activate();
+ if (rv != WIFI_ERROR_NONE)
+ WIFI_LOG(WIFI_ERROR, "Error!! Wi-Fi Activation failed.\n");
+
+ return rv;
+}
+
+int wifi_deactivate(void)
+{
+ int rv;
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ rv = _wifi_deactivate();
+ if (rv != WIFI_ERROR_NONE)
+ WIFI_LOG(WIFI_ERROR, "Error!! Wi-Fi Deactivation failed.\n");
+
+ return rv;
+}
+
+int wifi_is_activated(bool* activated)
+{
+ int status = 0;
+
+ if (activated == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (!vconf_get_int(VCONFKEY_NETWORK_WIFI_STATE, &status)) {
+ WIFI_LOG(WIFI_INFO, "WiFi = %d\n", status);
+ if (status == VCONFKEY_NETWORK_WIFI_OFF)
+ *activated = false;
+ else
+ *activated = true;
+ } else {
+ WIFI_LOG(WIFI_ERROR, "vconf_get_int Failed = %d\n", status);
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_get_connection_state(wifi_connection_state_e* connection_state)
+{
+ if (connection_state == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (_wifi_libnet_get_wifi_state(connection_state) == false)
+ return WIFI_ERROR_OPERATION_FAILED;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_get_mac_address(char** mac_address)
+{
+ if (mac_address == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ *mac_address = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
+
+ if (*mac_address == NULL) {
+ WIFI_LOG(WIFI_ERROR, "vconf_get_str Failed\n");
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ WIFI_LOG(WIFI_INFO, "MAC Address %s\n", *mac_address);
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_get_network_interface_name(char** name)
+{
+ if (name == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ return _wifi_libnet_get_intf_name(name);
+}
+
+int wifi_scan(wifi_scan_finished_cb callback, void* user_data)
+{
+ int rv;
+
+ if (callback == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ rv = _wifi_libnet_scan_request(callback, user_data);
+ if (rv != WIFI_ERROR_NONE)
+ WIFI_LOG(WIFI_ERROR, "Error!! Wi-Fi scan failed.\n");
+
+ return rv;
+}
+
+int wifi_get_connected_ap(wifi_ap_h* ap)
+{
+ int rv;
+
+ if (ap == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ rv = _wifi_libnet_get_connected_profile(ap);
+ WIFI_LOG(WIFI_INFO, "Connected AP : %p, rv : %d\n", *ap, rv);
+
+ return rv;
+}
+
+int wifi_foreach_found_aps(wifi_found_ap_cb callback, void* user_data)
+{
+ if (callback == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (_wifi_libnet_foreach_found_aps(callback, user_data) == false)
+ return WIFI_ERROR_OPERATION_FAILED;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_connect(wifi_ap_h ap)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ return _wifi_libnet_open_profile(ap);
+}
+
+int wifi_disconnect(wifi_ap_h ap)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ return _wifi_libnet_close_profile(ap);
+}
+
+int wifi_connect_with_wps(wifi_ap_h ap, wifi_wps_type_e type, const char* pin)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (type != WIFI_WPS_TYPE_PBC && type != WIFI_WPS_TYPE_PIN) ||
+ (type == WIFI_WPS_TYPE_PIN && pin == NULL)) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ return _wifi_libnet_connect_with_wps(ap, type, pin);
+}
+
+int wifi_set_device_state_changed_cb(wifi_device_state_changed_cb callback, void* user_data)
+{
+ if (callback == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ return _wifi_set_power_on_off_cb(callback, user_data);
+}
+
+int wifi_unset_device_state_changed_cb(void)
+{
+ return _wifi_unset_power_on_off_cb();
+}
+
+int wifi_set_background_scan_cb(wifi_scan_finished_cb callback, void* user_data)
+{
+ if (callback == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ return _wifi_set_background_scan_cb(callback, user_data);
+}
+
+int wifi_unset_background_scan_cb(void)
+{
+ return _wifi_unset_background_scan_cb();
+}
+
+int wifi_set_connection_state_changed_cb(wifi_connection_state_changed_cb callback, void* user_data)
+{
+ if (callback == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (is_init == false) {
+ WIFI_LOG(WIFI_ERROR, "Not initialized\n");
+ return WIFI_ERROR_INVALID_OPERATION;
+ }
+
+ return _wifi_set_connection_state_cb(callback, user_data);
+}
+
+int wifi_unset_connection_state_changed_cb(void)
+{
+ return _wifi_unset_connection_state_cb();
+}
+
+int wifi_set_rssi_level_changed_cb(wifi_rssi_level_changed_cb callback, void* user_data)
+{
+ if (callback == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (rssi_level_changed_cb == NULL)
+ vconf_notify_key_changed(VCONFKEY_WIFI_STRENGTH, __rssi_level_changed_cb, NULL);
+ else
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ rssi_level_changed_cb = callback;
+ rssi_level_changed_user_data = user_data;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_unset_rssi_level_changed_cb(void)
+{
+ if (rssi_level_changed_cb != NULL)
+ vconf_ignore_key_changed(VCONFKEY_WIFI_STRENGTH, __rssi_level_changed_cb);
+ else
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ rssi_level_changed_cb = NULL;
+ rssi_level_changed_user_data = NULL;
+
+ return WIFI_ERROR_NONE;
+}
+
diff --git a/src/net_wifi_ap.c b/src/net_wifi_ap.c
new file mode 100755
index 0000000..474871e
--- /dev/null
+++ b/src/net_wifi_ap.c
@@ -0,0 +1,1071 @@
+/*
+ * Copyright (c) 2011 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 <string.h>
+#include <glib.h>
+#include "net_wifi_private.h"
+
+
+static char* __ap_convert_ip_to_string(net_addr_t *ip_addr)
+{
+ unsigned char *ipaddr = (unsigned char *)&ip_addr->Data.Ipv4.s_addr;
+
+ char *ipstr = g_try_malloc0(16);
+ if (ipstr == NULL)
+ return NULL;
+
+ snprintf(ipstr, 16, "%d.%d.%d.%d", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
+
+ return ipstr;
+}
+
+static void __wifi_init_ap(net_profile_info_t *profile_info, const char *essid)
+{
+ profile_info->profile_type = NET_DEVICE_WIFI;
+ profile_info->ProfileState = NET_STATE_TYPE_IDLE;
+ profile_info->ProfileInfo.Wlan.net_info.IpConfigType = NET_IP_CONFIG_TYPE_OFF;
+ profile_info->ProfileInfo.Wlan.net_info.ProxyMethod = NET_PROXY_TYPE_DIRECT;
+ profile_info->ProfileInfo.Wlan.wlan_mode = NETPM_WLAN_CONNMODE_AUTO;
+ profile_info->ProfileInfo.Wlan.security_info.sec_mode = WLAN_SEC_MODE_NONE;
+ profile_info->ProfileInfo.Wlan.security_info.enc_mode = WLAN_ENC_MODE_NONE;
+ g_strlcpy(profile_info->ProfileInfo.Wlan.essid, essid, NET_WLAN_ESSID_LEN+1);
+}
+
+/* Wi-Fi AP module ********************************************************************************/
+
+int wifi_ap_create(const char* essid, wifi_ap_h* ap)
+{
+ if (essid == NULL || ap == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *ap_info = g_try_malloc0(sizeof(net_profile_info_t));
+ if (ap_info == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ __wifi_init_ap(ap_info, essid);
+
+ _wifi_libnet_add_to_ap_list((wifi_ap_h)ap_info);
+ *ap = (wifi_ap_h)ap_info;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_destroy(wifi_ap_h ap)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ _wifi_libnet_remove_from_ap_list(ap);
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_clone(wifi_ap_h* cloned_ap, wifi_ap_h origin)
+{
+ if (_wifi_libnet_check_ap_validity(origin) == false || cloned_ap == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *ap_info = g_try_malloc0(sizeof(net_profile_info_t));
+ if (ap_info == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ memcpy(ap_info, origin, sizeof(net_profile_info_t));
+
+ _wifi_libnet_add_to_ap_list((wifi_ap_h)ap_info);
+ *cloned_ap = (wifi_ap_h)ap_info;
+
+ return WIFI_ERROR_NONE;
+}
+
+
+
+/* Wi-Fi network information module ***************************************************************/
+
+int wifi_ap_get_essid(wifi_ap_h ap, char** essid)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || essid == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *essid = g_strdup(profile_info->ProfileInfo.Wlan.essid);
+ if (*essid == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_bssid(wifi_ap_h ap, char** bssid)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || bssid == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *bssid = g_strdup(profile_info->ProfileInfo.Wlan.bssid);
+ if (*bssid == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_rssi(wifi_ap_h ap, int* rssi)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || rssi == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *rssi = (int)profile_info->ProfileInfo.Wlan.Strength;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_frequency(wifi_ap_h ap, int* frequency)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || frequency == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *frequency = (int)profile_info->ProfileInfo.Wlan.frequency;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_max_speed(wifi_ap_h ap, int* max_speed)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || max_speed == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *max_speed = (int)profile_info->ProfileInfo.Wlan.max_rate;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_is_favorite(wifi_ap_h ap, bool* favorite)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || favorite == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ if (profile_info->Favourite)
+ *favorite = true;
+ else
+ *favorite = false;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_connection_state(wifi_ap_h ap, wifi_connection_state_e* state)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || state == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (profile_info->ProfileState) {
+ case NET_STATE_TYPE_IDLE:
+ case NET_STATE_TYPE_FAILURE:
+ case NET_STATE_TYPE_DISCONNECT:
+ *state = WIFI_CONNECTION_STATE_DISCONNECTED;
+ break;
+ case NET_STATE_TYPE_ASSOCIATION:
+ case NET_STATE_TYPE_CONFIGURATION:
+ *state = WIFI_CONNECTION_STATE_CONNECTING;
+ break;
+ case NET_STATE_TYPE_READY:
+ case NET_STATE_TYPE_ONLINE:
+ *state = WIFI_CONNECTION_STATE_CONNECTED;
+ break;
+ default:
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_ip_config_type(wifi_ap_h ap, wifi_address_family_e address_family, wifi_ip_config_type_e* type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ type == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (profile_info->ProfileInfo.Wlan.net_info.IpConfigType) {
+ case NET_IP_CONFIG_TYPE_STATIC:
+ *type = WIFI_IP_CONFIG_TYPE_STATIC;
+ break;
+ case NET_IP_CONFIG_TYPE_DYNAMIC:
+ *type = WIFI_IP_CONFIG_TYPE_DYNAMIC;
+ break;
+ case NET_IP_CONFIG_TYPE_AUTO_IP:
+ *type = WIFI_IP_CONFIG_TYPE_AUTO;
+ break;
+ case NET_IP_CONFIG_TYPE_FIXED:
+ *type = WIFI_IP_CONFIG_TYPE_FIXED;
+ break;
+ case NET_IP_CONFIG_TYPE_OFF:
+ *type = WIFI_IP_CONFIG_TYPE_NONE;
+ break;
+ default:
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_ip_config_type(wifi_ap_h ap, wifi_address_family_e address_family, wifi_ip_config_type_e type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6)) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (type) {
+ case WIFI_IP_CONFIG_TYPE_STATIC:
+ profile_info->ProfileInfo.Wlan.net_info.IpConfigType = NET_IP_CONFIG_TYPE_STATIC;
+ break;
+ case WIFI_IP_CONFIG_TYPE_DYNAMIC:
+ profile_info->ProfileInfo.Wlan.net_info.IpConfigType = NET_IP_CONFIG_TYPE_DYNAMIC;
+ break;
+ case WIFI_IP_CONFIG_TYPE_AUTO:
+ profile_info->ProfileInfo.Wlan.net_info.IpConfigType = NET_IP_CONFIG_TYPE_AUTO_IP;
+ break;
+ case WIFI_IP_CONFIG_TYPE_FIXED:
+ profile_info->ProfileInfo.Wlan.net_info.IpConfigType = NET_IP_CONFIG_TYPE_FIXED;
+ break;
+ case WIFI_IP_CONFIG_TYPE_NONE:
+ profile_info->ProfileInfo.Wlan.net_info.IpConfigType = NET_IP_CONFIG_TYPE_OFF;
+ break;
+ default:
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (_wifi_libnet_check_profile_name_validity(profile_info->ProfileName) == false)
+ return WIFI_ERROR_NONE;
+
+ return _wifi_update_ap_info(profile_info);
+}
+
+int wifi_ap_get_ip_address(wifi_ap_h ap, wifi_address_family_e address_family, char** ip_address)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ ip_address == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *ip_address = __ap_convert_ip_to_string(&profile_info->ProfileInfo.Wlan.net_info.IpAddr);
+ if (*ip_address == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_ip_address(wifi_ap_h ap, wifi_address_family_e address_family, const char* ip_address)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ ip_address == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (inet_aton(ip_address, &(profile_info->ProfileInfo.Wlan.net_info.IpAddr.Data.Ipv4)) == 0)
+ return WIFI_ERROR_INVALID_PARAMETER;
+
+ if (_wifi_libnet_check_profile_name_validity(profile_info->ProfileName) == false)
+ return WIFI_ERROR_NONE;
+
+ return _wifi_update_ap_info(profile_info);
+}
+
+int wifi_ap_get_subnet_mask(wifi_ap_h ap, wifi_address_family_e address_family, char** subnet_mask)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ subnet_mask == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *subnet_mask = __ap_convert_ip_to_string(&profile_info->ProfileInfo.Wlan.net_info.SubnetMask);
+ if (*subnet_mask == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_subnet_mask(wifi_ap_h ap, wifi_address_family_e address_family, const char* subnet_mask)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ subnet_mask == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (inet_aton(subnet_mask, &(profile_info->ProfileInfo.Wlan.net_info.SubnetMask.Data.Ipv4)) == 0)
+ return WIFI_ERROR_INVALID_PARAMETER;
+
+ if (_wifi_libnet_check_profile_name_validity(profile_info->ProfileName) == false)
+ return WIFI_ERROR_NONE;
+
+ return _wifi_update_ap_info(profile_info);
+}
+
+int wifi_ap_get_gateway_address(wifi_ap_h ap, wifi_address_family_e address_family, char** gateway_address)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ gateway_address == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *gateway_address = __ap_convert_ip_to_string(&profile_info->ProfileInfo.Wlan.net_info.GatewayAddr);
+ if (*gateway_address == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_gateway_address(wifi_ap_h ap, wifi_address_family_e address_family, const char* gateway_address)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ gateway_address == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (inet_aton(gateway_address, &(profile_info->ProfileInfo.Wlan.net_info.GatewayAddr.Data.Ipv4)) == 0)
+ return WIFI_ERROR_INVALID_PARAMETER;
+
+ if (_wifi_libnet_check_profile_name_validity(profile_info->ProfileName) == false)
+ return WIFI_ERROR_NONE;
+
+ return _wifi_update_ap_info(profile_info);
+}
+
+int wifi_ap_get_proxy_address(wifi_ap_h ap, wifi_address_family_e address_family, char** proxy_address)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ proxy_address == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ *proxy_address = g_strdup(profile_info->ProfileInfo.Wlan.net_info.ProxyAddr);
+ if (*proxy_address == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_proxy_address(wifi_ap_h ap, wifi_address_family_e address_family, const char* proxy_address)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ proxy_address == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ g_strlcpy(profile_info->ProfileInfo.Wlan.net_info.ProxyAddr, proxy_address, NET_PROXY_LEN_MAX+1);
+
+ if (_wifi_libnet_check_profile_name_validity(profile_info->ProfileName) == false)
+ return WIFI_ERROR_NONE;
+
+ return _wifi_update_ap_info(profile_info);
+}
+
+int wifi_ap_get_proxy_type(wifi_ap_h ap, wifi_proxy_type_e* type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || type == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (profile_info->ProfileInfo.Wlan.net_info.ProxyMethod) {
+ case NET_PROXY_TYPE_DIRECT:
+ *type = WIFI_PROXY_TYPE_DIRECT;
+ break;
+ case NET_PROXY_TYPE_AUTO:
+ *type = WIFI_PROXY_TYPE_AUTO;
+ break;
+ case NET_PROXY_TYPE_MANUAL:
+ *type = WIFI_PROXY_TYPE_MANUAL;
+ break;
+ case NET_PROXY_TYPE_UNKNOWN:
+ default:
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_proxy_type(wifi_ap_h ap, wifi_proxy_type_e proxy_type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (proxy_type) {
+ case WIFI_PROXY_TYPE_DIRECT:
+ profile_info->ProfileInfo.Wlan.net_info.ProxyMethod = NET_PROXY_TYPE_DIRECT;
+ break;
+ case WIFI_PROXY_TYPE_AUTO:
+ profile_info->ProfileInfo.Wlan.net_info.ProxyMethod = NET_PROXY_TYPE_AUTO;
+ break;
+ case WIFI_PROXY_TYPE_MANUAL:
+ profile_info->ProfileInfo.Wlan.net_info.ProxyMethod = NET_PROXY_TYPE_MANUAL;
+ break;
+ default:
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (_wifi_libnet_check_profile_name_validity(profile_info->ProfileName) == false)
+ return WIFI_ERROR_NONE;
+
+ return _wifi_update_ap_info(profile_info);
+}
+
+int wifi_ap_get_dns_address(wifi_ap_h ap, int order, wifi_address_family_e address_family, char** dns_address)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ dns_address == NULL ||
+ order <= 0 ||
+ order > NET_DNS_ADDR_MAX) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ *dns_address = __ap_convert_ip_to_string(&profile_info->ProfileInfo.Wlan.net_info.DnsAddr[order-1]);
+ if (*dns_address == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_dns_address(wifi_ap_h ap, int order, wifi_address_family_e address_family, const char* dns_address)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false ||
+ (address_family != WIFI_ADDRESS_FAMILY_IPV4 &&
+ address_family != WIFI_ADDRESS_FAMILY_IPV6) ||
+ dns_address == NULL ||
+ order <= 0 ||
+ order > NET_DNS_ADDR_MAX) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ if (address_family == WIFI_ADDRESS_FAMILY_IPV6) {
+ WIFI_LOG(WIFI_ERROR, "Not supported yet\n");
+ return WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (inet_aton(dns_address, &(profile_info->ProfileInfo.Wlan.net_info.DnsAddr[order-1].Data.Ipv4)) == 0)
+ return WIFI_ERROR_INVALID_PARAMETER;
+
+ if (_wifi_libnet_check_profile_name_validity(profile_info->ProfileName) == false)
+ return WIFI_ERROR_NONE;
+
+ return _wifi_update_ap_info(profile_info);
+}
+
+
+
+/* Wi-Fi security information module **************************************************************/
+
+int wifi_ap_get_security_type(wifi_ap_h ap, wifi_security_type_e* type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || type == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (profile_info->ProfileInfo.Wlan.security_info.sec_mode) {
+ case WLAN_SEC_MODE_NONE:
+ *type = WIFI_SECURITY_TYPE_NONE;
+ break;
+ case WLAN_SEC_MODE_WEP:
+ *type = WIFI_SECURITY_TYPE_WEP;
+ break;
+ case WLAN_SEC_MODE_IEEE8021X:
+ *type = WIFI_SECURITY_TYPE_EAP;
+ break;
+ case WLAN_SEC_MODE_WPA_PSK:
+ *type = WIFI_SECURITY_TYPE_WPA_PSK;
+ break;
+ case WLAN_SEC_MODE_WPA2_PSK:
+ *type = WIFI_SECURITY_TYPE_WPA2_PSK;
+ break;
+ default:
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_security_type(wifi_ap_h ap, wifi_security_type_e type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (type) {
+ case WIFI_SECURITY_TYPE_NONE:
+ profile_info->ProfileInfo.Wlan.security_info.sec_mode = WLAN_SEC_MODE_NONE;
+ break;
+ case WIFI_SECURITY_TYPE_WEP:
+ profile_info->ProfileInfo.Wlan.security_info.sec_mode = WLAN_SEC_MODE_WEP;
+ break;
+ case WIFI_SECURITY_TYPE_EAP:
+ profile_info->ProfileInfo.Wlan.security_info.sec_mode = WLAN_SEC_MODE_IEEE8021X;
+ break;
+ case WIFI_SECURITY_TYPE_WPA_PSK:
+ profile_info->ProfileInfo.Wlan.security_info.sec_mode = WLAN_SEC_MODE_WPA_PSK;
+ break;
+ case WIFI_SECURITY_TYPE_WPA2_PSK:
+ profile_info->ProfileInfo.Wlan.security_info.sec_mode = WLAN_SEC_MODE_WPA2_PSK;
+ break;
+ default:
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_encryption_type(wifi_ap_h ap, wifi_encryption_type_e* type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || type == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (profile_info->ProfileInfo.Wlan.security_info.enc_mode) {
+ case WLAN_ENC_MODE_NONE:
+ *type = WIFI_ENCRYPTION_TYPE_NONE;
+ break;
+ case WLAN_ENC_MODE_WEP:
+ *type = WIFI_ENCRYPTION_TYPE_WEP;
+ break;
+ case WLAN_ENC_MODE_TKIP:
+ *type = WIFI_ENCRYPTION_TYPE_TKIP;
+ break;
+ case WLAN_ENC_MODE_AES:
+ *type = WIFI_ENCRYPTION_TYPE_AES;
+ break;
+ case WLAN_ENC_MODE_TKIP_AES_MIXED:
+ *type = WIFI_ENCRYPTION_TYPE_TKIP_AES_MIXED;
+ break;
+ default:
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_encryption_type(wifi_ap_h ap, wifi_encryption_type_e type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (type) {
+ case WIFI_ENCRYPTION_TYPE_NONE:
+ profile_info->ProfileInfo.Wlan.security_info.enc_mode = WLAN_ENC_MODE_NONE;
+ break;
+ case WIFI_ENCRYPTION_TYPE_WEP:
+ profile_info->ProfileInfo.Wlan.security_info.enc_mode = WLAN_ENC_MODE_WEP;
+ break;
+ case WIFI_ENCRYPTION_TYPE_TKIP:
+ profile_info->ProfileInfo.Wlan.security_info.enc_mode = WLAN_ENC_MODE_TKIP;
+ break;
+ case WIFI_ENCRYPTION_TYPE_AES:
+ profile_info->ProfileInfo.Wlan.security_info.enc_mode = WLAN_ENC_MODE_AES;
+ break;
+ case WIFI_ENCRYPTION_TYPE_TKIP_AES_MIXED:
+ profile_info->ProfileInfo.Wlan.security_info.enc_mode = WLAN_ENC_MODE_TKIP_AES_MIXED;
+ break;
+ default:
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_is_passphrase_required(wifi_ap_h ap, bool* required)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || required == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ if (profile_info->ProfileInfo.Wlan.PassphraseRequired)
+ *required = true;
+ else
+ *required = false;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_passphrase(wifi_ap_h ap, const char* passphrase)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || passphrase == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ switch (profile_info->ProfileInfo.Wlan.security_info.sec_mode) {
+ case WLAN_SEC_MODE_WEP:
+ g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.wep.wepKey,
+ passphrase, NETPM_WLAN_MAX_WEP_KEY_LEN+1);
+ break;
+ case WLAN_SEC_MODE_WPA_PSK:
+ case WLAN_SEC_MODE_WPA2_PSK:
+ g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.psk.pskKey,
+ passphrase, NETPM_WLAN_MAX_PSK_PASSPHRASE_LEN+1);
+ break;
+ case WLAN_SEC_MODE_NONE:
+ case WLAN_SEC_MODE_IEEE8021X:
+ default:
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ if (_wifi_libnet_check_profile_name_validity(profile_info->ProfileName) == false)
+ return WIFI_ERROR_NONE;
+
+ return _wifi_update_ap_info(profile_info);
+}
+
+int wifi_ap_is_wps_supported(wifi_ap_h ap, bool* supported)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || supported == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+
+ if (profile_info->ProfileInfo.Wlan.security_info.wps_support)
+ *supported = true;
+ else
+ *supported = false;
+
+ return WIFI_ERROR_NONE;
+}
+
+
+
+/* Wi-Fi EAP module *******************************************************************************/
+
+int wifi_ap_set_eap_passphrase(wifi_ap_h ap, const char* user_name, const char* password)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || user_name == NULL || password == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.username,
+ user_name, NETPM_WLAN_USERNAME_LEN+1);
+ g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.password,
+ password, NETPM_WLAN_PASSWORD_LEN+1);
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_eap_ca_cert_file(wifi_ap_h ap, char** file)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || file == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ *file = g_strdup(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.ca_cert_filename);
+ if (*file == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_eap_ca_cert_file(wifi_ap_h ap, const char* file)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || file == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.ca_cert_filename,
+ file, NETPM_WLAN_CA_CERT_FILENAME_LEN+1);
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_eap_client_cert_file(wifi_ap_h ap, char** file)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || file == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ *file = g_strdup(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.client_cert_filename);
+ if (*file == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_eap_client_cert_file(wifi_ap_h ap, const char* file)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || file == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.client_cert_filename,
+ file, NETPM_WLAN_CLIENT_CERT_FILENAME_LEN+1);
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_eap_private_key_file(wifi_ap_h ap, char** file)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || file == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ *file = g_strdup(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.private_key_filename);
+ if (*file == NULL)
+ return WIFI_ERROR_OUT_OF_MEMORY;
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_eap_private_key_info(wifi_ap_h ap, const char* file, const char* password)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || file == NULL || password == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.private_key_filename,
+ file, NETPM_WLAN_PRIVATE_KEY_FILENAME_LEN+1);
+ g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.eap.private_key_passwd,
+ password, NETPM_WLAN_PRIVATE_KEY_PASSWD_LEN+1);
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_eap_type(wifi_ap_h ap, wifi_eap_type_e* type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || type == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ switch (profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_type) {
+ case WLAN_SEC_EAP_TYPE_PEAP:
+ *type = WIFI_EAP_TYPE_PEAP;
+ break;
+ case WLAN_SEC_EAP_TYPE_TLS:
+ *type = WIFI_EAP_TYPE_TLS;
+ break;
+ case WLAN_SEC_EAP_TYPE_TTLS:
+ *type = WIFI_EAP_TYPE_TTLS;
+ break;
+ case WLAN_SEC_EAP_TYPE_SIM:
+ *type = WIFI_EAP_TYPE_SIM;
+ break;
+ case WLAN_SEC_EAP_TYPE_AKA:
+ *type = WIFI_EAP_TYPE_AKA;
+ break;
+ default:
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_eap_type(wifi_ap_h ap, wifi_eap_type_e type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ switch (type) {
+ case WIFI_EAP_TYPE_PEAP:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_type = WLAN_SEC_EAP_TYPE_PEAP;
+ break;
+ case WIFI_EAP_TYPE_TLS:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_type = WLAN_SEC_EAP_TYPE_TLS;
+ break;
+ case WIFI_EAP_TYPE_TTLS:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_type = WLAN_SEC_EAP_TYPE_TTLS;
+ break;
+ case WIFI_EAP_TYPE_SIM:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_type = WLAN_SEC_EAP_TYPE_SIM;
+ break;
+ case WIFI_EAP_TYPE_AKA:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_type = WLAN_SEC_EAP_TYPE_AKA;
+ break;
+ default:
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_get_eap_auth_type(wifi_ap_h ap, wifi_eap_auth_type_e* type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false || type == NULL) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ switch (profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_auth) {
+ case WLAN_SEC_EAP_AUTH_NONE:
+ *type = WIFI_EAP_AUTH_TYPE_NONE;
+ break;
+ case WLAN_SEC_EAP_AUTH_PAP:
+ *type = WIFI_EAP_AUTH_TYPE_PAP;
+ break;
+ case WLAN_SEC_EAP_AUTH_MSCHAP:
+ *type = WIFI_EAP_AUTH_TYPE_MSCHAP;
+ break;
+ case WLAN_SEC_EAP_AUTH_MSCHAPV2:
+ *type = WIFI_EAP_AUTH_TYPE_MSCHAPV2;
+ break;
+ case WLAN_SEC_EAP_AUTH_GTC:
+ *type = WIFI_EAP_AUTH_TYPE_GTC;
+ break;
+ case WLAN_SEC_EAP_AUTH_MD5:
+ *type = WIFI_EAP_AUTH_TYPE_MD5;
+ break;
+ default:
+ return WIFI_ERROR_OPERATION_FAILED;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+int wifi_ap_set_eap_auth_type(wifi_ap_h ap, wifi_eap_auth_type_e type)
+{
+ if (_wifi_libnet_check_ap_validity(ap) == false) {
+ WIFI_LOG(WIFI_ERROR, "Wrong Parameter Passed\n");
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ net_profile_info_t *profile_info = ap;
+ if (profile_info->ProfileInfo.Wlan.security_info.sec_mode != WLAN_SEC_MODE_IEEE8021X)
+ return WIFI_ERROR_INVALID_OPERATION;
+
+ switch (type) {
+ case WIFI_EAP_AUTH_TYPE_NONE:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_auth = WLAN_SEC_EAP_AUTH_NONE;
+ break;
+ case WIFI_EAP_AUTH_TYPE_PAP:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_auth = WLAN_SEC_EAP_AUTH_PAP;
+ break;
+ case WIFI_EAP_AUTH_TYPE_MSCHAP:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_auth = WLAN_SEC_EAP_AUTH_MSCHAP;
+ break;
+ case WIFI_EAP_AUTH_TYPE_MSCHAPV2:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_auth = WLAN_SEC_EAP_AUTH_MSCHAPV2;
+ break;
+ case WIFI_EAP_AUTH_TYPE_GTC:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_auth = WLAN_SEC_EAP_AUTH_GTC;
+ break;
+ case WIFI_EAP_AUTH_TYPE_MD5:
+ profile_info->ProfileInfo.Wlan.security_info.authentication.eap.eap_auth = WLAN_SEC_EAP_AUTH_MD5;
+ break;
+ default:
+ return WIFI_ERROR_INVALID_PARAMETER;
+ }
+
+ return WIFI_ERROR_NONE;
+}
+
+
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..7715cac
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,17 @@
+SET(fw_test "${fw_name}-test")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(${fw_test} REQUIRED glib-2.0)
+FOREACH(flag ${${fw_test}_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall")
+
+aux_source_directory(. sources)
+FOREACH(src ${sources})
+ GET_FILENAME_COMPONENT(src_name ${src} NAME_WE)
+ MESSAGE("${src_name}")
+ ADD_EXECUTABLE(${src_name} ${src})
+ TARGET_LINK_LIBRARIES(${src_name} ${fw_name} ${${fw_test}_LDFLAGS})
+ENDFOREACH()
diff --git a/test/wifi_test.c b/test/wifi_test.c
new file mode 100644
index 0000000..2a6f098
--- /dev/null
+++ b/test/wifi_test.c
@@ -0,0 +1,540 @@
+/*
+ * Copyright (c) 2011 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 <stdio.h>
+#include <stdlib.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/un.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <signal.h>
+#include "assert.h"
+#include "glib.h"
+#include <wifi.h>
+#include <tizen_error.h>
+
+
+gboolean test_thread(GIOChannel *source, GIOCondition condition, gpointer data);
+
+
+static void __test_device_state_callback(wifi_error_e error_code, wifi_device_state_e state, bool is_requested, void* user_data)
+{
+ printf("Device state changed callback, error code : %d, requested : %d", error_code, is_requested);
+
+ if (state == WIFI_DEVICE_STATE_ACTIVATED)
+ printf(", state : Activated\n");
+ else
+ printf(", state : Deactivated\n");
+}
+
+static void __test_bg_scan_completed_callback(wifi_error_e error_code, void* user_data)
+{
+ printf("Background Scan Completed, error code : %d\n", error_code);
+}
+
+static void __test_scan_request_callback(wifi_error_e error_code, void* user_data)
+{
+ printf("Scan Completed from scan request, error code : %d\n", error_code);
+}
+
+static void __test_connection_state_callback(wifi_error_e error_code, wifi_connection_state_e state, wifi_ap_h ap, bool is_requested, void* user_data)
+{
+ int rv = 0;
+ char *ap_name = NULL;
+
+ printf("Connection state changed callback, error code : %d, requested : %d", error_code, is_requested);
+
+ switch (state) {
+ case WIFI_CONNECTION_STATE_CONNECTING:
+ printf(", state : Connecting");
+ break;
+ case WIFI_CONNECTION_STATE_CONNECTED:
+ printf(", state : Connected");
+ break;
+ case WIFI_CONNECTION_STATE_DISCONNECTING:
+ printf(", state : Disconnecting");
+ break;
+ case WIFI_CONNECTION_STATE_DISCONNECTED:
+ printf(", state : Disconnected");
+ break;
+ }
+
+ rv = wifi_ap_get_essid(ap, &ap_name);
+ if (rv != WIFI_ERROR_NONE)
+ printf(", Fail to get AP name [%d]\n", rv);
+ else {
+ printf(", AP name : %s\n", ap_name);
+ g_free(ap_name);
+ }
+}
+
+static void __test_rssi_level_callback(wifi_rssi_level_e rssi_level, void* user_data)
+{
+ printf("RSSI level changed callback, level = %d\n", rssi_level);
+}
+
+static const char* __test_print_state(wifi_connection_state_e state)
+{
+ switch (state) {
+ case WIFI_CONNECTION_STATE_DISCONNECTED:
+ return "Disconnected";
+ case WIFI_CONNECTION_STATE_CONNECTING:
+ return "Connecting";
+ case WIFI_CONNECTION_STATE_CONNECTED:
+ return "Connected";
+ case WIFI_CONNECTION_STATE_DISCONNECTING:
+ return "Disconnecting";
+ }
+
+ return "Unknown";
+}
+
+static bool __test_found_ap_callback(wifi_ap_h ap, void *user_data)
+{
+ int rv = 0;
+ char *ap_name = NULL;
+ wifi_connection_state_e state;
+
+ rv = wifi_ap_get_essid(ap, &ap_name);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get AP name [%d]\n", rv);
+ return false;
+ }
+
+ rv = wifi_ap_get_connection_state(ap, &state);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get State [%d]\n", rv);
+ g_free(ap_name);
+ return false;
+ }
+
+ printf("AP name : %s, state : %s\n", ap_name, __test_print_state(state));
+ g_free(ap_name);
+
+ return true;
+}
+
+static bool __test_found_connect_ap_callback(wifi_ap_h ap, void *user_data)
+{
+ int rv = 0;
+ char *ap_name = NULL;
+ char *ap_name_part = (char*)user_data;
+
+ rv = wifi_ap_get_essid(ap, &ap_name);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get AP name [%d]\n", rv);
+ return false;
+ }
+
+ if (strstr(ap_name, ap_name_part) != NULL) {
+ bool required = false;
+ wifi_ap_is_passphrase_required(ap, &required);
+
+ if (required) {
+ char passphrase[100];
+ printf("Input passphrase for %s : ", ap_name);
+ rv = scanf("%100s", passphrase);
+
+ rv = wifi_ap_set_passphrase(ap, passphrase);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to set passphrase : %d\n", rv);
+ g_free(ap_name);
+ return false;
+ }
+ }
+
+ rv = wifi_connect(ap);
+ if (rv != WIFI_ERROR_NONE)
+ printf("Fail to connect [%s] : %d\n", ap_name, rv);
+ else
+ printf("Success to connect [%s]\n", ap_name);
+
+ g_free(ap_name);
+ return false;
+ }
+
+ g_free(ap_name);
+ return true;
+}
+
+static bool __test_found_disconnect_ap_callback(wifi_ap_h ap, void *user_data)
+{
+ int rv = 0;
+ char *ap_name = NULL;
+ char *ap_name_part = (char*)user_data;
+
+ rv = wifi_ap_get_essid(ap, &ap_name);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get AP name [%d]\n", rv);
+ return false;
+ }
+
+ if (strstr(ap_name, ap_name_part) != NULL) {
+ rv = wifi_disconnect(ap);
+ if (rv != WIFI_ERROR_NONE)
+ printf("Fail to disconnect %s : [%d]\n", ap_name, rv);
+ else
+ printf("Success to disconnect %s\n", ap_name);
+
+ g_free(ap_name);
+ return false;
+ }
+
+ g_free(ap_name);
+ return true;
+}
+
+int test_wifi_init(void)
+{
+ int rv = wifi_initialize();
+
+ if (rv == WIFI_ERROR_NONE) {
+ wifi_set_device_state_changed_cb(__test_device_state_callback, NULL);
+ wifi_set_background_scan_cb(__test_bg_scan_completed_callback, NULL);
+ wifi_set_connection_state_changed_cb(__test_connection_state_callback, NULL);
+ wifi_set_rssi_level_changed_cb(__test_rssi_level_callback, NULL);
+ } else {
+ printf("Wifi init failed [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Wifi init succeeded\n");
+ return 1;
+}
+
+int test_wifi_deinit(void)
+{
+ int rv = 0;
+
+ rv = wifi_deinitialize();
+
+ if (rv != WIFI_ERROR_NONE){
+ printf("Wifi deinit failed [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Wifi deinit succeeded\n");
+ return 1;
+}
+
+int test_wifi_activate(void)
+{
+ int rv = 0;
+
+ rv = wifi_activate();
+
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to activate Wi-Fi device [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Success to activate Wi-Fi device\n");
+
+ return 1;
+}
+
+int test_wifi_deactivate(void)
+{
+ int rv = 0;
+
+ rv = wifi_deactivate();
+
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to deactivate Wi-Fi device [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Success to deactivate Wi-Fi device\n");
+
+ return 1;
+}
+
+int test_is_activated(void)
+{
+ int rv = 0;
+ bool state;
+
+ rv = wifi_is_activated(&state);
+
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get Wi-Fi device state [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Success to get Wi-Fi device state : %s\n", (state) ? "TRUE" : "FALSE");
+
+ return 1;
+}
+
+int test_get_connection_state(void)
+{
+ int rv = 0;
+ wifi_connection_state_e connection_state;
+
+ rv = wifi_get_connection_state(&connection_state);
+
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get connection state [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Success to get connection state : ");
+ switch (connection_state) {
+ case WIFI_CONNECTION_STATE_CONNECTING:
+ printf("Connecting\n");
+ break;
+ case WIFI_CONNECTION_STATE_CONNECTED:
+ printf("Connected\n");
+ break;
+ case WIFI_CONNECTION_STATE_DISCONNECTING:
+ printf("Disconnecting\n");
+ break;
+ case WIFI_CONNECTION_STATE_DISCONNECTED:
+ printf("Disconnected\n");
+ break;
+ default:
+ printf("Unknown\n");
+ }
+
+ return 1;
+}
+
+int test_get_mac_address(void)
+{
+ int rv = 0;
+ char *mac_addr = NULL;
+
+ rv = wifi_get_mac_address(&mac_addr);
+
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get MAC address [%d]\n", rv);
+ return -1;
+ }
+
+ printf("MAC address : %s\n", mac_addr);
+ g_free(mac_addr);
+
+ return 1;
+}
+
+int test_get_interface_name(void)
+{
+ int rv = 0;
+ char *if_name = NULL;
+
+ rv = wifi_get_network_interface_name(&if_name);
+
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get Interface name [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Interface name : %s\n", if_name);
+ g_free(if_name);
+
+ return 1;
+}
+
+int test_scan_request(void)
+{
+ int rv = 0;
+
+ rv = wifi_scan(__test_scan_request_callback, NULL);
+
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Scan request failed [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Scan request succeeded\n");
+
+ return 1;
+}
+
+int test_get_connected_ap(void)
+{
+ int rv = 0;
+ char *ap_name = NULL;
+ wifi_ap_h ap_h;
+
+ rv = wifi_get_connected_ap(&ap_h);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get connected AP [%d]\n", rv);
+ return -1;
+ }
+
+ rv = wifi_ap_get_essid(ap_h, &ap_name);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get connected AP [%d]\n", rv);
+ wifi_ap_destroy(ap_h);
+ return -1;
+ }
+
+ printf("Connected AP : %s\n", ap_name);
+ g_free(ap_name);
+ wifi_ap_destroy(ap_h);
+
+ return 1;
+}
+
+int test_foreach_found_aps(void)
+{
+ int rv = 0;
+
+ rv = wifi_foreach_found_aps(__test_found_ap_callback, NULL);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to get AP list [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Get AP list finished\n");
+
+ return 1;
+}
+
+int test_connect_ap(void)
+{
+ int rv = 0;
+ char ap_name[32];
+
+ printf("Input a part of AP name to connect : ");
+ rv = scanf("%32s", ap_name);
+
+ rv = wifi_foreach_found_aps(__test_found_connect_ap_callback, ap_name);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to connect (can't get AP list) [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Connection step finished\n");
+ return 1;
+}
+
+int test_disconnect_ap(void)
+{
+ int rv = 0;
+ char ap_name[32];
+
+ printf("Input a part of AP name to disconnect : ");
+ rv = scanf("%32s", ap_name);
+
+ rv = wifi_foreach_found_aps(__test_found_disconnect_ap_callback, ap_name);
+ if (rv != WIFI_ERROR_NONE) {
+ printf("Fail to disconnect (can't get AP list) [%d]\n", rv);
+ return -1;
+ }
+
+ printf("Disconnection step finished\n");
+ return 1;
+}
+
+int main(int argc, char **argv)
+{
+ GMainLoop *mainloop;
+ mainloop = g_main_loop_new (NULL, FALSE);
+
+ GIOChannel *channel = g_io_channel_unix_new(0);
+ g_io_add_watch(channel, (G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL), test_thread,NULL );
+
+ printf("Test Thread created...\n");
+
+ g_main_loop_run (mainloop);
+
+ return 0;
+}
+
+gboolean test_thread(GIOChannel *source, GIOCondition condition, gpointer data)
+{
+ int rv = 0;
+ char a[100];
+
+ memset(a, '\0', 100);
+ printf("Event received from stdin\n");
+
+ rv = read(0, a, 100);
+
+ if (rv < 0 || a[0] == '0') exit(1);
+
+ if (*a == '\n' || *a == '\r'){
+ printf("\n\n Network Connection API Test App\n\n");
+ printf("Options..\n");
+ printf("1 - Wi-Fi init and set callbacks\n");
+ printf("2 - Wi-Fi deinit(unset callbacks automatically)\n");
+ printf("3 - Activate Wi-Fi device\n");
+ printf("4 - Deactivate Wi-Fi device\n");
+ printf("5 - Is Wi-Fi activated?\n");
+ printf("6 - Get connection state\n");
+ printf("7 - Get MAC address\n");
+ printf("8 - Get Wi-Fi interface name\n");
+ printf("9 - Scan request\n");
+ printf("a - Get Connected AP\n");
+ printf("b - Get AP list\n");
+ printf("c - Connect\n");
+ printf("d - Disconnect\n");
+ printf("0 - Exit \n");
+
+ printf("ENTER - Show options menu.......\n");
+ }
+
+ switch (a[0]) {
+ case '1': {
+ rv = test_wifi_init();
+ } break;
+ case '2': {
+ rv = test_wifi_deinit();
+ } break;
+ case '3': {
+ rv = test_wifi_activate();
+ } break;
+ case '4': {
+ rv = test_wifi_deactivate();
+ } break;
+ case '5': {
+ rv = test_is_activated();
+ } break;
+ case '6': {
+ rv = test_get_connection_state();
+ } break;
+ case '7': {
+ rv = test_get_mac_address();
+ } break;
+ case '8': {
+ rv = test_get_interface_name();
+ } break;
+ case '9': {
+ rv = test_scan_request();
+ } break;
+ case 'a': {
+ rv = test_get_connected_ap();
+ } break;
+ case 'b': {
+ rv = test_foreach_found_aps();
+ } break;
+ case 'c': {
+ rv = test_connect_ap();
+ } break;
+ case 'd': {
+ rv = test_disconnect_ap();
+ } break;
+ }
+ return TRUE;
+}
+