From: Jiwan Kim Date: Mon, 6 Feb 2017 06:02:44 +0000 (+0900) Subject: Implement ZDO Dev control X-Git-Tag: submit/tizen/20170512.045637~26 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fconnectivity%2Fzigbee-manager.git;a=commitdiff_plain;h=8af81cf683923ef1da22ff07ab9116d141218175 Implement ZDO Dev control Change-Id: I1c64363769dad82b6a481fd97a877c3bd78a5f07 Signed-off-by: Jiwan Kim --- diff --git a/common/include/zigbee_types.h b/common/include/zigbee_types.h index 7e7333d..8ad04a1 100644 --- a/common/include/zigbee_types.h +++ b/common/include/zigbee_types.h @@ -26,18 +26,24 @@ #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 */ diff --git a/common/include/zigbee_zdo_dev_control_type.h b/common/include/zigbee_zdo_dev_control_type.h index b923e23..5fee273 100644 --- a/common/include/zigbee_zdo_dev_control_type.h +++ b/common/include/zigbee_zdo_dev_control_type.h @@ -21,14 +21,18 @@ #include +/* ----------------------------------------------------------------------------- + * 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__ */ diff --git a/zigbee-daemon/zigbee-interface/introspection/zdo-dev-control.xml b/zigbee-daemon/zigbee-interface/introspection/zdo-dev-control.xml index 0eb9959..00c0dd6 100644 --- a/zigbee-daemon/zigbee-interface/introspection/zdo-dev-control.xml +++ b/zigbee-daemon/zigbee-interface/introspection/zdo-dev-control.xml @@ -1,7 +1,7 @@ - + @@ -42,12 +42,12 @@ - + - + @@ -72,7 +72,7 @@ - + @@ -96,23 +96,23 @@ - + - + - - + + @@ -124,39 +124,40 @@ + - + - + - + - + - + - + - + @@ -194,13 +195,13 @@ - + - + diff --git a/zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zdo_dev_control.c b/zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zdo_dev_control.c index b252ec8..280cd70 100644 --- a/zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zdo_dev_control.c +++ b/zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface_zdo_dev_control.c @@ -20,17 +20,59 @@ #include +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, diff --git a/zigbee-daemon/zigbee-lib/include/zblib_driver_zdo_dev_control.h b/zigbee-daemon/zigbee-lib/include/zblib_driver_zdo_dev_control.h index 90e897d..c26eaff 100644 --- a/zigbee-daemon/zigbee-lib/include/zblib_driver_zdo_dev_control.h +++ b/zigbee-daemon/zigbee-lib/include/zblib_driver_zdo_dev_control.h @@ -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, diff --git a/zigbee-daemon/zigbee-lib/src/drivers/zblib_driver_zdo_dev_control.c b/zigbee-daemon/zigbee-lib/src/drivers/zblib_driver_zdo_dev_control.c index d74eab6..a38eba3 100644 --- a/zigbee-daemon/zigbee-lib/src/drivers/zblib_driver_zdo_dev_control.c +++ b/zigbee-daemon/zigbee-lib/src/drivers/zblib_driver_zdo_dev_control.c @@ -18,6 +18,7 @@ #include #include +#include #include #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) { diff --git a/zigbee-daemon/zigbee-lib/src/zblib_request.c b/zigbee-daemon/zigbee-lib/src/zblib_request.c index a32c2e3..21b78a3 100644 --- a/zigbee-daemon/zigbee-lib/src/zblib_request.c +++ b/zigbee-daemon/zigbee-lib/src/zblib_request.c @@ -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); }