From f45d694a51f7ea11ab9e18a5d5b9ae1be2a0b82f Mon Sep 17 00:00:00 2001 From: skarg Date: Thu, 5 Oct 2006 22:46:59 +0000 Subject: [PATCH] Corrected the server bit in the abort PDU which was missing for the abort messages. --- bacnet-stack/abort.c | 9 ++++++--- bacnet-stack/abort.h | 2 +- bacnet-stack/apdu.c | 4 +++- bacnet-stack/apdu.h | 2 +- bacnet-stack/demo/dcc/main.c | 3 ++- bacnet-stack/demo/handler/h_arf.c | 6 +++--- bacnet-stack/demo/handler/h_dcc.c | 4 ++-- bacnet-stack/demo/handler/h_rd.c | 4 ++-- bacnet-stack/demo/handler/h_rp.c | 6 +++--- bacnet-stack/demo/handler/h_wp.c | 4 ++-- bacnet-stack/demo/readfile/readfile.c | 3 ++- bacnet-stack/demo/readprop/readprop.c | 3 ++- bacnet-stack/demo/reinit/main.c | 3 ++- bacnet-stack/demo/timesync/main.c | 3 ++- bacnet-stack/demo/whohas/main.c | 3 ++- bacnet-stack/demo/whois/main.c | 3 ++- bacnet-stack/demo/writefile/writefile.c | 3 ++- bacnet-stack/demo/writeprop/writeprop.c | 3 ++- bacnet-stack/ports/pic18/main.c | 4 ++-- 19 files changed, 43 insertions(+), 29 deletions(-) diff --git a/bacnet-stack/abort.c b/bacnet-stack/abort.c index 61425b26..5ca69cf9 100644 --- a/bacnet-stack/abort.c +++ b/bacnet-stack/abort.c @@ -38,12 +38,15 @@ /* encode service */ int abort_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { - apdu[0] = PDU_TYPE_ABORT; + if (server) + apdu[0] = PDU_TYPE_ABORT & 1; + else + apdu[0] = PDU_TYPE_ABORT; apdu[1] = invoke_id; apdu[2] = abort_reason; apdu_len = 3; @@ -83,7 +86,7 @@ int abort_decode_apdu(uint8_t * apdu, return -1; /* optional checking - most likely was already done prior to this call */ if (apdu_len) { - if (apdu[0] != PDU_TYPE_ABORT) + if ((apdu[0] & 0xF0) != PDU_TYPE_ABORT) return -1; if (apdu_len > 1) { len = abort_decode_service_request(&apdu[1], diff --git a/bacnet-stack/abort.h b/bacnet-stack/abort.h index cc339afb..6b6294dc 100644 --- a/bacnet-stack/abort.h +++ b/bacnet-stack/abort.h @@ -42,7 +42,7 @@ extern "C" { #endif /* __cplusplus */ int abort_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, uint8_t abort_reason); + uint8_t invoke_id, uint8_t abort_reason, bool server); int abort_decode_service_request(uint8_t * apdu, unsigned apdu_len, uint8_t * invoke_id, uint8_t * abort_reason); diff --git a/bacnet-stack/apdu.c b/bacnet-stack/apdu.c index 4bca44b8..1c8b2968 100644 --- a/bacnet-stack/apdu.c +++ b/bacnet-stack/apdu.c @@ -287,6 +287,7 @@ void apdu_handler(BACNET_ADDRESS * src, uint8_t * apdu, /* APDU data */ int error_code = 0; int error_class = 0; uint8_t reason = 0; + bool server = false; if (apdu) { /* PDU Type */ @@ -439,10 +440,11 @@ void apdu_handler(BACNET_ADDRESS * src, uint8_t * apdu, /* APDU data */ tsm_free_invoke_id(invoke_id); break; case PDU_TYPE_ABORT: + server = apdu[0] & 0x01; invoke_id = apdu[1]; reason = apdu[2]; if (Abort_Function) - Abort_Function(src, invoke_id, reason); + Abort_Function(src, invoke_id, reason, server); tsm_free_invoke_id(invoke_id); break; default: diff --git a/bacnet-stack/apdu.h b/bacnet-stack/apdu.h index 4554e315..6bf48bde 100644 --- a/bacnet-stack/apdu.h +++ b/bacnet-stack/apdu.h @@ -109,7 +109,7 @@ extern "C" { /* generic abort reply function */ typedef void (*abort_function) (BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason); + uint8_t invoke_id, uint8_t abort_reason, bool server); /* generic reject reply function */ typedef void (*reject_function) (BACNET_ADDRESS * src, diff --git a/bacnet-stack/demo/dcc/main.c b/bacnet-stack/demo/dcc/main.c index 1ee98a85..2b7d7c17 100644 --- a/bacnet-stack/demo/dcc/main.c +++ b/bacnet-stack/demo/dcc/main.c @@ -77,11 +77,12 @@ static void MyErrorHandler(BACNET_ADDRESS * src, } void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("BACnet Abort: %s\r\n", bactext_abort_reason_name(abort_reason)); Error_Detected = true; diff --git a/bacnet-stack/demo/handler/h_arf.c b/bacnet-stack/demo/handler/h_arf.c index b208f248..7a07d7fa 100644 --- a/bacnet-stack/demo/handler/h_arf.c +++ b/bacnet-stack/demo/handler/h_arf.c @@ -118,14 +118,14 @@ void handler_atomic_read_file(uint8_t * service_request, /* bad decoding - send an abort */ if (len < 0) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], - service_data->invoke_id, ABORT_REASON_OTHER); + service_data->invoke_id, ABORT_REASON_OTHER, true); #if PRINT_ENABLED fprintf(stderr, "Bad Encoding. Sending Abort!\n"); #endif } else if (service_data->segmented_message) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); #if PRINT_ENABLED fprintf(stderr, "Segmented Message. Sending Abort!\n"); #endif @@ -149,7 +149,7 @@ void handler_atomic_read_file(uint8_t * service_request, len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); #if PRINT_ENABLED fprintf(stderr, "Too Big To Send. Sending Abort!\n"); #endif diff --git a/bacnet-stack/demo/handler/h_dcc.c b/bacnet-stack/demo/handler/h_dcc.c index ad293aa9..533d45ec 100644 --- a/bacnet-stack/demo/handler/h_dcc.c +++ b/bacnet-stack/demo/handler/h_dcc.c @@ -72,7 +72,7 @@ void handler_device_communication_control(uint8_t * service_request, /* bad decoding or something we didn't understand - send an abort */ if (len < 0) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], - service_data->invoke_id, ABORT_REASON_OTHER); + service_data->invoke_id, ABORT_REASON_OTHER, true); #if PRINT_ENABLED fprintf(stderr, "DeviceCommunicationControl: " "Sending Abort - could not decode.\n"); @@ -80,7 +80,7 @@ void handler_device_communication_control(uint8_t * service_request, } else if (service_data->segmented_message) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); #if PRINT_ENABLED fprintf(stderr, "DeviceCommunicationControl: " "Sending Abort - segmented message.\n"); diff --git a/bacnet-stack/demo/handler/h_rd.c b/bacnet-stack/demo/handler/h_rd.c index 9c716423..e9708774 100644 --- a/bacnet-stack/demo/handler/h_rd.c +++ b/bacnet-stack/demo/handler/h_rd.c @@ -72,7 +72,7 @@ void handler_reinitialize_device(uint8_t * service_request, /* bad decoding or something we didn't understand - send an abort */ if (len < 0) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], - service_data->invoke_id, ABORT_REASON_OTHER); + service_data->invoke_id, ABORT_REASON_OTHER, true); #if PRINT_ENABLED fprintf(stderr, "ReinitializeDevice: Sending Abort - could not decode.\n"); @@ -80,7 +80,7 @@ void handler_reinitialize_device(uint8_t * service_request, } else if (service_data->segmented_message) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); #if PRINT_ENABLED fprintf(stderr, "ReinitializeDevice: Sending Abort - segmented message.\n"); diff --git a/bacnet-stack/demo/handler/h_rp.c b/bacnet-stack/demo/handler/h_rp.c index 390fa3f1..1841688c 100644 --- a/bacnet-stack/demo/handler/h_rp.c +++ b/bacnet-stack/demo/handler/h_rp.c @@ -78,14 +78,14 @@ void handler_read_property(uint8_t * service_request, /* bad decoding - send an abort */ if (len < 0) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], - service_data->invoke_id, ABORT_REASON_OTHER); + service_data->invoke_id, ABORT_REASON_OTHER, true); #if PRINT_ENABLED fprintf(stderr, "Sending Abort!\n"); #endif } else if (service_data->segmented_message) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); #if PRINT_ENABLED fprintf(stderr, "Sending Abort!\n"); #endif @@ -319,7 +319,7 @@ void handler_read_property(uint8_t * service_request, case -2: len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); break; case -1: default: diff --git a/bacnet-stack/demo/handler/h_wp.c b/bacnet-stack/demo/handler/h_wp.c index 62bac19d..ac2d33e7 100644 --- a/bacnet-stack/demo/handler/h_wp.c +++ b/bacnet-stack/demo/handler/h_wp.c @@ -83,14 +83,14 @@ void handler_write_property(uint8_t * service_request, /* bad decoding or something we didn't understand - send an abort */ if (len <= 0) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], - service_data->invoke_id, ABORT_REASON_OTHER); + service_data->invoke_id, ABORT_REASON_OTHER, true); #if PRINT_ENABLED fprintf(stderr, "Sending Abort!\n"); #endif } else if (service_data->segmented_message) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); #if PRINT_ENABLED fprintf(stderr, "Sending Abort!\n"); #endif diff --git a/bacnet-stack/demo/readfile/readfile.c b/bacnet-stack/demo/readfile/readfile.c index 2eaed074..e7f65d4d 100644 --- a/bacnet-stack/demo/readfile/readfile.c +++ b/bacnet-stack/demo/readfile/readfile.c @@ -75,11 +75,12 @@ static void Atomic_Read_File_Error_Handler(BACNET_ADDRESS * src, } void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("\r\nBACnet Abort!\r\n"); printf("Abort Reason: %s\r\n", bactext_abort_reason_name(abort_reason)); diff --git a/bacnet-stack/demo/readprop/readprop.c b/bacnet-stack/demo/readprop/readprop.c index 6978c273..d0b887fa 100644 --- a/bacnet-stack/demo/readprop/readprop.c +++ b/bacnet-stack/demo/readprop/readprop.c @@ -76,11 +76,12 @@ static void MyErrorHandler(BACNET_ADDRESS * src, } void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("BACnet Abort: %s\r\n", bactext_abort_reason_name(abort_reason)); Error_Detected = true; diff --git a/bacnet-stack/demo/reinit/main.c b/bacnet-stack/demo/reinit/main.c index 9b42ced9..e33118ff 100644 --- a/bacnet-stack/demo/reinit/main.c +++ b/bacnet-stack/demo/reinit/main.c @@ -76,11 +76,12 @@ static void MyErrorHandler(BACNET_ADDRESS * src, } void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("BACnet Abort: %s\r\n", bactext_abort_reason_name(abort_reason)); Error_Detected = true; diff --git a/bacnet-stack/demo/timesync/main.c b/bacnet-stack/demo/timesync/main.c index 8b428810..daa59eac 100644 --- a/bacnet-stack/demo/timesync/main.c +++ b/bacnet-stack/demo/timesync/main.c @@ -57,11 +57,12 @@ static int32_t Target_Object_Instance_Max = BACNET_MAX_INSTANCE; static bool Error_Detected = false; void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("BACnet Abort: %s\r\n", bactext_abort_reason_name(abort_reason)); Error_Detected = true; diff --git a/bacnet-stack/demo/whohas/main.c b/bacnet-stack/demo/whohas/main.c index f1be24ff..22aeea4d 100644 --- a/bacnet-stack/demo/whohas/main.c +++ b/bacnet-stack/demo/whohas/main.c @@ -60,11 +60,12 @@ static char *Target_Object_Name = NULL; static bool Error_Detected = false; void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("BACnet Abort: %s\r\n", bactext_abort_reason_name(abort_reason)); Error_Detected = true; diff --git a/bacnet-stack/demo/whois/main.c b/bacnet-stack/demo/whois/main.c index cf488349..1231645a 100644 --- a/bacnet-stack/demo/whois/main.c +++ b/bacnet-stack/demo/whois/main.c @@ -56,11 +56,12 @@ static int32_t Target_Object_Instance_Max = BACNET_MAX_INSTANCE; static bool Error_Detected = false; void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("BACnet Abort: %s\r\n", bactext_abort_reason_name(abort_reason)); Error_Detected = true; diff --git a/bacnet-stack/demo/writefile/writefile.c b/bacnet-stack/demo/writefile/writefile.c index 3a0205b5..36111536 100644 --- a/bacnet-stack/demo/writefile/writefile.c +++ b/bacnet-stack/demo/writefile/writefile.c @@ -75,11 +75,12 @@ static void Atomic_Read_File_Error_Handler(BACNET_ADDRESS * src, } void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("\r\nBACnet Abort!\r\n"); printf("Abort Reason: %s\r\n", bactext_abort_reason_name(abort_reason)); diff --git a/bacnet-stack/demo/writeprop/writeprop.c b/bacnet-stack/demo/writeprop/writeprop.c index 70fa4988..d453c4a9 100644 --- a/bacnet-stack/demo/writeprop/writeprop.c +++ b/bacnet-stack/demo/writeprop/writeprop.c @@ -83,11 +83,12 @@ static void MyErrorHandler(BACNET_ADDRESS * src, } void MyAbortHandler(BACNET_ADDRESS * src, - uint8_t invoke_id, uint8_t abort_reason) + uint8_t invoke_id, uint8_t abort_reason, bool server) { /* FIXME: verify src and invoke id */ (void) src; (void) invoke_id; + (void) server; printf("\r\nBACnet Abort!\r\n"); printf("Abort Reason: %s\r\n", bactext_abort_reason_name(abort_reason)); diff --git a/bacnet-stack/ports/pic18/main.c b/bacnet-stack/ports/pic18/main.c index 8fc845d9..574bea9f 100644 --- a/bacnet-stack/ports/pic18/main.c +++ b/bacnet-stack/ports/pic18/main.c @@ -82,11 +82,11 @@ void My_Read_Property_Handler(uint8_t * service_request, /* bad decoding - send an abort */ if (len < 0) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], - service_data->invoke_id, ABORT_REASON_OTHER); + service_data->invoke_id, ABORT_REASON_OTHER, true); } else if (service_data->segmented_message) { len = abort_encode_apdu(&Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); } else { switch (data.object_type) { case OBJECT_DEVICE: