From 2c819274af4e6e52ff0e97e6381d5652c15ee3b7 Mon Sep 17 00:00:00 2001 From: GauiStori Date: Thu, 11 Jul 2024 17:26:22 +0200 Subject: [PATCH] Fixed network priority reponses for test 10.1.2 (#687) --- ports/atmega168/apdu.c | 21 +++++++++++++++++++++ src/bacnet/apdu.h | 4 ++++ src/bacnet/basic/npdu/h_npdu.c | 5 +++++ src/bacnet/basic/service/h_apdu.c | 20 ++++++++++++++++++++ src/bacnet/basic/service/h_rp.c | 2 +- 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/ports/atmega168/apdu.c b/ports/atmega168/apdu.c index 81da4e6f..d944375c 100644 --- a/ports/atmega168/apdu.c +++ b/ports/atmega168/apdu.c @@ -41,6 +41,26 @@ #include "bacnet/bacdcode.h" #include "bacnet/basic/services.h" +static uint8_t Local_Network_Priority; /* Fixing test 10.1.2 Network priority */ + +/** + * @brief get the local network priority + * @return local network priority + */ +uint8_t apdu_network_priority(void) +{ + return Local_Network_Priority; +} + +/** + * @brief set the local network priority + * @param net - local network priority + */ +void apdu_network_priority_set(uint8_t pri) +{ + Local_Network_Priority = pri & 0x03; +} + bool apdu_service_supported(BACNET_SERVICES_SUPPORTED service_supported) { bool status = false; @@ -76,6 +96,7 @@ uint16_t apdu_decode_confirmed_service_request(uint8_t *apdu, /* APDU data */ service_data->max_segs = decode_max_segs(apdu[1]); service_data->max_resp = decode_max_apdu(apdu[1]); service_data->invoke_id = apdu[2]; + service_data->priority = apdu_network_priority(); len = 3; if (service_data->segmented_message) { service_data->sequence_number = apdu[len++]; diff --git a/src/bacnet/apdu.h b/src/bacnet/apdu.h index db3b0ed3..fa74e68c 100644 --- a/src/bacnet/apdu.h +++ b/src/bacnet/apdu.h @@ -38,6 +38,7 @@ typedef struct _confirmed_service_data { uint8_t invoke_id; uint8_t sequence_number; uint8_t proposed_window_number; + uint8_t priority; } BACNET_CONFIRMED_SERVICE_DATA; typedef struct _confirmed_service_ack_data { @@ -48,4 +49,7 @@ typedef struct _confirmed_service_ack_data { uint8_t proposed_window_number; } BACNET_CONFIRMED_SERVICE_ACK_DATA; +uint8_t apdu_network_priority(void); +void apdu_network_priority_set(uint8_t pri); + #endif diff --git a/src/bacnet/basic/npdu/h_npdu.c b/src/bacnet/basic/npdu/h_npdu.c index dbb91f65..dfaf863d 100644 --- a/src/bacnet/basic/npdu/h_npdu.c +++ b/src/bacnet/basic/npdu/h_npdu.c @@ -252,6 +252,11 @@ void npdu_handler(BACNET_ADDRESS *src, uint8_t *pdu, uint16_t pdu_len) /* ConfirmedBroadcastReceived */ /* then enter IDLE - ignore the PDU */ } else { + if (npdu_data.data_expecting_reply ) { + apdu_network_priority_set(npdu_data.priority); + } else { + apdu_network_priority_set(MESSAGE_PRIORITY_NORMAL); + } apdu_handler(src, &pdu[apdu_offset], (uint16_t)(pdu_len - apdu_offset)); } diff --git a/src/bacnet/basic/service/h_apdu.c b/src/bacnet/basic/service/h_apdu.c index 53f0ef59..f60793c5 100644 --- a/src/bacnet/basic/service/h_apdu.c +++ b/src/bacnet/basic/service/h_apdu.c @@ -53,6 +53,7 @@ static uint16_t Timeout_Milliseconds = 3000; /* Number of APDU Retries */ static uint8_t Number_Of_Retries = 3; +static uint8_t Local_Network_Priority; /* Fixing test 10.1.2 Network priority */ /* a simple table for crossing the services supported */ static BACNET_SERVICES_SUPPORTED @@ -83,6 +84,24 @@ static BACNET_SERVICES_SUPPORTED SERVICE_SUPPORTED_AUDIT_LOG_QUERY }; +/** + * @brief get the local network priority + * @return local network priority + */ +uint8_t apdu_network_priority(void) +{ + return Local_Network_Priority; +} + +/** + * @brief set the local network priority + * @param net - local network priority + */ +void apdu_network_priority_set(uint8_t pri) +{ + Local_Network_Priority = pri & 0x03; +} + /* a simple table for crossing the services supported */ static BACNET_SERVICES_SUPPORTED unconfirmed_service_supported[MAX_BACNET_UNCONFIRMED_SERVICE] = { @@ -439,6 +458,7 @@ uint16_t apdu_decode_confirmed_service_request(uint8_t *apdu, /* APDU data */ service_data->max_segs = decode_max_segs(apdu[1]); service_data->max_resp = decode_max_apdu(apdu[1]); service_data->invoke_id = apdu[2]; + service_data->priority = apdu_network_priority(); len = 3; if (service_data->segmented_message) { if (apdu_len >= (len + 2)) { diff --git a/src/bacnet/basic/service/h_rp.c b/src/bacnet/basic/service/h_rp.c index c3d3851e..ed665dc5 100644 --- a/src/bacnet/basic/service/h_rp.c +++ b/src/bacnet/basic/service/h_rp.c @@ -87,7 +87,7 @@ void handler_read_property(uint8_t *service_request, rpdata.error_code = ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED; /* encode the NPDU portion of the packet */ datalink_get_my_address(&my_address); - npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL); + npdu_encode_npdu_data(&npdu_data, false, service_data->priority); npdu_len = npdu_encode_pdu( &Handler_Transmit_Buffer[0], src, &my_address, &npdu_data); if (npdu_len <= 0) {