From 947756fa0de688a3f0ed8185ab6d119ee5d6f7fb Mon Sep 17 00:00:00 2001 From: skarg Date: Sun, 14 Oct 2007 02:19:24 +0000 Subject: [PATCH] MovedMoved ReadProperty to subdirectory for library splitting. Split client, server, test for ReadProperty. --- bacnet-stack/lib/Makefile | 3 +- bacnet-stack/lib/makefile.b32 | 3 +- bacnet-stack/ports/at91sam7s/makefile | 2 +- bacnet-stack/ports/atmega168/Makefile | 2 +- .../src/readprop/{rp.mak => Makefile} | 0 bacnet-stack/src/readprop/main.c | 283 --------------- bacnet-stack/src/readprop/rp.c | 341 ------------------ bacnet-stack/src/readprop/rp_client.c | 227 ------------ bacnet-stack/src/readprop/rp_server.c | 112 ++++++ bacnet-stack/src/readprop/rp_test.c | 175 --------- 10 files changed, 118 insertions(+), 1030 deletions(-) rename bacnet-stack/src/readprop/{rp.mak => Makefile} (100%) delete mode 100644 bacnet-stack/src/readprop/rp.c create mode 100644 bacnet-stack/src/readprop/rp_server.c diff --git a/bacnet-stack/lib/Makefile b/bacnet-stack/lib/Makefile index 16c6f27b..fd0be706 100644 --- a/bacnet-stack/lib/Makefile +++ b/bacnet-stack/lib/Makefile @@ -48,7 +48,8 @@ CORE_SRC = \ $(BACNET_CORE)/iam/iam_send.c \ $(BACNET_CORE)/ihave.c \ $(BACNET_CORE)/rd.c \ - $(BACNET_CORE)/rp.c \ + $(BACNET_CORE)/readprop/rp_server.c \ + $(BACNET_CORE)/readprop/rp_client.c \ $(BACNET_CORE)/rpm.c \ $(BACNET_CORE)/timesync.c \ $(BACNET_CORE)/whohas.c \ diff --git a/bacnet-stack/lib/makefile.b32 b/bacnet-stack/lib/makefile.b32 index 959da277..58df6d3f 100644 --- a/bacnet-stack/lib/makefile.b32 +++ b/bacnet-stack/lib/makefile.b32 @@ -67,7 +67,8 @@ CORE2_SRC = $(BACNET_CORE)\arf.c \ $(BACNET_CORE)\iam\iam_send.c \ $(BACNET_CORE)\ihave.c \ $(BACNET_CORE)\rd.c \ - $(BACNET_CORE)\rp.c \ + $(BACNET_CORE)\readprop\rp_server.c \ + $(BACNET_CORE)\readprop\rp_client.c \ $(BACNET_CORE)\rpm.c \ $(BACNET_CORE)\timesync.c \ $(BACNET_CORE)\whohas.c \ diff --git a/bacnet-stack/ports/at91sam7s/makefile b/bacnet-stack/ports/at91sam7s/makefile index 4dd88413..bf321a4f 100644 --- a/bacnet-stack/ports/at91sam7s/makefile +++ b/bacnet-stack/ports/at91sam7s/makefile @@ -73,7 +73,7 @@ CORESRC = $(BACNET_CORE)/npdu.c \ $(BACNET_CORE)/reject.c \ $(BACNET_CORE)/bacapp.c \ $(BACNET_CORE)/datetime.c \ - $(BACNET_CORE)/rp.c \ + $(BACNET_CORE)/readprop/rp_server.c \ $(BACNET_CORE)/wp.c \ $(BACNET_CORE)/dcc.c \ $(BACNET_CORE)/rd.c \ diff --git a/bacnet-stack/ports/atmega168/Makefile b/bacnet-stack/ports/atmega168/Makefile index 90939e1c..cf105d2f 100644 --- a/bacnet-stack/ports/atmega168/Makefile +++ b/bacnet-stack/ports/atmega168/Makefile @@ -44,7 +44,7 @@ CORESRC = \ $(BACNET_CORE)/bacdcode/characterstring.c \ $(BACNET_CORE)/iam/iam_server.c \ $(BACNET_CORE)/iam/iam_send.c \ - $(BACNET_CORE)/rp.c \ + $(BACNET_CORE)/readprop/rp_server.c \ $(BACNET_CORE)/whois.c \ $(BACNET_CORE)/bacaddr.c \ $(BACNET_CORE)/abort.c \ diff --git a/bacnet-stack/src/readprop/rp.mak b/bacnet-stack/src/readprop/Makefile similarity index 100% rename from bacnet-stack/src/readprop/rp.mak rename to bacnet-stack/src/readprop/Makefile diff --git a/bacnet-stack/src/readprop/main.c b/bacnet-stack/src/readprop/main.c index 4780a37b..634092a2 100644 --- a/bacnet-stack/src/readprop/main.c +++ b/bacnet-stack/src/readprop/main.c @@ -37,287 +37,6 @@ #include "bacdef.h" #include "rp.h" -/* encode service */ -int rp_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; /* length of each encoding */ - int apdu_len = 0; /* total length of the apdu, return value */ - - if (apdu) { - apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; - apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); - apdu[2] = invoke_id; - apdu[3] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ - apdu_len = 4; - len = encode_context_object_id(&apdu[apdu_len], 0, - data->object_type, data->object_instance); - apdu_len += len; - len = encode_context_enumerated(&apdu[apdu_len], 1, - data->object_property); - apdu_len += len; - /* optional array index */ - if (data->array_index != BACNET_ARRAY_ALL) { - len = encode_context_unsigned(&apdu[apdu_len], 2, - data->array_index); - apdu_len += len; - } - } - - return apdu_len; -} - -/* decode the service request only */ -int rp_decode_service_request(uint8_t * apdu, - unsigned apdu_len, BACNET_READ_PROPERTY_DATA * data) -{ - unsigned len = 0; - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - int type = 0; /* for decoding */ - int property = 0; /* for decoding */ - uint32_t array_value = 0; /* for decoding */ - - /* check for value pointers */ - if (apdu_len && data) { - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[len++], 0)) - return -1; - len += decode_object_id(&apdu[len], &type, &data->object_instance); - data->object_type = (BACNET_OBJECT_TYPE)type; - /* Tag 1: Property ID */ - len += decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number != 1) - return -1; - len += decode_enumerated(&apdu[len], len_value_type, &property); - data->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - if (len < apdu_len) { - len += decode_tag_number_and_value(&apdu[len], &tag_number, - &len_value_type); - if (tag_number == 2) { - len += decode_unsigned(&apdu[len], len_value_type, - &array_value); - data->array_index = array_value; - } else - data->array_index = BACNET_ARRAY_ALL; - } else - data->array_index = BACNET_ARRAY_ALL; - } - - return (int) len; -} - -int rp_ack_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; /* length of each encoding */ - int apdu_len = 0; /* total length of the apdu, return value */ - - if (apdu) { - apdu[0] = PDU_TYPE_COMPLEX_ACK; /* complex ACK service */ - apdu[1] = invoke_id; /* original invoke id from request */ - apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ - apdu_len = 3; - /* service ack follows */ - apdu_len += encode_context_object_id(&apdu[apdu_len], 0, - data->object_type, data->object_instance); - apdu_len += encode_context_enumerated(&apdu[apdu_len], 1, - data->object_property); - /* context 2 array index is optional */ - if (data->array_index != BACNET_ARRAY_ALL) { - apdu_len += encode_context_unsigned(&apdu[apdu_len], 2, - data->array_index); - } - /* propertyValue */ - apdu_len += encode_opening_tag(&apdu[apdu_len], 3); - for (len = 0; len < data->application_data_len; len++) { - apdu[apdu_len++] = data->application_data[len]; - } - apdu_len += encode_closing_tag(&apdu[apdu_len], 3); - } - - return apdu_len; -} - -int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, /* total length of the apdu */ - BACNET_READ_PROPERTY_DATA * data) -{ - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - int tag_len = 0; /* length of tag decode */ - int len = 0; /* total length of decodes */ - int object = 0, property = 0; /* for decoding */ - uint32_t array_value = 0; /* for decoding */ - - /* FIXME: check apdu_len against the len during decode */ - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[0], 0)) - return -1; - len = 1; - len += decode_object_id(&apdu[len], &object, &data->object_instance); - data->object_type = (BACNET_OBJECT_TYPE)object; - /* Tag 1: Property ID */ - len += decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number != 1) - return -1; - len += decode_enumerated(&apdu[len], len_value_type, &property); - data->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - tag_len = decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number == 2) { - len += tag_len; - len += decode_unsigned(&apdu[len], len_value_type, &array_value); - data->array_index = array_value; - } else - data->array_index = BACNET_ARRAY_ALL; - /* Tag 3: opening context tag */ - if (decode_is_opening_tag_number(&apdu[len], 3)) { - /* a tag number of 3 is not extended so only one octet */ - len++; - /* don't decode the application tag number or its data here */ - data->application_data = &apdu[len]; - data->application_data_len = apdu_len - len - 1 /*closing tag */ ; - } else - return -1; - - return len; -} - -#ifdef TEST -#include -#include -#include "ctest.h" - -int rp_decode_apdu(uint8_t * apdu, - unsigned apdu_len, - uint8_t * invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; - unsigned offset = 0; - - if (!apdu) - return -1; - /* optional checking - most likely was already done prior to this call */ - if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST) - return -1; - /* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */ - *invoke_id = apdu[2]; /* invoke id - filled in by net layer */ - if (apdu[3] != SERVICE_CONFIRMED_READ_PROPERTY) - return -1; - offset = 4; - - if (apdu_len > offset) { - len = rp_decode_service_request(&apdu[offset], - apdu_len - offset, data); - } - - return len; -} - -int rp_ack_decode_apdu(uint8_t * apdu, int apdu_len, /* total length of the apdu */ - uint8_t * invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; - int offset = 0; - - if (!apdu) - return -1; - /* optional checking - most likely was already done prior to this call */ - if (apdu[0] != PDU_TYPE_COMPLEX_ACK) - return -1; - *invoke_id = apdu[1]; - if (apdu[2] != SERVICE_CONFIRMED_READ_PROPERTY) - return -1; - offset = 3; - if (apdu_len > offset) { - len = rp_ack_decode_service_request(&apdu[offset], - apdu_len - offset, data); - } - - return len; -} - -void testReadPropertyAck(Test * pTest) -{ - uint8_t apdu[480] = { 0 }; - uint8_t apdu2[480] = { 0 }; - int len = 0; - int apdu_len = 0; - uint8_t invoke_id = 1; - uint8_t test_invoke_id = 0; - BACNET_READ_PROPERTY_DATA data; - BACNET_READ_PROPERTY_DATA test_data; - BACNET_OBJECT_TYPE object_type = OBJECT_DEVICE; - uint32_t object_instance = 0; - int object = 0; - - data.object_type = OBJECT_DEVICE; - data.object_instance = 1; - data.object_property = PROP_OBJECT_IDENTIFIER; - data.array_index = BACNET_ARRAY_ALL; - - data.application_data_len = encode_bacnet_object_id(&apdu2[0], - data.object_type, data.object_instance); - data.application_data = &apdu2[0]; - - len = rp_ack_encode_apdu(&apdu[0], invoke_id, &data); - ct_test(pTest, len != 0); - ct_test(pTest, len != -1); - apdu_len = len; - len = rp_ack_decode_apdu(&apdu[0], apdu_len, /* total length of the apdu */ - &test_invoke_id, &test_data); - ct_test(pTest, len != -1); - ct_test(pTest, test_invoke_id == invoke_id); - - ct_test(pTest, test_data.object_type == data.object_type); - ct_test(pTest, test_data.object_instance == data.object_instance); - ct_test(pTest, test_data.object_property == data.object_property); - ct_test(pTest, test_data.array_index == data.array_index); - ct_test(pTest, - test_data.application_data_len == data.application_data_len); - - /* since object property == object_id, decode the application data using - the appropriate decode function */ - len = decode_object_id(test_data.application_data, - &object, &object_instance); - object_type = object; - ct_test(pTest, object_type == data.object_type); - ct_test(pTest, object_instance == data.object_instance); -} - -void testReadProperty(Test * pTest) -{ - uint8_t apdu[480] = { 0 }; - int len = 0; - int apdu_len = 0; - uint8_t invoke_id = 128; - uint8_t test_invoke_id = 0; - BACNET_READ_PROPERTY_DATA data; - BACNET_READ_PROPERTY_DATA test_data; - - data.object_type = OBJECT_DEVICE; - data.object_instance = 1; - data.object_property = PROP_OBJECT_IDENTIFIER; - data.array_index = BACNET_ARRAY_ALL; - len = rp_encode_apdu(&apdu[0], invoke_id, &data); - ct_test(pTest, len != 0); - apdu_len = len; - - len = rp_decode_apdu(&apdu[0], apdu_len, &test_invoke_id, &test_data); - ct_test(pTest, len != -1); - ct_test(pTest, test_data.object_type == data.object_type); - ct_test(pTest, test_data.object_instance == data.object_instance); - ct_test(pTest, test_data.object_property == data.object_property); - ct_test(pTest, test_data.array_index == data.array_index); - - return; -} - -#ifdef TEST_READ_PROPERTY int main(void) { Test *pTest; @@ -337,5 +56,3 @@ int main(void) return 0; } -#endif /* TEST_READ_PROPERTY */ -#endif /* TEST */ diff --git a/bacnet-stack/src/readprop/rp.c b/bacnet-stack/src/readprop/rp.c deleted file mode 100644 index 4780a37b..00000000 --- a/bacnet-stack/src/readprop/rp.c +++ /dev/null @@ -1,341 +0,0 @@ -/*####COPYRIGHTBEGIN#### - ------------------------------------------- - Copyright (C) 2005 Steve Karg - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to: - The Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307, USA. - - As a special exception, if other files instantiate templates or - use macros or inline functions from this file, or you compile - this file and link it with other works to produce a work based - on this file, this file does not by itself cause the resulting - work to be covered by the GNU General Public License. However - the source code for this file must still be made available in - accordance with section (3) of the GNU General Public License. - - This exception does not invalidate any other reasons why a work - based on this file might be covered by the GNU General Public - License. - ------------------------------------------- -####COPYRIGHTEND####*/ -#include -#include "bacenum.h" -#include "bacdcode.h" -#include "bacdef.h" -#include "rp.h" - -/* encode service */ -int rp_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; /* length of each encoding */ - int apdu_len = 0; /* total length of the apdu, return value */ - - if (apdu) { - apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; - apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); - apdu[2] = invoke_id; - apdu[3] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ - apdu_len = 4; - len = encode_context_object_id(&apdu[apdu_len], 0, - data->object_type, data->object_instance); - apdu_len += len; - len = encode_context_enumerated(&apdu[apdu_len], 1, - data->object_property); - apdu_len += len; - /* optional array index */ - if (data->array_index != BACNET_ARRAY_ALL) { - len = encode_context_unsigned(&apdu[apdu_len], 2, - data->array_index); - apdu_len += len; - } - } - - return apdu_len; -} - -/* decode the service request only */ -int rp_decode_service_request(uint8_t * apdu, - unsigned apdu_len, BACNET_READ_PROPERTY_DATA * data) -{ - unsigned len = 0; - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - int type = 0; /* for decoding */ - int property = 0; /* for decoding */ - uint32_t array_value = 0; /* for decoding */ - - /* check for value pointers */ - if (apdu_len && data) { - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[len++], 0)) - return -1; - len += decode_object_id(&apdu[len], &type, &data->object_instance); - data->object_type = (BACNET_OBJECT_TYPE)type; - /* Tag 1: Property ID */ - len += decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number != 1) - return -1; - len += decode_enumerated(&apdu[len], len_value_type, &property); - data->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - if (len < apdu_len) { - len += decode_tag_number_and_value(&apdu[len], &tag_number, - &len_value_type); - if (tag_number == 2) { - len += decode_unsigned(&apdu[len], len_value_type, - &array_value); - data->array_index = array_value; - } else - data->array_index = BACNET_ARRAY_ALL; - } else - data->array_index = BACNET_ARRAY_ALL; - } - - return (int) len; -} - -int rp_ack_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; /* length of each encoding */ - int apdu_len = 0; /* total length of the apdu, return value */ - - if (apdu) { - apdu[0] = PDU_TYPE_COMPLEX_ACK; /* complex ACK service */ - apdu[1] = invoke_id; /* original invoke id from request */ - apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ - apdu_len = 3; - /* service ack follows */ - apdu_len += encode_context_object_id(&apdu[apdu_len], 0, - data->object_type, data->object_instance); - apdu_len += encode_context_enumerated(&apdu[apdu_len], 1, - data->object_property); - /* context 2 array index is optional */ - if (data->array_index != BACNET_ARRAY_ALL) { - apdu_len += encode_context_unsigned(&apdu[apdu_len], 2, - data->array_index); - } - /* propertyValue */ - apdu_len += encode_opening_tag(&apdu[apdu_len], 3); - for (len = 0; len < data->application_data_len; len++) { - apdu[apdu_len++] = data->application_data[len]; - } - apdu_len += encode_closing_tag(&apdu[apdu_len], 3); - } - - return apdu_len; -} - -int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, /* total length of the apdu */ - BACNET_READ_PROPERTY_DATA * data) -{ - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - int tag_len = 0; /* length of tag decode */ - int len = 0; /* total length of decodes */ - int object = 0, property = 0; /* for decoding */ - uint32_t array_value = 0; /* for decoding */ - - /* FIXME: check apdu_len against the len during decode */ - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[0], 0)) - return -1; - len = 1; - len += decode_object_id(&apdu[len], &object, &data->object_instance); - data->object_type = (BACNET_OBJECT_TYPE)object; - /* Tag 1: Property ID */ - len += decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number != 1) - return -1; - len += decode_enumerated(&apdu[len], len_value_type, &property); - data->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - tag_len = decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number == 2) { - len += tag_len; - len += decode_unsigned(&apdu[len], len_value_type, &array_value); - data->array_index = array_value; - } else - data->array_index = BACNET_ARRAY_ALL; - /* Tag 3: opening context tag */ - if (decode_is_opening_tag_number(&apdu[len], 3)) { - /* a tag number of 3 is not extended so only one octet */ - len++; - /* don't decode the application tag number or its data here */ - data->application_data = &apdu[len]; - data->application_data_len = apdu_len - len - 1 /*closing tag */ ; - } else - return -1; - - return len; -} - -#ifdef TEST -#include -#include -#include "ctest.h" - -int rp_decode_apdu(uint8_t * apdu, - unsigned apdu_len, - uint8_t * invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; - unsigned offset = 0; - - if (!apdu) - return -1; - /* optional checking - most likely was already done prior to this call */ - if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST) - return -1; - /* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */ - *invoke_id = apdu[2]; /* invoke id - filled in by net layer */ - if (apdu[3] != SERVICE_CONFIRMED_READ_PROPERTY) - return -1; - offset = 4; - - if (apdu_len > offset) { - len = rp_decode_service_request(&apdu[offset], - apdu_len - offset, data); - } - - return len; -} - -int rp_ack_decode_apdu(uint8_t * apdu, int apdu_len, /* total length of the apdu */ - uint8_t * invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; - int offset = 0; - - if (!apdu) - return -1; - /* optional checking - most likely was already done prior to this call */ - if (apdu[0] != PDU_TYPE_COMPLEX_ACK) - return -1; - *invoke_id = apdu[1]; - if (apdu[2] != SERVICE_CONFIRMED_READ_PROPERTY) - return -1; - offset = 3; - if (apdu_len > offset) { - len = rp_ack_decode_service_request(&apdu[offset], - apdu_len - offset, data); - } - - return len; -} - -void testReadPropertyAck(Test * pTest) -{ - uint8_t apdu[480] = { 0 }; - uint8_t apdu2[480] = { 0 }; - int len = 0; - int apdu_len = 0; - uint8_t invoke_id = 1; - uint8_t test_invoke_id = 0; - BACNET_READ_PROPERTY_DATA data; - BACNET_READ_PROPERTY_DATA test_data; - BACNET_OBJECT_TYPE object_type = OBJECT_DEVICE; - uint32_t object_instance = 0; - int object = 0; - - data.object_type = OBJECT_DEVICE; - data.object_instance = 1; - data.object_property = PROP_OBJECT_IDENTIFIER; - data.array_index = BACNET_ARRAY_ALL; - - data.application_data_len = encode_bacnet_object_id(&apdu2[0], - data.object_type, data.object_instance); - data.application_data = &apdu2[0]; - - len = rp_ack_encode_apdu(&apdu[0], invoke_id, &data); - ct_test(pTest, len != 0); - ct_test(pTest, len != -1); - apdu_len = len; - len = rp_ack_decode_apdu(&apdu[0], apdu_len, /* total length of the apdu */ - &test_invoke_id, &test_data); - ct_test(pTest, len != -1); - ct_test(pTest, test_invoke_id == invoke_id); - - ct_test(pTest, test_data.object_type == data.object_type); - ct_test(pTest, test_data.object_instance == data.object_instance); - ct_test(pTest, test_data.object_property == data.object_property); - ct_test(pTest, test_data.array_index == data.array_index); - ct_test(pTest, - test_data.application_data_len == data.application_data_len); - - /* since object property == object_id, decode the application data using - the appropriate decode function */ - len = decode_object_id(test_data.application_data, - &object, &object_instance); - object_type = object; - ct_test(pTest, object_type == data.object_type); - ct_test(pTest, object_instance == data.object_instance); -} - -void testReadProperty(Test * pTest) -{ - uint8_t apdu[480] = { 0 }; - int len = 0; - int apdu_len = 0; - uint8_t invoke_id = 128; - uint8_t test_invoke_id = 0; - BACNET_READ_PROPERTY_DATA data; - BACNET_READ_PROPERTY_DATA test_data; - - data.object_type = OBJECT_DEVICE; - data.object_instance = 1; - data.object_property = PROP_OBJECT_IDENTIFIER; - data.array_index = BACNET_ARRAY_ALL; - len = rp_encode_apdu(&apdu[0], invoke_id, &data); - ct_test(pTest, len != 0); - apdu_len = len; - - len = rp_decode_apdu(&apdu[0], apdu_len, &test_invoke_id, &test_data); - ct_test(pTest, len != -1); - ct_test(pTest, test_data.object_type == data.object_type); - ct_test(pTest, test_data.object_instance == data.object_instance); - ct_test(pTest, test_data.object_property == data.object_property); - ct_test(pTest, test_data.array_index == data.array_index); - - return; -} - -#ifdef TEST_READ_PROPERTY -int main(void) -{ - Test *pTest; - bool rc; - - pTest = ct_create("BACnet ReadProperty", NULL); - /* individual tests */ - rc = ct_addTestFunction(pTest, testReadProperty); - assert(rc); - rc = ct_addTestFunction(pTest, testReadPropertyAck); - assert(rc); - - ct_setStream(pTest, stdout); - ct_run(pTest); - (void) ct_report(pTest); - ct_destroy(pTest); - - return 0; -} -#endif /* TEST_READ_PROPERTY */ -#endif /* TEST */ diff --git a/bacnet-stack/src/readprop/rp_client.c b/bacnet-stack/src/readprop/rp_client.c index 4780a37b..d447dd46 100644 --- a/bacnet-stack/src/readprop/rp_client.c +++ b/bacnet-stack/src/readprop/rp_client.c @@ -67,80 +67,6 @@ int rp_encode_apdu(uint8_t * apdu, return apdu_len; } -/* decode the service request only */ -int rp_decode_service_request(uint8_t * apdu, - unsigned apdu_len, BACNET_READ_PROPERTY_DATA * data) -{ - unsigned len = 0; - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - int type = 0; /* for decoding */ - int property = 0; /* for decoding */ - uint32_t array_value = 0; /* for decoding */ - - /* check for value pointers */ - if (apdu_len && data) { - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[len++], 0)) - return -1; - len += decode_object_id(&apdu[len], &type, &data->object_instance); - data->object_type = (BACNET_OBJECT_TYPE)type; - /* Tag 1: Property ID */ - len += decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number != 1) - return -1; - len += decode_enumerated(&apdu[len], len_value_type, &property); - data->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - if (len < apdu_len) { - len += decode_tag_number_and_value(&apdu[len], &tag_number, - &len_value_type); - if (tag_number == 2) { - len += decode_unsigned(&apdu[len], len_value_type, - &array_value); - data->array_index = array_value; - } else - data->array_index = BACNET_ARRAY_ALL; - } else - data->array_index = BACNET_ARRAY_ALL; - } - - return (int) len; -} - -int rp_ack_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; /* length of each encoding */ - int apdu_len = 0; /* total length of the apdu, return value */ - - if (apdu) { - apdu[0] = PDU_TYPE_COMPLEX_ACK; /* complex ACK service */ - apdu[1] = invoke_id; /* original invoke id from request */ - apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ - apdu_len = 3; - /* service ack follows */ - apdu_len += encode_context_object_id(&apdu[apdu_len], 0, - data->object_type, data->object_instance); - apdu_len += encode_context_enumerated(&apdu[apdu_len], 1, - data->object_property); - /* context 2 array index is optional */ - if (data->array_index != BACNET_ARRAY_ALL) { - apdu_len += encode_context_unsigned(&apdu[apdu_len], 2, - data->array_index); - } - /* propertyValue */ - apdu_len += encode_opening_tag(&apdu[apdu_len], 3); - for (len = 0; len < data->application_data_len; len++) { - apdu[apdu_len++] = data->application_data[len]; - } - apdu_len += encode_closing_tag(&apdu[apdu_len], 3); - } - - return apdu_len; -} - int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, /* total length of the apdu */ BACNET_READ_PROPERTY_DATA * data) { @@ -186,156 +112,3 @@ int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, /* total length return len; } - -#ifdef TEST -#include -#include -#include "ctest.h" - -int rp_decode_apdu(uint8_t * apdu, - unsigned apdu_len, - uint8_t * invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; - unsigned offset = 0; - - if (!apdu) - return -1; - /* optional checking - most likely was already done prior to this call */ - if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST) - return -1; - /* apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); */ - *invoke_id = apdu[2]; /* invoke id - filled in by net layer */ - if (apdu[3] != SERVICE_CONFIRMED_READ_PROPERTY) - return -1; - offset = 4; - - if (apdu_len > offset) { - len = rp_decode_service_request(&apdu[offset], - apdu_len - offset, data); - } - - return len; -} - -int rp_ack_decode_apdu(uint8_t * apdu, int apdu_len, /* total length of the apdu */ - uint8_t * invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; - int offset = 0; - - if (!apdu) - return -1; - /* optional checking - most likely was already done prior to this call */ - if (apdu[0] != PDU_TYPE_COMPLEX_ACK) - return -1; - *invoke_id = apdu[1]; - if (apdu[2] != SERVICE_CONFIRMED_READ_PROPERTY) - return -1; - offset = 3; - if (apdu_len > offset) { - len = rp_ack_decode_service_request(&apdu[offset], - apdu_len - offset, data); - } - - return len; -} - -void testReadPropertyAck(Test * pTest) -{ - uint8_t apdu[480] = { 0 }; - uint8_t apdu2[480] = { 0 }; - int len = 0; - int apdu_len = 0; - uint8_t invoke_id = 1; - uint8_t test_invoke_id = 0; - BACNET_READ_PROPERTY_DATA data; - BACNET_READ_PROPERTY_DATA test_data; - BACNET_OBJECT_TYPE object_type = OBJECT_DEVICE; - uint32_t object_instance = 0; - int object = 0; - - data.object_type = OBJECT_DEVICE; - data.object_instance = 1; - data.object_property = PROP_OBJECT_IDENTIFIER; - data.array_index = BACNET_ARRAY_ALL; - - data.application_data_len = encode_bacnet_object_id(&apdu2[0], - data.object_type, data.object_instance); - data.application_data = &apdu2[0]; - - len = rp_ack_encode_apdu(&apdu[0], invoke_id, &data); - ct_test(pTest, len != 0); - ct_test(pTest, len != -1); - apdu_len = len; - len = rp_ack_decode_apdu(&apdu[0], apdu_len, /* total length of the apdu */ - &test_invoke_id, &test_data); - ct_test(pTest, len != -1); - ct_test(pTest, test_invoke_id == invoke_id); - - ct_test(pTest, test_data.object_type == data.object_type); - ct_test(pTest, test_data.object_instance == data.object_instance); - ct_test(pTest, test_data.object_property == data.object_property); - ct_test(pTest, test_data.array_index == data.array_index); - ct_test(pTest, - test_data.application_data_len == data.application_data_len); - - /* since object property == object_id, decode the application data using - the appropriate decode function */ - len = decode_object_id(test_data.application_data, - &object, &object_instance); - object_type = object; - ct_test(pTest, object_type == data.object_type); - ct_test(pTest, object_instance == data.object_instance); -} - -void testReadProperty(Test * pTest) -{ - uint8_t apdu[480] = { 0 }; - int len = 0; - int apdu_len = 0; - uint8_t invoke_id = 128; - uint8_t test_invoke_id = 0; - BACNET_READ_PROPERTY_DATA data; - BACNET_READ_PROPERTY_DATA test_data; - - data.object_type = OBJECT_DEVICE; - data.object_instance = 1; - data.object_property = PROP_OBJECT_IDENTIFIER; - data.array_index = BACNET_ARRAY_ALL; - len = rp_encode_apdu(&apdu[0], invoke_id, &data); - ct_test(pTest, len != 0); - apdu_len = len; - - len = rp_decode_apdu(&apdu[0], apdu_len, &test_invoke_id, &test_data); - ct_test(pTest, len != -1); - ct_test(pTest, test_data.object_type == data.object_type); - ct_test(pTest, test_data.object_instance == data.object_instance); - ct_test(pTest, test_data.object_property == data.object_property); - ct_test(pTest, test_data.array_index == data.array_index); - - return; -} - -#ifdef TEST_READ_PROPERTY -int main(void) -{ - Test *pTest; - bool rc; - - pTest = ct_create("BACnet ReadProperty", NULL); - /* individual tests */ - rc = ct_addTestFunction(pTest, testReadProperty); - assert(rc); - rc = ct_addTestFunction(pTest, testReadPropertyAck); - assert(rc); - - ct_setStream(pTest, stdout); - ct_run(pTest); - (void) ct_report(pTest); - ct_destroy(pTest); - - return 0; -} -#endif /* TEST_READ_PROPERTY */ -#endif /* TEST */ diff --git a/bacnet-stack/src/readprop/rp_server.c b/bacnet-stack/src/readprop/rp_server.c new file mode 100644 index 00000000..ceb84a07 --- /dev/null +++ b/bacnet-stack/src/readprop/rp_server.c @@ -0,0 +1,112 @@ +/*####COPYRIGHTBEGIN#### + ------------------------------------------- + Copyright (C) 2005 Steve Karg + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + The Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA. + + As a special exception, if other files instantiate templates or + use macros or inline functions from this file, or you compile + this file and link it with other works to produce a work based + on this file, this file does not by itself cause the resulting + work to be covered by the GNU General Public License. However + the source code for this file must still be made available in + accordance with section (3) of the GNU General Public License. + + This exception does not invalidate any other reasons why a work + based on this file might be covered by the GNU General Public + License. + ------------------------------------------- +####COPYRIGHTEND####*/ +#include +#include "bacenum.h" +#include "bacdcode.h" +#include "bacdef.h" +#include "rp.h" + +/* decode the service request only */ +int rp_decode_service_request(uint8_t * apdu, + unsigned apdu_len, BACNET_READ_PROPERTY_DATA * data) +{ + unsigned len = 0; + uint8_t tag_number = 0; + uint32_t len_value_type = 0; + int type = 0; /* for decoding */ + int property = 0; /* for decoding */ + uint32_t array_value = 0; /* for decoding */ + + /* check for value pointers */ + if (apdu_len && data) { + /* Tag 0: Object ID */ + if (!decode_is_context_tag(&apdu[len++], 0)) + return -1; + len += decode_object_id(&apdu[len], &type, &data->object_instance); + data->object_type = (BACNET_OBJECT_TYPE)type; + /* Tag 1: Property ID */ + len += decode_tag_number_and_value(&apdu[len], + &tag_number, &len_value_type); + if (tag_number != 1) + return -1; + len += decode_enumerated(&apdu[len], len_value_type, &property); + data->object_property = (BACNET_PROPERTY_ID)property; + /* Tag 2: Optional Array Index */ + if (len < apdu_len) { + len += decode_tag_number_and_value(&apdu[len], &tag_number, + &len_value_type); + if (tag_number == 2) { + len += decode_unsigned(&apdu[len], len_value_type, + &array_value); + data->array_index = array_value; + } else + data->array_index = BACNET_ARRAY_ALL; + } else + data->array_index = BACNET_ARRAY_ALL; + } + + return (int) len; +} + +int rp_ack_encode_apdu(uint8_t * apdu, + uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data) +{ + int len = 0; /* length of each encoding */ + int apdu_len = 0; /* total length of the apdu, return value */ + + if (apdu) { + apdu[0] = PDU_TYPE_COMPLEX_ACK; /* complex ACK service */ + apdu[1] = invoke_id; /* original invoke id from request */ + apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ + apdu_len = 3; + /* service ack follows */ + apdu_len += encode_context_object_id(&apdu[apdu_len], 0, + data->object_type, data->object_instance); + apdu_len += encode_context_enumerated(&apdu[apdu_len], 1, + data->object_property); + /* context 2 array index is optional */ + if (data->array_index != BACNET_ARRAY_ALL) { + apdu_len += encode_context_unsigned(&apdu[apdu_len], 2, + data->array_index); + } + /* propertyValue */ + apdu_len += encode_opening_tag(&apdu[apdu_len], 3); + for (len = 0; len < data->application_data_len; len++) { + apdu[apdu_len++] = data->application_data[len]; + } + apdu_len += encode_closing_tag(&apdu[apdu_len], 3); + } + + return apdu_len; +} diff --git a/bacnet-stack/src/readprop/rp_test.c b/bacnet-stack/src/readprop/rp_test.c index 4780a37b..cc48a32c 100644 --- a/bacnet-stack/src/readprop/rp_test.c +++ b/bacnet-stack/src/readprop/rp_test.c @@ -36,158 +36,6 @@ #include "bacdcode.h" #include "bacdef.h" #include "rp.h" - -/* encode service */ -int rp_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; /* length of each encoding */ - int apdu_len = 0; /* total length of the apdu, return value */ - - if (apdu) { - apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; - apdu[1] = encode_max_segs_max_apdu(0, MAX_APDU); - apdu[2] = invoke_id; - apdu[3] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ - apdu_len = 4; - len = encode_context_object_id(&apdu[apdu_len], 0, - data->object_type, data->object_instance); - apdu_len += len; - len = encode_context_enumerated(&apdu[apdu_len], 1, - data->object_property); - apdu_len += len; - /* optional array index */ - if (data->array_index != BACNET_ARRAY_ALL) { - len = encode_context_unsigned(&apdu[apdu_len], 2, - data->array_index); - apdu_len += len; - } - } - - return apdu_len; -} - -/* decode the service request only */ -int rp_decode_service_request(uint8_t * apdu, - unsigned apdu_len, BACNET_READ_PROPERTY_DATA * data) -{ - unsigned len = 0; - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - int type = 0; /* for decoding */ - int property = 0; /* for decoding */ - uint32_t array_value = 0; /* for decoding */ - - /* check for value pointers */ - if (apdu_len && data) { - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[len++], 0)) - return -1; - len += decode_object_id(&apdu[len], &type, &data->object_instance); - data->object_type = (BACNET_OBJECT_TYPE)type; - /* Tag 1: Property ID */ - len += decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number != 1) - return -1; - len += decode_enumerated(&apdu[len], len_value_type, &property); - data->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - if (len < apdu_len) { - len += decode_tag_number_and_value(&apdu[len], &tag_number, - &len_value_type); - if (tag_number == 2) { - len += decode_unsigned(&apdu[len], len_value_type, - &array_value); - data->array_index = array_value; - } else - data->array_index = BACNET_ARRAY_ALL; - } else - data->array_index = BACNET_ARRAY_ALL; - } - - return (int) len; -} - -int rp_ack_encode_apdu(uint8_t * apdu, - uint8_t invoke_id, BACNET_READ_PROPERTY_DATA * data) -{ - int len = 0; /* length of each encoding */ - int apdu_len = 0; /* total length of the apdu, return value */ - - if (apdu) { - apdu[0] = PDU_TYPE_COMPLEX_ACK; /* complex ACK service */ - apdu[1] = invoke_id; /* original invoke id from request */ - apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ - apdu_len = 3; - /* service ack follows */ - apdu_len += encode_context_object_id(&apdu[apdu_len], 0, - data->object_type, data->object_instance); - apdu_len += encode_context_enumerated(&apdu[apdu_len], 1, - data->object_property); - /* context 2 array index is optional */ - if (data->array_index != BACNET_ARRAY_ALL) { - apdu_len += encode_context_unsigned(&apdu[apdu_len], 2, - data->array_index); - } - /* propertyValue */ - apdu_len += encode_opening_tag(&apdu[apdu_len], 3); - for (len = 0; len < data->application_data_len; len++) { - apdu[apdu_len++] = data->application_data[len]; - } - apdu_len += encode_closing_tag(&apdu[apdu_len], 3); - } - - return apdu_len; -} - -int rp_ack_decode_service_request(uint8_t * apdu, int apdu_len, /* total length of the apdu */ - BACNET_READ_PROPERTY_DATA * data) -{ - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - int tag_len = 0; /* length of tag decode */ - int len = 0; /* total length of decodes */ - int object = 0, property = 0; /* for decoding */ - uint32_t array_value = 0; /* for decoding */ - - /* FIXME: check apdu_len against the len during decode */ - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[0], 0)) - return -1; - len = 1; - len += decode_object_id(&apdu[len], &object, &data->object_instance); - data->object_type = (BACNET_OBJECT_TYPE)object; - /* Tag 1: Property ID */ - len += decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number != 1) - return -1; - len += decode_enumerated(&apdu[len], len_value_type, &property); - data->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - tag_len = decode_tag_number_and_value(&apdu[len], - &tag_number, &len_value_type); - if (tag_number == 2) { - len += tag_len; - len += decode_unsigned(&apdu[len], len_value_type, &array_value); - data->array_index = array_value; - } else - data->array_index = BACNET_ARRAY_ALL; - /* Tag 3: opening context tag */ - if (decode_is_opening_tag_number(&apdu[len], 3)) { - /* a tag number of 3 is not extended so only one octet */ - len++; - /* don't decode the application tag number or its data here */ - data->application_data = &apdu[len]; - data->application_data_len = apdu_len - len - 1 /*closing tag */ ; - } else - return -1; - - return len; -} - -#ifdef TEST #include #include #include "ctest.h" @@ -316,26 +164,3 @@ void testReadProperty(Test * pTest) return; } - -#ifdef TEST_READ_PROPERTY -int main(void) -{ - Test *pTest; - bool rc; - - pTest = ct_create("BACnet ReadProperty", NULL); - /* individual tests */ - rc = ct_addTestFunction(pTest, testReadProperty); - assert(rc); - rc = ct_addTestFunction(pTest, testReadPropertyAck); - assert(rc); - - ct_setStream(pTest, stdout); - ct_run(pTest); - (void) ct_report(pTest); - ct_destroy(pTest); - - return 0; -} -#endif /* TEST_READ_PROPERTY */ -#endif /* TEST */