Corrected ReadProperty reply when data is too big to fit into APDU. It is required to be an Abort messaage, not an Error message.
This commit is contained in:
@@ -314,9 +314,20 @@ void handler_read_property(uint8_t * service_request,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (error) {
|
if (error) {
|
||||||
len = bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
switch (len) {
|
||||||
service_data->invoke_id,
|
/* BACnet APDU too small to fit data, so proper response is Abort */
|
||||||
SERVICE_CONFIRMED_READ_PROPERTY, error_class, error_code);
|
case -2:
|
||||||
|
len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||||
|
service_data->invoke_id,
|
||||||
|
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED);
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
default:
|
||||||
|
len = bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len],
|
||||||
|
service_data->invoke_id,
|
||||||
|
SERVICE_CONFIRMED_READ_PROPERTY, error_class, error_code);
|
||||||
|
break;
|
||||||
|
}
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
fprintf(stderr, "Sending Read Property Error!\n");
|
fprintf(stderr, "Sending Read Property Error!\n");
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -548,7 +548,8 @@ char *Device_Valid_Object_Id(int object_type, uint32_t object_instance)
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return the length of the apdu encoded or -1 for error */
|
/* return the length of the apdu encoded or -1 for error or
|
||||||
|
-2 for abort message */
|
||||||
int Device_Encode_Property_APDU(uint8_t * apdu,
|
int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||||
BACNET_PROPERTY_ID property,
|
BACNET_PROPERTY_ID property,
|
||||||
int32_t array_index,
|
int32_t array_index,
|
||||||
@@ -704,9 +705,8 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
/* assume next one is the same size as this one */
|
/* assume next one is the same size as this one */
|
||||||
/* can we all fit into the APDU? */
|
/* can we all fit into the APDU? */
|
||||||
if ((apdu_len + len) >= MAX_APDU) {
|
if ((apdu_len + len) >= MAX_APDU) {
|
||||||
*error_class = ERROR_CLASS_SERVICES;
|
/* reject message */
|
||||||
*error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
|
apdu_len = -2;
|
||||||
apdu_len = -1;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -157,7 +157,8 @@ bool Device_Object_List_Identifier(unsigned array_index,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return the length of the apdu encoded or -1 for error */
|
/* return the length of the apdu encoded or -1 for error or
|
||||||
|
-2 for abort */
|
||||||
int Device_Encode_Property_APDU(uint8_t * apdu,
|
int Device_Encode_Property_APDU(uint8_t * apdu,
|
||||||
BACNET_PROPERTY_ID property,
|
BACNET_PROPERTY_ID property,
|
||||||
int32_t array_index,
|
int32_t array_index,
|
||||||
@@ -265,9 +266,7 @@ int Device_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
/* assume next one is the same size as this one */
|
/* assume next one is the same size as this one */
|
||||||
/* can we all fit into the APDU? */
|
/* can we all fit into the APDU? */
|
||||||
if ((apdu_len + len) >= MAX_APDU) {
|
if ((apdu_len + len) >= MAX_APDU) {
|
||||||
*error_class = ERROR_CLASS_SERVICES;
|
apdu_len = -2;
|
||||||
*error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
|
|
||||||
apdu_len = -1;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user