Implement ZDO Dev control
authorJiwan Kim <ji-wan.kim@samsung.com>
Mon, 6 Feb 2017 06:02:44 +0000 (15:02 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Thu, 11 May 2017 09:10:25 +0000 (18:10 +0900)
Change-Id: I1c64363769dad82b6a481fd97a877c3bd78a5f07
Signed-off-by: Jiwan Kim <ji-wan.kim@samsung.com>
common/include/zigbee_types.h
common/include/zigbee_zdo_dev_control_type.h
zigbee-daemon/zigbee-interface/introspection/zdo-dev-control.xml
zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zdo_dev_control.c
zigbee-daemon/zigbee-lib/include/zblib_driver_zdo_dev_control.h
zigbee-daemon/zigbee-lib/src/drivers/zblib_driver_zdo_dev_control.c
zigbee-daemon/zigbee-lib/src/zblib_request.c

index 7e7333d..8ad04a1 100644 (file)
 #define ZIGBEE_EUI64_SIZE 8
 
 /**
- * @brief Definition for maximum count of endpoints in bytes (8).
+ * @brief Definition for maximum count of endpoints in bytes (10).
  * @since_tizen 3.0
  */
 #define ZIGBEE_MAX_ENDPOINTS 10
 
 /**
- * @brief Definition for maximum count of clusters in bytes (8).
+ * @brief Definition for maximum count of clusters in bytes (10).
  * @since_tizen 3.0
  */
 #define ZIGBEE_MAX_CLUSTERS 10
 
 /**
+ * @brief Definition for maximum count of endpoint clusters in bytes (32).
+ * @since_tizen 3.0
+ */
+#define ZIGBEE_MAX_ENDPOINT_CLUSTER 32
+
+/**
  * @brief Definition for custom send payload/data length (128).
  * @since_tizen 3.0
  */
index b923e23..5fee273 100644 (file)
 
 #include <zigbee_types.h>
 
+/* -----------------------------------------------------------------------------
+ * For Requests
+ * ---------------------------------------------------------------------------*/
+
 /**
  * @brief Definition for ZDO Dev control network address request structure.
  * @since_tizen 3.0
  */
 typedef struct {
-       char eui64[ZIGBEE_EUI64_SIZE]; /**< EUI64 (an IEEE address) */
-       char request_type; /**< Request type */
-       char start_index; /**< Start index */
+       unsigned char eui64[ZIGBEE_EUI64_SIZE]; /**< EUI64 (an IEEE address) */
+       unsigned char request_type; /**< Request type */
+       unsigned char start_index; /**< Start index */
 } ZigbeeZdoDevControlNwkAddrReq_t;
 
 /**
@@ -36,12 +40,12 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
-       short profile_id; /**< Profile ID */
-       char num_in_cl; /**< Number of int CL */
-       char *in_cl; /**< In CL */
-       char num_out_cl; /**< Number of out CL */
-       char *out_cl; /**< Out CL */
+       unsigned short node_id; /**< Node ID */
+       unsigned short profile_id; /**< Profile ID */
+       unsigned char num_in_cl; /**< Number of int CL */
+       unsigned short *in_cl; /**< In CL */
+       unsigned char num_out_cl; /**< Number of out CL */
+       unsigned short *out_cl; /**< Out CL */
 } ZigbeeZdoDevControlMatchedDescriptorReq_t;
 
 /**
@@ -49,7 +53,7 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
+       unsigned short node_id; /**< Node ID */
 } ZigbeeZdoDevControlIeeeAddrReq_t;
 
 /**
@@ -57,7 +61,7 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
+       unsigned short node_id; /**< Node ID */
 } ZigbeeZdoDevControlActiveEpReq_t;
 
 /**
@@ -65,7 +69,7 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
+       unsigned short node_id; /**< Node ID */
 } ZigbeeZdoDevControlNodeDescriptorReq_t;
 
 /**
@@ -73,7 +77,7 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
+       unsigned short node_id; /**< Node ID */
 } ZigbeeZdoDevControlPowerDescriptorReq_t;
 
 /**
@@ -81,7 +85,7 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
+       unsigned short node_id; /**< Node ID */
 } ZigbeeZdoDevControlComplexDescriptorReq_t;
 
 /**
@@ -89,7 +93,7 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
+       unsigned short node_id; /**< Node ID */
 } ZigbeeZdoDevControlUserDescriptorReq_t;
 
 /**
@@ -97,9 +101,9 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
-       char user_descriptor_len; /**< User descriptor length */
-       char user_descriptor[ZIGBEE_ZDODEV_CONTROL_USER_DECRIPTOR_MAX_LEN];
+       unsigned short node_id; /**< Node ID */
+       unsigned char user_descriptor_len; /**< User descriptor length */
+       unsigned char user_descriptor[ZIGBEE_ZDODEV_CONTROL_USER_DECRIPTOR_MAX_LEN];
                /**< User descriptor */
 } ZigbeeZdoDevControlUserDescriptorSetReq_t;
 
@@ -108,9 +112,9 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
-       char mac_addr[ZIGBEE_EUI64_SIZE]; /**< MAC address */
-       char capability; /**< Capability */
+       unsigned short node_id; /**< Node ID */
+       unsigned char mac_addr[ZIGBEE_EUI64_SIZE]; /**< MAC address */
+       unsigned char capability; /**< Capability */
 } ZigbeeZdoDevControlDeviceAnnounce_t;
 
 /**
@@ -118,8 +122,8 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
-       char endpoint; /**< Endpoint */
+       unsigned short node_id; /**< Node ID */
+       unsigned char endpoint; /**< Endpoint */
 } ZigbeeZdoDevControlSimpleDescriptorReq_t;
 
 /**
@@ -127,8 +131,8 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
-       char start_index; /**< Start index */
+       unsigned short node_id; /**< Node ID */
+       unsigned char start_index; /**< Start index */
 } ZigbeeZdoDevControlMgmtLqiReq_t;
 
 /**
@@ -136,8 +140,8 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
-       char start_index; /**< Start index */
+       unsigned short node_id; /**< Node ID */
+       unsigned char start_index; /**< Start index */
 } ZigbeeZdoDevControlMgmtRtgReq_t;
 
 /**
@@ -145,8 +149,8 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
-       char start_index; /**< Start index */
+       unsigned short node_id; /**< Node ID */
+       unsigned char start_index; /**< Start index */
 } ZigbeeZdoDevControlMgmtBindReq_t;
 
 /**
@@ -154,9 +158,9 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short addr; /**< Address */
-       char duration; /**< Duration */
-       char tc_significance; /**< TC significance */
+       unsigned short node_id; /**< Node ID */
+       unsigned char duration; /**< Duration */
+       unsigned char tc_significance; /**< TC significance */
 } ZigbeeZdoDevControlMgmtPermitJoinReq_t;
 
 /**
@@ -164,23 +168,276 @@ typedef struct {
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
+       unsigned short node_id; /**< Node ID */
        unsigned int scan_channel; /**< Scan channel */
-       char scan_duration; /**< Scan duration */
-       char scan_count; /**< Scan count */
-       char network_update_id; /**< Network update ID */
+       unsigned char scan_duration; /**< Scan duration */
+       unsigned char scan_count; /**< Scan count */
+       unsigned char network_update_id; /**< Network update ID */
 } ZigbeeZdoDevControlNwkUpdateReq_t;
 
 /**
- * @brief Definition for ZDO Dev control network descriptor request structure.
+ * @brief Definition for ZDO Dev control network discovery request structure.
  * @since_tizen 3.0
  */
 typedef struct {
-       short node_id; /**< Node ID */
+       unsigned short node_id; /**< Node ID */
        unsigned int scan_channel; /**< Scan channel */
-       char scan_duration; /**< Scan duration */
-       short scan_count; /**< Scan count */
-       char start_index; /**< Start index */
-} ZigbeeZdoDevControlNwkDescriptorReq_t;
+       unsigned char scan_duration; /**< Scan duration */
+       unsigned short scan_count; /**< Scan count */
+       unsigned char start_index; /**< Start index */
+} ZigbeeZdoDevControlNwkDiscoveryReq_t;
+
+/* -----------------------------------------------------------------------------
+ * For Notifications
+ * ---------------------------------------------------------------------------*/
+
+/**
+ * @brief Definition for ZDO Dev control network address response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned char eui64[ZIGBEE_EUI64_SIZE]; /**< EUI64 (an IEEE address) */
+       unsigned short node_id; /**< Node ID */
+       unsigned char associated_count; /**< The number of assoc */
+       unsigned char start_index; /**< Start index */
+} ZigbeeZdoDevControlNwkAddrResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control extended network address response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned char eui64[ZIGBEE_EUI64_SIZE]; /**< EUI64 (an IEEE address) */
+       unsigned short node_id; /**< Node ID */
+       unsigned char associated_count; /**< The number of assoc */
+       unsigned char start_index; /**< Start index */
+       unsigned short *associated_addr_list; /**< Associated network addresses */
+} ZigbeeZdoDevControlNwkAddrExtResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control matched descriptor response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned short node_id; /**< Node ID */
+       unsigned char list_count; /**< The number of matched descriptors */
+       unsigned char *match_list; /**< List of matched descriptors */
+} ZigbeeZdoDevControlMatchedDescriptorResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control active endpoint response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned short node_id; /**< Node ID */
+       unsigned char endpoint_count; /**< The number of endpoints */
+       unsigned char *endpoint_list; /**< List of endpoints */
+} ZigbeeZdoDevControlActiveEpResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control simple descriptor response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned short node_id; /**< Node ID */
+       int length; /**< Length of message */
+       unsigned char device_version; /**< Device version */
+       unsigned char endpoint; /**< Endpoint */
+       unsigned short profile_id; /**< Profile ID */
+       unsigned short device_id; /**< Device ID */
+       unsigned char in_cluster_count; /**< The number of in cluster */
+       unsigned char out_cluster_count; /**< The number of out cluster */
+       unsigned short in_cluster[ZIGBEE_MAX_ENDPOINT_CLUSTER]; /**< In cluster */
+       unsigned short out_cluster[ZIGBEE_MAX_ENDPOINT_CLUSTER]; /**< Out cluster */
+} ZigbeeZdoDevControlSimpleDescriptorResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Management bind entry structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char eui64[ZIGBEE_EUI64_SIZE]; /**< EUI64 (an IEEE address) */
+       unsigned char source_endpoint; /**< Source endpoint */
+       unsigned short cluster_id; /**< Cluster ID */
+       unsigned char dest_addr_mode; /**< Destination address mode */
+       unsigned short dest_addr; /**< Destination network address */
+       unsigned char dest_eui64[ZIGBEE_EUI64_SIZE]; /**< Destination EUI64 (an IEEE address) */
+       unsigned char dest_endpoint; /**< Destination endpoint */
+} ZigbeeZdoDevControlMgmtBindEntry_t;
+
+/**
+ * @brief Definition for ZDO Dev control Management bind response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned char table_entries; /**< Total number of Binding Table entries */
+       unsigned char start_index; /**< Start index */
+       unsigned char table_list_count; /**< The number of binding table list */
+       ZigbeeZdoDevControlMgmtBindEntry_t *table_list; /**< Binding table list */
+} ZigbeeZdoDevControlMgmtBindResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Management LQI entry structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char extended_pan_id[ZIGBEE_EUI64_SIZE]; /**< Extended PAN ID */
+       unsigned char eui64[ZIGBEE_EUI64_SIZE]; /**< EUI64 (an IEEE address) */
+       unsigned short node_id;
+       unsigned char device_type; /**< Device Type */
+       unsigned char rx_on_when_idle; /**< Can Receive on Idle State */
+       unsigned char relationship; /**< Relationship (i.e. parent, children or sibling) */
+       unsigned char permit_joining; /**< Can handle join request */
+       unsigned char depth; /**< Depth from parent */
+       unsigned char lqi; /**< Link Quality Indicator */
+} ZigbeeZdoDevControlMgmtLqiEntry_t;
+
+/**
+ * @brief Definition for ZDO Dev control Management LQI response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned char table_entries; /**< Total number of LQI Table entries */
+       unsigned char start_index; /**< Start index */
+       unsigned char table_list_count; /**< The number of LQI table list */
+       ZigbeeZdoDevControlMgmtLqiEntry_t *table_list; /**< LQI table list */
+} ZigbeeZdoDevControlMgmtLqiResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Network discovery entry structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       char extended_pan_id[ZIGBEE_EUI64_SIZE]; /**< Extended PAN ID */
+       unsigned char logical_channel; /**< Logical channel number */
+       unsigned char stack_profile; /**< Stack profile version */
+       unsigned char zigbee_version; /**< Supported ZigBee protocol version */
+       unsigned char beacon_order; /**< Beacon order */
+       unsigned char superframe_order; /**< Superframe order */
+       unsigned char permit_joining; /**< Permit joining flag */
+} ZigbeeZdoDevControlNwkDiscoveryEntry_t;
+
+/**
+ * @brief Definition for ZDO Dev control Network discovery response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned char network_count; /**< Total number of network */
+       unsigned char start_index; /**< Start index */
+       unsigned char table_list_count; /**< The number of network table entry */
+       ZigbeeZdoDevControlNwkDiscoveryEntry_t *table_list; /**< Network table list */
+} ZigbeeZdoDevControlNwkDiscoveryResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Management routing entry structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned short dest_addr; /**< Network Address */
+       unsigned char status; /**< Status */
+       unsigned char memory_constrained; /* Is memory constrained device */
+       unsigned char many_to_one; /* Can support many-to-one endpoint routing */
+       unsigned char route_record_required;  /* Route record required */
+       unsigned short next_hop_addr; /* Next hop address */
+} ZigbeeZdoDevControlMgmtRtgEntry_t;
+
+/**
+ * @brief Definition for ZDO Dev control Management routing response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned char table_entries; /**< Total number of Routing Table entries */
+       unsigned char start_index; /**< Start index */
+       unsigned char table_list_count; /**< The number of Routing table list */
+       ZigbeeZdoDevControlMgmtRtgEntry_t *table_list; /**< Routing table list */
+} ZigbeeZdoDevControlMgmtRtgResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Management permit join response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+} ZigbeeZdoDevControlMgmtPermitJoinResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Management left response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+} ZigbeeZdoDevControlMgmtLeftResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Node descriptor response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned short node_id; /**< Node ID */
+       unsigned char logical_type; /**< Logical Role */
+       unsigned char complex_desciptor_available; /**< Complex Descriptor Available */
+       unsigned char user_descriptor_available; /**< User Descriptor Available */
+       unsigned char aps_flags; /**< APS Flags */
+       unsigned char frequency_band; /**< Frequency Band */
+       unsigned char mac_capability_flags; /**< MAC Capability Flags */
+       unsigned short manufacturer_code; /**< Manufacturer Code */
+       unsigned char max_buffer_size; /**< Maximum Buffer Size */
+       unsigned short max_incoming_transfer_size; /**< Maximum Incoming Transfer Size */
+       unsigned short server_mask; /**< Server Mask */
+       unsigned short max_outgoing_transfer_size; /**< Maximum Outgoing Transfer Size */
+       unsigned char descriptor_capability_field; /**< Descriptor Capability Field */
+} ZigbeeZdoDevControlNodeDescriptorResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Power descriptor response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned short node_id; /**< Node ID */
+       unsigned char current_power_mode; /**< Current power mode */
+       unsigned char available_power_sources; /**< Available power sources */
+       unsigned char current_power_source; /**< Current power source */
+       unsigned char current_power_source_level; /**< Current power source level */
+} ZigbeeZdoDevControlPowerDescriptorResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control Complex descriptor response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned short node_id; /**< Node ID */
+       unsigned char list_count; /**< The count of descriptor list */
+       unsigned char *complex_descriptor_list; /**< Complex descriptor list */
+} ZigbeeZdoDevControlComplexDescriptorResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control User descriptor response structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+       unsigned short node_id; /**< Node ID */
+       unsigned char list_count; /**< The count of descriptor list */
+       unsigned char *user_descriptor_list; /**< User descriptor list */
+} ZigbeeZdoDevControlUserDescriptorResp_t;
+
+/**
+ * @brief Definition for ZDO Dev control User descriptor confirm structure.
+ * @since_tizen 3.0
+ */
+typedef struct {
+       unsigned char status; /**< Status */
+} ZigbeeZdoDevControlUserDescriptorConfirm_t;
 
 #endif /* __ZIGBEE_ZDO_DEV_CONTROL_TYPE_H__ */
index 0eb9959..00c0dd6 100644 (file)
@@ -1,7 +1,7 @@
 <node>
        <interface name='org.tizen.zigbee.zdo_dev_control'>
                <method name='nwk_addr_req'>
-                       <arg type='ay' name='EUI64' direction='in'/>
+                       <arg type='a(y)' name='EUI64' direction='in'/>
                        <arg type='y' name='requestType' direction='in'/>
                        <arg type='y' name='start_index' direction='in'/>
                        <arg type='i' name='result' direction='out'/>
                <method name='user_desc_set_req'>
                        <arg type='q' name='nodeId' direction='in'/>
                        <arg type='y' name='length' direction='in'/>
-                       <arg type='ay' name='user_desc' direction='in'/>
+                       <arg type='a(y)' name='user_desc' direction='in'/>
                        <arg type='i' name='result' direction='out'/>
                </method>
                <method name='device_announce'>
                        <arg type='q' name='nodeId' direction='in'/>
-                       <arg type='ay' name='mac_addr' direction='in'/>
+                       <arg type='a(y)' name='mac_addr' direction='in'/>
                        <arg type='y' name='capability' direction='in'/>
                        <arg type='i' name='result' direction='out'/>
                </method>
@@ -72,7 +72,7 @@
                        <arg type='i' name='result' direction='out'/>
                </method>
                <method name='mgmt_permit_join_req'>
-                       <arg type='q' name='addr16' direction='in'/>
+                       <arg type='q' name='nodeId' direction='in'/>
                        <arg type='y' name='duration' direction='in'/>
                        <arg type='y' name='tc_significance' direction='in'/>
                        <arg type='i' name='result' direction='out'/>
 
                <signal name='nwk_addr_rsp'>
                        <arg type='y' name='status'/>
-                       <arg type='ay' name='EUI64'/>
+                       <arg type='a(y)' name='EUI64'/>
                        <arg type='q' name='nodeId'/>
                        <arg type='y' name='num_of_assoc'/>
                        <arg type='y' name='startIds'/>
                </signal>
                <signal name='nwk_addr_ext_rsp'>
                        <arg type='y' name='status'/>
-                       <arg type='ay' name='EUI64'/>
+                       <arg type='a(y)' name='EUI64'/>
                        <arg type='q' name='nodeId'/>
                        <arg type='y' name='num_of_assoc'/>
                        <arg type='y' name='startIds'/>
                        <arg type='aq' name='nwkaddr'/>
                </signal>
                <signal name='active_ep_rsp'>
-                       <arg type='q' name='nodeId'/>
                        <arg type='y' name='status'/>
-                       <arg type='ay' name='endpoint'/>
+                       <arg type='q' name='nodeId'/>
+                       <arg type='a(y)' name='endpoint'/>
                        <arg type='y' name='endpointCount'/>
                </signal>
                <signal name='simple_desc_rsp'>
                        <arg type='q' name='deviceId'/>
                        <arg type='y' name='inClusterCount'/>
                        <arg type='y' name='outClusterCount'/>
+                       <arg type='aq' name='inClusterList'/>
                        <arg type='aq' name='outClusterList'/>
                </signal>
                <signal name='matched_descriptor_rsp'>
                        <arg type='y' name='status'/>
                        <arg type='q' name='nodeId'/>
                        <arg type='y' name='length'/>
-                       <arg type='ay' name='matchList'/>
+                       <arg type='a(y)' name='matchList'/>
                </signal>
                <signal name='mgmt_bind_rsp'>
                        <arg type='y' name='status'/>
                        <arg type='y' name='tot'/>
-                       <arg type='y' name='start'/>
+                       <arg type='y' name='start_index'/>
                        <arg type='y' name='inc'/>
-                       <arg type='a(ayyqyay)' name='response'/>
+                       <arg type='a(ayyqyqayy)' name='response'/>
                </signal>
                <signal name='mgmt_lqi_rsp'>
                        <arg type='y' name='status'/>
                        <arg type='y' name='tot'/>
-                       <arg type='y' name='start'/>
+                       <arg type='y' name='start_index'/>
                        <arg type='y' name='inc'/>
-                       <arg type='a(ayayyqyyyy)' name='response'/>
+                       <arg type='a(ayayyqyyyyy)' name='response'/>
                </signal>
                <signal name='nwk_disc_rsp'>
                        <arg type='y' name='status'/>
                        <arg type='y' name='nwkCount'/>
                        <arg type='y' name='startIndex'/>
                        <arg type='y' name='nwkListCount'/>
-                       <arg type='a(ayayyqyyyyy)' name='response'/>
+                       <arg type='a(ayyyyyyy)' name='response'/>
                </signal>
                <signal name='mgmt_rtg_rsp'>
                        <arg type='y' name='status'/>
                        <arg type='y' name='tot'/>
-                       <arg type='y' name='start'/>
+                       <arg type='y' name='start_index'/>
                        <arg type='y' name='inc'/>
                        <arg type='a(qyyyyq)' name='response'/>
                </signal>
                        <arg type='y' name='status'/>
                        <arg type='q' name='nodeId'/>
                        <arg type='y' name='length'/>
-                       <arg type='ay' name='complex_desc'/>
+                       <arg type='a(y)' name='complex_desc'/>
                </signal>
                <signal name='user_desc_rsp'>
                        <arg type='y' name='status'/>
                        <arg type='q' name='nodeId'/>
                        <arg type='y' name='length'/>
-                       <arg type='ay' name='user_desc'/>
+                       <arg type='a(y)' name='user_desc'/>
                </signal>
                <signal name='user_desc_confirm'>
                        <arg type='y' name='status'/>
index b252ec8..280cd70 100644 (file)
 
 #include <zblib_driver_zdo_dev_control.h>
 
+static void *_service_interface_ref_zigbee_zdo_dev_control(ZigBeeServiceInterface *service_interface)
+{
+       ZigbeeObjectSkeleton *zigbee_object = NULL;
+       ZigbeeCustomData_t *custom_data = NULL;
+       ZigbeeZdo_dev_control *dev_control_object = NULL;
+
+       custom_data = (ZigbeeCustomData_t *)zblib_service_interface_ref_user_data(service_interface);
+       if (NULL == custom_data) {
+               Z_LOGE("D-BUS service interface custom_data is NULL!");
+               return NULL;
+       }
+
+       /* Get zigbee object */
+       zigbee_object = g_hash_table_lookup(custom_data->objects, ZIGBEE_SERVICE_PATH);
+       if (NULL == zigbee_object) {
+               Z_LOGW("Cannot find ZigBee D-BUS interface object!", zigbee_object);
+               return NULL;
+       }
+
+       dev_control_object = zigbee_object_get_zdo_dev_control(ZIGBEE_OBJECT(zigbee_object));
+       return dev_control_object;
+}
+
 static void on_zdodev_control_nwk_addr_req_resp(ZigBeeServiceInterface *service_interface,
        guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
 {
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_nwk_addr_req(dev_control_object, invocation,
+               payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_nwk_addr_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -52,8 +94,8 @@ static gboolean on_zdodev_control_nwk_addr_req(ZigbeeZdo_dev_control *zdodev_con
        memset(&req, 0x0, sizeof(ZigbeeZdoDevControlNwkAddrReq_t));
 
        /* Update request structure */
-       g_variant_get(eui64, "ay", &iter);
-       while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
+       g_variant_get(eui64, "a(y)", &iter);
+       while (g_variant_iter_loop(iter, "(y)", &(req.eui64[i]))) {
                i++;
                if (i >= ZIGBEE_EUI64_SIZE)
                        break;
@@ -101,11 +143,30 @@ static void on_zdodev_control_matched_descriptor_req_resp(ZigBeeServiceInterface
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_matched_descriptor_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_matched_descriptor_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -133,22 +194,30 @@ static gboolean on_zdodev_control_matched_descriptor_req(ZigbeeZdo_dev_control *
        req.node_id = node_id;
        req.profile_id = profile_id;
        req.num_in_cl = num_in_cl;
-       req.in_cl = g_malloc0(sizeof(num_in_cl));
-       g_variant_get(in_cl, "ay", &iter);
-       while (g_variant_iter_loop(iter, "y", req.in_cl[i])) {
-               i++;
-               if (i >= num_in_cl)
-                       break;
+       if (num_in_cl > 0) {
+               req.in_cl = g_malloc0_n(num_in_cl, sizeof(unsigned short));
+               g_variant_get(in_cl, "aq", &iter);
+               while (g_variant_iter_loop(iter, "q", &(req.in_cl[i]))) {
+                       i++;
+                       if (i >= num_in_cl)
+                               break;
+               }
+       } else {
+               req.in_cl = NULL;
        }
 
        i = 0;
        req.num_out_cl = num_out_cl;
-       req.out_cl = g_malloc0(sizeof(num_out_cl));
-       g_variant_get(out_cl, "ay", &iter);
-       while (g_variant_iter_loop(iter, "y", req.out_cl[i])) {
-               i++;
-               if (i >= num_out_cl)
-                       break;
+       if (num_out_cl > 0) {
+               req.out_cl = g_malloc0_n(num_out_cl, sizeof(unsigned short));
+               g_variant_get(out_cl, "aq", &iter);
+               while (g_variant_iter_loop(iter, "q", &(req.out_cl[i]))) {
+                       i++;
+                       if (i >= num_out_cl)
+                               break;
+               }
+       } else {
+               req.out_cl = NULL;
        }
 
        /* Allocate response callback data */
@@ -196,11 +265,30 @@ static void on_zdodev_control_ieee_addr_req_resp(ZigBeeServiceInterface *service
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_ieee_addr_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_ieee_addr_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -259,11 +347,30 @@ static void on_zdodev_control_active_ep_req_resp(ZigBeeServiceInterface *service
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_active_ep_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_active_ep_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -322,11 +429,30 @@ static void on_zdodev_control_node_desc_req_resp(ZigBeeServiceInterface *service
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_node_desc_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_node_desc_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -385,11 +511,30 @@ static void on_zdodev_control_power_desc_req_resp(ZigBeeServiceInterface *servic
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_power_desc_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_power_desc_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -448,11 +593,30 @@ static void on_zdodev_control_complex_desc_req_resp(ZigBeeServiceInterface *serv
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_complex_desc_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_complex_desc_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -511,11 +675,30 @@ static void on_zdodev_control_user_desc_req_resp(ZigBeeServiceInterface *service
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_user_desc_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_user_desc_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -574,11 +757,30 @@ static void on_zdodev_control_user_desc_set_req_resp(ZigBeeServiceInterface *ser
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_user_desc_set_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_user_desc_set_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -602,8 +804,8 @@ static gboolean on_zdodev_control_user_desc_set_req(ZigbeeZdo_dev_control *zdode
        /* Update request structure */
        req.node_id = node_id;
        req.user_descriptor_len = length;
-       g_variant_get(user_desc, "ay", &iter);
-       while (g_variant_iter_loop(iter, "y", req.user_descriptor[i])) {
+       g_variant_get(user_desc, "a(y)", &iter);
+       while (g_variant_iter_loop(iter, "(y)", &(req.user_descriptor[i]))) {
                i++;
                if (i >= ZIGBEE_ZDODEV_CONTROL_USER_DECRIPTOR_MAX_LEN)
                        break;
@@ -649,11 +851,30 @@ static void on_zdodev_control_device_announce_resp(ZigBeeServiceInterface *servi
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_device_announce(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_device_announce(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -676,8 +897,8 @@ static gboolean on_zdodev_control_device_announce(ZigbeeZdo_dev_control *zdodev_
 
        /* Update request structure */
        req.node_id = node_id;
-       g_variant_get(mac_addr, "ay", &iter);
-       while (g_variant_iter_loop(iter, "y", req.mac_addr[i])) {
+       g_variant_get(mac_addr, "a(y)", &iter);
+       while (g_variant_iter_loop(iter, "(y)", &(req.mac_addr[i]))) {
                i++;
                if (i >= ZIGBEE_EUI64_SIZE)
                        break;
@@ -724,11 +945,30 @@ static void on_zdodev_control_simple_desc_req_resp(ZigBeeServiceInterface *servi
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_simple_desc_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_simple_desc_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -789,11 +1029,30 @@ static void on_zdodev_control_mgmt_lqi_req_resp(ZigBeeServiceInterface *service_
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_mgmt_lqi_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_mgmt_lqi_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -854,11 +1113,30 @@ static void on_zdodev_control_mgmt_rtg_req_resp(ZigBeeServiceInterface *service_
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_mgmt_rtg_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_mgmt_rtg_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -919,11 +1197,30 @@ static void on_zdodev_control_mgmt_bind_req_resp(ZigBeeServiceInterface *service
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_mgmt_bind_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_mgmt_bind_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -984,16 +1281,35 @@ static void on_zdodev_control_mgmt_permit_join_req_resp(ZigBeeServiceInterface *
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_mgmt_permit_join_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_mgmt_permit_join_req(ZigbeeZdo_dev_control *zdodev_control_object,
        GDBusMethodInvocation *invocation,
-       gshort addr16,
+       gshort node_id,
        gchar duration,
        gchar tc_significance,
        gpointer user_data)
@@ -1007,7 +1323,7 @@ static gboolean on_zdodev_control_mgmt_permit_join_req(ZigbeeZdo_dev_control *zd
        memset(&req, 0x0, sizeof(ZigbeeZdoDevControlMgmtPermitJoinReq_t));
 
        /* Update request structure */
-       req.addr = addr16;
+       req.node_id = node_id;
        req.duration = duration;
        req.tc_significance = tc_significance;
 
@@ -1051,11 +1367,30 @@ static void on_zdodev_control_nwk_update_req_resp(ZigBeeServiceInterface *servic
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_nwk_update_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_nwk_update_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -1122,11 +1457,30 @@ static void on_zdodev_control_nwk_disc_req_resp(ZigBeeServiceInterface *service_
        ZigbeeServiceInterfaceRespCbData_t *cb_data =
                (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
 
-       NOT_USED(cb_data);
+       ZigbeeZdo_dev_control *dev_control_object;
+       GDBusMethodInvocation *invocation;
+
+       ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
+
        NOT_USED(service_interface);
        NOT_USED(request_id);
-       NOT_USED(resp_data);
-       NOT_USED(resp_data_len);
+
+       if (NULL == resp_data || 0 == resp_data_len) {
+               Z_LOGE("resp_data=%p or resp_data_len=%d is null", resp_data, resp_data_len);
+               g_free(cb_data);
+               return;
+       }
+
+       dev_control_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
+       zblib_check_null_free_and_ret("dev_control_object", dev_control_object, cb_data);
+
+       invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
+       zblib_check_null_free_and_ret("invocation", invocation, cb_data);
+
+       zigbee_zdo_dev_control_complete_nwk_disc_req(dev_control_object,
+               invocation, payload->result);
+
+       g_free(cb_data);
 }
 
 static gboolean on_zdodev_control_nwk_disc_req(ZigbeeZdo_dev_control *zdodev_control_object,
@@ -1139,12 +1493,12 @@ static gboolean on_zdodev_control_nwk_disc_req(ZigbeeZdo_dev_control *zdodev_con
        gpointer user_data)
 {
        ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
-       ZigbeeZdoDevControlNwkDescriptorReq_t req;
+       ZigbeeZdoDevControlNwkDiscoveryReq_t req;
        ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
 
        gboolean ret;
 
-       memset(&req, 0x0, sizeof(ZigbeeZdoDevControlNwkDescriptorReq_t));
+       memset(&req, 0x0, sizeof(ZigbeeZdoDevControlNwkDiscoveryReq_t));
 
        /* Update request structure */
        req.node_id = node_id;
@@ -1190,15 +1544,408 @@ static gboolean on_zdodev_control_nwk_disc_req(ZigbeeZdo_dev_control *zdodev_con
 void zigbee_service_dbus_interface_zdo_dev_control_notification(ZigBeeServiceInterface *service_interface,
        guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
 {
-       if (NULL == service_interface) {
-               Z_LOGE("service_interface is NULL");
+       ZigbeeZdo_dev_control *dev_control_object = NULL;
+
+       zblib_check_null_ret("service_interface", service_interface);
+
+       if (NULL == noti_data || 0 == noti_data_len) {
+               Z_LOGE("noti_data is NULL");
                return;
        }
 
-       NOT_USED(noti_id);
-       NOT_USED(noti_data);
-       NOT_USED(noti_data_len);
+       dev_control_object = _service_interface_ref_zigbee_zdo_dev_control(service_interface);
+       zblib_check_null_ret("dev_control_object", dev_control_object);
+
        NOT_USED(noti_cb_data);
+
+       switch(noti_id) {
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_NWK_ADDR_RSP: {
+               ZigbeeZdoDevControlNwkAddrResp_t *nwk_addr_t =
+                       (ZigbeeZdoDevControlNwkAddrResp_t*)noti_data;
+
+               GVariant *v_eui64 = NULL;
+               v_eui64 = g_variant_new_from_data(G_VARIANT_TYPE("a(y)"),
+                       nwk_addr_t->eui64, ZIGBEE_EUI64_SIZE, TRUE, NULL, NULL);
+               if (NULL == v_eui64) {
+                       Z_LOGE("Failed to create variant!");
+               } else {
+                       Z_LOGD("nwk addr rsp : [0x%X]", nwk_addr_t->status);
+                       zigbee_zdo_dev_control_emit_nwk_addr_rsp(dev_control_object,
+                               nwk_addr_t->status, v_eui64, nwk_addr_t->node_id,
+                               nwk_addr_t->associated_count, nwk_addr_t->start_index);
+               }
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_NWK_ADDR_EXT_RSP: {
+               ZigbeeZdoDevControlNwkAddrExtResp_t *nwk_addr_t =
+                       (ZigbeeZdoDevControlNwkAddrExtResp_t*)noti_data;
+
+               GVariant *v_eui64 = NULL;
+               GVariant *v_associated = NULL;
+               v_eui64 = g_variant_new_from_data(G_VARIANT_TYPE("a(y)"),
+                       nwk_addr_t->eui64, ZIGBEE_EUI64_SIZE, TRUE, NULL, NULL);
+               v_associated = g_variant_new_from_data(G_VARIANT_TYPE("aq"),
+                       nwk_addr_t->associated_addr_list, nwk_addr_t->associated_count, TRUE, NULL, NULL);
+               if (NULL == v_eui64 || NULL == v_associated) {
+                       Z_LOGE("Failed to create variant!");
+                       if (v_eui64)
+                               g_variant_unref(v_eui64);
+                       if (v_associated)
+                               g_variant_unref(v_associated);
+               } else {
+                       Z_LOGD("nwk addr ext rsp : [0x%X]", nwk_addr_t->status);
+                       zigbee_zdo_dev_control_emit_nwk_addr_ext_rsp(dev_control_object,
+                               nwk_addr_t->status, v_eui64, nwk_addr_t->node_id,
+                               nwk_addr_t->associated_count, nwk_addr_t->start_index, v_associated);
+               }
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_ACTIVE_EP_RSP: {
+               ZigbeeZdoDevControlActiveEpResp_t *active_t =
+                       (ZigbeeZdoDevControlActiveEpResp_t *)noti_data;
+
+               GVariant *v_ep_list = g_variant_new_from_data(G_VARIANT_TYPE("a(y)"),
+                       active_t->endpoint_list, active_t->endpoint_count, TRUE, NULL, NULL);
+               if (NULL == v_ep_list) {
+                       Z_LOGE("Failed to create variant!");
+               } else {
+                       Z_LOGD("Active endpoint rsp : [0x%X]", active_t->status);
+                       zigbee_zdo_dev_control_emit_active_ep_rsp(dev_control_object,
+                               active_t->status, active_t->node_id,
+                               v_ep_list, active_t->endpoint_count);
+               }
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_SIMPLE_DESC_RSP: {
+               ZigbeeZdoDevControlSimpleDescriptorResp_t *desc_t =
+                       (ZigbeeZdoDevControlSimpleDescriptorResp_t *)noti_data;
+
+               GVariant *v_in_cluster = NULL;
+               GVariant *v_out_cluster = NULL;
+               v_in_cluster = g_variant_new_from_data(G_VARIANT_TYPE("aq"),
+                       desc_t->in_cluster, (sizeof(gushort) * desc_t->in_cluster_count),
+                       TRUE, NULL, NULL);
+               v_out_cluster = g_variant_new_from_data(G_VARIANT_TYPE("aq"),
+                       desc_t->out_cluster, (sizeof(gushort) * desc_t->out_cluster_count),
+                       TRUE, NULL, NULL);
+               if (NULL == v_in_cluster || NULL == v_out_cluster) {
+                       Z_LOGE("Failed to create variant!");
+                       if (v_in_cluster)
+                               g_variant_unref(v_in_cluster);
+                       if (v_out_cluster)
+                               g_variant_unref(v_out_cluster);
+               } else {
+                       Z_LOGD("Simple descriptor rsp");
+                       zigbee_zdo_dev_control_emit_simple_desc_rsp(dev_control_object,
+                               desc_t->node_id, desc_t->length, desc_t->device_version,
+                               desc_t->endpoint, desc_t->profile_id, desc_t->device_id,
+                               desc_t->in_cluster_count, desc_t->out_cluster_count,
+                               v_in_cluster, v_out_cluster);
+               }
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_MATCHED_DESC_RSP: {
+               ZigbeeZdoDevControlMatchedDescriptorResp_t *desc_t =
+                       (ZigbeeZdoDevControlMatchedDescriptorResp_t *)noti_data;
+
+               GVariant *v_match_list = g_variant_new_from_data(G_VARIANT_TYPE("a(y)"),
+                       desc_t->match_list, desc_t->list_count, TRUE, NULL, NULL);
+               if (NULL == v_match_list) {
+                       Z_LOGE("Failed to create variant!");
+               } else {
+                       Z_LOGD("matched descriptor rsp : [0x%X]", desc_t->status);
+                       zigbee_zdo_dev_control_emit_matched_descriptor_rsp(dev_control_object,
+                               desc_t->status, desc_t->node_id, desc_t->list_count, v_match_list);
+               }
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_BIND_RSP: {
+               ZigbeeZdoDevControlMgmtBindResp_t *desc_t =
+                       (ZigbeeZdoDevControlMgmtBindResp_t *)noti_data;
+               int i = 0;
+               int v = 0;
+
+               GVariant *v_entries = NULL;
+               GVariantBuilder *entry_builder =
+                               g_variant_builder_new (G_VARIANT_TYPE ("a(ayyqyqayy)"));
+               if (NULL == entry_builder) {
+                       Z_LOGE("Failed to create variant builder!");
+                       break;
+               }
+
+               for(i = 0; i < desc_t->table_list_count ; i++) {
+                       GVariantBuilder *eui64_builder =
+                                       g_variant_builder_new (G_VARIANT_TYPE ("ay"));
+                       GVariantBuilder *dest_eui64_builder =
+                                       g_variant_builder_new (G_VARIANT_TYPE ("ay"));
+
+                       if (NULL == eui64_builder || NULL == dest_eui64_builder) {
+                               Z_LOGE("Failed to create variant builder!");
+                               if (eui64_builder)
+                                       g_variant_builder_unref(eui64_builder);
+                               if (dest_eui64_builder)
+                                       g_variant_builder_unref(dest_eui64_builder);
+                               g_variant_builder_unref(entry_builder);
+                               break;
+                       }
+
+                       for (v = 0; v < ZIGBEE_EUI64_SIZE; v++) {
+                               g_variant_builder_add (eui64_builder, "y",
+                                       desc_t->table_list[i].eui64[v]);
+                               g_variant_builder_add (dest_eui64_builder, "y",
+                                       desc_t->table_list[i].dest_eui64[v]);
+                       }
+
+                       g_variant_builder_add (entry_builder, "(ayyqyqayy)",
+                               eui64_builder,
+                               desc_t->table_list[i].source_endpoint,
+                               desc_t->table_list[i].cluster_id,
+                               desc_t->table_list[i].dest_addr_mode,
+                               desc_t->table_list[i].dest_addr,
+                               dest_eui64_builder,
+                               desc_t->table_list[i].dest_endpoint);
+
+                       g_variant_builder_unref(eui64_builder);
+                       g_variant_builder_unref(dest_eui64_builder);
+               }
+               v_entries = g_variant_builder_end(entry_builder);
+
+               Z_LOGD("management bind rsp : [0x%X]", desc_t->status);
+               zigbee_zdo_dev_control_emit_mgmt_bind_rsp(dev_control_object,
+                       desc_t->status, desc_t->table_entries,
+                       desc_t->start_index, desc_t->table_list_count,
+                       v_entries);
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_LQI_RSP: {
+               ZigbeeZdoDevControlMgmtLqiResp_t *desc_t =
+                       (ZigbeeZdoDevControlMgmtLqiResp_t *)noti_data;
+               int i = 0;
+               int v = 0;
+
+               GVariant *v_entries = NULL;
+               GVariantBuilder *entry_builder =
+                               g_variant_builder_new (G_VARIANT_TYPE ("a(ayayyqyyyyy)"));
+               if (NULL == entry_builder) {
+                       Z_LOGE("Failed to create variant builder!");
+                       break;
+               }
+
+               for(i = 0; i < desc_t->table_list_count ; i++) {
+                       GVariantBuilder *ext_pan_builder =
+                                       g_variant_builder_new (G_VARIANT_TYPE ("ay"));
+                       GVariantBuilder *eui64_builder =
+                                       g_variant_builder_new (G_VARIANT_TYPE ("ay"));
+
+                       if (NULL == ext_pan_builder || NULL == eui64_builder) {
+                               Z_LOGE("Failed to create variant builder!");
+                               if (ext_pan_builder)
+                                       g_variant_builder_unref(ext_pan_builder);
+                               if (eui64_builder)
+                                       g_variant_builder_unref(eui64_builder);
+                               g_variant_builder_unref(entry_builder);
+                               break;
+                       }
+
+                       for (v = 0; v < ZIGBEE_EUI64_SIZE; v++) {
+                               g_variant_builder_add (ext_pan_builder, "y",
+                                       desc_t->table_list[i].extended_pan_id[v]);
+                               g_variant_builder_add (eui64_builder, "y",
+                                       desc_t->table_list[i].eui64[v]);
+                       }
+
+                       g_variant_builder_add (entry_builder, "(ayayyqyyyyy)",
+                               ext_pan_builder,
+                               eui64_builder,
+                               desc_t->table_list[i].node_id,
+                               desc_t->table_list[i].device_type,
+                               desc_t->table_list[i].rx_on_when_idle,
+                               desc_t->table_list[i].relationship,
+                               desc_t->table_list[i].permit_joining,
+                               desc_t->table_list[i].depth,
+                               desc_t->table_list[i].lqi);
+
+                       g_variant_builder_unref(ext_pan_builder);
+                       g_variant_builder_unref(eui64_builder);
+               }
+               v_entries = g_variant_builder_end(entry_builder);
+
+               Z_LOGD("management LQI rsp : [0x%X]", desc_t->status);
+               zigbee_zdo_dev_control_emit_mgmt_lqi_rsp(dev_control_object,
+                       desc_t->status, desc_t->table_entries,
+                       desc_t->start_index, desc_t->table_list_count,
+                       v_entries);
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_RTG_RSP: {
+               ZigbeeZdoDevControlMgmtRtgResp_t *desc_t =
+                       (ZigbeeZdoDevControlMgmtRtgResp_t *)noti_data;
+               int i = 0;
+
+               GVariant *v_entries = NULL;
+               GVariantBuilder *entry_builder =
+                               g_variant_builder_new (G_VARIANT_TYPE ("a(qyyyyq)"));
+               if (NULL == entry_builder) {
+                       Z_LOGE("Failed to create variant builder!");
+                       break;
+               }
+
+               for(i = 0; i < desc_t->table_list_count ; i++) {
+                       g_variant_builder_add (entry_builder, "(qyyyyq)",
+                               desc_t->table_list[i].dest_addr,
+                               desc_t->table_list[i].status,
+                               desc_t->table_list[i].memory_constrained,
+                               desc_t->table_list[i].many_to_one,
+                               desc_t->table_list[i].route_record_required,
+                               desc_t->table_list[i].next_hop_addr);
+               }
+               v_entries = g_variant_builder_end(entry_builder);
+
+               Z_LOGD("management routing rsp : [0x%X]", desc_t->status);
+               zigbee_zdo_dev_control_emit_mgmt_rtg_rsp(dev_control_object,
+                       desc_t->status, desc_t->table_entries,
+                       desc_t->start_index, desc_t->table_list_count,
+                       v_entries);
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_PERMIT_JOIN_RSP: {
+               ZigbeeZdoDevControlMgmtPermitJoinResp_t *resp_t =
+                       (ZigbeeZdoDevControlMgmtPermitJoinResp_t *)noti_data;
+
+               zigbee_zdo_dev_control_emit_mgmt_permit_join_rsp(dev_control_object,
+                       resp_t->status);
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_LEFT_RSP: {
+               ZigbeeZdoDevControlMgmtLeftResp_t *resp_t =
+                       (ZigbeeZdoDevControlMgmtLeftResp_t *)noti_data;
+
+               zigbee_zdo_dev_control_emit_mgmt_left_rsp(dev_control_object,
+                       resp_t->status);
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_NWK_DISC_RSP: {
+               ZigbeeZdoDevControlNwkDiscoveryResp_t *nwk_disc_t =
+                       (ZigbeeZdoDevControlNwkDiscoveryResp_t *)noti_data;
+               int i = 0;
+               int v = 0;
+
+               GVariant *v_entries = NULL;
+               GVariantBuilder *entry_builder =
+                               g_variant_builder_new (G_VARIANT_TYPE ("a(ayyyyyyy)"));
+               if (NULL == entry_builder) {
+                       Z_LOGE("Failed to create variant builder!");
+                       break;
+               }
+
+               for(i = 0; i < nwk_disc_t->table_list_count ; i++) {
+                       GVariantBuilder *ext_pan_builder =
+                                       g_variant_builder_new (G_VARIANT_TYPE ("ay"));
+                       if (NULL == ext_pan_builder) {
+                               Z_LOGE("Failed to create variant builder!");
+                               g_variant_builder_unref(entry_builder);
+                               break;
+                       }
+
+                       for (v = 0; v < ZIGBEE_EUI64_SIZE; v++) {
+                               g_variant_builder_add (ext_pan_builder, "y",
+                                       nwk_disc_t->table_list[i].extended_pan_id[v]);
+                       }
+
+                       g_variant_builder_add (entry_builder, "(ayyyyyyy)",
+                               ext_pan_builder,
+                               nwk_disc_t->table_list[i].logical_channel,
+                               nwk_disc_t->table_list[i].stack_profile,
+                               nwk_disc_t->table_list[i].zigbee_version,
+                               nwk_disc_t->table_list[i].beacon_order,
+                               nwk_disc_t->table_list[i].superframe_order,
+                               nwk_disc_t->table_list[i].permit_joining);
+
+                       g_variant_builder_unref(ext_pan_builder);
+               }
+               v_entries = g_variant_builder_end(entry_builder);
+
+               Z_LOGD("Network discovery rsp : [0x%X]", nwk_disc_t->status);
+               zigbee_zdo_dev_control_emit_nwk_disc_rsp(dev_control_object,
+                       nwk_disc_t->status, nwk_disc_t->network_count,
+                       nwk_disc_t->start_index, nwk_disc_t->table_list_count,
+                       v_entries);
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_NODE_DESC_RSP: {
+               ZigbeeZdoDevControlNodeDescriptorResp_t *desc_t =
+                       (ZigbeeZdoDevControlNodeDescriptorResp_t *)noti_data;
+
+               zigbee_zdo_dev_control_emit_node_desc_rsp(dev_control_object,
+                       desc_t->status, desc_t->node_id, desc_t->logical_type,
+                       desc_t->complex_desciptor_available,
+                       desc_t->user_descriptor_available,
+                       desc_t->aps_flags, desc_t->frequency_band,
+                       desc_t->mac_capability_flags, desc_t->manufacturer_code,
+                       desc_t->max_buffer_size, desc_t->max_incoming_transfer_size,
+                       desc_t->server_mask, desc_t->max_outgoing_transfer_size,
+                       desc_t->descriptor_capability_field);
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_POWER_DESC_RSP: {
+               ZigbeeZdoDevControlPowerDescriptorResp_t *desc_t =
+                       (ZigbeeZdoDevControlPowerDescriptorResp_t *)noti_data;
+
+               zigbee_zdo_dev_control_emit_power_desc_rsp(dev_control_object,
+                       desc_t->status, desc_t->node_id,
+                       desc_t->current_power_mode,
+                       desc_t->available_power_sources,
+                       desc_t->current_power_source,
+                       desc_t->current_power_source_level);
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_COMPLEX_DESC_RSP: {
+               ZigbeeZdoDevControlComplexDescriptorResp_t *desc_t =
+                       (ZigbeeZdoDevControlComplexDescriptorResp_t *)noti_data;
+
+               GVariant *v_desc_list = g_variant_new_from_data(G_VARIANT_TYPE("a(y)"),
+                       desc_t->complex_descriptor_list, desc_t->list_count,
+                       TRUE, NULL, NULL);
+               if (NULL == v_desc_list) {
+                       Z_LOGE("Failed to create variant!");
+               } else {
+                       Z_LOGD("Complex descriptor rsp : [0x%X]", desc_t->status);
+                       zigbee_zdo_dev_control_emit_complex_desc_rsp(dev_control_object,
+                               desc_t->status, desc_t->node_id, desc_t->list_count, v_desc_list);
+               }
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_USER_DESC_RSP: {
+               ZigbeeZdoDevControlUserDescriptorResp_t *desc_t =
+                       (ZigbeeZdoDevControlUserDescriptorResp_t *)noti_data;
+
+               GVariant *v_desc_list = g_variant_new_from_data(G_VARIANT_TYPE("a(y)"),
+                       desc_t->user_descriptor_list, desc_t->list_count,
+                       TRUE, NULL, NULL);
+               if (NULL == v_desc_list) {
+                       Z_LOGE("Failed to create variant!");
+               } else {
+                       Z_LOGD("User descriptor rsp : [0x%X]", desc_t->status);
+                       zigbee_zdo_dev_control_emit_user_desc_rsp(dev_control_object,
+                               desc_t->status, desc_t->node_id, desc_t->list_count, v_desc_list);
+               }
+       break;
+       }
+       case ZBLIB_ZDO_DEV_CONTROL_NOTI_USER_DESC_CONFIRM: {
+               ZigbeeZdoDevControlUserDescriptorConfirm_t *resp_t =
+                       (ZigbeeZdoDevControlUserDescriptorConfirm_t *)noti_data;
+
+               zigbee_zdo_dev_control_emit_user_desc_confirm(dev_control_object,
+                       resp_t->status);
+       break;
+       }
+       default:
+               Z_LOGE("Unexpected notification [%x]", noti_id);
+       break;
+       }
+
+       /* ZigbeeZdo_dev_control should be dereferenced */
+       g_object_unref(dev_control_object);
 }
 
 gboolean zigbee_service_dbus_interface_zdo_dev_control_init(ZigBeeServiceInterface *service_interface,
index 90e897d..c26eaff 100644 (file)
@@ -61,6 +61,26 @@ typedef enum {
        ZBLIB_ZDO_DEV_CONTROL_OPS_NWK_DISC_REQ, /**< Nwk disc req */
 } ZblibZdoDevControlOps_e;
 
+/**< ZigBee 'ZDO Dev control' notification IDs */
+typedef enum {
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_NWK_ADDR_RSP = 1, /**< Network address response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_NWK_ADDR_EXT_RSP, /**< Network address extended response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_ACTIVE_EP_RSP, /**< Active endpoint response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_SIMPLE_DESC_RSP, /**< Simple descriptor response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_MATCHED_DESC_RSP, /**< Matched descriptor response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_BIND_RSP, /**< Management bind response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_LQI_RSP, /**< Management LQI response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_RTG_RSP, /**< Management rtg response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_PERMIT_JOIN_RSP, /**< Management permit joining response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_MGMT_LEFT_RSP, /**< Management left response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_NWK_DISC_RSP, /**< Network discovery response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_NODE_DESC_RSP, /**< Node descriptor response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_POWER_DESC_RSP, /**< Power descriptor response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_COMPLEX_DESC_RSP, /**< Complex descriptor response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_USER_DESC_RSP, /**< User descriptor response */
+       ZBLIB_ZDO_DEV_CONTROL_NOTI_USER_DESC_CONFIRM, /**< User descriptor confirm */
+} ZblibZdoDevControlNoti_e;
+
 /* ZigBee 'ZDO Dev control' driver APIs */
 ZigBeeDriver *zblib_driver_zdo_dev_control_new(ZigBeePlugin *plugin,
        const gchar *driver_name,
index d74eab6..a38eba3 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <zblib.h>
 #include <zblib_driver.h>
+#include <zblib_plugin.h>
 #include <zblib_request.h>
 
 #include "zblib_driver_zdo_dev_control.h"
@@ -217,6 +218,7 @@ ZigBeeDriver *zblib_driver_zdo_dev_control_new(ZigBeePlugin *plugin,
        const gchar *driver_name,
        ZblibDriverZdoDevControlOps_t *ops)
 {
+       ZigBeeService *service = NULL;
        ZigBeeDriver *driver = NULL;
        ZblibDriverZdoDevControlPrivData_t *priv_data = NULL;
        gboolean ret;
@@ -233,6 +235,19 @@ ZigBeeDriver *zblib_driver_zdo_dev_control_new(ZigBeePlugin *plugin,
        /* Update private data */
        priv_data->ops = ops;
 
+       /* Link service to driver */
+       service = zblib_plugin_ref_service(plugin);
+       if (NULL == service) {
+               Z_LOGE("zblib_plugin_ref_service failed!");
+
+               /* Free allocated resources */
+               g_free(priv_data);
+               g_free(driver);
+
+               return NULL;
+       }
+       zblib_driver_link_service(driver, service);
+
        /* Link private data to driver */
        ret = zblib_driver_link_object(driver, priv_data);
        if (FALSE == ret) {
index a32c2e3..21b78a3 100644 (file)
@@ -2572,9 +2572,17 @@ static gpointer __zblib_request_create_zdo_dev_control_request_data(guint reques
                        req->node_id = in_req->node_id;
                        req->profile_id = in_req->profile_id;
                        req->num_in_cl = in_req->num_in_cl;
-                       req->in_cl = g_strdup(in_req->in_cl);
+                       if (in_req->num_in_cl > 0) {
+                               req->in_cl = g_malloc0_n(in_req->num_in_cl, sizeof(unsigned short));
+                               memcpy(req->in_cl, in_req->in_cl,
+                                       in_req->num_in_cl * sizeof(unsigned short));
+                       }
                        req->num_out_cl = in_req->num_out_cl;
-                       req->out_cl = g_strdup(in_req->out_cl);
+                       if (in_req->num_out_cl > 0) {
+                               req->out_cl = g_malloc0_n(in_req->num_out_cl, sizeof(unsigned short));
+                               memcpy(req->out_cl, in_req->out_cl,
+                                       in_req->num_out_cl * sizeof(unsigned short));
+                       }
                }
 
                zdodev_control_request_data = (gpointer)req;
@@ -2817,7 +2825,7 @@ static gpointer __zblib_request_create_zdo_dev_control_request_data(guint reques
                                g_malloc0(sizeof(ZigbeeZdoDevControlMgmtPermitJoinReq_t));
 
                        /* Copy data */
-                       req->addr = in_req->addr;
+                       req->node_id = in_req->node_id;
                        req->duration = in_req->duration;
                        req->tc_significance = in_req->tc_significance;
                }
@@ -2849,14 +2857,14 @@ static gpointer __zblib_request_create_zdo_dev_control_request_data(guint reques
        break;
 
        case ZBLIB_ZDO_DEV_CONTROL_OPS_NWK_DISC_REQ: {
-               ZigbeeZdoDevControlNwkDescriptorReq_t *in_req;
-               ZigbeeZdoDevControlNwkDescriptorReq_t *req = NULL;
+               ZigbeeZdoDevControlNwkDiscoveryReq_t *in_req;
+               ZigbeeZdoDevControlNwkDiscoveryReq_t *req = NULL;
 
-               in_req = (ZigbeeZdoDevControlNwkDescriptorReq_t *)request_data;
+               in_req = (ZigbeeZdoDevControlNwkDiscoveryReq_t *)request_data;
                if (NULL != in_req) {
                        /* Allocate memory */
-                       req = (ZigbeeZdoDevControlNwkDescriptorReq_t *)
-                               g_malloc0(sizeof(ZigbeeZdoDevControlNwkDescriptorReq_t));
+                       req = (ZigbeeZdoDevControlNwkDiscoveryReq_t *)
+                               g_malloc0(sizeof(ZigbeeZdoDevControlNwkDiscoveryReq_t));
 
                        /* Copy data */
                        req->node_id = in_req->node_id;
@@ -4499,9 +4507,9 @@ static void __zblib_request_free_zdo_dev_control_request_data(ZigBeeRequest *req
        break;
 
        case ZBLIB_ZDO_DEV_CONTROL_OPS_NWK_DISC_REQ: {
-               ZigbeeZdoDevControlNwkDescriptorReq_t *req = NULL;
+               ZigbeeZdoDevControlNwkDiscoveryReq_t *req = NULL;
 
-               req = (ZigbeeZdoDevControlNwkDescriptorReq_t *)request->request_data;
+               req = (ZigbeeZdoDevControlNwkDiscoveryReq_t *)request->request_data;
                if (NULL != req) {
                        g_free(req);
                }