diff --git a/bacnet-stack/demo/handler/h_rp.c b/bacnet-stack/demo/handler/h_rp.c index bd578731..3a24d0ef 100644 --- a/bacnet-stack/demo/handler/h_rp.c +++ b/bacnet-stack/demo/handler/h_rp.c @@ -75,7 +75,7 @@ void handler_read_property( int apdu_len = -1; int npdu_len = -1; BACNET_NPDU_DATA npdu_data; - bool error = false; + bool error = true; /* assume that there is an error */ int bytes_sent = 0; BACNET_ADDRESS my_address; @@ -85,16 +85,13 @@ void handler_read_property( npdu_len = npdu_encode_pdu(&Handler_Transmit_Buffer[0], src, &my_address, &npdu_data); - if (service_data->segmented_message) { - /* we don't support segmentation - send an abort */ - apdu_len = - abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len], - service_data->invoke_id, ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, - true); + if (service_data->segmented_message) { /* we don't support segmentation - send an abort */ + rpdata.error_code = ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED; + len = BACNET_STATUS_ABORT; #if PRINT_ENABLED fprintf(stderr, "RP: Segmented message. Sending Abort!\n"); #endif - goto RP_ABORT; + goto RP_FAILURE; } len = rp_decode_service_request(service_request, service_len, &rpdata); #if PRINT_ENABLED @@ -103,16 +100,13 @@ void handler_read_property( } #endif if (len < 0) { - /* bad decoding - send an abort */ - apdu_len = reject_encode_apdu(&Handler_Transmit_Buffer[npdu_len], - service_data->invoke_id, rpdata.error_code); + /* bad decoding - skip to error/reject/abort handling */ + error = true; #if PRINT_ENABLED - fprintf(stderr, "RP: Bad Encoding. Sending Abort!\n"); + fprintf(stderr, "RP: Bad Encoding.\n"); #endif - goto RP_ABORT; + goto RP_FAILURE; } - /* assume that there is an error */ - error = true; apdu_len = rp_ack_encode_apdu_init(&Handler_Transmit_Buffer[npdu_len], service_data->invoke_id, &rpdata); @@ -129,14 +123,11 @@ void handler_read_property( apdu_len += len; if (apdu_len > service_data->max_resp) { /* too big for the sender - send an abort */ - apdu_len = - abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len], - service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); + rpdata.error_code = ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED; + len = BACNET_STATUS_ABORT; #if PRINT_ENABLED - fprintf(stderr, "RP: Message too large. Sending Abort!\n"); + fprintf(stderr, "RP: Message too large.\n"); #endif - goto RP_ABORT; } else { #if PRINT_ENABLED fprintf(stderr, "RP: Sending Ack!\n"); @@ -144,27 +135,41 @@ void handler_read_property( error = false; } } + + RP_FAILURE: if (error) { - if (len == -2) { - /* BACnet APDU too small to fit data, so proper response is Abort */ + if (len == BACNET_STATUS_ABORT) { + /* Kludge alert! At the moment we assume any abort is due to + * to space issues due to segmentation or lack thereof. I wanted to show the proper + * handling via the abort_convert_error_code() so I put the error code + * in here, if you are sure all aborts properly set up the error_code then + * remove this next line + */ + rpdata.error_code = ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED; apdu_len = abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); + abort_convert_error_code(rpdata.error_code), true); #if PRINT_ENABLED - fprintf(stderr, "RP: Reply too big to fit into APDU!\n"); + fprintf(stderr, "RP: Sending Abort!\n"); #endif - } else { + } else if (len == BACNET_STATUS_ERROR){ apdu_len = bacerror_encode_apdu(&Handler_Transmit_Buffer[npdu_len], service_data->invoke_id, SERVICE_CONFIRMED_READ_PROPERTY, rpdata.error_class, rpdata.error_code); #if PRINT_ENABLED fprintf(stderr, "RP: Sending Error!\n"); +#endif + } else if (len == BACNET_STATUS_REJECT){ + apdu_len = reject_encode_apdu(&Handler_Transmit_Buffer[npdu_len], + service_data->invoke_id, reject_convert_error_code(rpdata.error_code)); +#if PRINT_ENABLED + fprintf(stderr, "RP: Sending Reject!\n"); #endif } } - RP_ABORT: + pdu_len = npdu_len + apdu_len; bytes_sent = datalink_send_pdu(src, &npdu_data, &Handler_Transmit_Buffer[0], diff --git a/bacnet-stack/demo/object/ai.c b/bacnet-stack/demo/object/ai.c index 5026a624..9af9d308 100644 --- a/bacnet-stack/demo/object/ai.c +++ b/bacnet-stack/demo/object/ai.c @@ -167,7 +167,7 @@ char *Analog_Input_Name( return NULL; } -/* return apdu length, or -1 on error */ +/* return apdu length, or BACNET_STATUS_ERROR on error */ /* assumption - object has already exists */ int Analog_Input_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) @@ -237,14 +237,14 @@ int Analog_Input_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/ao.c b/bacnet-stack/demo/object/ao.c index 9dbb99ab..d2ab39a9 100644 --- a/bacnet-stack/demo/object/ao.c +++ b/bacnet-stack/demo/object/ao.c @@ -267,7 +267,7 @@ char *Analog_Output_Name( return NULL; } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Analog_Output_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -354,7 +354,7 @@ int Analog_Output_Read_Property( else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -375,7 +375,7 @@ int Analog_Output_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } break; @@ -386,7 +386,7 @@ int Analog_Output_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -394,7 +394,7 @@ int Analog_Output_Read_Property( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/av.c b/bacnet-stack/demo/object/av.c index f96465b8..3df2f940 100644 --- a/bacnet-stack/demo/object/av.c +++ b/bacnet-stack/demo/object/av.c @@ -215,7 +215,7 @@ char *Analog_Value_Name( return NULL; } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Analog_Value_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -303,7 +303,7 @@ int Analog_Value_Read_Property( else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -324,7 +324,7 @@ int Analog_Value_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } break; @@ -335,7 +335,7 @@ int Analog_Value_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -343,7 +343,7 @@ int Analog_Value_Read_Property( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/bi.c b/bacnet-stack/demo/object/bi.c index 7a4ff875..87cf2c22 100644 --- a/bacnet-stack/demo/object/bi.c +++ b/bacnet-stack/demo/object/bi.c @@ -322,7 +322,7 @@ bool Binary_Input_Polarity_Set( return status; } -/* return apdu length, or -1 on error */ +/* return apdu length, or BACNET_STATUS_ERROR on error */ /* assumption - object already exists, and has been bounds checked */ int Binary_Input_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) @@ -394,14 +394,14 @@ int Binary_Input_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/bo.c b/bacnet-stack/demo/object/bo.c index 1692dc1f..a20ad5df 100644 --- a/bacnet-stack/demo/object/bo.c +++ b/bacnet-stack/demo/object/bo.c @@ -191,7 +191,7 @@ char *Binary_Output_Name( return NULL; } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Binary_Output_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -284,7 +284,7 @@ int Binary_Output_Read_Property( else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -306,7 +306,7 @@ int Binary_Output_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } @@ -328,7 +328,7 @@ int Binary_Output_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -336,7 +336,7 @@ int Binary_Output_Read_Property( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/bv.c b/bacnet-stack/demo/object/bv.c index f54207a8..b9c643f5 100644 --- a/bacnet-stack/demo/object/bv.c +++ b/bacnet-stack/demo/object/bv.c @@ -188,7 +188,7 @@ char *Binary_Value_Name( return NULL; } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Binary_Value_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -277,7 +277,7 @@ int Binary_Value_Read_Property( else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -299,7 +299,7 @@ int Binary_Value_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } @@ -311,7 +311,7 @@ int Binary_Value_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -319,7 +319,7 @@ int Binary_Value_Read_Property( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/device.c b/bacnet-stack/demo/object/device.c index b08bdf37..28b64b08 100644 --- a/bacnet-stack/demo/object/device.c +++ b/bacnet-stack/demo/object/device.c @@ -949,8 +949,8 @@ int tm_isdst Daylight Savings flag. } } -/* return the length of the apdu encoded or -1 for error or - -2 for abort message */ +/* return the length of the apdu encoded or BACNET_STATUS_ERROR for error or + BACNET_STATUS_ABORT for abort message */ static int Device_Read_Property_Local( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -1105,15 +1105,16 @@ static int Device_Read_Property_Local( /* assume next one is the same size as this one */ /* can we all fit into the APDU? */ if ((apdu_len + len) >= MAX_APDU) { - /* reject message */ - apdu_len = -2; + /* Abort response */ + rpdata->error_code = ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED; + apdu_len = BACNET_STATUS_ABORT; break; } } else { /* error: internal error? */ rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_OTHER; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -1128,7 +1129,7 @@ static int Device_Read_Property_Local( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } break; @@ -1172,7 +1173,7 @@ static int Device_Read_Property_Local( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -1180,7 +1181,7 @@ static int Device_Read_Property_Local( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; @@ -1192,12 +1193,12 @@ static int Device_Read_Property_Local( * * @param rpdata [in,out] Structure with the desired Object and Property info * on entry, and APDU message on return. - * @return The length of the APDU on success, else -1 + * @return The length of the APDU on success, else BACNET_STATUS_ERROR */ int Device_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { - int apdu_len = -1; + int apdu_len = BACNET_STATUS_ERROR; struct object_functions *pObject = NULL; /* initialize the default return values */ diff --git a/bacnet-stack/demo/object/lc.c b/bacnet-stack/demo/object/lc.c index bbbfecf5..9e3d5691 100644 --- a/bacnet-stack/demo/object/lc.c +++ b/bacnet-stack/demo/object/lc.c @@ -678,7 +678,7 @@ void Load_Control_State_Machine_Handler( } } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Load_Control_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -849,7 +849,7 @@ int Load_Control_Read_Property( else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -861,7 +861,7 @@ int Load_Control_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } break; @@ -887,7 +887,7 @@ int Load_Control_Read_Property( else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -901,14 +901,14 @@ int Load_Control_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } break; default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -918,7 +918,7 @@ int Load_Control_Read_Property( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/lo.c b/bacnet-stack/demo/object/lo.c index 7fa94995..d92eecc7 100644 --- a/bacnet-stack/demo/object/lo.c +++ b/bacnet-stack/demo/object/lo.c @@ -359,7 +359,7 @@ char *Lighting_Output_Name( return NULL; } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Lighting_Output_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -461,7 +461,7 @@ int Lighting_Output_Read_Property( else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -482,7 +482,7 @@ int Lighting_Output_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } @@ -494,7 +494,7 @@ int Lighting_Output_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -502,7 +502,7 @@ int Lighting_Output_Read_Property( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/lsp.c b/bacnet-stack/demo/object/lsp.c index ecb6120c..931cea6b 100644 --- a/bacnet-stack/demo/object/lsp.c +++ b/bacnet-stack/demo/object/lsp.c @@ -186,7 +186,7 @@ char *Life_Safety_Point_Name( return NULL; } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Life_Safety_Point_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -282,14 +282,14 @@ int Life_Safety_Point_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/ms-input.c b/bacnet-stack/demo/object/ms-input.c index 1ace0668..3e6fa4a2 100644 --- a/bacnet-stack/demo/object/ms-input.c +++ b/bacnet-stack/demo/object/ms-input.c @@ -316,7 +316,7 @@ bool Multistate_Input_State_Text_Set( } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Multistate_Input_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -416,7 +416,7 @@ int Multistate_Input_Read_Property( } else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -434,14 +434,14 @@ int Multistate_Input_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } break; default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -449,7 +449,7 @@ int Multistate_Input_Read_Property( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/mso.c b/bacnet-stack/demo/object/mso.c index a6b7e6b8..9a78f1fa 100644 --- a/bacnet-stack/demo/object/mso.c +++ b/bacnet-stack/demo/object/mso.c @@ -193,7 +193,7 @@ char *Multistate_Output_Name( return NULL; } -/* return apdu len, or -1 on error */ +/* return apdu len, or BACNET_STATUS_ERROR on error */ int Multistate_Output_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -286,7 +286,7 @@ int Multistate_Output_Read_Property( else { rpdata->error_class = ERROR_CLASS_SERVICES; rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } } @@ -309,7 +309,7 @@ int Multistate_Output_Read_Property( } else { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } } @@ -327,7 +327,7 @@ int Multistate_Output_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -335,7 +335,7 @@ int Multistate_Output_Read_Property( (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/demo/object/trendlog.c b/bacnet-stack/demo/object/trendlog.c index 08ca9c9b..4a637e7f 100644 --- a/bacnet-stack/demo/object/trendlog.c +++ b/bacnet-stack/demo/object/trendlog.c @@ -271,8 +271,8 @@ char *Trend_Log_Name( } -/* return the length of the apdu encoded or -1 for error or - -2 for abort message */ +/* return the length of the apdu encoded or BACNET_STATUS_ERROR for error or + BACNET_STATUS_ABORT for abort message */ int Trend_Log_Read_Property( BACNET_READ_PROPERTY_DATA * rpdata) { @@ -328,7 +328,7 @@ int Trend_Log_Read_Property( /* You can only read the buffer via the ReadRange service */ rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_READ_ACCESS_DENIED; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; case PROP_RECORD_COUNT: @@ -429,7 +429,7 @@ int Trend_Log_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; break; } /* only array properties can have array options */ @@ -437,7 +437,7 @@ int Trend_Log_Read_Property( && (rpdata->array_index != BACNET_ARRAY_ALL)) { rpdata->error_class = ERROR_CLASS_PROPERTY; rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = -1; + apdu_len = BACNET_STATUS_ERROR; } return apdu_len; diff --git a/bacnet-stack/include/abort.h b/bacnet-stack/include/abort.h index ed00cd26..82abefd8 100644 --- a/bacnet-stack/include/abort.h +++ b/bacnet-stack/include/abort.h @@ -41,6 +41,9 @@ extern "C" { #endif /* __cplusplus */ + BACNET_ABORT_REASON abort_convert_error_code( + BACNET_ERROR_CODE error_code); + int abort_encode_apdu( uint8_t * apdu, uint8_t invoke_id, diff --git a/bacnet-stack/include/bacdef.h b/bacnet-stack/include/bacdef.h index 8428fe3a..10a423ca 100644 --- a/bacnet-stack/include/bacdef.h +++ b/bacnet-stack/include/bacdef.h @@ -99,4 +99,9 @@ typedef struct BACnet_Object_Id { #define BACNET_ID_VALUE(bacnet_object_instance, bacnet_object_type) ((((bacnet_object_type) & BACNET_MAX_OBJECT) << BACNET_INSTANCE_BITS) | ((bacnet_object_instance) & BACNET_MAX_INSTANCE)) #define BACNET_INSTANCE(bacnet_object_id_num) ((bacnet_object_id_num)&BACNET_MAX_INSTANCE) #define BACNET_TYPE(bacnet_object_id_num) (((bacnet_object_id_num) >> BACNET_INSTANCE_BITS ) & BACNET_MAX_OBJECT) + +#define BACNET_STATUS_ERROR (-1) +#define BACNET_STATUS_ABORT (-2) +#define BACNET_STATUS_REJECT (-3) + #endif diff --git a/bacnet-stack/include/bacenum.h b/bacnet-stack/include/bacenum.h index 80eec992..4cfb8298 100644 --- a/bacnet-stack/include/bacenum.h +++ b/bacnet-stack/include/bacenum.h @@ -1250,7 +1250,7 @@ typedef enum { MAX_BACNET_REJECT_REASON = 10, FIRST_PROPRIETARY_REJECT_REASON = 64, LAST_PROPRIETARY_REJECT_REASON = 65535 -} BACNET_BACNET_REJECT_REASON; +} BACNET_REJECT_REASON; typedef enum { ERROR_CLASS_DEVICE = 0, diff --git a/bacnet-stack/include/reject.h b/bacnet-stack/include/reject.h index 55b2ea03..ee8e4c93 100644 --- a/bacnet-stack/include/reject.h +++ b/bacnet-stack/include/reject.h @@ -41,6 +41,9 @@ extern "C" { #endif /* __cplusplus */ + BACNET_REJECT_REASON reject_convert_error_code( + BACNET_ERROR_CODE error_code); + int reject_encode_apdu( uint8_t * apdu, uint8_t invoke_id, diff --git a/bacnet-stack/src/abort.c b/bacnet-stack/src/abort.c index 6ee554d4..ac1e308e 100644 --- a/bacnet-stack/src/abort.c +++ b/bacnet-stack/src/abort.c @@ -37,6 +37,24 @@ #include "bacdef.h" /** @file abort.c Abort Encoding/Decoding */ +/* Helper function to avoid needing additional entries in service data structures + * when passing back abort status. + * Convert from error code to abort code - assumes value is in range + * ERROR_CODE_RESERVED1 to ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED + * anything outside this range gets converted to ABORT_REASON_OTHER. + * Will need reworking if it is required to return proprietary abort codes. + */ + +BACNET_ABORT_REASON abort_convert_error_code( + BACNET_ERROR_CODE error_code) +{ + BACNET_ABORT_REASON abort_code = ABORT_REASON_OTHER; + + if((error_code > ERROR_CODE_RESERVED1) && (error_code <= ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED)) + abort_code = (BACNET_ABORT_REASON)(error_code - ERROR_CODE_RESERVED1); + + return(abort_code); +} /* encode service */ int abort_encode_apdu( diff --git a/bacnet-stack/src/reject.c b/bacnet-stack/src/reject.c index 8ba217b2..29274205 100644 --- a/bacnet-stack/src/reject.c +++ b/bacnet-stack/src/reject.c @@ -38,6 +38,25 @@ /** @file reject.c Encode/Decode Reject APDUs */ +/* Helper function to avoid needing additional entries in service data structures + * when passing back reject status. + * Convert from error code to reject code - assumes value is in range + * ERROR_CODE_REJECT_BUFFER_OVERFLOW to ERROR_CODE_REJECT_UNRECOGNIZED_SERVICE + * anything outside this range gets converted to REJECT_REASON_OTHER. + * Will need reworking if it is required to return proprietary reject codes. + */ + +BACNET_REJECT_REASON reject_convert_error_code( + BACNET_ERROR_CODE error_code) +{ + BACNET_REJECT_REASON reject_code = REJECT_REASON_OTHER; + + if((error_code > ERROR_CODE_NETWORK_DOWN) && (error_code <= ERROR_CODE_REJECT_UNRECOGNIZED_SERVICE)) + reject_code = (BACNET_REJECT_REASON)(error_code - ERROR_CODE_NETWORK_DOWN); + + return(reject_code); +} + /* encode service */ int reject_encode_apdu( uint8_t * apdu, diff --git a/bacnet-stack/src/rp.c b/bacnet-stack/src/rp.c index 189426bf..511fef48 100644 --- a/bacnet-stack/src/rp.c +++ b/bacnet-stack/src/rp.c @@ -92,14 +92,14 @@ int rp_decode_service_request( /* Must have at least 2 tags, an object id and a property identifier * of at least 1 byte in length to have any chance of parsing */ if(apdu_len < 7) { - rpdata->error_code = REJECT_REASON_MISSING_REQUIRED_PARAMETER; - return -1; + rpdata->error_code = ERROR_CODE_REJECT_MISSING_REQUIRED_PARAMETER; + return BACNET_STATUS_REJECT; } /* Tag 0: Object ID */ if (!decode_is_context_tag(&apdu[len++], 0)) { - rpdata->error_code = REJECT_REASON_INVALID_TAG; - return -1; + rpdata->error_code = ERROR_CODE_REJECT_INVALID_TAG; + return BACNET_STATUS_REJECT; } len += decode_object_id(&apdu[len], &type, &rpdata->object_instance); rpdata->object_type = (BACNET_OBJECT_TYPE) type; @@ -108,8 +108,8 @@ int rp_decode_service_request( decode_tag_number_and_value(&apdu[len], &tag_number, &len_value_type); if (tag_number != 1) { - rpdata->error_code = REJECT_REASON_INVALID_TAG; - return -1; + rpdata->error_code = ERROR_CODE_REJECT_INVALID_TAG; + return BACNET_STATUS_REJECT; } len += decode_enumerated(&apdu[len], len_value_type, &property); rpdata->object_property = (BACNET_PROPERTY_ID) property; @@ -123,8 +123,8 @@ int rp_decode_service_request( decode_unsigned(&apdu[len], len_value_type, &array_value); rpdata->array_index = array_value; } else { - rpdata->error_code = REJECT_REASON_INVALID_TAG; - return -1; + rpdata->error_code = ERROR_CODE_REJECT_INVALID_TAG; + return BACNET_STATUS_REJECT; } } else rpdata->array_index = BACNET_ARRAY_ALL; @@ -132,8 +132,8 @@ int rp_decode_service_request( if(len < apdu_len) { /* If something left over now, we have an invalid request */ - rpdata->error_code = REJECT_REASON_TOO_MANY_ARGUMENTS; - return -1; + rpdata->error_code = ERROR_CODE_REJECT_TOO_MANY_ARGUMENTS; + return BACNET_STATUS_REJECT; } return (int) len;