Fixed build error 05/184405/5 submit/tizen_4.0/20180720.041506
authorsaerome.kim <saerome.kim@samsung.com>
Wed, 18 Jul 2018 00:36:08 +0000 (09:36 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Fri, 20 Jul 2018 03:58:33 +0000 (12:58 +0900)
- GBS system in TestHub seems not to recognize PATTERN matching in
  CMakeFiles.txt so, removing filtering PATTERN.

Change-Id: Id172020e3f7c1456a1f1a09fdc98b4281e5d5080
Signed-off-by: saerome.kim <saerome.kim@samsung.com>
54 files changed:
CMakeLists.txt
capi-network-zigbee.pc.in [new file with mode: 0644]
common/CMakeLists.txt [deleted file]
include/zigbee-zcl_private.h
lib/CMakeLists.txt [deleted file]
lib/capi-network-zigbee.pc.in [deleted file]
lib/zbl-custom.c [deleted file]
lib/zbl-dbus.c [deleted file]
lib/zbl-dbus.h [deleted file]
lib/zbl-zcl-alarm.c [deleted file]
lib/zbl-zcl-basic.c [deleted file]
lib/zbl-zcl-color-control.c [deleted file]
lib/zbl-zcl-global-cmd.c [deleted file]
lib/zbl-zcl-groups.c [deleted file]
lib/zbl-zcl-identify.c [deleted file]
lib/zbl-zcl-isa-zone.c [deleted file]
lib/zbl-zcl-level-control.c [deleted file]
lib/zbl-zcl-on-off.c [deleted file]
lib/zbl-zcl-poll-control.c [deleted file]
lib/zbl-zcl-scenes.c [deleted file]
lib/zbl-zcl-thermostat.c [deleted file]
lib/zbl-zcl.c [deleted file]
lib/zbl-zdo-bind-mgr.c [deleted file]
lib/zbl-zdo-dev-disc.c [deleted file]
lib/zbl-zdo-nwk-mgr.c [deleted file]
lib/zbl-zdo-svc-disc.c [deleted file]
lib/zbl-zdo.c [deleted file]
lib/zbl.c [deleted file]
lib/zbl.h [deleted file]
packaging/capi-network-zigbee.spec
src/zbl-custom.c [new file with mode: 0644]
src/zbl-dbus.c [new file with mode: 0644]
src/zbl-dbus.h [new file with mode: 0644]
src/zbl-zcl-alarm.c [new file with mode: 0644]
src/zbl-zcl-basic.c [new file with mode: 0644]
src/zbl-zcl-color-control.c [new file with mode: 0644]
src/zbl-zcl-global-cmd.c [new file with mode: 0644]
src/zbl-zcl-groups.c [new file with mode: 0644]
src/zbl-zcl-identify.c [new file with mode: 0644]
src/zbl-zcl-isa-zone.c [new file with mode: 0644]
src/zbl-zcl-level-control.c [new file with mode: 0644]
src/zbl-zcl-on-off.c [new file with mode: 0644]
src/zbl-zcl-poll-control.c [new file with mode: 0644]
src/zbl-zcl-scenes.c [new file with mode: 0644]
src/zbl-zcl-thermostat.c [new file with mode: 0644]
src/zbl-zcl.c [new file with mode: 0644]
src/zbl-zdo-bind-mgr.c [new file with mode: 0644]
src/zbl-zdo-dev-disc.c [new file with mode: 0644]
src/zbl-zdo-nwk-mgr.c [new file with mode: 0644]
src/zbl-zdo-svc-disc.c [new file with mode: 0644]
src/zbl-zdo.c [new file with mode: 0644]
src/zbl.c [new file with mode: 0644]
src/zbl.h [new file with mode: 0644]
test/main.c

index c3e97a552220a362617a8fe1c3cc356033e5e356..d7f9185d1ea7da36daefdd1e002386967c0d9f85 100644 (file)
 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(capi-network-zigbee C)
+SET(fw_name "capi-network-zigbee")
 
-INCLUDE(FindPkgConfig)
+PROJECT(${fw_name})
+
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+
+SET(LIB ${LIB_PATH})
+SET(LIBDIR ${PREFIX}/${LIB_PATH})
+
+SET(INC_DIR include)
+INCLUDE_DIRECTORIES(${INC_DIR})
+INCLUDE_DIRECTORIES(common)
 
-#SET(EXTRA_CFLAGS "-Wall -Werror-implicit-function-declaration -fvisibility=hidden -fsanitize=address")
-SET(EXTRA_CFLAGS "-Wall -Werror-implicit-function-declaration -fvisibility=hidden")
-SET(CMAKE_C_FLAGS ${CMAKE_CFALGS} ${EXTRA_CFLAGS})
+SET(dependents "dlog capi-system-info glib-2.0 gio-2.0")
+SET(pc_dependents "")
 
 SET(CAPI_NETWORK_ZIGBEE "capi-network-zigbee")
 SET(CLIENT ${PROJECT_NAME})
+
+# for D-Bus
 SET(DBUS_INTERFACE "org.tizen.zigbee")
 SET(DBUS_OBJECT_PATH "/org/tizen/zigbee")
+ADD_DEFINITIONS("-DZIGBEE_DBUS_INTERFACE=\"${DBUS_INTERFACE}\"")
+ADD_DEFINITIONS("-DZIGBEE_DBUS_OBJPATH=\"${DBUS_OBJECT_PATH}\"")
 
 # enable client log
 ADD_DEFINITIONS("-DZB_ENABLE_CLIENT_LOG")
+
+# Enable Global Command Response Async.
 IF(ZB_FEATURE_GLOBAL_RSP_SYNC)
-ADD_DEFINITIONS("-DZB_FEATURE_GLOBAL_RSP_SYNC")
+       ADD_DEFINITIONS("-DZB_FEATURE_GLOBAL_RSP_SYNC")
 ENDIF(ZB_FEATURE_GLOBAL_RSP_SYNC)
 
-ADD_SUBDIRECTORY(common)
-ADD_SUBDIRECTORY(lib)
+INCLUDE(FindPkgConfig)
+pkg_check_modules(${fw_name} REQUIRED ${dependents} ${APPFW_REQUIRED_PKGS})
+FOREACH(flag ${${fw_name}_CFLAGS})
+    SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+IF(BUILD_GCOV)
+       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror-implicit-function-declaration -Werror -g -fvisibility=hidden -fprofile-arcs -ftest-coverage")
+
+ELSE(BUILD_GCOV)
+       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror-implicit-function-declaration -Werror -g -fvisibility=hidden")
+
+ENDIF(BUILD_GCOV)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror-implicit-function-declaration -Werror -g -fvisibility=hidden")
+
+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=${LIBDIR}")
+
+aux_source_directory(common COMMON_SOURCES)
+aux_source_directory(src SOURCES)
+ADD_LIBRARY(${fw_name} SHARED ${COMMON_SOURCES} ${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/capi-network-zigbee.pc.in b/capi-network-zigbee.pc.in
new file mode 100644 (file)
index 0000000..b4937b7
--- /dev/null
@@ -0,0 +1,13 @@
+# Package Information for pkg-config
+
+prefix=@PREFIX@
+exec_prefix=${prefix}/bin
+libdir=@LIB_INSTALL_DIR@
+includedir=@INCLUDE_INSTALL_DIR@/network
+
+Name: @PC_NAME@
+Description: @PACKAGE_DESCRIPTION@
+Version: @FULLVER@
+Requires: @PC_REQUIRED@
+Libs: -L${libdir} @PC_LDFLAGS@
+Cflags: -I${includedir} -I${includedir}/network
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
deleted file mode 100644 (file)
index 7837c17..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#FIND_PROGRAM(GDBUS_CODEGEN NAMES gdbus-codegen)
-
-#MESSAGE("${GDBUS_CODEGEN}")
-#ADD_CUSTOM_COMMAND(
-#      OUTPUT dbus
-#      COMMAND ${GDBUS_CODEGEN} --generate-c-code ${ZB_DBUS}
-#                      --interface-prefix org.tizen.zigbee.
-#                      --c-namespace zb
-#                      ${ZB_DBUS}.xml
-#      DEPENDS ${ZB_DBUS}.xml)
-
-#ADD_CUSTOM_TARGET(GENERATED_DBUS_CODE DEPENDS dbus)
-
-#MESSAGE("${dbus}")
index ff0b35985f3e9c8611cf3d437104fd56f4b66409..b337f654cf59661537580a0fd425ea9b2f5a9db7 100644 (file)
@@ -253,6 +253,36 @@ int zb_report_config_response_record_set_status(
                zb_zcl_report_config_response_record_h handle,
                zb_zcl_status_e status);
 
+/**
+ * @ingroup CAPI_NETWORK_ZIGBEE_ZCL_REPORTING_CONFIG_RESPONSE_RECORD_MODULE
+ * @brief Sets the attribute identifier to a reporting configuration response record.
+ * @details The attribute identifier field is 16 bits in length and shall contain the
+ * identifier of the attribute that the reporting configuration details apply to.
+ *
+ * @since_tizen 4.0
+ *
+ * @param[in] handle The handle of write attribute status record
+ * @param[out] id Attribute identifier
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #ZIGBEE_ERROR_NONE Successful
+ * @retval #ZIGBEE_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #ZIGBEE_ERROR_NOT_SUPPORTED Not supported
+ *
+ * @see zb_zcl_global_config_report_write_cb()
+ * @see zb_report_config_response_record_clone()
+ * @see zb_report_config_response_record_destroy()
+ * @see zb_report_config_response_record_get_status()
+ * @see zb_report_config_response_record_get_dir()
+ * @see zb_report_config_response_record_get_id()
+ * @see zb_report_config_response_record_set_status()
+ * @see zb_report_config_response_record_set_dir()
+ * @see zb_report_config_response_record_set_id()
+ */
+int zb_report_config_response_record_set_id(
+               zb_zcl_report_config_response_record_h handle,
+               zb_attribute_id id);
+
 /**
  * @brief Sets direction to reporting configuration response record.
  * @details The direction field specifies whether values of the attribute are reported
@@ -293,53 +323,6 @@ int zb_report_config_response_record_set_dir(
                zb_zcl_report_config_response_record_h handle,
                zb_zcl_fc_direction_e dir);
 
-/**
- * @brief Gets change from reporting configuration record (type 5).
- * @details The reportable change field shall contain the minimum change to the attribute
- * that will result in a report being issued. This field is of variable length.
- *
- * For attributes with 'analog' data type the field has the same data type as the attribute.
- *
- * The sign (if any) of the reportable change field is ignored.
- * For attributes of 'discrete' data type
- * this field is omitted.
- *
- * @since_tizen 4.0
- *
- * @param[in] handle The handle of write attribute status record
- * @param[out] type attribute type
- * @param[out] value attribute data (only analog data type is allowed)
- * @param[out] size attribute data size
- *
- * @return 0 on success, otherwise a negative error value.
- * @retval #ZIGBEE_ERROR_NONE Successful
- * @retval #ZIGBEE_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #ZIGBEE_ERROR_NOT_SUPPORTED Not supported
- *
- * @see zb_zcl_global_read_report_config_cb()
- * @see zb_report_config_record_create()
- * @see zb_report_config_record_clone()
- * @see zb_report_config_record_destroy()
- * @see zb_report_config_record_get_id()
- * @see zb_report_config_record_set_id()
- * @see zb_report_config_record_get_dir()
- * @see zb_report_config_record_set_dir()
- * @see zb_report_config_record_get_type()
- * @see zb_report_config_record_get_min_interval()
- * @see zb_report_config_record_set_min_interval()
- * @see zb_report_config_record_get_max_interval()
- * @see zb_report_config_record_set_max_interval()
- * @see zb_report_config_record_get_change()
- * @see zb_report_config_record_set_change()
- * @see zb_report_config_record_get_timeout()
- * @see zb_report_config_record_set_timeout()
- */
-int zb_report_config_record_get_change_3(
-               zb_zcl_reporting_config_record_h handle,
-               zb_zcl_data_type_e *type,
-               unsigned char *value,
-               int *size);
-
 /**
  * @brief Gets direction from read reporting configuration record.
  * @details The direction field specifies whether values of the attribute are reported
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
deleted file mode 100644 (file)
index ce45060..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common/)
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
-
-SET(CLIENT_PKG_CONF_FILE "capi-network-zigbee")
-
-FILE(GLOB CLIENT_SRCS *.c ${CMAKE_SOURCE_DIR}/common/*.c)
-#SET(CLIENT_SRCS ${CLIENT_SRCS} ${CMAKE_SOURCE_DIR}/common/${ZB_DBUS}.c)
-#SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/common/${ZB_DBUS}.c
-#      PROPERTIES GENERATED TRUE)
-
-pkg_check_modules(client_pkgs REQUIRED glib-2.0 gio-2.0 gio-unix-2.0 dlog capi-base-common capi-system-info)
-INCLUDE_DIRECTORIES(${client_pkgs_INCLUDE_DIRS})
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall -Werror -pthread")
-SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -O0 -g")
-
-ADD_DEFINITIONS("-DZIGBEE_DBUS_INTERFACE=\"${DBUS_INTERFACE}\"")
-ADD_DEFINITIONS("-DZIGBEE_DBUS_OBJPATH=\"${DBUS_OBJECT_PATH}\"")
-
-ADD_LIBRARY(${CLIENT} SHARED ${CLIENT_SRCS})
-#ADD_DEPENDENCIES(${CLIENT} GENERATED_DBUS_CODE)
-TARGET_LINK_LIBRARIES(${CLIENT} ${client_pkgs_LIBRARIES})
-SET_TARGET_PROPERTIES(${CLIENT} PROPERTIES VERSION ${FULLVER} SUBVERSION ${MAJORVER})
-INSTALL(TARGETS ${CLIENT} DESTINATION ${LIB_INSTALL_DIR})
-
-CONFIGURE_FILE(${CLIENT_PKG_CONF_FILE}.pc.in ${CLIENT_PKG_CONF_FILE}.pc @ONLY)
-INSTALL(FILES ${CLIENT_PKG_CONF_FILE}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
-
-FILE(GLOB CLIENT_HEADER ${CMAKE_SOURCE_DIR}/include/*.h)
-list(FILTER CLIENT_HEADER EXCLUDE REGEX ".*_private.h$")
-INSTALL(FILES ${CLIENT_HEADER} DESTINATION ${INCLUDE_INSTALL_DIR}/network)
diff --git a/lib/capi-network-zigbee.pc.in b/lib/capi-network-zigbee.pc.in
deleted file mode 100644 (file)
index 7aa7398..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@CMAKE_INSTALL_PREFIX@
-exec_prefix=${prefix}/bin
-libdir=@LIB_INSTALL_DIR@
-includedir=@INCLUDE_INSTALL_DIR@/network
-
-Name: @CLIENT@
-Description: Network/Wireless zigbee
-Version: @FULLVER@
-Requires:
-Libs: -L${libdir} -l@CLIENT@
-Cflags: -I${includedir}
diff --git a/lib/zbl-custom.c b/lib/zbl-custom.c
deleted file mode 100644 (file)
index 891f0fc..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <glib.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <zb-log.h>
-#include <zb-common.h>
-
-#include "zbl.h"
-#include "zbl-dbus.h"
-#include "zigbee.h"
-
-API int zb_aps_send(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char aps_fc,
-       unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid,
-       unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code,
-       unsigned char cmd_id, unsigned short payload_len, unsigned char *payload,
-       zb_aps_send_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       int ret = ZIGBEE_ERROR_NONE;
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_aps_send(addr16, aps_fc, src_ep, dst_ep, clusterid, profileid,
-               zcl_fc, mfg_code, cmd_id, payload_len, payload, cb, user_data);
-       DBG("zbl_aps_send()=0x%X", ret);
-       return ret;
-}
-
-API int zb_zcl_send(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
-       unsigned char dst_ep, zb_cluster_id clusterid, unsigned char zcl_fc,
-       unsigned char cmd, unsigned short payload_len, unsigned char *payload,
-       zb_zcl_send_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       int ret = ZIGBEE_ERROR_NONE;
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_zcl_send(addr16, src_ep, dst_ep, clusterid, zcl_fc,
-                               cmd, payload_len, payload, cb, user_data);
-       DBG("zbl_zcl_send()=0x%X", ret);
-       return ret;
-}
-
-API int zb_send_to_local(zb_zigbee_h handle, unsigned short length,
-       unsigned char *data, zb_send_to_local_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       int ret = ZIGBEE_ERROR_NONE;
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_send_to_local(length, data, cb, user_data);
-       DBG("zbl_send_to_local()=0x%X", ret);
-       return ret;
-}
diff --git a/lib/zbl-dbus.c b/lib/zbl-dbus.c
deleted file mode 100644 (file)
index f040020..0000000
+++ /dev/null
@@ -1,8988 +0,0 @@
-/*
- * Copyright (c) 2015 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 <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <glib.h>
-#include <gio/gio.h>
-
-#include "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-#define USE_ASYNC_DBUS_CALL
-
-static int zbl_ref_count;
-
-static GDBusConnection *gdbus_conn = NULL;
-static GDBusProxy *service_gproxy = NULL;
-static GDBusProxy *on_off_gproxy = NULL;
-static GDBusProxy *door_lock_gproxy = NULL;
-static GDBusProxy *level_control_gproxy = NULL;
-static GDBusProxy *thermostat_gproxy = NULL;
-static GDBusProxy *alarm_gproxy = NULL;
-static GDBusProxy *fan_control_gproxy = NULL;
-static GDBusProxy *mfglib_gproxy = NULL;
-static GDBusProxy *zcl_global_proxy = NULL;
-static GDBusProxy *zdo_dev_proxy = NULL;
-static GDBusProxy *zcl_basic_proxy = NULL;
-static GDBusProxy *zcl_identify_proxy = NULL;
-static GDBusProxy *zcl_ias_zone_proxy = NULL;
-static GDBusProxy *zcl_poll_control_proxy = NULL;
-static GDBusProxy *zcl_group_proxy = NULL;
-static GDBusProxy *zcl_scene_proxy = NULL;
-static GDBusProxy *zdo_bind_proxy = NULL;
-static GDBusProxy *zcl_color_control_proxy = NULL;
-static GDBusProxy *custom_gproxy = NULL;
-
-/* command id */
-typedef enum {
-       /* Service */
-       ZBL_SERVICE_FORM_NETWORK = 0,
-       ZBL_SERVICE_DISABLE_NETWORK,
-       /* ZDO except Bind */
-       ZBL_ZDO_NWK_ADDR_REQ,
-       ZBL_ZDO_NWK_ADDR_EXT_REQ,
-       ZBL_ZDO_ACTIVE_EP_REQ,
-       ZBL_ZDO_SIMPLE_DESC_REQ,
-       ZBL_ZDO_MATCHED_DESCRIPTOR_REQ,
-       ZBL_ZDO_COMPLEX_DESC_REQ,
-       ZBL_ZDO_MGMT_BIND_REQ,
-       ZBL_ZDO_MGMT_LQI_REQ,
-       ZBL_ZDO_MGMT_RTG_REQ,
-       ZBL_ZDO_MGMT_NWK_DISC_REQ,
-       ZBL_ZDO_MGMT_PERMIT_JOIN_REQ,
-       ZBL_ZDO_MGMT_LEAVE_REQ,
-       ZBL_ZDO_NODE_DESC_REQ,
-       ZBL_ZDO_POWER_DESC_REQ,
-       ZBL_ZDO_USER_DESC_REQ,
-       ZBL_ZDO_USER_DESC_SET_REQ,
-       /* ZDP Bind */
-       ZBL_ZDO_BIND_REQ,
-       ZBL_ZDO_UNBIND_REQ,
-       /* ZCL Global */
-       ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ,
-       ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ,
-       ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ,
-       ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ,
-       ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ,
-       ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ,
-       ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ,
-       ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ,
-       ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ,
-       /* Custom */
-       ZBL_CUSTOM_APS_SEND_REQ,
-       ZBL_CUSTOM_ZCL_SEND_REQ,
-       ZBL_CUSTOM_LOCAL_SEND_REQ,
-       /* ZCL Alarm */
-       ZBL_ZCL_ALARM_GET_ALARM_REQ,
-       /* ZCL Doorlock */
-       ZBL_ZCL_DOORLOCK_LOCK_STATE,
-       /* ZCL Fanmode */
-       ZBL_ZCL_FANMODE_FAN_MODE_STATE,
-       /* ZCL Group */
-       ZBL_ZCL_GROUP_ADD_GROUP_REQ,
-       ZBL_ZCL_GROUP_VIEW_GROUP_REQ,
-       ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ,
-       ZBL_ZCL_GROUP_REMOVE_GROUP_REQ,
-       /* ZCL Identify */
-       ZBL_ZCL_IDENTIFY_QUERY_REQ,
-       /* ZCL On/Off */
-       ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE,
-       /* ZCL Pollcontrol */
-       ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ,
-       /* ZCL Scene */
-       ZBL_ZCL_SCENE_ADD_SCENE_REQ,
-       ZBL_ZCL_SCENE_VIEW_SCENE_REQ,
-       ZBL_ZCL_SCENE_REMOVE_SCENE_REQ,
-       ZBL_ZCL_SCENE_STORE_SCENE_REQ,
-       ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ,
-       ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ,
-       /* ZCL Thermostat */
-       ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP,
-} zbl_command_id_e;
-
-typedef struct {
-       bool found;
-       void *cb;
-       void *userdata;
-       unsigned int sid;
-       int tid;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       void *global_cmd;
-       void *handle;
-#endif
-       zbl_command_id_e cid;
-} zbl_req_cb_s;
-
-#define ZCL_REPORTING_DIRECTION_REPORTED 0x00
-#define ZCL_REPORTING_DIRECTION_RECEIVED 0x01
-
-static GDBusProxy *_zbl_get_service_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == service_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_SERVICE_INTERFACE,
-                       NULL, NULL);
-       } else
-               proxy = service_gproxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_on_off_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == on_off_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_ON_OFF_INTERFACE, NULL, NULL);
-       } else
-               proxy = on_off_gproxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_door_lock_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == door_lock_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_DOOR_LOCK_INTERFACE, NULL, NULL);
-       } else
-               proxy = door_lock_gproxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_level_control_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == level_control_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_LEVEL_CONTROL_INTERFACE, NULL, NULL);
-       } else
-               proxy = level_control_gproxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_thermostat_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == thermostat_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_THERMOSTAT_INTERFACE, NULL, NULL);
-       } else
-               proxy = thermostat_gproxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_alarm_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == alarm_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_ALARM_INTERFACE,
-                       NULL, NULL);
-       } else
-               proxy = alarm_gproxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_fan_control_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == fan_control_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_FAN_CONTROL_INTERFACE, NULL, NULL);
-       } else
-               proxy = fan_control_gproxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_mfglib_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == mfglib_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_MFGLIB_CONTROL_INTERFACE, NULL, NULL);
-       } else
-               proxy = mfglib_gproxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_zcl_global_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zcl_global_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, NULL, NULL);
-       } else
-               proxy = zcl_global_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_zdo_dev_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zdo_dev_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, NULL, NULL);
-       } else
-               proxy = zdo_dev_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_basic_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zcl_basic_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_BASIC_INTERFACE,
-                       NULL, NULL);
-       } else
-               proxy = zcl_basic_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_identify_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zcl_identify_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_IDENTIFY_INTERFACE, NULL, NULL);
-       } else
-               proxy = zcl_identify_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_ias_zone_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zcl_ias_zone_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_IAS_ZONE_INTERFACE, NULL, NULL);
-       } else
-               proxy = zcl_ias_zone_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_poll_control_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zcl_poll_control_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, NULL, NULL);
-       } else
-               proxy = zcl_poll_control_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_group_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zcl_group_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_GROUP_INTERFACE,
-                       NULL, NULL);
-       } else
-               proxy = zcl_group_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_scene_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zcl_scene_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_SCENE_INTERFACE,
-                       NULL, NULL);
-       } else
-               proxy = zcl_scene_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_zdo_bind_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zdo_bind_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZDO_BIND_INTERFACE,
-                       NULL, NULL);
-       } else
-               proxy = zdo_bind_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_color_control_proxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
-
-       if (NULL == zcl_color_control_proxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
-                       ZIGBEE_ZCL_COLOR_CONTROL_INTERFACE, NULL, NULL);
-       } else
-               proxy = zcl_color_control_proxy;
-
-       return proxy;
-}
-
-static GDBusProxy *_zbl_get_custom_gproxy(void)
-{
-       GDBusProxy *proxy = NULL;
-       RETVM_IF(NULL == gdbus_conn, NULL, "Custom Object is invalid");
-
-       if (NULL == custom_gproxy) {
-               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
-                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_CUSTOM_INTERFACE,
-                       NULL, NULL);
-       } else
-               proxy = custom_gproxy;
-
-       return proxy;
-}
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-static gint _global_compare_func(gconstpointer a, gconstpointer b)
-{
-       const zbl_req_cb_s *left = (const zbl_req_cb_s*)a;
-       const zbl_req_cb_s *right = (const zbl_req_cb_s*)b;
-       zb_event_global_default_rsp_s *left_data = NULL;
-       zb_event_global_default_rsp_s *right_data = NULL;
-
-       if (NULL == left || NULL == left->global_cmd)
-               return -1;
-       if (NULL == right || NULL == right->global_cmd)
-               return 1;
-
-       left_data = left->global_cmd;
-       right_data = right->global_cmd;
-
-       if (left_data->ep > right_data->ep)
-               return 1;
-       else if (left_data->ep < right_data->ep)
-               return -1;
-
-       if (left_data->clusterid > right_data->clusterid)
-               return 1;
-       else if (left_data->clusterid < right_data->clusterid)
-               return -1;
-
-       if (left_data->commandid > right_data->commandid)
-               return 1;
-       else if (left_data->commandid < right_data->commandid)
-               return -1;
-
-       /* endpoint, clusterid and commandid are equal */
-       return 0;
-}
-
-static void _zbl_register_global_req(zb_zigbee_h handle, zbl_req_cb_s *container)
-{
-       GList *list = NULL;
-       GList *item = NULL;
-
-       struct zbl_zigbee_s* h = handle;
-
-       if (NULL == handle || NULL == container)
-               return;
-
-       list = h->global_cmd_req;
-
-       /* Insert item if not exists */
-       DBG("Insert global cmd info");
-       if (list) {
-               item = g_list_find_custom(list, container, _global_compare_func);
-               if (NULL != item)
-                       h->global_cmd_req = g_list_append(list, container);
-       } else
-               h->global_cmd_req = g_list_append(list, container);
-}
-
-static void _zbl_deregister_global_req(zb_zigbee_h handle, zbl_req_cb_s *container)
-{
-       GList *list = NULL;
-       GList *item = NULL;
-
-       struct zbl_zigbee_s* h = handle;
-
-       if (NULL == handle || NULL == container)
-               return;
-
-       list = h->global_cmd_req;
-       if (NULL == list)
-               return;
-
-       /* Remove item if exists */
-       DBG("Remove global cmd info");
-       item = g_list_find_custom(list, container, _global_compare_func);
-       if (NULL != item)
-               h->global_cmd_req = g_list_remove(list, container);
-}
-
-static void _zbl_remove_global_req(zb_zigbee_h handle, unsigned char ep,
-       unsigned short clusterid, unsigned char commandid)
-{
-       GList *head = NULL;
-       GList *iter = NULL;
-       zbl_req_cb_s *ret = NULL;
-
-       struct zbl_zigbee_s* h = handle;
-
-       if (NULL == handle)
-               return;
-
-       head = h->global_cmd_req;
-       iter = head;
-
-       while (NULL != iter) {
-               GList *next = iter->next;
-               zbl_req_cb_s *container = iter->data;
-               if (container && container->global_cmd) {
-                       zb_event_global_default_rsp_s *data = container->global_cmd;
-
-                       if (data && data->ep == ep && data->clusterid == clusterid
-                                       && data->commandid == commandid) {
-                               DBG("  Found: ep[%d] cluster_id[%X] commandid[%X] / sid[%d]",
-                                       ep, clusterid, commandid, container->sid);
-                               ret = container;
-                               break;
-                       }
-               }
-               iter = next;
-       }
-
-       if (ret) {
-               if (ret->sid)
-                       g_dbus_connection_signal_unsubscribe(gdbus_conn, ret->sid);
-
-               if (ret->tid) {
-                       g_source_remove(ret->tid);
-                       DBG("tid=%d removed");
-                       ret->tid = 0;
-               }
-
-               _zbl_deregister_global_req(h, ret);
-       }
-
-}
-#endif /* ZB_FEATURE_GLOBAL_RSP_SYNC */
-
-static void _zbl_signal_handler(GDBusConnection *connection,
-               const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
-               const gchar *signal_name, GVariant *parameters, gpointer user_data)
-{
-       zb_event_data_s *ev = NULL;
-       struct zbl_zigbee_s* container = user_data;
-
-       DBG("%s signal received", signal_name);
-
-       RET_IF(NULL == container);
-       RET_IF(NULL == container->event_handler);
-
-       ev = calloc(1, sizeof(zb_event_data_s));
-       RETM_IF(NULL == ev, "Failed to memory allocation !");
-
-       if (g_strcmp0(signal_name, "zigbee_state") == 0) {
-               gboolean enabled;
-               g_variant_get(parameters, "(b)", &enabled);
-
-               ev->data.enable = calloc(1, sizeof(zb_event_enable_s));
-               if (!ev->data.enable) {
-                       ERR("Failed to memory allocation !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               ev->data.enable->status = (unsigned char)enabled;
-
-               container->event_handler(0, NULL, ZB_ZDP_ENABLE_EVENT, ev, container->user_data);
-
-               if (ev->data.enable) {
-                       free(ev->data.enable);
-                       ev->data.enable = NULL;
-               }
-
-       } else if (g_strcmp0(signal_name, "form_network_done") == 0) {
-               zb_nwk_addr pan_id;
-               g_variant_get(parameters, "(q)", &pan_id);
-
-               ev->data.form_network = calloc(1, sizeof(zb_event_form_network_s));
-               if (!ev->data.form_network) {
-                       ERR("Failed to memory allocation !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               memcpy(&ev->data.form_network->pan_id, &pan_id, sizeof(zb_nwk_addr));
-
-               container->event_handler(pan_id, NULL, ZB_ZDP_FORM_NETWORK_DONE, ev,
-                       container->user_data);
-
-               if (ev->data.form_network) {
-                       free(ev->data.form_network);
-                       ev->data.form_network = NULL;
-               }
-       } else if (g_strcmp0(signal_name, "child_joined") == 0) {
-               zb_nwk_addr addr16;
-               zb_ieee_addr addr64;
-               unsigned char count;
-               unsigned char ep[10];
-               unsigned char value;
-
-               int j = 0;
-               GVariantIter *iter1 = NULL;
-               GVariantIter *iter2 = NULL;
-
-               g_variant_get(parameters, "(a(y)ya(y)q)", &iter1, &count, &iter2, &addr16);
-               if (!iter1 || !iter2) {
-                       ERR("Invalid parameter !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               while (g_variant_iter_loop(iter1, "(y)", &value)) {
-                       addr64[j] = value; j++;
-               }
-               g_variant_iter_free(iter1);
-
-               j = 0;
-               while (g_variant_iter_loop(iter2, "(y)", &value)) {
-                       ep[j] = value; j++;
-               }
-               g_variant_iter_free(iter2);
-
-               ev->data.join = calloc(1, sizeof(zb_event_join_s));
-               if (!ev->data.join) {
-                       ERR("Failed to memory allocation !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               ev->data.join->count = count;
-               memcpy(ev->data.join->ep, ep, count);
-
-               container->event_handler(addr16, addr64, ZB_ZDP_JOIN_EVENT, ev,
-                       container->user_data);
-
-               if (ev->data.join) {
-                       free(ev->data.join);
-                       ev->data.join = NULL;
-               }
-
-       } else if (g_strcmp0(signal_name, "child_rejoined") == 0) {
-               zb_ieee_addr addr64;
-               unsigned char value;
-
-               int j = 0;
-               GVariantIter *iter = NULL;
-
-               g_variant_get(parameters, "(a(y))", &iter);
-               if (!iter) {
-                       ERR("Invalid parameter !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               while (g_variant_iter_loop(iter, "(y)", &value)) {
-                       addr64[j] = value; j++;
-               }
-               g_variant_iter_free(iter);
-
-               container->event_handler(0, addr64, ZB_ZDP_REJOIN_EVENT, ev,
-                       container->user_data);
-
-       } else if (g_strcmp0(signal_name, "child_left") == 0) {
-               int j = 0;
-               zb_ieee_addr addr64;
-               GVariantIter *iter = NULL;
-               unsigned char value, status;
-
-               g_variant_get(parameters, "(a(y)y)", &iter, &status);
-               if (!iter) {
-                       ERR("Invalid parameter !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               while (g_variant_iter_loop(iter, "(y)", &value)) {
-                       addr64[j] = value;
-                       j++;
-               }
-               g_variant_iter_free(iter);
-
-               ev->data.child_left = calloc(1, sizeof(zb_event_child_left_s));
-               if (!ev->data.child_left) {
-                       ERR("Failed to memory allocation !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               ev->data.child_left->status = status;
-
-               container->event_handler(0, addr64, ZB_ZDP_CHILD_LEFT, ev,
-                       container->user_data);
-
-               if (ev->data.child_left) {
-                       free(ev->data.child_left);
-                       ev->data.child_left = NULL;
-               }
-
-       } else if (g_strcmp0(signal_name, "leave_network_done") == 0) {
-
-               zb_nwk_addr addr16;
-               g_variant_get(parameters, "(q)", &addr16);
-
-               container->event_handler(addr16, NULL, ZB_ZDP_LEAVE_DONE_EVENT, ev,
-                       container->user_data);
-
-       } else if (!g_strcmp0(signal_name, "zcl_global_default_response")) {
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned short clusterid;
-               unsigned char commandid;
-               unsigned char status;
-
-               g_variant_get(parameters, "(qyqyy)",
-                       &addr16, &ep, &clusterid, &commandid, &status);
-
-               ev->data.global_default_rsp = calloc(1, sizeof(zb_event_global_default_rsp_s));
-               if (!ev->data.global_default_rsp) {
-                       ERR("Failed to memory allocation !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               ev->data.global_default_rsp->ep = ep;
-               ev->data.global_default_rsp->clusterid = clusterid;
-               ev->data.global_default_rsp->commandid = commandid;
-               ev->data.global_default_rsp->status = status;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-               /* If there is global request already, remove that. */
-               if (0x00 != status)
-                       _zbl_remove_global_req(container, ep, clusterid, commandid);
-#endif
-
-               container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_DEFAULT_RSP_EVENT, ev,
-                       container->user_data);
-
-               if (ev->data.global_default_rsp) {
-                       free(ev->data.global_default_rsp);
-                       ev->data.global_default_rsp = NULL;
-               }
-
-       } else if (!g_strcmp0(signal_name, "alarm_count")) {
-               unsigned short alarm_count;
-               g_variant_get(parameters, "(q)", &alarm_count);
-
-               ev->data.alarm = calloc(1, sizeof(zb_event_alarm_s));
-               if (!ev->data.global_default_rsp) {
-                       ERR("Failed to memory allocation !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               ev->data.alarm->count = alarm_count;
-
-               container->event_handler(0, NULL, ZB_ZCL_ALARM_EVENT, ev, container->user_data);
-
-               if (ev->data.alarm) {
-                       free(ev->data.alarm);
-                       ev->data.alarm = NULL;
-               }
-
-       } else if (!g_strcmp0(signal_name, "report_attr_handler_cb")) {
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned char value;
-               unsigned short attrData;
-               unsigned short clusterid;
-               unsigned char dataType;
-               int data_size;
-               int dsizeIndex = 0;
-               char dSize[3] = {'\0', '\0'};
-               int i = 0, j = 0, count;
-               GVariantIter *attr_iter = NULL;
-               GVariantIter *dataType_iter = NULL;
-               GVariantIter *data_iter = NULL;
-
-               struct attribute_report_s **records = NULL;
-
-               g_variant_get(parameters, "(qyqaqa(y)a(y)i)",  &addr16, &ep,
-                        &clusterid, &attr_iter, &dataType_iter, &data_iter, &count);
-
-               if (!attr_iter || !dataType_iter || !data_iter) {
-                       ERR("Invalid parameter !");
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               records = calloc(count, sizeof(struct attribute_report_s*));
-               if (!records) {
-                       ERR("calloc() Fail(%d)", errno);
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               for (j = 0; j < count; j++) {
-                       records[j] = calloc(1, sizeof(struct attribute_report_s));
-                       if (NULL == records[j]) {
-                               for (i = 0; i < j; i++) {
-                                       free(records[i]);
-                                       records[i] = NULL;
-                               }
-                               free(records);
-                               records = NULL;
-
-                               g_variant_iter_free(attr_iter);
-                               g_variant_iter_free(dataType_iter);
-                               g_variant_iter_free(data_iter);
-
-                               ERR("calloc() Fail(%d)", errno);
-                               goto EXIT_EVENT_HANDLER;
-                       }
-               }
-               DBG("record_length %d", count);
-
-               j = 0;
-               while (g_variant_iter_loop(attr_iter, "q", &attrData)
-                               && g_variant_iter_loop(dataType_iter, "(y)", &dataType)) {
-                       records[j]->id = attrData;
-                       records[j]->type = dataType;
-                       DBG("dataType 0x%02x", records[j]->type);
-                       DBG("AttributeId 0x%04x", records[j]->id);
-                       j++;
-               }
-               g_variant_iter_free(attr_iter);
-               g_variant_iter_free(dataType_iter);
-
-               j = 0;
-               while (j < count) {
-                       switch (records[j]->type) {
-                       /* String */
-                       case ZB_ZCL_OCTET_STRING:
-                       case ZB_ZCL_CHARACTER_STRING:
-                               g_variant_iter_loop(data_iter, "(y)", &value);
-                               data_size = value + 1;
-                               records[j]->value = calloc(data_size, sizeof(unsigned char));
-                               if (NULL == records[j]->value) {
-                                       for (i = 0; i < j; i++) {
-                                               free(records[i]->value);
-                                               records[i]->value = NULL;
-                                       }
-                                       for (i = 0; i < count; i++) {
-                                               free(records[i]);
-                                               records[i] = NULL;
-                                       }
-                                       free(records);
-                                       records = NULL;
-
-                                       ERR("calloc() Fail(%d)", errno);
-                                       goto EXIT_EVENT_HANDLER;
-                               }
-                               records[j]->value[dsizeIndex] = value;
-                               dsizeIndex++;
-                               for (i = dsizeIndex; i < data_size - 2; i++) {
-                                       g_variant_iter_loop(data_iter, "(y)", &value);
-                                       records[j]->value[i] = value;
-                               }
-                               g_variant_iter_free(data_iter);
-                               break;
-                       case ZB_ZCL_LONG_OCTET_STRING:
-                       case ZB_ZCL_LONG_CHARACTER_STRING:
-                               g_variant_iter_loop(data_iter, "(y)", &value);
-                               dSize[0] = value;
-                               g_variant_iter_loop(data_iter, "(y)", &value);
-                               dSize[1] =  value;
-                               data_size = dSize[1];
-                               data_size = (data_size << 8) | dSize[0];
-                               data_size += 2;
-                               records[j]->value = calloc(data_size, sizeof(unsigned char));
-                               if (NULL == records[j]->value) {
-                                       for (i = 0; i < j; i++) {
-                                               free(records[i]->value);
-                                               records[i]->value = NULL;
-                                       }
-                                       for (i = 0; i < count; i++) {
-                                               free(records[i]);
-                                               records[i] = NULL;
-                                       }
-                                       free(records);
-                                       records = NULL;
-
-                                       ERR("calloc() Fail(%d)", errno);
-                                       goto EXIT_EVENT_HANDLER;
-                               }
-                               records[j]->value[dsizeIndex] = dSize[dsizeIndex];
-                               dsizeIndex++;
-                               records[j]->value[dsizeIndex] = dSize[dsizeIndex];
-                               dsizeIndex++;
-
-                               for (i = dsizeIndex; i < data_size - 2; i++) {
-                                       g_variant_iter_loop(data_iter, "(y)", &value);
-                                       records[j]->value[i] = value;
-                               }
-                               g_variant_iter_free(data_iter);
-                               break;
-                       /* Array, set and bag */
-                       case ZB_ZCL_ARRAY:
-                       case ZB_ZCL_SET:
-                       case ZB_ZCL_BAG:
-                       /* structure */
-                       case ZB_ZCL_STRUCTURE:
-                               ERR("Not supported type = %d", records[i]->type);
-                               continue;
-                       default:
-                               data_size = zb_zcl_get_data_size(records[j]->type);
-                               if (data_size < 0) {
-                                       for (i = 0; i < j; i++) {
-                                               free(records[i]->value);
-                                               records[i]->value = NULL;
-                                       }
-                                       for (i = 0; i < count; i++) {
-                                               free(records[i]);
-                                               records[i] = NULL;
-                                       }
-                                       free(records);
-                                       records = NULL;
-
-                                       ERR("zb_zcl_get_data_size() Fail(%d)", data_size);
-                                       goto EXIT_EVENT_HANDLER;
-                               }
-                               records[j]->value = calloc(data_size, sizeof(unsigned char));
-                               if (NULL == records[j]->value) {
-                                       for (i = 0; i < j; i++) {
-                                               free(records[i]->value);
-                                               records[i]->value = NULL;
-                                       }
-                                       for (i = 0; i < count; i++) {
-                                               free(records[i]);
-                                               records[i] = NULL;
-                                       }
-                                       free(records);
-                                       records = NULL;
-
-                                       ERR("calloc() Fail(%d)", errno);
-                                       goto EXIT_EVENT_HANDLER;
-                               }
-                               if (data_size != 0xFF) {
-                                       for (i = 0; i < data_size; i++) {
-                                               if (g_variant_iter_loop(data_iter, "(y)", &value)) {
-                                                       records[j]->value[i] = value;
-                                                       DBG("value[%d] 0x%02X", i, records[j]->value[i]);
-                                               }
-                                       }
-                               }
-                               g_variant_iter_free(data_iter);
-                       }
-                       DBG("DataType = 0x%02X Data Size = %d", records[j]->type, data_size);
-                       j++;
-               }
-
-               ev->data.global_attr_report = calloc(1, sizeof(zb_event_global_attr_report_s));
-               if (NULL == ev->data.global_attr_report) {
-                       ERR("Failed to memory allocation !");
-                       for (j = 0; j < count; j++) {
-                               free(records[j]->value);
-                               records[j]->value = NULL;
-                               if (records[j]) {
-                                       free(records[j]);
-                                       records[j] = NULL;
-                               }
-                       }
-                       if (records) {
-                               free(records);
-                               records = NULL;
-                       }
-                       goto EXIT_EVENT_HANDLER;
-               }
-
-               ev->data.global_attr_report->records = records;
-               ev->data.global_attr_report->count = count;
-
-               container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_ATTRIBUTE_REPORT_EVENT, ev,
-                       container->user_data);
-               for (j = 0; j < count; j++) {
-                       if (records[j]->value) {
-                               free(records[j]->value);
-                               records[j]->value = NULL;
-                       }
-                       if (records[j]) {
-                               free(records[j]);
-                               records[j] = NULL;
-                       }
-               }
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-               if (ev->data.global_attr_report) {
-                       free(ev->data.global_attr_report);
-                       ev->data.global_attr_report = NULL;
-               }
-
-       } else if (!g_strcmp0(signal_name, "status_change_rpt")) {
-
-               zb_nwk_addr addr16;
-               unsigned char src_ep;
-               unsigned char status;
-               unsigned short zone_status;
-               unsigned short delay;
-               unsigned char zone_id;
-
-               g_variant_get(parameters, "(qyqyyq)", &addr16, &src_ep, &zone_status,
-                       &status, &zone_id, &delay);
-               if (0xff == zone_id) {
-
-                       ev->data.ias_noti = calloc(1, sizeof(zb_event_ias_noti_s));
-                       if (!ev->data.ias_noti) {
-                               ERR("Failed to memory allocation !");
-                               goto EXIT_EVENT_HANDLER;
-                       }
-
-                       ev->data.ias_noti->src_ep = src_ep;
-                       ev->data.ias_noti->zone_status = zone_status;
-
-                       container->event_handler(addr16, NULL,
-                               ZB_ZCL_IAS_ZONE_STATUS_CHANGE_NOTIFICATION_EVENT, ev,
-                               container->user_data);
-
-                       if (ev->data.ias_noti) {
-                               free(ev->data.ias_noti);
-                               ev->data.ias_noti = NULL;
-                       }
-
-               } else {
-
-                       ev->data.ias_extended_noti = calloc(1, sizeof(zb_event_ias_extended_noti_s));
-                       if (!ev->data.ias_extended_noti) {
-                               ERR("Failed to memory allocation !");
-                               goto EXIT_EVENT_HANDLER;
-                       }
-
-                       ev->data.ias_extended_noti->src_ep = src_ep;
-                       ev->data.ias_extended_noti->zone_status = zone_status;
-                       ev->data.ias_extended_noti->status = status;
-                       ev->data.ias_extended_noti->zone_id = zone_id;
-                       ev->data.ias_extended_noti->delay = delay;
-
-                       container->event_handler(addr16, NULL,
-                               ZB_ZCL_IAS_ZONE_STATUS_CHANGE_EXTENDED_NOTIFICATION_EVENT, ev,
-                               container->user_data);
-
-                       if (ev->data.ias_extended_noti) {
-                               free(ev->data.ias_extended_noti);
-                               ev->data.ias_extended_noti = NULL;
-                       }
-
-               }
-       } else if (!g_strcmp0(signal_name, "enroll_request")) {
-               zb_nwk_addr addr16;
-               unsigned char src_ep;
-               unsigned short zone_type;
-               unsigned char mfg_code;
-
-               ev->data.ias_enroll_request = calloc(1, sizeof(zb_event_ias_enroll_request_s));
-               if (!ev->data.ias_enroll_request) {
-                               ERR("Failed to memory allocation !");
-                               goto EXIT_EVENT_HANDLER;
-                       }
-
-               g_variant_get(parameters, "(qyqy)", &addr16, &src_ep, &zone_type, &mfg_code);
-               ev->data.ias_enroll_request->src_ep = src_ep;
-               ev->data.ias_enroll_request->zone_type = zone_type;
-               ev->data.ias_enroll_request->mfg_code = mfg_code;
-
-               container->event_handler(addr16, NULL, ZB_ZCL_IAS_ZONE_ENROLL_REQUEST_EVENT, ev,
-                       container->user_data);
-
-               if (ev->data.ias_enroll_request) {
-                       free(ev->data.ias_enroll_request);
-                       ev->data.ias_enroll_request = NULL;
-               }
-       } else
-               ERR("Can't handle this signal=%s", signal_name);
-
-EXIT_EVENT_HANDLER:
-       if (ev) {
-               free(ev);
-               ev = NULL;
-       }
-       return;
-}
-
-static void _zbl_dbus_unsubscribe_signal(GList *sub_ids)
-{
-       RET_IF(NULL == gdbus_conn);
-       RET_IF(NULL == sub_ids);
-
-       while (sub_ids) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, GPOINTER_TO_UINT(sub_ids->data));
-               sub_ids = g_list_remove(sub_ids, sub_ids->data);
-       }
-       g_list_free(sub_ids);
-}
-
-static int _zbl_dbus_subscribe_signal(zb_zigbee_h handle)
-{
-       unsigned int id;
-       struct zbl_zigbee_s* h = handle;
-
-       /* Section 0. Subscribe Manager signal */
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_MANAGER_INTERFACE,
-                       "zigbee_state", ZIGBEE_DBUS_OBJPATH, NULL, G_DBUS_CALL_FLAGS_NONE,
-                       _zbl_signal_handler, handle, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(zigbee_state) Fail(%d)", errno);
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for service_enabled signal %d", id);
-
-       /* Section 1. Subscribe ZDO signal */
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
-                       "child_joined", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
-                       _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for child_joined signal %d", id);
-
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
-                       "child_rejoined", ZIGBEE_CONTROL_OBJECT_PATH, NULL,     G_DBUS_CALL_FLAGS_NONE,
-                       _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for child_rejoined signal %d", id);
-
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
-                       "child_left", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
-                       _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(child_left) Fail(%d)\n", errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for child_left signal %d", id);
-
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
-                       "leave_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
-                       G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(leave_network_done) Fail(%d)\n", errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for leave_network_done signal %d", id);
-
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
-                       "form_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
-                       _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(form_network_done) Fail(%d)\n", errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for form_network_done signal %d", id);
-
-       /* Section 3. Subscribe ZCL global command */
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "zcl_global_default_response",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
-               _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(zcl_global_default_response) Fail(%d)\n",
-                       errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for zcl_global_default_response signal %d", id);
-
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "report_attr_handler_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
-               _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(report_attr_handler_rsp) Fail(%d)\n",
-                       errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for report_attr_handler_rsp signal %d", id);
-
-       /* Section 2. Subscribe ZCL alarm cluster signal */
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_ZCL_ALARM_INTERFACE,
-                       "alarm_count", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
-                       _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(alarm_count) Fail(%d)\n", errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for alarm_count signal %d", id);
-
-       /* Section 3. Subscribe ZCL IAS cluster signal */
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-                       ZIGBEE_ZCL_IAS_ZONE_INTERFACE, "status_change_rpt",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
-                       _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(status_change_rpt) Fail(%d)\n", errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for status_change_rpt signal %d", id);
-
-       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_IAS_ZONE_INTERFACE, "enroll_request", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
-               G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, h, NULL);
-       if (0 == id) {
-               ERR("g_dbus_connection_signal_subscribe(enroll_request) Fail(%d)\n", errno);
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
-       DBG("subscribed for enroll_request signal %d", id);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-static void _zbl_dbus_name_owner_notify(GObject *object, GParamSpec *pspec,
-               gpointer *user_data)
-{
-       GDBusProxy *proxy = G_DBUS_PROXY(object);
-       gchar *name_owner = g_dbus_proxy_get_name_owner(proxy);
-       zb_zigbee_h handle = (zb_zigbee_h)user_data;
-
-       DBG("Name owner notify [%s]", name_owner);
-
-       if (NULL == name_owner)
-               zbl_dbus_stop(handle);
-
-       g_free(name_owner);
-}
-
-static void _zbl_request_cleanup(gpointer data)
-{
-       zbl_req_cb_s *container = data;
-       RET_IF(NULL == container);
-
-       if (container->tid) {
-               g_source_remove(container->tid);
-               DBG("tid=%d removed");
-               container->tid = 0;
-       }
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       _zbl_deregister_global_req(container->handle, container);
-       if (container->global_cmd) {
-               free(container->global_cmd);
-               container->global_cmd = NULL;
-       }
-#endif
-
-       free(container);
-       container = NULL;
-}
-
-static gboolean _zbl_timeout_cb(gpointer p)
-{
-       zbl_req_cb_s *container = (zbl_req_cb_s *)p;
-
-       RETVM_IF(NULL == gdbus_conn, G_SOURCE_REMOVE, "gdbus_conn is NULL");
-       RETVM_IF(NULL == p, G_SOURCE_REMOVE, "container is NULL");
-       RETVM_IF(NULL == container->cb, G_SOURCE_REMOVE, "cb is NULL");
-       RETVM_IF(true == container->found, G_SOURCE_REMOVE, "cb was alreay handled");
-
-       switch (container->cid) {
-               /* Service */
-       case ZBL_SERVICE_FORM_NETWORK: {
-               zb_form_network_cb cb = container->cb;
-               cb(0x0000, container->userdata);
-       }
-       break;
-       case ZBL_SERVICE_DISABLE_NETWORK: {
-               zb_disable_network_cb cb = container->cb;
-               cb(0x0000, container->userdata);
-               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
-       }
-       break;
-       /* ZDO except Bind */
-       case ZBL_ZDO_NWK_ADDR_REQ: {
-               zb_zdo_addr_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_NWK_ADDR_EXT_REQ: {
-               zb_zdo_addr_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_ACTIVE_EP_REQ: {
-               zb_zdo_active_ep_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_SIMPLE_DESC_REQ: {
-               zb_zdo_simple_desc_cb cb = container->cb;
-               cb(0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: {
-               zb_zdo_match_desc_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_COMPLEX_DESC_REQ: {
-               zb_zdo_complex_desc_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_MGMT_BIND_REQ: {
-               zb_zdo_mgmt_bind_cb cb = container->cb;
-               struct zb_zdo_binding_table_s **records = NULL;
-
-               records = calloc(1, sizeof(zb_zdo_binding_table_h));
-               if (records)
-                       records[0] = calloc(1, sizeof(struct zb_zdo_binding_table_s));
-
-               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata);
-
-               if (records && records[0]) {
-                       free(records[0]);
-                       records[0] = NULL;
-               }
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_MGMT_LQI_REQ: {
-               zb_zdo_mgmt_lqi_cb cb = container->cb;
-               struct zb_zdo_neighbor_table_desc_s **records = NULL;
-
-               records = calloc(1, sizeof(zb_zdo_neighbor_table_desc_h));
-               if (records)
-                       records[0] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s));
-
-               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata);
-
-               if (records && records[0]) {
-                       free(records[0]);
-                       records[0] = NULL;
-               }
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_MGMT_RTG_REQ: {
-               zb_zdo_mgmt_rtg_cb cb = container->cb;
-               struct zb_zdo_routing_table_s **records = NULL;
-
-               records = calloc(1, sizeof(zb_zdo_routing_table_h));
-               if (records)
-                       records[0] = calloc(1, sizeof(struct zb_zdo_routing_table_s));
-
-               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata);
-
-               if (records && records[0]) {
-                       free(records[0]);
-                       records[0] = NULL;
-               }
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_MGMT_NWK_DISC_REQ: {
-               zb_zdo_mgmt_nwk_disc_cb cb = container->cb;
-               struct zb_zdo_network_list_record_s **records = NULL;
-               records = calloc(1, sizeof(zb_zdo_network_list_record_h));
-               if (records)
-                       records[0] = calloc(1, sizeof(struct zb_zdo_network_list_record_s));
-
-               cb(0, 0, 0, 0, (void **)records, container->userdata);
-
-               if (records && records[0]) {
-                       free(records[0]);
-                       records[0] = NULL;
-               }
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: {
-               zb_zdo_mgmt_permit_joining_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_MGMT_LEAVE_REQ: {
-               zb_zdo_mgmt_leave_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_NODE_DESC_REQ: {
-               zb_zdo_node_desc_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_POWER_DESC_REQ: {
-               zb_zdo_power_desc_cb cb = container->cb;
-               cb(0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_USER_DESC_REQ: {
-               zb_zdo_user_desc_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata);
-       break;
-       }
-       case ZBL_ZDO_USER_DESC_SET_REQ: {
-               zb_zdo_user_desc_conf_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
-       }
-       break;
-       /* ZDO Bind */
-       case ZBL_ZDO_BIND_REQ: {
-               zb_zdo_bind_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_UNBIND_REQ: {
-               zb_zdo_unbind_cb cb = container->cb;
-               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
-       }
-       break;
-       /* Custom */
-       case ZBL_CUSTOM_APS_SEND_REQ: {
-               zb_aps_send_cb cb = container->cb;
-               cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
-       } break;
-       case ZBL_CUSTOM_ZCL_SEND_REQ: {
-               zb_zcl_send_cb cb = container->cb;
-               cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_CUSTOM_LOCAL_SEND_REQ: {
-               zb_send_to_local_cb cb = container->cb;
-               cb(0, NULL, container->userdata);
-       }
-       break;
-       /* ZCL Global */
-       case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: {
-               zb_zcl_global_attr_read_cb cb = container->cb;
-               cb(0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: {
-               zb_zcl_global_attr_write_cb cb = container->cb;
-               cb(0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ: {
-               zb_zcl_global_config_report_write_cb cb = container->cb;
-               cb(0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: {
-               zb_zcl_global_attr_discover_cb cb = container->cb;
-               cb(0, 0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: {
-               zb_zcl_global_attr_write_cb cb = container->cb;
-               cb(0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ: {
-               zb_zcl_global_discover_cmds_cb cb = container->cb;
-               cb(0, 0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: {
-               zb_zcl_global_discover_cmds_cb cb = container->cb;
-               cb(0, 0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: {
-               zb_zcl_global_attr_extended_discover_cb cb = container->cb;
-               cb(0, 0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: {
-               zb_zcl_global_config_report_read_cb cb = container->cb;
-               cb(0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       /* ZCL Alarm */
-       case ZBL_ZCL_ALARM_GET_ALARM_REQ: {
-               zb_zcl_alarm_get_alarm_cb cb = container->cb;
-               cb(ZB_ZCL_STATUS_TIMEOUT, 0, ZB_ZCL_STATUS_UNSUP_CLUSTER_COMMAND,
-                       0, 0, 0, container->userdata);
-       }
-       break;
-       /* ZCL Doorlock */
-       case ZBL_ZCL_DOORLOCK_LOCK_STATE: {
-               zb_form_network_cb cb = container->cb;
-               cb(0x0000, container->userdata);
-       }
-       break;
-       /* ZCL Fanmode */
-       case ZBL_ZCL_FANMODE_FAN_MODE_STATE: {
-               zb_form_network_cb cb = container->cb;
-               cb(0x0000, container->userdata);
-       }
-       break;
-       /* ZCL Group */
-       case ZBL_ZCL_GROUP_ADD_GROUP_REQ: {
-               zb_zcl_group_add_group_cb cb = container->cb;
-               cb(0, 0, 0, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: {
-               zb_zcl_group_view_group_cb cb = container->cb;
-               cb(0, 0, 0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: {
-               zb_zcl_group_get_group_membership_cb cb = container->cb;
-               cb(0, 0, 0, 0, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: {
-               zb_zcl_group_remove_group_cb cb = container->cb;
-               cb(0, 0, 0, 0, container->userdata);
-       }
-       break;
-       /* ZCL Identify */
-       case ZBL_ZCL_IDENTIFY_QUERY_REQ: {
-               zb_zcl_identify_query_cb cb = container->cb;
-               cb(0, 0, container->userdata);
-       }
-       break;
-       /* ZCL On/Off */
-       case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: {
-               zb_form_network_cb cb = container->cb;
-               cb(0x0000, container->userdata);
-       }
-       break;
-       /* ZCL Pollcontrol */
-       case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: {
-               zb_zcl_pollctrl_check_in_cb cb = container->cb;
-               cb(0, 0, container->userdata);
-       }
-       break;
-       /* ZCL Scene */
-       case ZBL_ZCL_SCENE_ADD_SCENE_REQ: {
-               zb_zcl_scene_add_scene_cb cb = container->cb;
-               cb(0, 0, 0, 0, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: {
-               zb_zcl_scene_view_scene_cb cb = container->cb;
-               cb(0, 0, 0, 0, 0, 0, NULL, NULL, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: {
-               zb_zcl_scene_remove_scene_cb cb = container->cb;
-               cb(0, 0, 0, 0, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_STORE_SCENE_REQ: {
-               zb_zcl_scene_store_scene_cb cb = container->cb;
-               cb(0, 0, 0, 0, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: {
-               zb_zcl_scene_remove_all_scene_cb cb = container->cb;
-               cb(0, 0, 0, 0, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: {
-               zb_zcl_scene_get_scene_membership_cb cb = container->cb;
-               cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
-       }
-       break;
-       /* ZCL Thermostat */
-       case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: {
-               zb_form_network_cb cb = container->cb;
-               cb(0x0000, container->userdata);
-       }
-       break;
-       default:
-               ERR("Unhandled cid = %d", container->cid);
-       }
-
-       container->tid = 0;
-       g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
-       container->sid = 0;
-
-       return G_SOURCE_REMOVE;
-}
-
-static void _zbl_response_cb(GDBusConnection *connection,
-               const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
-               const gchar *signal_name, GVariant *parameters, gpointer user_data)
-{
-       zbl_req_cb_s *container = user_data;
-       RETM_IF(NULL == container, "container is null");
-       RETM_IF(NULL == container->cb, "cb is NULL");
-
-       container->found = true;
-       g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
-
-       switch (container->cid) {
-               /* Service */
-       case ZBL_SERVICE_FORM_NETWORK: {
-               zb_form_network_cb cb = container->cb;
-               zb_nwk_addr panid;
-               g_variant_get(parameters, "(q)", &panid);
-               cb(panid, container->userdata);
-       }
-       break;
-       case ZBL_SERVICE_DISABLE_NETWORK: {
-               zb_disable_network_cb cb = container->cb;
-               unsigned char ret = ZB_ZDP_STATUS_SUCCESS;
-               g_variant_get(parameters, "(y)", &ret);
-               cb(ret, container->userdata);
-       }
-       break;
-       /* ZDO except Bind */
-       case ZBL_ZDO_NWK_ADDR_REQ: {
-               zb_zdo_addr_cb cb = container->cb;
-
-               int j = 0;
-               zb_nwk_addr addr16;
-               zb_ieee_addr addr64;
-               unsigned char status;
-               unsigned char num;
-               unsigned char start_idx;
-               unsigned char value;
-               GVariantIter *mac_iter = NULL;
-
-               g_variant_get(parameters, "(ya(y)qyy)", &status, &mac_iter, &addr16, &num, &start_idx);
-               RETM_IF(NULL == mac_iter, "Invalid parameter !");
-
-               while (g_variant_iter_loop(mac_iter, "(y)", &value)) {
-                       addr64[j] = value;
-                       j++;
-               }
-               g_variant_iter_free(mac_iter);
-
-               cb(status, addr64, addr16, num, start_idx, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_NWK_ADDR_EXT_REQ: {
-               zb_zdo_addr_cb cb = container->cb;
-
-               int j = 0;
-               zb_nwk_addr addr16;
-               zb_ieee_addr addr64;
-               unsigned char status;
-               unsigned char num;
-               unsigned char start_idx;
-               unsigned char value;
-               GVariantIter *mac_iter = NULL;
-               GVariantIter *assoc_iter = NULL;
-
-               g_variant_get(parameters, "(ya(y)qyyaq)", &status, &mac_iter,
-                       &addr16, &num, &start_idx, &assoc_iter);
-               RETM_IF(NULL == mac_iter, "Invalid parameter !");
-
-               while (g_variant_iter_loop(mac_iter, "(y)", &value)) {
-                       addr64[j] = value;
-                       j++;
-               }
-               g_variant_iter_free(mac_iter);
-               if (NULL != assoc_iter)
-                       g_variant_iter_free(assoc_iter);
-
-               cb(status, addr64, addr16, num, start_idx, NULL, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_ACTIVE_EP_REQ: {
-               zb_zdo_active_ep_cb cb = container->cb;
-
-               int j = 0;
-               zb_nwk_addr addr16;
-               unsigned char status;
-               unsigned char count;
-               unsigned char value;
-               GVariantIter *ep_iter = NULL;
-               unsigned char *ep_list;
-
-               g_variant_get(parameters, "(yqa(y)y)", &status, &addr16, &ep_iter, &count);
-               RETM_IF(NULL == ep_iter, "Invalid parameter !");
-
-               ep_list = calloc(count+1, sizeof(unsigned char));
-               RETM_IF(NULL == ep_list, "calloc() Fail(%d)", errno);
-
-               while (g_variant_iter_loop(ep_iter, "(y)", &value)) {
-                       ep_list[j] = value;
-                       j++;
-               }
-               g_variant_iter_free(ep_iter);
-
-               cb(status, addr16, count, ep_list, container->userdata);
-
-               if (ep_list) {
-                       free(ep_list);
-                       ep_list = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_SIMPLE_DESC_REQ: {
-               zb_zdo_simple_desc_cb cb = container->cb;
-
-               int j = 0;
-               int count;
-               unsigned short addr16;
-               unsigned short value;
-               GVariantIter *in_iter = NULL;
-               GVariantIter *out_iter = NULL;
-               struct zb_zdo_simple_desc_s * records;
-
-               records = calloc(1, sizeof(struct zb_zdo_simple_desc_s));
-               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
-
-               container->found = true;
-
-               g_variant_get(parameters, "(qiyyqqyyaqaq)", &addr16, &count,
-                               &records->device_ver,
-                               &records->ep, &records->profileid, &records->deviceid,
-                               &records->num_of_in_clusters, &records->num_of_out_clusters,
-                               &in_iter, &out_iter);
-               if (NULL == in_iter || NULL == out_iter) {
-                       ERR("Invalid parameter !");
-                       free(records);
-                       return;
-               }
-#if 0
-               records->in_clusters = calloc(records->num_of_in_clusters, sizeof(unsigned short));
-               if (NULL == records->in_clusters) {
-                       ERR("calloc() Fail(%d)", errno);
-                       g_variant_iter_free(in_iter);
-                       g_variant_iter_free(out_iter);
-                       return;
-               }
-               records->out_clusters = calloc(records->num_of_out_clusters, sizeof(unsigned short));
-               if (NULL == records->out_clusters) {
-                       ERR("calloc() Fail(%d)", errno);
-                       free(records->in_clusters);
-                       g_variant_iter_free(in_iter);
-                       g_variant_iter_free(out_iter);
-                       return;
-               }
-#endif
-               while (g_variant_iter_loop(in_iter, "q", &value)) {
-                       records->in_clusters[j] = value;
-                       j++;
-               }
-               g_variant_iter_free(in_iter);
-
-               j = 0;
-               while (g_variant_iter_loop(out_iter, "q", &value)) {
-                       records->out_clusters[j] = value;
-                       j++;
-               }
-               g_variant_iter_free(out_iter);
-
-               DBG("addr16=0x%x, count=%d, records->ep=%d, records->deviceid=0x%x",
-                       addr16, count, records->ep, records->deviceid);
-               for (j = 0; j < records->num_of_in_clusters; j++)
-                       DBG("in_clusters[%d] = 0x%x", j, records->in_clusters[j]);
-               for (j = 0; j < records->num_of_out_clusters; j++)
-                       DBG("out_clusters[%d] = 0x%x", j, records->out_clusters[j]);
-
-               cb(addr16, count, records, container->userdata);
-
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: {
-               zb_zdo_match_desc_cb cb = container->cb;
-
-               int j = 0;
-               int match_len;
-               zb_nwk_addr addr16;
-               unsigned char value;
-               unsigned char status;
-               GVariantIter *ml_iter = NULL;
-               unsigned char *match_list = NULL;
-               g_variant_get(parameters, "(yqya(y))", &status, &addr16, &value, &ml_iter);
-               match_len = value;
-
-               RETM_IF(NULL == ml_iter, "Invalid parameter !");
-
-               if (match_len > 0) {
-                       match_list = calloc(match_len+1, sizeof(unsigned char));
-                       RETM_IF(NULL == match_list, "calloc() Fail(%d)", errno);
-                       while (g_variant_iter_loop(ml_iter, "(y)", &value)) {
-                               match_list[j] = value;
-                               DBG("match_list[i]=%d", j, match_list[j]);
-                               j++;
-                       }
-               }
-
-               DBG("Match count : [%d]", match_len);
-               DBG("Match list  : [%p]", match_list);
-
-               cb(status, addr16, match_len, match_list, container->userdata);
-
-               if (match_list) {
-                       free(match_list);
-                       match_list = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_NODE_DESC_REQ: {
-               zb_zdo_node_desc_cb cb = container->cb;
-
-               zb_nwk_addr addr16;
-               unsigned char status;
-               struct zb_zdo_node_descriptor_s *desc;
-
-               desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s));
-               RETM_IF(NULL == desc, "calloc() Fail(%d)", errno);
-
-               container->found = true;
-
-               g_variant_get(parameters, "(yqyyyyyyqyqqqy)", &status, &addr16,
-                       &desc->logical_type, &desc->complex_desciptor_available,
-                       &desc->user_descriptor_available, &desc->aps_flags, &desc->frequency_band,
-                       &desc->mac_capability_flags, &desc->manufacturer_code, &desc->maximum_buffer_size,
-                       &desc->maximum_incoming_transfer_size, &desc->server_mask,
-                       &desc->maximum_outgoing_transfer_size, &desc->descriptor_capability_field);
-
-               cb(status, addr16, desc, container->userdata);
-
-               if (desc) {
-                       free(desc);
-                       desc = NULL;
-               }
-
-       }
-       break;
-       case ZBL_ZDO_POWER_DESC_REQ: {
-               zb_zdo_power_desc_cb cb = container->cb;
-
-               zb_nwk_addr addr16;
-               unsigned char status;
-               struct zb_zdo_node_power_descriptor_s *desc;
-
-               desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s));
-               RETM_IF(NULL == desc, "calloc() Fail(%d)", errno);
-
-               g_variant_get(parameters, "(yqyyyy)", &status, &addr16,
-                                       &desc->current_power_mode, &desc->available_power_sources,
-                                       &desc->current_power_source, &desc->current_power_source_level);
-
-               cb(status, addr16, desc, container->userdata);
-
-               if (desc) {
-                       free(desc);
-                       desc = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_COMPLEX_DESC_REQ: {
-               zb_zdo_complex_desc_cb cb = container->cb;
-
-               int length;
-               zb_nwk_addr addr16;
-               unsigned char j = 0;
-               unsigned char value;
-               unsigned char status;
-               GVariantIter *comp_iter = NULL;
-               unsigned char *complex_desc = NULL;
-
-               g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter);
-               RETM_IF(NULL == comp_iter, "Invalid parameter !");
-
-               if (length > 0) {
-                       complex_desc = calloc(length, sizeof(char));
-                       if (NULL == complex_desc) {
-                               g_variant_iter_free(comp_iter);
-                               ERR("calloc() Fail(%d)", errno);
-                               return;
-                       }
-
-                       while (g_variant_iter_loop(comp_iter, "(y)", &value)) {
-                               complex_desc[j] = value;
-                               j++;
-                       }
-                       g_variant_iter_free(comp_iter);
-               }
-
-               cb(status, addr16, length, complex_desc, container->userdata);
-
-               if (complex_desc) {
-                       free(complex_desc);
-                       complex_desc = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_USER_DESC_REQ: {
-               zb_zdo_user_desc_cb cb = container->cb;
-
-               int length;
-               zb_nwk_addr addr16;
-               unsigned char j = 0;
-               unsigned char value;
-               unsigned char status;
-               GVariantIter *comp_iter = NULL;
-               unsigned char *complex_desc = NULL;
-
-               g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter);
-               RETM_IF(NULL == comp_iter, "Invalid parameter !");
-
-               if (length > 0) {
-                       complex_desc = calloc(length, sizeof(char));
-                       if (NULL == complex_desc) {
-                               g_variant_iter_free(comp_iter);
-                               ERR("calloc() Fail(%d)", errno);
-                               return;
-                       }
-
-                       while (g_variant_iter_loop(comp_iter, "(y)", &value)) {
-                               complex_desc[j] = value;
-                               j++;
-                       }
-                       g_variant_iter_free(comp_iter);
-               }
-
-               cb(status, addr16, length, complex_desc, container->userdata);
-
-               if (complex_desc) {
-                       free(complex_desc);
-                       complex_desc = NULL;
-               }
-       break;
-       }
-       case ZBL_ZDO_USER_DESC_SET_REQ: {
-               zb_zdo_user_desc_conf_cb cb = container->cb;
-               unsigned char status;
-               g_variant_get(parameters, "(y)", &status);
-               cb(status, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_MGMT_BIND_REQ: {
-               zb_zdo_mgmt_bind_cb cb = container->cb;
-
-               unsigned char status;
-               unsigned char value;
-
-               int i = 0;
-               int j = 0;
-               unsigned char binding_table_enteries;
-               unsigned char binding_table_list_count;
-               unsigned char start_index;
-               unsigned short dst_addr16 = 0;
-               unsigned char dst_ep = 0;
-
-               GVariantIter *mac_iter = NULL;
-               GVariantIter *rsp_iter = NULL;
-               GVariantIter *destep_iter = NULL;
-               struct zb_zdo_binding_table_s **records = NULL;
-
-               g_variant_get(parameters, "(yyyya(ayyqyqayy))", &status,
-                               &binding_table_enteries, &start_index,
-                               &binding_table_list_count, &rsp_iter);
-               RETM_IF(NULL == rsp_iter, "Invalid parameter !");
-
-               if (binding_table_list_count > 0) {
-                       records = calloc(binding_table_list_count, sizeof(zb_zdo_binding_table_h));
-                       RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
-                       for (i = 0; i < binding_table_list_count; i++) {
-                               records[i] = calloc(binding_table_list_count, sizeof(struct zb_zdo_binding_table_s));
-                               if (NULL == records[i]) {
-                                       g_variant_iter_free(rsp_iter);
-                                       ERR("calloc() Fail(%d)", errno);
-                                       goto MGMT_NWK_BIND_REQ_OUT;
-                               }
-                       }
-               }
-
-               for (i = 0; i < binding_table_list_count; i++) {
-                       g_variant_iter_loop(rsp_iter, "(ayyqyqayy)", &mac_iter,
-                               &records[i]->src_ep, &records[i]->clusterid,
-                               &records[i]->dst_addr_mode, &dst_addr16,
-                               &destep_iter, &dst_ep);
-                       if (NULL == mac_iter) {
-                               ERR("Invalid parameter !");
-                               goto MGMT_NWK_BIND_REQ_OUT;
-                       }
-                       if (NULL == destep_iter) {
-                               ERR("Invalid parameter !");
-                               goto MGMT_NWK_BIND_REQ_OUT;
-                       }
-
-                       for (j = 0; j < 8; j++) {
-                               g_variant_iter_loop(mac_iter, "y", &value);
-                               records[i]->src_addr64[j] = value;
-                       }
-                       g_variant_iter_free(mac_iter);
-
-                       if (0x03 == records[i]->dst_addr_mode) {
-                               for (j = 0; j < 8; j++) {
-                                       g_variant_iter_loop(destep_iter, "y", &value);
-                                       records[i]->dst_addr64[j] = value;
-                               }
-                               g_variant_iter_free(destep_iter);
-
-                               records[i]->dst_ep = dst_ep;
-                               DBG("Destination MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
-                                       records[i]->dst_addr64[7], records[i]->dst_addr64[6],
-                                       records[i]->dst_addr64[5], records[i]->dst_addr64[4],
-                                       records[i]->dst_addr64[3], records[i]->dst_addr64[2],
-                                       records[i]->dst_addr64[1], records[i]->dst_addr64[0]);
-
-                       } else if (0x01 == records[i]->dst_addr_mode) {
-                               records[i]->dst_addr16 = dst_addr16;
-                       }
-               }
-               g_variant_iter_free(rsp_iter);
-
-               cb(status, binding_table_enteries, start_index, binding_table_list_count,
-                       (void **)records, container->userdata);
-
-MGMT_NWK_BIND_REQ_OUT:
-               for (i = 0; i < binding_table_list_count; i++) {
-                       if (records[i]) {
-                               free(records[i]);
-                               records[i] = NULL;
-                       }
-               }
-               free(records);
-               records = NULL;
-       }
-       break;
-       case ZBL_ZDO_MGMT_LQI_REQ: {
-               zb_zdo_mgmt_lqi_cb cb = container->cb;
-
-               int i = 0;
-               int j = 0;
-               unsigned char value;
-               unsigned char status;
-               unsigned char start_index;
-               unsigned char neighbor_table_enteries;
-               unsigned char neighbor_table_list_count;
-
-               GVariantIter *resp_iter = NULL;
-               GVariantIter *mac_iter = NULL;
-               GVariantIter *mac_iter1 = NULL;
-               struct zb_zdo_neighbor_table_desc_s **records = NULL;
-
-               g_variant_get(parameters, "(yyyya(ayayyqyyyyy))", &status, &neighbor_table_enteries,
-                               &start_index, &neighbor_table_list_count, &resp_iter);
-               RETM_IF(NULL == resp_iter, "Invalid parameter !");
-
-               if (neighbor_table_list_count > 0) {
-                       records = calloc(neighbor_table_list_count, sizeof(zb_zdo_neighbor_table_desc_h));
-                       RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
-                       for (i = 0; i < neighbor_table_list_count; i++) {
-                               records[i] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s));
-                               if (NULL == records[i]) {
-                                       ERR("calloc() Fail(%d)", errno);
-                                       goto MGMT_LQI_REQ_OUT;
-                               }
-                       }
-               }
-               for (i = 0; i < neighbor_table_list_count; i++) {
-                       g_variant_iter_loop(resp_iter, "(ayayyqyyyyy)",
-                                       &mac_iter, &mac_iter1,
-                                       &records[i]->device_type, &records[i]->addr16,
-                                       &records[i]->rx_on_when_idle, &records[i]->relationship,
-                                       &records[i]->permit_joining, &records[i]->depth,
-                                       &records[i]->lqi);
-                       if (NULL == mac_iter || NULL == mac_iter1) {
-                               ERR("Invalid parameter !");
-                               goto MGMT_LQI_REQ_OUT;
-                       }
-
-                       for (j = 0; j < 8; j++) {
-                               g_variant_iter_loop(mac_iter, "y", &value);
-                               records[i]->extended_pan_id[j] = value;
-                               g_variant_iter_loop(mac_iter1, "y", &value);
-                               records[i]->addr64[j] = value;
-                       }
-                       g_variant_iter_free(mac_iter);
-                       g_variant_iter_free(mac_iter1);
-
-                       DBG("ext PAN ID = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
-                               records[i]->extended_pan_id[0], records[i]->extended_pan_id[1],
-                               records[i]->extended_pan_id[2], records[i]->extended_pan_id[3],
-                               records[i]->extended_pan_id[4], records[i]->extended_pan_id[5],
-                               records[i]->extended_pan_id[6], records[i]->extended_pan_id[7]);
-
-                       DBG("IEEE address = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
-                               records[i]->addr64[0], records[i]->addr64[1], records[i]->addr64[2],
-                               records[i]->addr64[3], records[i]->addr64[4], records[i]->addr64[5],
-                               records[i]->addr64[6], records[i]->addr64[7]);
-               }
-               g_variant_iter_free(resp_iter);
-
-               cb(status, neighbor_table_enteries, start_index, neighbor_table_list_count,
-                       (void **)records, container->userdata);
-
-MGMT_LQI_REQ_OUT:
-               if (records) {
-                       for (i = 0; i < neighbor_table_list_count; i++) {
-                               if (records[i]) {
-                                       free(records[i]);
-                                       records[i] = NULL;
-                               }
-                       }
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_MGMT_RTG_REQ: {
-               zb_zdo_mgmt_rtg_cb cb = container->cb;
-
-               int i;
-               unsigned char status;
-               unsigned char start_index;
-               unsigned char routing_table_enteries;
-               unsigned char routing_table_list_count;
-
-               GVariantIter *rsp_iter = NULL;
-               struct zb_zdo_routing_table_s **records = NULL;
-
-               g_variant_get(parameters, "(yyyya(qyyyyq))", &status, &routing_table_enteries,
-                               &start_index, &routing_table_list_count, &rsp_iter);
-               RETM_IF(NULL == rsp_iter, "Invalid parameter !");
-
-               if (routing_table_list_count > 0) {
-                       records = calloc(routing_table_list_count, sizeof(zb_zdo_routing_table_h));
-                       RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
-                       for (i = 0; i < routing_table_list_count; i++) {
-                               records[i] = calloc(1, sizeof(struct zb_zdo_routing_table_s));
-                               if (NULL == records[i]) {
-                                       ERR("calloc() Fail(%d)", errno);
-                                       goto MGMT_NWK_RTG_REQ_OUT;
-                               }
-                       }
-               }
-
-               for (i = 0; i < routing_table_list_count; i++) {
-                       g_variant_iter_loop(rsp_iter, "(qyyyyq)", &records[i]->dst_addr,
-                               &records[i]->status, &records[i]->memory_constrained,
-                               &records[i]->route_record_required,
-                               &records[i]->many_to_one, &records[i]->next_hop_addr);
-               }
-               g_variant_iter_free(rsp_iter);
-
-               cb(status, routing_table_enteries, start_index, routing_table_list_count,
-                       (void **)records, container->userdata);
-
-MGMT_NWK_RTG_REQ_OUT:
-               for (i = 0; i < routing_table_list_count; i++) {
-                       if (records[i]) {
-                               free(records[i]);
-                               records[i] = NULL;
-                       }
-               }
-               free(records);
-               records = NULL;
-       }
-       break;
-       case ZBL_ZDO_MGMT_NWK_DISC_REQ: {
-               zb_zdo_mgmt_nwk_disc_cb cb = container->cb;
-                       int i = 0;
-               int j = 0;
-               unsigned char value;
-               unsigned char status = 0;
-               unsigned char nwk_count = 0;
-               unsigned char start_index = 0;
-               unsigned char nwk_list_count = 0;
-
-               GVariantIter *mac_iter = NULL;
-               GVariantIter *resp_iter = NULL;
-
-               DBG("_zbl_mgmt_nwk_disc_req_cb()");
-
-               g_variant_get(parameters, "(yyyya(ayyyyyyy))", &status, &nwk_count,
-                       &start_index, &nwk_list_count, &resp_iter);
-               RETM_IF(NULL == resp_iter, "Invalid parameter !");
-
-               struct zb_zdo_network_list_record_s **records = NULL;
-
-               if (!status) {
-                       if (nwk_list_count > 0) {
-                               records = calloc(nwk_list_count, sizeof(zb_zdo_network_list_record_h));
-                               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
-                               for (i = 0; i < nwk_list_count; i++) {
-                                       records[i] = calloc(1, sizeof(struct zb_zdo_network_list_record_s));
-                                       if (NULL == records[i]) {
-                                               ERR("calloc() Fail(%d)", errno);
-                                               goto MGMT_NWK_DISC_REQ_OUT;
-                                       }
-                               }
-                       }
-                       for (i = 0; i < nwk_list_count; i++) {
-                               g_variant_iter_loop(resp_iter, "(ayyyyyyy)",
-                                       &mac_iter, &records[i]->logical_channel,
-                                       &records[i]->stack_profile, &records[i]->zigbee_version,
-                                       &records[i]->beacon_order,
-                                       &records[i]->superframe_order, &records[i]->permit_joining);
-                               if (NULL == mac_iter) {
-                                       ERR("Invalid parameter !");
-                                       goto MGMT_NWK_DISC_REQ_OUT;
-                               }
-
-                               for (j = 0; j < 8; j++) {
-                                       g_variant_iter_loop(mac_iter, "y", &value);
-                                       records[i]->extended_pan_id[j] = value;
-                               }
-                               g_variant_iter_free(mac_iter);
-                       }
-                       g_variant_iter_free(resp_iter);
-               }
-
-               cb(status, nwk_count, start_index, nwk_list_count,
-                       (void **)records, container->userdata);
-
-MGMT_NWK_DISC_REQ_OUT:
-               if (records) {
-                       for (i = 0; i < nwk_list_count; i++) {
-                               if (records[i]) {
-                                       free(records[i]);
-                                       records[i] = NULL;
-                               }
-                       }
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: {
-               zb_zdo_mgmt_permit_joining_cb cb = container->cb;
-               unsigned char status;
-               g_variant_get(parameters, "(y)", &status);
-               cb(status, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_MGMT_LEAVE_REQ: {
-               zb_zdo_mgmt_leave_cb cb = container->cb;
-               unsigned char status;
-               g_variant_get(parameters, "(y)", &status);
-               cb(status, container->userdata);
-       }
-       break;
-       /* ZDO Bind */
-       case ZBL_ZDO_BIND_REQ: {
-               zb_zdo_bind_cb cb = container->cb;
-               unsigned char status;
-               g_variant_get(parameters, "(y)", &status);
-               cb(status, container->userdata);
-       }
-       break;
-       case ZBL_ZDO_UNBIND_REQ: {
-               zb_zdo_unbind_cb cb = container->cb;
-               unsigned char status;
-               g_variant_get(parameters, "(y)", &status);
-               cb(status, container->userdata);
-       }
-       break;
-       /* Custom */
-       case ZBL_CUSTOM_APS_SEND_REQ: {
-               zb_aps_send_cb cb = container->cb;
-
-               unsigned short addr16;
-               unsigned char src_ep;
-               unsigned char dst_ep;
-               unsigned short clusterid;
-               unsigned short profileid;
-               unsigned short payload_len = 0;
-               unsigned char *payload = NULL;
-
-               unsigned char value;
-               GVariantIter *payload_iter = NULL;
-               int i = 0;
-
-               g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep,
-                               &clusterid, &profileid, &payload_len, &payload_iter);
-               RETM_IF(NULL == payload_iter, "Invalid parameter !");
-
-               if (payload_len > 0) {
-                       payload = calloc(payload_len+1, sizeof(unsigned char));
-                       if (!payload) {
-                               ERR("calloc() Fail(%d)", errno);
-                               goto ZBL_CUSTOM_APS_SEND_REQ_OUT;
-                       }
-                       while (g_variant_iter_loop(payload_iter, "(y)", &value))
-                               payload[i++] = value;
-               }
-
-               cb(addr16, src_ep, dst_ep, clusterid, profileid, payload_len, payload,
-                       container->userdata);
-ZBL_CUSTOM_APS_SEND_REQ_OUT:
-               g_variant_iter_free(payload_iter);
-               if (payload) {
-                       free(payload);
-                       payload = NULL;
-               }
-       }
-       break;
-       case ZBL_CUSTOM_ZCL_SEND_REQ: {
-               zb_zcl_send_cb cb = container->cb;
-
-               unsigned short addr16;
-               unsigned char src_ep;
-               unsigned char dst_ep;
-               unsigned short clusterid;
-               unsigned short profileid;
-               unsigned short payload_len = 0;
-               unsigned char *payload = NULL;
-
-               unsigned char value;
-               GVariantIter *payload_iter = NULL;
-               int i = 0;
-
-               g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep,
-                               &clusterid, &profileid, &payload_len, &payload_iter);
-               RETM_IF(NULL == payload_iter, "Invalid parameter !");
-
-               if (payload_len > 0) {
-                       payload = calloc(payload_len + 1, sizeof(unsigned char));
-                       if (!payload) {
-                               ERR("calloc() Fail(%d)", errno);
-                               goto ZBL_CUSTOM_ZCL_SEND_REQ_OUT;
-                       }
-                       while (g_variant_iter_loop(payload_iter, "(y)", &value))
-                               payload[i++] = value;
-               }
-
-               cb(addr16, src_ep, dst_ep, clusterid, profileid, payload_len, payload,
-                       container->userdata);
-ZBL_CUSTOM_ZCL_SEND_REQ_OUT:
-               g_variant_iter_free(payload_iter);
-               if (payload) {
-                       free(payload);
-                       payload = NULL;
-               }
-       }
-       break;
-       case ZBL_CUSTOM_LOCAL_SEND_REQ: {
-               zb_send_to_local_cb cb = container->cb;
-
-               unsigned char *data = NULL;
-               unsigned short length = 0;
-               unsigned char value;
-               GVariantIter *payload_iter = NULL;
-               int i = 0;
-
-               g_variant_get(parameters, "(qa(y))", &length, &payload_iter);
-               RETM_IF(NULL == payload_iter, "Invalid parameter !");
-
-               if (length > 0) {
-                       data = calloc(length, sizeof(unsigned char));
-                       if (!data) {
-                               ERR("calloc() Fail(%d)", errno);
-                               goto ZBL_CUSTOM_LOCAL_SEND_REQ_OUT;
-                       }
-
-                       while (g_variant_iter_loop(payload_iter, "(y)", &value))
-                               data[i++] = value;
-               }
-
-               cb(length, data, container->userdata);
-ZBL_CUSTOM_LOCAL_SEND_REQ_OUT:
-               g_variant_iter_free(payload_iter);
-               if (data) {
-                       free(data);
-                       data = NULL;
-               }
-       }
-       break;
-       /* ZCL Global */
-       case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: {
-               zb_zcl_global_attr_read_cb cb = container->cb;
-
-               int j = 0;
-               int isString;
-               unsigned char value;
-
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned short attr_id;
-               unsigned short clusterid;
-               unsigned char status;
-               unsigned char type;
-               unsigned short count;
-               unsigned char attr_value[128];
-
-               GVariantIter *iter = NULL;
-               struct read_attribute_status_record_s *records = NULL;
-
-               g_variant_get(parameters, "(qya(y)qqyyqi)",
-                       &addr16, &ep, &iter, &attr_id, &clusterid, &status, &type, &count, &isString);
-               RETM_IF(NULL == iter, "Invalid parameter !");
-
-               if (!isString) {
-                       while (g_variant_iter_loop(iter, "(y)", &value)) {
-                               attr_value[j] = value;
-                               DBG("attr_value[%d] = 0x%02X", j, value);
-                               j++;
-                       }
-                       g_variant_iter_free(iter);
-               } else {
-                       while (g_variant_iter_loop(iter, "(y)", &value)) {
-                               if (j == 0)
-                                       count = value;
-                               attr_value[j] = value;
-                               DBG("attr_value[%d] = 0x%02X", j, value);
-                               j++;
-                       }
-                       g_variant_iter_free(iter);
-               }
-
-               records = calloc(1, sizeof(struct read_attribute_status_record_s));
-
-               if (!records) {
-                       ERR("calloc() Fail(%d)", errno);
-                       goto GLOBAL_READ_ATTRIBUTE_REQ_OUT;
-               }
-
-               records->id = attr_id;
-               records->status = status;
-               records->type = type;
-               records->value = attr_value;
-
-               cb(addr16, ep, clusterid, (void **)&records, count, container->userdata);
-
-GLOBAL_READ_ATTRIBUTE_REQ_OUT:
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: {
-               zb_zcl_global_attr_write_cb cb = container->cb;
-
-               int i = 0;
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned short clusterid;
-               unsigned short attributeid;
-               int count;
-               unsigned char value;
-
-               GVariantIter *stat_iter = NULL;
-               GVariantIter *attr_iter = NULL;
-               struct write_attribute_status_record_s *records = NULL;
-
-               g_variant_get(parameters, "(qya(y)aqqi)",
-                       &addr16, &ep, &stat_iter, &attr_iter, &clusterid, &count);
-               RETM_IF(NULL == stat_iter, "Invalid parameter !");
-               RETM_IF(NULL == attr_iter, "Invalid parameter !");
-
-               records = calloc(count,
-                       sizeof(struct write_attribute_status_record_s));
-               if (!records) {
-                       g_variant_iter_free(stat_iter);
-                       g_variant_iter_free(attr_iter);
-                       ERR("calloc() Fail(%d)", errno);
-                       goto GLOBAL_WRITE_ATTRIBUTE_REQ_OUT;
-               }
-
-               while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
-                       records[i].status = value;
-                       i++;
-               }
-               g_variant_iter_free(stat_iter);
-
-               i = 0;
-               while (g_variant_iter_loop(attr_iter, "q", &attributeid)) {
-                       records[i].id = attributeid;
-                       DBG("Attribute Id 0x%04X", attributeid);
-                       i++;
-               }
-               g_variant_iter_free(attr_iter);
-
-               cb(addr16, ep, clusterid, (void **)&records, count, container->userdata);
-
-GLOBAL_WRITE_ATTRIBUTE_REQ_OUT:
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ: {
-               int j = 0;
-               int l = 0;
-               int k = 0;
-               int rec_len;
-
-               unsigned char ep;
-               unsigned short clusterid;
-               unsigned short attIdVal;
-               unsigned char value;
-
-               GVariantIter *stat_iter = NULL;
-               GVariantIter *attr_iter = NULL;
-               GVariantIter *dir_iter = NULL;
-
-               zb_nwk_addr addr16;
-               zb_zcl_global_config_report_write_cb cb = container->cb;
-               struct reporting_configuration_response_record_s *records = NULL;
-
-               g_variant_get(parameters, "(a(y)aqa(y)qiqy)",
-                       &stat_iter, &attr_iter, &dir_iter, &clusterid, &rec_len, &addr16, &ep);
-               RETM_IF(NULL == stat_iter, "Invalid parameter !");
-               RETM_IF(NULL == attr_iter, "Invalid parameter !");
-               RETM_IF(NULL == dir_iter, "Invalid parameter !");
-
-               records = calloc(rec_len,
-                       sizeof(struct reporting_configuration_response_record_s));
-               if (!records) {
-                       g_variant_iter_free(stat_iter);
-                       g_variant_iter_free(attr_iter);
-                       g_variant_iter_free(dir_iter);
-                       ERR("calloc() Fail(%d)", errno);
-                       goto GLOBAL_CONFIGURE_REPORTING_REQ_OUT;
-               }
-
-               while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
-                       DBG("Value 0x%02X", value);
-                       records[j].status = value;
-                       j++;
-               }
-               g_variant_iter_free(stat_iter);
-
-               while (g_variant_iter_loop(attr_iter, "q", &attIdVal)) {
-                       if (records[l].status != ZB_ZCL_STATUS_SUCCESS)
-                               records[l].id = attIdVal;
-                       l++;
-               }
-               g_variant_iter_free(attr_iter);
-
-               while (g_variant_iter_loop(dir_iter, "(y)", &value)) {
-                       if (records[k].status != ZB_ZCL_STATUS_SUCCESS)
-                               records[k].dir = value;
-                       k++;
-               }
-               g_variant_iter_free(dir_iter);
-
-               cb(addr16, ep, clusterid, (void **)&records, rec_len, container->userdata);
-
-GLOBAL_CONFIGURE_REPORTING_REQ_OUT:
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: {
-
-               int j = 0;
-               int l = 0;
-               int count;
-               unsigned short clusterid;
-               unsigned short attributeid;
-               unsigned char value;
-               int discovery_complete;
-
-               GVariantIter *stat_iter = NULL;
-               GVariantIter *attr_iter = NULL;
-
-               zb_nwk_addr addr16;
-               unsigned char ep;
-
-               zb_zcl_global_attr_discover_cb cb = container->cb;
-               struct discover_attribute_info_record_s **records = NULL;
-
-               g_variant_get(parameters, "(qya(y)aqqii)",  &addr16, &ep, &stat_iter,
-                                               &attr_iter, &clusterid, &count, &discovery_complete);
-               RETM_IF(NULL == stat_iter, "Invalid parameter !");
-               RETM_IF(NULL == attr_iter, "Invalid parameter !");
-
-               records = calloc(count, sizeof(zb_zcl_discover_attr_info_record_h));
-               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
-               for (j = 0; j < count; j++) {
-                       records[j] = calloc(1, sizeof(struct discover_attribute_info_record_s));
-                       if (NULL == records[j]) {
-                               ERR("calloc() Fail(%d)", errno);
-                               for (l = 0; l < j; l++) {
-                                       free(records[l]);
-                                       records[l] = NULL;
-                               }
-                               free(records);
-                               records = NULL;
-
-                               g_variant_iter_free(stat_iter);
-                               g_variant_iter_free(attr_iter);
-                               return;
-                       }
-               }
-
-               j = 0;
-               while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
-                       records[j]->type = value;
-                       DBG("Attribute Type 0x%02X", value);
-                       j++;
-               }
-               g_variant_iter_free(stat_iter);
-
-               while (g_variant_iter_loop(attr_iter, "q", &attributeid)) {
-                       records[l]->id = attributeid;
-                       DBG("Attribute Id 0x%04X", attributeid);
-                       l++;
-               }
-               g_variant_iter_free(attr_iter);
-
-               cb(addr16, ep, clusterid, discovery_complete, (void *)records, count,
-                       container->userdata);
-
-               for (j = 0; j < count; j++) {
-                       if (records[j]) {
-                               free(records[j]);
-                               records[j] = NULL;
-                       }
-               }
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: {
-               /* CAUTION: Currently we don't support this command */
-               zb_zcl_global_attr_write_cb cb = container->cb;
-               cb(0, 0, 0, NULL, 0, container->userdata);
-       }
-       break;
-       /* GLOBAL_DISCOVER_COMMAND_RECEIVED and GLOBAL_DISCOVER_COMMAND_GENERATED should be handled as same way */
-       case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ:
-       case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: {
-
-               int j = 0;
-               char value;
-               unsigned short clusterid;
-               unsigned short cmd_len;
-               unsigned char *cmd_data;
-               unsigned char discoveryComplete;
-
-               GVariantIter *cmd_iter = NULL;
-
-               unsigned char ep;
-               zb_nwk_addr addr16;
-               zb_zcl_global_discover_cmds_cb cb = container->cb;
-
-               g_variant_get(parameters, "(a(y)qqqyy)", &cmd_iter, &clusterid, &cmd_len,
-                       &addr16, &ep, &discoveryComplete);
-               RETM_IF(NULL == cmd_iter, "Invalid parameter !");
-
-               cmd_data = calloc(cmd_len+1, sizeof(char));
-               if (NULL == cmd_data) {
-                       ERR("calloc() Fail(%d)", errno);
-                       g_variant_iter_free(cmd_iter);
-                       return;
-               }
-
-               while (g_variant_iter_loop(cmd_iter, "(y)", &value)) {
-                       DBG("Value 0x%02X", value);
-                       cmd_data[j] = value;
-                       j++;
-               }
-               g_variant_iter_free(cmd_iter);
-
-               cb(addr16, ep, clusterid, discoveryComplete, cmd_data, cmd_len,
-                       container->userdata);
-               if (cmd_data) {
-                       free(cmd_data);
-                       cmd_data = NULL;
-               }
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: {
-
-               int i = 0;
-               int j = 0;
-               unsigned short clusterid;
-               unsigned char t_value;
-               unsigned char ac_value;
-
-               unsigned short rec_len;
-               unsigned short attr_data;
-               unsigned char discoveryComplete;
-               GVariantIter *attr_iter = NULL;
-               GVariantIter *type_iter = NULL;
-               GVariantIter *ac_iter = NULL;
-
-               unsigned char ep;
-               zb_nwk_addr addr16;
-               struct extended_attribute_infomation_s **records = NULL;
-               zb_zcl_global_attr_extended_discover_cb cb = container->cb;
-
-               DBG("Will get the value now");
-
-               g_variant_get(parameters, "(aqa(y)a(y)qqqyy)", &attr_iter, &type_iter, &ac_iter,
-                       &clusterid, &rec_len, &addr16, &ep, &discoveryComplete);
-               RETM_IF(NULL == attr_iter, "Invalid parameter !");
-               RETM_IF(NULL == type_iter, "Invalid parameter !");
-               RETM_IF(NULL == ac_iter, "Invalid parameter !");
-
-               DBG("records length 0x%04X", rec_len);
-
-               records = calloc(rec_len, sizeof(zb_zcl_extended_attr_info_h));
-               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
-               for (j = 0; j < rec_len; j++) {
-                       records[j] = calloc(1, sizeof(struct extended_attribute_infomation_s));
-                       if (NULL == records[j]) {
-                               for (i = 0; i < j; i++) {
-                                       free(records[i]);
-                                       records[i] = NULL;
-                               }
-                               free(records);
-                               records = NULL;
-
-                               g_variant_iter_free(attr_iter);
-                               g_variant_iter_free(type_iter);
-                               g_variant_iter_free(ac_iter);
-
-                               ERR("calloc() Fail(%d)", errno);
-                               return;
-                       }
-               }
-
-               j = 0;
-               while (g_variant_iter_loop(attr_iter, "q", &attr_data)
-                               && g_variant_iter_loop(type_iter, "(y)", &t_value)
-                               && g_variant_iter_loop(ac_iter, "(y)", &ac_value)) {
-                       DBG("attrData 0x%04X", attr_data);
-                       DBG("t_value 0x%02X", t_value);
-                       DBG("ac_value 0x%02X", ac_value);
-                       records[j]->id = attr_data;
-                       records[j]->type = t_value;
-                       records[j]->acl = ac_value;
-                       j++;
-               }
-               g_variant_iter_free(attr_iter);
-               g_variant_iter_free(type_iter);
-               g_variant_iter_free(ac_iter);
-
-               cb(addr16, ep, clusterid, discoveryComplete, (void *)records, rec_len,
-                       container->userdata);
-
-               for (j = 0; j < rec_len; j++) {
-                       if (records[j]) {
-                               free(records[j]);
-                               records[j] = NULL;
-                       }
-               }
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: {
-
-               int i = 0;
-               int j = 0;
-               char value;
-               unsigned char *status = NULL;
-               unsigned char *data_size = NULL;
-               unsigned char *change = NULL;
-               unsigned short record_length;
-
-               GVariantIter *resp_iter = NULL;
-               GVariantIter *data_iter = NULL;
-
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned short clusterid;
-               zb_zcl_global_attr_read_cb cb = container->cb;
-
-               struct reporting_configuration_record_s **records = NULL;
-
-               g_variant_get(parameters, "(qyqqa(yyqyqqayq))",
-                       &addr16, &ep, &clusterid, &record_length, &resp_iter);
-               RETM_IF(NULL == resp_iter, "Invalid parameter !");
-
-               records = calloc(record_length, sizeof(zb_zcl_reporting_config_record_h));
-               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
-
-               for (i = 0; i < record_length; i++) {
-                       records[i] = calloc(1, sizeof(struct reporting_configuration_record_s));
-                       if (NULL == records[i]) {
-                               ERR("calloc() Fail(%d)", errno);
-                               goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
-                       }
-               }
-               if (!records) {
-                       ERR("calloc() Fail(%d)", errno);
-                       goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
-               }
-
-               DBG("record_length %d", record_length);
-               status = calloc(record_length, sizeof(unsigned char));
-               data_size = calloc(record_length, sizeof(unsigned char));
-               if (!status || !data_size) {
-                       ERR("Couldn't allocate the memory (%s)", errno);
-                       goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
-               }
-
-               for (i = 0; i < record_length; i++) {
-                       g_variant_iter_loop(resp_iter, "(yyqyqqayq)", &status[i], &records[i]->dir,
-                               &records[i]->id, &records[i]->type, &records[i]->max_i, &records[i]->min_i,
-                               &data_iter, &records[i]->to);
-                       if (NULL == data_iter) {
-                               ERR("Invalid parameter !");
-                               goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
-                       }
-
-                       if (records[i]->dir != ZCL_REPORTING_DIRECTION_REPORTED &&
-                               (zb_zcl_get_analog_or_discret(records[i]->type) == ZB_ZCL_DATA_TYPE_ANALOG)) {
-                               data_size[i] = zb_zcl_get_data_size(records[j]->type);
-                               j = 0;
-                               if (data_size[i] != 0xff) {
-                                       change = calloc(data_size[i]+1, sizeof(unsigned char));
-                                       if (!change) {
-                                               ERR("calloc() Fail(%d)", errno);
-                                               records[i]->change = NULL;
-                                               g_variant_iter_free(data_iter);
-                                               goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
-                                       }
-
-                                       while (g_variant_iter_loop(data_iter, "y", &value)) {
-                                               change[j] = value;
-                                               j++;
-                                       }
-                                       g_variant_iter_free(data_iter);
-                                       records[i]->change = change;
-                               } else
-                                       records[i]->change = NULL;
-                       } else
-                               records[i]->change = NULL;
-               }
-               g_variant_iter_free(resp_iter);
-
-               cb(addr16, ep, clusterid, (void **)records, record_length, container->userdata);
-
-GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT:
-               if (data_size) {
-                       free(data_size);
-                       data_size = NULL;
-               }
-               if (status) {
-                       free(status);
-                       status = NULL;
-               }
-
-               for (i = 0; i < record_length; i++) {
-                       if (records[i] && records[i]->change) {
-                               free(records[i]->change);
-                               records[i]->change = NULL;
-                       }
-                       if (records[i]) {
-                               free(records[i]);
-                               records[i] = NULL;
-                       }
-               }
-               if (records) {
-                       free(records);
-                       records = NULL;
-               }
-       }
-       break;
-       /* ZCL Alarm */
-       case ZBL_ZCL_ALARM_GET_ALARM_REQ: {
-
-               zb_nwk_addr addr16 = 0;
-               unsigned char ep = 0;
-               unsigned char status = 0;
-               unsigned char alarm_code = 0;
-               unsigned short clusterid = 0;
-               unsigned int time_stamp = 0;
-
-               zb_zcl_alarm_get_alarm_cb cb = container->cb;
-
-               g_variant_get(parameters, "(qyyyqu)", &addr16, &ep, &status, &alarm_code,
-                                       &clusterid, &time_stamp);
-               cb(addr16, ep, status, alarm_code, clusterid, time_stamp, container->userdata);
-       }
-       break;
-       /* ZCL Doorlock */
-       case ZBL_ZCL_DOORLOCK_LOCK_STATE: {
-               ERR("Unhandled cid = %d", container->cid);
-       }
-       break;
-       /* ZCL Fanmode */
-       case ZBL_ZCL_FANMODE_FAN_MODE_STATE: {
-               ERR("Unhandled cid = %d", container->cid);
-       }
-       break;
-       /* ZCL Group */
-       case ZBL_ZCL_GROUP_ADD_GROUP_REQ: {
-               zb_zcl_group_add_group_cb cb = container->cb;
-
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned char status;
-               unsigned short group_id;
-
-               g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
-               cb(addr16, ep, status, group_id, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: {
-               zb_zcl_group_view_group_cb cb = container->cb;
-
-               int j = 0;
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned char value;
-               unsigned char status;
-               unsigned short group_id;
-               char *group_name = NULL;
-               GVariantIter *grpNameiter = NULL;
-
-               g_variant_get(parameters, "(qyyqay)", &addr16, &ep, &status, &group_id, &grpNameiter);
-               if (NULL == grpNameiter) {
-                       ERR("Invalid grpNameiter");
-                       goto GROUP_VIEW_GROUP_REQ_OUT;
-               }
-
-               g_variant_iter_loop(grpNameiter, "y", &value);
-               /* first byte indicates the length of the string */
-               if ((value - '0') > 0) {
-                       DBG("Value %d ", (value - '0'));
-                       group_name = calloc((value - '0') + 1, sizeof(char));
-                       if (NULL == group_name) {
-                               g_variant_iter_free(grpNameiter);
-                               ERR("calloc() Fail(%d)", errno);
-                               goto GROUP_VIEW_GROUP_REQ_OUT;
-                       }
-                       group_name[j] = value;
-                       j++;
-                       while (g_variant_iter_loop(grpNameiter, "y", &value) && (j <= (value - '0'))) {
-                               group_name[j] = value;
-                               DBG("Name %c", group_name[j]);
-                               j++;
-                       }
-                       g_variant_iter_free(grpNameiter);
-               } else {
-                       group_name = calloc(2, sizeof(char));
-                       if (NULL == group_name) {
-                               g_variant_iter_free(grpNameiter);
-                               ERR("calloc() Fail(%d)", errno);
-                               goto GROUP_VIEW_GROUP_REQ_OUT;
-                       }
-                       group_name[j++] = value;
-                       group_name[j++] = '\0';
-               }
-
-               DBG("GroupName = %s", group_name);
-               cb(addr16, ep, status, group_id, group_name, container->userdata);
-
-GROUP_VIEW_GROUP_REQ_OUT:
-               if (group_name) {
-                       free(group_name);
-                       group_name = NULL;
-               }
-       }
-       break;
-       case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: {
-               zb_zcl_group_get_group_membership_cb cb = container->cb;
-
-               int j = 0;
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned short gl_value;
-               unsigned char capacity;
-               unsigned char group_count;
-               unsigned short *grouplist = NULL;
-               GVariantIter *grpListiter = NULL;
-
-               g_variant_get(parameters, "(qyyyaq)", &addr16, &ep, &capacity, &group_count, &grpListiter);
-               RETM_IF(NULL == grpListiter, "Invalid parameter !");
-
-               if (group_count > 0) {
-                       grouplist = calloc(group_count+1, sizeof(unsigned short));
-                       if (NULL == grouplist) {
-                               g_variant_iter_free(grpListiter);
-                               ERR("calloc() Fail(%d)", errno);
-                               return;
-                       }
-                       RETM_IF(NULL == grouplist, "calloc() Fail(%d)", errno);
-
-                       while (g_variant_iter_loop(grpListiter, "q", &gl_value)) {
-                               grouplist[j] = gl_value;
-                               j++;
-                       }
-                       g_variant_iter_free(grpListiter);
-               }
-
-               cb(addr16, ep, capacity, group_count, grouplist, container->userdata);
-
-               if (grouplist) {
-                       free(grouplist);
-                       grouplist = NULL;
-               }
-       }
-       break;
-       case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: {
-               zb_zcl_group_remove_group_cb cb = container->cb;
-
-               zb_nwk_addr addr16;
-               unsigned char ep;
-               unsigned char status;
-               unsigned short group_id;
-
-               g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
-
-               cb(addr16, ep, status, group_id, container->userdata);
-       }
-       break;
-       /* ZCL Identify */
-       case ZBL_ZCL_IDENTIFY_QUERY_REQ: {
-               zb_zcl_identify_query_cb cb = container->cb;
-
-               zb_nwk_addr addr16 = 0;
-               unsigned short identify_time = 0;
-               g_variant_get(parameters, "(qq)", &addr16, &identify_time);
-
-               cb(addr16, identify_time, container->userdata);
-       }
-       break;
-       /* ZCL On/Off */
-       case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: {
-               ERR("Unhandled cid = %d", container->cid);
-       }
-       break;
-       /* ZCL Pollcontrol */
-       case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: {
-               zb_zcl_pollctrl_check_in_cb cb = container->cb;
-
-               zb_nwk_addr addr16 = 0;
-               unsigned char ep = 0;
-
-               g_variant_get(parameters, "(qy)", &addr16, &ep);
-               cb(addr16, ep, container->userdata);
-       }
-       break;
-       /* ZCL Scene */
-       case ZBL_ZCL_SCENE_ADD_SCENE_REQ: {
-               zb_zcl_scene_add_scene_cb cb = container->cb;
-
-               zb_nwk_addr addr16 = 0;
-               unsigned char ep;
-               unsigned char status;
-               unsigned short group_id;
-               unsigned char scene_id;
-
-               g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status,     &group_id, &scene_id);
-               cb(addr16, ep, status, group_id, scene_id, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: {
-               zb_zcl_scene_view_scene_cb cb = container->cb;
-
-               int j = 0;
-               int len;
-               zb_nwk_addr addr16 = 0;
-               unsigned char ep;
-               unsigned char status;
-               unsigned short group_id;
-               unsigned char scene_id;
-               unsigned short transition_time = 0;
-               unsigned char value;
-               unsigned short ext_len = 0;
-               char *scene_name = NULL;
-               char *extendedFieldSets = NULL;
-               GVariantIter *sceneNameIter = NULL;
-               GVariantIter *extendedSetIter = NULL;
-
-               g_variant_get(parameters, "(qyyqyqa(y)ya(y))", &addr16, &ep, &status, &group_id, &scene_id,
-                       &transition_time, &sceneNameIter, &ext_len, &extendedSetIter);
-
-               if (!g_variant_iter_loop(sceneNameIter, "(y)", &value)) {
-                       ERR("There is no scene data");
-                       return;
-               }
-
-               /** first byte indicates the length of the string */
-               len = value -'0';
-               if (0 < len) {
-                       scene_name = calloc(len + 1, sizeof(char));
-                       if (NULL == scene_name) {
-                               ERR("calloc() Fail(%d)", errno);
-                               goto SCENE_VIEW_SCENE_REQ_OUT;
-                       }
-                       scene_name[j] = value;
-                       j++;
-                       while (g_variant_iter_loop(sceneNameIter, "(y)", &value)) {
-                               scene_name[j] = value;
-                               j++;
-                       }
-               } else {
-                       scene_name = calloc(1 + 1, sizeof(char));
-                       if (NULL == scene_name) {
-                               ERR("calloc() Fail(%d)", errno);
-                               goto SCENE_VIEW_SCENE_REQ_OUT;
-                       }
-                       scene_name[j] = value;
-               }
-
-               j = 0;
-               if (0 < ext_len) {
-                       extendedFieldSets = calloc(ext_len + 1, sizeof(char));
-                       if (NULL == extendedFieldSets) {
-                               ERR("calloc() Fail(%d)", errno);
-                               goto SCENE_VIEW_SCENE_REQ_OUT;
-                       }
-                       while (g_variant_iter_loop(extendedSetIter, "(y)", &value)) {
-                               extendedFieldSets[j] = value;
-                               j++;
-                       }
-               }
-
-               cb(addr16, ep, status, group_id, scene_id, transition_time, scene_name,
-                               extendedFieldSets, ext_len, container->userdata);
-
-SCENE_VIEW_SCENE_REQ_OUT:
-               if (scene_name) {
-                       free(scene_name);
-                       scene_name = NULL;
-               }
-
-               if (extendedFieldSets) {
-                       free(extendedFieldSets);
-                       extendedFieldSets = NULL;
-               }
-       }
-       break;
-       case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: {
-               zb_zcl_scene_remove_scene_cb cb = container->cb;
-
-               zb_nwk_addr addr16 = 0;
-               unsigned char ep;
-               unsigned char status;
-               unsigned short group_id;
-               unsigned char scene_id;
-
-               g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id);
-               cb(addr16, ep, status, group_id, scene_id, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_STORE_SCENE_REQ: {
-               zb_zcl_scene_store_scene_cb cb = container->cb;
-
-               zb_nwk_addr addr16 = 0;
-               unsigned char ep;
-               unsigned char status;
-               unsigned short group_id;
-               unsigned char scene_id;
-
-               g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id);
-               cb(addr16, ep, status, group_id, scene_id, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: {
-               zb_zcl_scene_remove_all_scene_cb cb = container->cb;
-
-               zb_nwk_addr addr16 = 0;
-               unsigned char ep;
-               unsigned char status;
-               unsigned short group_id;
-
-               g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
-               cb(addr16, ep, status, group_id, container->userdata);
-       }
-       break;
-       case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: {
-               zb_zcl_scene_get_scene_membership_cb cb = container->cb;
-
-               int j = 0;
-               zb_nwk_addr addr16 = 0;
-               unsigned char ep;
-               unsigned char status;
-               unsigned short group_id;
-               unsigned char capacity;
-               unsigned char value;
-               unsigned char scene_count = 0;
-               unsigned char *scene_list = NULL;
-               GVariantIter *sceneListIter = NULL;
-
-               g_variant_get(parameters, "(qyyyqya(y))", &addr16, &ep, &status, &capacity, &group_id,
-                       &scene_count, &sceneListIter);
-
-               if (0 < scene_count) {
-                       scene_list = calloc(scene_count+1, sizeof(char));
-                       if (NULL == scene_list) {
-                               ERR("calloc() Fail(%d)", errno);
-                               goto SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT;
-                       }
-                       while (g_variant_iter_loop(sceneListIter, "(y)", &value)) {
-                               scene_list[j] = value;
-                               DBG("Scene_List 0x%02X", scene_list[j]);
-                               j++;
-                       }
-               }
-
-               cb(addr16, ep, status, capacity, group_id, scene_count, scene_list, container->userdata);
-SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT:
-               if (scene_list) {
-                       free(scene_list);
-                       scene_list = NULL;
-               }
-       }
-       break;
-       /* ZCL Thermostat */
-       case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: {
-               ERR("Unhandled cid = %d", container->cid);
-       }
-       break;
-       default:
-               ERR("Unhandled cid = %d", container->cid);
-       }
-}
-
-static int _check_zigbee_privilege()
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       DBG("_check_zigbee_privilege()");
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "check_privilege",
-                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-       if (!variant) {
-               ERR("Failed to check_zigbee_privilege [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-       }
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler)
-{
-       struct zbl_zigbee_s *h = handle;
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       h->event_handler = event_handler;
-       return ZIGBEE_ERROR_NONE;
-}
-
-int zbl_enable(zb_zigbee_h handle)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_enable()");
-
-       variant = g_dbus_connection_call_sync(gdbus_conn,
-               ZIGBEE_MANAGER_INTERFACE,
-               ZIGBEE_DBUS_OBJPATH,
-               ZIGBEE_MANAGER_INTERFACE,
-               "enable",
-               NULL, NULL,
-               G_DBUS_CALL_FLAGS_NONE,
-               -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'enable' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_disable(void)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_disable()");
-
-       variant = g_dbus_connection_call_sync(gdbus_conn,
-               ZIGBEE_MANAGER_INTERFACE,
-               ZIGBEE_DBUS_OBJPATH,
-               ZIGBEE_MANAGER_INTERFACE,
-               "disable",
-               NULL, NULL,
-               G_DBUS_CALL_FLAGS_NONE,
-               -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'disable' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_hw_reset(void)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "zb_hw_reset", NULL,
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'zb_hw_reset' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_get_network_info(zb_ieee_addr addr64, zb_nwk_addr *nodeid, zb_nwk_addr *panid,
-               unsigned char *channel, unsigned char *tx_power)
-{
-       GVariant *variant = NULL;
-       GVariantIter *iter = NULL;
-       GError *dbus_err = NULL;
-       int result = ZIGBEE_ERROR_NONE;
-
-       zb_nwk_addr _nodeid;
-       zb_nwk_addr _panid;
-       unsigned char _radio_channel;
-       unsigned char _radio_tx_power;
-       unsigned char value;
-       int i = 0;
-
-       DBG("zbl_get_network_info()");
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "get_network_info",
-                               NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to 'get_network_info' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(ia(y)qqyy)", &result, &iter,
-                               &_nodeid, &_panid, &_radio_channel, &_radio_tx_power);
-       RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
-
-       /* Get EUI */
-       i = 0;
-       while (g_variant_iter_loop(iter, "(y)", &value)) {
-               addr64[i] = value;
-               i++;
-       }
-       g_variant_iter_free(iter);
-
-       DBG("  Result: [%X]", result);
-       DBG("  EUI(%d) : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", i,
-                       addr64[0], addr64[1], addr64[2], addr64[3],
-                       addr64[4], addr64[5], addr64[6], addr64[7]);
-       DBG("  nodeID [0x%04X]", _nodeid);
-       DBG("  PanID [0x%04X]", _panid);
-       DBG("  Channel [%d] Tx Power [%d]", _radio_channel, _radio_tx_power);
-
-       if (nodeid)
-               *nodeid = _nodeid;
-       if (panid)
-               *panid = _panid;
-       if (channel)
-               *channel = _radio_channel;
-       if (tx_power)
-               *tx_power = _radio_tx_power;
-
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_get_controller_mac_address(zb_ieee_addr addr64)
-{
-       GVariant *variant = NULL;
-       GVariantIter *iter = NULL;
-       GError *dbus_err = NULL;
-
-       char value;
-       int j = 0;
-       int result = ZIGBEE_ERROR_NONE;
-
-       DBG("zbl_get_controller_mac_address()");
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "get_mac",
-                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get_mac [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-       g_variant_get(variant, "(ia(y))", &result, &iter);
-       RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
-
-       while (g_variant_iter_loop(iter, "(y)", &value)) {
-               addr64[j] = value;
-               j++;
-       }
-       g_variant_iter_free(iter);
-
-       DBG("IEEE ADDR 0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X, Ret=%d ",
-               addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5],
-               addr64[6], addr64[7], result);
-
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_get_cluster_list(zb_ieee_addr eui64, unsigned char endpoint,
-               unsigned char *in_cluster_count, unsigned short in_cluster_list[],
-               unsigned char *out_cluster_count, unsigned short out_cluster_list[])
-{
-       GVariant *variant = NULL;
-       GVariantBuilder *mac_builder = NULL;
-       GVariant *mac_variant = NULL;
-       GVariantIter *in_cluster_iter = NULL;
-       GVariantIter *out_cluster_iter = NULL;
-       GError *dbus_err = NULL;
-       unsigned short cluster = 0;
-       int i = 0;
-       int result = 0;
-       int ret = ZIGBEE_ERROR_NONE;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       g_variant_builder_add(mac_builder, "(y)", eui64[7]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[6]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[5]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[4]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[3]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[2]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[1]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[0]);
-       mac_variant = g_variant_builder_end(mac_builder);
-       g_variant_builder_unref(mac_builder);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "get_cluster_list",
-                               g_variant_new("(@a(y)y)", mac_variant, endpoint), G_DBUS_CALL_FLAGS_NONE,
-                               -1, NULL, &dbus_err);
-
-       if (variant) {
-               g_variant_get(variant, "(iaqaq)", &result, &in_cluster_iter, &out_cluster_iter);
-               RETVM_IF(NULL == in_cluster_iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
-               RETVM_IF(NULL == out_cluster_iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
-
-               DBG("ret = [0x%x]", result);
-
-               /* In clusters */
-               while (g_variant_iter_loop(in_cluster_iter, "q", &cluster)) {
-                       DBG("In Cluster 0x%04X", cluster);
-                       in_cluster_list[i++] = cluster;
-               }
-               g_variant_iter_free(in_cluster_iter);
-               *in_cluster_count = i;
-               if (0 == i)
-                       ERR("No In Clusters for Endpoint %0X", endpoint);
-
-               /* Out clusters */
-               i = 0;
-               while (g_variant_iter_loop(out_cluster_iter, "q", &cluster)) {
-                       DBG("Out Cluster 0x%04X", cluster);
-                       out_cluster_list[i++] = cluster;
-               }
-               g_variant_iter_free(out_cluster_iter);
-               *out_cluster_count = i;
-               if (0 == i)
-                       ERR("No Out Clusters for Endpoint %0X", endpoint);
-
-               g_variant_unref(variant);
-       } else {
-               ERR("No In/Out Clusters for Endpoint %0X [%s]", endpoint, dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       ret = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       ret = ZIGBEE_ERROR_NONE;
-
-               g_error_free(dbus_err);
-
-               *in_cluster_count = 0;
-               *out_cluster_count = 0;
-       }
-
-       return ret;
-}
-
-int zbl_get_endpoint_list(zb_ieee_addr eui64, unsigned char *count, unsigned char list[])
-{
-       GVariant *variant = NULL;
-       GVariantBuilder *mac_builder = NULL;
-       GVariant *mac_variant = NULL;
-       GVariantIter *iter = NULL;
-       GError *dbus_err = NULL;
-       unsigned char endpoint;
-       int i = 0;
-       int result = 0;
-       int ret = ZIGBEE_ERROR_NONE;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       g_variant_builder_add(mac_builder, "(y)", eui64[7]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[6]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[5]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[4]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[3]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[2]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[1]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[0]);
-       mac_variant = g_variant_builder_end(mac_builder);
-       g_variant_builder_unref(mac_builder);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "get_endpoint_list",
-               g_variant_new("(@a(y))", mac_variant),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (variant) {
-               g_variant_get(variant, "(ia(y))", &result, &iter);
-               RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
-
-               DBG("ret = [0x%x]", result);
-
-               while (g_variant_iter_loop(iter, "(y)", &endpoint)) {
-                       DBG("Endpoint 0x%X", endpoint);
-                       list[i++] = endpoint;
-               }
-               g_variant_iter_free(iter);
-
-               if (i > 0) {
-                       *count = i;
-                       DBG("Endpoint Count %d", i);
-               } else {
-                       ERR("No Endpoints");
-                       *count = 0;
-               }
-               g_variant_unref(variant);
-
-       } else {
-               ERR("NULL Variant");
-               ERR("No Endpoints");
-               ERR("[%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       ret = ZIGBEE_ERROR_PERMISSION_DENIED;
-
-               g_error_free(dbus_err);
-               *count = 0;
-       }
-
-       return ret;
-}
-
-int zbl_api_get_node_type(zb_ieee_addr eui64, unsigned char *node_type)
-{
-       GVariant *variant = NULL;
-       GVariantBuilder *mac_builder = NULL;
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *mac_variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       g_variant_builder_add(mac_builder, "(y)", eui64[7]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[6]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[5]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[4]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[3]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[2]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[1]);
-       g_variant_builder_add(mac_builder, "(y)", eui64[0]);
-       mac_variant = g_variant_builder_end(mac_builder);
-       g_variant_builder_unref(mac_builder);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "get_node_type",
-               g_variant_new("(@a(y))", mac_variant),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'get_node_type' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_get_all_device_info(zb_end_dev_info_h **dev_list, unsigned char* num)
-{
-       int i = 0;
-       int j = 0;
-       int k = 0;
-       struct zb_end_device_info_s **list;
-       GVariant *variant = NULL;
-       GVariantIter *iter = NULL;
-       GVariantIter *mac_iter = NULL;
-       GVariantIter *endpoint_iter = NULL;
-       GError *dbus_err = NULL;
-       int result = 0;
-       int ret = ZIGBEE_ERROR_NONE;
-       unsigned short node_id;
-       unsigned char node_type;
-       unsigned char node_mac_address[8] = {0x00};
-       unsigned char endpoint_cnt = 0;
-       unsigned char value;
-       unsigned char value_endpoint;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       /* check the format string when there are no input args */
-       variant = g_dbus_proxy_call_sync(service_gproxy, "get_device_info",
-                               NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (variant) {
-               g_variant_get(variant, "(ia(qyayyay))", &result, &iter);
-               RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
-
-               DBG("ret = [0x%x]", result);
-
-               list = calloc(MAX_DEVICE_LIST+1, sizeof(zb_end_dev_info_h));
-               RETV_IF(NULL == list, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               for (i = 0; i < MAX_DEVICE_LIST && list; i++) {
-                       list[i] = calloc(1, sizeof(struct zb_end_device_info_s));
-                       if (NULL == list[i]) {
-                               for (j = 0; j < i; j++) {
-                                       if (list[j]) {
-                                               free(list[j]);
-                                               list[j] = NULL;
-                                       }
-                               }
-                               if (list) {
-                                       free(list);
-                                       list = NULL;
-                               }
-                               g_variant_unref(variant);
-                               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-                       }
-               }
-
-               i = 0;
-               while (g_variant_iter_loop(iter, "(qyayyay)", &node_id, &node_type, &mac_iter,
-                               &endpoint_cnt, &endpoint_iter)) {
-                       if (NULL == mac_iter || NULL == endpoint_iter) {
-                               ERR("Invalid parameter !");
-                               for (j = 0; j <= MAX_DEVICE_LIST; j++) {
-                                       if (list[j]) {
-                                               free(list[j]);
-                                               list[j] = NULL;
-                                       }
-                               }
-                               if (list) {
-                                       free(list);
-                                       list = NULL;
-                               }
-                               g_variant_iter_free(iter);
-                               if (NULL != mac_iter)
-                                       g_variant_iter_free(mac_iter);
-                               if (NULL != endpoint_iter)
-                                       g_variant_iter_free(endpoint_iter);
-                               g_variant_unref(variant);
-                               return ZIGBEE_ERROR_IO_ERROR;
-                       }
-
-                       j = 0;
-                       k = 0;
-                       /* Get Network Address */
-                       list[i]->addr16 = node_id;
-                       DBG("Node ID: 0x%04X", node_id);
-                       /* Get Node Type */
-                       list[i]->node_type = node_type;
-                       DBG("Node Type : 0x%02X", node_type);
-                       /* Get End-Point count */
-                       list[i]->num_of_ep = endpoint_cnt;
-                       DBG("Endpoint Count: 0x%X", endpoint_cnt);
-
-                       /* Get End-Point list */
-                       list[i]->num_of_ep = endpoint_cnt;
-                       while (g_variant_iter_loop(endpoint_iter, "y", &value_endpoint)) {
-                               list[i]->ep[k] = value_endpoint;
-                               DBG("Endpoint : %d", value_endpoint);
-                               k++;
-                       }
-                       g_variant_iter_free(endpoint_iter);
-
-                       /* Get IEEE address */
-                       while (g_variant_iter_loop(mac_iter, "y", &value)) {
-                               node_mac_address[j] = value;
-                               j++;
-                       }
-                       g_variant_iter_free(mac_iter);
-
-                       memcpy(list[i]->addr64, node_mac_address, sizeof(zb_ieee_addr));
-                       DBG("Node MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
-                               node_mac_address[0], node_mac_address[1], node_mac_address[2],
-                               node_mac_address[3], node_mac_address[4], node_mac_address[5],
-                               node_mac_address[6], node_mac_address[7]);
-                       i++;
-               }
-               if (0 == i)
-                       ERR("No attached nodes");
-
-               *num = i;
-               *dev_list = (void **)list;
-
-               g_variant_iter_free(iter);
-               g_variant_unref(variant);
-       } else {
-               ERR("NULL Variant [%s]", dbus_err->message);
-               ERR("No attached nodes");
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       ret = ZIGBEE_ERROR_PERMISSION_DENIED;
-
-               g_error_free(dbus_err);
-               *num = 0;
-       }
-
-       return ret;
-}
-
-int zbl_coex_start(unsigned char channel)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "coex_start", g_variant_new("(y)", channel),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'coex_start' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_coex_stop(void)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       DBG("zbl_coex_stop()");
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "coex_stop", NULL,
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'coex_stop' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(service_gproxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_SERVICE_INTERFACE,  "form_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_SERVICE_FORM_NETWORK;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "form_network", NULL,
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'form_network' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_disable_network()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(service_gproxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_SERVICE_INTERFACE,  "disable_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_SERVICE_DISABLE_NETWORK;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "leave_network", NULL,
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'leave_network' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_leave_device(zb_ieee_addr addr64, bool remove_children, bool rejoin)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       GVariantBuilder *mac_builder = NULL;
-       GVariant* mac_variant = NULL;
-       unsigned char _remove_children = (remove_children) ? 1 : 0;
-       unsigned char _rejoin = (rejoin) ? 1 : 0;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("IEEE Address = %X:%X:%X:%X:%X:%X:%X:%X",
-               addr64[0], addr64[1], addr64[2], addr64[3],
-               addr64[4], addr64[5], addr64[6], addr64[7]);
-
-       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       g_variant_builder_add(mac_builder, "(y)", addr64[7]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[6]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[5]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[4]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[3]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[2]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[1]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[0]);
-       mac_variant = g_variant_builder_end(mac_builder);
-       g_variant_builder_unref(mac_builder);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request",
-               g_variant_new("(@a(y)yy)", mac_variant, _remove_children, _rejoin),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'leave_request' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_permit_join(unsigned char duration, bool broadcast)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "permit_join",
-               g_variant_new("(ib)", duration, broadcast),     G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'permit_join' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64, unsigned char request_type,
-       unsigned char start_idx, zb_zdo_addr_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-       GVariantBuilder *mac_builder = NULL;
-       GVariant* mac_variant = NULL;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG(" zbl_nwk_addr_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "nwk_addr_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
-                       _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_NWK_ADDR_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       g_variant_builder_add(mac_builder, "(y)", addr64[7]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[6]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[5]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[4]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[3]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[2]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[1]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[0]);
-       mac_variant = g_variant_builder_end(mac_builder);
-       g_variant_builder_unref(mac_builder);
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "nwk_addr_req",
-               g_variant_new("(@a(y)yy)", mac_variant, request_type, start_idx),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'nwk_addr_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb,
-               void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_ieee_addr_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "nwk_addr_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_NWK_ADDR_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "ieee_addr_req", g_variant_new("(q)", addr16),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'ieee_addr_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb,
-               void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_active_ep()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "active_ep_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_ACTIVE_EP_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "active_ep_req",
-               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'active_ep_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-               zb_zdo_simple_desc_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_simple_desc_req() : [%X]", addr16);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "simple_desc_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_SIMPLE_DESC_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "simple_desc_req",
-               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'simple_desc_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_extended_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char start_idx, zb_zdo_extended_simple_desc_cb cb, void *user_data)
-{
-       return ZIGBEE_ERROR_NOT_SUPPORTED;
-}
-
-int zbl_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-               unsigned short profileid, unsigned char num_in_clusters,
-               unsigned short *in_clusters, unsigned char num_out_clusters,
-               unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       int i;
-       GVariantBuilder *incl_builder = NULL;
-       GVariant* incl_variant = NULL;
-       GVariantBuilder *outcl_builder = NULL;
-       GVariant* outcl_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_match_desc_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "matched_descriptor_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_MATCHED_DESCRIPTOR_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       incl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
-       for (i = 0; i < num_in_clusters; i++)
-               g_variant_builder_add(incl_builder, "q", in_clusters[i]);
-
-       outcl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
-       for (i = 0; i < num_out_clusters; i++)
-               g_variant_builder_add(outcl_builder, "q", out_clusters[i]);
-
-       incl_variant = g_variant_builder_end(incl_builder);
-       outcl_variant = g_variant_builder_end(outcl_builder);
-       g_variant_builder_unref(incl_builder);
-       g_variant_builder_unref(outcl_builder);
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "matched_descriptor_req",
-               g_variant_new("(qqy@aqy@aq)", addr16, profileid, num_in_clusters,
-               incl_variant, num_out_clusters, outcl_variant),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'matched_descriptor_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_node_desc_req(zb_nwk_addr addr16, zb_zdo_node_desc_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_node_desc_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "node_desc_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_NODE_DESC_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "node_desc_req",
-               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'node_desc_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_power_desc_req(zb_nwk_addr addr16, zb_zdo_power_desc_cb cb,
-       void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "power_desc_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_POWER_DESC_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "power_desc_req",
-               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'power_desc_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_complex_desc_req(zb_nwk_addr addr16, zb_zdo_complex_desc_cb cb,
-       void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "complex_desc_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_COMPLEX_DESC_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "complex_desc_req",
-               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'complex_desc_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_user_desc_req(zb_nwk_addr addr16, zb_zdo_user_desc_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "user_desc_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_USER_DESC_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_req",
-               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'user_desc_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-#define MAX_USER_DESC_SIZE 0x10
-#define USER_DESC_COMMAND_SIZE 20
-
-int zbl_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len,
-       unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       unsigned char j = 0x00;
-       GVariantBuilder *user_desc_builder = NULL;
-       GVariant *user_desc_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-       RETVM_IF(len > MAX_USER_DESC_SIZE, ZIGBEE_ERROR_INVALID_PARAMETER,
-               "invalid length=%d", len);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "user_desc_confirm",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_USER_DESC_SET_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       user_desc_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       for (j = 0; j < len; j++)
-               g_variant_builder_add(user_desc_builder, "(y)", user_desc[j]);
-
-       user_desc_variant = g_variant_builder_end(user_desc_builder);
-       g_variant_builder_unref(user_desc_builder);
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_set_req",
-               g_variant_new("(qy@a(y))", addr16, len, user_desc_variant),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'user_desc_set_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64,
-       unsigned char capability)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GError *dbus_err = NULL;
-       GVariant *variant = NULL;
-
-       GVariantBuilder *mac_builder = NULL;
-       GVariant* mac_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       g_variant_builder_add(mac_builder, "(y)", addr64[7]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[6]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[5]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[4]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[3]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[2]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[1]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[0]);
-       mac_variant = g_variant_builder_end(mac_builder);
-       g_variant_builder_unref(mac_builder);
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "device_announce",
-               g_variant_new("(q@a(y)y)", addr16, mac_variant, capability),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'device_announce' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_bind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64,
-       unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64,
-       unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep,
-       zb_zdo_bind_cb cb, void *user_data)
-{
-       int i;
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GError *dbus_err = NULL;
-       GVariant *variant = NULL;
-
-       GVariantBuilder *src_addr64_builder = NULL;
-       GVariant* src_addr64_variant = NULL;
-       GVariantBuilder *dst_addr64_builder = NULL;
-       GVariant* dst_addr64_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_zdo_bind_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_bind_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_BIND_INTERFACE,  "bind_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_BIND_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-
-       if (src_addr64) {
-               for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--)
-                       g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]);
-       }
-       src_addr64_variant = g_variant_builder_end(src_addr64_builder);
-       g_variant_builder_unref(src_addr64_builder);
-
-       dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       if (dst_addr64) {
-               for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--)
-                       g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]);
-       }
-       dst_addr64_variant = g_variant_builder_end(dst_addr64_builder);
-       g_variant_builder_unref(dst_addr64_builder);
-
-       variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "bind_req",
-               g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep,
-                                               clusterid, dst_addr64_variant, type, group_addr, dst_ep),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'bind_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_unbind_req(zb_nwk_addr dst_addr16,
-       zb_ieee_addr src_addr64, unsigned char src_ep, unsigned short clusterid,
-       zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr,
-       unsigned char dst_ep, zb_zdo_unbind_cb cb, void *user_data)
-{
-       int i;
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GError *dbus_err = NULL;
-       GVariant *variant = NULL;
-
-       GVariantBuilder *src_addr64_builder = NULL;
-       GVariant* src_addr64_variant = NULL;
-       GVariantBuilder *dst_addr64_builder = NULL;
-       GVariant* dst_addr64_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_zdo_unbind_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_bind_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_BIND_INTERFACE,  "unbind_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_UNBIND_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       if (src_addr64) {
-               for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--)
-                       g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]);
-       }
-       src_addr64_variant = g_variant_builder_end(src_addr64_builder);
-       g_variant_builder_unref(src_addr64_builder);
-
-       dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       if (dst_addr64) {
-               for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--)
-                       g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]);
-       }
-       dst_addr64_variant = g_variant_builder_end(dst_addr64_builder);
-       g_variant_builder_unref(dst_addr64_builder);
-
-       variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "unbind_req",
-               g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep,
-                                               clusterid, dst_addr64_variant, type, group_addr, dst_ep),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'unbind_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_mgmt_nwk_disc_req(zb_nwk_addr addr16, unsigned int scan_channels,
-       unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx,
-       zb_zdo_mgmt_nwk_disc_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_mgmt_nwk_disc_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_nwk_disc_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
-                       container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_MGMT_NWK_DISC_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_disc_req",
-               g_variant_new("(quyqy)", addr16, scan_channels, scan_duration, scan_count, start_idx),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'mgmt_nwk_disc_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_mgmt_nwk_update_req(unsigned int scan_channels, unsigned char scan_duration,
-       unsigned char scan_count, unsigned char nwk_update_id, zb_nwk_addr nwk_manager_addr)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_mgmt_nwk_update_req()");
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_update_req",
-               g_variant_new("(quyyy)", nwk_manager_addr, scan_channels, scan_duration,
-               scan_count, nwk_update_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'mgmt_nwk_update_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_mgmt_lqi_req(zb_nwk_addr addr16, unsigned char start_idx,
-       zb_zdo_mgmt_lqi_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_mgmt_lqi_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_lqi_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
-                       _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_MGMT_LQI_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_lqi_req",
-               g_variant_new("(qy)", addr16, start_idx),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'mgmt_lqi_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_mgmt_rtg_req(zb_nwk_addr addr16, unsigned char start_idx,
-       zb_zdo_mgmt_rtg_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_mgmt_rtg_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_rtg_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,  _zbl_response_cb, container,
-                       _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_MGMT_RTG_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_rtg_req",
-               g_variant_new("(qy)", addr16, start_idx),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'mgmt_rtg_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_mgmt_bind_req(zb_nwk_addr addr16, unsigned char start_idx,
-       zb_zdo_mgmt_bind_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_mgmt_bind_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_bind_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,  _zbl_response_cb, container,
-                       _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_MGMT_BIND_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_bind_req",
-               g_variant_new("(qy)", addr16, start_idx),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'mgmt_bind_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_mgmt_leave_device(zb_ieee_addr addr64, unsigned char remove_children,
-       unsigned rejoin, zb_zdo_mgmt_leave_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       GVariantBuilder *mac_builder = NULL;
-       GVariant* mac_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_leave_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,  _zbl_response_cb, container,
-                       _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_MGMT_LEAVE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       g_variant_builder_add(mac_builder, "(y)", addr64[7]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[6]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[5]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[4]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[3]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[2]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[1]);
-       g_variant_builder_add(mac_builder, "(y)", addr64[0]);
-       mac_variant = g_variant_builder_end(mac_builder);
-       g_variant_builder_unref(mac_builder);
-
-       variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request",
-               g_variant_new("(@a(y)yy)", mac_variant, remove_children, rejoin),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'leave_request' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_mgmt_permit_joining_req(zb_nwk_addr addr16, unsigned char duration,
-       unsigned char tc_significance, zb_zdo_mgmt_permit_joining_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zdo_dev_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_permit_join_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
-                       container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZDO_MGMT_PERMIT_JOIN_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_permit_join_req",
-               g_variant_new("(qyy)", addr16, duration, tc_significance),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'mgmt_permit_join_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_aps_send(zb_nwk_addr addr16, unsigned char aps_fc,
-       unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid,
-       unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code,
-       unsigned char cmd_id, unsigned short payload_len, unsigned char *payload,
-       zb_aps_send_cb cb, void *user_data)
-{
-       int sub_id, to, i;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       GVariantBuilder *payload_builder = NULL;
-       GVariant *payload_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(custom_gproxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_CUSTOM_INTERFACE,  "aps_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_CUSTOM_APS_SEND_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       if (payload_len > 0) {
-               for (i = payload_len - 1; i >= 0 ; i--)
-                       g_variant_builder_add(payload_builder, "(y)", payload[i]);
-       }
-       payload_variant = g_variant_builder_end(payload_builder);
-       g_variant_builder_unref(payload_builder);
-
-       variant = g_dbus_proxy_call_sync(custom_gproxy, "aps_send",
-               g_variant_new("(qyyyqqyqyq@a(y))", addr16, aps_fc, src_ep, dst_ep,
-               clusterid, profileid, zcl_fc, mfg_code, cmd_id, payload_len,
-               payload_variant),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'aps_send' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_zcl_send(zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
-       unsigned short clusterid, unsigned char zcl_fc, unsigned char cmd,
-       unsigned short payload_len, unsigned char *payload,
-       zb_zcl_send_cb cb, void *user_data)
-{
-       int sub_id, to, i;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       GVariantBuilder *payload_builder = NULL;
-       GVariant *payload_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(custom_gproxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_CUSTOM_INTERFACE,  "zcl_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_CUSTOM_ZCL_SEND_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       if (payload_len > 0) {
-               for (i = payload_len - 1; i >= 0 ; i--)
-                       g_variant_builder_add(payload_builder, "(y)", payload[i]);
-       }
-       payload_variant = g_variant_builder_end(payload_builder);
-       g_variant_builder_unref(payload_builder);
-
-       variant = g_dbus_proxy_call_sync(custom_gproxy, "zcl_send",
-               g_variant_new("(qyyqyyq@a(y))", addr16, src_ep, dst_ep, clusterid, zcl_fc,
-               cmd, payload_len, payload_variant), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'zcl_send' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_send_to_local(unsigned short length, unsigned char *data,
-       zb_send_to_local_cb cb, void *user_data)
-{
-       int sub_id, to, i;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       GVariantBuilder *payload_builder = NULL;
-       GVariant *payload_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(custom_gproxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_CUSTOM_INTERFACE,  "send_to_local_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_CUSTOM_LOCAL_SEND_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       if (length > 0) {
-               for (i = length - 1; i >= 0 ; i--)
-                       g_variant_builder_add(payload_builder, "(y)", data[i]);
-       }
-       payload_variant = g_variant_builder_end(payload_builder);
-       g_variant_builder_unref(payload_builder);
-
-       variant = g_dbus_proxy_call_sync(custom_gproxy, "send_to_local",
-               g_variant_new("(q@a(y))", length, payload_variant),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'send_to_local' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_read_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char dest_ep,
-       unsigned char zcl_fc, unsigned short clusterid, unsigned short *attribute_ids,
-       int attribute_ids_len, zb_zcl_global_attr_read_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       int i = 0;
-       unsigned char *t;
-       GVariant *attr_variant = NULL;
-       GVariantBuilder *attr_builder = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_read_attr_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_attributes_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-               _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               free(container);
-               container = NULL;
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               free(container);
-               container = NULL;
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dest_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_READ_ATTRIBUTES;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       t = (unsigned char *)attribute_ids;
-       attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       for (i = 0; i < attribute_ids_len*sizeof(unsigned short); i++)
-               g_variant_builder_add(attr_builder, "(y)", t[i]);
-       attr_variant = g_variant_builder_end(attr_builder);
-       g_variant_builder_unref(attr_builder);
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_attributes_req",
-               g_variant_new("(@a(y)iqqyy)", attr_variant, attribute_ids_len,
-               addr16, clusterid, zcl_fc, dest_ep), G_DBUS_CALL_FLAGS_NONE, to,
-               NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'read_attributes_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_write_attr_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
-       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
-       void **data, int count, zb_zcl_global_attr_write_cb cb,
-       void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       struct write_attribute_record_s **records = (struct write_attribute_record_s **)data;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_write_attr_req()");
-
-       GVariantBuilder *rec_builder = NULL;
-       GVariant *rec_variant = NULL;
-
-       int i = 0;
-       int j = 0;
-
-       char dSize[3] = {'\0', '\0'};
-       int writeAttributeIndex = 0;
-       int size_of_allo = 0;
-
-       unsigned char *isString = NULL;
-       unsigned short *dataSize = NULL;
-       unsigned char *writeAttribute = NULL;
-
-       isString = calloc(count + 1, sizeof(unsigned char));
-       RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       dataSize = calloc(count + 1, sizeof(unsigned short));
-       if (NULL == dataSize) {
-               ERR("calloc() Fail(%d)", errno);
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-
-       DBG("Records Length %d", count);
-
-       while (j < count) {
-               dataSize[j] = zb_zcl_get_data_size((*records)[j].type);
-
-               if (0xff != dataSize[j]) {
-
-                       isString[j] = 0;
-                       size_of_allo = size_of_allo + (dataSize[j] + 3);
-
-               } else {
-                       if ((*records)[j].value) {
-                               if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING
-                                       || (*records)[j].type == ZB_ZCL_OCTET_STRING) {
-
-                                               isString[j] = 1;
-                                               dataSize[j] = (*records)[j].value[0];
-                                               size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
-
-                               } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING
-                                       || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) {
-
-                                       isString[j] = 2;
-                                       dSize[0] = (*records)[j].value[0];
-                                       dSize[1] = (*records)[j].value[1];
-                                       dataSize[j] = dSize[1];
-                                       dataSize[j] = (dataSize[j] << 8) | dSize[0];
-                                       size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
-                               }
-                       } else
-                               ERR("Data is not present");
-               }
-               j++;
-       }
-       DBG("size_of_allo Length %d", size_of_allo);
-
-       writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
-       if (NULL == writeAttribute) {
-               ERR("Couldn't Allocate Memory");
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-
-       j = 0;
-       while (j < count && writeAttributeIndex < size_of_allo) {
-               writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
-               writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
-               writeAttribute[writeAttributeIndex++] = (*records)[j].type;
-               for (i = 0; i < (dataSize[j] + isString[j]); i++) {
-                       writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
-                       DBG("0x%02X", (*records)[j].value[i]);
-               }
-               j++;
-       }
-
-       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       DBG("   ");
-       for (i = 0; i < writeAttributeIndex ; i++) {
-               DBG("0x%02X", writeAttribute[i]);
-               g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
-       }
-
-       rec_variant = g_variant_builder_end(rec_builder);
-       g_variant_builder_unref(rec_builder);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       if (NULL == container) {
-               ERR("calloc() Fail(%d)", errno);
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               if (writeAttribute) {
-                       free(writeAttribute);
-                       writeAttribute = NULL;
-               }
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
-               container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               if (writeAttribute) {
-                       free(writeAttribute);
-                       writeAttribute = NULL;
-               }
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               if (writeAttribute) {
-                       free(writeAttribute);
-                       writeAttribute = NULL;
-               }
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dst_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_WRITE_ATTRIBUTES;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_req",
-               g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
-               clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
-               to, NULL, &dbus_err);
-
-       if (isString) {
-               free(isString);
-               isString = NULL;
-       }
-       if (dataSize) {
-               free(dataSize);
-               dataSize = NULL;
-       }
-       if (writeAttribute) {
-               free(writeAttribute);
-               writeAttribute = NULL;
-       }
-
-       if (!variant) {
-               ERR("Failed to get 'write_attributes_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_wattr_undivided_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, void **data, int count,
-       zb_zcl_global_attr_write_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       struct write_attribute_record_s **records = (struct write_attribute_record_s **)data;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_wattr_undivided_req()");
-
-       GVariantBuilder *rec_builder = NULL;
-       GVariant *rec_variant = NULL;
-
-       int i = 0;
-       int j = 0;
-
-       char dSize[3] = {'\0', '\0'};
-       int writeAttributeIndex = 0;
-       int size_of_allo = 0;
-
-       unsigned char *isString = NULL;
-       unsigned short *dataSize = NULL;
-       unsigned char *writeAttribute = NULL;
-
-       isString = calloc(count + 1, sizeof(unsigned char));
-       RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       dataSize = calloc(count + 1, sizeof(unsigned short));
-       if (NULL == dataSize) {
-               ERR("calloc() Fail(%d)", errno);
-               free(isString);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-
-       DBG("Records Length %d", count);
-
-       while (j < count) {
-               dataSize[j] = zb_zcl_get_data_size((*records)[j].type);
-               if (0xff != dataSize[j]) {
-                       isString[j] = 0;
-                       size_of_allo = size_of_allo + (dataSize[j] + 3);
-               } else {
-                       if ((*records)[j].value) {
-                               if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING
-                                       || (*records)[j].type == ZB_ZCL_OCTET_STRING) {
-                                               isString[j] = 1;
-                                               dataSize[j] = (*records)[j].value[0];
-                                               size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
-                               } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING
-                                       || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) {
-                                       isString[j] = 2;
-                                       dSize[0] = (*records)[j].value[0];
-                                       dSize[1] = (*records)[j].value[1];
-                                       dataSize[j] = dSize[1];
-                                       dataSize[j] = (dataSize[j] << 8) | dSize[0];
-                                       size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
-                               }
-                       } else
-                               ERR("Data is not present");
-               }
-               j++;
-       }
-       DBG("size_of_allo Length %d", size_of_allo);
-
-       writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
-       if (NULL == writeAttribute) {
-               ERR("Couldn't Allocate Memory");
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-
-       j = 0;
-       while (j < count && writeAttributeIndex < size_of_allo) {
-               writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
-               writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
-               writeAttribute[writeAttributeIndex++] = (*records)[j].type;
-               for (i = 0; i < (dataSize[j] + isString[j]); i++) {
-                       writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
-                       DBG("0x%02X", (*records)[j].value[i]);
-               }
-               j++;
-       }
-
-       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       DBG("   ");
-       for (i = 0; i < writeAttributeIndex ; i++) {
-               DBG("0x%02X", writeAttribute[i]);
-               g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
-       }
-
-       rec_variant = g_variant_builder_end(rec_builder);
-       g_variant_builder_unref(rec_builder);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       if (NULL == container) {
-               ERR("calloc() Fail(%d)", errno);
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               if (writeAttribute) {
-                       free(writeAttribute);
-                       writeAttribute = NULL;
-               }
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
-               container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               if (writeAttribute) {
-                       free(writeAttribute);
-                       writeAttribute = NULL;
-               }
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               if (writeAttribute) {
-                       free(writeAttribute);
-                       writeAttribute = NULL;
-               }
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dst_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_WRITE_ATTRIBUTES_UNDIVIDED;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_undivided_req",
-               g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
-               clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
-               to, NULL, &dbus_err);
-
-       if (isString) {
-               free(isString);
-               isString = NULL;
-       }
-       if (dataSize) {
-               free(dataSize);
-               dataSize = NULL;
-       }
-       if (writeAttribute) {
-               free(writeAttribute);
-               writeAttribute = NULL;
-       }
-
-       if (!variant) {
-               ERR("Failed to get 'write_attributes_undivided_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_wattr_req_no_cb(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
-               unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
-               void **data, int count)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GError *dbus_err = NULL;
-       GVariant *variant = NULL;
-
-       struct write_attribute_record_s **records = (struct write_attribute_record_s **)data;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_wattr_req_no_cb()");
-
-       GVariantBuilder *rec_builder = NULL;
-       GVariant *rec_variant = NULL;
-
-       int i = 0;
-       int j = 0;
-
-       char dSize[3] = {'\0', '\0'};
-       int writeAttributeIndex = 0;
-       int size_of_allo = 0;
-
-       unsigned char *isString = NULL;
-       unsigned short *dataSize = NULL;
-       unsigned char *writeAttribute = NULL;
-
-       isString = calloc(count + 1, sizeof(unsigned char));
-       RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       dataSize = calloc(count + 1, sizeof(unsigned short));
-       if (NULL == dataSize) {
-               ERR("calloc() Fail(%d)", errno);
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-
-       DBG("Records Length %d", count);
-
-       while (j < count) {
-               dataSize[j] = zb_zcl_get_data_size((*records)[j].type);
-               if (0xff != dataSize[j]) {
-                       isString[j] = 0;
-                       size_of_allo = size_of_allo + (dataSize[j] + 3);
-               } else {
-                       if ((*records)[j].value) {
-                               if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING
-                                       || (*records)[j].type == ZB_ZCL_OCTET_STRING) {
-                                               isString[j] = 1;
-                                               dataSize[j] = (*records)[j].value[0];
-                                               size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
-                               } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING
-                                       || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) {
-                                       isString[j] = 2;
-                                       dSize[0] = (*records)[j].value[0];
-                                       dSize[1] = (*records)[j].value[1];
-                                       dataSize[j] = dSize[1];
-                                       dataSize[j] = (dataSize[j] << 8) | dSize[0];
-                                       size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
-                               }
-                       } else
-                               ERR("Data is not present");
-               }
-               j++;
-       }
-       DBG("size_of_allo Length %d", size_of_allo);
-
-       writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
-       if (NULL == writeAttribute) {
-               ERR("Couldn't Allocate Memory");
-               if (isString) {
-                       free(isString);
-                       isString = NULL;
-               }
-               if (dataSize) {
-                       free(dataSize);
-                       dataSize = NULL;
-               }
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-
-       j = 0;
-       while (j < count && writeAttributeIndex < size_of_allo) {
-               writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
-               writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
-               writeAttribute[writeAttributeIndex++] = (*records)[j].type;
-               for (i = 0; i < (dataSize[j] + isString[j]); i++) {
-                       writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
-                       DBG("0x%02X", (*records)[j].value[i]);
-               }
-               j++;
-       }
-
-       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       DBG("   ");
-       for (i = 0; i < writeAttributeIndex ; i++) {
-               DBG("0x%02X", writeAttribute[i]);
-               g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
-       }
-
-       rec_variant = g_variant_builder_end(rec_builder);
-       g_variant_builder_unref(rec_builder);
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_no_resp",
-               g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
-               clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
-               -1, NULL, &dbus_err);
-
-       if (isString) {
-               free(isString);
-               isString = NULL;
-       }
-       if (dataSize) {
-               free(dataSize);
-               dataSize = NULL;
-       }
-       if (writeAttribute) {
-               free(writeAttribute);
-               writeAttribute = NULL;
-       }
-       if (!variant) {
-               ERR("Failed to get 'write_attributes_no_rep' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_write_config_report(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, void **data, int count,
-       zb_zcl_global_config_report_write_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       struct reporting_configuration_record_s **records =
-               (struct reporting_configuration_record_s **)data;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       int i = 0;
-       int j = 0;
-       int len = 0;
-       int payload_len = 0;
-
-       GVariantBuilder *rec_builder = NULL;
-       GVariant *rec_variant = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_write_config_report()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "configure_reporting_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
-               container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dst_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_CONFIGURE_REPORTING;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       for (i = 0; i < count; i++) {
-               g_variant_builder_add(rec_builder, "(y)", (*records)[i].dir);
-               DBG("dir = 0x%02X", (*records)[i].dir);
-               payload_len += sizeof((*records)[i].dir);
-               g_variant_builder_add(rec_builder, "(y)", (*records)[i].id & 0xff);
-               g_variant_builder_add(rec_builder, "(y)", ((*records)[i].id >> 8) & 0xff);
-               DBG("id = 0x%04X", (*records)[i].id);
-               payload_len += sizeof((*records)[i].id);
-               g_variant_builder_add(rec_builder, "(y)", (*records)[i].type);
-               payload_len += sizeof((*records)[i].type);
-               DBG("type = 0x%04X", (*records)[i].type);
-               g_variant_builder_add(rec_builder, "(y)", (*records)[i].min_i & 0xff);
-               g_variant_builder_add(rec_builder, "(y)", ((*records)[i].min_i >> 8) & 0xff);
-               DBG("min_i = 0x%04X", (*records)[i].min_i);
-               payload_len += sizeof((*records)[i].min_i);
-               g_variant_builder_add(rec_builder, "(y)", (*records)[i].max_i & 0xff);
-               g_variant_builder_add(rec_builder, "(y)", ((*records)[i].max_i >> 8) & 0xff);
-               DBG("max_i = 0x%04X", (*records)[i].max_i);
-               payload_len += sizeof((*records)[i].max_i);
-
-               len = zb_zcl_get_data_size((*records)[i].type);
-               payload_len += len;
-               DBG("change length = %d", len);
-               DBG("payload length = %d", payload_len);
-
-               for (j = 0; j < len && (*records)[i].change+j; j++) {
-                       DBG("records[%d]->change[%d] = %d", i, j, (*records)[i].change[j]);
-                       g_variant_builder_add(rec_builder, "(y)", (*records)[i].change[j]);
-               }
-
-       }
-       rec_variant = g_variant_builder_end(rec_builder);
-       g_variant_builder_unref(rec_builder);
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "configure_reporting_req",
-               g_variant_new("(@a(y)qqqyyy)", rec_variant, count, addr16, clusterid,
-               zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'configure_reporting_req' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_read_config_report(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, void **data, int count,
-       zb_zcl_global_config_report_read_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       struct read_reporting_configuration_record_s **records =
-               (struct read_reporting_configuration_record_s **)data;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       int i = 0;
-       int j = 0;
-       int size_of_allo = 0;
-       unsigned short idx = 0;
-       GVariantBuilder *rec_builder = NULL;
-       GVariant *rec_variant = NULL;
-       unsigned char *read_attributes;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_config_report_read()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_configure_reporting_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
-               container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dst_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_READ_REPORTING_CONFIGURATION;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       DBG("Records Length %d", count);
-       /**
-        * According to zcl spec
-        * Memory needed for the read_reporting_configured_frame.
-        * 1 byte(direction) + 2 bytes(AttributeId)
-        *  = 3 bytes/variable
-        */
-       while (j < count) {
-               size_of_allo = size_of_allo + 3;
-               j++;
-       }
-       DBG("size_of_allo Length %d", size_of_allo);
-
-       read_attributes = calloc(size_of_allo, sizeof(unsigned char));
-       if (NULL == read_attributes) {
-               ERR("Couldn't Allocate Memory");
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       j = 0;
-       while (j < count && idx < size_of_allo) {
-               read_attributes[idx++] = (*records)[j].dir;
-               read_attributes[idx++] = (*records)[j].id & 0xff;
-               read_attributes[idx++] = (*records)[j].id >> 8 & 0xff;
-               DBG("Id copied \n");
-               j++;
-       }
-
-       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-
-       for (i = 0; i < idx ; i++) {
-               DBG("0x%02X", read_attributes[i]);
-               g_variant_builder_add(rec_builder, "(y)", read_attributes[i]);
-       }
-
-       rec_variant = g_variant_builder_end(rec_builder);
-       g_variant_builder_unref(rec_builder);
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_configure_reporting",
-               g_variant_new("(@a(y)qqqyyy)", rec_variant, idx, addr16, clusterid, zcl_fc,
-               src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (read_attributes) {
-               free(read_attributes);
-               read_attributes = NULL;
-       }
-
-       if (!variant) {
-               ERR("Failed to get 'read_configure_reporting' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_discover_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char src_ep,
-               unsigned char dest_ep, unsigned char zcl_fc, unsigned short clusterid,
-               unsigned short start_id, unsigned char max_attribute_ids,
-               zb_zcl_global_attr_discover_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_discover_attr_req()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-                       ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE,  "discover_attribute_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dest_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_DISCOVER_ATTRIBUTES;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes",
-               g_variant_new("(qyyqqy)",
-               addr16, dest_ep, zcl_fc, clusterid, start_id, max_attribute_ids),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'discover_attributes' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_discover_cmds_gen(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
-       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
-       unsigned char start_command_id, unsigned char max_command_ids,
-       zb_zcl_global_discover_cmds_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_discover_attr_gen()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_generated_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
-               _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dst_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_DISCOVER_COMMANDS_GENERATED;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_generated",
-               g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid,
-               start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_discover_cmds_recv(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, unsigned char start_command_id,
-       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_discover_cmds_recv()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_received_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
-               _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dst_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_DISCOVER_COMMANDS_RECEIVED;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_received",
-               g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid,
-               start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_discover_attr_ext(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
-       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
-       unsigned short start_id, unsigned char max_attribute_ids,
-       zb_zcl_global_attr_extended_discover_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       zb_event_global_default_rsp_s *global_req = NULL;
-#endif
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_discover_attr_ext()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_global_proxy);
-       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
-               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_attributes_extended_rsp",
-               ZIGBEE_CONTROL_OBJECT_PATH,     NULL, 0, _zbl_response_cb, container,
-               _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
-       if (NULL == global_req) {
-               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
-               g_source_remove(container->tid);
-               container->tid = 0;
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               ERR("calloc() Fail(%d)", errno);
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       global_req->ep = dst_ep;
-       global_req->clusterid = clusterid;
-       global_req->commandid = ZB_ZCL_CMD_DISCOVER_ATTRIBUTES_EXTENDED;
-
-       container->global_cmd = global_req;
-       container->handle = handle;
-
-       /* Register global request information into handle */
-       _zbl_register_global_req(handle, container);
-#endif
-
-       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes_extended",
-               g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid, start_id,
-               max_attribute_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'discover_attributes_extended' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_reset_alarm(zb_nwk_addr addr16, unsigned char ep, unsigned char alarm_code,
-               unsigned short clusterid)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm",
-               g_variant_new("(qyyq)", addr16, ep, alarm_code, clusterid),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'reset_alarm' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_reset_all_alarm(zb_nwk_addr addr16, unsigned char ep)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_all_alarm",
-               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'reset_all_alarm' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_get_alarm(zb_nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_cb cb,
-               void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_get_alarm()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(alarm_gproxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_ALARM_INTERFACE,  "get_alarm_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_ALARM_GET_ALARM_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(alarm_gproxy, "get_alarm",
-               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'get_alarm' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_reset_all_alarm_log(zb_nwk_addr addr16, unsigned char ep)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm_log",
-               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'reset_alarm_log' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_move_to_hue(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char hue, unsigned char direction,
-               unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue",
-                       g_variant_new("(qyyyq)", addr16, ep, hue, direction, transition_time),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_to_hue' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-
-int zbl_ccontrol_move_hue(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char move_mode, unsigned char rate)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_hue",
-                       g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_hue' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_step_hue(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char step_mode, unsigned char step_size,
-               unsigned char transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_hue",
-                       g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'step_hue' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_move_to_saturation(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char saturation, unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_saturation",
-                       g_variant_new("(qyyq)", addr16, ep, saturation, transition_time),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_to_saturation' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_move_saturation(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char move_mode, unsigned char rate)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_saturation",
-                       g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_saturation' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_step_saturation(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char step_mode, unsigned char step_size,
-               unsigned char transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_saturation",
-                       g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'step_saturation' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_move_to_hue_and_saturation(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char hue, unsigned char saturation,
-               unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue_and_saturation",
-                       g_variant_new("(qyyyq)", addr16, ep, hue, saturation, transition_time),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_to_hue_and_saturation' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_move_to_color(zb_nwk_addr addr16, unsigned char ep,
-               unsigned short color_x, unsigned short color_y,
-               unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_color",
-                       g_variant_new("(qyqqq)", addr16, ep, color_x, color_y, transition_time),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_to_color' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_move_color(zb_nwk_addr addr16, unsigned char ep,
-               unsigned short rate_x, unsigned short rate_y)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color",
-                       g_variant_new("(qyqq)", addr16, ep, rate_x, rate_y),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_color' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_step_color(zb_nwk_addr addr16, unsigned char ep,
-               unsigned short step_x, unsigned short step_y,
-               unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_color",
-                       g_variant_new("(qyqqq)", addr16, ep, step_x, step_y, transition_time),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'step_color' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_ccontrol_move_to_color_temperature(zb_nwk_addr addr16, unsigned char ep,
-               unsigned short color_temperature,
-               unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color_temperature",
-                       g_variant_new("(qyqq)", addr16, ep, color_temperature, transition_time),
-                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_color_temperature' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_reset_factory_default(zb_nwk_addr addr16, unsigned char ep)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_basic_proxy, "reset_factory_default",
-               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'reset_factory_default' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_identify(zb_nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "identify",
-               g_variant_new("(qyq)", addr16, dst_ep, identify_time),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'identify' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_identify_query(zb_nwk_addr addr16, unsigned char dst_ep,
-               zb_zcl_identify_query_cb cb, void *user_data)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_identify_query()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_identify_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_IDENTIFY_INTERFACE, "query_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_IDENTIFY_QUERY_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "query",
-               g_variant_new("(qy)", addr16, dst_ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'query' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_add_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-               const char *group_name, zb_zcl_group_add_group_cb cb, void *user_data)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int j = 0;
-       GVariant *groupname_variant = NULL;
-       GVariantBuilder *groupname_builder = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_add_group()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_group_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_GROUP_INTERFACE, "add_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GROUP_ADD_GROUP_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       while (group_name[j] != '\0') {
-               g_variant_builder_add(groupname_builder, "(y)", (group_name[j]));
-               j++;
-       }
-       groupname_variant = g_variant_builder_end(groupname_builder);
-       g_variant_builder_unref(groupname_builder);
-
-       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group",
-               g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'add_group' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_view_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-               zb_zcl_group_view_group_cb cb, void *user_data)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_view_group()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_group_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_GROUP_INTERFACE,  "view_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GROUP_VIEW_GROUP_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "view_group",
-               g_variant_new("(qyq)", addr16, ep, group_id),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'view_group' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_group_get_group_membership(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char group_count, unsigned short *group_list,
-               zb_zcl_group_get_group_membership_cb cb, void *user_data)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int j = 0;
-       GVariant *grouplist_variant = NULL;
-       GVariantBuilder *grouplist_builder = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_group_get_group_membership()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_group_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_GROUP_INTERFACE,  "get_group_membership_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
-                       container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       grouplist_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
-       while (j < group_count) {
-               g_variant_builder_add(grouplist_builder, "q", group_list[j]);
-               j++;
-       }
-       grouplist_variant = g_variant_builder_end(grouplist_builder);
-       g_variant_builder_unref(grouplist_builder);
-
-       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "get_group_membership",
-               g_variant_new("(qyy@aq)", addr16, ep, group_count,      grouplist_variant),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'get_group_membership' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_remove_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-               zb_zcl_group_remove_group_cb cb, void *user_data)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_group_remove_group()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_group_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_GROUP_INTERFACE,  "remove_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_GROUP_REMOVE_GROUP_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_group", g_variant_new("(qyq)",
-               addr16, ep, group_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'remove_group' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_remove_all_group(zb_nwk_addr addr16, unsigned char ep)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_group_remove_all_group()");
-
-       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_all_group",
-               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'remove_all_group' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_add_group_if_identifying(zb_nwk_addr addr16, unsigned char ep,
-               unsigned short group_id, const char *group_name)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       int j = 0;
-       GVariant *groupname_variant = NULL;
-       GVariantBuilder *groupname_builder = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       while (group_name[j] != '\0') {
-               g_variant_builder_add(groupname_builder, "(y)", group_name[j]);
-               j++;
-       }
-       groupname_variant = g_variant_builder_end(groupname_builder);
-       g_variant_builder_unref(groupname_builder);
-
-       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group_if_identifying",
-               g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'add_group_if_identifying' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_level_control_move_to_level(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char level, unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_level_control_move_to_level()");
-
-       variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level",
-               g_variant_new("(qyyq)", addr16, ep, level, transition_time),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_to_level' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_level_control_move(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char move_mode, unsigned char rate)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_level_control_move()");
-
-       variant = g_dbus_proxy_call_sync(level_control_gproxy, "move",
-               g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_level_control_step(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char step_mode, unsigned char step_size,
-               unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_level_control_step()");
-
-       variant = g_dbus_proxy_call_sync(level_control_gproxy, "step",
-               g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'step' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_level_control_stop(zb_nwk_addr addr16, unsigned char ep)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_level_control_stop()");
-
-       variant = g_dbus_proxy_call_sync(level_control_gproxy, "stop",
-               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'stop' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_level_control_move_to_level_with_on_off(zb_nwk_addr addr16,
-               unsigned char ep, unsigned char level, unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_level_control_move_to_level_with_on_off()");
-
-       variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level_with_on_off",
-               g_variant_new("(qyyq)", addr16, ep, level, transition_time),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_to_level_with_on_off' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_level_control_move_with_on_off(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char move_mode, unsigned char rate)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_level_control_move_with_on_off()");
-
-       variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_with_on_off",
-               g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'move_with_on_off' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_level_control_step_with_on_off(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char step_mode, unsigned char step_size,
-               unsigned short transition_time)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_level_control_step_with_on_off()");
-
-       variant = g_dbus_proxy_call_sync(level_control_gproxy, "step_with_on_off",
-               g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'step_with_on_off' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_onoff_set(zb_nwk_addr addr16, unsigned char ep, unsigned char on_off_type)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(on_off_gproxy, "set_on_off",
-               g_variant_new("(qyy)", addr16, ep, on_off_type), G_DBUS_CALL_FLAGS_NONE,
-               -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'set_on_off' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_zone_enroll_response(zb_nwk_addr addr16, unsigned char dst_ep,
-               unsigned char enroll_response_code, unsigned char zone_id)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_ias_zone_proxy, "enroll_response",
-               g_variant_new("(qyyy)", addr16, dst_ep, enroll_response_code, zone_id),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'enroll_response' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_pollcontrol_check_in_response(zb_nwk_addr addr16, unsigned char ep,
-               unsigned char start_fast_polling, unsigned short fast_poll_timeout)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "check_in_response",
-               g_variant_new("(qyyq)", addr16, ep, start_fast_polling, fast_poll_timeout),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'check_in_response' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_pollcontrol_fast_poll_stop(zb_nwk_addr addr16, unsigned char ep)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "fast_poll_stop",
-               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'fast_poll_stop' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_pollcontrol_set_long_poll_interval(zb_nwk_addr addr16, unsigned char ep,
-       unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_pollcontrol_set_long_poll_interval()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_poll_control_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_POLL_CONTROL_INTERFACE,  "checkin_response",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_long_poll_interval",
-                       g_variant_new("(qyu)", addr16, ep, new_long_poll_interval),
-                       G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'set_long_poll_interval' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_pollcontrol_set_short_poll_interval(zb_nwk_addr addr16, unsigned char ep,
-       unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       DBG("zbl_pollcontrol_set_short_poll_interval()");
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_poll_control_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_POLL_CONTROL_INTERFACE,  "checkin_response",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_short_poll_interval",
-                       g_variant_new("(qyu)", addr16, ep, new_short_poll_interval),
-                       G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'set_short_poll_interval' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_add_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       unsigned char scene_id, unsigned short transition_time, const char *scene_name,
-       unsigned short ext_field_len, const char *extension_field_sets,
-       zb_zcl_scene_add_scene_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       int j = 0;
-       int index = 0;
-       GVariant *scenename_variant = NULL;
-       GVariantBuilder *scenename_builder = NULL;
-       GVariant *extensionfieldSet_variant = NULL;
-       GVariantBuilder *extensionfieldSet_builder = NULL;
-
-       DBG("zbl_add_scene()");
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_scene_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_SCENE_INTERFACE,  "add_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_SCENE_ADD_SCENE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       scenename_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       while ('\0' != scene_name[j]) {
-               g_variant_builder_add(scenename_builder, "(y)", scene_name[j]);
-               j++;
-       }
-       scenename_variant = g_variant_builder_end(scenename_builder);
-       g_variant_builder_unref(scenename_builder);
-
-       extensionfieldSet_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-
-       while (index < ext_field_len) {
-               INFO("Ext contents 0x%02X", extension_field_sets[index]);
-               g_variant_builder_add(extensionfieldSet_builder, "(y)", extension_field_sets[index]);
-               index++;
-       }
-       extensionfieldSet_variant = g_variant_builder_end(extensionfieldSet_builder);
-       g_variant_builder_unref(extensionfieldSet_builder);
-
-       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "add_scene",
-               g_variant_new("(qyqyqq@a(y)@a(y))", addr16, ep, group_id, scene_id, transition_time,
-               ext_field_len, scenename_variant, extensionfieldSet_variant), G_DBUS_CALL_FLAGS_NONE,
-               to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'add_scene' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_view_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       DBG("zbl_scene_view_scene()");
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_scene_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_SCENE_INTERFACE,  "view_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
-                       _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_SCENE_VIEW_SCENE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "view_scene",
-               g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE,
-               to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'view_scene' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_remove_scene(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_cb cb,
-       void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       DBG("zbl_scene_remove_scene()");
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_scene_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_SCENE_INTERFACE,  "remove_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_SCENE_REMOVE_SCENE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_scene",
-               g_variant_new("(qyqy)", addr16, ep, group_id, scene_id),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'remove_scene' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_remove_all_scene(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       DBG("zbl_scene_remove_all_scene()");
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_scene_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_SCENE_INTERFACE,  "remove_all_scene_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
-                       _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_all_scene",
-               g_variant_new("(qyq)", addr16, ep, group_id),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'remove_all_scene' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_store_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       DBG("zbl_scene_store_scene()");
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_scene_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_SCENE_INTERFACE,  "store_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
-                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_SCENE_STORE_SCENE_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "store_scene",
-               g_variant_new("(qyqy)", addr16, ep, group_id, scene_id),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'store_scene' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_recall_scene(zb_nwk_addr addr16, unsigned char ep,     unsigned short group_id,
-       unsigned char scene_id)
-{
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "recall_scene",
-               g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE,
-               -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'recall_scene' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_get_scene_membership(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, zb_zcl_scene_get_scene_membership_cb cb, void *user_data)
-{
-       int sub_id, to;
-       zbl_req_cb_s *container;
-
-       int result = ZIGBEE_ERROR_NONE;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       DBG("zbl_scene_get_scene_membership()");
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
-
-       container = calloc(1, sizeof(zbl_req_cb_s));
-       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       to = zbl_dbus_get_timeout(zcl_scene_proxy);
-       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
-                       ZIGBEE_ZCL_SCENE_INTERFACE, "get_scene_membership_rsp",
-                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
-                       _zbl_request_cleanup);
-
-       if (0 == sub_id) {
-               ERR("g_dbus_connection_signal_subscribe() Fail");
-               if (container) {
-                       free(container);
-                       container = NULL;
-               }
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       container->cb = cb;
-       container->sid = sub_id;
-       container->cid = ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ;
-       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
-       container->userdata = user_data;
-
-       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "get_scene_membership",
-               g_variant_new("(qyq)", addr16, ep, group_id),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get get_scene_membership [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_thermostat_adjust_setpoint(zb_nwk_addr addr16, unsigned char ep, unsigned char mode,
-       unsigned char amount)
-{
-       int result = ZIGBEE_ERROR_IO_ERROR;
-       GVariant *variant = NULL;
-       GError *dbus_err = NULL;
-
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR);
-
-       variant = g_dbus_proxy_call_sync(thermostat_gproxy, "setpoint_raise_lower",
-               g_variant_new("(qyyy)", addr16, ep, mode, amount),
-               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
-
-       if (!variant) {
-               ERR("Failed to get 'setpoint_raise_lower' [%s]", dbus_err->message);
-               if (strstr(dbus_err->message, "AccessDenied"))
-                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
-               else
-                       result = ZIGBEE_ERROR_IO_ERROR;
-
-               g_error_free(dbus_err);
-               return result;
-       }
-
-       g_variant_get(variant, "(i)", &result);
-       DBG("ret = [0x%x]", result);
-       g_variant_unref(variant);
-
-       return result;
-}
-
-int zbl_dbus_start(zb_zigbee_h handle)
-{
-       FN_CALL;
-
-       GError *error = NULL;
-       unsigned int id;
-
-       if (gdbus_conn) {
-               zbl_ref_count++;
-               return ZIGBEE_ERROR_NONE;
-       }
-
-       gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
-       if (NULL == gdbus_conn) {
-               ERR("Couldn't connect to the System bus [%s]\n", error->message);
-               g_error_free(error);
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       id = g_signal_connect(gdbus_conn, "notify::g-name-owner",
-                       G_CALLBACK(_zbl_dbus_name_owner_notify), handle);
-       if (0 == id) {
-               ERR("g_signal_connect() Fail\n");
-               return ZIGBEE_ERROR_IO_ERROR;
-       }
-
-       /* Phase 1. Subscribe signals */
-       _zbl_dbus_subscribe_signal(handle);
-
-       /* Phase 2. Make proxies */
-       service_gproxy = _zbl_get_service_proxy();
-       RETVM_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get service_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(service_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       on_off_gproxy = _zbl_get_on_off_proxy();
-       RETVM_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get on_off_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(on_off_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       door_lock_gproxy = _zbl_get_door_lock_proxy();
-       RETVM_IF(NULL == door_lock_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get door_lock_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(door_lock_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       level_control_gproxy = _zbl_get_level_control_proxy();
-       RETVM_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get level_control_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(level_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       thermostat_gproxy = _zbl_get_thermostat_proxy();
-       RETVM_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get thermostat_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(thermostat_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       fan_control_gproxy = _zbl_get_fan_control_proxy();
-       RETVM_IF(NULL == fan_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get fan_control_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(fan_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       alarm_gproxy = _zbl_get_alarm_proxy();
-       RETVM_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get alarm_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(alarm_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       mfglib_gproxy = _zbl_get_mfglib_proxy();
-       RETVM_IF(NULL == mfglib_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get mfglib_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(mfglib_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zcl_global_proxy = _zbl_get_zcl_global_proxy();
-       RETVM_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_global_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_global_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zdo_dev_proxy = _zbl_get_zdo_dev_proxy();
-       RETVM_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_dev_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_dev_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zcl_basic_proxy = _zbl_get_basic_proxy();
-       RETVM_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_basic_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_basic_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zcl_identify_proxy = _zbl_get_identify_proxy();
-       RETVM_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_identify_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_identify_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zcl_ias_zone_proxy = _zbl_get_ias_zone_proxy();
-       RETVM_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_ias_zone_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_ias_zone_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zcl_poll_control_proxy = _zbl_get_poll_control_proxy();
-       RETVM_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_poll_control_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_poll_control_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zcl_group_proxy = _zbl_get_group_proxy();
-       RETVM_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_group_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_group_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zcl_scene_proxy = _zbl_get_scene_proxy();
-       RETVM_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_scene_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_scene_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zdo_bind_proxy = _zbl_get_zdo_bind_proxy();
-       RETVM_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_bind_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_bind_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zcl_color_control_proxy = _zbl_get_color_control_proxy();
-       RETVM_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_color_control_proxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_color_control_proxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       custom_gproxy = _zbl_get_custom_gproxy();
-       RETVM_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get custom_gproxy");
-       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(custom_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
-
-       zbl_ref_count++;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-int zbl_dbus_stop(zb_zigbee_h handle)
-{
-       struct zbl_zigbee_s *h = handle;
-       DBG("zbl_dbus_stop()");
-
-       if (0 >= zbl_ref_count) {
-               WARN("dbus does not initiaized\n");
-               return ZIGBEE_ERROR_NONE;
-       }
-
-       if (0 > --zbl_ref_count) {
-               DBG("all connections closed\n");
-               zbl_ref_count = 0;
-               return ZIGBEE_ERROR_NONE;
-       }
-
-       if (gdbus_conn) {
-               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
-               h->dbus_sub_ids = NULL;
-
-               g_object_unref(service_gproxy);
-               service_gproxy = NULL;
-               g_object_unref(on_off_gproxy);
-               on_off_gproxy = NULL;
-               g_object_unref(door_lock_gproxy);
-               door_lock_gproxy = NULL;
-               g_object_unref(level_control_gproxy);
-               level_control_gproxy = NULL;
-               g_object_unref(thermostat_gproxy);
-               thermostat_gproxy = NULL;
-               g_object_unref(alarm_gproxy);
-               alarm_gproxy = NULL;
-               g_object_unref(fan_control_gproxy);
-               fan_control_gproxy = NULL;
-
-               g_object_unref(mfglib_gproxy);
-               mfglib_gproxy = NULL;
-               g_object_unref(zcl_global_proxy);
-               zcl_global_proxy = NULL;
-               g_object_unref(zcl_color_control_proxy);
-               zcl_color_control_proxy = NULL;
-               g_object_unref(custom_gproxy);
-               custom_gproxy = NULL;
-
-               g_object_unref(gdbus_conn);
-               gdbus_conn = NULL;
-
-               DBG("zbl_dbus_stop() finished");
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-GDBusConnection* zbl_dbus_get_object(void)
-{
-       return gdbus_conn;
-}
-
-int zbl_dbus_get_timeout(GDBusProxy *proxy)
-{
-       gint timeout;
-       RETV_IF(NULL == gdbus_conn, ZIGBEE_BROADCAST_TIMEOUT);
-       timeout = g_dbus_proxy_get_default_timeout(proxy);
-       if (timeout <= 0) {
-               ERR("Invalid timeout (%d)", timeout);
-               return ZIGBEE_BROADCAST_TIMEOUT;
-       }
-       return timeout;
-}
-
-int zbl_check_privilege()
-{
-       int ret = _check_zigbee_privilege();
-       if (ret != ZIGBEE_ERROR_NONE) {
-               ERR("Failed to check privilege");
-               return ret;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
diff --git a/lib/zbl-dbus.h b/lib/zbl-dbus.h
deleted file mode 100644 (file)
index eebe438..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (c) 2015 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_ZIGBEE_LIBRARY_DBUS_H__
-#define __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__
-
-#include <gio/gio.h>
-
-#include "zb-common.h"
-
-#include "zbl.h"
-#include "zbl-dbus.h"
-
-int zbl_dbus_start(zb_zigbee_h handle);
-int zbl_dbus_stop(zb_zigbee_h handle);
-GDBusConnection* zbl_dbus_get_object(void);
-int zbl_dbus_get_timeout(GDBusProxy *proxy);
-int zbl_check_privilege();
-
-int zbl_enable(zb_zigbee_h handle);
-int zbl_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler);
-int zbl_disable(void);
-int zbl_hw_reset(void);
-int zbl_coex_start(unsigned char channel);
-int zbl_coex_stop(void);
-int zbl_get_network_info(zb_ieee_addr addr64, zb_nwk_addr *nodeid,
-       zb_nwk_addr *panid, unsigned char *channel, unsigned char *tx_power);
-int zbl_get_controller_mac_address(zb_ieee_addr addr64);
-int zbl_get_cluster_list(zb_ieee_addr eui64, unsigned char endpoint,
-       unsigned char *in_cluster_count, unsigned short in_cluster_list[],
-       unsigned char *out_cluster_count, unsigned short out_cluster_list[]);
-int zbl_get_endpoint_list(zb_ieee_addr eui64, unsigned char *count,
-       unsigned char list[]);
-int zbl_get_all_device_info(zb_end_dev_info_h **dev_list, unsigned char* num);
-int zbl_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data);
-int zbl_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb,
-       void *user_data);
-int zbl_leave_device(zb_ieee_addr addr64, bool remove_children, bool rejoin);
-int zbl_permit_join(unsigned char duration, bool broadcast);
-
-int zbl_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64,
-       unsigned char request_type, unsigned char start_idx, zb_zdo_addr_cb cb,
-       void *user_data);
-int zbl_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb,
-       void *user_data);
-int zbl_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb,
-       void *user_data);
-int zbl_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       zb_zdo_simple_desc_cb cb, void *user_data);
-int zbl_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned short profileid, unsigned char num_in_clusters,
-       unsigned short *in_clusters, unsigned char num_out_clusters,
-       unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data);
-int zbl_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64,
-       unsigned char capability);
-
-int zbl_node_desc_req(zb_nwk_addr addr16, zb_zdo_node_desc_cb cb, void *user_data);
-int zbl_power_desc_req(zb_nwk_addr addr16, zb_zdo_power_desc_cb cb,
-       void *user_data);
-int zbl_complex_desc_req(zb_nwk_addr addr16, zb_zdo_complex_desc_cb cb,
-       void *user_data);
-int zbl_user_desc_req(zb_nwk_addr addr16, zb_zdo_user_desc_cb cb, void *user_data);
-int zbl_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len,
-       unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data);
-int zbl_bind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64,
-       unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64,
-       unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep, zb_zdo_bind_cb cb,
-       void *user_data);
-int zbl_unbind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64,
-       unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64,
-       unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep,
-       zb_zdo_unbind_cb cb, void *user_data);
-int zbl_mgmt_nwk_disc_req(zb_nwk_addr addr16, unsigned int scan_channels,
-       unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx,
-       zb_zdo_mgmt_nwk_disc_cb cb, void *user_data);
-int zbl_mgmt_nwk_update_req(unsigned int scan_channels,
-       unsigned char scan_duration, unsigned char scan_count, unsigned char nwk_update_id,
-       zb_nwk_addr nwk_manager_addr);
-int zbl_mgmt_lqi_req(zb_nwk_addr addr16, unsigned char start_idx,
-       zb_zdo_mgmt_lqi_cb cb, void *user_data);
-int zbl_mgmt_rtg_req(zb_nwk_addr addr16, unsigned char start_idx,
-       zb_zdo_mgmt_rtg_cb cb, void *user_data);
-int zbl_mgmt_bind_req(zb_nwk_addr addr16, unsigned char start_idx,
-       zb_zdo_mgmt_bind_cb cb, void *user_data);
-int zbl_mgmt_leave_device(zb_ieee_addr addr64, unsigned char remove_children,
-       unsigned rejoin, zb_zdo_mgmt_leave_cb cb, void *user_data);
-int zbl_mgmt_permit_joining_req(zb_nwk_addr addr16, unsigned char duration,
-       unsigned char tc_significance, zb_zdo_mgmt_permit_joining_cb cb, void *user_data);
-
-/* Custom Commands */
-int zbl_aps_send(zb_nwk_addr addr16, unsigned char aps_fc,
-       unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid,
-       unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code,
-       unsigned char cmd_id, unsigned short payload_len, unsigned char *payload,
-       zb_aps_send_cb cb, void *user_data);
-int zbl_zcl_send(zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
-       unsigned short clusterid, unsigned char zcl_fc, unsigned char cmd,
-       unsigned short payload_len, unsigned char *payload,
-       zb_zcl_send_cb cb, void *user_data);
-int zbl_send_to_local(unsigned short length, unsigned char *data,
-               zb_send_to_local_cb cb, void *user_data);
-
-/* ZCL Global Commands */
-int zbl_read_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char dest_ep,
-       unsigned char zcl_fc, unsigned short clusterid, unsigned short *attribute_ids,
-       int attribute_ids_len, zb_zcl_global_attr_read_cb cb, void *user_data);
-int zbl_write_attr_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
-       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
-       void **records,
-       int count, zb_zcl_global_attr_write_cb cb, void *user_data);
-int zbl_wattr_undivided_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, void **records, int count,
-       zb_zcl_global_attr_write_cb cb, void *user_data);
-int zbl_wattr_req_no_cb(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
-       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
-       void **records, int count);
-int zbl_write_config_report(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, void **records, int count,
-       zb_zcl_global_config_report_write_cb cb, void *user_data);
-int zbl_read_config_report(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, void **records, int count,
-       zb_zcl_global_config_report_read_cb cb, void *user_data);
-int zbl_discover_attr_req(zb_zigbee_h handle, unsigned short addr16,
-       unsigned char src_ep, unsigned char dest_ep, unsigned char zcl_fc,
-       unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids,
-               zb_zcl_global_attr_discover_cb cb, void *user_data);
-int zbl_discover_cmds_gen(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, unsigned char start_command_id,
-       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data);
-int zbl_discover_cmds_recv(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, unsigned char start_command_id,
-       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data);
-int zbl_discover_attr_ext(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids,
-       zb_zcl_global_attr_extended_discover_cb cb, void *user_data);
-
-/* ZCL Alarm Cluster */
-int zbl_reset_alarm(zb_nwk_addr addr16, unsigned char ep, unsigned char alarm_code,
-       unsigned short clusterid);
-int zbl_reset_all_alarm(zb_nwk_addr addr16, unsigned char ep);
-int zbl_get_alarm(zb_nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_cb cb,
-       void *user_data);
-int zbl_reset_all_alarm_log(zb_nwk_addr addr16, unsigned char ep);
-
-/* ZCL Color Control Cluster */
-int zbl_ccontrol_move_to_hue(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char hue, unsigned char direction, unsigned short transition_time);
-int zbl_ccontrol_move_hue(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char move_mode, unsigned char rate);
-int zbl_ccontrol_step_hue(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char step_mode, unsigned char step_size, unsigned char transition_time);
-int zbl_ccontrol_move_to_saturation(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char saturation, unsigned short transition_time);
-int zbl_ccontrol_move_saturation(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char move_mode, unsigned char rate);
-int zbl_ccontrol_step_saturation(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char step_mode, unsigned char step_size, unsigned char transition_time);
-int zbl_ccontrol_move_to_hue_and_saturation(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char hue, unsigned char saturation, unsigned short transition_time);
-int zbl_ccontrol_move_to_color(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short color_x, unsigned short color_y, unsigned short transition_time);
-int zbl_ccontrol_move_color(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short rate_x, unsigned short rate_y);
-int zbl_ccontrol_step_color(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short step_x, unsigned short step_y, unsigned short transition_time);
-int zbl_ccontrol_move_to_color_temperature(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short color_temperature, unsigned short transition_time);
-
-/* ZCL Basic Cluster */
-int zbl_reset_factory_default(zb_nwk_addr addr16, unsigned char ep);
-
-/* ZCL Identity Cluster */
-int zbl_identify(zb_nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time);
-int zbl_identify_query(zb_nwk_addr addr16, unsigned char dst_ep,
-       zb_zcl_identify_query_cb cb, void *user_data);
-
-/* ZCL Group Cluster */
-int zbl_add_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       const char *group_name, zb_zcl_group_add_group_cb cb, void *user_data);
-int zbl_view_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       zb_zcl_group_view_group_cb cb, void *user_data);
-int zbl_group_get_group_membership(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char group_count, unsigned short *group_list,
-       zb_zcl_group_get_group_membership_cb cb, void *user_data);
-int zbl_remove_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       zb_zcl_group_remove_group_cb cb, void *user_data);
-int zbl_remove_all_group(zb_nwk_addr addr16, unsigned char ep);
-int zbl_add_group_if_identifying(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, const char *group_name);
-
-/* ZCL Level Control Cluster */
-int zbl_level_control_move_to_level(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char level, unsigned short transition_time);
-int zbl_level_control_move(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char move_mode, unsigned char rate);
-int zbl_level_control_step(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char step_mode, unsigned char step_size, unsigned short transition_time);
-int zbl_level_control_stop(zb_nwk_addr addr16, unsigned char ep);
-int zbl_level_control_move_to_level_with_on_off(zb_nwk_addr addr16,
-       unsigned char ep, unsigned char level, unsigned short transition_time);
-int zbl_level_control_move_with_on_off(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char move_mode, unsigned char rate);
-int zbl_level_control_step_with_on_off(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char step_mode, unsigned char step_size, unsigned short transition_time);
-
-/* ZCL On/Off Cluster */
-int zbl_onoff_set(zb_nwk_addr addr16, unsigned char ep, unsigned char on_off_type);
-int zbl_zone_enroll_response(zb_nwk_addr addr16, unsigned char dst_ep,
-       unsigned char enroll_response_code, unsigned char zone_id);
-
-/* Poll-control Cluster */
-int zbl_pollcontrol_check_in_response(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char start_fast_polling, unsigned short fast_poll_timeout);
-int zbl_pollcontrol_fast_poll_stop(zb_nwk_addr addr16, unsigned char ep);
-int zbl_pollcontrol_set_long_poll_interval(zb_nwk_addr addr16, unsigned char ep,
-       unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data);
-int zbl_pollcontrol_set_short_poll_interval(zb_nwk_addr addr16, unsigned char ep,
-       unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data);
-
-/* Scene Cluster */
-int zbl_add_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       unsigned char scene_id, unsigned short transition_time, const char *scene_name,
-       unsigned short ext_field_len, const char *extension_field_sets,
-       zb_zcl_scene_add_scene_cb cb, void *user_data);
-int zbl_view_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, void *user_data);
-int zbl_remove_scene(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_cb cb,
-       void *user_data);
-int zbl_remove_all_scene(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, void *user_data);
-int zbl_store_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, void *user_data);
-int zbl_recall_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
-       unsigned char scene_id);
-int zbl_get_scene_membership(zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, zb_zcl_scene_get_scene_membership_cb cb, void *user_data);
-
-/* Thermostat Cluster */
-int zbl_thermostat_adjust_setpoint(zb_nwk_addr addr16, unsigned char ep,
-       unsigned char mode, unsigned char amount);
-
-#endif /* __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__ */
diff --git a/lib/zbl-zcl-alarm.c b/lib/zbl-zcl-alarm.c
deleted file mode 100644 (file)
index 905cb42..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_alarm_reset_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       unsigned char alarm_code, zb_cluster_id clusterid)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_reset_alarm(addr16, ep, alarm_code, clusterid);
-       return ret;
-}
-
-API int zb_zcl_alarm_reset_all_alarm(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_reset_all_alarm(addr16, ep);
-       return ret;
-}
-
-API int zb_zcl_alarm_get_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       zb_zcl_alarm_get_alarm_cb cb, void *user_data)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_get_alarm(addr16, ep, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_alarm_reset_all_alarm_log(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_reset_all_alarm_log(addr16, ep);
-       return ret;
-}
-
diff --git a/lib/zbl-zcl-basic.c b/lib/zbl-zcl-basic.c
deleted file mode 100644 (file)
index d46187b..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_basic_reset_factory_default(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_reset_factory_default(addr16, ep);
-       return ret;
-}
diff --git a/lib/zbl-zcl-color-control.c b/lib/zbl-zcl-color-control.c
deleted file mode 100644 (file)
index 1668cdc..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_ccontrol_move_to_hue(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char hue, unsigned char direction,
-       unsigned short transition_time)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_move_to_hue(addr16, ep, hue, direction, transition_time);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_move_hue(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char move_mode, unsigned char rate)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_move_hue(addr16, ep, move_mode, rate);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_step_hue(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char step_mode, unsigned char step_size,
-       unsigned char transition_time)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_step_hue(addr16, ep, step_mode, step_size, transition_time);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_move_to_saturation(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char ep, unsigned char saturation,
-       unsigned short transition_time)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_move_to_saturation(addr16, ep, saturation, transition_time);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_move_saturation(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char move_mode, unsigned char rate)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_move_saturation(addr16, ep, move_mode, rate);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_step_saturation(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char step_mode, unsigned char step_size,
-       unsigned char transition_time)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_step_saturation(addr16, ep, step_mode, step_size, transition_time);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_move_to_hue_and_saturation(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char ep, unsigned char hue, unsigned char saturation,
-       unsigned short transition_time)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_move_to_hue_and_saturation(addr16, ep, hue, saturation, transition_time);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_move_to_color(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short color_x, unsigned short color_y,
-       unsigned short transition_time)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_move_to_color(addr16, ep, color_x, color_y, transition_time);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_move_color(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short rate_x, unsigned short rate_y)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_move_color(addr16, ep, rate_x, rate_y);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_step_color(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short step_x, unsigned short step_y,
-       unsigned short transition_time)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_step_color(addr16, ep, step_x, step_y, transition_time);
-       return ret;
-}
-
-API int zb_zcl_ccontrol_move_to_color_temperature(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char ep, unsigned short color_temperature,
-       unsigned short transition_time)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_ccontrol_move_to_color_temperature(addr16, ep, color_temperature, transition_time);
-       return ret;
-}
-
diff --git a/lib/zbl-zcl-global-cmd.c b/lib/zbl-zcl-global-cmd.c
deleted file mode 100644 (file)
index 1a57b89..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-/* For test */
-#define ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA 0
-
-API int zb_zcl_global_attr_read(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, unsigned short *attribute_ids, int attribute_ids_len,
-       zb_zcl_global_attr_read_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == attribute_ids, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == attribute_ids_len, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_read_attr_req(handle, addr16, dst_ep, zcl_fc, clusterid,
-                       attribute_ids, attribute_ids_len, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_global_attr_read_structured(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, zb_zcl_read_structured_attr_record_h *records,
-       int count, zb_zcl_global_attr_read_cb cb, void *user_data)
-{
-#if (0 == ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA)
-       return ZIGBEE_ERROR_NOT_SUPPORTED;
-#endif
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zcl_global_attr_write(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, zb_zcl_write_attr_record_h *records, int count,
-       zb_zcl_global_attr_write_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_write_attr_req(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, records, count, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_global_attr_write_undivided(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
-       unsigned char zcl_fc, unsigned short clusterid,
-       zb_zcl_write_attr_record_h *records, int count,
-       zb_zcl_global_attr_write_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_wattr_undivided_req(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, records, count, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_global_attr_write_structured(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, zb_zcl_write_attr_structured_record_h *records,
-       int count, zb_zcl_global_attr_write_cb cb, void *user_data)
-{
-#if (0 == ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA)
-       return ZIGBEE_ERROR_NOT_SUPPORTED;
-#endif
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zcl_global_attr_write_no_rsp(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, zb_zcl_write_attr_record_h *records, int count)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_wattr_req_no_cb(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, records, count);
-       return ret;
-}
-
-API int zb_zcl_global_config_report_write(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, zb_zcl_reporting_config_record_h *records, int count,
-       zb_zcl_global_config_report_write_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_write_config_report(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, records, count, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_global_config_report_read(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, zb_zcl_read_report_config_record_h *records,
-       int count, zb_zcl_global_config_report_read_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_read_config_report(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, records, count, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_global_attr_discover(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
-       unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids,
-       zb_zcl_global_attr_discover_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_discover_attr_req(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, start_id, max_attribute_ids, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_global_discover_cmds_received(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
-       unsigned char zcl_fc, unsigned short clusterid, unsigned char start_command_id,
-       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_discover_cmds_recv(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, start_command_id, max_command_ids, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_global_discover_cmds_generated(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
-       unsigned char zcl_fc, unsigned short clusterid, unsigned char start_command_id,
-       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_discover_cmds_gen(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, start_command_id, max_command_ids, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_global_attr_extended_discover(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
-       unsigned char zcl_fc, unsigned short clusterid, unsigned short start_id,
-       unsigned char max_attribute_ids, zb_zcl_global_attr_extended_discover_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_discover_attr_ext(handle, addr16, src_ep, dst_ep, zcl_fc,
-                       clusterid, start_id, max_attribute_ids, cb, user_data);
-       return ret;
-}
diff --git a/lib/zbl-zcl-groups.c b/lib/zbl-zcl-groups.c
deleted file mode 100644 (file)
index ae54a92..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_group_add_group(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short group_id, char *group_name,
-       zb_zcl_group_add_group_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == group_name, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_add_group(addr16, ep, group_id, group_name, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_group_view_group(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short group_id, zb_zcl_group_view_group_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_view_group(addr16, ep, group_id, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_group_get_group_membership(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char group_count, unsigned short *group_list,
-       zb_zcl_group_get_group_membership_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == group_list, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_group_get_group_membership(addr16, ep, group_count, group_list, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_group_remove_group(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short group_id, zb_zcl_group_remove_group_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_remove_group(addr16, ep, group_id, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_group_remove_all_group(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_remove_all_group(addr16, ep);
-       return ret;
-}
-
-API int zb_zcl_group_add_group_if_identifying(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short group_id, const char *group_name)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_add_group_if_identifying(addr16, ep, group_id, group_name);
-       return ret;
-}
diff --git a/lib/zbl-zcl-identify.c b/lib/zbl-zcl-identify.c
deleted file mode 100644 (file)
index 984c725..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_identify(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       unsigned short identify_time)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_identify(addr16, ep, identify_time);
-       return ret;
-}
-
-API int zb_zcl_identify_query(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       zb_zcl_identify_query_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_identify_query(addr16, ep, cb, user_data);
-       return ret;
-}
diff --git a/lib/zbl-zcl-isa-zone.c b/lib/zbl-zcl-isa-zone.c
deleted file mode 100644 (file)
index 8d8aa66..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_zone_enroll_response(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char enroll_response_code, unsigned char zone_id)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_zone_enroll_response(addr16, ep, enroll_response_code, zone_id);
-       return ret;
-}
diff --git a/lib/zbl-zcl-level-control.c b/lib/zbl-zcl-level-control.c
deleted file mode 100644 (file)
index 24022a9..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_levelctrl_move_to_level(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char level, unsigned short transition_time)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_level_control_move_to_level(addr16, ep, level, transition_time);
-       return ret;
-}
-
-API int zb_zcl_levelctrl_move(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char move_mode, unsigned char rate)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_level_control_move(addr16, ep, move_mode, rate);
-       return ret;
-}
-
-API int zb_zcl_levelctrl_step(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       unsigned char step_mode, unsigned char step_size, unsigned short transition_time)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_level_control_step(addr16, ep, step_mode, step_size, transition_time);
-       return ret;
-}
-
-API int zb_zcl_levelctrl_stop(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_level_control_stop(addr16, ep);
-       return ret;
-}
-
-API int zb_zcl_levelctrl_move_to_level_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char level, unsigned short transition_time)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_level_control_move_to_level_with_on_off(addr16, ep, level, transition_time);
-       return ret;
-}
-
-API int zb_zcl_levelctrl_move_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char move_mode, unsigned char rate)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_level_control_move_with_on_off(addr16, ep, move_mode, rate);
-       return ret;
-}
-
-API int zb_zcl_levelctrl_step_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char step_mode, unsigned char step_size,
-       unsigned short transition_time)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_level_control_step_with_on_off(addr16, ep, step_mode, step_size, transition_time);
-       return ret;
-}
-
diff --git a/lib/zbl-zcl-on-off.c b/lib/zbl-zcl-on-off.c
deleted file mode 100644 (file)
index 3999c56..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_on_off_control(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       zb_zcl_on_off_e on_off_type)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_onoff_set(addr16, ep, on_off_type);
-       return ret;
-}
diff --git a/lib/zbl-zcl-poll-control.c b/lib/zbl-zcl-poll-control.c
deleted file mode 100644 (file)
index 27e634a..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_pollctrl_check_in_response(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char start_fast_polling, unsigned short fast_poll_timeout)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_pollcontrol_check_in_response(addr16, ep, start_fast_polling,
-               fast_poll_timeout);
-       return ret;
-}
-
-API int zb_zcl_pollctrl_fast_poll_stop(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_pollcontrol_fast_poll_stop(addr16, ep);
-       return ret;
-}
-
-API int zb_zcl_pollctrl_set_long_poll_interval(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char ep, unsigned int new_long_poll_interval,
-       zb_zcl_pollctrl_check_in_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_pollcontrol_set_long_poll_interval(addr16, ep, new_long_poll_interval,
-               cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_pollctrl_set_short_poll_interval(zb_zigbee_h handle,
-       zb_nwk_addr addr16, unsigned char ep, unsigned int new_short_poll_interval,
-       zb_zcl_pollctrl_check_in_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_pollcontrol_set_short_poll_interval(addr16, ep, new_short_poll_interval,
-               cb, user_data);
-       return ret;
-}
diff --git a/lib/zbl-zcl-scenes.c b/lib/zbl-zcl-scenes.c
deleted file mode 100644 (file)
index 190f6df..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_scene_add_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, unsigned char scene_id, unsigned short transition_time,
-       const char *scene_name, unsigned short ext_field_len,
-       const char *extension_field_sets, zb_zcl_scene_add_scene_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == scene_name, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == extension_field_sets, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_add_scene(addr16, ep, group_id, scene_id, transition_time, scene_name,
-               ext_field_len, extension_field_sets, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_scene_view_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, unsigned char scene_id, zb_zcl_scene_view_scene_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_view_scene(addr16, ep, group_id, scene_id, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_scene_remove_scene(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short group_id, unsigned char scene_id,
-       zb_zcl_scene_remove_scene_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_remove_scene(addr16, ep, group_id, scene_id, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_scene_remove_all_scene(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_remove_all_scene(addr16, ep, group_id, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_scene_store_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       unsigned short group_id, unsigned char scene_id, zb_zcl_scene_store_scene_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_store_scene(addr16, ep, group_id, scene_id, cb, user_data);
-       return ret;
-}
-
-API int zb_zcl_scene_recall_scene(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short group_id, unsigned char scene_id)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_recall_scene(addr16, ep, group_id, scene_id);
-       return ret;
-}
-
-API int zb_zcl_scene_get_scene_membership(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned short group_id,
-       zb_zcl_scene_get_scene_membership_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_get_scene_membership(addr16, ep, group_id, cb, user_data);
-       return ret;
-}
-
diff --git a/lib/zbl-zcl-thermostat.c b/lib/zbl-zcl-thermostat.c
deleted file mode 100644 (file)
index 09edcd5..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zcl_thermostat_adjust_setpoint(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char ep, unsigned char mode, unsigned char amount)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(0x02 < mode, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-
-       ret = zbl_thermostat_adjust_setpoint(addr16, ep, mode, amount);
-       return ret;
-}
-
diff --git a/lib/zbl-zcl.c b/lib/zbl-zcl.c
deleted file mode 100644 (file)
index 871b49f..0000000
+++ /dev/null
@@ -1,1408 +0,0 @@
-/*
- * Copyright (c) 2016 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 <error.h>
-#include <stdlib.h>
-
-#include "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-#define ZB_GUARD_CHAR 1
-#define ZB_ZCL_OCTET_SIZE 1
-#define ZB_ZCL_LONG_OCTET_SIZE 2
-
-API int zb_read_attr_status_record_create(
-       zb_zcl_read_attr_status_record_h *handle)
-{
-       zb_zcl_read_attr_status_record_h simple = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       simple = calloc(1, sizeof(struct read_attribute_status_record_s));
-       RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       *handle = simple;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_clone(zb_zcl_read_attr_status_record_h src,
-       zb_zcl_read_attr_status_record_h *dst)
-{
-       struct read_attribute_status_record_s *srcs = src;
-       struct read_attribute_status_record_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct read_attribute_status_record_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, src, sizeof(struct read_attribute_status_record_s));
-       desc->value = calloc(1, zb_zcl_get_data_size(srcs->type));
-       RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-
-API int zb_read_attr_status_record_destroy(
-       zb_zcl_read_attr_status_record_h handle)
-{
-       struct read_attribute_status_record_s* h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       if (h->value)
-               free(h->value);
-       free(h);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_get_id(
-       zb_zcl_read_attr_status_record_h handle, unsigned short* id)
-{
-       struct read_attribute_status_record_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *id = h->id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_set_id(
-       zb_zcl_read_attr_status_record_h handle, unsigned short id)
-{
-       struct read_attribute_status_record_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->id = id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_get_status(
-       zb_zcl_read_attr_status_record_h handle, zb_zcl_status_e* status)
-{
-       struct read_attribute_status_record_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *status = h->status;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_set_status(
-       zb_zcl_read_attr_status_record_h handle, zb_zcl_status_e status)
-{
-       struct read_attribute_status_record_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->status = status;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_get_type(
-       zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e *type)
-{
-       struct read_attribute_status_record_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *type = h->type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_set_type(
-       zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e type)
-{
-       struct read_attribute_status_record_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->type = type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_get_value(
-       zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e* type,
-       unsigned char** value, int* count)
-{
-       int len = -1;
-       struct read_attribute_status_record_s* h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->value, ZIGBEE_ERROR_NO_DATA);
-
-       len = zb_zcl_get_data_size(h->type);
-       if (0 < len) {
-
-               *value = calloc(len + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(*value, h->value, len);
-               *type = h->type;
-               *count = len;
-
-       } else if (ZB_ZCL_OCTET_STRING == h->type || ZB_ZCL_CHARACTER_STRING == h->type) {
-
-               len = h->value[0];
-
-               *value = calloc(len + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(*value, h->value + ZB_ZCL_OCTET_SIZE, len);
-
-               *type = h->type;
-               *count = len;
-
-       } else if (ZB_ZCL_LONG_OCTET_STRING == h->type || ZB_ZCL_LONG_CHARACTER_STRING == h->type) {
-
-               len = h->value[0] & 0xff;
-               len |= (h->value[1] << 8) & 0xff00 ;
-
-               *value = calloc(len + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(*value, h->value + ZB_ZCL_LONG_OCTET_SIZE, len);
-
-               *type = h->type;
-               *count = len;
-
-       } else {
-               return ZIGBEE_ERROR_NOT_SUPPORTED;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_attr_status_record_set_value(
-       zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e type,
-       unsigned char* value, int count)
-{
-       int len = -1;
-       struct read_attribute_status_record_s* h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       len = zb_zcl_get_data_size(type);
-       if (0 < len) {
-
-               h->value = calloc(len + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(h->value, value, len);
-               h->type = type;
-
-       } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) {
-
-               h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-
-               h->value[0] = count;
-               memcpy(h->value + ZB_ZCL_OCTET_SIZE, value + ZB_ZCL_OCTET_SIZE, count);
-
-       } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) {
-
-               h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-
-               h->value[0] = count & 0xff;
-               h->value[1] = (count >> 8) & 0xff ;
-               memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, len);
-
-       } else {
-               return ZIGBEE_ERROR_NOT_SUPPORTED;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discover_attr_info_create(zb_zcl_discover_attr_info_record_h *handle)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       zb_zcl_discover_attr_info_record_h simple = NULL;
-
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       simple = calloc(1, sizeof(struct discover_attribute_info_record_s));
-       RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = simple;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discover_attr_info_clone(zb_zcl_discover_attr_info_record_h src,
-       zb_zcl_discover_attr_info_record_h *dst)
-{
-       struct discover_attribute_info_record_s *srcs = src;
-       struct discover_attribute_info_record_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct discover_attribute_info_record_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, srcs, sizeof(struct discover_attribute_info_record_s));
-
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discover_attr_info_destroy(zb_zcl_discover_attr_info_record_h handle)
-{
-       struct discover_attribute_info_record_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discover_attr_info_get_id(
-       zb_zcl_discover_attr_info_record_h handle, unsigned short *id)
-{
-       struct discover_attribute_info_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *id = h->id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discover_attr_info_set_id(
-       zb_zcl_discover_attr_info_record_h handle, unsigned short id)
-{
-       struct discover_attribute_info_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->id = id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discover_attr_info_get_type(
-       zb_zcl_discover_attr_info_record_h handle, zb_zcl_data_type_e *type)
-{
-       struct discover_attribute_info_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *type = h->type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discover_attr_info_set_type(
-       zb_zcl_discover_attr_info_record_h handle, zb_zcl_data_type_e type)
-{
-       struct discover_attribute_info_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->type = type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_record_create(zb_zcl_write_attr_record_h *handle)
-{
-       zb_zcl_write_attr_record_h t = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       t = calloc(1, sizeof(struct write_attribute_record_s));
-       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       *handle = t;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_record_clone(zb_zcl_write_attr_record_h src,
-       zb_zcl_write_attr_record_h *dst)
-{
-       struct write_attribute_record_s *srcs = src;
-       struct write_attribute_record_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct write_attribute_record_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, src, sizeof(struct write_attribute_record_s));
-
-       desc->value = calloc(1, zb_zcl_get_data_size(srcs->type));
-       RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_record_destroy(zb_zcl_write_attr_record_h handle)
-{
-       struct write_attribute_record_s* h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       if (h->value) {
-               free(h->value);
-               h->value = NULL;
-       }
-       free(h);
-       h = NULL;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_record_set_id(zb_zcl_write_attr_record_h handle,
-       unsigned short id)
-{
-       struct write_attribute_record_s* h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->id = id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_record_set_type(zb_zcl_write_attr_record_h handle,
-       zb_zcl_data_type_e type)
-{
-       struct write_attribute_record_s* h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->type = type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_record_set_value(zb_zcl_write_attr_record_h handle,
-       zb_zcl_data_type_e type, unsigned char* value, int count)
-{
-       int len = -1;
-
-       struct write_attribute_record_s* h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       if (h->value) {
-               free(h->value);
-               h->value = NULL;
-       }
-
-       len = zb_zcl_get_data_size(type);
-       if (0 < len) {
-
-               h->value = calloc(len + ZB_GUARD_CHAR , sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(h->value, value, count);
-               h->type = type;
-
-       } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) {
-
-               h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               /* The first 1 byte indicate invalid or length of string */
-               h->value[0] = value[0] & 0xff;
-               memcpy(h->value + ZB_ZCL_OCTET_SIZE, value, count);
-
-       } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) {
-
-               h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-
-               /* The first 2 byte indicate invalid or length of string */
-               h->value[0] = count & 0xff;
-               h->value[1] = (count >> 8) & 0xff ;
-
-               memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, count);
-
-       } else {
-               return ZIGBEE_ERROR_NOT_SUPPORTED;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_status_create(zb_zcl_write_attr_status_record_h *handle)
-{
-       zb_zcl_write_attr_status_record_h simple = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       simple = calloc(1, sizeof(struct write_attribute_status_record_s));
-       RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = simple;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_status_clone(zb_zcl_write_attr_status_record_h src,
-       zb_zcl_write_attr_status_record_h *dst)
-{
-       struct write_attribute_status_record_s *srcs = src;
-       struct write_attribute_status_record_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct write_attribute_status_record_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, srcs, sizeof(struct write_attribute_status_record_s));
-
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_status_destroy(zb_zcl_write_attr_status_record_h handle)
-{
-       struct write_attribute_status_record_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_status_get_status(
-       zb_zcl_write_attr_status_record_h handle, zb_zcl_status_e *status)
-{
-       struct write_attribute_status_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *status = h->status;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_status_set_status(zb_zcl_write_attr_status_record_h handle,
-       zb_zcl_status_e status)
-{
-       struct write_attribute_status_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->status = status;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_status_get_id(zb_zcl_write_attr_status_record_h handle,
-       unsigned short *id)
-{
-       struct write_attribute_status_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *id = h->id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_write_attr_status_set_id(zb_zcl_write_attr_status_record_h handle,
-       unsigned short id)
-{
-       struct write_attribute_status_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->id = id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_create(zb_zcl_reporting_config_record_h *handle)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       zb_zcl_reporting_config_record_h t = NULL;
-
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       t = calloc(1, sizeof(struct reporting_configuration_record_s));
-       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = t;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_clone(zb_zcl_reporting_config_record_h src,
-       zb_zcl_reporting_config_record_h *dst)
-{
-       struct reporting_configuration_record_s *srcs = src;
-       struct reporting_configuration_record_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct reporting_configuration_record_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, src, sizeof(struct reporting_configuration_record_s));
-
-       desc->change = calloc(1, zb_zcl_get_data_size(srcs->type));
-       RETVM_IF(NULL == desc->change, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc->change, srcs->change, zb_zcl_get_data_size(srcs->type));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_destroy(zb_zcl_reporting_config_record_h handle)
-{
-       struct reporting_configuration_record_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       if (h->change)
-               free(h->change);
-       free(h);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_get_dir(zb_zcl_reporting_config_record_h handle,
-       zb_zcl_fc_direction_e *dir)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dir, ZIGBEE_ERROR_INVALID_PARAMETER);
-       *dir = h->dir;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_set_dir(zb_zcl_reporting_config_record_h handle,
-       zb_zcl_fc_direction_e dir)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       if (dir == ZB_ZCL_CLIENT_TO_SERVER)
-               h->dir = 0x00 ;
-       else
-               h->dir = 0x01;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_get_id(zb_zcl_reporting_config_record_h handle,
-       unsigned short *id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
-       *id = h->id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_set_id(zb_zcl_reporting_config_record_h handle,
-       unsigned short id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       h->id = id ;
-       return ZIGBEE_ERROR_NONE;
-}
-
-
-API int zb_report_config_record_get_type(
-       zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e *type)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
-       *type = h->type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_get_min_interval(
-       zb_zcl_reporting_config_record_h handle, unsigned short *min_i)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == min_i, ZIGBEE_ERROR_INVALID_PARAMETER);
-       *min_i = h->min_i;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_set_min_interval(
-       zb_zcl_reporting_config_record_h handle, unsigned short min_i)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       h->min_i = min_i;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_get_max_interval(
-       zb_zcl_reporting_config_record_h handle, unsigned short *max_i)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == max_i, ZIGBEE_ERROR_INVALID_PARAMETER);
-       *max_i = h->max_i;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_set_max_interval(
-       zb_zcl_reporting_config_record_h handle, unsigned short max_i)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       h->max_i = max_i;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_get_timeout(
-       zb_zcl_reporting_config_record_h handle, unsigned short *to)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == to, ZIGBEE_ERROR_INVALID_PARAMETER);
-       *to = h->to;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_set_timeout(
-       zb_zcl_reporting_config_record_h handle, unsigned short to)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       h->to = to;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_get_change(
-       zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e *type,
-       unsigned char **value, int *count)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       int len = -1;
-       unsigned char *temp = NULL;
-       int data_type = ZB_ZCL_DATA_TYPE_NONE;
-
-       struct reporting_configuration_record_s *h = handle;
-
-       NOT_USED(data_type);
-
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->change, ZIGBEE_ERROR_NO_DATA);
-
-       len = zb_zcl_get_data_size(h->type);
-       data_type = zb_zcl_get_analog_or_discret(h->type);
-       if (0 < len /* && ZB_ZCL_DATA_TYPE_ANALOG == data_type */) {
-
-               temp = calloc(len, sizeof(char));
-               RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(temp, h->change, len);
-               *type = h->type;
-               *count = len;
-               *value = temp;
-
-       } else {
-               return ZIGBEE_ERROR_NOT_SUPPORTED;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_record_set_change(
-       zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e type, unsigned char *value)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       int len = -1;
-       int data_type = ZB_ZCL_DATA_TYPE_NONE;
-
-       struct reporting_configuration_record_s *h = handle;
-
-       NOT_USED(data_type);
-
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       if (h->change)
-               free(h->change);
-
-       len = zb_zcl_get_data_size(type);
-       data_type = zb_zcl_get_analog_or_discret(type);
-
-       if (0 < len /* && ZB_ZCL_DATA_TYPE_ANALOG == data_type */) {
-               h->change = calloc(len + 1, sizeof(unsigned char));
-               RETV_IF(NULL == h->change, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(h->change, value, len);
-               h->type = type;
-       } else {
-               return ZIGBEE_ERROR_NOT_SUPPORTED;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_report_config_record_create(
-       zb_zcl_read_report_config_record_h *handle)
-{
-       zb_zcl_read_report_config_record_h t = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       t = calloc(1, sizeof(struct read_reporting_configuration_record_s));
-       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = t;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_report_config_record_clone(
-       zb_zcl_read_report_config_record_h src, zb_zcl_read_report_config_record_h *dst)
-{
-       struct read_reporting_configuration_record_s *srcs = src;
-       struct read_reporting_configuration_record_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct read_reporting_configuration_record_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, srcs, sizeof(struct read_reporting_configuration_record_s));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_report_config_record_destroy(
-       zb_zcl_read_report_config_record_h handle)
-{
-       struct read_reporting_configuration_record_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_report_config_record_set_dir(
-       zb_zcl_read_report_config_record_h handle, zb_zcl_fc_direction_e dir)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct read_reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       if (dir == ZB_ZCL_CLIENT_TO_SERVER)
-               h->dir = 0x00;
-       else
-               h->dir = 0x01;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_report_config_record_get_dir(
-       zb_zcl_read_report_config_record_h handle, zb_zcl_fc_direction_e *dir)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct read_reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *dir = h->dir;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_report_config_record_set_id(
-       zb_zcl_read_report_config_record_h handle, unsigned short id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct read_reporting_configuration_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->id = id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_read_report_config_record_get_id(
-       zb_zcl_read_report_config_record_h handle, unsigned short *id)
-{
-       struct read_reporting_configuration_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       *id = h->id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_create(
-       zb_zcl_report_config_response_record_h *handle)
-{
-       zb_zcl_report_config_response_record_h t = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       t = calloc(1, sizeof(struct reporting_configuration_response_record_s));
-       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = t;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_clone(
-       zb_zcl_report_config_response_record_h src,
-       zb_zcl_report_config_response_record_h *dst)
-{
-       struct reporting_configuration_response_record_s *srcs = src;
-       struct reporting_configuration_response_record_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct reporting_configuration_response_record_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, srcs, sizeof(struct reporting_configuration_response_record_s));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_destroy(
-       zb_zcl_report_config_response_record_h handle)
-{
-       struct reporting_configuration_response_record_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_get_status(
-       zb_zcl_report_config_response_record_h handle, zb_zcl_status_e *status)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_response_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *status = h->status;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_set_status(
-       zb_zcl_report_config_response_record_h handle, zb_zcl_status_e status)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_response_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->status = status;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_get_dir(
-       zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e *dir)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_response_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dir, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *dir = h->dir;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_set_dir(
-       zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e dir)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_response_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->dir = dir;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_get_id(
-       zb_zcl_report_config_response_record_h handle, unsigned short *id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_response_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *id = h->id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_report_config_response_record_set_id(
-       zb_zcl_report_config_response_record_h handle, unsigned short id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct reporting_configuration_response_record_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->id = id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_create(zb_zcl_attr_report_h *handle)
-{
-       zb_zcl_attr_report_h t = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       t = calloc(1, sizeof(struct attribute_report_s));
-       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = t;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_clone(zb_zcl_attr_report_h src, zb_zcl_attr_report_h *dst)
-{
-       struct attribute_report_s *srcs = src;
-       struct attribute_report_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct attribute_report_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, srcs, sizeof(struct attribute_report_s));
-
-       desc->value = calloc(1, zb_zcl_get_data_size(srcs->type));
-       RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_destroy(zb_zcl_attr_report_h handle)
-{
-       struct attribute_report_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       if (h->value)
-               free(h->value);
-       free(h);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_get_id(zb_zcl_attr_report_h handle, unsigned short *id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct attribute_report_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *id = h->id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_set_id(zb_zcl_attr_report_h handle, unsigned short id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct attribute_report_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->id = id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_get_type(zb_zcl_attr_report_h handle,
-       zb_zcl_data_type_e *type)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct attribute_report_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *type = h->type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_set_type(zb_zcl_attr_report_h handle,
-       zb_zcl_data_type_e type)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct attribute_report_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->type = type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_get_value(zb_zcl_attr_report_h handle,
-       zb_zcl_data_type_e* type, unsigned char** value, int* count)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       int len = -1;
-       unsigned char *temp = NULL;
-       struct attribute_report_s *h = handle;
-
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->value, ZIGBEE_ERROR_NO_DATA);
-
-       len = zb_zcl_get_data_size(h->type);
-       if (0 < len) {
-
-               temp = calloc(len, sizeof(unsigned char));
-               RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(temp, h->value, len);
-               *type = h->type;
-               *count = len;
-               *value = temp;
-
-       } else if (ZB_ZCL_OCTET_STRING == h->type || ZB_ZCL_CHARACTER_STRING == h->type) {
-
-               len = h->value[0];
-               temp = calloc(len + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY);
-
-               memcpy(temp, h->value + ZB_ZCL_OCTET_SIZE, len);
-               *type = h->type;
-               *count = len;
-               *value = temp;
-
-       } else if (ZB_ZCL_LONG_OCTET_STRING == h->type || ZB_ZCL_LONG_CHARACTER_STRING == h->type) {
-
-               len = h->value[0] & 0xff;
-               len |= (h->value[1] << 8) & 0xff00 ;
-
-               temp = calloc(len + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(*value, h->value + ZB_ZCL_LONG_OCTET_SIZE, len);
-
-               *type = h->type;
-               *count = len;
-               *value = temp;
-
-       } else {
-               return ZIGBEE_ERROR_NOT_SUPPORTED;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_attr_report_set_value(zb_zcl_attr_report_h handle,
-       zb_zcl_data_type_e type, unsigned char* value, int count)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       int len = -1;
-       struct attribute_report_s *h = handle;
-
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       if (h->value) {
-               free(h->value);
-               h->value = NULL;
-       }
-
-       len = zb_zcl_get_data_size(type);
-       if (0 < len) {
-
-               h->value = calloc(len + ZB_GUARD_CHAR , sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(h->value, value, count);
-               h->type = type;
-
-       } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) {
-
-               h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               /* The first 1 byte indicate invalid or length of string */
-               h->value[0] = value[0] & 0xff;
-               memcpy(h->value + ZB_ZCL_OCTET_SIZE, value, count);
-
-       } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) {
-
-               h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
-               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
-
-               /* The first 2 byte indicate invalid or length of string */
-               h->value[0] = count & 0xff;
-               h->value[1] = (count >> 8) & 0xff ;
-
-               memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, count);
-
-       } else {
-               return ZIGBEE_ERROR_NOT_SUPPORTED;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-
-/**
- * @brief Format of the Selector Field
- *
- * @since_tizen 4.0
- */
-struct selector_s {
-       unsigned char indicator; /**< number of index */
-       unsigned short *index; /**< index list */
-};
-
-/**
- * @brief Stcuture for reading attribute
- *
- * @since_tizen 4.0
- */
-struct read_structured_attribute_record_s {
-       unsigned short id; /**< attribute identifier */
-       struct selector_s *selector; /**< selector format */
-};
-
-/**
- * @brief Format of the Write Attribute Record Field
- *
- * @since_tizen 4.0
- */
-struct write_attribute_structured_status_record_s {
-       unsigned char status; /**< status */
-       unsigned short id; /**< identifier */
-       struct selector_s selector; /**< selector */
-};
-
-/**
- * @brief Format of the Write Attribute Record Field
- *
- * @since_tizen 4.0
- */
-struct write_attribute_structured_record_s {
-       unsigned short id; /**< attribute identifier */
-       struct selector_s selector;
-       unsigned char type; /**< attribute data type */
-       unsigned char *value; /**< data value */; /**< attribute value */
-};
-
-API int zb_extended_attr_info_create(zb_zcl_extended_attr_info_h *handle)
-{
-       zb_zcl_extended_attr_info_h t = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       t = calloc(1, sizeof(struct extended_attribute_infomation_s));
-       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = t;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_extended_attr_info_clone(zb_zcl_extended_attr_info_h src,
-       zb_zcl_extended_attr_info_h *dst)
-{
-       struct extended_attribute_infomation_s *srcs = src;
-       struct extended_attribute_infomation_s *desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct extended_attribute_infomation_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, srcs, sizeof(struct extended_attribute_infomation_s));
-
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_extended_attr_info_destroy(zb_zcl_extended_attr_info_h handle)
-{
-       struct extended_attribute_infomation_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_extended_attr_info_get_id(zb_zcl_extended_attr_info_h handle,
-       unsigned short *id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct extended_attribute_infomation_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *id = h->id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_extended_attr_info_set_id(zb_zcl_extended_attr_info_h handle,
-       unsigned short id)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct extended_attribute_infomation_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->id = id;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_extended_attr_info_get_type(zb_zcl_extended_attr_info_h handle,
-       zb_zcl_data_type_e *type)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct extended_attribute_infomation_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *type = h->type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_extended_attr_info_set_type(zb_zcl_extended_attr_info_h handle,
-       zb_zcl_data_type_e type)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct extended_attribute_infomation_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->type = type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_extended_attr_info_get_acl(zb_zcl_extended_attr_info_h handle,
-       zb_zcl_acl_type_e *acl)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct extended_attribute_infomation_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == acl, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *acl = h->acl;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_extended_attr_info_set_acl(zb_zcl_extended_attr_info_h handle,
-       zb_zcl_acl_type_e acl)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       struct extended_attribute_infomation_s *h = handle;
-       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->acl = acl;
-       return ZIGBEE_ERROR_NONE;
-}
-
diff --git a/lib/zbl-zdo-bind-mgr.c b/lib/zbl-zdo-bind-mgr.c
deleted file mode 100644 (file)
index 53f359d..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zdo_bind_req(zb_zigbee_h handle, zb_nwk_addr dst_addr16,
-       zb_ieee_addr src_addr64, unsigned char src_ep, zb_cluster_id clusterid,
-       zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr,
-       unsigned char dst_ep, zb_zdo_bind_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == src_addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst_addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_bind_req(dst_addr16, src_addr64, src_ep, clusterid, dst_addr64, type,
-               group_addr, dst_ep, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_unbind_req(zb_zigbee_h handle, zb_nwk_addr dst_addr16,
-       zb_ieee_addr src_addr64, unsigned char src_ep, zb_cluster_id clusterid,
-       zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr,
-       unsigned char dst_ep, zb_zdo_unbind_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == src_addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst_addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       ret = zbl_unbind_req(dst_addr16, src_addr64, src_ep, clusterid, dst_addr64, type,
-               group_addr, dst_ep, cb, user_data);
-       return ret;
-}
diff --git a/lib/zbl-zdo-dev-disc.c b/lib/zbl-zdo-dev-disc.c
deleted file mode 100644 (file)
index 4902c81..0000000
+++ /dev/null
@@ -1,874 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zdo_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64,
-       zb_zdp_req_type_e request_type, unsigned char start_idx, zb_zdo_addr_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 != request_type && 1 != request_type, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_nwk_addr_req(handle, addr64, request_type, start_idx, cb,
-               user_data);
-       return ret;
-}
-
-API int zb_zdo_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_ieee_addr_req(handle, addr16, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_active_ep(handle, addr16, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
-       zb_zdo_simple_desc_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_simple_desc_req(handle, addr16, ep, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_extended_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char start_idx, zb_zdo_extended_simple_desc_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned short profileid, unsigned char num_in_clusters,
-       unsigned short *in_clusters, unsigned char num_out_clusters,
-       unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == num_in_clusters && 0 == num_out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_match_desc_req(handle, addr16, profileid, num_in_clusters,
-               in_clusters, num_out_clusters, out_clusters, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_node_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_zdo_node_desc_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_node_desc_req(addr16, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_power_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_zdo_power_desc_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_power_desc_req(addr16, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_complex_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_zdo_complex_desc_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_complex_desc_req(addr16, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_user_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_zdo_user_desc_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_user_desc_req(addr16, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len,
-       unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == user_desc, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ret = zbl_user_desc_set(handle, addr16, len, user_desc, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64,
-       unsigned char capability)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-       ret = zbl_device_annce(handle, addr16, addr64, capability);
-       return ret;
-}
-
-API int zb_simple_desc_create(zb_zdo_simple_desc_h *handle)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       zb_zdo_simple_desc_h desc = NULL;
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       desc = calloc(1, sizeof(struct zb_zdo_simple_desc_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = desc;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_clone(zb_zdo_simple_desc_h src, zb_zdo_simple_desc_h *dst)
-{
-       zb_zdo_simple_desc_h desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct zb_zdo_simple_desc_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, src, sizeof(struct zb_zdo_simple_desc_s));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_destroy(zb_zdo_simple_desc_h handle)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_get_ep(zb_zdo_simple_desc_h handle, unsigned char *ep)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *ep = h->ep;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_set_ep(zb_zdo_simple_desc_h handle, unsigned char ep)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->ep = ep;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_get_profile_id(zb_zdo_simple_desc_h handle,
-       unsigned short *profileid)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == profileid, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *profileid = h->profileid;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_set_profile_id(zb_zdo_simple_desc_h handle,
-       unsigned short profileid)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->profileid = profileid;
-       return ZIGBEE_ERROR_NONE;
-}
-
-
-API int zb_simple_desc_get_device_id(zb_zdo_simple_desc_h handle,
-       unsigned short *deviceid)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == deviceid, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *deviceid = h->deviceid;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_set_device_id(zb_zdo_simple_desc_h handle,
-       unsigned short deviceid)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->deviceid = deviceid;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_get_device_ver(zb_zdo_simple_desc_h handle,
-       unsigned short *device_ver)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == device_ver, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *device_ver = h->device_ver;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_set_device_ver(zb_zdo_simple_desc_h handle,
-       unsigned short device_ver)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->device_ver = device_ver;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_get_num_of_in_clusters(zb_zdo_simple_desc_h handle,
-       unsigned char *num_of_in_clusters)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == num_of_in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *num_of_in_clusters = h->num_of_in_clusters;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_set_num_of_in_clusters(zb_zdo_simple_desc_h handle,
-       unsigned char num_of_in_clusters)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->num_of_in_clusters = num_of_in_clusters;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_get_num_of_out_clusters(zb_zdo_simple_desc_h handle,
-       unsigned char *num_of_out_clusters)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == num_of_out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *num_of_out_clusters = h->num_of_out_clusters;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_set_num_of_out_clusters(zb_zdo_simple_desc_h handle,
-       unsigned char num_of_out_clusters)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->num_of_out_clusters = num_of_out_clusters;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_get_in_clusters(zb_zdo_simple_desc_h handle,
-       unsigned short **in_clusters)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *in_clusters = h->in_clusters;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_set_in_clusters(zb_zdo_simple_desc_h handle,
-       unsigned short *in_clusters, int num)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(num < 1 || num > MAX_ENDPOINT_CLUSTERS, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(h->in_clusters, in_clusters, 2 * num);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_get_out_clusters(zb_zdo_simple_desc_h handle,
-       unsigned short **out_clusters)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *out_clusters = h->out_clusters;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_simple_desc_set_out_clusters(zb_zdo_simple_desc_h handle,
-       unsigned short *out_clusters, int num)
-{
-       struct zb_zdo_simple_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(num < 1 || num > MAX_ENDPOINT_CLUSTERS, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(h->out_clusters, out_clusters, 2 * num);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_create(zb_zdo_node_power_descriptor_h *handle)
-{
-       zb_zdo_node_power_descriptor_h desc = NULL;
-
-       CHECK_ZIGBEE_PRIVILEGE();
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_clone(zb_zdo_node_power_descriptor_h src,
-       zb_zdo_node_power_descriptor_h *dst)
-{
-       zb_zdo_node_power_descriptor_h desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, src, sizeof(struct zb_zdo_node_power_descriptor_s));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_destroy(zb_zdo_node_power_descriptor_h handle)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_get_current_power_mode(
-       zb_zdo_node_power_descriptor_h handle, zb_zdp_cur_pwr_mode_e* current_power_mode)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == current_power_mode, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *current_power_mode = h->current_power_mode;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_set_current_power_mode(
-       zb_zdo_node_power_descriptor_h handle, zb_zdp_cur_pwr_mode_e current_power_mode)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0b11 < current_power_mode, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->current_power_mode = current_power_mode;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_get_available_power_sources(
-       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e* available_power_sources)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == available_power_sources, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *available_power_sources = h->available_power_sources;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_set_available_power_sources(
-       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e available_power_sources)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0b111 < available_power_sources, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->available_power_sources = available_power_sources;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_get_current_power_source(
-       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e* current_power_source)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == current_power_source, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *current_power_source = h->current_power_source;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_set_current_power_source(
-       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e current_power_source)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0b111 < current_power_source, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->current_power_source = current_power_source;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_get_current_power_source_level(
-       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_level_e* current_power_source_level)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == current_power_source_level, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *current_power_source_level = h->current_power_source_level;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_power_desc_set_current_power_source_level(
-       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_level_e current_power_source_level)
-{
-       struct zb_zdo_node_power_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->current_power_source_level = current_power_source_level;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_create(zb_zdo_node_descriptor_h *handle)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       zb_zdo_node_descriptor_h desc = NULL;
-
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = desc;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_clone(zb_zdo_node_descriptor_h src,
-       zb_zdo_node_descriptor_h *dst)
-{
-       struct zb_zdo_node_descriptor_s* desc = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s));
-       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(desc, src, sizeof(struct zb_zdo_node_descriptor_s));
-       *dst = desc;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_destroy(zb_zdo_node_descriptor_h handle)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_logical_type(zb_zdo_node_descriptor_h handle,
-       unsigned char* logical_type)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == logical_type, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *logical_type = h->logical_type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_logical_type(zb_zdo_node_descriptor_h handle,
-       unsigned char logical_type)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0b11 < logical_type, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->logical_type = logical_type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_complex_desciptor_available(
-       zb_zdo_node_descriptor_h handle, unsigned char* complex_desciptor_available)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == complex_desciptor_available, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *complex_desciptor_available = h->complex_desciptor_available;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_complex_descriptor_available(
-       zb_zdo_node_descriptor_h handle, unsigned char complex_desciptor_available)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0x01 < complex_desciptor_available, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->complex_desciptor_available = complex_desciptor_available;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_user_descriptor_available(
-       zb_zdo_node_descriptor_h handle, unsigned char* user_descriptor_available)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == user_descriptor_available, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *user_descriptor_available = h->user_descriptor_available;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_user_descriptor_available(
-       zb_zdo_node_descriptor_h handle, unsigned char user_descriptor_available)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0x01 < user_descriptor_available, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->user_descriptor_available = user_descriptor_available;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_aps_flags(zb_zdo_node_descriptor_h handle,
-       unsigned char* aps_flags)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == aps_flags, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *aps_flags = h->aps_flags;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_aps_flags(zb_zdo_node_descriptor_h handle,
-       unsigned char aps_flags)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0b111 < aps_flags, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->aps_flags = aps_flags;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_frequency_band(zb_zdo_node_descriptor_h handle,
-       unsigned char* frequency_band)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == frequency_band, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *frequency_band = h->frequency_band;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_frequency_band(zb_zdo_node_descriptor_h handle,
-       unsigned char frequency_band)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0b1111 < frequency_band, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->frequency_band = frequency_band;
-       return ZIGBEE_ERROR_NONE;
-}
-
-
-API int zb_node_desc_get_mac_capability_flags(zb_zdo_node_descriptor_h handle,
-       unsigned char* mac_capability_flags)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == mac_capability_flags, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *mac_capability_flags = h->mac_capability_flags;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_mac_capability_flags(zb_zdo_node_descriptor_h handle,
-       unsigned char mac_capability_flags)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->mac_capability_flags = mac_capability_flags;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_manufacturer_code(zb_zdo_node_descriptor_h handle,
-       unsigned short* manufacturer_code)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == manufacturer_code, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *manufacturer_code = h->manufacturer_code;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_manufacturer_code(zb_zdo_node_descriptor_h handle,
-       unsigned short manufacturer_code)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h->manufacturer_code = manufacturer_code;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_maximum_buffer_size(zb_zdo_node_descriptor_h handle,
-       unsigned char* maximum_buffer_size)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == maximum_buffer_size, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *maximum_buffer_size = h->maximum_buffer_size;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_maximum_buffer_size(zb_zdo_node_descriptor_h handle,
-       unsigned char maximum_buffer_size)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0x7f < maximum_buffer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->maximum_buffer_size = maximum_buffer_size;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_maximum_incoming_transfer_size(
-       zb_zdo_node_descriptor_h handle, unsigned short* maximum_incoming_transfer_size)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == maximum_incoming_transfer_size, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *maximum_incoming_transfer_size = h->maximum_incoming_transfer_size;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_maximum_incoming_transfer_size(
-       zb_zdo_node_descriptor_h handle, unsigned short maximum_incoming_transfer_size)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0x7fff < maximum_incoming_transfer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->maximum_incoming_transfer_size = maximum_incoming_transfer_size;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_server_mask(zb_zdo_node_descriptor_h handle,
-       unsigned short* server_mask)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == server_mask, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *server_mask = h->server_mask;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_server_mask(zb_zdo_node_descriptor_h handle,
-       unsigned short server_mask)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0x7f < server_mask, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->server_mask = server_mask;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_maximum_outgoing_transfer_size(
-       zb_zdo_node_descriptor_h handle, unsigned short* maximum_outgoing_transfer_size)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == maximum_outgoing_transfer_size, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *maximum_outgoing_transfer_size = h->maximum_outgoing_transfer_size;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_maximum_outgoing_transfer_size(
-       zb_zdo_node_descriptor_h handle, unsigned short maximum_outgoing_transfer_size)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0x7fff < maximum_outgoing_transfer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->maximum_outgoing_transfer_size = maximum_outgoing_transfer_size;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_get_descriptor_capability_field(
-       zb_zdo_node_descriptor_h handle, unsigned short* descriptor_capability_field)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == descriptor_capability_field, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *descriptor_capability_field = h->descriptor_capability_field;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_node_desc_set_descriptor_capability_field(
-       zb_zdo_node_descriptor_h handle, unsigned short descriptor_capability_field)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0x11 < descriptor_capability_field, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
-
-       h->descriptor_capability_field = descriptor_capability_field;
-       return ZIGBEE_ERROR_NONE;
-}
-
diff --git a/lib/zbl-zdo-nwk-mgr.c b/lib/zbl-zdo-nwk-mgr.c
deleted file mode 100644 (file)
index 97e323f..0000000
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zdo_mgmt_nwk_disc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned int scan_channels, unsigned char scan_duration, unsigned char scan_count,
-       unsigned char start_idx, zb_zdo_mgmt_nwk_disc_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       ret = zbl_mgmt_nwk_disc_req(addr16, scan_channels, scan_duration, scan_count,
-               start_idx, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_mgmt_lqi_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char start_idx, zb_zdo_mgmt_lqi_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       ret = zbl_mgmt_lqi_req(addr16, start_idx, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_mgmt_rtg_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char start_idx, zb_zdo_mgmt_rtg_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       ret = zbl_mgmt_rtg_req(addr16, start_idx, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_mgmt_bind_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char start_idx, zb_zdo_mgmt_bind_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       ret = zbl_mgmt_bind_req(addr16, start_idx, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_mgmt_leave_req(zb_zigbee_h handle, zb_ieee_addr addr64,
-       bool remove_children, bool rejoin, zb_zdo_mgmt_leave_cb cb,
-       void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-       ret = zbl_mgmt_leave_device(addr64, remove_children, rejoin, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_mgmt_direct_join_req(zb_zigbee_h handle, zb_ieee_addr addr64,
-       unsigned char capability, zb_zdo_mgmt_direct_join_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_mgmt_permit_joining_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char duration, unsigned char tc_significance,
-       zb_zdo_mgmt_permit_joining_cb cb, void *user_data)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       ret = zbl_mgmt_permit_joining_req(addr16, duration, tc_significance, cb, user_data);
-       return ret;
-}
-
-API int zb_zdo_mgmt_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       unsigned char start_idx, zb_zdo_mgmt_cache_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_mgmt_nwk_update_req(zb_zigbee_h handle, unsigned int scan_channels,
-       unsigned char scan_duration, unsigned char scan_count, unsigned char nwk_update_id,
-       zb_nwk_addr nwk_manager_addr)
-{
-       int ret;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == nwk_manager_addr, ZIGBEE_ERROR_INVALID_ADDRESS);
-       ret = zbl_mgmt_nwk_update_req(scan_channels, scan_duration, scan_count, nwk_update_id,
-               nwk_manager_addr);
-       return ret;
-}
-
-API int zb_network_list_record_get_extended_pan_id(
-       zb_zdo_network_list_record_h handle, zb_ieee_addr extended_pan_id)
-{
-       struct zb_zdo_network_list_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(extended_pan_id, h->extended_pan_id, sizeof(zb_ieee_addr));
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_network_list_record_get_logical_channel(
-       zb_zdo_network_list_record_h handle, unsigned char* logical_channel)
-{
-       struct zb_zdo_network_list_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == logical_channel, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *logical_channel = h->logical_channel;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_network_list_record_get_zigbee_version(
-       zb_zdo_network_list_record_h handle, unsigned char* zigbee_version)
-{
-       struct zb_zdo_network_list_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zigbee_version, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *zigbee_version = h->zigbee_version;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_network_list_record_get_stack_profile(
-       zb_zdo_network_list_record_h handle, unsigned char* stack_profile)
-{
-       struct zb_zdo_network_list_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == stack_profile, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *stack_profile = h->stack_profile;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_network_list_record_get_beacon_order(
-       zb_zdo_network_list_record_h handle, unsigned char* beacon_order)
-{
-       struct zb_zdo_network_list_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == beacon_order, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *beacon_order = h->beacon_order;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_network_list_record_get_superframe_order(
-       zb_zdo_network_list_record_h handle, unsigned char* superframe_order)
-{
-       struct zb_zdo_network_list_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == superframe_order, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *superframe_order = h->superframe_order;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_network_list_record_get_permit_joining(
-       zb_zdo_network_list_record_h handle, unsigned char* permit_joining)
-{
-       struct zb_zdo_network_list_record_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == permit_joining, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *permit_joining = h->permit_joining;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_extended_pan_id(
-       zb_zdo_neighbor_table_desc_h handle, zb_ieee_addr extended_pan_id)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(extended_pan_id, h->extended_pan_id, sizeof(zb_ieee_addr));
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_ieee_addr(
-       zb_zdo_neighbor_table_desc_h handle, zb_ieee_addr addr64)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(addr64, h->addr64, sizeof(zb_ieee_addr));
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_nwk_addr(
-       zb_zdo_neighbor_table_desc_h handle, zb_nwk_addr* addr16)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *addr16 = h->addr16;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_device_type(
-       zb_zdo_neighbor_table_desc_h handle, unsigned char* device_type)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == device_type, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *device_type = h->device_type;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_rx_on_when_idle(
-       zb_zdo_neighbor_table_desc_h handle, unsigned char* rx_on_when_idle)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == rx_on_when_idle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *rx_on_when_idle = h->rx_on_when_idle;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_relationship(
-       zb_zdo_neighbor_table_desc_h handle, unsigned char* releationship)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == releationship, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *releationship = h->relationship;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_permit_joining(
-       zb_zdo_neighbor_table_desc_h handle, unsigned char* permit_joining)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == permit_joining, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *permit_joining = h->permit_joining;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_depth(
-       zb_zdo_neighbor_table_desc_h handle, unsigned char* depth)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == depth, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *depth = h->depth;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_neighbor_table_desc_get_lqi(zb_zdo_neighbor_table_desc_h handle,
-       unsigned char* lqi)
-{
-       struct zb_zdo_neighbor_table_desc_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == lqi, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *lqi = h->lqi;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_routing_table_get_dst_addr(zb_zdo_routing_table_h handle,
-       zb_nwk_addr* dst_addr)
-{
-       struct zb_zdo_routing_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst_addr, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *dst_addr = h->dst_addr;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_routing_table_get_dst_status(zb_zdo_routing_table_h handle,
-       zb_zdp_status_e *status)
-{
-       struct zb_zdo_routing_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *status = h->status;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_routing_table_get_memory_constrained(
-       zb_zdo_routing_table_h handle, unsigned char *memory_constrained)
-{
-       struct zb_zdo_routing_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == memory_constrained, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *memory_constrained = h->memory_constrained;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_routing_table_get_many_to_one(zb_zdo_routing_table_h handle,
-       unsigned char *many_to_one)
-{
-       struct zb_zdo_routing_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == many_to_one, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *many_to_one = h->many_to_one;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_routing_table_get_route_record_required(
-       zb_zdo_routing_table_h handle, unsigned char *route_record_required)
-{
-       struct zb_zdo_routing_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == route_record_required, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *route_record_required = h->route_record_required;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_routing_table_get_next_hop_addr(
-       zb_zdo_routing_table_h handle, zb_nwk_addr *next_hop_addr)
-{
-       struct zb_zdo_routing_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == next_hop_addr, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *next_hop_addr = h->next_hop_addr;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_binding_table_get_src_addr(zb_zdo_binding_table_h handle,
-       zb_ieee_addr src_addr)
-{
-       struct zb_zdo_binding_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == src_addr, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(src_addr, h->src_addr64, sizeof(zb_ieee_addr));
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_binding_table_get_src_ep(zb_zdo_binding_table_h handle,
-       unsigned char* src_ep)
-{
-       struct zb_zdo_binding_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *src_ep = h->src_ep;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_binding_table_get_cluster_id(zb_zdo_binding_table_h handle,
-       unsigned short *clusterid)
-{
-       struct zb_zdo_binding_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == clusterid, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *clusterid = h->clusterid;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_binding_table_get_dst_addr_mode(zb_zdo_binding_table_h handle,
-       unsigned char* dst_addr_mode)
-{
-       struct zb_zdo_binding_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst_addr_mode, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *dst_addr_mode = h->dst_addr_mode;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_binding_table_get_dst_addr16(zb_zdo_binding_table_h handle,
-       zb_nwk_addr* addr16)
-{
-       struct zb_zdo_binding_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *addr16 = h->dst_addr16;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_binding_table_get_dst_addr64(zb_zdo_binding_table_h handle,
-       zb_ieee_addr addr64)
-{
-       struct zb_zdo_binding_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(addr64, h->dst_addr64, sizeof(zb_ieee_addr));
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_binding_table_get_dst_ep(zb_zdo_binding_table_h handle,
-       unsigned char* dst_ep)
-{
-       struct zb_zdo_binding_table_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *dst_ep = h->dst_ep;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discovery_cache_get_ieee_addr(zb_zdo_discovery_cache_h handle,
-       zb_ieee_addr addr64)
-{
-       struct zb_zdo_discovery_cache_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(addr64, h->addr64, sizeof(zb_ieee_addr));
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_discovery_cache_get_nwk_addr(zb_zdo_discovery_cache_h handle,
-       zb_nwk_addr* addr16)
-{
-       struct zb_zdo_discovery_cache_s *h = handle;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *addr16 = h->addr16;
-       return ZIGBEE_ERROR_NONE;
-}
-
-
diff --git a/lib/zbl-zdo-svc-disc.c b/lib/zbl-zdo-svc-disc.c
deleted file mode 100644 (file)
index 65cd5f7..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2016 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 "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_zdo_system_server_discover_req(zb_zigbee_h handle,
-       unsigned short server_mask, zb_zdo_system_server_discover_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_find_node_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_ieee_addr addr64, zb_zdo_find_node_cache_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_discovery_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_ieee_addr addr64, zb_zdo_discovery_cache_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_discovery_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_ieee_addr addr64, unsigned char node_desc_size, unsigned char power_desc_size,
-       unsigned char active_ep_size, unsigned char simple_desc_count,
-       unsigned char *simple_desc_list, zb_zdo_discovery_store_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == simple_desc_list, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_node_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_ieee_addr addr64, zb_zdo_node_descriptor_h nodedsc, zb_zdo_node_desc_store_cb cb,
-       void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_power_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_ieee_addr addr64, zb_zdo_node_power_descriptor_h powerdsc,
-       zb_zdo_power_desc_store_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_active_ep_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_ieee_addr addr64, unsigned char active_ep_count, unsigned char *ep_list,
-       zb_zdo_active_ep_store_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_simple_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_ieee_addr addr64, zb_zdo_simple_desc_h simpledsc, zb_zdo_simple_desc_store_cb cb,
-       void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_zdo_remove_node_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16,
-       zb_ieee_addr addr64, zb_zdo_remove_node_cache_cb cb, void *user_data)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
-       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
diff --git a/lib/zbl-zdo.c b/lib/zbl-zdo.c
deleted file mode 100644 (file)
index e66e8a6..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (c) 2015 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 "zbl.h"
-#include "zb-log.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_end_dev_info_get_list(zb_zigbee_h handle, int *count,
-       zb_end_dev_info_h **list)
-{
-       int ret;
-       unsigned char cnt;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_get_all_device_info(list, &cnt);
-       *count = cnt;
-       return ret;
-}
-
-API int zb_end_dev_get_endpoint_list(zb_zigbee_h handle, zb_ieee_addr addr64,
-       unsigned char *count, unsigned char **ep_list)
-{
-       int ret;
-       unsigned char cnt = 0;
-       unsigned char eplist[MAX_ENDPOINT_CLUSTERS] = {0, };
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_get_endpoint_list(addr64, &cnt, eplist);
-       *count = cnt;
-       if (cnt > 0) {
-               *ep_list = calloc(cnt + 1, sizeof(unsigned char));
-               RETV_IF(NULL == *ep_list, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(*ep_list, eplist, cnt);
-       }
-       return ret;
-}
-
-API int zb_end_dev_info_get_cluster_list(zb_zigbee_h handle, zb_ieee_addr addr64,
-       unsigned char ep, unsigned char *in_cluster_count, unsigned short **in_cluster_list,
-       unsigned char *out_cluster_count, unsigned short **out_cluster_list)
-{
-       int ret;
-       unsigned char in_cnt = 0;
-       unsigned char out_cnt = 0;
-       unsigned short in_clusters[MAX_ENDPOINT_CLUSTERS] = {0, };
-       unsigned short out_clusters[MAX_ENDPOINT_CLUSTERS] = {0, };
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == in_cluster_count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == in_cluster_list, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == out_cluster_count, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == out_cluster_list, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_get_cluster_list(addr64, ep, &in_cnt, in_clusters,
-                       &out_cnt, out_clusters);
-       *in_cluster_count = in_cnt;
-       if (in_cnt > 0) {
-               *in_cluster_list = calloc(in_cnt + 1, sizeof(unsigned short));
-               RETV_IF(NULL == *in_cluster_list, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(*in_cluster_list, in_clusters, in_cnt * sizeof(unsigned short));
-       }
-       *out_cluster_count = out_cnt;
-       if (out_cnt > 0) {
-               *out_cluster_list = calloc(out_cnt + 1, sizeof(unsigned short));
-               RETV_IF(NULL == *out_cluster_list, ZIGBEE_ERROR_OUT_OF_MEMORY);
-               memcpy(*out_cluster_list, out_clusters, out_cnt * sizeof(unsigned short));
-       }
-
-       return ret;
-}
-
-API int zb_foreach_end_dev_info(zb_end_dev_info_h *list,
-       zb_end_dev_info_cb cb, void *user_data)
-{
-       int index = 0;
-       GList *cur = NULL;
-       struct zb_end_device_info_s *real = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
-       CHECK_ZIGBEE_PRIVILEGE();
-
-       cur = (GList *)list;
-       while (cur) {
-               GList *next = cur->next;
-               real = cur->data;
-               if (ZIGBEE_FUNC_STOP == cb(index, (zb_end_dev_info_h)real->list, user_data))
-                       break;
-               index++;
-               cur = next;
-       }
-
-       return ZIGBEE_ERROR_NONE;
-
-}
-
-API int zb_end_dev_info_create(zb_end_dev_info_h *handle)
-{
-       struct zb_zdo_node_descriptor_s* h = NULL;
-
-       CHECK_ZIGBEE_PRIVILEGE();
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       h = calloc(1, sizeof(struct zb_end_device_info_s));
-       RETVM_IF(NULL == handle, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = h;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_clone(zb_end_dev_info_h src, zb_end_dev_info_h *dst)
-{
-       struct zb_end_device_info_s *dev = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       dev = calloc(1, sizeof(struct zb_end_device_info_s));
-       RETVM_IF(NULL == dev, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(dev, src, sizeof(struct zb_zdo_node_descriptor_s));
-       *dst = dev;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_destroy(zb_end_dev_info_h handle)
-{
-       struct zb_zdo_node_descriptor_s* h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       free(h);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_get_network_address(zb_end_dev_info_h handle,
-       zb_nwk_addr *addr16)
-{
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *addr16 = h->addr16;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_get_ieee_address(zb_end_dev_info_h handle,
-       zb_ieee_addr addr64)
-{
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       memcpy(addr64, h->addr64, sizeof(zb_ieee_addr));
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_get_num_of_ep(zb_end_dev_info_h handle,
-       unsigned char *count)
-{
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *count = h->num_of_ep;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_get_ep_list(zb_end_dev_info_h handle, unsigned char **ep_list)
-{
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *ep_list = calloc(h->num_of_ep, sizeof(unsigned char));
-       RETVM_IF(NULL == *ep_list, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-
-       memcpy(*ep_list, h->ep, h->num_of_ep);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_get_mac_capability(zb_end_dev_info_h handle,
-       zb_zdp_mac_capability_field_e *capability)
-{
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == capability, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA);
-
-       *capability = h->capability;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_get_alternative_pan_coordinator(zb_end_dev_info_h handle,
-       zb_zdp_do_pan_coordinator_e *can_do_it)
-{
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == can_do_it, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA);
-
-       *can_do_it = h->capability & ZB_ZDP_ALTERNATIVE_PAN_COORDINATOR ? 1 : 0;
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_get_device_id(zb_end_dev_info_h handle, unsigned char ep,
-       unsigned short *deviceid)
-{
-       int i;
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == deviceid, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->desc, ZIGBEE_ERROR_NO_DATA);
-
-       for (i = 0; i < h->num_of_ep; i++) {
-               RETV_IF(NULL == h->desc[i], ZIGBEE_ERROR_NO_DATA);
-               if (h->desc[i]->ep == ep) {
-                       *deviceid = h->desc[i]->deviceid;
-                       return ZIGBEE_ERROR_NONE;
-               }
-       }
-       return ZIGBEE_ERROR_NO_DATA;
-}
-
-API int zb_end_dev_info_get_profile_id(zb_end_dev_info_h handle, unsigned char ep,
-       unsigned short *profileid)
-{
-       int i;
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == profileid, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == h->desc, ZIGBEE_ERROR_NO_DATA);
-
-       for (i = 0; i < h->num_of_ep; i++) {
-               RETV_IF(NULL == h->desc[i], ZIGBEE_ERROR_NO_DATA);
-               if (h->desc[i]->ep == ep) {
-                       *profileid = h->desc[i]->profileid;
-                       return ZIGBEE_ERROR_NONE;
-               }
-       }
-       return ZIGBEE_ERROR_NO_DATA;
-}
-
-API int zb_end_dev_info_get_power_source(zb_end_dev_info_h handle,
-       zb_zdp_power_e *power_src)
-{
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == power_src, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA);
-
-       *power_src = h->capability & ZB_ZDP_POWER_SOURCE ? 1 : 0;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_end_dev_info_get_security_capabilty(zb_end_dev_info_h handle,
-       zb_zdp_security_cap_e*sec_capability)
-{
-       struct zb_end_device_info_s *h = handle;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == sec_capability, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA);
-
-       *sec_capability = h->capability & ZB_ZDP_SECURITY_CAPABILITY ? 1 : 0;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
diff --git a/lib/zbl.c b/lib/zbl.c
deleted file mode 100644 (file)
index 099a840..0000000
--- a/lib/zbl.c
+++ /dev/null
@@ -1,588 +0,0 @@
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <glib.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zbl.h"
-#include "zbl-dbus.h"
-#include "zb-common.h"
-
-API int zb_ev_get_enable_status(zb_event_data_h ev, zb_error_e* status)
-{
-       zb_event_data_s *event = ev;
-       zb_event_enable_s *enable = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       enable = event->data.enable;
-       RETV_IF(NULL == enable, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *status = enable->status;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-
-API int zb_ev_get_form_network_panid(zb_event_data_h ev, zb_nwk_addr* pan_id)
-{
-       zb_event_data_s *event = ev;
-       zb_event_form_network_s *form_network = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       form_network = event->data.form_network;
-       RETV_IF(NULL == form_network, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == pan_id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *pan_id = form_network->pan_id;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-
-API int zb_ev_get_join_count(zb_event_data_h ev, unsigned char* count)
-{
-       zb_event_data_s *event = ev;
-       zb_event_join_s *join = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       join = event->data.join;
-       RETV_IF(NULL == join, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *count = join->count;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_join_ep(zb_event_data_h ev, unsigned char** ep)
-{
-       zb_event_data_s *event = ev;
-       zb_event_join_s *join = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       join = event->data.join;
-       RETV_IF(NULL == join, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *ep = calloc(join->count, sizeof(unsigned char));
-       if (NULL == *ep) {
-               ERR("Couldn't Allocate Memory");
-               return ZIGBEE_ERROR_OUT_OF_MEMORY;
-       }
-       memcpy(*ep, join->ep, join->count);
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_child_left_status(zb_event_data_h ev, zb_error_e* status)
-{
-       zb_event_data_s *event = ev;
-       zb_event_child_left_s *child_left = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       child_left = event->data.child_left;
-       RETV_IF(NULL == child_left, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *status = child_left->status;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_global_default_rsp_ep(zb_event_data_h ev, unsigned char* ep)
-{
-       zb_event_data_s *event = ev;
-       zb_event_global_default_rsp_s *global_default_rsp = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       global_default_rsp = event->data.global_default_rsp;
-       RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *ep = global_default_rsp->ep;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_global_default_rsp_cluster_id(zb_event_data_h ev,
-       unsigned short* clusterid)
-{
-       zb_event_data_s *event = ev;
-       zb_event_global_default_rsp_s *global_default_rsp = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       global_default_rsp = event->data.global_default_rsp;
-       RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == clusterid, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *clusterid = global_default_rsp->clusterid;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_global_default_rsp_command_id(zb_event_data_h ev,
-       unsigned char* commandid)
-{
-       zb_event_data_s *event = ev;
-       zb_event_global_default_rsp_s *global_default_rsp = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       global_default_rsp = event->data.global_default_rsp;
-       RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == commandid, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *commandid = global_default_rsp->commandid;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_global_default_rsp_status(zb_event_data_h ev,
-       zb_zcl_status_e* status)
-{
-       zb_event_data_s *event = ev;
-       zb_event_global_default_rsp_s *global_default_rsp = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       global_default_rsp = event->data.global_default_rsp;
-       RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *status = global_default_rsp->status;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-/* Need to be test, because we don't know things send this reports to coordinator */
-API int zb_ev_get_global_attr_report_records(zb_event_data_h ev,
-       zb_zcl_attr_report_h* records, unsigned char *count)
-{
-       zb_event_data_s *event = ev;
-       zb_event_global_attr_report_s *global_attr_repor = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       global_attr_repor = event->data.global_attr_report;
-       RETV_IF(NULL == global_attr_repor, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *records = global_attr_repor->records;
-       *count = global_attr_repor->count;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_alarm_count(zb_event_data_h ev, unsigned short* count)
-{
-       zb_event_data_s *event = ev;
-       zb_event_alarm_s *alarm = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       alarm = event->data.alarm;
-       RETV_IF(NULL == alarm, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *count = alarm->count;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_enroll_request_src_ep(zb_event_data_h ev, unsigned char* src_ep)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_enroll_request_s* ias_enroll_request = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_enroll_request = event->data.ias_enroll_request;
-       RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *src_ep = ias_enroll_request->src_ep;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_enroll_request_zone_type(zb_event_data_h ev,
-       zb_zcl_ias_zone_type_e * zone_type)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_enroll_request_s* ias_enroll_request = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_enroll_request = event->data.ias_enroll_request;
-       RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zone_type, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *zone_type = ias_enroll_request->zone_type;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_enroll_request_mfg_code(zb_event_data_h ev,
-       unsigned char* mfg_code)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_enroll_request_s* ias_enroll_request = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_enroll_request = event->data.ias_enroll_request;
-       RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == mfg_code, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *mfg_code = ias_enroll_request->mfg_code;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-
-API int zb_ev_get_ias_noti_src_ep(zb_event_data_h ev, unsigned char* src_ep)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_noti_s* ias_noti = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_noti = event->data.ias_noti;
-       RETV_IF(NULL == ias_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *src_ep = ias_noti->src_ep;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_ias_noti_zone_status(zb_event_data_h ev,
-       unsigned short* zone_status)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_noti_s* ias_noti = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_noti = event->data.ias_noti;
-       RETV_IF(NULL == ias_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zone_status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *zone_status = ias_noti->zone_status;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_ias_ext_noti_src_ep(zb_event_data_h ev, unsigned char* src_ep)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_extended_noti = event->data.ias_extended_noti;
-       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *src_ep = ias_extended_noti->src_ep;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_ias_ext_noti_status(zb_event_data_h ev, unsigned char* status)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_extended_noti = event->data.ias_extended_noti;
-       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *status = ias_extended_noti->status;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_ias_ext_noti_zone_status(zb_event_data_h ev,
-       unsigned short* zone_status)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_extended_noti = event->data.ias_extended_noti;
-       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zone_status, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *zone_status = ias_extended_noti->zone_status;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_ias_ext_noti_delay(zb_event_data_h ev, unsigned short* delay)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_extended_noti = event->data.ias_extended_noti;
-       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == delay, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *delay = ias_extended_noti->delay;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_ev_get_ias_ext_noti_zone_id(zb_event_data_h ev, unsigned char* zone_id)
-{
-       zb_event_data_s *event = ev;
-       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
-
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-
-       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
-       ias_extended_noti = event->data.ias_extended_noti;
-       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == zone_id, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       *zone_id = ias_extended_noti->zone_id;
-
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_create(zb_zigbee_h *handle)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       zb_zigbee_h h = calloc(1, sizeof(struct zbl_zigbee_s));
-       RETVM_IF(NULL == h, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
-       *handle = h;
-
-#if !GLIB_CHECK_VERSION(2, 35, 0)
-       g_type_init();
-#endif
-#if !GLIB_CHECK_VERSION(2, 31, 0)
-       g_thread_init(NULL);
-#endif
-       ret = zbl_dbus_start(*handle);
-       DBG("zbl_dbus_start()=0x%X", ret);
-
-       return ret;
-}
-
-API int zb_destroy(zb_zigbee_h handle)
-{
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       zbl_dbus_stop(handle);
-       return ZIGBEE_ERROR_NONE;
-}
-
-API int zb_enable(zb_zigbee_h handle)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_enable(handle);
-       DBG("zbl_enable()=0x%X", ret);
-       return ret;
-}
-
-API int zb_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_set_event_cb(handle, event_handler);
-       DBG("zb_set_event_cb()=0x%X", ret);
-       return ret;
-}
-
-API int zb_disable(zb_zigbee_h handle)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_disable();
-       DBG("zbl_disable()=0x%X", ret);
-       return ret;
-}
-
-API int zb_hw_reset(zb_zigbee_h handle)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_hw_reset();
-       DBG("zbl_hw_reset()=0x%X", ret);
-       return ret;
-}
-
-API int zb_coex_start(zb_zigbee_h handle, unsigned char channel)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_coex_start(channel);
-       DBG("zbl_coex_start()=0x%X", ret);
-       return ret;
-}
-
-API int zb_coex_stop(zb_zigbee_h handle)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_coex_stop();
-       DBG("zbl_coex_stop()=0x%X", ret);
-       return ret;
-}
-
-API int zb_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_form_network(handle, cb, user_data);
-       DBG("zbl_form_network()=0x%X", ret);
-       return ret;
-}
-
-API int zb_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, void *user_data)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_disable_network(handle, cb, user_data);
-       DBG("zb_disable_network()=0x%X", ret);
-       return ret;
-}
-
-API int zb_leave_device(zb_zigbee_h handle, zb_ieee_addr addr, bool remove_children, bool rejoin)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_leave_device(addr, remove_children, rejoin);
-       DBG("zbl_leave_device()=0x%X", ret);
-       return ret;
-}
-
-API int zb_permit_join(zb_zigbee_h handle, unsigned char timeout)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_permit_join(timeout, TRUE);
-       DBG("zb_permit_join()=0x%X", ret);
-       return ret;
-}
-
-API int zb_get_controller_mac_address(zb_zigbee_h handle, zb_ieee_addr addr64)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_get_controller_mac_address(addr64);
-       DBG("zbl_get_controller_mac_address()=0x%X", ret);
-       return ret;
-}
-
-API int zb_get_network_info(zb_zigbee_h handle, zb_ieee_addr addr64, zb_nwk_addr *nodeid,
-               zb_nwk_addr *panid, unsigned char *channel, unsigned char *tx_power)
-{
-       int ret = ZIGBEE_ERROR_NONE;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       ret = zbl_get_network_info(addr64, nodeid, panid, channel, tx_power);
-       DBG("zbl_get_network_info()=0x%X", ret);
-       return ret;
-}
-
-API int zb_end_dev_info_list_free(zb_end_dev_info_h *list)
-{
-       int i = 0, j = 0;
-       struct zb_end_device_info_s **plist = (struct zb_end_device_info_s **)list;
-       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
-       RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER);
-
-       while (plist[i]) {
-               j = 0;
-               while (plist[i]->desc && plist[i]->desc[j]) {
-                       free(plist[i]->desc[j]);
-                       j++;
-               }
-               if (plist[i]->desc)
-                       free(plist[i]->desc);
-               free(plist[i]);
-               i++;
-       }
-       free(plist);
-       plist = NULL;
-       return ZIGBEE_ERROR_NONE;
-}
diff --git a/lib/zbl.h b/lib/zbl.h
deleted file mode 100644 (file)
index a404dff..0000000
--- a/lib/zbl.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2015 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_ZIGBEE_LIBRARY_H__
-#define __TIZEN_NETWORK_ZIGBEE_LIBRARY_H__
-
-#include <glib.h>
-#include <zigbee.h>
-
-#ifdef API
-#undef API
-#endif /* API */
-
-#define API __attribute__((visibility("default")))
-
-struct zbl_zigbee_s {
-       GList *dbus_sub_ids; /**< subsrcibed dbus signal id */
-       zb_event_cb event_handler; /**< event handler */
-#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
-       GList *global_cmd_req; /**< list of global command requests */
-#endif
-       void *user_data; /**< use data */
-};
-
-#endif /* TIZEN_NETWORK_ZIGBEE_LIBRARY_H__ */
index 542b38f7b5a52a3f7c504d494b695882b61e9d55..d7858dc0a8619dc18c40815f36bbac5420a829f5 100644 (file)
@@ -1,6 +1,10 @@
+%define major 0
+%define minor 1
+%define patchlevel 1
+
 Name:          capi-network-zigbee
 Summary:       Network Zigbee Service in Tizen CAPI
-Version:       0.0.1
+Version:       %{major}.%{minor}.%{patchlevel}
 Release:       0
 Group:         Network & Connectivity/Other
 License:       Apache-2.0
@@ -34,11 +38,20 @@ chmod g-w %_sourcedir/*
 cp %{SOURCE1001} ./%{name}.manifest
 
 %build
-MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
+%if 0%{?gcov:1}
+export LDFLAGS+=" -lgcov"
+%endif
 
-%cmake . -DMAJORVER=%{MAJORVER} -DFULLVER=%{version} \
-       -DBIN_INSTALL_DIR:PATH=%{_bindir} \
-       -DZB_FEATURE_GLOBAL_RSP_SYNC=1
+MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
+cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \
+       -DLIB_INSTALL_DIR=%{_libdir} \
+       -DBIN_INSTALL_DIR=%{_bindir} \
+       -DINCLUDE_INSTALL_DIR=%{_includedir} \
+       -DLIB_PATH=%{_lib} \
+       -DFULLVER=%{version} \
+       -DMAJORVER=${MAJORVER} \
+       -DZB_FEATURE_GLOBAL_RSP_SYNC=1 \
+       -DBUILD_GCOV=%{?gcov:1}%{!?gcov:0}
 
 %install
 rm -rf %{buildroot}/BUILD/%{name}
diff --git a/src/zbl-custom.c b/src/zbl-custom.c
new file mode 100644 (file)
index 0000000..891f0fc
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <glib.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <zb-log.h>
+#include <zb-common.h>
+
+#include "zbl.h"
+#include "zbl-dbus.h"
+#include "zigbee.h"
+
+API int zb_aps_send(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char aps_fc,
+       unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid,
+       unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code,
+       unsigned char cmd_id, unsigned short payload_len, unsigned char *payload,
+       zb_aps_send_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       int ret = ZIGBEE_ERROR_NONE;
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_aps_send(addr16, aps_fc, src_ep, dst_ep, clusterid, profileid,
+               zcl_fc, mfg_code, cmd_id, payload_len, payload, cb, user_data);
+       DBG("zbl_aps_send()=0x%X", ret);
+       return ret;
+}
+
+API int zb_zcl_send(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
+       unsigned char dst_ep, zb_cluster_id clusterid, unsigned char zcl_fc,
+       unsigned char cmd, unsigned short payload_len, unsigned char *payload,
+       zb_zcl_send_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       int ret = ZIGBEE_ERROR_NONE;
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_zcl_send(addr16, src_ep, dst_ep, clusterid, zcl_fc,
+                               cmd, payload_len, payload, cb, user_data);
+       DBG("zbl_zcl_send()=0x%X", ret);
+       return ret;
+}
+
+API int zb_send_to_local(zb_zigbee_h handle, unsigned short length,
+       unsigned char *data, zb_send_to_local_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       int ret = ZIGBEE_ERROR_NONE;
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_send_to_local(length, data, cb, user_data);
+       DBG("zbl_send_to_local()=0x%X", ret);
+       return ret;
+}
diff --git a/src/zbl-dbus.c b/src/zbl-dbus.c
new file mode 100644 (file)
index 0000000..0951abe
--- /dev/null
@@ -0,0 +1,8984 @@
+/*
+ * Copyright (c) 2015 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 <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#include "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+#define USE_ASYNC_DBUS_CALL
+
+static int zbl_ref_count;
+
+static GDBusConnection *gdbus_conn = NULL;
+static GDBusProxy *service_gproxy = NULL;
+static GDBusProxy *on_off_gproxy = NULL;
+static GDBusProxy *door_lock_gproxy = NULL;
+static GDBusProxy *level_control_gproxy = NULL;
+static GDBusProxy *thermostat_gproxy = NULL;
+static GDBusProxy *alarm_gproxy = NULL;
+static GDBusProxy *fan_control_gproxy = NULL;
+static GDBusProxy *mfglib_gproxy = NULL;
+static GDBusProxy *zcl_global_proxy = NULL;
+static GDBusProxy *zdo_dev_proxy = NULL;
+static GDBusProxy *zcl_basic_proxy = NULL;
+static GDBusProxy *zcl_identify_proxy = NULL;
+static GDBusProxy *zcl_ias_zone_proxy = NULL;
+static GDBusProxy *zcl_poll_control_proxy = NULL;
+static GDBusProxy *zcl_group_proxy = NULL;
+static GDBusProxy *zcl_scene_proxy = NULL;
+static GDBusProxy *zdo_bind_proxy = NULL;
+static GDBusProxy *zcl_color_control_proxy = NULL;
+static GDBusProxy *custom_gproxy = NULL;
+
+/* command id */
+typedef enum {
+       /* Service */
+       ZBL_SERVICE_FORM_NETWORK = 0,
+       ZBL_SERVICE_DISABLE_NETWORK,
+       /* ZDO except Bind */
+       ZBL_ZDO_NWK_ADDR_REQ,
+       ZBL_ZDO_NWK_ADDR_EXT_REQ,
+       ZBL_ZDO_ACTIVE_EP_REQ,
+       ZBL_ZDO_SIMPLE_DESC_REQ,
+       ZBL_ZDO_MATCHED_DESCRIPTOR_REQ,
+       ZBL_ZDO_COMPLEX_DESC_REQ,
+       ZBL_ZDO_MGMT_BIND_REQ,
+       ZBL_ZDO_MGMT_LQI_REQ,
+       ZBL_ZDO_MGMT_RTG_REQ,
+       ZBL_ZDO_MGMT_NWK_DISC_REQ,
+       ZBL_ZDO_MGMT_PERMIT_JOIN_REQ,
+       ZBL_ZDO_MGMT_LEAVE_REQ,
+       ZBL_ZDO_NODE_DESC_REQ,
+       ZBL_ZDO_POWER_DESC_REQ,
+       ZBL_ZDO_USER_DESC_REQ,
+       ZBL_ZDO_USER_DESC_SET_REQ,
+       /* ZDP Bind */
+       ZBL_ZDO_BIND_REQ,
+       ZBL_ZDO_UNBIND_REQ,
+       /* ZCL Global */
+       ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ,
+       ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ,
+       ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ,
+       ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ,
+       ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ,
+       ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ,
+       ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ,
+       ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ,
+       ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ,
+       /* Custom */
+       ZBL_CUSTOM_APS_SEND_REQ,
+       ZBL_CUSTOM_ZCL_SEND_REQ,
+       ZBL_CUSTOM_LOCAL_SEND_REQ,
+       /* ZCL Alarm */
+       ZBL_ZCL_ALARM_GET_ALARM_REQ,
+       /* ZCL Doorlock */
+       ZBL_ZCL_DOORLOCK_LOCK_STATE,
+       /* ZCL Fanmode */
+       ZBL_ZCL_FANMODE_FAN_MODE_STATE,
+       /* ZCL Group */
+       ZBL_ZCL_GROUP_ADD_GROUP_REQ,
+       ZBL_ZCL_GROUP_VIEW_GROUP_REQ,
+       ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ,
+       ZBL_ZCL_GROUP_REMOVE_GROUP_REQ,
+       /* ZCL Identify */
+       ZBL_ZCL_IDENTIFY_QUERY_REQ,
+       /* ZCL On/Off */
+       ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE,
+       /* ZCL Pollcontrol */
+       ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ,
+       /* ZCL Scene */
+       ZBL_ZCL_SCENE_ADD_SCENE_REQ,
+       ZBL_ZCL_SCENE_VIEW_SCENE_REQ,
+       ZBL_ZCL_SCENE_REMOVE_SCENE_REQ,
+       ZBL_ZCL_SCENE_STORE_SCENE_REQ,
+       ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ,
+       ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ,
+       /* ZCL Thermostat */
+       ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP,
+} zbl_command_id_e;
+
+typedef struct {
+       bool found;
+       void *cb;
+       void *userdata;
+       unsigned int sid;
+       int tid;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       void *global_cmd;
+       void *handle;
+#endif
+       zbl_command_id_e cid;
+} zbl_req_cb_s;
+
+#define ZCL_REPORTING_DIRECTION_REPORTED 0x00
+#define ZCL_REPORTING_DIRECTION_RECEIVED 0x01
+
+static GDBusProxy *_zbl_get_service_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == service_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_SERVICE_INTERFACE,
+                       NULL, NULL);
+       } else
+               proxy = service_gproxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_on_off_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == on_off_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_ON_OFF_INTERFACE, NULL, NULL);
+       } else
+               proxy = on_off_gproxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_door_lock_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == door_lock_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_DOOR_LOCK_INTERFACE, NULL, NULL);
+       } else
+               proxy = door_lock_gproxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_level_control_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == level_control_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_LEVEL_CONTROL_INTERFACE, NULL, NULL);
+       } else
+               proxy = level_control_gproxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_thermostat_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == thermostat_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_THERMOSTAT_INTERFACE, NULL, NULL);
+       } else
+               proxy = thermostat_gproxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_alarm_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == alarm_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_ALARM_INTERFACE,
+                       NULL, NULL);
+       } else
+               proxy = alarm_gproxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_fan_control_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == fan_control_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_FAN_CONTROL_INTERFACE, NULL, NULL);
+       } else
+               proxy = fan_control_gproxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_mfglib_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == mfglib_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_MFGLIB_CONTROL_INTERFACE, NULL, NULL);
+       } else
+               proxy = mfglib_gproxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_zcl_global_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zcl_global_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, NULL, NULL);
+       } else
+               proxy = zcl_global_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_zdo_dev_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zdo_dev_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE, NULL, NULL);
+       } else
+               proxy = zdo_dev_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_basic_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zcl_basic_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_BASIC_INTERFACE,
+                       NULL, NULL);
+       } else
+               proxy = zcl_basic_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_identify_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zcl_identify_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_IDENTIFY_INTERFACE, NULL, NULL);
+       } else
+               proxy = zcl_identify_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_ias_zone_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zcl_ias_zone_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_IAS_ZONE_INTERFACE, NULL, NULL);
+       } else
+               proxy = zcl_ias_zone_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_poll_control_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zcl_poll_control_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_POLL_CONTROL_INTERFACE, NULL, NULL);
+       } else
+               proxy = zcl_poll_control_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_group_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zcl_group_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_GROUP_INTERFACE,
+                       NULL, NULL);
+       } else
+               proxy = zcl_group_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_scene_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zcl_scene_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZCL_SCENE_INTERFACE,
+                       NULL, NULL);
+       } else
+               proxy = zcl_scene_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_zdo_bind_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zdo_bind_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_ZDO_BIND_INTERFACE,
+                       NULL, NULL);
+       } else
+               proxy = zdo_bind_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_color_control_proxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Connection Object is invalid");
+
+       if (NULL == zcl_color_control_proxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH,
+                       ZIGBEE_ZCL_COLOR_CONTROL_INTERFACE, NULL, NULL);
+       } else
+               proxy = zcl_color_control_proxy;
+
+       return proxy;
+}
+
+static GDBusProxy *_zbl_get_custom_gproxy(void)
+{
+       GDBusProxy *proxy = NULL;
+       RETVM_IF(NULL == gdbus_conn, NULL, "Custom Object is invalid");
+
+       if (NULL == custom_gproxy) {
+               proxy = g_dbus_proxy_new_sync(gdbus_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       ZIGBEE_SERVER_NAME, ZIGBEE_CONTROL_OBJECT_PATH, ZIGBEE_CUSTOM_INTERFACE,
+                       NULL, NULL);
+       } else
+               proxy = custom_gproxy;
+
+       return proxy;
+}
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+static gint _global_compare_func(gconstpointer a, gconstpointer b)
+{
+       const zbl_req_cb_s *left = (const zbl_req_cb_s*)a;
+       const zbl_req_cb_s *right = (const zbl_req_cb_s*)b;
+       zb_event_global_default_rsp_s *left_data = NULL;
+       zb_event_global_default_rsp_s *right_data = NULL;
+
+       if (NULL == left || NULL == left->global_cmd)
+               return -1;
+       if (NULL == right || NULL == right->global_cmd)
+               return 1;
+
+       left_data = left->global_cmd;
+       right_data = right->global_cmd;
+
+       if (left_data->ep > right_data->ep)
+               return 1;
+       else if (left_data->ep < right_data->ep)
+               return -1;
+
+       if (left_data->clusterid > right_data->clusterid)
+               return 1;
+       else if (left_data->clusterid < right_data->clusterid)
+               return -1;
+
+       if (left_data->commandid > right_data->commandid)
+               return 1;
+       else if (left_data->commandid < right_data->commandid)
+               return -1;
+
+       /* endpoint, clusterid and commandid are equal */
+       return 0;
+}
+
+static void _zbl_register_global_req(zb_zigbee_h handle, zbl_req_cb_s *container)
+{
+       GList *list = NULL;
+       GList *item = NULL;
+
+       struct zbl_zigbee_s* h = handle;
+
+       if (NULL == handle || NULL == container)
+               return;
+
+       list = h->global_cmd_req;
+
+       /* Insert item if not exists */
+       DBG("Insert global cmd info");
+       if (list) {
+               item = g_list_find_custom(list, container, _global_compare_func);
+               if (NULL != item)
+                       h->global_cmd_req = g_list_append(list, container);
+       } else
+               h->global_cmd_req = g_list_append(list, container);
+}
+
+static void _zbl_deregister_global_req(zb_zigbee_h handle, zbl_req_cb_s *container)
+{
+       GList *list = NULL;
+       GList *item = NULL;
+
+       struct zbl_zigbee_s* h = handle;
+
+       if (NULL == handle || NULL == container)
+               return;
+
+       list = h->global_cmd_req;
+       if (NULL == list)
+               return;
+
+       /* Remove item if exists */
+       DBG("Remove global cmd info");
+       item = g_list_find_custom(list, container, _global_compare_func);
+       if (NULL != item)
+               h->global_cmd_req = g_list_remove(list, container);
+}
+
+static void _zbl_remove_global_req(zb_zigbee_h handle, unsigned char ep,
+       unsigned short clusterid, unsigned char commandid)
+{
+       GList *head = NULL;
+       GList *iter = NULL;
+       zbl_req_cb_s *ret = NULL;
+
+       struct zbl_zigbee_s* h = handle;
+
+       if (NULL == handle)
+               return;
+
+       head = h->global_cmd_req;
+       iter = head;
+
+       while (NULL != iter) {
+               GList *next = iter->next;
+               zbl_req_cb_s *container = iter->data;
+               if (container && container->global_cmd) {
+                       zb_event_global_default_rsp_s *data = container->global_cmd;
+
+                       if (data && data->ep == ep && data->clusterid == clusterid
+                                       && data->commandid == commandid) {
+                               DBG("  Found: ep[%d] cluster_id[%X] commandid[%X] / sid[%d]",
+                                       ep, clusterid, commandid, container->sid);
+                               ret = container;
+                               break;
+                       }
+               }
+               iter = next;
+       }
+
+       if (ret) {
+               if (ret->sid)
+                       g_dbus_connection_signal_unsubscribe(gdbus_conn, ret->sid);
+
+               if (ret->tid) {
+                       g_source_remove(ret->tid);
+                       DBG("tid=%d removed");
+                       ret->tid = 0;
+               }
+
+               _zbl_deregister_global_req(h, ret);
+       }
+
+}
+#endif /* ZB_FEATURE_GLOBAL_RSP_SYNC */
+
+static void _zbl_signal_handler(GDBusConnection *connection,
+               const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
+               const gchar *signal_name, GVariant *parameters, gpointer user_data)
+{
+       zb_event_data_s *ev = NULL;
+       struct zbl_zigbee_s* container = user_data;
+
+       DBG("%s signal received", signal_name);
+
+       RET_IF(NULL == container);
+       RET_IF(NULL == container->event_handler);
+
+       ev = calloc(1, sizeof(zb_event_data_s));
+       RETM_IF(NULL == ev, "Failed to memory allocation !");
+
+       if (g_strcmp0(signal_name, "zigbee_state") == 0) {
+               gboolean enabled;
+               g_variant_get(parameters, "(b)", &enabled);
+
+               ev->data.enable = calloc(1, sizeof(zb_event_enable_s));
+               if (!ev->data.enable) {
+                       ERR("Failed to memory allocation !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               ev->data.enable->status = (unsigned char)enabled;
+
+               container->event_handler(0, NULL, ZB_ZDP_ENABLE_EVENT, ev, container->user_data);
+
+               if (ev->data.enable) {
+                       free(ev->data.enable);
+                       ev->data.enable = NULL;
+               }
+
+       } else if (g_strcmp0(signal_name, "form_network_done") == 0) {
+               zb_nwk_addr pan_id;
+               g_variant_get(parameters, "(q)", &pan_id);
+
+               ev->data.form_network = calloc(1, sizeof(zb_event_form_network_s));
+               if (!ev->data.form_network) {
+                       ERR("Failed to memory allocation !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               memcpy(&ev->data.form_network->pan_id, &pan_id, sizeof(zb_nwk_addr));
+
+               container->event_handler(pan_id, NULL, ZB_ZDP_FORM_NETWORK_DONE, ev,
+                       container->user_data);
+
+               if (ev->data.form_network) {
+                       free(ev->data.form_network);
+                       ev->data.form_network = NULL;
+               }
+       } else if (g_strcmp0(signal_name, "child_joined") == 0) {
+               zb_nwk_addr addr16;
+               zb_ieee_addr addr64;
+               unsigned char count;
+               unsigned char ep[10];
+               unsigned char value;
+
+               int j = 0;
+               GVariantIter *iter1 = NULL;
+               GVariantIter *iter2 = NULL;
+
+               g_variant_get(parameters, "(a(y)ya(y)q)", &iter1, &count, &iter2, &addr16);
+               if (!iter1 || !iter2) {
+                       ERR("Invalid parameter !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               while (g_variant_iter_loop(iter1, "(y)", &value)) {
+                       addr64[j] = value; j++;
+               }
+               g_variant_iter_free(iter1);
+
+               j = 0;
+               while (g_variant_iter_loop(iter2, "(y)", &value)) {
+                       ep[j] = value; j++;
+               }
+               g_variant_iter_free(iter2);
+
+               ev->data.join = calloc(1, sizeof(zb_event_join_s));
+               if (!ev->data.join) {
+                       ERR("Failed to memory allocation !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               ev->data.join->count = count;
+               memcpy(ev->data.join->ep, ep, count);
+
+               container->event_handler(addr16, addr64, ZB_ZDP_JOIN_EVENT, ev,
+                       container->user_data);
+
+               if (ev->data.join) {
+                       free(ev->data.join);
+                       ev->data.join = NULL;
+               }
+
+       } else if (g_strcmp0(signal_name, "child_rejoined") == 0) {
+               zb_ieee_addr addr64;
+               unsigned char value;
+
+               int j = 0;
+               GVariantIter *iter = NULL;
+
+               g_variant_get(parameters, "(a(y))", &iter);
+               if (!iter) {
+                       ERR("Invalid parameter !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               while (g_variant_iter_loop(iter, "(y)", &value)) {
+                       addr64[j] = value; j++;
+               }
+               g_variant_iter_free(iter);
+
+               container->event_handler(0, addr64, ZB_ZDP_REJOIN_EVENT, ev,
+                       container->user_data);
+
+       } else if (g_strcmp0(signal_name, "child_left") == 0) {
+               int j = 0;
+               zb_ieee_addr addr64;
+               GVariantIter *iter = NULL;
+               unsigned char value, status;
+
+               g_variant_get(parameters, "(a(y)y)", &iter, &status);
+               if (!iter) {
+                       ERR("Invalid parameter !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               while (g_variant_iter_loop(iter, "(y)", &value)) {
+                       addr64[j] = value;
+                       j++;
+               }
+               g_variant_iter_free(iter);
+
+               ev->data.child_left = calloc(1, sizeof(zb_event_child_left_s));
+               if (!ev->data.child_left) {
+                       ERR("Failed to memory allocation !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               ev->data.child_left->status = status;
+
+               container->event_handler(0, addr64, ZB_ZDP_CHILD_LEFT, ev,
+                       container->user_data);
+
+               if (ev->data.child_left) {
+                       free(ev->data.child_left);
+                       ev->data.child_left = NULL;
+               }
+
+       } else if (g_strcmp0(signal_name, "leave_network_done") == 0) {
+
+               zb_nwk_addr addr16;
+               g_variant_get(parameters, "(q)", &addr16);
+
+               container->event_handler(addr16, NULL, ZB_ZDP_LEAVE_DONE_EVENT, ev,
+                       container->user_data);
+
+       } else if (!g_strcmp0(signal_name, "zcl_global_default_response")) {
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned short clusterid;
+               unsigned char commandid;
+               unsigned char status;
+
+               g_variant_get(parameters, "(qyqyy)",
+                       &addr16, &ep, &clusterid, &commandid, &status);
+
+               ev->data.global_default_rsp = calloc(1, sizeof(zb_event_global_default_rsp_s));
+               if (!ev->data.global_default_rsp) {
+                       ERR("Failed to memory allocation !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               ev->data.global_default_rsp->ep = ep;
+               ev->data.global_default_rsp->clusterid = clusterid;
+               ev->data.global_default_rsp->commandid = commandid;
+               ev->data.global_default_rsp->status = status;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+               /* If there is global request already, remove that. */
+               if (0x00 != status)
+                       _zbl_remove_global_req(container, ep, clusterid, commandid);
+#endif
+
+               container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_DEFAULT_RSP_EVENT, ev,
+                       container->user_data);
+
+               if (ev->data.global_default_rsp) {
+                       free(ev->data.global_default_rsp);
+                       ev->data.global_default_rsp = NULL;
+               }
+
+       } else if (!g_strcmp0(signal_name, "alarm_count")) {
+               unsigned short alarm_count;
+               g_variant_get(parameters, "(q)", &alarm_count);
+
+               ev->data.alarm = calloc(1, sizeof(zb_event_alarm_s));
+               if (!ev->data.global_default_rsp) {
+                       ERR("Failed to memory allocation !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               ev->data.alarm->count = alarm_count;
+
+               container->event_handler(0, NULL, ZB_ZCL_ALARM_EVENT, ev, container->user_data);
+
+               if (ev->data.alarm) {
+                       free(ev->data.alarm);
+                       ev->data.alarm = NULL;
+               }
+
+       } else if (!g_strcmp0(signal_name, "report_attr_handler_cb")) {
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned char value;
+               unsigned short attrData;
+               unsigned short clusterid;
+               unsigned char dataType;
+               int data_size;
+               int dsizeIndex = 0;
+               char dSize[3] = {'\0', '\0'};
+               int i = 0, j = 0, count;
+               GVariantIter *attr_iter = NULL;
+               GVariantIter *dataType_iter = NULL;
+               GVariantIter *data_iter = NULL;
+
+               struct attribute_report_s **records = NULL;
+
+               g_variant_get(parameters, "(qyqaqa(y)a(y)i)",  &addr16, &ep,
+                        &clusterid, &attr_iter, &dataType_iter, &data_iter, &count);
+
+               if (!attr_iter || !dataType_iter || !data_iter) {
+                       ERR("Invalid parameter !");
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               records = calloc(count, sizeof(struct attribute_report_s*));
+               if (!records) {
+                       ERR("calloc() Fail(%d)", errno);
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               for (j = 0; j < count; j++) {
+                       records[j] = calloc(1, sizeof(struct attribute_report_s));
+                       if (NULL == records[j]) {
+                               for (i = 0; i < j; i++) {
+                                       free(records[i]);
+                                       records[i] = NULL;
+                               }
+                               free(records);
+                               records = NULL;
+
+                               g_variant_iter_free(attr_iter);
+                               g_variant_iter_free(dataType_iter);
+                               g_variant_iter_free(data_iter);
+
+                               ERR("calloc() Fail(%d)", errno);
+                               goto EXIT_EVENT_HANDLER;
+                       }
+               }
+               DBG("record_length %d", count);
+
+               j = 0;
+               while (g_variant_iter_loop(attr_iter, "q", &attrData)
+                               && g_variant_iter_loop(dataType_iter, "(y)", &dataType)) {
+                       records[j]->id = attrData;
+                       records[j]->type = dataType;
+                       DBG("dataType 0x%02x", records[j]->type);
+                       DBG("AttributeId 0x%04x", records[j]->id);
+                       j++;
+               }
+               g_variant_iter_free(attr_iter);
+               g_variant_iter_free(dataType_iter);
+
+               j = 0;
+               while (j < count) {
+                       switch (records[j]->type) {
+                       /* String */
+                       case ZB_ZCL_OCTET_STRING:
+                       case ZB_ZCL_CHARACTER_STRING:
+                               g_variant_iter_loop(data_iter, "(y)", &value);
+                               data_size = value + 1;
+                               records[j]->value = calloc(data_size, sizeof(unsigned char));
+                               if (NULL == records[j]->value) {
+                                       for (i = 0; i < j; i++) {
+                                               free(records[i]->value);
+                                               records[i]->value = NULL;
+                                       }
+                                       for (i = 0; i < count; i++) {
+                                               free(records[i]);
+                                               records[i] = NULL;
+                                       }
+                                       free(records);
+                                       records = NULL;
+
+                                       ERR("calloc() Fail(%d)", errno);
+                                       goto EXIT_EVENT_HANDLER;
+                               }
+                               records[j]->value[dsizeIndex] = value;
+                               dsizeIndex++;
+                               for (i = dsizeIndex; i < data_size - 2; i++) {
+                                       g_variant_iter_loop(data_iter, "(y)", &value);
+                                       records[j]->value[i] = value;
+                               }
+                               g_variant_iter_free(data_iter);
+                               break;
+                       case ZB_ZCL_LONG_OCTET_STRING:
+                       case ZB_ZCL_LONG_CHARACTER_STRING:
+                               g_variant_iter_loop(data_iter, "(y)", &value);
+                               dSize[0] = value;
+                               g_variant_iter_loop(data_iter, "(y)", &value);
+                               dSize[1] =  value;
+                               data_size = dSize[1];
+                               data_size = (data_size << 8) | dSize[0];
+                               data_size += 2;
+                               records[j]->value = calloc(data_size, sizeof(unsigned char));
+                               if (NULL == records[j]->value) {
+                                       for (i = 0; i < j; i++) {
+                                               free(records[i]->value);
+                                               records[i]->value = NULL;
+                                       }
+                                       for (i = 0; i < count; i++) {
+                                               free(records[i]);
+                                               records[i] = NULL;
+                                       }
+                                       free(records);
+                                       records = NULL;
+
+                                       ERR("calloc() Fail(%d)", errno);
+                                       goto EXIT_EVENT_HANDLER;
+                               }
+                               records[j]->value[dsizeIndex] = dSize[dsizeIndex];
+                               dsizeIndex++;
+                               records[j]->value[dsizeIndex] = dSize[dsizeIndex];
+                               dsizeIndex++;
+
+                               for (i = dsizeIndex; i < data_size - 2; i++) {
+                                       g_variant_iter_loop(data_iter, "(y)", &value);
+                                       records[j]->value[i] = value;
+                               }
+                               g_variant_iter_free(data_iter);
+                               break;
+                       /* Array, set and bag */
+                       case ZB_ZCL_ARRAY:
+                       case ZB_ZCL_SET:
+                       case ZB_ZCL_BAG:
+                       /* structure */
+                       case ZB_ZCL_STRUCTURE:
+                               ERR("Not supported type = %d", records[i]->type);
+                               continue;
+                       default:
+                               data_size = zb_zcl_get_data_size(records[j]->type);
+                               if (data_size < 0) {
+                                       for (i = 0; i < j; i++) {
+                                               free(records[i]->value);
+                                               records[i]->value = NULL;
+                                       }
+                                       for (i = 0; i < count; i++) {
+                                               free(records[i]);
+                                               records[i] = NULL;
+                                       }
+                                       free(records);
+                                       records = NULL;
+
+                                       ERR("zb_zcl_get_data_size() Fail(%d)", data_size);
+                                       goto EXIT_EVENT_HANDLER;
+                               }
+                               records[j]->value = calloc(data_size, sizeof(unsigned char));
+                               if (NULL == records[j]->value) {
+                                       for (i = 0; i < j; i++) {
+                                               free(records[i]->value);
+                                               records[i]->value = NULL;
+                                       }
+                                       for (i = 0; i < count; i++) {
+                                               free(records[i]);
+                                               records[i] = NULL;
+                                       }
+                                       free(records);
+                                       records = NULL;
+
+                                       ERR("calloc() Fail(%d)", errno);
+                                       goto EXIT_EVENT_HANDLER;
+                               }
+                               if (data_size != 0xFF) {
+                                       for (i = 0; i < data_size; i++) {
+                                               if (g_variant_iter_loop(data_iter, "(y)", &value)) {
+                                                       records[j]->value[i] = value;
+                                                       DBG("value[%d] 0x%02X", i, records[j]->value[i]);
+                                               }
+                                       }
+                               }
+                               g_variant_iter_free(data_iter);
+                       }
+                       DBG("DataType = 0x%02X Data Size = %d", records[j]->type, data_size);
+                       j++;
+               }
+
+               ev->data.global_attr_report = calloc(1, sizeof(zb_event_global_attr_report_s));
+               if (NULL == ev->data.global_attr_report) {
+                       ERR("Failed to memory allocation !");
+                       for (j = 0; j < count; j++) {
+                               free(records[j]->value);
+                               records[j]->value = NULL;
+                               if (records[j]) {
+                                       free(records[j]);
+                                       records[j] = NULL;
+                               }
+                       }
+                       if (records) {
+                               free(records);
+                               records = NULL;
+                       }
+                       goto EXIT_EVENT_HANDLER;
+               }
+
+               ev->data.global_attr_report->records = records;
+               ev->data.global_attr_report->count = count;
+
+               container->event_handler(addr16, NULL, ZB_ZCL_GLOBAL_ATTRIBUTE_REPORT_EVENT, ev,
+                       container->user_data);
+               for (j = 0; j < count; j++) {
+                       if (records[j]->value) {
+                               free(records[j]->value);
+                               records[j]->value = NULL;
+                       }
+                       if (records[j]) {
+                               free(records[j]);
+                               records[j] = NULL;
+                       }
+               }
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+               if (ev->data.global_attr_report) {
+                       free(ev->data.global_attr_report);
+                       ev->data.global_attr_report = NULL;
+               }
+
+       } else if (!g_strcmp0(signal_name, "status_change_rpt")) {
+
+               zb_nwk_addr addr16;
+               unsigned char src_ep;
+               unsigned char status;
+               unsigned short zone_status;
+               unsigned short delay;
+               unsigned char zone_id;
+
+               g_variant_get(parameters, "(qyqyyq)", &addr16, &src_ep, &zone_status,
+                       &status, &zone_id, &delay);
+               if (0xff == zone_id) {
+
+                       ev->data.ias_noti = calloc(1, sizeof(zb_event_ias_noti_s));
+                       if (!ev->data.ias_noti) {
+                               ERR("Failed to memory allocation !");
+                               goto EXIT_EVENT_HANDLER;
+                       }
+
+                       ev->data.ias_noti->src_ep = src_ep;
+                       ev->data.ias_noti->zone_status = zone_status;
+
+                       container->event_handler(addr16, NULL,
+                               ZB_ZCL_IAS_ZONE_STATUS_CHANGE_NOTIFICATION_EVENT, ev,
+                               container->user_data);
+
+                       if (ev->data.ias_noti) {
+                               free(ev->data.ias_noti);
+                               ev->data.ias_noti = NULL;
+                       }
+
+               } else {
+
+                       ev->data.ias_extended_noti = calloc(1, sizeof(zb_event_ias_extended_noti_s));
+                       if (!ev->data.ias_extended_noti) {
+                               ERR("Failed to memory allocation !");
+                               goto EXIT_EVENT_HANDLER;
+                       }
+
+                       ev->data.ias_extended_noti->src_ep = src_ep;
+                       ev->data.ias_extended_noti->zone_status = zone_status;
+                       ev->data.ias_extended_noti->status = status;
+                       ev->data.ias_extended_noti->zone_id = zone_id;
+                       ev->data.ias_extended_noti->delay = delay;
+
+                       container->event_handler(addr16, NULL,
+                               ZB_ZCL_IAS_ZONE_STATUS_CHANGE_EXTENDED_NOTIFICATION_EVENT, ev,
+                               container->user_data);
+
+                       if (ev->data.ias_extended_noti) {
+                               free(ev->data.ias_extended_noti);
+                               ev->data.ias_extended_noti = NULL;
+                       }
+
+               }
+       } else if (!g_strcmp0(signal_name, "enroll_request")) {
+               zb_nwk_addr addr16;
+               unsigned char src_ep;
+               unsigned short zone_type;
+               unsigned char mfg_code;
+
+               ev->data.ias_enroll_request = calloc(1, sizeof(zb_event_ias_enroll_request_s));
+               if (!ev->data.ias_enroll_request) {
+                               ERR("Failed to memory allocation !");
+                               goto EXIT_EVENT_HANDLER;
+                       }
+
+               g_variant_get(parameters, "(qyqy)", &addr16, &src_ep, &zone_type, &mfg_code);
+               ev->data.ias_enroll_request->src_ep = src_ep;
+               ev->data.ias_enroll_request->zone_type = zone_type;
+               ev->data.ias_enroll_request->mfg_code = mfg_code;
+
+               container->event_handler(addr16, NULL, ZB_ZCL_IAS_ZONE_ENROLL_REQUEST_EVENT, ev,
+                       container->user_data);
+
+               if (ev->data.ias_enroll_request) {
+                       free(ev->data.ias_enroll_request);
+                       ev->data.ias_enroll_request = NULL;
+               }
+       } else
+               ERR("Can't handle this signal=%s", signal_name);
+
+EXIT_EVENT_HANDLER:
+       if (ev) {
+               free(ev);
+               ev = NULL;
+       }
+       return;
+}
+
+static void _zbl_dbus_unsubscribe_signal(GList *sub_ids)
+{
+       RET_IF(NULL == gdbus_conn);
+       RET_IF(NULL == sub_ids);
+
+       while (sub_ids) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, GPOINTER_TO_UINT(sub_ids->data));
+               sub_ids = g_list_remove(sub_ids, sub_ids->data);
+       }
+       g_list_free(sub_ids);
+}
+
+static int _zbl_dbus_subscribe_signal(zb_zigbee_h handle)
+{
+       unsigned int id;
+       struct zbl_zigbee_s* h = handle;
+
+       /* Section 0. Subscribe Manager signal */
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_MANAGER_INTERFACE,
+                       "zigbee_state", ZIGBEE_DBUS_OBJPATH, NULL, G_DBUS_CALL_FLAGS_NONE,
+                       _zbl_signal_handler, handle, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(zigbee_state) Fail(%d)", errno);
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for service_enabled signal %d", id);
+
+       /* Section 1. Subscribe ZDO signal */
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
+                       "child_joined", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
+                       _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for child_joined signal %d", id);
+
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
+                       "child_rejoined", ZIGBEE_CONTROL_OBJECT_PATH, NULL,     G_DBUS_CALL_FLAGS_NONE,
+                       _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(child_rejoined) Fail(%d)\n", errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for child_rejoined signal %d", id);
+
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
+                       "child_left", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
+                       _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(child_left) Fail(%d)\n", errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for child_left signal %d", id);
+
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
+                       "leave_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
+                       G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(leave_network_done) Fail(%d)\n", errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for leave_network_done signal %d", id);
+
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_SERVICE_INTERFACE,
+                       "form_network_done", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
+                       _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(form_network_done) Fail(%d)\n", errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for form_network_done signal %d", id);
+
+       /* Section 3. Subscribe ZCL global command */
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "zcl_global_default_response",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
+               _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(zcl_global_default_response) Fail(%d)\n",
+                       errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for zcl_global_default_response signal %d", id);
+
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "report_attr_handler_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
+               _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(report_attr_handler_rsp) Fail(%d)\n",
+                       errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for report_attr_handler_rsp signal %d", id);
+
+       /* Section 2. Subscribe ZCL alarm cluster signal */
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL, ZIGBEE_ZCL_ALARM_INTERFACE,
+                       "alarm_count", ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
+                       _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(alarm_count) Fail(%d)\n", errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for alarm_count signal %d", id);
+
+       /* Section 3. Subscribe ZCL IAS cluster signal */
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+                       ZIGBEE_ZCL_IAS_ZONE_INTERFACE, "status_change_rpt",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE,
+                       _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(status_change_rpt) Fail(%d)\n", errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for status_change_rpt signal %d", id);
+
+       id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_IAS_ZONE_INTERFACE, "enroll_request", ZIGBEE_CONTROL_OBJECT_PATH, NULL,
+               G_DBUS_CALL_FLAGS_NONE, _zbl_signal_handler, h, NULL);
+       if (0 == id) {
+               ERR("g_dbus_connection_signal_subscribe(enroll_request) Fail(%d)\n", errno);
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+       h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id));
+       DBG("subscribed for enroll_request signal %d", id);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+static void _zbl_dbus_name_owner_notify(GObject *object, GParamSpec *pspec,
+               gpointer *user_data)
+{
+       GDBusProxy *proxy = G_DBUS_PROXY(object);
+       gchar *name_owner = g_dbus_proxy_get_name_owner(proxy);
+       zb_zigbee_h handle = (zb_zigbee_h)user_data;
+
+       DBG("Name owner notify [%s]", name_owner);
+
+       if (NULL == name_owner)
+               zbl_dbus_stop(handle);
+
+       g_free(name_owner);
+}
+
+static void _zbl_request_cleanup(gpointer data)
+{
+       zbl_req_cb_s *container = data;
+       RET_IF(NULL == container);
+
+       if (container->tid) {
+               g_source_remove(container->tid);
+               DBG("tid=%d removed");
+               container->tid = 0;
+       }
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       _zbl_deregister_global_req(container->handle, container);
+       if (container->global_cmd) {
+               free(container->global_cmd);
+               container->global_cmd = NULL;
+       }
+#endif
+
+       free(container);
+       container = NULL;
+}
+
+static gboolean _zbl_timeout_cb(gpointer p)
+{
+       zbl_req_cb_s *container = (zbl_req_cb_s *)p;
+
+       RETVM_IF(NULL == gdbus_conn, G_SOURCE_REMOVE, "gdbus_conn is NULL");
+       RETVM_IF(NULL == p, G_SOURCE_REMOVE, "container is NULL");
+       RETVM_IF(NULL == container->cb, G_SOURCE_REMOVE, "cb is NULL");
+       RETVM_IF(true == container->found, G_SOURCE_REMOVE, "cb was alreay handled");
+
+       switch (container->cid) {
+               /* Service */
+       case ZBL_SERVICE_FORM_NETWORK: {
+               zb_form_network_cb cb = container->cb;
+               cb(0x0000, container->userdata);
+       }
+       break;
+       case ZBL_SERVICE_DISABLE_NETWORK: {
+               zb_disable_network_cb cb = container->cb;
+               cb(0x0000, container->userdata);
+               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
+       }
+       break;
+       /* ZDO except Bind */
+       case ZBL_ZDO_NWK_ADDR_REQ: {
+               zb_zdo_addr_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_NWK_ADDR_EXT_REQ: {
+               zb_zdo_addr_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, NULL, 0, 0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_ACTIVE_EP_REQ: {
+               zb_zdo_active_ep_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_SIMPLE_DESC_REQ: {
+               zb_zdo_simple_desc_cb cb = container->cb;
+               cb(0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: {
+               zb_zdo_match_desc_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_COMPLEX_DESC_REQ: {
+               zb_zdo_complex_desc_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_MGMT_BIND_REQ: {
+               zb_zdo_mgmt_bind_cb cb = container->cb;
+               struct zb_zdo_binding_table_s **records = NULL;
+
+               records = calloc(1, sizeof(zb_zdo_binding_table_h));
+               if (records)
+                       records[0] = calloc(1, sizeof(struct zb_zdo_binding_table_s));
+
+               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata);
+
+               if (records && records[0]) {
+                       free(records[0]);
+                       records[0] = NULL;
+               }
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_MGMT_LQI_REQ: {
+               zb_zdo_mgmt_lqi_cb cb = container->cb;
+               struct zb_zdo_neighbor_table_desc_s **records = NULL;
+
+               records = calloc(1, sizeof(zb_zdo_neighbor_table_desc_h));
+               if (records)
+                       records[0] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s));
+
+               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata);
+
+               if (records && records[0]) {
+                       free(records[0]);
+                       records[0] = NULL;
+               }
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_MGMT_RTG_REQ: {
+               zb_zdo_mgmt_rtg_cb cb = container->cb;
+               struct zb_zdo_routing_table_s **records = NULL;
+
+               records = calloc(1, sizeof(zb_zdo_routing_table_h));
+               if (records)
+                       records[0] = calloc(1, sizeof(struct zb_zdo_routing_table_s));
+
+               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, 0, (void **)records, container->userdata);
+
+               if (records && records[0]) {
+                       free(records[0]);
+                       records[0] = NULL;
+               }
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_MGMT_NWK_DISC_REQ: {
+               zb_zdo_mgmt_nwk_disc_cb cb = container->cb;
+               struct zb_zdo_network_list_record_s **records = NULL;
+               records = calloc(1, sizeof(zb_zdo_network_list_record_h));
+               if (records)
+                       records[0] = calloc(1, sizeof(struct zb_zdo_network_list_record_s));
+
+               cb(0, 0, 0, 0, (void **)records, container->userdata);
+
+               if (records && records[0]) {
+                       free(records[0]);
+                       records[0] = NULL;
+               }
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: {
+               zb_zdo_mgmt_permit_joining_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_MGMT_LEAVE_REQ: {
+               zb_zdo_mgmt_leave_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_NODE_DESC_REQ: {
+               zb_zdo_node_desc_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_POWER_DESC_REQ: {
+               zb_zdo_power_desc_cb cb = container->cb;
+               cb(0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_USER_DESC_REQ: {
+               zb_zdo_user_desc_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, 0, 0, NULL, container->userdata);
+       break;
+       }
+       case ZBL_ZDO_USER_DESC_SET_REQ: {
+               zb_zdo_user_desc_conf_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
+       }
+       break;
+       /* ZDO Bind */
+       case ZBL_ZDO_BIND_REQ: {
+               zb_zdo_bind_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_UNBIND_REQ: {
+               zb_zdo_unbind_cb cb = container->cb;
+               cb(ZB_ZDP_STATUS_TIMEOUT, container->userdata);
+       }
+       break;
+       /* Custom */
+       case ZBL_CUSTOM_APS_SEND_REQ: {
+               zb_aps_send_cb cb = container->cb;
+               cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
+       } break;
+       case ZBL_CUSTOM_ZCL_SEND_REQ: {
+               zb_zcl_send_cb cb = container->cb;
+               cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_CUSTOM_LOCAL_SEND_REQ: {
+               zb_send_to_local_cb cb = container->cb;
+               cb(0, NULL, container->userdata);
+       }
+       break;
+       /* ZCL Global */
+       case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: {
+               zb_zcl_global_attr_read_cb cb = container->cb;
+               cb(0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: {
+               zb_zcl_global_attr_write_cb cb = container->cb;
+               cb(0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ: {
+               zb_zcl_global_config_report_write_cb cb = container->cb;
+               cb(0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: {
+               zb_zcl_global_attr_discover_cb cb = container->cb;
+               cb(0, 0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: {
+               zb_zcl_global_attr_write_cb cb = container->cb;
+               cb(0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ: {
+               zb_zcl_global_discover_cmds_cb cb = container->cb;
+               cb(0, 0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: {
+               zb_zcl_global_discover_cmds_cb cb = container->cb;
+               cb(0, 0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: {
+               zb_zcl_global_attr_extended_discover_cb cb = container->cb;
+               cb(0, 0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: {
+               zb_zcl_global_config_report_read_cb cb = container->cb;
+               cb(0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       /* ZCL Alarm */
+       case ZBL_ZCL_ALARM_GET_ALARM_REQ: {
+               zb_zcl_alarm_get_alarm_cb cb = container->cb;
+               cb(ZB_ZCL_STATUS_TIMEOUT, 0, ZB_ZCL_STATUS_UNSUP_CLUSTER_COMMAND,
+                       0, 0, 0, container->userdata);
+       }
+       break;
+       /* ZCL Doorlock */
+       case ZBL_ZCL_DOORLOCK_LOCK_STATE: {
+               zb_form_network_cb cb = container->cb;
+               cb(0x0000, container->userdata);
+       }
+       break;
+       /* ZCL Fanmode */
+       case ZBL_ZCL_FANMODE_FAN_MODE_STATE: {
+               zb_form_network_cb cb = container->cb;
+               cb(0x0000, container->userdata);
+       }
+       break;
+       /* ZCL Group */
+       case ZBL_ZCL_GROUP_ADD_GROUP_REQ: {
+               zb_zcl_group_add_group_cb cb = container->cb;
+               cb(0, 0, 0, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: {
+               zb_zcl_group_view_group_cb cb = container->cb;
+               cb(0, 0, 0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: {
+               zb_zcl_group_get_group_membership_cb cb = container->cb;
+               cb(0, 0, 0, 0, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: {
+               zb_zcl_group_remove_group_cb cb = container->cb;
+               cb(0, 0, 0, 0, container->userdata);
+       }
+       break;
+       /* ZCL Identify */
+       case ZBL_ZCL_IDENTIFY_QUERY_REQ: {
+               zb_zcl_identify_query_cb cb = container->cb;
+               cb(0, 0, container->userdata);
+       }
+       break;
+       /* ZCL On/Off */
+       case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: {
+               zb_form_network_cb cb = container->cb;
+               cb(0x0000, container->userdata);
+       }
+       break;
+       /* ZCL Pollcontrol */
+       case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: {
+               zb_zcl_pollctrl_check_in_cb cb = container->cb;
+               cb(0, 0, container->userdata);
+       }
+       break;
+       /* ZCL Scene */
+       case ZBL_ZCL_SCENE_ADD_SCENE_REQ: {
+               zb_zcl_scene_add_scene_cb cb = container->cb;
+               cb(0, 0, 0, 0, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: {
+               zb_zcl_scene_view_scene_cb cb = container->cb;
+               cb(0, 0, 0, 0, 0, 0, NULL, NULL, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: {
+               zb_zcl_scene_remove_scene_cb cb = container->cb;
+               cb(0, 0, 0, 0, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_STORE_SCENE_REQ: {
+               zb_zcl_scene_store_scene_cb cb = container->cb;
+               cb(0, 0, 0, 0, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: {
+               zb_zcl_scene_remove_all_scene_cb cb = container->cb;
+               cb(0, 0, 0, 0, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: {
+               zb_zcl_scene_get_scene_membership_cb cb = container->cb;
+               cb(0, 0, 0, 0, 0, 0, NULL, container->userdata);
+       }
+       break;
+       /* ZCL Thermostat */
+       case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: {
+               zb_form_network_cb cb = container->cb;
+               cb(0x0000, container->userdata);
+       }
+       break;
+       default:
+               ERR("Unhandled cid = %d", container->cid);
+       }
+
+       container->tid = 0;
+       g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
+       container->sid = 0;
+
+       return G_SOURCE_REMOVE;
+}
+
+static void _zbl_response_cb(GDBusConnection *connection,
+               const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
+               const gchar *signal_name, GVariant *parameters, gpointer user_data)
+{
+       zbl_req_cb_s *container = user_data;
+       RETM_IF(NULL == container, "container is null");
+       RETM_IF(NULL == container->cb, "cb is NULL");
+
+       container->found = true;
+       g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
+
+       switch (container->cid) {
+               /* Service */
+       case ZBL_SERVICE_FORM_NETWORK: {
+               zb_form_network_cb cb = container->cb;
+               zb_nwk_addr panid;
+               g_variant_get(parameters, "(q)", &panid);
+               cb(panid, container->userdata);
+       }
+       break;
+       case ZBL_SERVICE_DISABLE_NETWORK: {
+               zb_disable_network_cb cb = container->cb;
+               unsigned char ret = ZB_ZDP_STATUS_SUCCESS;
+               g_variant_get(parameters, "(y)", &ret);
+               cb(ret, container->userdata);
+       }
+       break;
+       /* ZDO except Bind */
+       case ZBL_ZDO_NWK_ADDR_REQ: {
+               zb_zdo_addr_cb cb = container->cb;
+
+               int j = 0;
+               zb_nwk_addr addr16;
+               zb_ieee_addr addr64;
+               unsigned char status;
+               unsigned char num;
+               unsigned char start_idx;
+               unsigned char value;
+               GVariantIter *mac_iter = NULL;
+
+               g_variant_get(parameters, "(ya(y)qyy)", &status, &mac_iter, &addr16, &num, &start_idx);
+               RETM_IF(NULL == mac_iter, "Invalid parameter !");
+
+               while (g_variant_iter_loop(mac_iter, "(y)", &value)) {
+                       addr64[j] = value;
+                       j++;
+               }
+               g_variant_iter_free(mac_iter);
+
+               cb(status, addr64, addr16, num, start_idx, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_NWK_ADDR_EXT_REQ: {
+               zb_zdo_addr_cb cb = container->cb;
+
+               int j = 0;
+               zb_nwk_addr addr16;
+               zb_ieee_addr addr64;
+               unsigned char status;
+               unsigned char num;
+               unsigned char start_idx;
+               unsigned char value;
+               GVariantIter *mac_iter = NULL;
+               GVariantIter *assoc_iter = NULL;
+
+               g_variant_get(parameters, "(ya(y)qyyaq)", &status, &mac_iter,
+                       &addr16, &num, &start_idx, &assoc_iter);
+               RETM_IF(NULL == mac_iter, "Invalid parameter !");
+
+               while (g_variant_iter_loop(mac_iter, "(y)", &value)) {
+                       addr64[j] = value;
+                       j++;
+               }
+               g_variant_iter_free(mac_iter);
+               if (NULL != assoc_iter)
+                       g_variant_iter_free(assoc_iter);
+
+               cb(status, addr64, addr16, num, start_idx, NULL, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_ACTIVE_EP_REQ: {
+               zb_zdo_active_ep_cb cb = container->cb;
+
+               int j = 0;
+               zb_nwk_addr addr16;
+               unsigned char status;
+               unsigned char count;
+               unsigned char value;
+               GVariantIter *ep_iter = NULL;
+               unsigned char *ep_list;
+
+               g_variant_get(parameters, "(yqa(y)y)", &status, &addr16, &ep_iter, &count);
+               RETM_IF(NULL == ep_iter, "Invalid parameter !");
+
+               ep_list = calloc(count+1, sizeof(unsigned char));
+               RETM_IF(NULL == ep_list, "calloc() Fail(%d)", errno);
+
+               while (g_variant_iter_loop(ep_iter, "(y)", &value)) {
+                       ep_list[j] = value;
+                       j++;
+               }
+               g_variant_iter_free(ep_iter);
+
+               cb(status, addr16, count, ep_list, container->userdata);
+
+               if (ep_list) {
+                       free(ep_list);
+                       ep_list = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_SIMPLE_DESC_REQ: {
+               zb_zdo_simple_desc_cb cb = container->cb;
+
+               int j = 0;
+               int count;
+               unsigned short addr16;
+               unsigned short value;
+               GVariantIter *in_iter = NULL;
+               GVariantIter *out_iter = NULL;
+               struct zb_zdo_simple_desc_s * records;
+
+               records = calloc(1, sizeof(struct zb_zdo_simple_desc_s));
+               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
+
+               container->found = true;
+
+               g_variant_get(parameters, "(qiyyqqyyaqaq)", &addr16, &count,
+                               &records->device_ver,
+                               &records->ep, &records->profileid, &records->deviceid,
+                               &records->num_of_in_clusters, &records->num_of_out_clusters,
+                               &in_iter, &out_iter);
+               if (NULL == in_iter || NULL == out_iter) {
+                       ERR("Invalid parameter !");
+                       free(records);
+                       return;
+               }
+#if 0
+               records->in_clusters = calloc(records->num_of_in_clusters, sizeof(unsigned short));
+               if (NULL == records->in_clusters) {
+                       ERR("calloc() Fail(%d)", errno);
+                       g_variant_iter_free(in_iter);
+                       g_variant_iter_free(out_iter);
+                       return;
+               }
+               records->out_clusters = calloc(records->num_of_out_clusters, sizeof(unsigned short));
+               if (NULL == records->out_clusters) {
+                       ERR("calloc() Fail(%d)", errno);
+                       free(records->in_clusters);
+                       g_variant_iter_free(in_iter);
+                       g_variant_iter_free(out_iter);
+                       return;
+               }
+#endif
+               while (g_variant_iter_loop(in_iter, "q", &value)) {
+                       records->in_clusters[j] = value;
+                       j++;
+               }
+               g_variant_iter_free(in_iter);
+
+               j = 0;
+               while (g_variant_iter_loop(out_iter, "q", &value)) {
+                       records->out_clusters[j] = value;
+                       j++;
+               }
+               g_variant_iter_free(out_iter);
+
+               DBG("addr16=0x%x, count=%d, records->ep=%d, records->deviceid=0x%x",
+                       addr16, count, records->ep, records->deviceid);
+               for (j = 0; j < records->num_of_in_clusters; j++)
+                       DBG("in_clusters[%d] = 0x%x", j, records->in_clusters[j]);
+               for (j = 0; j < records->num_of_out_clusters; j++)
+                       DBG("out_clusters[%d] = 0x%x", j, records->out_clusters[j]);
+
+               cb(addr16, count, records, container->userdata);
+
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_MATCHED_DESCRIPTOR_REQ: {
+               zb_zdo_match_desc_cb cb = container->cb;
+
+               int j = 0;
+               int match_len;
+               zb_nwk_addr addr16;
+               unsigned char value;
+               unsigned char status;
+               GVariantIter *ml_iter = NULL;
+               unsigned char *match_list = NULL;
+               g_variant_get(parameters, "(yqya(y))", &status, &addr16, &value, &ml_iter);
+               match_len = value;
+
+               RETM_IF(NULL == ml_iter, "Invalid parameter !");
+
+               if (match_len > 0) {
+                       match_list = calloc(match_len+1, sizeof(unsigned char));
+                       RETM_IF(NULL == match_list, "calloc() Fail(%d)", errno);
+                       while (g_variant_iter_loop(ml_iter, "(y)", &value)) {
+                               match_list[j] = value;
+                               DBG("match_list[i]=%d", j, match_list[j]);
+                               j++;
+                       }
+               }
+
+               DBG("Match count : [%d]", match_len);
+               DBG("Match list  : [%p]", match_list);
+
+               cb(status, addr16, match_len, match_list, container->userdata);
+
+               if (match_list) {
+                       free(match_list);
+                       match_list = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_NODE_DESC_REQ: {
+               zb_zdo_node_desc_cb cb = container->cb;
+
+               zb_nwk_addr addr16;
+               unsigned char status;
+               struct zb_zdo_node_descriptor_s *desc;
+
+               desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s));
+               RETM_IF(NULL == desc, "calloc() Fail(%d)", errno);
+
+               container->found = true;
+
+               g_variant_get(parameters, "(yqyyyyyyqyqqqy)", &status, &addr16,
+                       &desc->logical_type, &desc->complex_desciptor_available,
+                       &desc->user_descriptor_available, &desc->aps_flags, &desc->frequency_band,
+                       &desc->mac_capability_flags, &desc->manufacturer_code, &desc->maximum_buffer_size,
+                       &desc->maximum_incoming_transfer_size, &desc->server_mask,
+                       &desc->maximum_outgoing_transfer_size, &desc->descriptor_capability_field);
+
+               cb(status, addr16, desc, container->userdata);
+
+               if (desc) {
+                       free(desc);
+                       desc = NULL;
+               }
+
+       }
+       break;
+       case ZBL_ZDO_POWER_DESC_REQ: {
+               zb_zdo_power_desc_cb cb = container->cb;
+
+               zb_nwk_addr addr16;
+               unsigned char status;
+               struct zb_zdo_node_power_descriptor_s *desc;
+
+               desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s));
+               RETM_IF(NULL == desc, "calloc() Fail(%d)", errno);
+
+               g_variant_get(parameters, "(yqyyyy)", &status, &addr16,
+                                       &desc->current_power_mode, &desc->available_power_sources,
+                                       &desc->current_power_source, &desc->current_power_source_level);
+
+               cb(status, addr16, desc, container->userdata);
+
+               if (desc) {
+                       free(desc);
+                       desc = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_COMPLEX_DESC_REQ: {
+               zb_zdo_complex_desc_cb cb = container->cb;
+
+               int length;
+               zb_nwk_addr addr16;
+               unsigned char j = 0;
+               unsigned char value;
+               unsigned char status;
+               GVariantIter *comp_iter = NULL;
+               unsigned char *complex_desc = NULL;
+
+               g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter);
+               RETM_IF(NULL == comp_iter, "Invalid parameter !");
+
+               if (length > 0) {
+                       complex_desc = calloc(length, sizeof(char));
+                       if (NULL == complex_desc) {
+                               g_variant_iter_free(comp_iter);
+                               ERR("calloc() Fail(%d)", errno);
+                               return;
+                       }
+
+                       while (g_variant_iter_loop(comp_iter, "(y)", &value)) {
+                               complex_desc[j] = value;
+                               j++;
+                       }
+                       g_variant_iter_free(comp_iter);
+               }
+
+               cb(status, addr16, length, complex_desc, container->userdata);
+
+               if (complex_desc) {
+                       free(complex_desc);
+                       complex_desc = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_USER_DESC_REQ: {
+               zb_zdo_user_desc_cb cb = container->cb;
+
+               int length;
+               zb_nwk_addr addr16;
+               unsigned char j = 0;
+               unsigned char value;
+               unsigned char status;
+               GVariantIter *comp_iter = NULL;
+               unsigned char *complex_desc = NULL;
+
+               g_variant_get(parameters, "(yqya(y))", &status, &addr16, &length, &comp_iter);
+               RETM_IF(NULL == comp_iter, "Invalid parameter !");
+
+               if (length > 0) {
+                       complex_desc = calloc(length, sizeof(char));
+                       if (NULL == complex_desc) {
+                               g_variant_iter_free(comp_iter);
+                               ERR("calloc() Fail(%d)", errno);
+                               return;
+                       }
+
+                       while (g_variant_iter_loop(comp_iter, "(y)", &value)) {
+                               complex_desc[j] = value;
+                               j++;
+                       }
+                       g_variant_iter_free(comp_iter);
+               }
+
+               cb(status, addr16, length, complex_desc, container->userdata);
+
+               if (complex_desc) {
+                       free(complex_desc);
+                       complex_desc = NULL;
+               }
+       break;
+       }
+       case ZBL_ZDO_USER_DESC_SET_REQ: {
+               zb_zdo_user_desc_conf_cb cb = container->cb;
+               unsigned char status;
+               g_variant_get(parameters, "(y)", &status);
+               cb(status, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_MGMT_BIND_REQ: {
+               zb_zdo_mgmt_bind_cb cb = container->cb;
+
+               unsigned char status;
+               unsigned char value;
+
+               int i = 0;
+               int j = 0;
+               unsigned char binding_table_enteries;
+               unsigned char binding_table_list_count;
+               unsigned char start_index;
+               unsigned short dst_addr16 = 0;
+               unsigned char dst_ep = 0;
+
+               GVariantIter *mac_iter = NULL;
+               GVariantIter *rsp_iter = NULL;
+               GVariantIter *destep_iter = NULL;
+               struct zb_zdo_binding_table_s **records = NULL;
+
+               g_variant_get(parameters, "(yyyya(ayyqyqayy))", &status,
+                               &binding_table_enteries, &start_index,
+                               &binding_table_list_count, &rsp_iter);
+               RETM_IF(NULL == rsp_iter, "Invalid parameter !");
+
+               if (binding_table_list_count > 0) {
+                       records = calloc(binding_table_list_count, sizeof(zb_zdo_binding_table_h));
+                       RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
+                       for (i = 0; i < binding_table_list_count; i++) {
+                               records[i] = calloc(binding_table_list_count, sizeof(struct zb_zdo_binding_table_s));
+                               if (NULL == records[i]) {
+                                       g_variant_iter_free(rsp_iter);
+                                       ERR("calloc() Fail(%d)", errno);
+                                       goto MGMT_NWK_BIND_REQ_OUT;
+                               }
+                       }
+               }
+
+               for (i = 0; i < binding_table_list_count; i++) {
+                       g_variant_iter_loop(rsp_iter, "(ayyqyqayy)", &mac_iter,
+                               &records[i]->src_ep, &records[i]->clusterid,
+                               &records[i]->dst_addr_mode, &dst_addr16,
+                               &destep_iter, &dst_ep);
+                       if (NULL == mac_iter) {
+                               ERR("Invalid parameter !");
+                               goto MGMT_NWK_BIND_REQ_OUT;
+                       }
+                       if (NULL == destep_iter) {
+                               ERR("Invalid parameter !");
+                               goto MGMT_NWK_BIND_REQ_OUT;
+                       }
+
+                       for (j = 0; j < 8; j++) {
+                               g_variant_iter_loop(mac_iter, "y", &value);
+                               records[i]->src_addr64[j] = value;
+                       }
+                       g_variant_iter_free(mac_iter);
+
+                       if (0x03 == records[i]->dst_addr_mode) {
+                               for (j = 0; j < 8; j++) {
+                                       g_variant_iter_loop(destep_iter, "y", &value);
+                                       records[i]->dst_addr64[j] = value;
+                               }
+                               g_variant_iter_free(destep_iter);
+
+                               records[i]->dst_ep = dst_ep;
+                               DBG("Destination MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
+                                       records[i]->dst_addr64[7], records[i]->dst_addr64[6],
+                                       records[i]->dst_addr64[5], records[i]->dst_addr64[4],
+                                       records[i]->dst_addr64[3], records[i]->dst_addr64[2],
+                                       records[i]->dst_addr64[1], records[i]->dst_addr64[0]);
+
+                       } else if (0x01 == records[i]->dst_addr_mode) {
+                               records[i]->dst_addr16 = dst_addr16;
+                       }
+               }
+               g_variant_iter_free(rsp_iter);
+
+               cb(status, binding_table_enteries, start_index, binding_table_list_count,
+                       (void **)records, container->userdata);
+
+MGMT_NWK_BIND_REQ_OUT:
+               for (i = 0; i < binding_table_list_count; i++) {
+                       if (records[i]) {
+                               free(records[i]);
+                               records[i] = NULL;
+                       }
+               }
+               free(records);
+               records = NULL;
+       }
+       break;
+       case ZBL_ZDO_MGMT_LQI_REQ: {
+               zb_zdo_mgmt_lqi_cb cb = container->cb;
+
+               int i = 0;
+               int j = 0;
+               unsigned char value;
+               unsigned char status;
+               unsigned char start_index;
+               unsigned char neighbor_table_enteries;
+               unsigned char neighbor_table_list_count;
+
+               GVariantIter *resp_iter = NULL;
+               GVariantIter *mac_iter = NULL;
+               GVariantIter *mac_iter1 = NULL;
+               struct zb_zdo_neighbor_table_desc_s **records = NULL;
+
+               g_variant_get(parameters, "(yyyya(ayayyqyyyyy))", &status, &neighbor_table_enteries,
+                               &start_index, &neighbor_table_list_count, &resp_iter);
+               RETM_IF(NULL == resp_iter, "Invalid parameter !");
+
+               if (neighbor_table_list_count > 0) {
+                       records = calloc(neighbor_table_list_count, sizeof(zb_zdo_neighbor_table_desc_h));
+                       RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
+                       for (i = 0; i < neighbor_table_list_count; i++) {
+                               records[i] = calloc(1, sizeof(struct zb_zdo_neighbor_table_desc_s));
+                               if (NULL == records[i]) {
+                                       ERR("calloc() Fail(%d)", errno);
+                                       goto MGMT_LQI_REQ_OUT;
+                               }
+                       }
+               }
+               for (i = 0; i < neighbor_table_list_count; i++) {
+                       g_variant_iter_loop(resp_iter, "(ayayyqyyyyy)",
+                                       &mac_iter, &mac_iter1,
+                                       &records[i]->device_type, &records[i]->addr16,
+                                       &records[i]->rx_on_when_idle, &records[i]->relationship,
+                                       &records[i]->permit_joining, &records[i]->depth,
+                                       &records[i]->lqi);
+                       if (NULL == mac_iter || NULL == mac_iter1) {
+                               ERR("Invalid parameter !");
+                               goto MGMT_LQI_REQ_OUT;
+                       }
+
+                       for (j = 0; j < 8; j++) {
+                               g_variant_iter_loop(mac_iter, "y", &value);
+                               records[i]->extended_pan_id[j] = value;
+                               g_variant_iter_loop(mac_iter1, "y", &value);
+                               records[i]->addr64[j] = value;
+                       }
+                       g_variant_iter_free(mac_iter);
+                       g_variant_iter_free(mac_iter1);
+
+                       DBG("ext PAN ID = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
+                               records[i]->extended_pan_id[0], records[i]->extended_pan_id[1],
+                               records[i]->extended_pan_id[2], records[i]->extended_pan_id[3],
+                               records[i]->extended_pan_id[4], records[i]->extended_pan_id[5],
+                               records[i]->extended_pan_id[6], records[i]->extended_pan_id[7]);
+
+                       DBG("IEEE address = %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
+                               records[i]->addr64[0], records[i]->addr64[1], records[i]->addr64[2],
+                               records[i]->addr64[3], records[i]->addr64[4], records[i]->addr64[5],
+                               records[i]->addr64[6], records[i]->addr64[7]);
+               }
+               g_variant_iter_free(resp_iter);
+
+               cb(status, neighbor_table_enteries, start_index, neighbor_table_list_count,
+                       (void **)records, container->userdata);
+
+MGMT_LQI_REQ_OUT:
+               if (records) {
+                       for (i = 0; i < neighbor_table_list_count; i++) {
+                               if (records[i]) {
+                                       free(records[i]);
+                                       records[i] = NULL;
+                               }
+                       }
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_MGMT_RTG_REQ: {
+               zb_zdo_mgmt_rtg_cb cb = container->cb;
+
+               int i;
+               unsigned char status;
+               unsigned char start_index;
+               unsigned char routing_table_enteries;
+               unsigned char routing_table_list_count;
+
+               GVariantIter *rsp_iter = NULL;
+               struct zb_zdo_routing_table_s **records = NULL;
+
+               g_variant_get(parameters, "(yyyya(qyyyyq))", &status, &routing_table_enteries,
+                               &start_index, &routing_table_list_count, &rsp_iter);
+               RETM_IF(NULL == rsp_iter, "Invalid parameter !");
+
+               if (routing_table_list_count > 0) {
+                       records = calloc(routing_table_list_count, sizeof(zb_zdo_routing_table_h));
+                       RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
+                       for (i = 0; i < routing_table_list_count; i++) {
+                               records[i] = calloc(1, sizeof(struct zb_zdo_routing_table_s));
+                               if (NULL == records[i]) {
+                                       ERR("calloc() Fail(%d)", errno);
+                                       goto MGMT_NWK_RTG_REQ_OUT;
+                               }
+                       }
+               }
+
+               for (i = 0; i < routing_table_list_count; i++) {
+                       g_variant_iter_loop(rsp_iter, "(qyyyyq)", &records[i]->dst_addr,
+                               &records[i]->status, &records[i]->memory_constrained,
+                               &records[i]->route_record_required,
+                               &records[i]->many_to_one, &records[i]->next_hop_addr);
+               }
+               g_variant_iter_free(rsp_iter);
+
+               cb(status, routing_table_enteries, start_index, routing_table_list_count,
+                       (void **)records, container->userdata);
+
+MGMT_NWK_RTG_REQ_OUT:
+               for (i = 0; i < routing_table_list_count; i++) {
+                       if (records[i]) {
+                               free(records[i]);
+                               records[i] = NULL;
+                       }
+               }
+               free(records);
+               records = NULL;
+       }
+       break;
+       case ZBL_ZDO_MGMT_NWK_DISC_REQ: {
+               zb_zdo_mgmt_nwk_disc_cb cb = container->cb;
+                       int i = 0;
+               int j = 0;
+               unsigned char value;
+               unsigned char status = 0;
+               unsigned char nwk_count = 0;
+               unsigned char start_index = 0;
+               unsigned char nwk_list_count = 0;
+
+               GVariantIter *mac_iter = NULL;
+               GVariantIter *resp_iter = NULL;
+
+               DBG("_zbl_mgmt_nwk_disc_req_cb()");
+
+               g_variant_get(parameters, "(yyyya(ayyyyyyy))", &status, &nwk_count,
+                       &start_index, &nwk_list_count, &resp_iter);
+               RETM_IF(NULL == resp_iter, "Invalid parameter !");
+
+               struct zb_zdo_network_list_record_s **records = NULL;
+
+               if (!status) {
+                       if (nwk_list_count > 0) {
+                               records = calloc(nwk_list_count, sizeof(zb_zdo_network_list_record_h));
+                               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
+                               for (i = 0; i < nwk_list_count; i++) {
+                                       records[i] = calloc(1, sizeof(struct zb_zdo_network_list_record_s));
+                                       if (NULL == records[i]) {
+                                               ERR("calloc() Fail(%d)", errno);
+                                               goto MGMT_NWK_DISC_REQ_OUT;
+                                       }
+                               }
+                       }
+                       for (i = 0; i < nwk_list_count; i++) {
+                               g_variant_iter_loop(resp_iter, "(ayyyyyyy)",
+                                       &mac_iter, &records[i]->logical_channel,
+                                       &records[i]->stack_profile, &records[i]->zigbee_version,
+                                       &records[i]->beacon_order,
+                                       &records[i]->superframe_order, &records[i]->permit_joining);
+                               if (NULL == mac_iter) {
+                                       ERR("Invalid parameter !");
+                                       goto MGMT_NWK_DISC_REQ_OUT;
+                               }
+
+                               for (j = 0; j < 8; j++) {
+                                       g_variant_iter_loop(mac_iter, "y", &value);
+                                       records[i]->extended_pan_id[j] = value;
+                               }
+                               g_variant_iter_free(mac_iter);
+                       }
+                       g_variant_iter_free(resp_iter);
+               }
+
+               cb(status, nwk_count, start_index, nwk_list_count,
+                       (void **)records, container->userdata);
+
+MGMT_NWK_DISC_REQ_OUT:
+               if (records) {
+                       for (i = 0; i < nwk_list_count; i++) {
+                               if (records[i]) {
+                                       free(records[i]);
+                                       records[i] = NULL;
+                               }
+                       }
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZDO_MGMT_PERMIT_JOIN_REQ: {
+               zb_zdo_mgmt_permit_joining_cb cb = container->cb;
+               unsigned char status;
+               g_variant_get(parameters, "(y)", &status);
+               cb(status, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_MGMT_LEAVE_REQ: {
+               zb_zdo_mgmt_leave_cb cb = container->cb;
+               unsigned char status;
+               g_variant_get(parameters, "(y)", &status);
+               cb(status, container->userdata);
+       }
+       break;
+       /* ZDO Bind */
+       case ZBL_ZDO_BIND_REQ: {
+               zb_zdo_bind_cb cb = container->cb;
+               unsigned char status;
+               g_variant_get(parameters, "(y)", &status);
+               cb(status, container->userdata);
+       }
+       break;
+       case ZBL_ZDO_UNBIND_REQ: {
+               zb_zdo_unbind_cb cb = container->cb;
+               unsigned char status;
+               g_variant_get(parameters, "(y)", &status);
+               cb(status, container->userdata);
+       }
+       break;
+       /* Custom */
+       case ZBL_CUSTOM_APS_SEND_REQ: {
+               zb_aps_send_cb cb = container->cb;
+
+               unsigned short addr16;
+               unsigned char src_ep;
+               unsigned char dst_ep;
+               unsigned short clusterid;
+               unsigned short profileid;
+               unsigned short payload_len = 0;
+               unsigned char *payload = NULL;
+
+               unsigned char value;
+               GVariantIter *payload_iter = NULL;
+               int i = 0;
+
+               g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep,
+                               &clusterid, &profileid, &payload_len, &payload_iter);
+               RETM_IF(NULL == payload_iter, "Invalid parameter !");
+
+               if (payload_len > 0) {
+                       payload = calloc(payload_len+1, sizeof(unsigned char));
+                       if (!payload) {
+                               ERR("calloc() Fail(%d)", errno);
+                               goto ZBL_CUSTOM_APS_SEND_REQ_OUT;
+                       }
+                       while (g_variant_iter_loop(payload_iter, "(y)", &value))
+                               payload[i++] = value;
+               }
+
+               cb(addr16, src_ep, dst_ep, clusterid, profileid, payload_len, payload,
+                       container->userdata);
+ZBL_CUSTOM_APS_SEND_REQ_OUT:
+               g_variant_iter_free(payload_iter);
+               if (payload) {
+                       free(payload);
+                       payload = NULL;
+               }
+       }
+       break;
+       case ZBL_CUSTOM_ZCL_SEND_REQ: {
+               zb_zcl_send_cb cb = container->cb;
+
+               unsigned short addr16;
+               unsigned char src_ep;
+               unsigned char dst_ep;
+               unsigned short clusterid;
+               unsigned short profileid;
+               unsigned short payload_len = 0;
+               unsigned char *payload = NULL;
+
+               unsigned char value;
+               GVariantIter *payload_iter = NULL;
+               int i = 0;
+
+               g_variant_get(parameters, "(qyyqqqa(y))", &addr16, &src_ep, &dst_ep,
+                               &clusterid, &profileid, &payload_len, &payload_iter);
+               RETM_IF(NULL == payload_iter, "Invalid parameter !");
+
+               if (payload_len > 0) {
+                       payload = calloc(payload_len + 1, sizeof(unsigned char));
+                       if (!payload) {
+                               ERR("calloc() Fail(%d)", errno);
+                               goto ZBL_CUSTOM_ZCL_SEND_REQ_OUT;
+                       }
+                       while (g_variant_iter_loop(payload_iter, "(y)", &value))
+                               payload[i++] = value;
+               }
+
+               cb(addr16, src_ep, dst_ep, clusterid, profileid, payload_len, payload,
+                       container->userdata);
+ZBL_CUSTOM_ZCL_SEND_REQ_OUT:
+               g_variant_iter_free(payload_iter);
+               if (payload) {
+                       free(payload);
+                       payload = NULL;
+               }
+       }
+       break;
+       case ZBL_CUSTOM_LOCAL_SEND_REQ: {
+               zb_send_to_local_cb cb = container->cb;
+
+               unsigned char *data = NULL;
+               unsigned short length = 0;
+               unsigned char value;
+               GVariantIter *payload_iter = NULL;
+               int i = 0;
+
+               g_variant_get(parameters, "(qa(y))", &length, &payload_iter);
+               RETM_IF(NULL == payload_iter, "Invalid parameter !");
+
+               if (length > 0) {
+                       data = calloc(length, sizeof(unsigned char));
+                       if (!data) {
+                               ERR("calloc() Fail(%d)", errno);
+                               goto ZBL_CUSTOM_LOCAL_SEND_REQ_OUT;
+                       }
+
+                       while (g_variant_iter_loop(payload_iter, "(y)", &value))
+                               data[i++] = value;
+               }
+
+               cb(length, data, container->userdata);
+ZBL_CUSTOM_LOCAL_SEND_REQ_OUT:
+               g_variant_iter_free(payload_iter);
+               if (data) {
+                       free(data);
+                       data = NULL;
+               }
+       }
+       break;
+       /* ZCL Global */
+       case ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ: {
+               zb_zcl_global_attr_read_cb cb = container->cb;
+
+               int j = 0;
+               int isString;
+               unsigned char value;
+
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned short attr_id;
+               unsigned short clusterid;
+               unsigned char status;
+               unsigned char type;
+               unsigned short count;
+               unsigned char attr_value[128];
+
+               GVariantIter *iter = NULL;
+               struct read_attribute_status_record_s *records = NULL;
+
+               g_variant_get(parameters, "(qya(y)qqyyqi)",
+                       &addr16, &ep, &iter, &attr_id, &clusterid, &status, &type, &count, &isString);
+               RETM_IF(NULL == iter, "Invalid parameter !");
+
+               if (!isString) {
+                       while (g_variant_iter_loop(iter, "(y)", &value)) {
+                               attr_value[j] = value;
+                               DBG("attr_value[%d] = 0x%02X", j, value);
+                               j++;
+                       }
+                       g_variant_iter_free(iter);
+               } else {
+                       while (g_variant_iter_loop(iter, "(y)", &value)) {
+                               if (j == 0)
+                                       count = value;
+                               attr_value[j] = value;
+                               DBG("attr_value[%d] = 0x%02X", j, value);
+                               j++;
+                       }
+                       g_variant_iter_free(iter);
+               }
+
+               records = calloc(1, sizeof(struct read_attribute_status_record_s));
+
+               if (!records) {
+                       ERR("calloc() Fail(%d)", errno);
+                       goto GLOBAL_READ_ATTRIBUTE_REQ_OUT;
+               }
+
+               records->id = attr_id;
+               records->status = status;
+               records->type = type;
+               records->value = attr_value;
+
+               cb(addr16, ep, clusterid, (void **)&records, count, container->userdata);
+
+GLOBAL_READ_ATTRIBUTE_REQ_OUT:
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ: {
+               zb_zcl_global_attr_write_cb cb = container->cb;
+
+               int i = 0;
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned short clusterid;
+               unsigned short attributeid;
+               int count;
+               unsigned char value;
+
+               GVariantIter *stat_iter = NULL;
+               GVariantIter *attr_iter = NULL;
+               struct write_attribute_status_record_s *records = NULL;
+
+               g_variant_get(parameters, "(qya(y)aqqi)",
+                       &addr16, &ep, &stat_iter, &attr_iter, &clusterid, &count);
+               RETM_IF(NULL == stat_iter, "Invalid parameter !");
+               RETM_IF(NULL == attr_iter, "Invalid parameter !");
+
+               records = calloc(count,
+                       sizeof(struct write_attribute_status_record_s));
+               if (!records) {
+                       g_variant_iter_free(stat_iter);
+                       g_variant_iter_free(attr_iter);
+                       ERR("calloc() Fail(%d)", errno);
+                       goto GLOBAL_WRITE_ATTRIBUTE_REQ_OUT;
+               }
+
+               while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
+                       records[i].status = value;
+                       i++;
+               }
+               g_variant_iter_free(stat_iter);
+
+               i = 0;
+               while (g_variant_iter_loop(attr_iter, "q", &attributeid)) {
+                       records[i].id = attributeid;
+                       DBG("Attribute Id 0x%04X", attributeid);
+                       i++;
+               }
+               g_variant_iter_free(attr_iter);
+
+               cb(addr16, ep, clusterid, (void **)&records, count, container->userdata);
+
+GLOBAL_WRITE_ATTRIBUTE_REQ_OUT:
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ: {
+               int j = 0;
+               int l = 0;
+               int k = 0;
+               int rec_len;
+
+               unsigned char ep;
+               unsigned short clusterid;
+               unsigned short attIdVal;
+               unsigned char value;
+
+               GVariantIter *stat_iter = NULL;
+               GVariantIter *attr_iter = NULL;
+               GVariantIter *dir_iter = NULL;
+
+               zb_nwk_addr addr16;
+               zb_zcl_global_config_report_write_cb cb = container->cb;
+               struct reporting_configuration_response_record_s *records = NULL;
+
+               g_variant_get(parameters, "(a(y)aqa(y)qiqy)",
+                       &stat_iter, &attr_iter, &dir_iter, &clusterid, &rec_len, &addr16, &ep);
+               RETM_IF(NULL == stat_iter, "Invalid parameter !");
+               RETM_IF(NULL == attr_iter, "Invalid parameter !");
+               RETM_IF(NULL == dir_iter, "Invalid parameter !");
+
+               records = calloc(rec_len,
+                       sizeof(struct reporting_configuration_response_record_s));
+               if (!records) {
+                       g_variant_iter_free(stat_iter);
+                       g_variant_iter_free(attr_iter);
+                       g_variant_iter_free(dir_iter);
+                       ERR("calloc() Fail(%d)", errno);
+                       goto GLOBAL_CONFIGURE_REPORTING_REQ_OUT;
+               }
+
+               while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
+                       DBG("Value 0x%02X", value);
+                       records[j].status = value;
+                       j++;
+               }
+               g_variant_iter_free(stat_iter);
+
+               while (g_variant_iter_loop(attr_iter, "q", &attIdVal)) {
+                       if (records[l].status != ZB_ZCL_STATUS_SUCCESS)
+                               records[l].id = attIdVal;
+                       l++;
+               }
+               g_variant_iter_free(attr_iter);
+
+               while (g_variant_iter_loop(dir_iter, "(y)", &value)) {
+                       if (records[k].status != ZB_ZCL_STATUS_SUCCESS)
+                               records[k].dir = value;
+                       k++;
+               }
+               g_variant_iter_free(dir_iter);
+
+               cb(addr16, ep, clusterid, (void **)&records, rec_len, container->userdata);
+
+GLOBAL_CONFIGURE_REPORTING_REQ_OUT:
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ: {
+
+               int j = 0;
+               int l = 0;
+               int count;
+               unsigned short clusterid;
+               unsigned short attributeid;
+               unsigned char value;
+               int discovery_complete;
+
+               GVariantIter *stat_iter = NULL;
+               GVariantIter *attr_iter = NULL;
+
+               zb_nwk_addr addr16;
+               unsigned char ep;
+
+               zb_zcl_global_attr_discover_cb cb = container->cb;
+               struct discover_attribute_info_record_s **records = NULL;
+
+               g_variant_get(parameters, "(qya(y)aqqii)",  &addr16, &ep, &stat_iter,
+                                               &attr_iter, &clusterid, &count, &discovery_complete);
+               RETM_IF(NULL == stat_iter, "Invalid parameter !");
+               RETM_IF(NULL == attr_iter, "Invalid parameter !");
+
+               records = calloc(count, sizeof(zb_zcl_discover_attr_info_record_h));
+               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
+               for (j = 0; j < count; j++) {
+                       records[j] = calloc(1, sizeof(struct discover_attribute_info_record_s));
+                       if (NULL == records[j]) {
+                               ERR("calloc() Fail(%d)", errno);
+                               for (l = 0; l < j; l++) {
+                                       free(records[l]);
+                                       records[l] = NULL;
+                               }
+                               free(records);
+                               records = NULL;
+
+                               g_variant_iter_free(stat_iter);
+                               g_variant_iter_free(attr_iter);
+                               return;
+                       }
+               }
+
+               j = 0;
+               while (g_variant_iter_loop(stat_iter, "(y)", &value)) {
+                       records[j]->type = value;
+                       DBG("Attribute Type 0x%02X", value);
+                       j++;
+               }
+               g_variant_iter_free(stat_iter);
+
+               while (g_variant_iter_loop(attr_iter, "q", &attributeid)) {
+                       records[l]->id = attributeid;
+                       DBG("Attribute Id 0x%04X", attributeid);
+                       l++;
+               }
+               g_variant_iter_free(attr_iter);
+
+               cb(addr16, ep, clusterid, discovery_complete, (void *)records, count,
+                       container->userdata);
+
+               for (j = 0; j < count; j++) {
+                       if (records[j]) {
+                               free(records[j]);
+                               records[j] = NULL;
+                       }
+               }
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_STRUCTURED_REQ: {
+               /* CAUTION: Currently we don't support this command */
+               zb_zcl_global_attr_write_cb cb = container->cb;
+               cb(0, 0, 0, NULL, 0, container->userdata);
+       }
+       break;
+       /* GLOBAL_DISCOVER_COMMAND_RECEIVED and GLOBAL_DISCOVER_COMMAND_GENERATED should be handled as same way */
+       case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ:
+       case ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ: {
+
+               int j = 0;
+               char value;
+               unsigned short clusterid;
+               unsigned short cmd_len;
+               unsigned char *cmd_data;
+               unsigned char discoveryComplete;
+
+               GVariantIter *cmd_iter = NULL;
+
+               unsigned char ep;
+               zb_nwk_addr addr16;
+               zb_zcl_global_discover_cmds_cb cb = container->cb;
+
+               g_variant_get(parameters, "(a(y)qqqyy)", &cmd_iter, &clusterid, &cmd_len,
+                       &addr16, &ep, &discoveryComplete);
+               RETM_IF(NULL == cmd_iter, "Invalid parameter !");
+
+               cmd_data = calloc(cmd_len+1, sizeof(char));
+               if (NULL == cmd_data) {
+                       ERR("calloc() Fail(%d)", errno);
+                       g_variant_iter_free(cmd_iter);
+                       return;
+               }
+
+               while (g_variant_iter_loop(cmd_iter, "(y)", &value)) {
+                       DBG("Value 0x%02X", value);
+                       cmd_data[j] = value;
+                       j++;
+               }
+               g_variant_iter_free(cmd_iter);
+
+               cb(addr16, ep, clusterid, discoveryComplete, cmd_data, cmd_len,
+                       container->userdata);
+               if (cmd_data) {
+                       free(cmd_data);
+                       cmd_data = NULL;
+               }
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ: {
+
+               int i = 0;
+               int j = 0;
+               unsigned short clusterid;
+               unsigned char t_value;
+               unsigned char ac_value;
+
+               unsigned short rec_len;
+               unsigned short attr_data;
+               unsigned char discoveryComplete;
+               GVariantIter *attr_iter = NULL;
+               GVariantIter *type_iter = NULL;
+               GVariantIter *ac_iter = NULL;
+
+               unsigned char ep;
+               zb_nwk_addr addr16;
+               struct extended_attribute_infomation_s **records = NULL;
+               zb_zcl_global_attr_extended_discover_cb cb = container->cb;
+
+               DBG("Will get the value now");
+
+               g_variant_get(parameters, "(aqa(y)a(y)qqqyy)", &attr_iter, &type_iter, &ac_iter,
+                       &clusterid, &rec_len, &addr16, &ep, &discoveryComplete);
+               RETM_IF(NULL == attr_iter, "Invalid parameter !");
+               RETM_IF(NULL == type_iter, "Invalid parameter !");
+               RETM_IF(NULL == ac_iter, "Invalid parameter !");
+
+               DBG("records length 0x%04X", rec_len);
+
+               records = calloc(rec_len, sizeof(zb_zcl_extended_attr_info_h));
+               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
+               for (j = 0; j < rec_len; j++) {
+                       records[j] = calloc(1, sizeof(struct extended_attribute_infomation_s));
+                       if (NULL == records[j]) {
+                               for (i = 0; i < j; i++) {
+                                       free(records[i]);
+                                       records[i] = NULL;
+                               }
+                               free(records);
+                               records = NULL;
+
+                               g_variant_iter_free(attr_iter);
+                               g_variant_iter_free(type_iter);
+                               g_variant_iter_free(ac_iter);
+
+                               ERR("calloc() Fail(%d)", errno);
+                               return;
+                       }
+               }
+
+               j = 0;
+               while (g_variant_iter_loop(attr_iter, "q", &attr_data)
+                               && g_variant_iter_loop(type_iter, "(y)", &t_value)
+                               && g_variant_iter_loop(ac_iter, "(y)", &ac_value)) {
+                       DBG("attrData 0x%04X", attr_data);
+                       DBG("t_value 0x%02X", t_value);
+                       DBG("ac_value 0x%02X", ac_value);
+                       records[j]->id = attr_data;
+                       records[j]->type = t_value;
+                       records[j]->acl = ac_value;
+                       j++;
+               }
+               g_variant_iter_free(attr_iter);
+               g_variant_iter_free(type_iter);
+               g_variant_iter_free(ac_iter);
+
+               cb(addr16, ep, clusterid, discoveryComplete, (void *)records, rec_len,
+                       container->userdata);
+
+               for (j = 0; j < rec_len; j++) {
+                       if (records[j]) {
+                               free(records[j]);
+                               records[j] = NULL;
+                       }
+               }
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       case ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ: {
+
+               int i = 0;
+               int j = 0;
+               char value;
+               unsigned char *status = NULL;
+               unsigned char *data_size = NULL;
+               unsigned char *change = NULL;
+               unsigned short record_length;
+
+               GVariantIter *resp_iter = NULL;
+               GVariantIter *data_iter = NULL;
+
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned short clusterid;
+               zb_zcl_global_attr_read_cb cb = container->cb;
+
+               struct reporting_configuration_record_s **records = NULL;
+
+               g_variant_get(parameters, "(qyqqa(yyqyqqayq))",
+                       &addr16, &ep, &clusterid, &record_length, &resp_iter);
+               RETM_IF(NULL == resp_iter, "Invalid parameter !");
+
+               records = calloc(record_length, sizeof(zb_zcl_reporting_config_record_h));
+               RETM_IF(NULL == records, "calloc() Fail(%d)", errno);
+
+               for (i = 0; i < record_length; i++) {
+                       records[i] = calloc(1, sizeof(struct reporting_configuration_record_s));
+                       if (NULL == records[i]) {
+                               ERR("calloc() Fail(%d)", errno);
+                               goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
+                       }
+               }
+
+               DBG("record_length %d", record_length);
+               status = calloc(record_length, sizeof(unsigned char));
+               data_size = calloc(record_length, sizeof(unsigned char));
+               if (!status || !data_size) {
+                       ERR("Couldn't allocate the memory (%s)", errno);
+                       goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
+               }
+
+               for (i = 0; i < record_length; i++) {
+                       g_variant_iter_loop(resp_iter, "(yyqyqqayq)", &status[i], &records[i]->dir,
+                               &records[i]->id, &records[i]->type, &records[i]->max_i, &records[i]->min_i,
+                               &data_iter, &records[i]->to);
+                       if (NULL == data_iter) {
+                               ERR("Invalid parameter !");
+                               goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
+                       }
+
+                       if (records[i]->dir != ZCL_REPORTING_DIRECTION_REPORTED &&
+                               (zb_zcl_get_analog_or_discret(records[i]->type) == ZB_ZCL_DATA_TYPE_ANALOG)) {
+                               data_size[i] = zb_zcl_get_data_size(records[j]->type);
+                               j = 0;
+                               if (data_size[i] != 0xff) {
+                                       change = calloc(data_size[i]+1, sizeof(unsigned char));
+                                       if (!change) {
+                                               ERR("calloc() Fail(%d)", errno);
+                                               records[i]->change = NULL;
+                                               g_variant_iter_free(data_iter);
+                                               goto GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT;
+                                       }
+
+                                       while (g_variant_iter_loop(data_iter, "y", &value)) {
+                                               change[j] = value;
+                                               j++;
+                                       }
+                                       g_variant_iter_free(data_iter);
+                                       records[i]->change = change;
+                               } else
+                                       records[i]->change = NULL;
+                       } else
+                               records[i]->change = NULL;
+               }
+               g_variant_iter_free(resp_iter);
+
+               cb(addr16, ep, clusterid, (void **)records, record_length, container->userdata);
+
+GLOBAL_READ_CONFIGURE_REPORTING_REQ_OUT:
+               if (data_size) {
+                       free(data_size);
+                       data_size = NULL;
+               }
+               if (status) {
+                       free(status);
+                       status = NULL;
+               }
+
+               for (i = 0; i < record_length; i++) {
+                       if (records[i] && records[i]->change) {
+                               free(records[i]->change);
+                               records[i]->change = NULL;
+                       }
+                       if (records[i]) {
+                               free(records[i]);
+                               records[i] = NULL;
+                       }
+               }
+               if (records) {
+                       free(records);
+                       records = NULL;
+               }
+       }
+       break;
+       /* ZCL Alarm */
+       case ZBL_ZCL_ALARM_GET_ALARM_REQ: {
+
+               zb_nwk_addr addr16 = 0;
+               unsigned char ep = 0;
+               unsigned char status = 0;
+               unsigned char alarm_code = 0;
+               unsigned short clusterid = 0;
+               unsigned int time_stamp = 0;
+
+               zb_zcl_alarm_get_alarm_cb cb = container->cb;
+
+               g_variant_get(parameters, "(qyyyqu)", &addr16, &ep, &status, &alarm_code,
+                                       &clusterid, &time_stamp);
+               cb(addr16, ep, status, alarm_code, clusterid, time_stamp, container->userdata);
+       }
+       break;
+       /* ZCL Doorlock */
+       case ZBL_ZCL_DOORLOCK_LOCK_STATE: {
+               ERR("Unhandled cid = %d", container->cid);
+       }
+       break;
+       /* ZCL Fanmode */
+       case ZBL_ZCL_FANMODE_FAN_MODE_STATE: {
+               ERR("Unhandled cid = %d", container->cid);
+       }
+       break;
+       /* ZCL Group */
+       case ZBL_ZCL_GROUP_ADD_GROUP_REQ: {
+               zb_zcl_group_add_group_cb cb = container->cb;
+
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned char status;
+               unsigned short group_id;
+
+               g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
+               cb(addr16, ep, status, group_id, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_GROUP_VIEW_GROUP_REQ: {
+               zb_zcl_group_view_group_cb cb = container->cb;
+
+               int j = 0;
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned char value;
+               unsigned char status;
+               unsigned short group_id;
+               char *group_name = NULL;
+               GVariantIter *grpNameiter = NULL;
+
+               g_variant_get(parameters, "(qyyqay)", &addr16, &ep, &status, &group_id, &grpNameiter);
+               if (NULL == grpNameiter) {
+                       ERR("Invalid grpNameiter");
+                       goto GROUP_VIEW_GROUP_REQ_OUT;
+               }
+
+               g_variant_iter_loop(grpNameiter, "y", &value);
+               /* first byte indicates the length of the string */
+               if ((value - '0') > 0) {
+                       DBG("Value %d ", (value - '0'));
+                       group_name = calloc((value - '0') + 1, sizeof(char));
+                       if (NULL == group_name) {
+                               g_variant_iter_free(grpNameiter);
+                               ERR("calloc() Fail(%d)", errno);
+                               goto GROUP_VIEW_GROUP_REQ_OUT;
+                       }
+                       group_name[j] = value;
+                       j++;
+                       while (g_variant_iter_loop(grpNameiter, "y", &value) && (j <= (value - '0'))) {
+                               group_name[j] = value;
+                               DBG("Name %c", group_name[j]);
+                               j++;
+                       }
+                       g_variant_iter_free(grpNameiter);
+               } else {
+                       group_name = calloc(2, sizeof(char));
+                       if (NULL == group_name) {
+                               g_variant_iter_free(grpNameiter);
+                               ERR("calloc() Fail(%d)", errno);
+                               goto GROUP_VIEW_GROUP_REQ_OUT;
+                       }
+                       group_name[j++] = value;
+                       group_name[j++] = '\0';
+               }
+
+               DBG("GroupName = %s", group_name);
+               cb(addr16, ep, status, group_id, group_name, container->userdata);
+
+GROUP_VIEW_GROUP_REQ_OUT:
+               if (group_name) {
+                       free(group_name);
+                       group_name = NULL;
+               }
+       }
+       break;
+       case ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ: {
+               zb_zcl_group_get_group_membership_cb cb = container->cb;
+
+               int j = 0;
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned short gl_value;
+               unsigned char capacity;
+               unsigned char group_count;
+               unsigned short *grouplist = NULL;
+               GVariantIter *grpListiter = NULL;
+
+               g_variant_get(parameters, "(qyyyaq)", &addr16, &ep, &capacity, &group_count, &grpListiter);
+               RETM_IF(NULL == grpListiter, "Invalid parameter !");
+
+               if (group_count > 0) {
+                       grouplist = calloc(group_count+1, sizeof(unsigned short));
+                       if (NULL == grouplist) {
+                               g_variant_iter_free(grpListiter);
+                               ERR("calloc() Fail(%d)", errno);
+                               return;
+                       }
+                       RETM_IF(NULL == grouplist, "calloc() Fail(%d)", errno);
+
+                       while (g_variant_iter_loop(grpListiter, "q", &gl_value)) {
+                               grouplist[j] = gl_value;
+                               j++;
+                       }
+                       g_variant_iter_free(grpListiter);
+               }
+
+               cb(addr16, ep, capacity, group_count, grouplist, container->userdata);
+
+               if (grouplist) {
+                       free(grouplist);
+                       grouplist = NULL;
+               }
+       }
+       break;
+       case ZBL_ZCL_GROUP_REMOVE_GROUP_REQ: {
+               zb_zcl_group_remove_group_cb cb = container->cb;
+
+               zb_nwk_addr addr16;
+               unsigned char ep;
+               unsigned char status;
+               unsigned short group_id;
+
+               g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
+
+               cb(addr16, ep, status, group_id, container->userdata);
+       }
+       break;
+       /* ZCL Identify */
+       case ZBL_ZCL_IDENTIFY_QUERY_REQ: {
+               zb_zcl_identify_query_cb cb = container->cb;
+
+               zb_nwk_addr addr16 = 0;
+               unsigned short identify_time = 0;
+               g_variant_get(parameters, "(qq)", &addr16, &identify_time);
+
+               cb(addr16, identify_time, container->userdata);
+       }
+       break;
+       /* ZCL On/Off */
+       case ZBL_ZCL_ON_OFF_GET_ON_OFF_STATE: {
+               ERR("Unhandled cid = %d", container->cid);
+       }
+       break;
+       /* ZCL Pollcontrol */
+       case ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ: {
+               zb_zcl_pollctrl_check_in_cb cb = container->cb;
+
+               zb_nwk_addr addr16 = 0;
+               unsigned char ep = 0;
+
+               g_variant_get(parameters, "(qy)", &addr16, &ep);
+               cb(addr16, ep, container->userdata);
+       }
+       break;
+       /* ZCL Scene */
+       case ZBL_ZCL_SCENE_ADD_SCENE_REQ: {
+               zb_zcl_scene_add_scene_cb cb = container->cb;
+
+               zb_nwk_addr addr16 = 0;
+               unsigned char ep;
+               unsigned char status;
+               unsigned short group_id;
+               unsigned char scene_id;
+
+               g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status,     &group_id, &scene_id);
+               cb(addr16, ep, status, group_id, scene_id, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_VIEW_SCENE_REQ: {
+               zb_zcl_scene_view_scene_cb cb = container->cb;
+
+               int j = 0;
+               int len;
+               zb_nwk_addr addr16 = 0;
+               unsigned char ep;
+               unsigned char status;
+               unsigned short group_id;
+               unsigned char scene_id;
+               unsigned short transition_time = 0;
+               unsigned char value;
+               unsigned short ext_len = 0;
+               char *scene_name = NULL;
+               char *extendedFieldSets = NULL;
+               GVariantIter *sceneNameIter = NULL;
+               GVariantIter *extendedSetIter = NULL;
+
+               g_variant_get(parameters, "(qyyqyqa(y)ya(y))", &addr16, &ep, &status, &group_id, &scene_id,
+                       &transition_time, &sceneNameIter, &ext_len, &extendedSetIter);
+
+               if (!g_variant_iter_loop(sceneNameIter, "(y)", &value)) {
+                       ERR("There is no scene data");
+                       return;
+               }
+
+               /** first byte indicates the length of the string */
+               len = value -'0';
+               if (0 < len) {
+                       scene_name = calloc(len + 1, sizeof(char));
+                       if (NULL == scene_name) {
+                               ERR("calloc() Fail(%d)", errno);
+                               goto SCENE_VIEW_SCENE_REQ_OUT;
+                       }
+                       scene_name[j] = value;
+                       j++;
+                       while (g_variant_iter_loop(sceneNameIter, "(y)", &value)) {
+                               scene_name[j] = value;
+                               j++;
+                       }
+               } else {
+                       scene_name = calloc(1 + 1, sizeof(char));
+                       if (NULL == scene_name) {
+                               ERR("calloc() Fail(%d)", errno);
+                               goto SCENE_VIEW_SCENE_REQ_OUT;
+                       }
+                       scene_name[j] = value;
+               }
+
+               j = 0;
+               if (0 < ext_len) {
+                       extendedFieldSets = calloc(ext_len + 1, sizeof(char));
+                       if (NULL == extendedFieldSets) {
+                               ERR("calloc() Fail(%d)", errno);
+                               goto SCENE_VIEW_SCENE_REQ_OUT;
+                       }
+                       while (g_variant_iter_loop(extendedSetIter, "(y)", &value)) {
+                               extendedFieldSets[j] = value;
+                               j++;
+                       }
+               }
+
+               cb(addr16, ep, status, group_id, scene_id, transition_time, scene_name,
+                               extendedFieldSets, ext_len, container->userdata);
+
+SCENE_VIEW_SCENE_REQ_OUT:
+               if (scene_name) {
+                       free(scene_name);
+                       scene_name = NULL;
+               }
+
+               if (extendedFieldSets) {
+                       free(extendedFieldSets);
+                       extendedFieldSets = NULL;
+               }
+       }
+       break;
+       case ZBL_ZCL_SCENE_REMOVE_SCENE_REQ: {
+               zb_zcl_scene_remove_scene_cb cb = container->cb;
+
+               zb_nwk_addr addr16 = 0;
+               unsigned char ep;
+               unsigned char status;
+               unsigned short group_id;
+               unsigned char scene_id;
+
+               g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id);
+               cb(addr16, ep, status, group_id, scene_id, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_STORE_SCENE_REQ: {
+               zb_zcl_scene_store_scene_cb cb = container->cb;
+
+               zb_nwk_addr addr16 = 0;
+               unsigned char ep;
+               unsigned char status;
+               unsigned short group_id;
+               unsigned char scene_id;
+
+               g_variant_get(parameters, "(qyyqy)", &addr16, &ep, &status, &group_id, &scene_id);
+               cb(addr16, ep, status, group_id, scene_id, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ: {
+               zb_zcl_scene_remove_all_scene_cb cb = container->cb;
+
+               zb_nwk_addr addr16 = 0;
+               unsigned char ep;
+               unsigned char status;
+               unsigned short group_id;
+
+               g_variant_get(parameters, "(qyyq)", &addr16, &ep, &status, &group_id);
+               cb(addr16, ep, status, group_id, container->userdata);
+       }
+       break;
+       case ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ: {
+               zb_zcl_scene_get_scene_membership_cb cb = container->cb;
+
+               int j = 0;
+               zb_nwk_addr addr16 = 0;
+               unsigned char ep;
+               unsigned char status;
+               unsigned short group_id;
+               unsigned char capacity;
+               unsigned char value;
+               unsigned char scene_count = 0;
+               unsigned char *scene_list = NULL;
+               GVariantIter *sceneListIter = NULL;
+
+               g_variant_get(parameters, "(qyyyqya(y))", &addr16, &ep, &status, &capacity, &group_id,
+                       &scene_count, &sceneListIter);
+
+               if (0 < scene_count) {
+                       scene_list = calloc(scene_count+1, sizeof(char));
+                       if (NULL == scene_list) {
+                               ERR("calloc() Fail(%d)", errno);
+                               goto SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT;
+                       }
+                       while (g_variant_iter_loop(sceneListIter, "(y)", &value)) {
+                               scene_list[j] = value;
+                               DBG("Scene_List 0x%02X", scene_list[j]);
+                               j++;
+                       }
+               }
+
+               cb(addr16, ep, status, capacity, group_id, scene_count, scene_list, container->userdata);
+SCENE_GET_SCENE_MEMBERSHIP_REQ_OUT:
+               if (scene_list) {
+                       free(scene_list);
+                       scene_list = NULL;
+               }
+       }
+       break;
+       /* ZCL Thermostat */
+       case ZBL_ZCL_THERMOSTAT_GET_LOCAL_TEMP: {
+               ERR("Unhandled cid = %d", container->cid);
+       }
+       break;
+       default:
+               ERR("Unhandled cid = %d", container->cid);
+       }
+}
+
+static int _check_zigbee_privilege()
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       DBG("_check_zigbee_privilege()");
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "check_privilege",
+                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+       if (!variant) {
+               ERR("Failed to check_zigbee_privilege [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+       }
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler)
+{
+       struct zbl_zigbee_s *h = handle;
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       h->event_handler = event_handler;
+       return ZIGBEE_ERROR_NONE;
+}
+
+int zbl_enable(zb_zigbee_h handle)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_enable()");
+
+       variant = g_dbus_connection_call_sync(gdbus_conn,
+               ZIGBEE_MANAGER_INTERFACE,
+               ZIGBEE_DBUS_OBJPATH,
+               ZIGBEE_MANAGER_INTERFACE,
+               "enable",
+               NULL, NULL,
+               G_DBUS_CALL_FLAGS_NONE,
+               -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'enable' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_disable(void)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_disable()");
+
+       variant = g_dbus_connection_call_sync(gdbus_conn,
+               ZIGBEE_MANAGER_INTERFACE,
+               ZIGBEE_DBUS_OBJPATH,
+               ZIGBEE_MANAGER_INTERFACE,
+               "disable",
+               NULL, NULL,
+               G_DBUS_CALL_FLAGS_NONE,
+               -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'disable' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_hw_reset(void)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "zb_hw_reset", NULL,
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'zb_hw_reset' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_get_network_info(zb_ieee_addr addr64, zb_nwk_addr *nodeid, zb_nwk_addr *panid,
+               unsigned char *channel, unsigned char *tx_power)
+{
+       GVariant *variant = NULL;
+       GVariantIter *iter = NULL;
+       GError *dbus_err = NULL;
+       int result = ZIGBEE_ERROR_NONE;
+
+       zb_nwk_addr _nodeid;
+       zb_nwk_addr _panid;
+       unsigned char _radio_channel;
+       unsigned char _radio_tx_power;
+       unsigned char value;
+       int i = 0;
+
+       DBG("zbl_get_network_info()");
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_network_info",
+                               NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to 'get_network_info' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(ia(y)qqyy)", &result, &iter,
+                               &_nodeid, &_panid, &_radio_channel, &_radio_tx_power);
+       RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
+
+       /* Get EUI */
+       i = 0;
+       while (g_variant_iter_loop(iter, "(y)", &value)) {
+               addr64[i] = value;
+               i++;
+       }
+       g_variant_iter_free(iter);
+
+       DBG("  Result: [%X]", result);
+       DBG("  EUI(%d) : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", i,
+                       addr64[0], addr64[1], addr64[2], addr64[3],
+                       addr64[4], addr64[5], addr64[6], addr64[7]);
+       DBG("  nodeID [0x%04X]", _nodeid);
+       DBG("  PanID [0x%04X]", _panid);
+       DBG("  Channel [%d] Tx Power [%d]", _radio_channel, _radio_tx_power);
+
+       if (nodeid)
+               *nodeid = _nodeid;
+       if (panid)
+               *panid = _panid;
+       if (channel)
+               *channel = _radio_channel;
+       if (tx_power)
+               *tx_power = _radio_tx_power;
+
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_get_controller_mac_address(zb_ieee_addr addr64)
+{
+       GVariant *variant = NULL;
+       GVariantIter *iter = NULL;
+       GError *dbus_err = NULL;
+
+       char value;
+       int j = 0;
+       int result = ZIGBEE_ERROR_NONE;
+
+       DBG("zbl_get_controller_mac_address()");
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_mac",
+                       NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get_mac [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+       g_variant_get(variant, "(ia(y))", &result, &iter);
+       RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
+
+       while (g_variant_iter_loop(iter, "(y)", &value)) {
+               addr64[j] = value;
+               j++;
+       }
+       g_variant_iter_free(iter);
+
+       DBG("IEEE ADDR 0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X, Ret=%d ",
+               addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5],
+               addr64[6], addr64[7], result);
+
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_get_cluster_list(zb_ieee_addr eui64, unsigned char endpoint,
+               unsigned char *in_cluster_count, unsigned short in_cluster_list[],
+               unsigned char *out_cluster_count, unsigned short out_cluster_list[])
+{
+       GVariant *variant = NULL;
+       GVariantBuilder *mac_builder = NULL;
+       GVariant *mac_variant = NULL;
+       GVariantIter *in_cluster_iter = NULL;
+       GVariantIter *out_cluster_iter = NULL;
+       GError *dbus_err = NULL;
+       unsigned short cluster = 0;
+       int i = 0;
+       int result = 0;
+       int ret = ZIGBEE_ERROR_NONE;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       g_variant_builder_add(mac_builder, "(y)", eui64[7]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[6]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[5]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[4]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[3]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[2]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[1]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[0]);
+       mac_variant = g_variant_builder_end(mac_builder);
+       g_variant_builder_unref(mac_builder);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_cluster_list",
+                               g_variant_new("(@a(y)y)", mac_variant, endpoint), G_DBUS_CALL_FLAGS_NONE,
+                               -1, NULL, &dbus_err);
+
+       if (variant) {
+               g_variant_get(variant, "(iaqaq)", &result, &in_cluster_iter, &out_cluster_iter);
+               RETVM_IF(NULL == in_cluster_iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
+               RETVM_IF(NULL == out_cluster_iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
+
+               DBG("ret = [0x%x]", result);
+
+               /* In clusters */
+               while (g_variant_iter_loop(in_cluster_iter, "q", &cluster)) {
+                       DBG("In Cluster 0x%04X", cluster);
+                       in_cluster_list[i++] = cluster;
+               }
+               g_variant_iter_free(in_cluster_iter);
+               *in_cluster_count = i;
+               if (0 == i)
+                       ERR("No In Clusters for Endpoint %0X", endpoint);
+
+               /* Out clusters */
+               i = 0;
+               while (g_variant_iter_loop(out_cluster_iter, "q", &cluster)) {
+                       DBG("Out Cluster 0x%04X", cluster);
+                       out_cluster_list[i++] = cluster;
+               }
+               g_variant_iter_free(out_cluster_iter);
+               *out_cluster_count = i;
+               if (0 == i)
+                       ERR("No Out Clusters for Endpoint %0X", endpoint);
+
+               g_variant_unref(variant);
+       } else {
+               ERR("No In/Out Clusters for Endpoint %0X [%s]", endpoint, dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       ret = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       ret = ZIGBEE_ERROR_NONE;
+
+               g_error_free(dbus_err);
+
+               *in_cluster_count = 0;
+               *out_cluster_count = 0;
+       }
+
+       return ret;
+}
+
+int zbl_get_endpoint_list(zb_ieee_addr eui64, unsigned char *count, unsigned char list[])
+{
+       GVariant *variant = NULL;
+       GVariantBuilder *mac_builder = NULL;
+       GVariant *mac_variant = NULL;
+       GVariantIter *iter = NULL;
+       GError *dbus_err = NULL;
+       unsigned char endpoint;
+       int i = 0;
+       int result = 0;
+       int ret = ZIGBEE_ERROR_NONE;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       g_variant_builder_add(mac_builder, "(y)", eui64[7]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[6]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[5]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[4]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[3]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[2]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[1]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[0]);
+       mac_variant = g_variant_builder_end(mac_builder);
+       g_variant_builder_unref(mac_builder);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_endpoint_list",
+               g_variant_new("(@a(y))", mac_variant),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (variant) {
+               g_variant_get(variant, "(ia(y))", &result, &iter);
+               RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
+
+               DBG("ret = [0x%x]", result);
+
+               while (g_variant_iter_loop(iter, "(y)", &endpoint)) {
+                       DBG("Endpoint 0x%X", endpoint);
+                       list[i++] = endpoint;
+               }
+               g_variant_iter_free(iter);
+
+               if (i > 0) {
+                       *count = i;
+                       DBG("Endpoint Count %d", i);
+               } else {
+                       ERR("No Endpoints");
+                       *count = 0;
+               }
+               g_variant_unref(variant);
+
+       } else {
+               ERR("NULL Variant");
+               ERR("No Endpoints");
+               ERR("[%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       ret = ZIGBEE_ERROR_PERMISSION_DENIED;
+
+               g_error_free(dbus_err);
+               *count = 0;
+       }
+
+       return ret;
+}
+
+int zbl_api_get_node_type(zb_ieee_addr eui64, unsigned char *node_type)
+{
+       GVariant *variant = NULL;
+       GVariantBuilder *mac_builder = NULL;
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *mac_variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       g_variant_builder_add(mac_builder, "(y)", eui64[7]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[6]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[5]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[4]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[3]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[2]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[1]);
+       g_variant_builder_add(mac_builder, "(y)", eui64[0]);
+       mac_variant = g_variant_builder_end(mac_builder);
+       g_variant_builder_unref(mac_builder);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_node_type",
+               g_variant_new("(@a(y))", mac_variant),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'get_node_type' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_get_all_device_info(zb_end_dev_info_h **dev_list, unsigned char* num)
+{
+       int i = 0;
+       int j = 0;
+       int k = 0;
+       struct zb_end_device_info_s **list;
+       GVariant *variant = NULL;
+       GVariantIter *iter = NULL;
+       GVariantIter *mac_iter = NULL;
+       GVariantIter *endpoint_iter = NULL;
+       GError *dbus_err = NULL;
+       int result = 0;
+       int ret = ZIGBEE_ERROR_NONE;
+       unsigned short node_id;
+       unsigned char node_type;
+       unsigned char node_mac_address[8] = {0x00};
+       unsigned char endpoint_cnt = 0;
+       unsigned char value;
+       unsigned char value_endpoint;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       /* check the format string when there are no input args */
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_device_info",
+                               NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (variant) {
+               g_variant_get(variant, "(ia(qyayyay))", &result, &iter);
+               RETVM_IF(NULL == iter, ZIGBEE_ERROR_IO_ERROR, "Invalid parameter !");
+
+               DBG("ret = [0x%x]", result);
+
+               list = calloc(MAX_DEVICE_LIST+1, sizeof(zb_end_dev_info_h));
+               RETV_IF(NULL == list, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               for (i = 0; i < MAX_DEVICE_LIST && list; i++) {
+                       list[i] = calloc(1, sizeof(struct zb_end_device_info_s));
+                       if (NULL == list[i]) {
+                               for (j = 0; j < i; j++) {
+                                       if (list[j]) {
+                                               free(list[j]);
+                                               list[j] = NULL;
+                                       }
+                               }
+                               if (list) {
+                                       free(list);
+                                       list = NULL;
+                               }
+                               g_variant_unref(variant);
+                               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+                       }
+               }
+
+               i = 0;
+               while (g_variant_iter_loop(iter, "(qyayyay)", &node_id, &node_type, &mac_iter,
+                               &endpoint_cnt, &endpoint_iter)) {
+                       if (NULL == mac_iter || NULL == endpoint_iter) {
+                               ERR("Invalid parameter !");
+                               for (j = 0; j <= MAX_DEVICE_LIST; j++) {
+                                       if (list[j]) {
+                                               free(list[j]);
+                                               list[j] = NULL;
+                                       }
+                               }
+                               if (list) {
+                                       free(list);
+                                       list = NULL;
+                               }
+                               g_variant_iter_free(iter);
+                               if (NULL != mac_iter)
+                                       g_variant_iter_free(mac_iter);
+                               if (NULL != endpoint_iter)
+                                       g_variant_iter_free(endpoint_iter);
+                               g_variant_unref(variant);
+                               return ZIGBEE_ERROR_IO_ERROR;
+                       }
+
+                       j = 0;
+                       k = 0;
+                       /* Get Network Address */
+                       list[i]->addr16 = node_id;
+                       DBG("Node ID: 0x%04X", node_id);
+                       /* Get Node Type */
+                       list[i]->node_type = node_type;
+                       DBG("Node Type : 0x%02X", node_type);
+                       /* Get End-Point count */
+                       list[i]->num_of_ep = endpoint_cnt;
+                       DBG("Endpoint Count: 0x%X", endpoint_cnt);
+
+                       /* Get End-Point list */
+                       list[i]->num_of_ep = endpoint_cnt;
+                       while (g_variant_iter_loop(endpoint_iter, "y", &value_endpoint)) {
+                               list[i]->ep[k] = value_endpoint;
+                               DBG("Endpoint : %d", value_endpoint);
+                               k++;
+                       }
+                       g_variant_iter_free(endpoint_iter);
+
+                       /* Get IEEE address */
+                       while (g_variant_iter_loop(mac_iter, "y", &value)) {
+                               node_mac_address[j] = value;
+                               j++;
+                       }
+                       g_variant_iter_free(mac_iter);
+
+                       memcpy(list[i]->addr64, node_mac_address, sizeof(zb_ieee_addr));
+                       DBG("Node MAC Addr : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
+                               node_mac_address[0], node_mac_address[1], node_mac_address[2],
+                               node_mac_address[3], node_mac_address[4], node_mac_address[5],
+                               node_mac_address[6], node_mac_address[7]);
+                       i++;
+               }
+               if (0 == i)
+                       ERR("No attached nodes");
+
+               *num = i;
+               *dev_list = (void **)list;
+
+               g_variant_iter_free(iter);
+               g_variant_unref(variant);
+       } else {
+               ERR("NULL Variant [%s]", dbus_err->message);
+               ERR("No attached nodes");
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       ret = ZIGBEE_ERROR_PERMISSION_DENIED;
+
+               g_error_free(dbus_err);
+               *num = 0;
+       }
+
+       return ret;
+}
+
+int zbl_coex_start(unsigned char channel)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "coex_start", g_variant_new("(y)", channel),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'coex_start' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_coex_stop(void)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       DBG("zbl_coex_stop()");
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "coex_stop", NULL,
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'coex_stop' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(service_gproxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_SERVICE_INTERFACE,  "form_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_SERVICE_FORM_NETWORK;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "form_network", NULL,
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'form_network' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_disable_network()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(service_gproxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_SERVICE_INTERFACE,  "disable_network_done", ZIGBEE_SERVICE_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_SERVICE_DISABLE_NETWORK;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "leave_network", NULL,
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'leave_network' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_leave_device(zb_ieee_addr addr64, bool remove_children, bool rejoin)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       GVariantBuilder *mac_builder = NULL;
+       GVariant* mac_variant = NULL;
+       unsigned char _remove_children = (remove_children) ? 1 : 0;
+       unsigned char _rejoin = (rejoin) ? 1 : 0;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("IEEE Address = %X:%X:%X:%X:%X:%X:%X:%X",
+               addr64[0], addr64[1], addr64[2], addr64[3],
+               addr64[4], addr64[5], addr64[6], addr64[7]);
+
+       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       g_variant_builder_add(mac_builder, "(y)", addr64[7]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[6]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[5]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[4]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[3]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[2]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[1]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[0]);
+       mac_variant = g_variant_builder_end(mac_builder);
+       g_variant_builder_unref(mac_builder);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request",
+               g_variant_new("(@a(y)yy)", mac_variant, _remove_children, _rejoin),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'leave_request' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_permit_join(unsigned char duration, bool broadcast)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "permit_join",
+               g_variant_new("(ib)", duration, broadcast),     G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'permit_join' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64, unsigned char request_type,
+       unsigned char start_idx, zb_zdo_addr_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+       GVariantBuilder *mac_builder = NULL;
+       GVariant* mac_variant = NULL;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG(" zbl_nwk_addr_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "nwk_addr_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
+                       _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_NWK_ADDR_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       g_variant_builder_add(mac_builder, "(y)", addr64[7]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[6]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[5]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[4]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[3]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[2]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[1]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[0]);
+       mac_variant = g_variant_builder_end(mac_builder);
+       g_variant_builder_unref(mac_builder);
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "nwk_addr_req",
+               g_variant_new("(@a(y)yy)", mac_variant, request_type, start_idx),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'nwk_addr_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb,
+               void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_ieee_addr_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "nwk_addr_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_NWK_ADDR_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "ieee_addr_req", g_variant_new("(q)", addr16),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'ieee_addr_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb,
+               void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_active_ep()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "active_ep_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_ACTIVE_EP_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "active_ep_req",
+               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'active_ep_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+               zb_zdo_simple_desc_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_simple_desc_req() : [%X]", addr16);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "simple_desc_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_SIMPLE_DESC_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "simple_desc_req",
+               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'simple_desc_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_extended_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char start_idx, zb_zdo_extended_simple_desc_cb cb, void *user_data)
+{
+       return ZIGBEE_ERROR_NOT_SUPPORTED;
+}
+
+int zbl_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+               unsigned short profileid, unsigned char num_in_clusters,
+               unsigned short *in_clusters, unsigned char num_out_clusters,
+               unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       int i;
+       GVariantBuilder *incl_builder = NULL;
+       GVariant* incl_variant = NULL;
+       GVariantBuilder *outcl_builder = NULL;
+       GVariant* outcl_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_match_desc_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "matched_descriptor_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_MATCHED_DESCRIPTOR_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       incl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
+       for (i = 0; i < num_in_clusters; i++)
+               g_variant_builder_add(incl_builder, "q", in_clusters[i]);
+
+       outcl_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
+       for (i = 0; i < num_out_clusters; i++)
+               g_variant_builder_add(outcl_builder, "q", out_clusters[i]);
+
+       incl_variant = g_variant_builder_end(incl_builder);
+       outcl_variant = g_variant_builder_end(outcl_builder);
+       g_variant_builder_unref(incl_builder);
+       g_variant_builder_unref(outcl_builder);
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "matched_descriptor_req",
+               g_variant_new("(qqy@aqy@aq)", addr16, profileid, num_in_clusters,
+               incl_variant, num_out_clusters, outcl_variant),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'matched_descriptor_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_node_desc_req(zb_nwk_addr addr16, zb_zdo_node_desc_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_node_desc_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "node_desc_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_NODE_DESC_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "node_desc_req",
+               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'node_desc_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_power_desc_req(zb_nwk_addr addr16, zb_zdo_power_desc_cb cb,
+       void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "power_desc_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_POWER_DESC_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "power_desc_req",
+               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'power_desc_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_complex_desc_req(zb_nwk_addr addr16, zb_zdo_complex_desc_cb cb,
+       void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "complex_desc_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_COMPLEX_DESC_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "complex_desc_req",
+               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'complex_desc_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_user_desc_req(zb_nwk_addr addr16, zb_zdo_user_desc_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "user_desc_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_USER_DESC_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_req",
+               g_variant_new("(q)", addr16), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'user_desc_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+#define MAX_USER_DESC_SIZE 0x10
+#define USER_DESC_COMMAND_SIZE 20
+
+int zbl_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len,
+       unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       unsigned char j = 0x00;
+       GVariantBuilder *user_desc_builder = NULL;
+       GVariant *user_desc_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+       RETVM_IF(len > MAX_USER_DESC_SIZE, ZIGBEE_ERROR_INVALID_PARAMETER,
+               "invalid length=%d", len);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "user_desc_confirm",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_USER_DESC_SET_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       user_desc_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       for (j = 0; j < len; j++)
+               g_variant_builder_add(user_desc_builder, "(y)", user_desc[j]);
+
+       user_desc_variant = g_variant_builder_end(user_desc_builder);
+       g_variant_builder_unref(user_desc_builder);
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "user_desc_set_req",
+               g_variant_new("(qy@a(y))", addr16, len, user_desc_variant),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'user_desc_set_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64,
+       unsigned char capability)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GError *dbus_err = NULL;
+       GVariant *variant = NULL;
+
+       GVariantBuilder *mac_builder = NULL;
+       GVariant* mac_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       g_variant_builder_add(mac_builder, "(y)", addr64[7]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[6]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[5]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[4]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[3]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[2]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[1]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[0]);
+       mac_variant = g_variant_builder_end(mac_builder);
+       g_variant_builder_unref(mac_builder);
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "device_announce",
+               g_variant_new("(q@a(y)y)", addr16, mac_variant, capability),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'device_announce' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_bind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64,
+       unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64,
+       unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep,
+       zb_zdo_bind_cb cb, void *user_data)
+{
+       int i;
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GError *dbus_err = NULL;
+       GVariant *variant = NULL;
+
+       GVariantBuilder *src_addr64_builder = NULL;
+       GVariant* src_addr64_variant = NULL;
+       GVariantBuilder *dst_addr64_builder = NULL;
+       GVariant* dst_addr64_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_zdo_bind_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_bind_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_BIND_INTERFACE,  "bind_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_BIND_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+
+       if (src_addr64) {
+               for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--)
+                       g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]);
+       }
+       src_addr64_variant = g_variant_builder_end(src_addr64_builder);
+       g_variant_builder_unref(src_addr64_builder);
+
+       dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       if (dst_addr64) {
+               for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--)
+                       g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]);
+       }
+       dst_addr64_variant = g_variant_builder_end(dst_addr64_builder);
+       g_variant_builder_unref(dst_addr64_builder);
+
+       variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "bind_req",
+               g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep,
+                                               clusterid, dst_addr64_variant, type, group_addr, dst_ep),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'bind_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_unbind_req(zb_nwk_addr dst_addr16,
+       zb_ieee_addr src_addr64, unsigned char src_ep, unsigned short clusterid,
+       zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr,
+       unsigned char dst_ep, zb_zdo_unbind_cb cb, void *user_data)
+{
+       int i;
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GError *dbus_err = NULL;
+       GVariant *variant = NULL;
+
+       GVariantBuilder *src_addr64_builder = NULL;
+       GVariant* src_addr64_variant = NULL;
+       GVariantBuilder *dst_addr64_builder = NULL;
+       GVariant* dst_addr64_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_zdo_unbind_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_bind_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_BIND_INTERFACE,  "unbind_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_UNBIND_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       if (src_addr64) {
+               for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--)
+                       g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]);
+       }
+       src_addr64_variant = g_variant_builder_end(src_addr64_builder);
+       g_variant_builder_unref(src_addr64_builder);
+
+       dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       if (dst_addr64) {
+               for (i = sizeof(zb_ieee_addr) - 1 ; i >= 0; i--)
+                       g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]);
+       }
+       dst_addr64_variant = g_variant_builder_end(dst_addr64_builder);
+       g_variant_builder_unref(dst_addr64_builder);
+
+       variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "unbind_req",
+               g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep,
+                                               clusterid, dst_addr64_variant, type, group_addr, dst_ep),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'unbind_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_mgmt_nwk_disc_req(zb_nwk_addr addr16, unsigned int scan_channels,
+       unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx,
+       zb_zdo_mgmt_nwk_disc_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_mgmt_nwk_disc_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_nwk_disc_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
+                       container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_MGMT_NWK_DISC_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_disc_req",
+               g_variant_new("(quyqy)", addr16, scan_channels, scan_duration, scan_count, start_idx),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'mgmt_nwk_disc_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_mgmt_nwk_update_req(unsigned int scan_channels, unsigned char scan_duration,
+       unsigned char scan_count, unsigned char nwk_update_id, zb_nwk_addr nwk_manager_addr)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_mgmt_nwk_update_req()");
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_nwk_update_req",
+               g_variant_new("(quyyy)", nwk_manager_addr, scan_channels, scan_duration,
+               scan_count, nwk_update_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'mgmt_nwk_update_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_mgmt_lqi_req(zb_nwk_addr addr16, unsigned char start_idx,
+       zb_zdo_mgmt_lqi_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_mgmt_lqi_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_lqi_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
+                       _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_MGMT_LQI_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_lqi_req",
+               g_variant_new("(qy)", addr16, start_idx),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'mgmt_lqi_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_mgmt_rtg_req(zb_nwk_addr addr16, unsigned char start_idx,
+       zb_zdo_mgmt_rtg_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_mgmt_rtg_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_rtg_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,  _zbl_response_cb, container,
+                       _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_MGMT_RTG_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_rtg_req",
+               g_variant_new("(qy)", addr16, start_idx),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'mgmt_rtg_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_mgmt_bind_req(zb_nwk_addr addr16, unsigned char start_idx,
+       zb_zdo_mgmt_bind_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_mgmt_bind_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_bind_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,  _zbl_response_cb, container,
+                       _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_MGMT_BIND_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_bind_req",
+               g_variant_new("(qy)", addr16, start_idx),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'mgmt_bind_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_mgmt_leave_device(zb_ieee_addr addr64, unsigned char remove_children,
+       unsigned rejoin, zb_zdo_mgmt_leave_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       GVariantBuilder *mac_builder = NULL;
+       GVariant* mac_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_leave_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,  _zbl_response_cb, container,
+                       _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_MGMT_LEAVE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       mac_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       g_variant_builder_add(mac_builder, "(y)", addr64[7]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[6]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[5]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[4]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[3]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[2]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[1]);
+       g_variant_builder_add(mac_builder, "(y)", addr64[0]);
+       mac_variant = g_variant_builder_end(mac_builder);
+       g_variant_builder_unref(mac_builder);
+
+       variant = g_dbus_proxy_call_sync(service_gproxy, "leave_request",
+               g_variant_new("(@a(y)yy)", mac_variant, remove_children, rejoin),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'leave_request' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_mgmt_permit_joining_req(zb_nwk_addr addr16, unsigned char duration,
+       unsigned char tc_significance, zb_zdo_mgmt_permit_joining_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zdo_dev_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZDO_DEV_CONTROL_INTERFACE,  "mgmt_permit_join_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
+                       container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZDO_MGMT_PERMIT_JOIN_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zdo_dev_proxy, "mgmt_permit_join_req",
+               g_variant_new("(qyy)", addr16, duration, tc_significance),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'mgmt_permit_join_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_aps_send(zb_nwk_addr addr16, unsigned char aps_fc,
+       unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid,
+       unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code,
+       unsigned char cmd_id, unsigned short payload_len, unsigned char *payload,
+       zb_aps_send_cb cb, void *user_data)
+{
+       int sub_id, to, i;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       GVariantBuilder *payload_builder = NULL;
+       GVariant *payload_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(custom_gproxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_CUSTOM_INTERFACE,  "aps_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_CUSTOM_APS_SEND_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       if (payload_len > 0) {
+               for (i = payload_len - 1; i >= 0 ; i--)
+                       g_variant_builder_add(payload_builder, "(y)", payload[i]);
+       }
+       payload_variant = g_variant_builder_end(payload_builder);
+       g_variant_builder_unref(payload_builder);
+
+       variant = g_dbus_proxy_call_sync(custom_gproxy, "aps_send",
+               g_variant_new("(qyyyqqyqyq@a(y))", addr16, aps_fc, src_ep, dst_ep,
+               clusterid, profileid, zcl_fc, mfg_code, cmd_id, payload_len,
+               payload_variant),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'aps_send' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_zcl_send(zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
+       unsigned short clusterid, unsigned char zcl_fc, unsigned char cmd,
+       unsigned short payload_len, unsigned char *payload,
+       zb_zcl_send_cb cb, void *user_data)
+{
+       int sub_id, to, i;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       GVariantBuilder *payload_builder = NULL;
+       GVariant *payload_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(custom_gproxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_CUSTOM_INTERFACE,  "zcl_send_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_CUSTOM_ZCL_SEND_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       if (payload_len > 0) {
+               for (i = payload_len - 1; i >= 0 ; i--)
+                       g_variant_builder_add(payload_builder, "(y)", payload[i]);
+       }
+       payload_variant = g_variant_builder_end(payload_builder);
+       g_variant_builder_unref(payload_builder);
+
+       variant = g_dbus_proxy_call_sync(custom_gproxy, "zcl_send",
+               g_variant_new("(qyyqyyq@a(y))", addr16, src_ep, dst_ep, clusterid, zcl_fc,
+               cmd, payload_len, payload_variant), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'zcl_send' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_send_to_local(unsigned short length, unsigned char *data,
+       zb_send_to_local_cb cb, void *user_data)
+{
+       int sub_id, to, i;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       GVariantBuilder *payload_builder = NULL;
+       GVariant *payload_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(custom_gproxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_CUSTOM_INTERFACE,  "send_to_local_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_CUSTOM_LOCAL_SEND_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       payload_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       if (length > 0) {
+               for (i = length - 1; i >= 0 ; i--)
+                       g_variant_builder_add(payload_builder, "(y)", data[i]);
+       }
+       payload_variant = g_variant_builder_end(payload_builder);
+       g_variant_builder_unref(payload_builder);
+
+       variant = g_dbus_proxy_call_sync(custom_gproxy, "send_to_local",
+               g_variant_new("(q@a(y))", length, payload_variant),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'send_to_local' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_read_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char dest_ep,
+       unsigned char zcl_fc, unsigned short clusterid, unsigned short *attribute_ids,
+       int attribute_ids_len, zb_zcl_global_attr_read_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       int i = 0;
+       unsigned char *t;
+       GVariant *attr_variant = NULL;
+       GVariantBuilder *attr_builder = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_read_attr_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_attributes_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+               _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               free(container);
+               container = NULL;
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_READ_ATTRIBUTE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               free(container);
+               container = NULL;
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dest_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_READ_ATTRIBUTES;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       t = (unsigned char *)attribute_ids;
+       attr_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       for (i = 0; i < attribute_ids_len*sizeof(unsigned short); i++)
+               g_variant_builder_add(attr_builder, "(y)", t[i]);
+       attr_variant = g_variant_builder_end(attr_builder);
+       g_variant_builder_unref(attr_builder);
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_attributes_req",
+               g_variant_new("(@a(y)iqqyy)", attr_variant, attribute_ids_len,
+               addr16, clusterid, zcl_fc, dest_ep), G_DBUS_CALL_FLAGS_NONE, to,
+               NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'read_attributes_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_write_attr_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
+       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
+       void **data, int count, zb_zcl_global_attr_write_cb cb,
+       void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       struct write_attribute_record_s **records = (struct write_attribute_record_s **)data;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_write_attr_req()");
+
+       GVariantBuilder *rec_builder = NULL;
+       GVariant *rec_variant = NULL;
+
+       int i = 0;
+       int j = 0;
+
+       char dSize[3] = {'\0', '\0'};
+       int writeAttributeIndex = 0;
+       int size_of_allo = 0;
+
+       unsigned char *isString = NULL;
+       unsigned short *dataSize = NULL;
+       unsigned char *writeAttribute = NULL;
+
+       isString = calloc(count + 1, sizeof(unsigned char));
+       RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       dataSize = calloc(count + 1, sizeof(unsigned short));
+       if (NULL == dataSize) {
+               ERR("calloc() Fail(%d)", errno);
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+
+       DBG("Records Length %d", count);
+
+       while (j < count) {
+               dataSize[j] = zb_zcl_get_data_size((*records)[j].type);
+
+               if (0xff != dataSize[j]) {
+
+                       isString[j] = 0;
+                       size_of_allo = size_of_allo + (dataSize[j] + 3);
+
+               } else {
+                       if ((*records)[j].value) {
+                               if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING
+                                       || (*records)[j].type == ZB_ZCL_OCTET_STRING) {
+
+                                               isString[j] = 1;
+                                               dataSize[j] = (*records)[j].value[0];
+                                               size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
+
+                               } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING
+                                       || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) {
+
+                                       isString[j] = 2;
+                                       dSize[0] = (*records)[j].value[0];
+                                       dSize[1] = (*records)[j].value[1];
+                                       dataSize[j] = dSize[1];
+                                       dataSize[j] = (dataSize[j] << 8) | dSize[0];
+                                       size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
+                               }
+                       } else
+                               ERR("Data is not present");
+               }
+               j++;
+       }
+       DBG("size_of_allo Length %d", size_of_allo);
+
+       writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
+       if (NULL == writeAttribute) {
+               ERR("Couldn't Allocate Memory");
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+
+       j = 0;
+       while (j < count && writeAttributeIndex < size_of_allo) {
+               writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
+               writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
+               writeAttribute[writeAttributeIndex++] = (*records)[j].type;
+               for (i = 0; i < (dataSize[j] + isString[j]); i++) {
+                       writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
+                       DBG("0x%02X", (*records)[j].value[i]);
+               }
+               j++;
+       }
+
+       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       DBG("   ");
+       for (i = 0; i < writeAttributeIndex ; i++) {
+               DBG("0x%02X", writeAttribute[i]);
+               g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
+       }
+
+       rec_variant = g_variant_builder_end(rec_builder);
+       g_variant_builder_unref(rec_builder);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               if (writeAttribute) {
+                       free(writeAttribute);
+                       writeAttribute = NULL;
+               }
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
+               container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               if (writeAttribute) {
+                       free(writeAttribute);
+                       writeAttribute = NULL;
+               }
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               if (writeAttribute) {
+                       free(writeAttribute);
+                       writeAttribute = NULL;
+               }
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dst_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_WRITE_ATTRIBUTES;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_req",
+               g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
+               clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
+               to, NULL, &dbus_err);
+
+       if (isString) {
+               free(isString);
+               isString = NULL;
+       }
+       if (dataSize) {
+               free(dataSize);
+               dataSize = NULL;
+       }
+       if (writeAttribute) {
+               free(writeAttribute);
+               writeAttribute = NULL;
+       }
+
+       if (!variant) {
+               ERR("Failed to get 'write_attributes_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_wattr_undivided_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, void **data, int count,
+       zb_zcl_global_attr_write_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       struct write_attribute_record_s **records = (struct write_attribute_record_s **)data;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_wattr_undivided_req()");
+
+       GVariantBuilder *rec_builder = NULL;
+       GVariant *rec_variant = NULL;
+
+       int i = 0;
+       int j = 0;
+
+       char dSize[3] = {'\0', '\0'};
+       int writeAttributeIndex = 0;
+       int size_of_allo = 0;
+
+       unsigned char *isString = NULL;
+       unsigned short *dataSize = NULL;
+       unsigned char *writeAttribute = NULL;
+
+       isString = calloc(count + 1, sizeof(unsigned char));
+       RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       dataSize = calloc(count + 1, sizeof(unsigned short));
+       if (NULL == dataSize) {
+               ERR("calloc() Fail(%d)", errno);
+               free(isString);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+
+       DBG("Records Length %d", count);
+
+       while (j < count) {
+               dataSize[j] = zb_zcl_get_data_size((*records)[j].type);
+               if (0xff != dataSize[j]) {
+                       isString[j] = 0;
+                       size_of_allo = size_of_allo + (dataSize[j] + 3);
+               } else {
+                       if ((*records)[j].value) {
+                               if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING
+                                       || (*records)[j].type == ZB_ZCL_OCTET_STRING) {
+                                               isString[j] = 1;
+                                               dataSize[j] = (*records)[j].value[0];
+                                               size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
+                               } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING
+                                       || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) {
+                                       isString[j] = 2;
+                                       dSize[0] = (*records)[j].value[0];
+                                       dSize[1] = (*records)[j].value[1];
+                                       dataSize[j] = dSize[1];
+                                       dataSize[j] = (dataSize[j] << 8) | dSize[0];
+                                       size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
+                               }
+                       } else
+                               ERR("Data is not present");
+               }
+               j++;
+       }
+       DBG("size_of_allo Length %d", size_of_allo);
+
+       writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
+       if (NULL == writeAttribute) {
+               ERR("Couldn't Allocate Memory");
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+
+       j = 0;
+       while (j < count && writeAttributeIndex < size_of_allo) {
+               writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
+               writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
+               writeAttribute[writeAttributeIndex++] = (*records)[j].type;
+               for (i = 0; i < (dataSize[j] + isString[j]); i++) {
+                       writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
+                       DBG("0x%02X", (*records)[j].value[i]);
+               }
+               j++;
+       }
+
+       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       DBG("   ");
+       for (i = 0; i < writeAttributeIndex ; i++) {
+               DBG("0x%02X", writeAttribute[i]);
+               g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
+       }
+
+       rec_variant = g_variant_builder_end(rec_builder);
+       g_variant_builder_unref(rec_builder);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               if (writeAttribute) {
+                       free(writeAttribute);
+                       writeAttribute = NULL;
+               }
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "write_attributes_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
+               container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               if (writeAttribute) {
+                       free(writeAttribute);
+                       writeAttribute = NULL;
+               }
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_WRITE_ATTRIBUTE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               if (writeAttribute) {
+                       free(writeAttribute);
+                       writeAttribute = NULL;
+               }
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dst_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_WRITE_ATTRIBUTES_UNDIVIDED;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_undivided_req",
+               g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
+               clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
+               to, NULL, &dbus_err);
+
+       if (isString) {
+               free(isString);
+               isString = NULL;
+       }
+       if (dataSize) {
+               free(dataSize);
+               dataSize = NULL;
+       }
+       if (writeAttribute) {
+               free(writeAttribute);
+               writeAttribute = NULL;
+       }
+
+       if (!variant) {
+               ERR("Failed to get 'write_attributes_undivided_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_wattr_req_no_cb(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
+               unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
+               void **data, int count)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GError *dbus_err = NULL;
+       GVariant *variant = NULL;
+
+       struct write_attribute_record_s **records = (struct write_attribute_record_s **)data;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_wattr_req_no_cb()");
+
+       GVariantBuilder *rec_builder = NULL;
+       GVariant *rec_variant = NULL;
+
+       int i = 0;
+       int j = 0;
+
+       char dSize[3] = {'\0', '\0'};
+       int writeAttributeIndex = 0;
+       int size_of_allo = 0;
+
+       unsigned char *isString = NULL;
+       unsigned short *dataSize = NULL;
+       unsigned char *writeAttribute = NULL;
+
+       isString = calloc(count + 1, sizeof(unsigned char));
+       RETVM_IF(NULL == isString, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       dataSize = calloc(count + 1, sizeof(unsigned short));
+       if (NULL == dataSize) {
+               ERR("calloc() Fail(%d)", errno);
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+
+       DBG("Records Length %d", count);
+
+       while (j < count) {
+               dataSize[j] = zb_zcl_get_data_size((*records)[j].type);
+               if (0xff != dataSize[j]) {
+                       isString[j] = 0;
+                       size_of_allo = size_of_allo + (dataSize[j] + 3);
+               } else {
+                       if ((*records)[j].value) {
+                               if ((*records)[j].type == ZB_ZCL_CHARACTER_STRING
+                                       || (*records)[j].type == ZB_ZCL_OCTET_STRING) {
+                                               isString[j] = 1;
+                                               dataSize[j] = (*records)[j].value[0];
+                                               size_of_allo = size_of_allo + (dataSize[j] + 3 + 1);
+                               } else if ((*records)[j].type == ZB_ZCL_LONG_OCTET_STRING
+                                       || (*records)[j].type == ZB_ZCL_LONG_CHARACTER_STRING) {
+                                       isString[j] = 2;
+                                       dSize[0] = (*records)[j].value[0];
+                                       dSize[1] = (*records)[j].value[1];
+                                       dataSize[j] = dSize[1];
+                                       dataSize[j] = (dataSize[j] << 8) | dSize[0];
+                                       size_of_allo = size_of_allo + (dataSize[j] + 3 + 2);
+                               }
+                       } else
+                               ERR("Data is not present");
+               }
+               j++;
+       }
+       DBG("size_of_allo Length %d", size_of_allo);
+
+       writeAttribute = calloc(size_of_allo + 1, sizeof(unsigned char));
+       if (NULL == writeAttribute) {
+               ERR("Couldn't Allocate Memory");
+               if (isString) {
+                       free(isString);
+                       isString = NULL;
+               }
+               if (dataSize) {
+                       free(dataSize);
+                       dataSize = NULL;
+               }
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+
+       j = 0;
+       while (j < count && writeAttributeIndex < size_of_allo) {
+               writeAttribute[writeAttributeIndex++] = ((*records)[j].id) & 0xff;
+               writeAttribute[writeAttributeIndex++] = (((*records)[j].id) >> 8) & 0xff;
+               writeAttribute[writeAttributeIndex++] = (*records)[j].type;
+               for (i = 0; i < (dataSize[j] + isString[j]); i++) {
+                       writeAttribute[writeAttributeIndex++] = (*records)[j].value[i];
+                       DBG("0x%02X", (*records)[j].value[i]);
+               }
+               j++;
+       }
+
+       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       DBG("   ");
+       for (i = 0; i < writeAttributeIndex ; i++) {
+               DBG("0x%02X", writeAttribute[i]);
+               g_variant_builder_add(rec_builder, "(y)", writeAttribute[i]);
+       }
+
+       rec_variant = g_variant_builder_end(rec_builder);
+       g_variant_builder_unref(rec_builder);
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "write_attributes_no_resp",
+               g_variant_new("(@a(y)iqqyyy)", rec_variant, writeAttributeIndex, addr16,
+               clusterid, zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE,
+               -1, NULL, &dbus_err);
+
+       if (isString) {
+               free(isString);
+               isString = NULL;
+       }
+       if (dataSize) {
+               free(dataSize);
+               dataSize = NULL;
+       }
+       if (writeAttribute) {
+               free(writeAttribute);
+               writeAttribute = NULL;
+       }
+       if (!variant) {
+               ERR("Failed to get 'write_attributes_no_rep' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_write_config_report(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, void **data, int count,
+       zb_zcl_global_config_report_write_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       struct reporting_configuration_record_s **records =
+               (struct reporting_configuration_record_s **)data;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       int i = 0;
+       int j = 0;
+       int len = 0;
+       int payload_len = 0;
+
+       GVariantBuilder *rec_builder = NULL;
+       GVariant *rec_variant = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_write_config_report()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "configure_reporting_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
+               container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_WRITE_CONFIGURE_REPORTING_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dst_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_CONFIGURE_REPORTING;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       for (i = 0; i < count; i++) {
+               g_variant_builder_add(rec_builder, "(y)", (*records)[i].dir);
+               DBG("dir = 0x%02X", (*records)[i].dir);
+               payload_len += sizeof((*records)[i].dir);
+               g_variant_builder_add(rec_builder, "(y)", (*records)[i].id & 0xff);
+               g_variant_builder_add(rec_builder, "(y)", ((*records)[i].id >> 8) & 0xff);
+               DBG("id = 0x%04X", (*records)[i].id);
+               payload_len += sizeof((*records)[i].id);
+               g_variant_builder_add(rec_builder, "(y)", (*records)[i].type);
+               payload_len += sizeof((*records)[i].type);
+               DBG("type = 0x%04X", (*records)[i].type);
+               g_variant_builder_add(rec_builder, "(y)", (*records)[i].min_i & 0xff);
+               g_variant_builder_add(rec_builder, "(y)", ((*records)[i].min_i >> 8) & 0xff);
+               DBG("min_i = 0x%04X", (*records)[i].min_i);
+               payload_len += sizeof((*records)[i].min_i);
+               g_variant_builder_add(rec_builder, "(y)", (*records)[i].max_i & 0xff);
+               g_variant_builder_add(rec_builder, "(y)", ((*records)[i].max_i >> 8) & 0xff);
+               DBG("max_i = 0x%04X", (*records)[i].max_i);
+               payload_len += sizeof((*records)[i].max_i);
+
+               len = zb_zcl_get_data_size((*records)[i].type);
+               payload_len += len;
+               DBG("change length = %d", len);
+               DBG("payload length = %d", payload_len);
+
+               for (j = 0; j < len && (*records)[i].change+j; j++) {
+                       DBG("records[%d]->change[%d] = %d", i, j, (*records)[i].change[j]);
+                       g_variant_builder_add(rec_builder, "(y)", (*records)[i].change[j]);
+               }
+
+       }
+       rec_variant = g_variant_builder_end(rec_builder);
+       g_variant_builder_unref(rec_builder);
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "configure_reporting_req",
+               g_variant_new("(@a(y)qqqyyy)", rec_variant, count, addr16, clusterid,
+               zcl_fc, src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'configure_reporting_req' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_read_config_report(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, void **data, int count,
+       zb_zcl_global_config_report_read_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       struct read_reporting_configuration_record_s **records =
+               (struct read_reporting_configuration_record_s **)data;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       int i = 0;
+       int j = 0;
+       int size_of_allo = 0;
+       unsigned short idx = 0;
+       GVariantBuilder *rec_builder = NULL;
+       GVariant *rec_variant = NULL;
+       unsigned char *read_attributes;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_config_report_read()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "read_configure_reporting_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
+               container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_READ_CONFIGURE_REPORTING_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dst_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_READ_REPORTING_CONFIGURATION;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       DBG("Records Length %d", count);
+       /**
+        * According to zcl spec
+        * Memory needed for the read_reporting_configured_frame.
+        * 1 byte(direction) + 2 bytes(AttributeId)
+        *  = 3 bytes/variable
+        */
+       while (j < count) {
+               size_of_allo = size_of_allo + 3;
+               j++;
+       }
+       DBG("size_of_allo Length %d", size_of_allo);
+
+       read_attributes = calloc(size_of_allo, sizeof(unsigned char));
+       if (NULL == read_attributes) {
+               ERR("Couldn't Allocate Memory");
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, container->sid);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       j = 0;
+       while (j < count && idx < size_of_allo) {
+               read_attributes[idx++] = (*records)[j].dir;
+               read_attributes[idx++] = (*records)[j].id & 0xff;
+               read_attributes[idx++] = (*records)[j].id >> 8 & 0xff;
+               DBG("Id copied \n");
+               j++;
+       }
+
+       rec_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+
+       for (i = 0; i < idx ; i++) {
+               DBG("0x%02X", read_attributes[i]);
+               g_variant_builder_add(rec_builder, "(y)", read_attributes[i]);
+       }
+
+       rec_variant = g_variant_builder_end(rec_builder);
+       g_variant_builder_unref(rec_builder);
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "read_configure_reporting",
+               g_variant_new("(@a(y)qqqyyy)", rec_variant, idx, addr16, clusterid, zcl_fc,
+               src_ep, dst_ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (read_attributes) {
+               free(read_attributes);
+               read_attributes = NULL;
+       }
+
+       if (!variant) {
+               ERR("Failed to get 'read_configure_reporting' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_discover_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char src_ep,
+               unsigned char dest_ep, unsigned char zcl_fc, unsigned short clusterid,
+               unsigned short start_id, unsigned char max_attribute_ids,
+               zb_zcl_global_attr_discover_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_discover_attr_req()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+                       ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE,  "discover_attribute_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dest_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_DISCOVER_ATTRIBUTES;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes",
+               g_variant_new("(qyyqqy)",
+               addr16, dest_ep, zcl_fc, clusterid, start_id, max_attribute_ids),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'discover_attributes' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_discover_cmds_gen(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
+       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
+       unsigned char start_command_id, unsigned char max_command_ids,
+       zb_zcl_global_discover_cmds_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_discover_attr_gen()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_generated_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
+               _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_GENERATED_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dst_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_DISCOVER_COMMANDS_GENERATED;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_generated",
+               g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid,
+               start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_discover_cmds_recv(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, unsigned char start_command_id,
+       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_discover_cmds_recv()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_commands_received_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
+               _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_DISCOVER_COMMAND_RECEIVED_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dst_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_DISCOVER_COMMANDS_RECEIVED;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_commands_received",
+               g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid,
+               start_command_id, max_command_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'discover_commands_received' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_discover_attr_ext(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
+       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
+       unsigned short start_id, unsigned char max_attribute_ids,
+       zb_zcl_global_attr_extended_discover_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       zb_event_global_default_rsp_s *global_req = NULL;
+#endif
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_discover_attr_ext()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_global_proxy);
+       sub_id = g_dbus_connection_signal_subscribe(gdbus_conn, NULL,
+               ZIGBEE_ZCL_GLOBAL_CONTROL_INTERFACE, "discover_attributes_extended_rsp",
+               ZIGBEE_CONTROL_OBJECT_PATH,     NULL, 0, _zbl_response_cb, container,
+               _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GLOBAL_DISCOVER_ATTRIBUTE_EXTENDED_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       global_req = calloc(1, sizeof(zb_event_global_default_rsp_s));
+       if (NULL == global_req) {
+               g_dbus_connection_signal_unsubscribe(gdbus_conn, sub_id);
+               g_source_remove(container->tid);
+               container->tid = 0;
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               ERR("calloc() Fail(%d)", errno);
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       global_req->ep = dst_ep;
+       global_req->clusterid = clusterid;
+       global_req->commandid = ZB_ZCL_CMD_DISCOVER_ATTRIBUTES_EXTENDED;
+
+       container->global_cmd = global_req;
+       container->handle = handle;
+
+       /* Register global request information into handle */
+       _zbl_register_global_req(handle, container);
+#endif
+
+       variant = g_dbus_proxy_call_sync(zcl_global_proxy, "discover_attributes_extended",
+               g_variant_new("(qyyqqy)", addr16, dst_ep, zcl_fc, clusterid, start_id,
+               max_attribute_ids), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'discover_attributes_extended' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_reset_alarm(zb_nwk_addr addr16, unsigned char ep, unsigned char alarm_code,
+               unsigned short clusterid)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm",
+               g_variant_new("(qyyq)", addr16, ep, alarm_code, clusterid),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'reset_alarm' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_reset_all_alarm(zb_nwk_addr addr16, unsigned char ep)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_all_alarm",
+               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'reset_all_alarm' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_get_alarm(zb_nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_cb cb,
+               void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_get_alarm()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(alarm_gproxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_ALARM_INTERFACE,  "get_alarm_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_ALARM_GET_ALARM_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(alarm_gproxy, "get_alarm",
+               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'get_alarm' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_reset_all_alarm_log(zb_nwk_addr addr16, unsigned char ep)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(alarm_gproxy, "reset_alarm_log",
+               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'reset_alarm_log' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_move_to_hue(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char hue, unsigned char direction,
+               unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue",
+                       g_variant_new("(qyyyq)", addr16, ep, hue, direction, transition_time),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_to_hue' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+
+int zbl_ccontrol_move_hue(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char move_mode, unsigned char rate)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_hue",
+                       g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_hue' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_step_hue(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char step_mode, unsigned char step_size,
+               unsigned char transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_hue",
+                       g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'step_hue' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_move_to_saturation(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char saturation, unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_saturation",
+                       g_variant_new("(qyyq)", addr16, ep, saturation, transition_time),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_to_saturation' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_move_saturation(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char move_mode, unsigned char rate)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_saturation",
+                       g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_saturation' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_step_saturation(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char step_mode, unsigned char step_size,
+               unsigned char transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_saturation",
+                       g_variant_new("(qyyyy)", addr16, ep, step_mode, step_size, transition_time),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'step_saturation' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_move_to_hue_and_saturation(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char hue, unsigned char saturation,
+               unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_hue_and_saturation",
+                       g_variant_new("(qyyyq)", addr16, ep, hue, saturation, transition_time),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_to_hue_and_saturation' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_move_to_color(zb_nwk_addr addr16, unsigned char ep,
+               unsigned short color_x, unsigned short color_y,
+               unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_to_color",
+                       g_variant_new("(qyqqq)", addr16, ep, color_x, color_y, transition_time),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_to_color' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_move_color(zb_nwk_addr addr16, unsigned char ep,
+               unsigned short rate_x, unsigned short rate_y)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color",
+                       g_variant_new("(qyqq)", addr16, ep, rate_x, rate_y),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_color' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_step_color(zb_nwk_addr addr16, unsigned char ep,
+               unsigned short step_x, unsigned short step_y,
+               unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "step_color",
+                       g_variant_new("(qyqqq)", addr16, ep, step_x, step_y, transition_time),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'step_color' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_ccontrol_move_to_color_temperature(zb_nwk_addr addr16, unsigned char ep,
+               unsigned short color_temperature,
+               unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_color_control_proxy, "move_color_temperature",
+                       g_variant_new("(qyqq)", addr16, ep, color_temperature, transition_time),
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_color_temperature' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_reset_factory_default(zb_nwk_addr addr16, unsigned char ep)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_basic_proxy, "reset_factory_default",
+               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'reset_factory_default' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_identify(zb_nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "identify",
+               g_variant_new("(qyq)", addr16, dst_ep, identify_time),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'identify' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_identify_query(zb_nwk_addr addr16, unsigned char dst_ep,
+               zb_zcl_identify_query_cb cb, void *user_data)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_identify_query()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_identify_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_IDENTIFY_INTERFACE, "query_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_IDENTIFY_QUERY_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_identify_proxy, "query",
+               g_variant_new("(qy)", addr16, dst_ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'query' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_add_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+               const char *group_name, zb_zcl_group_add_group_cb cb, void *user_data)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int j = 0;
+       GVariant *groupname_variant = NULL;
+       GVariantBuilder *groupname_builder = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_add_group()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_group_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_GROUP_INTERFACE, "add_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GROUP_ADD_GROUP_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       while (group_name[j] != '\0') {
+               g_variant_builder_add(groupname_builder, "(y)", (group_name[j]));
+               j++;
+       }
+       groupname_variant = g_variant_builder_end(groupname_builder);
+       g_variant_builder_unref(groupname_builder);
+
+       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group",
+               g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'add_group' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_view_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+               zb_zcl_group_view_group_cb cb, void *user_data)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_view_group()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_group_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_GROUP_INTERFACE,  "view_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GROUP_VIEW_GROUP_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "view_group",
+               g_variant_new("(qyq)", addr16, ep, group_id),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'view_group' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_group_get_group_membership(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char group_count, unsigned short *group_list,
+               zb_zcl_group_get_group_membership_cb cb, void *user_data)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int j = 0;
+       GVariant *grouplist_variant = NULL;
+       GVariantBuilder *grouplist_builder = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_group_get_group_membership()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_group_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_GROUP_INTERFACE,  "get_group_membership_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb,
+                       container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GROUP_GET_GROUP_MEMBERSHIP_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       grouplist_builder = g_variant_builder_new(G_VARIANT_TYPE("aq"));
+       while (j < group_count) {
+               g_variant_builder_add(grouplist_builder, "q", group_list[j]);
+               j++;
+       }
+       grouplist_variant = g_variant_builder_end(grouplist_builder);
+       g_variant_builder_unref(grouplist_builder);
+
+       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "get_group_membership",
+               g_variant_new("(qyy@aq)", addr16, ep, group_count,      grouplist_variant),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'get_group_membership' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_remove_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+               zb_zcl_group_remove_group_cb cb, void *user_data)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_group_remove_group()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_group_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_GROUP_INTERFACE,  "remove_group_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_GROUP_REMOVE_GROUP_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_group", g_variant_new("(qyq)",
+               addr16, ep, group_id), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'remove_group' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_remove_all_group(zb_nwk_addr addr16, unsigned char ep)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_group_remove_all_group()");
+
+       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "remove_all_group",
+               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'remove_all_group' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_add_group_if_identifying(zb_nwk_addr addr16, unsigned char ep,
+               unsigned short group_id, const char *group_name)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       int j = 0;
+       GVariant *groupname_variant = NULL;
+       GVariantBuilder *groupname_builder = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       groupname_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       while (group_name[j] != '\0') {
+               g_variant_builder_add(groupname_builder, "(y)", group_name[j]);
+               j++;
+       }
+       groupname_variant = g_variant_builder_end(groupname_builder);
+       g_variant_builder_unref(groupname_builder);
+
+       variant = g_dbus_proxy_call_sync(zcl_group_proxy, "add_group_if_identifying",
+               g_variant_new("(qyq@a(y))", addr16, ep, group_id, groupname_variant),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'add_group_if_identifying' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_level_control_move_to_level(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char level, unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_level_control_move_to_level()");
+
+       variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level",
+               g_variant_new("(qyyq)", addr16, ep, level, transition_time),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_to_level' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_level_control_move(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char move_mode, unsigned char rate)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_level_control_move()");
+
+       variant = g_dbus_proxy_call_sync(level_control_gproxy, "move",
+               g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_level_control_step(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char step_mode, unsigned char step_size,
+               unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_level_control_step()");
+
+       variant = g_dbus_proxy_call_sync(level_control_gproxy, "step",
+               g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'step' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_level_control_stop(zb_nwk_addr addr16, unsigned char ep)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_level_control_stop()");
+
+       variant = g_dbus_proxy_call_sync(level_control_gproxy, "stop",
+               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'stop' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_level_control_move_to_level_with_on_off(zb_nwk_addr addr16,
+               unsigned char ep, unsigned char level, unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_level_control_move_to_level_with_on_off()");
+
+       variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_to_level_with_on_off",
+               g_variant_new("(qyyq)", addr16, ep, level, transition_time),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_to_level_with_on_off' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_level_control_move_with_on_off(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char move_mode, unsigned char rate)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_level_control_move_with_on_off()");
+
+       variant = g_dbus_proxy_call_sync(level_control_gproxy, "move_with_on_off",
+               g_variant_new("(qyyy)", addr16, ep, move_mode, rate),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'move_with_on_off' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_level_control_step_with_on_off(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char step_mode, unsigned char step_size,
+               unsigned short transition_time)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_level_control_step_with_on_off()");
+
+       variant = g_dbus_proxy_call_sync(level_control_gproxy, "step_with_on_off",
+               g_variant_new("(qyyyq)", addr16, ep, step_mode, step_size, transition_time),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'step_with_on_off' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_onoff_set(zb_nwk_addr addr16, unsigned char ep, unsigned char on_off_type)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(on_off_gproxy, "set_on_off",
+               g_variant_new("(qyy)", addr16, ep, on_off_type), G_DBUS_CALL_FLAGS_NONE,
+               -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'set_on_off' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_zone_enroll_response(zb_nwk_addr addr16, unsigned char dst_ep,
+               unsigned char enroll_response_code, unsigned char zone_id)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_ias_zone_proxy, "enroll_response",
+               g_variant_new("(qyyy)", addr16, dst_ep, enroll_response_code, zone_id),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'enroll_response' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_pollcontrol_check_in_response(zb_nwk_addr addr16, unsigned char ep,
+               unsigned char start_fast_polling, unsigned short fast_poll_timeout)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "check_in_response",
+               g_variant_new("(qyyq)", addr16, ep, start_fast_polling, fast_poll_timeout),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'check_in_response' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_pollcontrol_fast_poll_stop(zb_nwk_addr addr16, unsigned char ep)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "fast_poll_stop",
+               g_variant_new("(qy)", addr16, ep), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'fast_poll_stop' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_pollcontrol_set_long_poll_interval(zb_nwk_addr addr16, unsigned char ep,
+       unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_pollcontrol_set_long_poll_interval()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_poll_control_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_POLL_CONTROL_INTERFACE,  "checkin_response",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_long_poll_interval",
+                       g_variant_new("(qyu)", addr16, ep, new_long_poll_interval),
+                       G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'set_long_poll_interval' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_pollcontrol_set_short_poll_interval(zb_nwk_addr addr16, unsigned char ep,
+       unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       DBG("zbl_pollcontrol_set_short_poll_interval()");
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_poll_control_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_POLL_CONTROL_INTERFACE,  "checkin_response",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_POLLCONTROL_SET_POLL_INTERVAL_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_poll_control_proxy, "set_short_poll_interval",
+                       g_variant_new("(qyu)", addr16, ep, new_short_poll_interval),
+                       G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'set_short_poll_interval' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_add_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       unsigned char scene_id, unsigned short transition_time, const char *scene_name,
+       unsigned short ext_field_len, const char *extension_field_sets,
+       zb_zcl_scene_add_scene_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       int j = 0;
+       int index = 0;
+       GVariant *scenename_variant = NULL;
+       GVariantBuilder *scenename_builder = NULL;
+       GVariant *extensionfieldSet_variant = NULL;
+       GVariantBuilder *extensionfieldSet_builder = NULL;
+
+       DBG("zbl_add_scene()");
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_scene_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_SCENE_INTERFACE,  "add_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_SCENE_ADD_SCENE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       scenename_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+       while ('\0' != scene_name[j]) {
+               g_variant_builder_add(scenename_builder, "(y)", scene_name[j]);
+               j++;
+       }
+       scenename_variant = g_variant_builder_end(scenename_builder);
+       g_variant_builder_unref(scenename_builder);
+
+       extensionfieldSet_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+
+       while (index < ext_field_len) {
+               INFO("Ext contents 0x%02X", extension_field_sets[index]);
+               g_variant_builder_add(extensionfieldSet_builder, "(y)", extension_field_sets[index]);
+               index++;
+       }
+       extensionfieldSet_variant = g_variant_builder_end(extensionfieldSet_builder);
+       g_variant_builder_unref(extensionfieldSet_builder);
+
+       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "add_scene",
+               g_variant_new("(qyqyqq@a(y)@a(y))", addr16, ep, group_id, scene_id, transition_time,
+               ext_field_len, scenename_variant, extensionfieldSet_variant), G_DBUS_CALL_FLAGS_NONE,
+               to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'add_scene' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_view_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       DBG("zbl_scene_view_scene()");
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_scene_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_SCENE_INTERFACE,  "view_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0,
+                       _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_SCENE_VIEW_SCENE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "view_scene",
+               g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE,
+               to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'view_scene' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_remove_scene(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_cb cb,
+       void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       DBG("zbl_scene_remove_scene()");
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_scene_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_SCENE_INTERFACE,  "remove_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_SCENE_REMOVE_SCENE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_scene",
+               g_variant_new("(qyqy)", addr16, ep, group_id, scene_id),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'remove_scene' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_remove_all_scene(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       DBG("zbl_scene_remove_all_scene()");
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_scene_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_SCENE_INTERFACE,  "remove_all_scene_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
+                       _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_SCENE_REMOVE_ALL_SCENE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "remove_all_scene",
+               g_variant_new("(qyq)", addr16, ep, group_id),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'remove_all_scene' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_store_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       DBG("zbl_scene_store_scene()");
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_scene_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_SCENE_INTERFACE,  "store_scene_rsp", ZIGBEE_CONTROL_OBJECT_PATH,
+                       NULL, 0, _zbl_response_cb, container, _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_SCENE_STORE_SCENE_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "store_scene",
+               g_variant_new("(qyqy)", addr16, ep, group_id, scene_id),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'store_scene' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_recall_scene(zb_nwk_addr addr16, unsigned char ep,     unsigned short group_id,
+       unsigned char scene_id)
+{
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "recall_scene",
+               g_variant_new("(qyqy)", addr16, ep, group_id, scene_id), G_DBUS_CALL_FLAGS_NONE,
+               -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'recall_scene' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_get_scene_membership(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, zb_zcl_scene_get_scene_membership_cb cb, void *user_data)
+{
+       int sub_id, to;
+       zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       DBG("zbl_scene_get_scene_membership()");
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR);
+
+       container = calloc(1, sizeof(zbl_req_cb_s));
+       RETVM_IF(NULL == container, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       to = zbl_dbus_get_timeout(zcl_scene_proxy);
+       sub_id = g_dbus_connection_signal_subscribe((GDBusConnection*)gdbus_conn, NULL,
+                       ZIGBEE_ZCL_SCENE_INTERFACE, "get_scene_membership_rsp",
+                       ZIGBEE_CONTROL_OBJECT_PATH, NULL, 0, _zbl_response_cb, container,
+                       _zbl_request_cleanup);
+
+       if (0 == sub_id) {
+               ERR("g_dbus_connection_signal_subscribe() Fail");
+               if (container) {
+                       free(container);
+                       container = NULL;
+               }
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       container->cb = cb;
+       container->sid = sub_id;
+       container->cid = ZBL_ZCL_SCENE_GET_SCENE_MEMBERSHIP_REQ;
+       container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
+       container->userdata = user_data;
+
+       variant = g_dbus_proxy_call_sync(zcl_scene_proxy, "get_scene_membership",
+               g_variant_new("(qyq)", addr16, ep, group_id),
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get get_scene_membership [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_thermostat_adjust_setpoint(zb_nwk_addr addr16, unsigned char ep, unsigned char mode,
+       unsigned char amount)
+{
+       int result = ZIGBEE_ERROR_IO_ERROR;
+       GVariant *variant = NULL;
+       GError *dbus_err = NULL;
+
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR);
+
+       variant = g_dbus_proxy_call_sync(thermostat_gproxy, "setpoint_raise_lower",
+               g_variant_new("(qyyy)", addr16, ep, mode, amount),
+               G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+
+       if (!variant) {
+               ERR("Failed to get 'setpoint_raise_lower' [%s]", dbus_err->message);
+               if (strstr(dbus_err->message, "AccessDenied"))
+                       result = ZIGBEE_ERROR_PERMISSION_DENIED;
+               else
+                       result = ZIGBEE_ERROR_IO_ERROR;
+
+               g_error_free(dbus_err);
+               return result;
+       }
+
+       g_variant_get(variant, "(i)", &result);
+       DBG("ret = [0x%x]", result);
+       g_variant_unref(variant);
+
+       return result;
+}
+
+int zbl_dbus_start(zb_zigbee_h handle)
+{
+       FN_CALL;
+
+       GError *error = NULL;
+       unsigned int id;
+
+       if (gdbus_conn) {
+               zbl_ref_count++;
+               return ZIGBEE_ERROR_NONE;
+       }
+
+       gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (NULL == gdbus_conn) {
+               ERR("Couldn't connect to the System bus [%s]\n", error->message);
+               g_error_free(error);
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       id = g_signal_connect(gdbus_conn, "notify::g-name-owner",
+                       G_CALLBACK(_zbl_dbus_name_owner_notify), handle);
+       if (0 == id) {
+               ERR("g_signal_connect() Fail\n");
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       /* Phase 1. Subscribe signals */
+       _zbl_dbus_subscribe_signal(handle);
+
+       /* Phase 2. Make proxies */
+       service_gproxy = _zbl_get_service_proxy();
+       RETVM_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get service_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(service_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       on_off_gproxy = _zbl_get_on_off_proxy();
+       RETVM_IF(NULL == on_off_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get on_off_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(on_off_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       door_lock_gproxy = _zbl_get_door_lock_proxy();
+       RETVM_IF(NULL == door_lock_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get door_lock_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(door_lock_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       level_control_gproxy = _zbl_get_level_control_proxy();
+       RETVM_IF(NULL == level_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get level_control_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(level_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       thermostat_gproxy = _zbl_get_thermostat_proxy();
+       RETVM_IF(NULL == thermostat_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get thermostat_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(thermostat_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       fan_control_gproxy = _zbl_get_fan_control_proxy();
+       RETVM_IF(NULL == fan_control_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get fan_control_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(fan_control_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       alarm_gproxy = _zbl_get_alarm_proxy();
+       RETVM_IF(NULL == alarm_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get alarm_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(alarm_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       mfglib_gproxy = _zbl_get_mfglib_proxy();
+       RETVM_IF(NULL == mfglib_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get mfglib_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(mfglib_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zcl_global_proxy = _zbl_get_zcl_global_proxy();
+       RETVM_IF(NULL == zcl_global_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_global_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_global_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zdo_dev_proxy = _zbl_get_zdo_dev_proxy();
+       RETVM_IF(NULL == zdo_dev_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_dev_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_dev_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zcl_basic_proxy = _zbl_get_basic_proxy();
+       RETVM_IF(NULL == zcl_basic_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_basic_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_basic_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zcl_identify_proxy = _zbl_get_identify_proxy();
+       RETVM_IF(NULL == zcl_identify_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_identify_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_identify_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zcl_ias_zone_proxy = _zbl_get_ias_zone_proxy();
+       RETVM_IF(NULL == zcl_ias_zone_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_ias_zone_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_ias_zone_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zcl_poll_control_proxy = _zbl_get_poll_control_proxy();
+       RETVM_IF(NULL == zcl_poll_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_poll_control_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_poll_control_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zcl_group_proxy = _zbl_get_group_proxy();
+       RETVM_IF(NULL == zcl_group_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_group_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_group_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zcl_scene_proxy = _zbl_get_scene_proxy();
+       RETVM_IF(NULL == zcl_scene_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_scene_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_scene_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zdo_bind_proxy = _zbl_get_zdo_bind_proxy();
+       RETVM_IF(NULL == zdo_bind_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zdo_bind_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zdo_bind_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zcl_color_control_proxy = _zbl_get_color_control_proxy();
+       RETVM_IF(NULL == zcl_color_control_proxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get zcl_color_control_proxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(zcl_color_control_proxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       custom_gproxy = _zbl_get_custom_gproxy();
+       RETVM_IF(NULL == custom_gproxy, ZIGBEE_ERROR_IO_ERROR, "Couldn't get custom_gproxy");
+       g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(custom_gproxy), ZIGBEE_BROADCAST_TIMEOUT);
+
+       zbl_ref_count++;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+int zbl_dbus_stop(zb_zigbee_h handle)
+{
+       struct zbl_zigbee_s *h = handle;
+       DBG("zbl_dbus_stop()");
+
+       if (0 >= zbl_ref_count) {
+               WARN("dbus does not initiaized\n");
+               return ZIGBEE_ERROR_NONE;
+       }
+
+       if (0 > --zbl_ref_count) {
+               DBG("all connections closed\n");
+               zbl_ref_count = 0;
+               return ZIGBEE_ERROR_NONE;
+       }
+
+       if (gdbus_conn) {
+               _zbl_dbus_unsubscribe_signal(h->dbus_sub_ids);
+               h->dbus_sub_ids = NULL;
+
+               g_object_unref(service_gproxy);
+               service_gproxy = NULL;
+               g_object_unref(on_off_gproxy);
+               on_off_gproxy = NULL;
+               g_object_unref(door_lock_gproxy);
+               door_lock_gproxy = NULL;
+               g_object_unref(level_control_gproxy);
+               level_control_gproxy = NULL;
+               g_object_unref(thermostat_gproxy);
+               thermostat_gproxy = NULL;
+               g_object_unref(alarm_gproxy);
+               alarm_gproxy = NULL;
+               g_object_unref(fan_control_gproxy);
+               fan_control_gproxy = NULL;
+
+               g_object_unref(mfglib_gproxy);
+               mfglib_gproxy = NULL;
+               g_object_unref(zcl_global_proxy);
+               zcl_global_proxy = NULL;
+               g_object_unref(zcl_color_control_proxy);
+               zcl_color_control_proxy = NULL;
+               g_object_unref(custom_gproxy);
+               custom_gproxy = NULL;
+
+               g_object_unref(gdbus_conn);
+               gdbus_conn = NULL;
+
+               DBG("zbl_dbus_stop() finished");
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+GDBusConnection* zbl_dbus_get_object(void)
+{
+       return gdbus_conn;
+}
+
+int zbl_dbus_get_timeout(GDBusProxy *proxy)
+{
+       gint timeout;
+       RETV_IF(NULL == gdbus_conn, ZIGBEE_BROADCAST_TIMEOUT);
+       timeout = g_dbus_proxy_get_default_timeout(proxy);
+       if (timeout <= 0) {
+               ERR("Invalid timeout (%d)", timeout);
+               return ZIGBEE_BROADCAST_TIMEOUT;
+       }
+       return timeout;
+}
+
+int zbl_check_privilege()
+{
+       int ret = _check_zigbee_privilege();
+       if (ret != ZIGBEE_ERROR_NONE) {
+               ERR("Failed to check privilege");
+               return ret;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
diff --git a/src/zbl-dbus.h b/src/zbl-dbus.h
new file mode 100644 (file)
index 0000000..eebe438
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2015 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_ZIGBEE_LIBRARY_DBUS_H__
+#define __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__
+
+#include <gio/gio.h>
+
+#include "zb-common.h"
+
+#include "zbl.h"
+#include "zbl-dbus.h"
+
+int zbl_dbus_start(zb_zigbee_h handle);
+int zbl_dbus_stop(zb_zigbee_h handle);
+GDBusConnection* zbl_dbus_get_object(void);
+int zbl_dbus_get_timeout(GDBusProxy *proxy);
+int zbl_check_privilege();
+
+int zbl_enable(zb_zigbee_h handle);
+int zbl_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler);
+int zbl_disable(void);
+int zbl_hw_reset(void);
+int zbl_coex_start(unsigned char channel);
+int zbl_coex_stop(void);
+int zbl_get_network_info(zb_ieee_addr addr64, zb_nwk_addr *nodeid,
+       zb_nwk_addr *panid, unsigned char *channel, unsigned char *tx_power);
+int zbl_get_controller_mac_address(zb_ieee_addr addr64);
+int zbl_get_cluster_list(zb_ieee_addr eui64, unsigned char endpoint,
+       unsigned char *in_cluster_count, unsigned short in_cluster_list[],
+       unsigned char *out_cluster_count, unsigned short out_cluster_list[]);
+int zbl_get_endpoint_list(zb_ieee_addr eui64, unsigned char *count,
+       unsigned char list[]);
+int zbl_get_all_device_info(zb_end_dev_info_h **dev_list, unsigned char* num);
+int zbl_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data);
+int zbl_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb,
+       void *user_data);
+int zbl_leave_device(zb_ieee_addr addr64, bool remove_children, bool rejoin);
+int zbl_permit_join(unsigned char duration, bool broadcast);
+
+int zbl_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64,
+       unsigned char request_type, unsigned char start_idx, zb_zdo_addr_cb cb,
+       void *user_data);
+int zbl_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb,
+       void *user_data);
+int zbl_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb,
+       void *user_data);
+int zbl_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       zb_zdo_simple_desc_cb cb, void *user_data);
+int zbl_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned short profileid, unsigned char num_in_clusters,
+       unsigned short *in_clusters, unsigned char num_out_clusters,
+       unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data);
+int zbl_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64,
+       unsigned char capability);
+
+int zbl_node_desc_req(zb_nwk_addr addr16, zb_zdo_node_desc_cb cb, void *user_data);
+int zbl_power_desc_req(zb_nwk_addr addr16, zb_zdo_power_desc_cb cb,
+       void *user_data);
+int zbl_complex_desc_req(zb_nwk_addr addr16, zb_zdo_complex_desc_cb cb,
+       void *user_data);
+int zbl_user_desc_req(zb_nwk_addr addr16, zb_zdo_user_desc_cb cb, void *user_data);
+int zbl_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len,
+       unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data);
+int zbl_bind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64,
+       unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64,
+       unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep, zb_zdo_bind_cb cb,
+       void *user_data);
+int zbl_unbind_req(zb_nwk_addr dst_addr16, zb_ieee_addr src_addr64,
+       unsigned char src_ep, unsigned short clusterid, zb_ieee_addr dst_addr64,
+       unsigned char type, zb_nwk_addr group_addr, unsigned char dst_ep,
+       zb_zdo_unbind_cb cb, void *user_data);
+int zbl_mgmt_nwk_disc_req(zb_nwk_addr addr16, unsigned int scan_channels,
+       unsigned char scan_duration, unsigned char scan_count, unsigned char start_idx,
+       zb_zdo_mgmt_nwk_disc_cb cb, void *user_data);
+int zbl_mgmt_nwk_update_req(unsigned int scan_channels,
+       unsigned char scan_duration, unsigned char scan_count, unsigned char nwk_update_id,
+       zb_nwk_addr nwk_manager_addr);
+int zbl_mgmt_lqi_req(zb_nwk_addr addr16, unsigned char start_idx,
+       zb_zdo_mgmt_lqi_cb cb, void *user_data);
+int zbl_mgmt_rtg_req(zb_nwk_addr addr16, unsigned char start_idx,
+       zb_zdo_mgmt_rtg_cb cb, void *user_data);
+int zbl_mgmt_bind_req(zb_nwk_addr addr16, unsigned char start_idx,
+       zb_zdo_mgmt_bind_cb cb, void *user_data);
+int zbl_mgmt_leave_device(zb_ieee_addr addr64, unsigned char remove_children,
+       unsigned rejoin, zb_zdo_mgmt_leave_cb cb, void *user_data);
+int zbl_mgmt_permit_joining_req(zb_nwk_addr addr16, unsigned char duration,
+       unsigned char tc_significance, zb_zdo_mgmt_permit_joining_cb cb, void *user_data);
+
+/* Custom Commands */
+int zbl_aps_send(zb_nwk_addr addr16, unsigned char aps_fc,
+       unsigned char src_ep, unsigned char dst_ep, unsigned short clusterid,
+       unsigned short profileid, unsigned char zcl_fc, unsigned short mfg_code,
+       unsigned char cmd_id, unsigned short payload_len, unsigned char *payload,
+       zb_aps_send_cb cb, void *user_data);
+int zbl_zcl_send(zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
+       unsigned short clusterid, unsigned char zcl_fc, unsigned char cmd,
+       unsigned short payload_len, unsigned char *payload,
+       zb_zcl_send_cb cb, void *user_data);
+int zbl_send_to_local(unsigned short length, unsigned char *data,
+               zb_send_to_local_cb cb, void *user_data);
+
+/* ZCL Global Commands */
+int zbl_read_attr_req(zb_zigbee_h handle, unsigned short addr16, unsigned char dest_ep,
+       unsigned char zcl_fc, unsigned short clusterid, unsigned short *attribute_ids,
+       int attribute_ids_len, zb_zcl_global_attr_read_cb cb, void *user_data);
+int zbl_write_attr_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
+       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
+       void **records,
+       int count, zb_zcl_global_attr_write_cb cb, void *user_data);
+int zbl_wattr_undivided_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, void **records, int count,
+       zb_zcl_global_attr_write_cb cb, void *user_data);
+int zbl_wattr_req_no_cb(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char src_ep,
+       unsigned char dst_ep, unsigned char zcl_fc, unsigned short clusterid,
+       void **records, int count);
+int zbl_write_config_report(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, void **records, int count,
+       zb_zcl_global_config_report_write_cb cb, void *user_data);
+int zbl_read_config_report(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, void **records, int count,
+       zb_zcl_global_config_report_read_cb cb, void *user_data);
+int zbl_discover_attr_req(zb_zigbee_h handle, unsigned short addr16,
+       unsigned char src_ep, unsigned char dest_ep, unsigned char zcl_fc,
+       unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids,
+               zb_zcl_global_attr_discover_cb cb, void *user_data);
+int zbl_discover_cmds_gen(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, unsigned char start_command_id,
+       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data);
+int zbl_discover_cmds_recv(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, unsigned char start_command_id,
+       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data);
+int zbl_discover_attr_ext(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids,
+       zb_zcl_global_attr_extended_discover_cb cb, void *user_data);
+
+/* ZCL Alarm Cluster */
+int zbl_reset_alarm(zb_nwk_addr addr16, unsigned char ep, unsigned char alarm_code,
+       unsigned short clusterid);
+int zbl_reset_all_alarm(zb_nwk_addr addr16, unsigned char ep);
+int zbl_get_alarm(zb_nwk_addr addr16, unsigned char ep, zb_zcl_alarm_get_alarm_cb cb,
+       void *user_data);
+int zbl_reset_all_alarm_log(zb_nwk_addr addr16, unsigned char ep);
+
+/* ZCL Color Control Cluster */
+int zbl_ccontrol_move_to_hue(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char hue, unsigned char direction, unsigned short transition_time);
+int zbl_ccontrol_move_hue(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char move_mode, unsigned char rate);
+int zbl_ccontrol_step_hue(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char step_mode, unsigned char step_size, unsigned char transition_time);
+int zbl_ccontrol_move_to_saturation(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char saturation, unsigned short transition_time);
+int zbl_ccontrol_move_saturation(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char move_mode, unsigned char rate);
+int zbl_ccontrol_step_saturation(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char step_mode, unsigned char step_size, unsigned char transition_time);
+int zbl_ccontrol_move_to_hue_and_saturation(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char hue, unsigned char saturation, unsigned short transition_time);
+int zbl_ccontrol_move_to_color(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short color_x, unsigned short color_y, unsigned short transition_time);
+int zbl_ccontrol_move_color(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short rate_x, unsigned short rate_y);
+int zbl_ccontrol_step_color(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short step_x, unsigned short step_y, unsigned short transition_time);
+int zbl_ccontrol_move_to_color_temperature(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short color_temperature, unsigned short transition_time);
+
+/* ZCL Basic Cluster */
+int zbl_reset_factory_default(zb_nwk_addr addr16, unsigned char ep);
+
+/* ZCL Identity Cluster */
+int zbl_identify(zb_nwk_addr addr16, unsigned char dst_ep, unsigned short identify_time);
+int zbl_identify_query(zb_nwk_addr addr16, unsigned char dst_ep,
+       zb_zcl_identify_query_cb cb, void *user_data);
+
+/* ZCL Group Cluster */
+int zbl_add_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       const char *group_name, zb_zcl_group_add_group_cb cb, void *user_data);
+int zbl_view_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       zb_zcl_group_view_group_cb cb, void *user_data);
+int zbl_group_get_group_membership(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char group_count, unsigned short *group_list,
+       zb_zcl_group_get_group_membership_cb cb, void *user_data);
+int zbl_remove_group(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       zb_zcl_group_remove_group_cb cb, void *user_data);
+int zbl_remove_all_group(zb_nwk_addr addr16, unsigned char ep);
+int zbl_add_group_if_identifying(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, const char *group_name);
+
+/* ZCL Level Control Cluster */
+int zbl_level_control_move_to_level(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char level, unsigned short transition_time);
+int zbl_level_control_move(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char move_mode, unsigned char rate);
+int zbl_level_control_step(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char step_mode, unsigned char step_size, unsigned short transition_time);
+int zbl_level_control_stop(zb_nwk_addr addr16, unsigned char ep);
+int zbl_level_control_move_to_level_with_on_off(zb_nwk_addr addr16,
+       unsigned char ep, unsigned char level, unsigned short transition_time);
+int zbl_level_control_move_with_on_off(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char move_mode, unsigned char rate);
+int zbl_level_control_step_with_on_off(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char step_mode, unsigned char step_size, unsigned short transition_time);
+
+/* ZCL On/Off Cluster */
+int zbl_onoff_set(zb_nwk_addr addr16, unsigned char ep, unsigned char on_off_type);
+int zbl_zone_enroll_response(zb_nwk_addr addr16, unsigned char dst_ep,
+       unsigned char enroll_response_code, unsigned char zone_id);
+
+/* Poll-control Cluster */
+int zbl_pollcontrol_check_in_response(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char start_fast_polling, unsigned short fast_poll_timeout);
+int zbl_pollcontrol_fast_poll_stop(zb_nwk_addr addr16, unsigned char ep);
+int zbl_pollcontrol_set_long_poll_interval(zb_nwk_addr addr16, unsigned char ep,
+       unsigned int new_long_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data);
+int zbl_pollcontrol_set_short_poll_interval(zb_nwk_addr addr16, unsigned char ep,
+       unsigned int new_short_poll_interval, zb_zcl_pollctrl_check_in_cb cb, void *user_data);
+
+/* Scene Cluster */
+int zbl_add_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       unsigned char scene_id, unsigned short transition_time, const char *scene_name,
+       unsigned short ext_field_len, const char *extension_field_sets,
+       zb_zcl_scene_add_scene_cb cb, void *user_data);
+int zbl_view_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       unsigned char scene_id, zb_zcl_scene_view_scene_cb cb, void *user_data);
+int zbl_remove_scene(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, unsigned char scene_id, zb_zcl_scene_remove_scene_cb cb,
+       void *user_data);
+int zbl_remove_all_scene(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb, void *user_data);
+int zbl_store_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       unsigned char scene_id, zb_zcl_scene_store_scene_cb cb, void *user_data);
+int zbl_recall_scene(zb_nwk_addr addr16, unsigned char ep, unsigned short group_id,
+       unsigned char scene_id);
+int zbl_get_scene_membership(zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, zb_zcl_scene_get_scene_membership_cb cb, void *user_data);
+
+/* Thermostat Cluster */
+int zbl_thermostat_adjust_setpoint(zb_nwk_addr addr16, unsigned char ep,
+       unsigned char mode, unsigned char amount);
+
+#endif /* __TIZEN_NETWORK_ZIGBEE_LIBRARY_DBUS_H__ */
diff --git a/src/zbl-zcl-alarm.c b/src/zbl-zcl-alarm.c
new file mode 100644 (file)
index 0000000..905cb42
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_alarm_reset_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       unsigned char alarm_code, zb_cluster_id clusterid)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_reset_alarm(addr16, ep, alarm_code, clusterid);
+       return ret;
+}
+
+API int zb_zcl_alarm_reset_all_alarm(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_reset_all_alarm(addr16, ep);
+       return ret;
+}
+
+API int zb_zcl_alarm_get_alarm(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       zb_zcl_alarm_get_alarm_cb cb, void *user_data)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_get_alarm(addr16, ep, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_alarm_reset_all_alarm_log(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_reset_all_alarm_log(addr16, ep);
+       return ret;
+}
+
diff --git a/src/zbl-zcl-basic.c b/src/zbl-zcl-basic.c
new file mode 100644 (file)
index 0000000..d46187b
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_basic_reset_factory_default(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_reset_factory_default(addr16, ep);
+       return ret;
+}
diff --git a/src/zbl-zcl-color-control.c b/src/zbl-zcl-color-control.c
new file mode 100644 (file)
index 0000000..1668cdc
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_ccontrol_move_to_hue(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char hue, unsigned char direction,
+       unsigned short transition_time)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_move_to_hue(addr16, ep, hue, direction, transition_time);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_move_hue(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char move_mode, unsigned char rate)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_move_hue(addr16, ep, move_mode, rate);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_step_hue(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char step_mode, unsigned char step_size,
+       unsigned char transition_time)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_step_hue(addr16, ep, step_mode, step_size, transition_time);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_move_to_saturation(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char ep, unsigned char saturation,
+       unsigned short transition_time)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_move_to_saturation(addr16, ep, saturation, transition_time);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_move_saturation(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char move_mode, unsigned char rate)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_move_saturation(addr16, ep, move_mode, rate);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_step_saturation(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char step_mode, unsigned char step_size,
+       unsigned char transition_time)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_step_saturation(addr16, ep, step_mode, step_size, transition_time);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_move_to_hue_and_saturation(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char ep, unsigned char hue, unsigned char saturation,
+       unsigned short transition_time)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_move_to_hue_and_saturation(addr16, ep, hue, saturation, transition_time);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_move_to_color(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short color_x, unsigned short color_y,
+       unsigned short transition_time)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_move_to_color(addr16, ep, color_x, color_y, transition_time);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_move_color(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short rate_x, unsigned short rate_y)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_move_color(addr16, ep, rate_x, rate_y);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_step_color(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short step_x, unsigned short step_y,
+       unsigned short transition_time)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_step_color(addr16, ep, step_x, step_y, transition_time);
+       return ret;
+}
+
+API int zb_zcl_ccontrol_move_to_color_temperature(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char ep, unsigned short color_temperature,
+       unsigned short transition_time)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_ccontrol_move_to_color_temperature(addr16, ep, color_temperature, transition_time);
+       return ret;
+}
+
diff --git a/src/zbl-zcl-global-cmd.c b/src/zbl-zcl-global-cmd.c
new file mode 100644 (file)
index 0000000..1a57b89
--- /dev/null
@@ -0,0 +1,232 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+/* For test */
+#define ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA 0
+
+API int zb_zcl_global_attr_read(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, unsigned short *attribute_ids, int attribute_ids_len,
+       zb_zcl_global_attr_read_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == attribute_ids, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == attribute_ids_len, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_read_attr_req(handle, addr16, dst_ep, zcl_fc, clusterid,
+                       attribute_ids, attribute_ids_len, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_global_attr_read_structured(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, zb_zcl_read_structured_attr_record_h *records,
+       int count, zb_zcl_global_attr_read_cb cb, void *user_data)
+{
+#if (0 == ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA)
+       return ZIGBEE_ERROR_NOT_SUPPORTED;
+#endif
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zcl_global_attr_write(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, zb_zcl_write_attr_record_h *records, int count,
+       zb_zcl_global_attr_write_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_write_attr_req(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, records, count, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_global_attr_write_undivided(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
+       unsigned char zcl_fc, unsigned short clusterid,
+       zb_zcl_write_attr_record_h *records, int count,
+       zb_zcl_global_attr_write_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_wattr_undivided_req(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, records, count, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_global_attr_write_structured(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, zb_zcl_write_attr_structured_record_h *records,
+       int count, zb_zcl_global_attr_write_cb cb, void *user_data)
+{
+#if (0 == ZIGBEE_SUPPORT_ORDERED_SEQUENCE_DATA)
+       return ZIGBEE_ERROR_NOT_SUPPORTED;
+#endif
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zcl_global_attr_write_no_rsp(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, zb_zcl_write_attr_record_h *records, int count)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_wattr_req_no_cb(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, records, count);
+       return ret;
+}
+
+API int zb_zcl_global_config_report_write(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, zb_zcl_reporting_config_record_h *records, int count,
+       zb_zcl_global_config_report_write_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_write_config_report(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, records, count, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_global_config_report_read(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, zb_zcl_read_report_config_record_h *records,
+       int count, zb_zcl_global_config_report_read_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_read_config_report(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, records, count, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_global_attr_discover(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char src_ep, unsigned char dst_ep, unsigned char zcl_fc,
+       unsigned short clusterid, unsigned short start_id, unsigned char max_attribute_ids,
+       zb_zcl_global_attr_discover_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_discover_attr_req(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, start_id, max_attribute_ids, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_global_discover_cmds_received(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
+       unsigned char zcl_fc, unsigned short clusterid, unsigned char start_command_id,
+       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_discover_cmds_recv(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, start_command_id, max_command_ids, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_global_discover_cmds_generated(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
+       unsigned char zcl_fc, unsigned short clusterid, unsigned char start_command_id,
+       unsigned char max_command_ids, zb_zcl_global_discover_cmds_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_discover_cmds_gen(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, start_command_id, max_command_ids, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_global_attr_extended_discover(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char src_ep, unsigned char dst_ep,
+       unsigned char zcl_fc, unsigned short clusterid, unsigned short start_id,
+       unsigned char max_attribute_ids, zb_zcl_global_attr_extended_discover_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_discover_attr_ext(handle, addr16, src_ep, dst_ep, zcl_fc,
+                       clusterid, start_id, max_attribute_ids, cb, user_data);
+       return ret;
+}
diff --git a/src/zbl-zcl-groups.c b/src/zbl-zcl-groups.c
new file mode 100644 (file)
index 0000000..ae54a92
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_group_add_group(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short group_id, char *group_name,
+       zb_zcl_group_add_group_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == group_name, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_add_group(addr16, ep, group_id, group_name, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_group_view_group(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short group_id, zb_zcl_group_view_group_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_view_group(addr16, ep, group_id, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_group_get_group_membership(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char group_count, unsigned short *group_list,
+       zb_zcl_group_get_group_membership_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == group_list, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_group_get_group_membership(addr16, ep, group_count, group_list, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_group_remove_group(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short group_id, zb_zcl_group_remove_group_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_remove_group(addr16, ep, group_id, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_group_remove_all_group(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_remove_all_group(addr16, ep);
+       return ret;
+}
+
+API int zb_zcl_group_add_group_if_identifying(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short group_id, const char *group_name)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_add_group_if_identifying(addr16, ep, group_id, group_name);
+       return ret;
+}
diff --git a/src/zbl-zcl-identify.c b/src/zbl-zcl-identify.c
new file mode 100644 (file)
index 0000000..984c725
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_identify(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       unsigned short identify_time)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_identify(addr16, ep, identify_time);
+       return ret;
+}
+
+API int zb_zcl_identify_query(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       zb_zcl_identify_query_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_identify_query(addr16, ep, cb, user_data);
+       return ret;
+}
diff --git a/src/zbl-zcl-isa-zone.c b/src/zbl-zcl-isa-zone.c
new file mode 100644 (file)
index 0000000..8d8aa66
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_zone_enroll_response(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char enroll_response_code, unsigned char zone_id)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_zone_enroll_response(addr16, ep, enroll_response_code, zone_id);
+       return ret;
+}
diff --git a/src/zbl-zcl-level-control.c b/src/zbl-zcl-level-control.c
new file mode 100644 (file)
index 0000000..24022a9
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_levelctrl_move_to_level(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char level, unsigned short transition_time)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_level_control_move_to_level(addr16, ep, level, transition_time);
+       return ret;
+}
+
+API int zb_zcl_levelctrl_move(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char move_mode, unsigned char rate)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_level_control_move(addr16, ep, move_mode, rate);
+       return ret;
+}
+
+API int zb_zcl_levelctrl_step(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       unsigned char step_mode, unsigned char step_size, unsigned short transition_time)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_level_control_step(addr16, ep, step_mode, step_size, transition_time);
+       return ret;
+}
+
+API int zb_zcl_levelctrl_stop(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_level_control_stop(addr16, ep);
+       return ret;
+}
+
+API int zb_zcl_levelctrl_move_to_level_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char level, unsigned short transition_time)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_level_control_move_to_level_with_on_off(addr16, ep, level, transition_time);
+       return ret;
+}
+
+API int zb_zcl_levelctrl_move_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char move_mode, unsigned char rate)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_level_control_move_with_on_off(addr16, ep, move_mode, rate);
+       return ret;
+}
+
+API int zb_zcl_levelctrl_step_with_on_off(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char step_mode, unsigned char step_size,
+       unsigned short transition_time)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_level_control_step_with_on_off(addr16, ep, step_mode, step_size, transition_time);
+       return ret;
+}
+
diff --git a/src/zbl-zcl-on-off.c b/src/zbl-zcl-on-off.c
new file mode 100644 (file)
index 0000000..3999c56
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_on_off_control(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       zb_zcl_on_off_e on_off_type)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_onoff_set(addr16, ep, on_off_type);
+       return ret;
+}
diff --git a/src/zbl-zcl-poll-control.c b/src/zbl-zcl-poll-control.c
new file mode 100644 (file)
index 0000000..27e634a
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_pollctrl_check_in_response(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char start_fast_polling, unsigned short fast_poll_timeout)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_pollcontrol_check_in_response(addr16, ep, start_fast_polling,
+               fast_poll_timeout);
+       return ret;
+}
+
+API int zb_zcl_pollctrl_fast_poll_stop(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_pollcontrol_fast_poll_stop(addr16, ep);
+       return ret;
+}
+
+API int zb_zcl_pollctrl_set_long_poll_interval(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char ep, unsigned int new_long_poll_interval,
+       zb_zcl_pollctrl_check_in_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_pollcontrol_set_long_poll_interval(addr16, ep, new_long_poll_interval,
+               cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_pollctrl_set_short_poll_interval(zb_zigbee_h handle,
+       zb_nwk_addr addr16, unsigned char ep, unsigned int new_short_poll_interval,
+       zb_zcl_pollctrl_check_in_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_pollcontrol_set_short_poll_interval(addr16, ep, new_short_poll_interval,
+               cb, user_data);
+       return ret;
+}
diff --git a/src/zbl-zcl-scenes.c b/src/zbl-zcl-scenes.c
new file mode 100644 (file)
index 0000000..190f6df
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_scene_add_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, unsigned char scene_id, unsigned short transition_time,
+       const char *scene_name, unsigned short ext_field_len,
+       const char *extension_field_sets, zb_zcl_scene_add_scene_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == scene_name, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == extension_field_sets, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_add_scene(addr16, ep, group_id, scene_id, transition_time, scene_name,
+               ext_field_len, extension_field_sets, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_scene_view_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, unsigned char scene_id, zb_zcl_scene_view_scene_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_view_scene(addr16, ep, group_id, scene_id, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_scene_remove_scene(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short group_id, unsigned char scene_id,
+       zb_zcl_scene_remove_scene_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_remove_scene(addr16, ep, group_id, scene_id, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_scene_remove_all_scene(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short group_id, zb_zcl_scene_remove_all_scene_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_remove_all_scene(addr16, ep, group_id, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_scene_store_scene(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       unsigned short group_id, unsigned char scene_id, zb_zcl_scene_store_scene_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_store_scene(addr16, ep, group_id, scene_id, cb, user_data);
+       return ret;
+}
+
+API int zb_zcl_scene_recall_scene(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short group_id, unsigned char scene_id)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_recall_scene(addr16, ep, group_id, scene_id);
+       return ret;
+}
+
+API int zb_zcl_scene_get_scene_membership(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned short group_id,
+       zb_zcl_scene_get_scene_membership_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_get_scene_membership(addr16, ep, group_id, cb, user_data);
+       return ret;
+}
+
diff --git a/src/zbl-zcl-thermostat.c b/src/zbl-zcl-thermostat.c
new file mode 100644 (file)
index 0000000..09edcd5
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zcl_thermostat_adjust_setpoint(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char ep, unsigned char mode, unsigned char amount)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(0x02 < mode, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+
+       ret = zbl_thermostat_adjust_setpoint(addr16, ep, mode, amount);
+       return ret;
+}
+
diff --git a/src/zbl-zcl.c b/src/zbl-zcl.c
new file mode 100644 (file)
index 0000000..871b49f
--- /dev/null
@@ -0,0 +1,1408 @@
+/*
+ * Copyright (c) 2016 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 <error.h>
+#include <stdlib.h>
+
+#include "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+#define ZB_GUARD_CHAR 1
+#define ZB_ZCL_OCTET_SIZE 1
+#define ZB_ZCL_LONG_OCTET_SIZE 2
+
+API int zb_read_attr_status_record_create(
+       zb_zcl_read_attr_status_record_h *handle)
+{
+       zb_zcl_read_attr_status_record_h simple = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       simple = calloc(1, sizeof(struct read_attribute_status_record_s));
+       RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       *handle = simple;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_clone(zb_zcl_read_attr_status_record_h src,
+       zb_zcl_read_attr_status_record_h *dst)
+{
+       struct read_attribute_status_record_s *srcs = src;
+       struct read_attribute_status_record_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct read_attribute_status_record_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, src, sizeof(struct read_attribute_status_record_s));
+       desc->value = calloc(1, zb_zcl_get_data_size(srcs->type));
+       RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+
+API int zb_read_attr_status_record_destroy(
+       zb_zcl_read_attr_status_record_h handle)
+{
+       struct read_attribute_status_record_s* h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       if (h->value)
+               free(h->value);
+       free(h);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_get_id(
+       zb_zcl_read_attr_status_record_h handle, unsigned short* id)
+{
+       struct read_attribute_status_record_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *id = h->id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_set_id(
+       zb_zcl_read_attr_status_record_h handle, unsigned short id)
+{
+       struct read_attribute_status_record_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->id = id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_get_status(
+       zb_zcl_read_attr_status_record_h handle, zb_zcl_status_e* status)
+{
+       struct read_attribute_status_record_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *status = h->status;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_set_status(
+       zb_zcl_read_attr_status_record_h handle, zb_zcl_status_e status)
+{
+       struct read_attribute_status_record_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->status = status;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_get_type(
+       zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e *type)
+{
+       struct read_attribute_status_record_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *type = h->type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_set_type(
+       zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e type)
+{
+       struct read_attribute_status_record_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->type = type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_get_value(
+       zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e* type,
+       unsigned char** value, int* count)
+{
+       int len = -1;
+       struct read_attribute_status_record_s* h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->value, ZIGBEE_ERROR_NO_DATA);
+
+       len = zb_zcl_get_data_size(h->type);
+       if (0 < len) {
+
+               *value = calloc(len + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(*value, h->value, len);
+               *type = h->type;
+               *count = len;
+
+       } else if (ZB_ZCL_OCTET_STRING == h->type || ZB_ZCL_CHARACTER_STRING == h->type) {
+
+               len = h->value[0];
+
+               *value = calloc(len + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(*value, h->value + ZB_ZCL_OCTET_SIZE, len);
+
+               *type = h->type;
+               *count = len;
+
+       } else if (ZB_ZCL_LONG_OCTET_STRING == h->type || ZB_ZCL_LONG_CHARACTER_STRING == h->type) {
+
+               len = h->value[0] & 0xff;
+               len |= (h->value[1] << 8) & 0xff00 ;
+
+               *value = calloc(len + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == *value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(*value, h->value + ZB_ZCL_LONG_OCTET_SIZE, len);
+
+               *type = h->type;
+               *count = len;
+
+       } else {
+               return ZIGBEE_ERROR_NOT_SUPPORTED;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_attr_status_record_set_value(
+       zb_zcl_read_attr_status_record_h handle, zb_zcl_data_type_e type,
+       unsigned char* value, int count)
+{
+       int len = -1;
+       struct read_attribute_status_record_s* h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       len = zb_zcl_get_data_size(type);
+       if (0 < len) {
+
+               h->value = calloc(len + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(h->value, value, len);
+               h->type = type;
+
+       } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) {
+
+               h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+
+               h->value[0] = count;
+               memcpy(h->value + ZB_ZCL_OCTET_SIZE, value + ZB_ZCL_OCTET_SIZE, count);
+
+       } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) {
+
+               h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+
+               h->value[0] = count & 0xff;
+               h->value[1] = (count >> 8) & 0xff ;
+               memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, len);
+
+       } else {
+               return ZIGBEE_ERROR_NOT_SUPPORTED;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discover_attr_info_create(zb_zcl_discover_attr_info_record_h *handle)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       zb_zcl_discover_attr_info_record_h simple = NULL;
+
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       simple = calloc(1, sizeof(struct discover_attribute_info_record_s));
+       RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = simple;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discover_attr_info_clone(zb_zcl_discover_attr_info_record_h src,
+       zb_zcl_discover_attr_info_record_h *dst)
+{
+       struct discover_attribute_info_record_s *srcs = src;
+       struct discover_attribute_info_record_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct discover_attribute_info_record_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, srcs, sizeof(struct discover_attribute_info_record_s));
+
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discover_attr_info_destroy(zb_zcl_discover_attr_info_record_h handle)
+{
+       struct discover_attribute_info_record_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discover_attr_info_get_id(
+       zb_zcl_discover_attr_info_record_h handle, unsigned short *id)
+{
+       struct discover_attribute_info_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *id = h->id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discover_attr_info_set_id(
+       zb_zcl_discover_attr_info_record_h handle, unsigned short id)
+{
+       struct discover_attribute_info_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->id = id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discover_attr_info_get_type(
+       zb_zcl_discover_attr_info_record_h handle, zb_zcl_data_type_e *type)
+{
+       struct discover_attribute_info_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *type = h->type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discover_attr_info_set_type(
+       zb_zcl_discover_attr_info_record_h handle, zb_zcl_data_type_e type)
+{
+       struct discover_attribute_info_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->type = type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_record_create(zb_zcl_write_attr_record_h *handle)
+{
+       zb_zcl_write_attr_record_h t = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       t = calloc(1, sizeof(struct write_attribute_record_s));
+       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       *handle = t;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_record_clone(zb_zcl_write_attr_record_h src,
+       zb_zcl_write_attr_record_h *dst)
+{
+       struct write_attribute_record_s *srcs = src;
+       struct write_attribute_record_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct write_attribute_record_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, src, sizeof(struct write_attribute_record_s));
+
+       desc->value = calloc(1, zb_zcl_get_data_size(srcs->type));
+       RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_record_destroy(zb_zcl_write_attr_record_h handle)
+{
+       struct write_attribute_record_s* h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       if (h->value) {
+               free(h->value);
+               h->value = NULL;
+       }
+       free(h);
+       h = NULL;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_record_set_id(zb_zcl_write_attr_record_h handle,
+       unsigned short id)
+{
+       struct write_attribute_record_s* h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->id = id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_record_set_type(zb_zcl_write_attr_record_h handle,
+       zb_zcl_data_type_e type)
+{
+       struct write_attribute_record_s* h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->type = type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_record_set_value(zb_zcl_write_attr_record_h handle,
+       zb_zcl_data_type_e type, unsigned char* value, int count)
+{
+       int len = -1;
+
+       struct write_attribute_record_s* h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       if (h->value) {
+               free(h->value);
+               h->value = NULL;
+       }
+
+       len = zb_zcl_get_data_size(type);
+       if (0 < len) {
+
+               h->value = calloc(len + ZB_GUARD_CHAR , sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(h->value, value, count);
+               h->type = type;
+
+       } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) {
+
+               h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               /* The first 1 byte indicate invalid or length of string */
+               h->value[0] = value[0] & 0xff;
+               memcpy(h->value + ZB_ZCL_OCTET_SIZE, value, count);
+
+       } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) {
+
+               h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+
+               /* The first 2 byte indicate invalid or length of string */
+               h->value[0] = count & 0xff;
+               h->value[1] = (count >> 8) & 0xff ;
+
+               memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, count);
+
+       } else {
+               return ZIGBEE_ERROR_NOT_SUPPORTED;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_status_create(zb_zcl_write_attr_status_record_h *handle)
+{
+       zb_zcl_write_attr_status_record_h simple = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       simple = calloc(1, sizeof(struct write_attribute_status_record_s));
+       RETVM_IF(NULL == simple, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = simple;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_status_clone(zb_zcl_write_attr_status_record_h src,
+       zb_zcl_write_attr_status_record_h *dst)
+{
+       struct write_attribute_status_record_s *srcs = src;
+       struct write_attribute_status_record_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct write_attribute_status_record_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, srcs, sizeof(struct write_attribute_status_record_s));
+
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_status_destroy(zb_zcl_write_attr_status_record_h handle)
+{
+       struct write_attribute_status_record_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_status_get_status(
+       zb_zcl_write_attr_status_record_h handle, zb_zcl_status_e *status)
+{
+       struct write_attribute_status_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *status = h->status;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_status_set_status(zb_zcl_write_attr_status_record_h handle,
+       zb_zcl_status_e status)
+{
+       struct write_attribute_status_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->status = status;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_status_get_id(zb_zcl_write_attr_status_record_h handle,
+       unsigned short *id)
+{
+       struct write_attribute_status_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *id = h->id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_write_attr_status_set_id(zb_zcl_write_attr_status_record_h handle,
+       unsigned short id)
+{
+       struct write_attribute_status_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->id = id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_create(zb_zcl_reporting_config_record_h *handle)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       zb_zcl_reporting_config_record_h t = NULL;
+
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       t = calloc(1, sizeof(struct reporting_configuration_record_s));
+       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = t;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_clone(zb_zcl_reporting_config_record_h src,
+       zb_zcl_reporting_config_record_h *dst)
+{
+       struct reporting_configuration_record_s *srcs = src;
+       struct reporting_configuration_record_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct reporting_configuration_record_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, src, sizeof(struct reporting_configuration_record_s));
+
+       desc->change = calloc(1, zb_zcl_get_data_size(srcs->type));
+       RETVM_IF(NULL == desc->change, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc->change, srcs->change, zb_zcl_get_data_size(srcs->type));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_destroy(zb_zcl_reporting_config_record_h handle)
+{
+       struct reporting_configuration_record_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       if (h->change)
+               free(h->change);
+       free(h);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_get_dir(zb_zcl_reporting_config_record_h handle,
+       zb_zcl_fc_direction_e *dir)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dir, ZIGBEE_ERROR_INVALID_PARAMETER);
+       *dir = h->dir;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_set_dir(zb_zcl_reporting_config_record_h handle,
+       zb_zcl_fc_direction_e dir)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       if (dir == ZB_ZCL_CLIENT_TO_SERVER)
+               h->dir = 0x00 ;
+       else
+               h->dir = 0x01;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_get_id(zb_zcl_reporting_config_record_h handle,
+       unsigned short *id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
+       *id = h->id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_set_id(zb_zcl_reporting_config_record_h handle,
+       unsigned short id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       h->id = id ;
+       return ZIGBEE_ERROR_NONE;
+}
+
+
+API int zb_report_config_record_get_type(
+       zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e *type)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
+       *type = h->type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_get_min_interval(
+       zb_zcl_reporting_config_record_h handle, unsigned short *min_i)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == min_i, ZIGBEE_ERROR_INVALID_PARAMETER);
+       *min_i = h->min_i;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_set_min_interval(
+       zb_zcl_reporting_config_record_h handle, unsigned short min_i)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       h->min_i = min_i;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_get_max_interval(
+       zb_zcl_reporting_config_record_h handle, unsigned short *max_i)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == max_i, ZIGBEE_ERROR_INVALID_PARAMETER);
+       *max_i = h->max_i;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_set_max_interval(
+       zb_zcl_reporting_config_record_h handle, unsigned short max_i)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       h->max_i = max_i;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_get_timeout(
+       zb_zcl_reporting_config_record_h handle, unsigned short *to)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == to, ZIGBEE_ERROR_INVALID_PARAMETER);
+       *to = h->to;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_set_timeout(
+       zb_zcl_reporting_config_record_h handle, unsigned short to)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       h->to = to;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_get_change(
+       zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e *type,
+       unsigned char **value, int *count)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       int len = -1;
+       unsigned char *temp = NULL;
+       int data_type = ZB_ZCL_DATA_TYPE_NONE;
+
+       struct reporting_configuration_record_s *h = handle;
+
+       NOT_USED(data_type);
+
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->change, ZIGBEE_ERROR_NO_DATA);
+
+       len = zb_zcl_get_data_size(h->type);
+       data_type = zb_zcl_get_analog_or_discret(h->type);
+       if (0 < len /* && ZB_ZCL_DATA_TYPE_ANALOG == data_type */) {
+
+               temp = calloc(len, sizeof(char));
+               RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(temp, h->change, len);
+               *type = h->type;
+               *count = len;
+               *value = temp;
+
+       } else {
+               return ZIGBEE_ERROR_NOT_SUPPORTED;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_record_set_change(
+       zb_zcl_reporting_config_record_h handle, zb_zcl_data_type_e type, unsigned char *value)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       int len = -1;
+       int data_type = ZB_ZCL_DATA_TYPE_NONE;
+
+       struct reporting_configuration_record_s *h = handle;
+
+       NOT_USED(data_type);
+
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       if (h->change)
+               free(h->change);
+
+       len = zb_zcl_get_data_size(type);
+       data_type = zb_zcl_get_analog_or_discret(type);
+
+       if (0 < len /* && ZB_ZCL_DATA_TYPE_ANALOG == data_type */) {
+               h->change = calloc(len + 1, sizeof(unsigned char));
+               RETV_IF(NULL == h->change, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(h->change, value, len);
+               h->type = type;
+       } else {
+               return ZIGBEE_ERROR_NOT_SUPPORTED;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_report_config_record_create(
+       zb_zcl_read_report_config_record_h *handle)
+{
+       zb_zcl_read_report_config_record_h t = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       t = calloc(1, sizeof(struct read_reporting_configuration_record_s));
+       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = t;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_report_config_record_clone(
+       zb_zcl_read_report_config_record_h src, zb_zcl_read_report_config_record_h *dst)
+{
+       struct read_reporting_configuration_record_s *srcs = src;
+       struct read_reporting_configuration_record_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct read_reporting_configuration_record_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, srcs, sizeof(struct read_reporting_configuration_record_s));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_report_config_record_destroy(
+       zb_zcl_read_report_config_record_h handle)
+{
+       struct read_reporting_configuration_record_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_report_config_record_set_dir(
+       zb_zcl_read_report_config_record_h handle, zb_zcl_fc_direction_e dir)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct read_reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       if (dir == ZB_ZCL_CLIENT_TO_SERVER)
+               h->dir = 0x00;
+       else
+               h->dir = 0x01;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_report_config_record_get_dir(
+       zb_zcl_read_report_config_record_h handle, zb_zcl_fc_direction_e *dir)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct read_reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *dir = h->dir;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_report_config_record_set_id(
+       zb_zcl_read_report_config_record_h handle, unsigned short id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct read_reporting_configuration_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->id = id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_read_report_config_record_get_id(
+       zb_zcl_read_report_config_record_h handle, unsigned short *id)
+{
+       struct read_reporting_configuration_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       *id = h->id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_create(
+       zb_zcl_report_config_response_record_h *handle)
+{
+       zb_zcl_report_config_response_record_h t = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       t = calloc(1, sizeof(struct reporting_configuration_response_record_s));
+       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = t;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_clone(
+       zb_zcl_report_config_response_record_h src,
+       zb_zcl_report_config_response_record_h *dst)
+{
+       struct reporting_configuration_response_record_s *srcs = src;
+       struct reporting_configuration_response_record_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct reporting_configuration_response_record_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, srcs, sizeof(struct reporting_configuration_response_record_s));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_destroy(
+       zb_zcl_report_config_response_record_h handle)
+{
+       struct reporting_configuration_response_record_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_get_status(
+       zb_zcl_report_config_response_record_h handle, zb_zcl_status_e *status)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_response_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *status = h->status;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_set_status(
+       zb_zcl_report_config_response_record_h handle, zb_zcl_status_e status)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_response_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->status = status;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_get_dir(
+       zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e *dir)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_response_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dir, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *dir = h->dir;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_set_dir(
+       zb_zcl_report_config_response_record_h handle, zb_zcl_fc_direction_e dir)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_response_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->dir = dir;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_get_id(
+       zb_zcl_report_config_response_record_h handle, unsigned short *id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_response_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *id = h->id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_report_config_response_record_set_id(
+       zb_zcl_report_config_response_record_h handle, unsigned short id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct reporting_configuration_response_record_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->id = id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_create(zb_zcl_attr_report_h *handle)
+{
+       zb_zcl_attr_report_h t = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       t = calloc(1, sizeof(struct attribute_report_s));
+       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = t;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_clone(zb_zcl_attr_report_h src, zb_zcl_attr_report_h *dst)
+{
+       struct attribute_report_s *srcs = src;
+       struct attribute_report_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct attribute_report_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, srcs, sizeof(struct attribute_report_s));
+
+       desc->value = calloc(1, zb_zcl_get_data_size(srcs->type));
+       RETVM_IF(NULL == desc->value, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc->value, srcs->value, zb_zcl_get_data_size(srcs->type));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_destroy(zb_zcl_attr_report_h handle)
+{
+       struct attribute_report_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       if (h->value)
+               free(h->value);
+       free(h);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_get_id(zb_zcl_attr_report_h handle, unsigned short *id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct attribute_report_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *id = h->id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_set_id(zb_zcl_attr_report_h handle, unsigned short id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct attribute_report_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->id = id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_get_type(zb_zcl_attr_report_h handle,
+       zb_zcl_data_type_e *type)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct attribute_report_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *type = h->type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_set_type(zb_zcl_attr_report_h handle,
+       zb_zcl_data_type_e type)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct attribute_report_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->type = type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_get_value(zb_zcl_attr_report_h handle,
+       zb_zcl_data_type_e* type, unsigned char** value, int* count)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       int len = -1;
+       unsigned char *temp = NULL;
+       struct attribute_report_s *h = handle;
+
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->value, ZIGBEE_ERROR_NO_DATA);
+
+       len = zb_zcl_get_data_size(h->type);
+       if (0 < len) {
+
+               temp = calloc(len, sizeof(unsigned char));
+               RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(temp, h->value, len);
+               *type = h->type;
+               *count = len;
+               *value = temp;
+
+       } else if (ZB_ZCL_OCTET_STRING == h->type || ZB_ZCL_CHARACTER_STRING == h->type) {
+
+               len = h->value[0];
+               temp = calloc(len + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY);
+
+               memcpy(temp, h->value + ZB_ZCL_OCTET_SIZE, len);
+               *type = h->type;
+               *count = len;
+               *value = temp;
+
+       } else if (ZB_ZCL_LONG_OCTET_STRING == h->type || ZB_ZCL_LONG_CHARACTER_STRING == h->type) {
+
+               len = h->value[0] & 0xff;
+               len |= (h->value[1] << 8) & 0xff00 ;
+
+               temp = calloc(len + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == temp, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(*value, h->value + ZB_ZCL_LONG_OCTET_SIZE, len);
+
+               *type = h->type;
+               *count = len;
+               *value = temp;
+
+       } else {
+               return ZIGBEE_ERROR_NOT_SUPPORTED;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_attr_report_set_value(zb_zcl_attr_report_h handle,
+       zb_zcl_data_type_e type, unsigned char* value, int count)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       int len = -1;
+       struct attribute_report_s *h = handle;
+
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == value, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       if (h->value) {
+               free(h->value);
+               h->value = NULL;
+       }
+
+       len = zb_zcl_get_data_size(type);
+       if (0 < len) {
+
+               h->value = calloc(len + ZB_GUARD_CHAR , sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(h->value, value, count);
+               h->type = type;
+
+       } else if (ZB_ZCL_OCTET_STRING == type || ZB_ZCL_CHARACTER_STRING == type) {
+
+               h->value = calloc(count + ZB_ZCL_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               /* The first 1 byte indicate invalid or length of string */
+               h->value[0] = value[0] & 0xff;
+               memcpy(h->value + ZB_ZCL_OCTET_SIZE, value, count);
+
+       } else if (ZB_ZCL_LONG_OCTET_STRING == type || ZB_ZCL_LONG_CHARACTER_STRING == type) {
+
+               h->value = calloc(count + ZB_ZCL_LONG_OCTET_SIZE + ZB_GUARD_CHAR, sizeof(char));
+               RETV_IF(NULL == h->value, ZIGBEE_ERROR_OUT_OF_MEMORY);
+
+               /* The first 2 byte indicate invalid or length of string */
+               h->value[0] = count & 0xff;
+               h->value[1] = (count >> 8) & 0xff ;
+
+               memcpy(h->value + ZB_ZCL_LONG_OCTET_SIZE, value, count);
+
+       } else {
+               return ZIGBEE_ERROR_NOT_SUPPORTED;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+
+/**
+ * @brief Format of the Selector Field
+ *
+ * @since_tizen 4.0
+ */
+struct selector_s {
+       unsigned char indicator; /**< number of index */
+       unsigned short *index; /**< index list */
+};
+
+/**
+ * @brief Stcuture for reading attribute
+ *
+ * @since_tizen 4.0
+ */
+struct read_structured_attribute_record_s {
+       unsigned short id; /**< attribute identifier */
+       struct selector_s *selector; /**< selector format */
+};
+
+/**
+ * @brief Format of the Write Attribute Record Field
+ *
+ * @since_tizen 4.0
+ */
+struct write_attribute_structured_status_record_s {
+       unsigned char status; /**< status */
+       unsigned short id; /**< identifier */
+       struct selector_s selector; /**< selector */
+};
+
+/**
+ * @brief Format of the Write Attribute Record Field
+ *
+ * @since_tizen 4.0
+ */
+struct write_attribute_structured_record_s {
+       unsigned short id; /**< attribute identifier */
+       struct selector_s selector;
+       unsigned char type; /**< attribute data type */
+       unsigned char *value; /**< data value */; /**< attribute value */
+};
+
+API int zb_extended_attr_info_create(zb_zcl_extended_attr_info_h *handle)
+{
+       zb_zcl_extended_attr_info_h t = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       t = calloc(1, sizeof(struct extended_attribute_infomation_s));
+       RETVM_IF(NULL == t, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = t;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_extended_attr_info_clone(zb_zcl_extended_attr_info_h src,
+       zb_zcl_extended_attr_info_h *dst)
+{
+       struct extended_attribute_infomation_s *srcs = src;
+       struct extended_attribute_infomation_s *desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct extended_attribute_infomation_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, srcs, sizeof(struct extended_attribute_infomation_s));
+
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_extended_attr_info_destroy(zb_zcl_extended_attr_info_h handle)
+{
+       struct extended_attribute_infomation_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_extended_attr_info_get_id(zb_zcl_extended_attr_info_h handle,
+       unsigned short *id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct extended_attribute_infomation_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *id = h->id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_extended_attr_info_set_id(zb_zcl_extended_attr_info_h handle,
+       unsigned short id)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct extended_attribute_infomation_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->id = id;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_extended_attr_info_get_type(zb_zcl_extended_attr_info_h handle,
+       zb_zcl_data_type_e *type)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct extended_attribute_infomation_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == type, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *type = h->type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_extended_attr_info_set_type(zb_zcl_extended_attr_info_h handle,
+       zb_zcl_data_type_e type)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct extended_attribute_infomation_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 >= zb_zcl_get_data_size(type), ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->type = type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_extended_attr_info_get_acl(zb_zcl_extended_attr_info_h handle,
+       zb_zcl_acl_type_e *acl)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct extended_attribute_infomation_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == acl, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *acl = h->acl;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_extended_attr_info_set_acl(zb_zcl_extended_attr_info_h handle,
+       zb_zcl_acl_type_e acl)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       struct extended_attribute_infomation_s *h = handle;
+       RETV_IF(NULL == h, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->acl = acl;
+       return ZIGBEE_ERROR_NONE;
+}
+
diff --git a/src/zbl-zdo-bind-mgr.c b/src/zbl-zdo-bind-mgr.c
new file mode 100644 (file)
index 0000000..53f359d
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zdo_bind_req(zb_zigbee_h handle, zb_nwk_addr dst_addr16,
+       zb_ieee_addr src_addr64, unsigned char src_ep, zb_cluster_id clusterid,
+       zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr,
+       unsigned char dst_ep, zb_zdo_bind_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == src_addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst_addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_bind_req(dst_addr16, src_addr64, src_ep, clusterid, dst_addr64, type,
+               group_addr, dst_ep, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_unbind_req(zb_zigbee_h handle, zb_nwk_addr dst_addr16,
+       zb_ieee_addr src_addr64, unsigned char src_ep, zb_cluster_id clusterid,
+       zb_ieee_addr dst_addr64, unsigned char type, zb_nwk_addr group_addr,
+       unsigned char dst_ep, zb_zdo_unbind_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == src_addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst_addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == src_ep || 0 == dst_ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       ret = zbl_unbind_req(dst_addr16, src_addr64, src_ep, clusterid, dst_addr64, type,
+               group_addr, dst_ep, cb, user_data);
+       return ret;
+}
diff --git a/src/zbl-zdo-dev-disc.c b/src/zbl-zdo-dev-disc.c
new file mode 100644 (file)
index 0000000..4902c81
--- /dev/null
@@ -0,0 +1,874 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zdo_nwk_addr_req(zb_zigbee_h handle, zb_ieee_addr addr64,
+       zb_zdp_req_type_e request_type, unsigned char start_idx, zb_zdo_addr_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 != request_type && 1 != request_type, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_nwk_addr_req(handle, addr64, request_type, start_idx, cb,
+               user_data);
+       return ret;
+}
+
+API int zb_zdo_ieee_addr_req(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_addr_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_ieee_addr_req(handle, addr16, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_active_ep(zb_zigbee_h handle, zb_nwk_addr addr16, zb_zdo_active_ep_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_active_ep(handle, addr16, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char ep,
+       zb_zdo_simple_desc_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == ep, ZIGBEE_ERROR_INVALID_ENDPOINT);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_simple_desc_req(handle, addr16, ep, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_extended_simple_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char start_idx, zb_zdo_extended_simple_desc_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_match_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned short profileid, unsigned char num_in_clusters,
+       unsigned short *in_clusters, unsigned char num_out_clusters,
+       unsigned short *out_clusters, zb_zdo_match_desc_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == num_in_clusters && 0 == num_out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_match_desc_req(handle, addr16, profileid, num_in_clusters,
+               in_clusters, num_out_clusters, out_clusters, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_node_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_zdo_node_desc_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_node_desc_req(addr16, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_power_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_zdo_power_desc_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_power_desc_req(addr16, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_complex_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_zdo_complex_desc_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_complex_desc_req(addr16, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_user_desc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_zdo_user_desc_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_user_desc_req(addr16, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_user_desc_set(zb_zigbee_h handle, zb_nwk_addr addr16, unsigned char len,
+       unsigned char *user_desc, zb_zdo_user_desc_conf_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == user_desc, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ret = zbl_user_desc_set(handle, addr16, len, user_desc, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_device_annce(zb_zigbee_h handle, zb_nwk_addr addr16, zb_ieee_addr addr64,
+       unsigned char capability)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+       ret = zbl_device_annce(handle, addr16, addr64, capability);
+       return ret;
+}
+
+API int zb_simple_desc_create(zb_zdo_simple_desc_h *handle)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       zb_zdo_simple_desc_h desc = NULL;
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       desc = calloc(1, sizeof(struct zb_zdo_simple_desc_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = desc;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_clone(zb_zdo_simple_desc_h src, zb_zdo_simple_desc_h *dst)
+{
+       zb_zdo_simple_desc_h desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct zb_zdo_simple_desc_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, src, sizeof(struct zb_zdo_simple_desc_s));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_destroy(zb_zdo_simple_desc_h handle)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_get_ep(zb_zdo_simple_desc_h handle, unsigned char *ep)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *ep = h->ep;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_set_ep(zb_zdo_simple_desc_h handle, unsigned char ep)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->ep = ep;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_get_profile_id(zb_zdo_simple_desc_h handle,
+       unsigned short *profileid)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == profileid, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *profileid = h->profileid;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_set_profile_id(zb_zdo_simple_desc_h handle,
+       unsigned short profileid)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->profileid = profileid;
+       return ZIGBEE_ERROR_NONE;
+}
+
+
+API int zb_simple_desc_get_device_id(zb_zdo_simple_desc_h handle,
+       unsigned short *deviceid)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == deviceid, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *deviceid = h->deviceid;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_set_device_id(zb_zdo_simple_desc_h handle,
+       unsigned short deviceid)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->deviceid = deviceid;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_get_device_ver(zb_zdo_simple_desc_h handle,
+       unsigned short *device_ver)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device_ver, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *device_ver = h->device_ver;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_set_device_ver(zb_zdo_simple_desc_h handle,
+       unsigned short device_ver)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->device_ver = device_ver;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_get_num_of_in_clusters(zb_zdo_simple_desc_h handle,
+       unsigned char *num_of_in_clusters)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == num_of_in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *num_of_in_clusters = h->num_of_in_clusters;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_set_num_of_in_clusters(zb_zdo_simple_desc_h handle,
+       unsigned char num_of_in_clusters)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->num_of_in_clusters = num_of_in_clusters;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_get_num_of_out_clusters(zb_zdo_simple_desc_h handle,
+       unsigned char *num_of_out_clusters)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == num_of_out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *num_of_out_clusters = h->num_of_out_clusters;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_set_num_of_out_clusters(zb_zdo_simple_desc_h handle,
+       unsigned char num_of_out_clusters)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->num_of_out_clusters = num_of_out_clusters;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_get_in_clusters(zb_zdo_simple_desc_h handle,
+       unsigned short **in_clusters)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *in_clusters = h->in_clusters;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_set_in_clusters(zb_zdo_simple_desc_h handle,
+       unsigned short *in_clusters, int num)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == in_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(num < 1 || num > MAX_ENDPOINT_CLUSTERS, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(h->in_clusters, in_clusters, 2 * num);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_get_out_clusters(zb_zdo_simple_desc_h handle,
+       unsigned short **out_clusters)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *out_clusters = h->out_clusters;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_simple_desc_set_out_clusters(zb_zdo_simple_desc_h handle,
+       unsigned short *out_clusters, int num)
+{
+       struct zb_zdo_simple_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_clusters, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(num < 1 || num > MAX_ENDPOINT_CLUSTERS, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(h->out_clusters, out_clusters, 2 * num);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_create(zb_zdo_node_power_descriptor_h *handle)
+{
+       zb_zdo_node_power_descriptor_h desc = NULL;
+
+       CHECK_ZIGBEE_PRIVILEGE();
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_clone(zb_zdo_node_power_descriptor_h src,
+       zb_zdo_node_power_descriptor_h *dst)
+{
+       zb_zdo_node_power_descriptor_h desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct zb_zdo_node_power_descriptor_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, src, sizeof(struct zb_zdo_node_power_descriptor_s));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_destroy(zb_zdo_node_power_descriptor_h handle)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_get_current_power_mode(
+       zb_zdo_node_power_descriptor_h handle, zb_zdp_cur_pwr_mode_e* current_power_mode)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == current_power_mode, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *current_power_mode = h->current_power_mode;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_set_current_power_mode(
+       zb_zdo_node_power_descriptor_h handle, zb_zdp_cur_pwr_mode_e current_power_mode)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0b11 < current_power_mode, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->current_power_mode = current_power_mode;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_get_available_power_sources(
+       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e* available_power_sources)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == available_power_sources, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *available_power_sources = h->available_power_sources;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_set_available_power_sources(
+       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e available_power_sources)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0b111 < available_power_sources, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->available_power_sources = available_power_sources;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_get_current_power_source(
+       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e* current_power_source)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == current_power_source, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *current_power_source = h->current_power_source;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_set_current_power_source(
+       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_type_e current_power_source)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0b111 < current_power_source, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->current_power_source = current_power_source;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_get_current_power_source_level(
+       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_level_e* current_power_source_level)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == current_power_source_level, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *current_power_source_level = h->current_power_source_level;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_power_desc_set_current_power_source_level(
+       zb_zdo_node_power_descriptor_h handle, zb_zdp_pwr_src_level_e current_power_source_level)
+{
+       struct zb_zdo_node_power_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->current_power_source_level = current_power_source_level;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_create(zb_zdo_node_descriptor_h *handle)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       zb_zdo_node_descriptor_h desc = NULL;
+
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = desc;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_clone(zb_zdo_node_descriptor_h src,
+       zb_zdo_node_descriptor_h *dst)
+{
+       struct zb_zdo_node_descriptor_s* desc = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       desc = calloc(1, sizeof(struct zb_zdo_node_descriptor_s));
+       RETVM_IF(NULL == desc, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(desc, src, sizeof(struct zb_zdo_node_descriptor_s));
+       *dst = desc;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_destroy(zb_zdo_node_descriptor_h handle)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_logical_type(zb_zdo_node_descriptor_h handle,
+       unsigned char* logical_type)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == logical_type, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *logical_type = h->logical_type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_logical_type(zb_zdo_node_descriptor_h handle,
+       unsigned char logical_type)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0b11 < logical_type, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->logical_type = logical_type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_complex_desciptor_available(
+       zb_zdo_node_descriptor_h handle, unsigned char* complex_desciptor_available)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == complex_desciptor_available, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *complex_desciptor_available = h->complex_desciptor_available;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_complex_descriptor_available(
+       zb_zdo_node_descriptor_h handle, unsigned char complex_desciptor_available)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0x01 < complex_desciptor_available, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->complex_desciptor_available = complex_desciptor_available;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_user_descriptor_available(
+       zb_zdo_node_descriptor_h handle, unsigned char* user_descriptor_available)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == user_descriptor_available, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *user_descriptor_available = h->user_descriptor_available;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_user_descriptor_available(
+       zb_zdo_node_descriptor_h handle, unsigned char user_descriptor_available)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0x01 < user_descriptor_available, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->user_descriptor_available = user_descriptor_available;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_aps_flags(zb_zdo_node_descriptor_h handle,
+       unsigned char* aps_flags)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == aps_flags, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *aps_flags = h->aps_flags;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_aps_flags(zb_zdo_node_descriptor_h handle,
+       unsigned char aps_flags)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0b111 < aps_flags, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->aps_flags = aps_flags;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_frequency_band(zb_zdo_node_descriptor_h handle,
+       unsigned char* frequency_band)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == frequency_band, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *frequency_band = h->frequency_band;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_frequency_band(zb_zdo_node_descriptor_h handle,
+       unsigned char frequency_band)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0b1111 < frequency_band, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->frequency_band = frequency_band;
+       return ZIGBEE_ERROR_NONE;
+}
+
+
+API int zb_node_desc_get_mac_capability_flags(zb_zdo_node_descriptor_h handle,
+       unsigned char* mac_capability_flags)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == mac_capability_flags, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *mac_capability_flags = h->mac_capability_flags;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_mac_capability_flags(zb_zdo_node_descriptor_h handle,
+       unsigned char mac_capability_flags)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->mac_capability_flags = mac_capability_flags;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_manufacturer_code(zb_zdo_node_descriptor_h handle,
+       unsigned short* manufacturer_code)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == manufacturer_code, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *manufacturer_code = h->manufacturer_code;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_manufacturer_code(zb_zdo_node_descriptor_h handle,
+       unsigned short manufacturer_code)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h->manufacturer_code = manufacturer_code;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_maximum_buffer_size(zb_zdo_node_descriptor_h handle,
+       unsigned char* maximum_buffer_size)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == maximum_buffer_size, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *maximum_buffer_size = h->maximum_buffer_size;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_maximum_buffer_size(zb_zdo_node_descriptor_h handle,
+       unsigned char maximum_buffer_size)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0x7f < maximum_buffer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->maximum_buffer_size = maximum_buffer_size;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_maximum_incoming_transfer_size(
+       zb_zdo_node_descriptor_h handle, unsigned short* maximum_incoming_transfer_size)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == maximum_incoming_transfer_size, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *maximum_incoming_transfer_size = h->maximum_incoming_transfer_size;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_maximum_incoming_transfer_size(
+       zb_zdo_node_descriptor_h handle, unsigned short maximum_incoming_transfer_size)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0x7fff < maximum_incoming_transfer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->maximum_incoming_transfer_size = maximum_incoming_transfer_size;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_server_mask(zb_zdo_node_descriptor_h handle,
+       unsigned short* server_mask)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == server_mask, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *server_mask = h->server_mask;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_server_mask(zb_zdo_node_descriptor_h handle,
+       unsigned short server_mask)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0x7f < server_mask, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->server_mask = server_mask;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_maximum_outgoing_transfer_size(
+       zb_zdo_node_descriptor_h handle, unsigned short* maximum_outgoing_transfer_size)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == maximum_outgoing_transfer_size, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *maximum_outgoing_transfer_size = h->maximum_outgoing_transfer_size;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_maximum_outgoing_transfer_size(
+       zb_zdo_node_descriptor_h handle, unsigned short maximum_outgoing_transfer_size)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0x7fff < maximum_outgoing_transfer_size, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->maximum_outgoing_transfer_size = maximum_outgoing_transfer_size;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_get_descriptor_capability_field(
+       zb_zdo_node_descriptor_h handle, unsigned short* descriptor_capability_field)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == descriptor_capability_field, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *descriptor_capability_field = h->descriptor_capability_field;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_node_desc_set_descriptor_capability_field(
+       zb_zdo_node_descriptor_h handle, unsigned short descriptor_capability_field)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0x11 < descriptor_capability_field, ZIGBEE_ERROR_PARAMETER_OUT_OF_RANGE);
+
+       h->descriptor_capability_field = descriptor_capability_field;
+       return ZIGBEE_ERROR_NONE;
+}
+
diff --git a/src/zbl-zdo-nwk-mgr.c b/src/zbl-zdo-nwk-mgr.c
new file mode 100644 (file)
index 0000000..97e323f
--- /dev/null
@@ -0,0 +1,498 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zdo_mgmt_nwk_disc_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned int scan_channels, unsigned char scan_duration, unsigned char scan_count,
+       unsigned char start_idx, zb_zdo_mgmt_nwk_disc_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       ret = zbl_mgmt_nwk_disc_req(addr16, scan_channels, scan_duration, scan_count,
+               start_idx, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_mgmt_lqi_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char start_idx, zb_zdo_mgmt_lqi_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       ret = zbl_mgmt_lqi_req(addr16, start_idx, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_mgmt_rtg_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char start_idx, zb_zdo_mgmt_rtg_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       ret = zbl_mgmt_rtg_req(addr16, start_idx, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_mgmt_bind_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char start_idx, zb_zdo_mgmt_bind_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       ret = zbl_mgmt_bind_req(addr16, start_idx, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_mgmt_leave_req(zb_zigbee_h handle, zb_ieee_addr addr64,
+       bool remove_children, bool rejoin, zb_zdo_mgmt_leave_cb cb,
+       void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+       ret = zbl_mgmt_leave_device(addr64, remove_children, rejoin, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_mgmt_direct_join_req(zb_zigbee_h handle, zb_ieee_addr addr64,
+       unsigned char capability, zb_zdo_mgmt_direct_join_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_mgmt_permit_joining_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char duration, unsigned char tc_significance,
+       zb_zdo_mgmt_permit_joining_cb cb, void *user_data)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       ret = zbl_mgmt_permit_joining_req(addr16, duration, tc_significance, cb, user_data);
+       return ret;
+}
+
+API int zb_zdo_mgmt_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       unsigned char start_idx, zb_zdo_mgmt_cache_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_mgmt_nwk_update_req(zb_zigbee_h handle, unsigned int scan_channels,
+       unsigned char scan_duration, unsigned char scan_count, unsigned char nwk_update_id,
+       zb_nwk_addr nwk_manager_addr)
+{
+       int ret;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == nwk_manager_addr, ZIGBEE_ERROR_INVALID_ADDRESS);
+       ret = zbl_mgmt_nwk_update_req(scan_channels, scan_duration, scan_count, nwk_update_id,
+               nwk_manager_addr);
+       return ret;
+}
+
+API int zb_network_list_record_get_extended_pan_id(
+       zb_zdo_network_list_record_h handle, zb_ieee_addr extended_pan_id)
+{
+       struct zb_zdo_network_list_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(extended_pan_id, h->extended_pan_id, sizeof(zb_ieee_addr));
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_network_list_record_get_logical_channel(
+       zb_zdo_network_list_record_h handle, unsigned char* logical_channel)
+{
+       struct zb_zdo_network_list_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == logical_channel, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *logical_channel = h->logical_channel;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_network_list_record_get_zigbee_version(
+       zb_zdo_network_list_record_h handle, unsigned char* zigbee_version)
+{
+       struct zb_zdo_network_list_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zigbee_version, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *zigbee_version = h->zigbee_version;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_network_list_record_get_stack_profile(
+       zb_zdo_network_list_record_h handle, unsigned char* stack_profile)
+{
+       struct zb_zdo_network_list_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == stack_profile, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *stack_profile = h->stack_profile;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_network_list_record_get_beacon_order(
+       zb_zdo_network_list_record_h handle, unsigned char* beacon_order)
+{
+       struct zb_zdo_network_list_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == beacon_order, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *beacon_order = h->beacon_order;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_network_list_record_get_superframe_order(
+       zb_zdo_network_list_record_h handle, unsigned char* superframe_order)
+{
+       struct zb_zdo_network_list_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == superframe_order, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *superframe_order = h->superframe_order;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_network_list_record_get_permit_joining(
+       zb_zdo_network_list_record_h handle, unsigned char* permit_joining)
+{
+       struct zb_zdo_network_list_record_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == permit_joining, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *permit_joining = h->permit_joining;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_extended_pan_id(
+       zb_zdo_neighbor_table_desc_h handle, zb_ieee_addr extended_pan_id)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == extended_pan_id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(extended_pan_id, h->extended_pan_id, sizeof(zb_ieee_addr));
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_ieee_addr(
+       zb_zdo_neighbor_table_desc_h handle, zb_ieee_addr addr64)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(addr64, h->addr64, sizeof(zb_ieee_addr));
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_nwk_addr(
+       zb_zdo_neighbor_table_desc_h handle, zb_nwk_addr* addr16)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *addr16 = h->addr16;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_device_type(
+       zb_zdo_neighbor_table_desc_h handle, unsigned char* device_type)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device_type, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *device_type = h->device_type;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_rx_on_when_idle(
+       zb_zdo_neighbor_table_desc_h handle, unsigned char* rx_on_when_idle)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == rx_on_when_idle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *rx_on_when_idle = h->rx_on_when_idle;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_relationship(
+       zb_zdo_neighbor_table_desc_h handle, unsigned char* releationship)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == releationship, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *releationship = h->relationship;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_permit_joining(
+       zb_zdo_neighbor_table_desc_h handle, unsigned char* permit_joining)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == permit_joining, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *permit_joining = h->permit_joining;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_depth(
+       zb_zdo_neighbor_table_desc_h handle, unsigned char* depth)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == depth, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *depth = h->depth;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_neighbor_table_desc_get_lqi(zb_zdo_neighbor_table_desc_h handle,
+       unsigned char* lqi)
+{
+       struct zb_zdo_neighbor_table_desc_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == lqi, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *lqi = h->lqi;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_routing_table_get_dst_addr(zb_zdo_routing_table_h handle,
+       zb_nwk_addr* dst_addr)
+{
+       struct zb_zdo_routing_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst_addr, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *dst_addr = h->dst_addr;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_routing_table_get_dst_status(zb_zdo_routing_table_h handle,
+       zb_zdp_status_e *status)
+{
+       struct zb_zdo_routing_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *status = h->status;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_routing_table_get_memory_constrained(
+       zb_zdo_routing_table_h handle, unsigned char *memory_constrained)
+{
+       struct zb_zdo_routing_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == memory_constrained, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *memory_constrained = h->memory_constrained;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_routing_table_get_many_to_one(zb_zdo_routing_table_h handle,
+       unsigned char *many_to_one)
+{
+       struct zb_zdo_routing_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == many_to_one, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *many_to_one = h->many_to_one;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_routing_table_get_route_record_required(
+       zb_zdo_routing_table_h handle, unsigned char *route_record_required)
+{
+       struct zb_zdo_routing_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == route_record_required, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *route_record_required = h->route_record_required;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_routing_table_get_next_hop_addr(
+       zb_zdo_routing_table_h handle, zb_nwk_addr *next_hop_addr)
+{
+       struct zb_zdo_routing_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == next_hop_addr, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *next_hop_addr = h->next_hop_addr;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_binding_table_get_src_addr(zb_zdo_binding_table_h handle,
+       zb_ieee_addr src_addr)
+{
+       struct zb_zdo_binding_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == src_addr, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(src_addr, h->src_addr64, sizeof(zb_ieee_addr));
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_binding_table_get_src_ep(zb_zdo_binding_table_h handle,
+       unsigned char* src_ep)
+{
+       struct zb_zdo_binding_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *src_ep = h->src_ep;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_binding_table_get_cluster_id(zb_zdo_binding_table_h handle,
+       unsigned short *clusterid)
+{
+       struct zb_zdo_binding_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == clusterid, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *clusterid = h->clusterid;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_binding_table_get_dst_addr_mode(zb_zdo_binding_table_h handle,
+       unsigned char* dst_addr_mode)
+{
+       struct zb_zdo_binding_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst_addr_mode, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *dst_addr_mode = h->dst_addr_mode;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_binding_table_get_dst_addr16(zb_zdo_binding_table_h handle,
+       zb_nwk_addr* addr16)
+{
+       struct zb_zdo_binding_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *addr16 = h->dst_addr16;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_binding_table_get_dst_addr64(zb_zdo_binding_table_h handle,
+       zb_ieee_addr addr64)
+{
+       struct zb_zdo_binding_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(addr64, h->dst_addr64, sizeof(zb_ieee_addr));
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_binding_table_get_dst_ep(zb_zdo_binding_table_h handle,
+       unsigned char* dst_ep)
+{
+       struct zb_zdo_binding_table_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *dst_ep = h->dst_ep;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discovery_cache_get_ieee_addr(zb_zdo_discovery_cache_h handle,
+       zb_ieee_addr addr64)
+{
+       struct zb_zdo_discovery_cache_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(addr64, h->addr64, sizeof(zb_ieee_addr));
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_discovery_cache_get_nwk_addr(zb_zdo_discovery_cache_h handle,
+       zb_nwk_addr* addr16)
+{
+       struct zb_zdo_discovery_cache_s *h = handle;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *addr16 = h->addr16;
+       return ZIGBEE_ERROR_NONE;
+}
+
+
diff --git a/src/zbl-zdo-svc-disc.c b/src/zbl-zdo-svc-disc.c
new file mode 100644 (file)
index 0000000..65cd5f7
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2016 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 "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_zdo_system_server_discover_req(zb_zigbee_h handle,
+       unsigned short server_mask, zb_zdo_system_server_discover_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_find_node_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_ieee_addr addr64, zb_zdo_find_node_cache_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_discovery_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_ieee_addr addr64, zb_zdo_discovery_cache_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_discovery_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_ieee_addr addr64, unsigned char node_desc_size, unsigned char power_desc_size,
+       unsigned char active_ep_size, unsigned char simple_desc_count,
+       unsigned char *simple_desc_list, zb_zdo_discovery_store_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == simple_desc_list, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_node_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_ieee_addr addr64, zb_zdo_node_descriptor_h nodedsc, zb_zdo_node_desc_store_cb cb,
+       void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_power_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_ieee_addr addr64, zb_zdo_node_power_descriptor_h powerdsc,
+       zb_zdo_power_desc_store_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_active_ep_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_ieee_addr addr64, unsigned char active_ep_count, unsigned char *ep_list,
+       zb_zdo_active_ep_store_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_simple_desc_store_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_ieee_addr addr64, zb_zdo_simple_desc_h simpledsc, zb_zdo_simple_desc_store_cb cb,
+       void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_zdo_remove_node_cache_req(zb_zigbee_h handle, zb_nwk_addr addr16,
+       zb_ieee_addr addr64, zb_zdo_remove_node_cache_cb cb, void *user_data)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zbl_dbus_get_object(), ZIGBEE_ERROR_IO_ERROR);
+       RETV_IF(0 == addr16 || 0 == addr64, ZIGBEE_ERROR_INVALID_ADDRESS);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
diff --git a/src/zbl-zdo.c b/src/zbl-zdo.c
new file mode 100644 (file)
index 0000000..e66e8a6
--- /dev/null
@@ -0,0 +1,320 @@
+/*
+ * Copyright (c) 2015 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 "zbl.h"
+#include "zb-log.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_end_dev_info_get_list(zb_zigbee_h handle, int *count,
+       zb_end_dev_info_h **list)
+{
+       int ret;
+       unsigned char cnt;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_get_all_device_info(list, &cnt);
+       *count = cnt;
+       return ret;
+}
+
+API int zb_end_dev_get_endpoint_list(zb_zigbee_h handle, zb_ieee_addr addr64,
+       unsigned char *count, unsigned char **ep_list)
+{
+       int ret;
+       unsigned char cnt = 0;
+       unsigned char eplist[MAX_ENDPOINT_CLUSTERS] = {0, };
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_get_endpoint_list(addr64, &cnt, eplist);
+       *count = cnt;
+       if (cnt > 0) {
+               *ep_list = calloc(cnt + 1, sizeof(unsigned char));
+               RETV_IF(NULL == *ep_list, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(*ep_list, eplist, cnt);
+       }
+       return ret;
+}
+
+API int zb_end_dev_info_get_cluster_list(zb_zigbee_h handle, zb_ieee_addr addr64,
+       unsigned char ep, unsigned char *in_cluster_count, unsigned short **in_cluster_list,
+       unsigned char *out_cluster_count, unsigned short **out_cluster_list)
+{
+       int ret;
+       unsigned char in_cnt = 0;
+       unsigned char out_cnt = 0;
+       unsigned short in_clusters[MAX_ENDPOINT_CLUSTERS] = {0, };
+       unsigned short out_clusters[MAX_ENDPOINT_CLUSTERS] = {0, };
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == in_cluster_count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == in_cluster_list, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_cluster_count, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_cluster_list, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_get_cluster_list(addr64, ep, &in_cnt, in_clusters,
+                       &out_cnt, out_clusters);
+       *in_cluster_count = in_cnt;
+       if (in_cnt > 0) {
+               *in_cluster_list = calloc(in_cnt + 1, sizeof(unsigned short));
+               RETV_IF(NULL == *in_cluster_list, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(*in_cluster_list, in_clusters, in_cnt * sizeof(unsigned short));
+       }
+       *out_cluster_count = out_cnt;
+       if (out_cnt > 0) {
+               *out_cluster_list = calloc(out_cnt + 1, sizeof(unsigned short));
+               RETV_IF(NULL == *out_cluster_list, ZIGBEE_ERROR_OUT_OF_MEMORY);
+               memcpy(*out_cluster_list, out_clusters, out_cnt * sizeof(unsigned short));
+       }
+
+       return ret;
+}
+
+API int zb_foreach_end_dev_info(zb_end_dev_info_h *list,
+       zb_end_dev_info_cb cb, void *user_data)
+{
+       int index = 0;
+       GList *cur = NULL;
+       struct zb_end_device_info_s *real = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, ZIGBEE_ERROR_INVALID_PARAMETER);
+       CHECK_ZIGBEE_PRIVILEGE();
+
+       cur = (GList *)list;
+       while (cur) {
+               GList *next = cur->next;
+               real = cur->data;
+               if (ZIGBEE_FUNC_STOP == cb(index, (zb_end_dev_info_h)real->list, user_data))
+                       break;
+               index++;
+               cur = next;
+       }
+
+       return ZIGBEE_ERROR_NONE;
+
+}
+
+API int zb_end_dev_info_create(zb_end_dev_info_h *handle)
+{
+       struct zb_zdo_node_descriptor_s* h = NULL;
+
+       CHECK_ZIGBEE_PRIVILEGE();
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       h = calloc(1, sizeof(struct zb_end_device_info_s));
+       RETVM_IF(NULL == handle, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = h;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_clone(zb_end_dev_info_h src, zb_end_dev_info_h *dst)
+{
+       struct zb_end_device_info_s *dev = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == dst, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       dev = calloc(1, sizeof(struct zb_end_device_info_s));
+       RETVM_IF(NULL == dev, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(dev, src, sizeof(struct zb_zdo_node_descriptor_s));
+       *dst = dev;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_destroy(zb_end_dev_info_h handle)
+{
+       struct zb_zdo_node_descriptor_s* h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       free(h);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_get_network_address(zb_end_dev_info_h handle,
+       zb_nwk_addr *addr16)
+{
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr16, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *addr16 = h->addr16;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_get_ieee_address(zb_end_dev_info_h handle,
+       zb_ieee_addr addr64)
+{
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       memcpy(addr64, h->addr64, sizeof(zb_ieee_addr));
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_get_num_of_ep(zb_end_dev_info_h handle,
+       unsigned char *count)
+{
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *count = h->num_of_ep;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_get_ep_list(zb_end_dev_info_h handle, unsigned char **ep_list)
+{
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == ep_list, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *ep_list = calloc(h->num_of_ep, sizeof(unsigned char));
+       RETVM_IF(NULL == *ep_list, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+
+       memcpy(*ep_list, h->ep, h->num_of_ep);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_get_mac_capability(zb_end_dev_info_h handle,
+       zb_zdp_mac_capability_field_e *capability)
+{
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == capability, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA);
+
+       *capability = h->capability;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_get_alternative_pan_coordinator(zb_end_dev_info_h handle,
+       zb_zdp_do_pan_coordinator_e *can_do_it)
+{
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == can_do_it, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA);
+
+       *can_do_it = h->capability & ZB_ZDP_ALTERNATIVE_PAN_COORDINATOR ? 1 : 0;
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_get_device_id(zb_end_dev_info_h handle, unsigned char ep,
+       unsigned short *deviceid)
+{
+       int i;
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == deviceid, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->desc, ZIGBEE_ERROR_NO_DATA);
+
+       for (i = 0; i < h->num_of_ep; i++) {
+               RETV_IF(NULL == h->desc[i], ZIGBEE_ERROR_NO_DATA);
+               if (h->desc[i]->ep == ep) {
+                       *deviceid = h->desc[i]->deviceid;
+                       return ZIGBEE_ERROR_NONE;
+               }
+       }
+       return ZIGBEE_ERROR_NO_DATA;
+}
+
+API int zb_end_dev_info_get_profile_id(zb_end_dev_info_h handle, unsigned char ep,
+       unsigned short *profileid)
+{
+       int i;
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == profileid, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == h->desc, ZIGBEE_ERROR_NO_DATA);
+
+       for (i = 0; i < h->num_of_ep; i++) {
+               RETV_IF(NULL == h->desc[i], ZIGBEE_ERROR_NO_DATA);
+               if (h->desc[i]->ep == ep) {
+                       *profileid = h->desc[i]->profileid;
+                       return ZIGBEE_ERROR_NONE;
+               }
+       }
+       return ZIGBEE_ERROR_NO_DATA;
+}
+
+API int zb_end_dev_info_get_power_source(zb_end_dev_info_h handle,
+       zb_zdp_power_e *power_src)
+{
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == power_src, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA);
+
+       *power_src = h->capability & ZB_ZDP_POWER_SOURCE ? 1 : 0;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_end_dev_info_get_security_capabilty(zb_end_dev_info_h handle,
+       zb_zdp_security_cap_e*sec_capability)
+{
+       struct zb_end_device_info_s *h = handle;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == sec_capability, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == h->capability, ZIGBEE_ERROR_NO_DATA);
+
+       *sec_capability = h->capability & ZB_ZDP_SECURITY_CAPABILITY ? 1 : 0;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
diff --git a/src/zbl.c b/src/zbl.c
new file mode 100644 (file)
index 0000000..099a840
--- /dev/null
+++ b/src/zbl.c
@@ -0,0 +1,588 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <glib.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zbl.h"
+#include "zbl-dbus.h"
+#include "zb-common.h"
+
+API int zb_ev_get_enable_status(zb_event_data_h ev, zb_error_e* status)
+{
+       zb_event_data_s *event = ev;
+       zb_event_enable_s *enable = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       enable = event->data.enable;
+       RETV_IF(NULL == enable, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *status = enable->status;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+
+API int zb_ev_get_form_network_panid(zb_event_data_h ev, zb_nwk_addr* pan_id)
+{
+       zb_event_data_s *event = ev;
+       zb_event_form_network_s *form_network = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       form_network = event->data.form_network;
+       RETV_IF(NULL == form_network, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == pan_id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *pan_id = form_network->pan_id;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+
+API int zb_ev_get_join_count(zb_event_data_h ev, unsigned char* count)
+{
+       zb_event_data_s *event = ev;
+       zb_event_join_s *join = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       join = event->data.join;
+       RETV_IF(NULL == join, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *count = join->count;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_join_ep(zb_event_data_h ev, unsigned char** ep)
+{
+       zb_event_data_s *event = ev;
+       zb_event_join_s *join = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       join = event->data.join;
+       RETV_IF(NULL == join, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *ep = calloc(join->count, sizeof(unsigned char));
+       if (NULL == *ep) {
+               ERR("Couldn't Allocate Memory");
+               return ZIGBEE_ERROR_OUT_OF_MEMORY;
+       }
+       memcpy(*ep, join->ep, join->count);
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_child_left_status(zb_event_data_h ev, zb_error_e* status)
+{
+       zb_event_data_s *event = ev;
+       zb_event_child_left_s *child_left = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       child_left = event->data.child_left;
+       RETV_IF(NULL == child_left, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *status = child_left->status;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_global_default_rsp_ep(zb_event_data_h ev, unsigned char* ep)
+{
+       zb_event_data_s *event = ev;
+       zb_event_global_default_rsp_s *global_default_rsp = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       global_default_rsp = event->data.global_default_rsp;
+       RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == ep, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *ep = global_default_rsp->ep;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_global_default_rsp_cluster_id(zb_event_data_h ev,
+       unsigned short* clusterid)
+{
+       zb_event_data_s *event = ev;
+       zb_event_global_default_rsp_s *global_default_rsp = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       global_default_rsp = event->data.global_default_rsp;
+       RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == clusterid, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *clusterid = global_default_rsp->clusterid;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_global_default_rsp_command_id(zb_event_data_h ev,
+       unsigned char* commandid)
+{
+       zb_event_data_s *event = ev;
+       zb_event_global_default_rsp_s *global_default_rsp = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       global_default_rsp = event->data.global_default_rsp;
+       RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == commandid, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *commandid = global_default_rsp->commandid;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_global_default_rsp_status(zb_event_data_h ev,
+       zb_zcl_status_e* status)
+{
+       zb_event_data_s *event = ev;
+       zb_event_global_default_rsp_s *global_default_rsp = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       global_default_rsp = event->data.global_default_rsp;
+       RETV_IF(NULL == global_default_rsp, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *status = global_default_rsp->status;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+/* Need to be test, because we don't know things send this reports to coordinator */
+API int zb_ev_get_global_attr_report_records(zb_event_data_h ev,
+       zb_zcl_attr_report_h* records, unsigned char *count)
+{
+       zb_event_data_s *event = ev;
+       zb_event_global_attr_report_s *global_attr_repor = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       global_attr_repor = event->data.global_attr_report;
+       RETV_IF(NULL == global_attr_repor, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == records, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *records = global_attr_repor->records;
+       *count = global_attr_repor->count;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_alarm_count(zb_event_data_h ev, unsigned short* count)
+{
+       zb_event_data_s *event = ev;
+       zb_event_alarm_s *alarm = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       alarm = event->data.alarm;
+       RETV_IF(NULL == alarm, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == count, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *count = alarm->count;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_enroll_request_src_ep(zb_event_data_h ev, unsigned char* src_ep)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_enroll_request_s* ias_enroll_request = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_enroll_request = event->data.ias_enroll_request;
+       RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *src_ep = ias_enroll_request->src_ep;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_enroll_request_zone_type(zb_event_data_h ev,
+       zb_zcl_ias_zone_type_e * zone_type)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_enroll_request_s* ias_enroll_request = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_enroll_request = event->data.ias_enroll_request;
+       RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zone_type, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *zone_type = ias_enroll_request->zone_type;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_enroll_request_mfg_code(zb_event_data_h ev,
+       unsigned char* mfg_code)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_enroll_request_s* ias_enroll_request = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_enroll_request = event->data.ias_enroll_request;
+       RETV_IF(NULL == ias_enroll_request, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == mfg_code, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *mfg_code = ias_enroll_request->mfg_code;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+
+API int zb_ev_get_ias_noti_src_ep(zb_event_data_h ev, unsigned char* src_ep)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_noti_s* ias_noti = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_noti = event->data.ias_noti;
+       RETV_IF(NULL == ias_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *src_ep = ias_noti->src_ep;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_ias_noti_zone_status(zb_event_data_h ev,
+       unsigned short* zone_status)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_noti_s* ias_noti = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_noti = event->data.ias_noti;
+       RETV_IF(NULL == ias_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zone_status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *zone_status = ias_noti->zone_status;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_ias_ext_noti_src_ep(zb_event_data_h ev, unsigned char* src_ep)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_extended_noti = event->data.ias_extended_noti;
+       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == src_ep, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *src_ep = ias_extended_noti->src_ep;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_ias_ext_noti_status(zb_event_data_h ev, unsigned char* status)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_extended_noti = event->data.ias_extended_noti;
+       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *status = ias_extended_noti->status;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_ias_ext_noti_zone_status(zb_event_data_h ev,
+       unsigned short* zone_status)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_extended_noti = event->data.ias_extended_noti;
+       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zone_status, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *zone_status = ias_extended_noti->zone_status;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_ias_ext_noti_delay(zb_event_data_h ev, unsigned short* delay)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_extended_noti = event->data.ias_extended_noti;
+       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == delay, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *delay = ias_extended_noti->delay;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_ev_get_ias_ext_noti_zone_id(zb_event_data_h ev, unsigned char* zone_id)
+{
+       zb_event_data_s *event = ev;
+       zb_event_ias_extended_noti_s* ias_extended_noti = NULL;
+
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+
+       RETV_IF(NULL == ev, ZIGBEE_ERROR_INVALID_PARAMETER);
+       ias_extended_noti = event->data.ias_extended_noti;
+       RETV_IF(NULL == ias_extended_noti, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == zone_id, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       *zone_id = ias_extended_noti->zone_id;
+
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_create(zb_zigbee_h *handle)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       zb_zigbee_h h = calloc(1, sizeof(struct zbl_zigbee_s));
+       RETVM_IF(NULL == h, ZIGBEE_ERROR_OUT_OF_MEMORY, "calloc() Fail(%d)", errno);
+       *handle = h;
+
+#if !GLIB_CHECK_VERSION(2, 35, 0)
+       g_type_init();
+#endif
+#if !GLIB_CHECK_VERSION(2, 31, 0)
+       g_thread_init(NULL);
+#endif
+       ret = zbl_dbus_start(*handle);
+       DBG("zbl_dbus_start()=0x%X", ret);
+
+       return ret;
+}
+
+API int zb_destroy(zb_zigbee_h handle)
+{
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       zbl_dbus_stop(handle);
+       return ZIGBEE_ERROR_NONE;
+}
+
+API int zb_enable(zb_zigbee_h handle)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_enable(handle);
+       DBG("zbl_enable()=0x%X", ret);
+       return ret;
+}
+
+API int zb_set_event_cb(zb_zigbee_h handle, zb_event_cb event_handler)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_set_event_cb(handle, event_handler);
+       DBG("zb_set_event_cb()=0x%X", ret);
+       return ret;
+}
+
+API int zb_disable(zb_zigbee_h handle)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_disable();
+       DBG("zbl_disable()=0x%X", ret);
+       return ret;
+}
+
+API int zb_hw_reset(zb_zigbee_h handle)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_hw_reset();
+       DBG("zbl_hw_reset()=0x%X", ret);
+       return ret;
+}
+
+API int zb_coex_start(zb_zigbee_h handle, unsigned char channel)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_coex_start(channel);
+       DBG("zbl_coex_start()=0x%X", ret);
+       return ret;
+}
+
+API int zb_coex_stop(zb_zigbee_h handle)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_coex_stop();
+       DBG("zbl_coex_stop()=0x%X", ret);
+       return ret;
+}
+
+API int zb_form_network(zb_zigbee_h handle, zb_form_network_cb cb, void *user_data)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_form_network(handle, cb, user_data);
+       DBG("zbl_form_network()=0x%X", ret);
+       return ret;
+}
+
+API int zb_disable_network(zb_zigbee_h handle, zb_disable_network_cb cb, void *user_data)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_disable_network(handle, cb, user_data);
+       DBG("zb_disable_network()=0x%X", ret);
+       return ret;
+}
+
+API int zb_leave_device(zb_zigbee_h handle, zb_ieee_addr addr, bool remove_children, bool rejoin)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_leave_device(addr, remove_children, rejoin);
+       DBG("zbl_leave_device()=0x%X", ret);
+       return ret;
+}
+
+API int zb_permit_join(zb_zigbee_h handle, unsigned char timeout)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_permit_join(timeout, TRUE);
+       DBG("zb_permit_join()=0x%X", ret);
+       return ret;
+}
+
+API int zb_get_controller_mac_address(zb_zigbee_h handle, zb_ieee_addr addr64)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_get_controller_mac_address(addr64);
+       DBG("zbl_get_controller_mac_address()=0x%X", ret);
+       return ret;
+}
+
+API int zb_get_network_info(zb_zigbee_h handle, zb_ieee_addr addr64, zb_nwk_addr *nodeid,
+               zb_nwk_addr *panid, unsigned char *channel, unsigned char *tx_power)
+{
+       int ret = ZIGBEE_ERROR_NONE;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == handle, ZIGBEE_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == addr64, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       ret = zbl_get_network_info(addr64, nodeid, panid, channel, tx_power);
+       DBG("zbl_get_network_info()=0x%X", ret);
+       return ret;
+}
+
+API int zb_end_dev_info_list_free(zb_end_dev_info_h *list)
+{
+       int i = 0, j = 0;
+       struct zb_end_device_info_s **plist = (struct zb_end_device_info_s **)list;
+       CHECK_FEATURE_SUPPORTED(ZIGBEE_FEATURE);
+       RETV_IF(NULL == list, ZIGBEE_ERROR_INVALID_PARAMETER);
+
+       while (plist[i]) {
+               j = 0;
+               while (plist[i]->desc && plist[i]->desc[j]) {
+                       free(plist[i]->desc[j]);
+                       j++;
+               }
+               if (plist[i]->desc)
+                       free(plist[i]->desc);
+               free(plist[i]);
+               i++;
+       }
+       free(plist);
+       plist = NULL;
+       return ZIGBEE_ERROR_NONE;
+}
diff --git a/src/zbl.h b/src/zbl.h
new file mode 100644 (file)
index 0000000..a404dff
--- /dev/null
+++ b/src/zbl.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015 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_ZIGBEE_LIBRARY_H__
+#define __TIZEN_NETWORK_ZIGBEE_LIBRARY_H__
+
+#include <glib.h>
+#include <zigbee.h>
+
+#ifdef API
+#undef API
+#endif /* API */
+
+#define API __attribute__((visibility("default")))
+
+struct zbl_zigbee_s {
+       GList *dbus_sub_ids; /**< subsrcibed dbus signal id */
+       zb_event_cb event_handler; /**< event handler */
+#ifdef ZB_FEATURE_GLOBAL_RSP_SYNC
+       GList *global_cmd_req; /**< list of global command requests */
+#endif
+       void *user_data; /**< use data */
+};
+
+#endif /* TIZEN_NETWORK_ZIGBEE_LIBRARY_H__ */
index e0ed940a9c06c857d159be752c98f8bf3740e669..ab28b6a00ecf6028e5ed74ae3addabe04ca96948 100644 (file)
@@ -431,13 +431,13 @@ static void _zb_event_cb(zb_nwk_addr addr16, zb_ieee_addr addr64, zb_event_e e,
                                &type
                                );
                        msg("  type = [0x%02X][%s]", type, zb_zcl_get_data_type_str(type));
-                       zb_attr_report_get_value(
+                       ret = zb_attr_report_get_value(
                                records[j],
                                &type,
                                &buf,
                                &count
                                );
-                       if (ZIGBEE_ERROR_NONE == ret) {
+                       if (0 < count && ZIGBEE_ERROR_NONE == ret) {
                                for (i = 0; i < count; i++)
                                        msg("    0x%02X ", buf[i]);
                        }