Files
bacnet_stack/test/bacnet/datalink/bvlc-sc/src/main.c
T

4579 lines
174 KiB
C

/**
* @file
* @brief tests for BACnet/SC encode/decode APIs
* @author Kirill Neznamov <kirill.neznamov@dsr-corporation.com>
* @date May 2022
* @copyright SPDX-License-Identifier: MIT
*/
#include <stdlib.h> /* For calloc() */
#include <zephyr/ztest.h>
#include <bacnet/datalink/bsc/bvlc-sc.h>
static bool verify_bsc_bvll_header(
BVLC_SC_DECODED_HDR *hdr,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
bool dest_options_absent,
bool data_options_absent,
size_t payload_len)
{
if (hdr->bvlc_function != bvlc_function) {
return false;
}
if (hdr->message_id != message_id) {
return false;
}
if (origin) {
if (memcmp(hdr->origin->address, origin->address, BVLC_SC_VMAC_SIZE) !=
0) {
return false;
}
} else {
if (hdr->origin) {
return false;
}
}
if (dest) {
if (memcmp(hdr->dest->address, dest->address, BVLC_SC_VMAC_SIZE) != 0) {
return false;
}
} else {
if (hdr->dest) {
return false;
}
}
if (dest_options_absent) {
if (hdr->dest_options != NULL) {
return false;
}
if (hdr->dest_options_len != 0) {
return false;
}
if (hdr->dest_options_num != 0) {
return false;
}
} else {
if (!hdr->dest_options) {
return false;
}
if (!hdr->dest_options_len) {
return false;
}
if (!hdr->dest_options_num) {
return false;
}
}
if (data_options_absent) {
if (hdr->data_options != NULL) {
return false;
}
if (hdr->data_options_len != 0) {
return false;
}
if (hdr->data_options_num != 0) {
return false;
}
} else {
if (!hdr->data_options) {
return false;
}
if (!hdr->data_options_len) {
return false;
}
if (!hdr->data_options_num) {
return false;
}
}
if (hdr->payload_len != payload_len) {
return false;
}
return true;
}
static void test_header_modifications(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len,
bool dest_options_absent,
bool data_options_absent)
{
uint8_t sbuf[BSC_PRE + 256];
uint8_t *buf = &sbuf[BSC_PRE];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
const char *err_desc = NULL;
size_t len;
bool ret;
BACNET_SC_VMAC_ADDRESS test;
BACNET_SC_VMAC_ADDRESS test_dest;
uint8_t *ppdu;
int res;
memset(&test.address[0], 0x99, sizeof(test.address));
memcpy(buf, pdu, pdu_size);
if (dest && !origin) {
bvlc_sc_remove_dest_set_orig(buf, pdu_size, &test);
ret = bvlc_sc_decode_message(
buf, pdu_size, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, &test, NULL,
dest_options_absent, data_options_absent, payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
zassert_equal(
memcmp(&test.address, message.hdr.origin, sizeof(test.address)), 0,
NULL);
zassert_equal(message.hdr.dest, NULL, NULL);
} else {
bvlc_sc_remove_dest_set_orig(buf, pdu_size, &test);
ret = bvlc_sc_decode_message(
buf, pdu_size, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest,
dest_options_absent, data_options_absent, payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
if (origin) {
zassert_equal(
memcmp(
&origin->address, message.hdr.origin,
sizeof(origin->address)),
0, NULL);
} else {
zassert_equal(message.hdr.origin, NULL, NULL);
}
if (dest) {
zassert_equal(
memcmp(&dest->address, message.hdr.dest, sizeof(dest->address)),
0, NULL);
zassert_equal(bvlc_sc_pdu_has_no_dest(buf, pdu_size), false, NULL);
ret = bvlc_sc_pdu_get_dest(buf, pdu_size, &test_dest);
zassert_equal(ret, true, NULL);
zassert_equal(
memcmp(
&test_dest.address, message.hdr.dest,
sizeof(dest->address)),
0, NULL);
} else {
zassert_equal(message.hdr.dest, NULL, NULL);
zassert_equal(bvlc_sc_pdu_has_no_dest(buf, pdu_size), true, NULL);
ret = bvlc_sc_pdu_get_dest(buf, pdu_size, &test_dest);
zassert_equal(ret, false, NULL);
}
}
memcpy(buf, pdu, pdu_size);
ppdu = buf;
/* origin address can presented only in specific message types */
if (bvlc_function != BVLC_SC_CONNECT_REQUEST &&
bvlc_function != BVLC_SC_CONNECT_ACCEPT &&
bvlc_function != BVLC_SC_DISCONNECT_REQUEST &&
bvlc_function != BVLC_SC_DISCONNECT_ACK &&
bvlc_function != BVLC_SC_HEARTBEAT_REQUEST &&
bvlc_function != BVLC_SC_HEARTBEAT_ACK) {
len = bvlc_sc_set_orig(&ppdu, pdu_size, &test);
ret = bvlc_sc_decode_message(
ppdu, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, &test, dest,
dest_options_absent, data_options_absent, payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
zassert_equal(
memcmp(&test.address, message.hdr.origin, sizeof(test.address)), 0,
NULL);
} else {
len = pdu_size;
}
memcpy(buf, pdu, pdu_size);
ppdu = buf;
len = bvlc_sc_remove_orig_and_dest(&ppdu, pdu_size);
ret = bvlc_sc_decode_message(
ppdu, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.origin, NULL, NULL);
zassert_equal(message.hdr.dest, NULL, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, NULL, NULL,
dest_options_absent, data_options_absent, payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
}
static void test_1_option_data(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
const char *err_desc = NULL;
size_t optlen;
size_t len;
bool ret;
int res;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, pdu_size, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, true, false,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.data_options_num, 1, NULL);
zassert_equal(
message.data_options[0].type, BVLC_SC_OPTION_TYPE_SECURE_PATH, NULL);
zassert_equal(message.data_options[0].must_understand, true, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
test_header_modifications(
buf, len, bvlc_function, message_id, origin, dest, payload, payload_len,
true, false);
}
/* 3 options are added to pdu in total: 1 sc, 2 proprietary */
static void test_3_options_different_buffer_data(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t buf1[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[1];
int res;
const char *err_desc = NULL;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf1, sizeof(buf1), buf, pdu_size, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf1, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf1, sizeof(buf1), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf1, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, true, false,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.data_options_num, 3, NULL);
zassert_equal(
message.data_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[0].must_understand, true, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[0].specific.proprietary.vendor_id, vendor_id2,
NULL);
zassert_equal(
message.data_options[0].specific.proprietary.option_type,
proprietary_option_type2, NULL);
zassert_equal(
message.data_options[0].specific.proprietary.data_len,
sizeof(proprietary_data2), NULL);
res = memcmp(
message.data_options[0].specific.proprietary.data, proprietary_data2,
sizeof(proprietary_data2));
zassert_equal(res, 0, NULL);
zassert_equal(
message.data_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[1].must_understand, true, NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[2].type, BVLC_SC_OPTION_TYPE_SECURE_PATH, NULL);
zassert_equal(message.data_options[2].must_understand, true, NULL);
zassert_equal(
message.data_options[2].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.data_options[2].packed_header_marker & BVLC_SC_HEADER_DATA, 0,
NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
}
/* 3 options are added to pdu in total: 1 sc, 2 proprietary */
static void test_3_options_data(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[1];
int res;
const char *err_desc = NULL;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, true, false,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.data_options_num, 3, NULL);
zassert_equal(
message.data_options[2].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[2].must_understand, true, NULL);
zassert_equal(
message.data_options[2].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.data_options[2].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[2].specific.proprietary.vendor_id, vendor_id2,
NULL);
zassert_equal(
message.data_options[2].specific.proprietary.option_type,
proprietary_option_type2, NULL);
zassert_equal(
message.data_options[2].specific.proprietary.data_len,
sizeof(proprietary_data2), NULL);
res = memcmp(
message.data_options[2].specific.proprietary.data, proprietary_data2,
sizeof(proprietary_data2));
zassert_equal(res, 0, NULL);
zassert_equal(
message.data_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[1].must_understand, true, NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[0].type, BVLC_SC_OPTION_TYPE_SECURE_PATH, NULL);
zassert_equal(message.data_options[0].must_understand, true, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_DATA, 0,
NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
test_header_modifications(
buf, len, bvlc_function, message_id, origin, dest, payload, payload_len,
true, false);
}
static void test_5_options_data(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len;
bool ret;
uint16_t vendor_id1;
uint8_t proprietary_option_type1;
uint8_t proprietary_data1[17];
size_t i;
const char *err_desc = NULL;
(void)bvlc_function;
(void)message_id;
(void)origin;
(void)dest;
(void)payload;
(void)payload_len;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = pdu_size;
for (i = 0; i < 5; i++) {
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
}
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_OUT_OF_MEMORY, NULL);
zassert_equal(error_class, ERROR_CLASS_RESOURCES, NULL);
}
/* check message decoding when header option has incorrect more bit flag */
static void test_options_incorrect_more_bit_data(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[5];
size_t offs = 4;
const char *err_desc = NULL;
(void)bvlc_function;
(void)message_id;
(void)origin;
(void)dest;
(void)payload;
(void)payload_len;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
if (buf[1] & BVLC_SC_CONTROL_ORIG_VADDR) {
offs += BVLC_SC_VMAC_SIZE;
}
if (buf[1] & BVLC_SC_CONTROL_DEST_VADDR) {
offs += BVLC_SC_VMAC_SIZE;
}
buf[offs] &= ~(BVLC_SC_HEADER_MORE);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_UNEXPECTED_DATA, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
/* check message decoding when header option has incorrect more bit flag */
static void test_options_incorrect_data_bit_data(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint8_t proprietary_option_type1;
uint8_t proprietary_data1[17];
size_t offs = 4;
const char *err_desc = NULL;
(void)bvlc_function;
(void)message_id;
(void)origin;
(void)dest;
(void)payload;
(void)payload_len;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
if (buf[1] & BVLC_SC_CONTROL_ORIG_VADDR) {
offs += BVLC_SC_VMAC_SIZE;
}
if (buf[1] & BVLC_SC_CONTROL_DEST_VADDR) {
offs += BVLC_SC_VMAC_SIZE;
}
buf[offs] &= ~(BVLC_SC_HEADER_DATA);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
/* secure path option must not be in dest option headers. this test
checks this case */
static void test_1_option_dest_incorrect(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len;
bool ret;
const char *err_desc = NULL;
(void)bvlc_function;
(void)message_id;
(void)origin;
(void)dest;
(void)payload;
(void)payload_len;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, pdu_size, optbuf, optlen);
zassert_equal(len, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, pdu_size, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
buf[1] &= ~(BVLC_SC_CONTROL_DATA_OPTIONS);
buf[1] |= BVLC_SC_CONTROL_DEST_OPTIONS;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
static void test_1_option_dest(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len;
bool ret;
int res;
uint16_t vendor_id1;
uint8_t proprietary_option_type1;
uint8_t proprietary_data1[17];
const char *err_desc = NULL;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, pdu_size, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, false, true,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.dest_options_num, 1, NULL);
zassert_equal(
message.dest_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[0].must_understand, true, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.vendor_id, vendor_id1,
NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.option_type,
proprietary_option_type1, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.data_len,
sizeof(proprietary_data1), NULL);
res = memcmp(
message.dest_options[0].specific.proprietary.data, proprietary_data1,
sizeof(proprietary_data1));
zassert_equal(res, 0, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
test_header_modifications(
buf, len, bvlc_function, message_id, origin, dest, payload, payload_len,
false, true);
}
/* 3 proprietary options are added to pdu */
static void test_3_options_dest(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint16_t vendor_id3;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_option_type3;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[1];
uint8_t proprietary_data3[43];
int res;
const char *err_desc = NULL;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id3 = 0xF00D;
proprietary_option_type3 = 0x08;
memset(proprietary_data3, 0x55, sizeof(proprietary_data3));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id3, proprietary_option_type3,
proprietary_data3, sizeof(proprietary_data3));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, false, true,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.dest_options_num, 3, NULL);
zassert_equal(
message.dest_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[0].must_understand, true, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.vendor_id, vendor_id3,
NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.option_type,
proprietary_option_type3, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.data_len,
sizeof(proprietary_data3), NULL);
res = memcmp(
message.dest_options[0].specific.proprietary.data, proprietary_data3,
sizeof(proprietary_data3));
zassert_equal(res, 0, NULL);
zassert_equal(
message.dest_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[1].must_understand, true, NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.vendor_id, vendor_id2,
NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.option_type,
proprietary_option_type2, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.data_len,
sizeof(proprietary_data2), NULL);
res = memcmp(
message.dest_options[1].specific.proprietary.data, proprietary_data2,
sizeof(proprietary_data2));
zassert_equal(res, 0, NULL);
zassert_equal(
message.dest_options[2].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[2].must_understand, true, NULL);
zassert_equal(
message.dest_options[2].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.dest_options[2].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[2].specific.proprietary.vendor_id, vendor_id1,
NULL);
zassert_equal(
message.dest_options[2].specific.proprietary.option_type,
proprietary_option_type1, NULL);
zassert_equal(
message.dest_options[2].specific.proprietary.data_len,
sizeof(proprietary_data1), NULL);
res = memcmp(
message.dest_options[2].specific.proprietary.data, proprietary_data1,
sizeof(proprietary_data1));
zassert_equal(res, 0, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
test_header_modifications(
buf, len, bvlc_function, message_id, origin, dest, payload, payload_len,
false, true);
}
static void test_3_options_dest_different_buffer(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf1[256];
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint16_t vendor_id3;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_option_type3;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[1];
uint8_t proprietary_data3[43];
int res;
const char *err_desc = NULL;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf1, sizeof(buf1), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf1, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id3 = 0xF00D;
proprietary_option_type3 = 0x08;
memset(proprietary_data3, 0x55, sizeof(proprietary_data3));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id3, proprietary_option_type3,
proprietary_data3, sizeof(proprietary_data3));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf1, sizeof(buf1), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf1, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, false, true,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.dest_options_num, 3, NULL);
zassert_equal(
message.dest_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[0].must_understand, true, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.vendor_id, vendor_id3,
NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.option_type,
proprietary_option_type3, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.data_len,
sizeof(proprietary_data3), NULL);
res = memcmp(
message.dest_options[0].specific.proprietary.data, proprietary_data3,
sizeof(proprietary_data3));
zassert_equal(res, 0, NULL);
zassert_equal(
message.dest_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[1].must_understand, true, NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.vendor_id, vendor_id2,
NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.option_type,
proprietary_option_type2, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.data_len,
sizeof(proprietary_data2), NULL);
res = memcmp(
message.dest_options[1].specific.proprietary.data, proprietary_data2,
sizeof(proprietary_data2));
zassert_equal(res, 0, NULL);
zassert_equal(
message.dest_options[2].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[2].must_understand, true, NULL);
zassert_equal(
message.dest_options[2].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.dest_options[2].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[2].specific.proprietary.vendor_id, vendor_id1,
NULL);
zassert_equal(
message.dest_options[2].specific.proprietary.option_type,
proprietary_option_type1, NULL);
zassert_equal(
message.dest_options[2].specific.proprietary.data_len,
sizeof(proprietary_data1), NULL);
res = memcmp(
message.dest_options[2].specific.proprietary.data, proprietary_data1,
sizeof(proprietary_data1));
zassert_equal(res, 0, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
test_header_modifications(
buf1, len, bvlc_function, message_id, origin, dest, payload,
payload_len, false, true);
}
static void test_5_options_dest(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint8_t proprietary_option_type1;
uint8_t proprietary_data1[17];
size_t i;
const char *err_desc = NULL;
(void)bvlc_function;
(void)message_id;
(void)origin;
(void)dest;
(void)payload;
(void)payload_len;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = pdu_size;
for (i = 0; i < 5; i++) {
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
}
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_OUT_OF_MEMORY, NULL);
zassert_equal(error_class, ERROR_CLASS_RESOURCES, NULL);
}
static void test_options_incorrect_data_bit_dest(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint8_t proprietary_option_type1;
uint8_t proprietary_data1[17];
int offs = 4;
const char *err_desc = NULL;
(void)bvlc_function;
(void)message_id;
(void)origin;
(void)dest;
(void)payload;
(void)payload_len;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
if (buf[1] & BVLC_SC_CONTROL_ORIG_VADDR) {
offs += BVLC_SC_VMAC_SIZE;
}
if (buf[1] & BVLC_SC_CONTROL_DEST_VADDR) {
offs += BVLC_SC_VMAC_SIZE;
}
buf[offs] &= ~(BVLC_SC_HEADER_DATA);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
static void test_options_incorrect_more_bit_dest(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[5];
size_t offs = 4;
const char *err_desc = NULL;
(void)bvlc_function;
(void)message_id;
(void)origin;
(void)dest;
(void)payload;
(void)payload_len;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0x0;
proprietary_option_type1 = 0x0;
memset(proprietary_data1, 0x0, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
if (buf[1] & BVLC_SC_CONTROL_ORIG_VADDR) {
offs += BVLC_SC_VMAC_SIZE;
}
if (buf[1] & BVLC_SC_CONTROL_DEST_VADDR) {
offs += BVLC_SC_VMAC_SIZE;
}
buf[offs] &= ~(BVLC_SC_HEADER_MORE);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
if (error_code != ERROR_CODE_UNEXPECTED_DATA &&
error_code != ERROR_CODE_PARAMETER_OUT_OF_RANGE) {
zassert_equal(1, 2, NULL);
}
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
static void test_options_mixed_case1(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint16_t vendor_id3;
uint16_t vendor_id4;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_option_type3;
uint8_t proprietary_option_type4;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[1];
uint8_t proprietary_data3[43];
uint8_t proprietary_data4[23];
int res;
const char *err_desc = NULL;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id3 = 0xF00D;
proprietary_option_type3 = 0x08;
memset(proprietary_data3, 0x55, sizeof(proprietary_data3));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id3, proprietary_option_type3,
proprietary_data3, sizeof(proprietary_data3));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id4 = 0xabcd;
proprietary_option_type4 = 0x64;
memset(proprietary_data4, 0x97, sizeof(proprietary_data4));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id4, proprietary_option_type4,
proprietary_data4, sizeof(proprietary_data4));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, false, false,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.dest_options_num, 2, NULL);
zassert_equal(message.hdr.data_options_num, 2, NULL);
zassert_equal(
message.dest_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[0].must_understand, true, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.vendor_id, vendor_id3,
NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.option_type,
proprietary_option_type3, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.data_len,
sizeof(proprietary_data3), NULL);
res = memcmp(
message.dest_options[0].specific.proprietary.data, proprietary_data3,
sizeof(proprietary_data3));
zassert_equal(res, 0, NULL);
zassert_equal(
message.dest_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[1].must_understand, true, NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.vendor_id, vendor_id1,
NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.option_type,
proprietary_option_type1, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.data_len,
sizeof(proprietary_data1), NULL);
res = memcmp(
message.dest_options[1].specific.proprietary.data, proprietary_data1,
sizeof(proprietary_data1));
zassert_equal(res, 0, NULL);
/* data options */
zassert_equal(
message.data_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[0].must_understand, true, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[0].specific.proprietary.vendor_id, vendor_id4,
NULL);
zassert_equal(
message.data_options[0].specific.proprietary.option_type,
proprietary_option_type4, NULL);
zassert_equal(
message.data_options[0].specific.proprietary.data_len,
sizeof(proprietary_data4), NULL);
res = memcmp(
message.data_options[0].specific.proprietary.data, proprietary_data4,
sizeof(proprietary_data4));
zassert_equal(res, 0, NULL);
zassert_equal(
message.data_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[1].must_understand, true, NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[1].specific.proprietary.vendor_id, vendor_id2,
NULL);
zassert_equal(
message.data_options[1].specific.proprietary.option_type,
proprietary_option_type2, NULL);
zassert_equal(
message.data_options[1].specific.proprietary.data_len,
sizeof(proprietary_data2), NULL);
res = memcmp(
message.data_options[1].specific.proprietary.data, proprietary_data2,
sizeof(proprietary_data2));
zassert_equal(res, 0, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
test_header_modifications(
buf, len, bvlc_function, message_id, origin, dest, payload, payload_len,
false, false);
}
static void test_options_mixed_case2(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint16_t vendor_id3;
uint16_t vendor_id4;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_option_type3;
uint8_t proprietary_option_type4;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[1];
uint8_t proprietary_data3[43];
uint8_t proprietary_data4[23];
int res;
const char *err_desc = NULL;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id3 = 0xF00D;
proprietary_option_type3 = 0x08;
memset(proprietary_data3, 0x55, sizeof(proprietary_data3));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id3, proprietary_option_type3,
proprietary_data3, sizeof(proprietary_data3));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id4 = 0xabcd;
proprietary_option_type4 = 0x64;
memset(proprietary_data4, 0x97, sizeof(proprietary_data4));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id4, proprietary_option_type4,
proprietary_data4, sizeof(proprietary_data4));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, false, false,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.dest_options_num, 2, NULL);
zassert_equal(message.hdr.data_options_num, 2, NULL);
zassert_equal(
message.dest_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[0].must_understand, true, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.vendor_id, vendor_id4,
NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.option_type,
proprietary_option_type4, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.data_len,
sizeof(proprietary_data4), NULL);
res = memcmp(
message.dest_options[0].specific.proprietary.data, proprietary_data4,
sizeof(proprietary_data4));
zassert_equal(res, 0, NULL);
zassert_equal(
message.dest_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[1].must_understand, true, NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.vendor_id, vendor_id3,
NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.option_type,
proprietary_option_type3, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.data_len,
sizeof(proprietary_data3), NULL);
res = memcmp(
message.dest_options[1].specific.proprietary.data, proprietary_data3,
sizeof(proprietary_data3));
zassert_equal(res, 0, NULL);
/* data options */
zassert_equal(
message.data_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[0].must_understand, true, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[0].specific.proprietary.vendor_id, vendor_id2,
NULL);
zassert_equal(
message.data_options[0].specific.proprietary.option_type,
proprietary_option_type2, NULL);
zassert_equal(
message.data_options[0].specific.proprietary.data_len,
sizeof(proprietary_data2), NULL);
res = memcmp(
message.data_options[0].specific.proprietary.data, proprietary_data2,
sizeof(proprietary_data2));
zassert_equal(res, 0, NULL);
zassert_equal(
message.data_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[1].must_understand, true, NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[1].specific.proprietary.vendor_id, vendor_id1,
NULL);
zassert_equal(
message.data_options[1].specific.proprietary.option_type,
proprietary_option_type1, NULL);
zassert_equal(
message.data_options[1].specific.proprietary.data_len,
sizeof(proprietary_data1), NULL);
res = memcmp(
message.data_options[1].specific.proprietary.data, proprietary_data1,
sizeof(proprietary_data1));
zassert_equal(res, 0, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
test_header_modifications(
buf, len, bvlc_function, message_id, origin, dest, payload, payload_len,
false, false);
}
static void test_options_mixed_case3(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
uint8_t *payload,
size_t payload_len)
{
uint8_t buf[256];
uint8_t optbuf[256];
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
size_t optlen;
size_t len = pdu_size;
bool ret;
uint16_t vendor_id1;
uint16_t vendor_id2;
uint16_t vendor_id3;
uint16_t vendor_id4;
uint8_t proprietary_option_type1;
uint8_t proprietary_option_type2;
uint8_t proprietary_option_type3;
uint8_t proprietary_option_type4;
uint8_t proprietary_data1[17];
uint8_t proprietary_data2[1];
uint8_t proprietary_data3[43];
uint8_t proprietary_data4[23];
int res;
const char *err_desc = NULL;
zassert_equal(true, sizeof(buf) >= pdu_size ? true : false, NULL);
memcpy(buf, pdu, pdu_size);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id2 = 0xbeaf;
proprietary_option_type2 = 0x33;
memset(proprietary_data2, 0x11, sizeof(proprietary_data2));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id2, proprietary_option_type2,
proprietary_data2, sizeof(proprietary_data2));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id3 = 0xF00D;
proprietary_option_type3 = 0x08;
memset(proprietary_data3, 0x55, sizeof(proprietary_data3));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id3, proprietary_option_type3,
proprietary_data3, sizeof(proprietary_data3));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
vendor_id4 = 0xabcd;
proprietary_option_type4 = 0x64;
memset(proprietary_data4, 0x97, sizeof(proprietary_data4));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id4, proprietary_option_type4,
proprietary_data4, sizeof(proprietary_data4));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, bvlc_function, message_id, origin, dest, false, false,
payload_len);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.dest_options_num, 2, NULL);
zassert_equal(message.hdr.data_options_num, 2, NULL);
zassert_equal(
message.dest_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[0].must_understand, true, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.dest_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.vendor_id, vendor_id2,
NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.option_type,
proprietary_option_type2, NULL);
zassert_equal(
message.dest_options[0].specific.proprietary.data_len,
sizeof(proprietary_data2), NULL);
res = memcmp(
message.dest_options[0].specific.proprietary.data, proprietary_data2,
sizeof(proprietary_data2));
zassert_equal(res, 0, NULL);
zassert_equal(
message.dest_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.dest_options[1].must_understand, true, NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.dest_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.vendor_id, vendor_id1,
NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.option_type,
proprietary_option_type1, NULL);
zassert_equal(
message.dest_options[1].specific.proprietary.data_len,
sizeof(proprietary_data1), NULL);
res = memcmp(
message.dest_options[1].specific.proprietary.data, proprietary_data1,
sizeof(proprietary_data1));
zassert_equal(res, 0, NULL);
/* data options */
zassert_equal(
message.data_options[0].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[0].must_understand, true, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_MORE,
BVLC_SC_HEADER_MORE, NULL);
zassert_equal(
message.data_options[0].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[0].specific.proprietary.vendor_id, vendor_id4,
NULL);
zassert_equal(
message.data_options[0].specific.proprietary.option_type,
proprietary_option_type4, NULL);
zassert_equal(
message.data_options[0].specific.proprietary.data_len,
sizeof(proprietary_data4), NULL);
res = memcmp(
message.data_options[0].specific.proprietary.data, proprietary_data4,
sizeof(proprietary_data4));
zassert_equal(res, 0, NULL);
zassert_equal(
message.data_options[1].type, BVLC_SC_OPTION_TYPE_PROPRIETARY, NULL);
zassert_equal(message.data_options[1].must_understand, true, NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_MORE, 0,
NULL);
zassert_equal(
message.data_options[1].packed_header_marker & BVLC_SC_HEADER_DATA,
BVLC_SC_HEADER_DATA, NULL);
zassert_equal(
message.data_options[1].specific.proprietary.vendor_id, vendor_id3,
NULL);
zassert_equal(
message.data_options[1].specific.proprietary.option_type,
proprietary_option_type3, NULL);
zassert_equal(
message.data_options[1].specific.proprietary.data_len,
sizeof(proprietary_data3), NULL);
res = memcmp(
message.data_options[1].specific.proprietary.data, proprietary_data3,
sizeof(proprietary_data3));
zassert_equal(res, 0, NULL);
zassert_equal(message.hdr.payload_len, payload_len, NULL);
res = memcmp(message.hdr.payload, payload, payload_len);
zassert_equal(res, 0, NULL);
test_header_modifications(
buf, len, bvlc_function, message_id, origin, dest, payload, payload_len,
false, false);
}
static void test_options(
uint8_t *pdu,
size_t pdu_size,
uint8_t bvlc_function,
uint16_t message_id,
BACNET_SC_VMAC_ADDRESS *origin,
BACNET_SC_VMAC_ADDRESS *dest,
bool test_dest_option,
bool test_data_option,
uint8_t *payload,
size_t payload_len,
bool ignore_more_bit_test)
{
if (!test_dest_option && test_data_option) {
test_1_option_data(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_3_options_data(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_3_options_different_buffer_data(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_5_options_data(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
if (!ignore_more_bit_test) {
test_options_incorrect_more_bit_data(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
}
test_options_incorrect_data_bit_data(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
} else if (test_dest_option && !test_data_option) {
test_1_option_dest_incorrect(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_1_option_dest(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_3_options_dest(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_3_options_dest_different_buffer(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_5_options_dest(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
if (!ignore_more_bit_test) {
test_options_incorrect_more_bit_dest(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
}
test_options_incorrect_data_bit_dest(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
} else if (test_dest_option && test_data_option) {
test_options_mixed_case1(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_options_mixed_case2(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
test_options_mixed_case3(
pdu, pdu_size, bvlc_function, message_id, origin, dest, payload,
payload_len);
}
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_BVLC_RESULT)
#else
static void test_BVLC_RESULT(void)
#endif
{
uint8_t sbuf[256 + BSC_PRE];
uint8_t *buf = &sbuf[BSC_PRE];
int buf_len = 256;
size_t len;
uint8_t optbuf[256];
size_t optlen;
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS new_origin;
BACNET_SC_VMAC_ADDRESS dest;
BACNET_SC_VMAC_ADDRESS test_dest;
uint16_t message_id = 0x7777;
uint8_t result_bvlc_function = 3;
bool ret;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint8_t error_header_marker = 0xcc;
uint16_t test_error_class = 0xaa;
uint16_t test_error_code = 0xdd;
const char *error_details_string = "something bad has happened";
const char *err_desc = NULL;
uint8_t *pdu;
memset(origin.address, 0x23, BVLC_SC_VMAC_SIZE);
memset(dest.address, 0x44, BVLC_SC_VMAC_SIZE);
memset(new_origin.address, 0x93, BVLC_SC_VMAC_SIZE);
/* origin and dest presented */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, &origin, &dest, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, &origin, &dest, true, true,
2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, &origin, &dest, true, false,
message.hdr.payload, message.hdr.payload_len, false);
ret = bvlc_sc_pdu_has_no_dest(buf, len);
zassert_equal(ret, false, NULL);
memset(&test_dest, 0, sizeof(test_dest));
ret = bvlc_sc_pdu_get_dest(buf, len, &test_dest);
zassert_equal(ret, true, NULL);
zassert_equal(
0, memcmp(&dest.address, &test_dest.address, sizeof(test_dest.address)),
NULL);
pdu = buf;
len = bvlc_sc_set_orig(&pdu, len, &new_origin);
ret = bvlc_sc_decode_message(
pdu, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, &new_origin, &dest, true,
true, 2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
pdu, len, BVLC_SC_RESULT, message_id, &new_origin, &dest, true, false,
message.hdr.payload, message.hdr.payload_len, false);
pdu = buf;
len = bvlc_sc_remove_orig_and_dest(&pdu, len);
ret = bvlc_sc_decode_message(
pdu, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, NULL, NULL, true, true, 2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
pdu, len, BVLC_SC_RESULT, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
/* origin presented */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, &origin, NULL, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_pdu_has_no_dest(buf, len);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, &origin, NULL, true, true, 2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, &origin, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
pdu = buf;
len = bvlc_sc_remove_orig_and_dest(&pdu, len);
ret = bvlc_sc_decode_message(
pdu, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, NULL, NULL, true, true, 2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
pdu, len, BVLC_SC_RESULT, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
/* dest presented */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, &dest, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, NULL, &dest, true, true, 2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, NULL, &dest, true, false,
message.hdr.payload, message.hdr.payload_len, false);
ret = bvlc_sc_pdu_has_no_dest(buf, len);
zassert_equal(ret, false, NULL);
memset(&test_dest, 0, sizeof(test_dest));
ret = bvlc_sc_pdu_get_dest(buf, len, &test_dest);
zassert_equal(ret, true, NULL);
zassert_equal(
0, memcmp(&dest.address, &test_dest.address, sizeof(test_dest.address)),
NULL);
pdu = buf;
len = bvlc_sc_set_orig(&pdu, len, &new_origin);
ret = bvlc_sc_decode_message(
pdu, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, &new_origin, &dest, true,
true, 2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
pdu, len, BVLC_SC_RESULT, message_id, &new_origin, &dest, true, false,
message.hdr.payload, message.hdr.payload_len, false);
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, &dest, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
pdu = buf;
len = bvlc_sc_remove_orig_and_dest(&pdu, len);
ret = bvlc_sc_decode_message(
pdu, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, NULL, NULL, true, true, 2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
pdu, len, BVLC_SC_RESULT, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, &dest, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
bvlc_sc_remove_dest_set_orig(buf, len, &new_origin);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, &new_origin, NULL, true, true,
2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, &new_origin, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
/* dest and origin absent */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_pdu_has_no_dest(buf, len);
zassert_equal(ret, true, NULL);
memset(&test_dest, 0, sizeof(test_dest));
ret = bvlc_sc_pdu_get_dest(buf, len, &test_dest);
zassert_equal(ret, false, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, NULL, NULL, true, true, 2);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 0, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
/* nak, no details string */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 1,
&error_header_marker, &test_error_class, &test_error_code, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, NULL, NULL, true, true, 7);
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 1, NULL);
zassert_equal(
message.payload.result.error_header_marker, error_header_marker, NULL);
zassert_equal(message.payload.result.error_class, test_error_class, NULL);
zassert_equal(message.payload.result.error_code, test_error_code, NULL);
zassert_equal(message.payload.result.utf8_details_string, NULL, NULL);
zassert_equal(message.payload.result.utf8_details_string_len, 0, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
/* nak , details string */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 1,
&error_header_marker, &test_error_class, &test_error_code,
error_details_string);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, NULL, NULL, true, true,
7 + strlen(error_details_string));
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 1, NULL);
zassert_equal(
message.payload.result.error_header_marker, error_header_marker, NULL);
zassert_equal(message.payload.result.error_class, test_error_class, NULL);
zassert_equal(message.payload.result.error_code, test_error_code, NULL);
zassert_equal(
message.payload.result.utf8_details_string_len,
strlen(error_details_string), NULL);
ret = memcmp(
message.payload.result.utf8_details_string, error_details_string,
strlen(error_details_string)) == 0
? true
: false;
zassert_equal(ret, true, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
/* dest and origin, nak , details string */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, &origin, &dest, result_bvlc_function, 1,
&error_header_marker, &test_error_class, &test_error_code,
error_details_string);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_RESULT, message_id, &origin, &dest, true, true,
7 + strlen(error_details_string));
zassert_equal(ret, true, NULL);
zassert_equal(
message.payload.result.bvlc_function, result_bvlc_function, NULL);
zassert_equal(message.payload.result.result, 1, NULL);
zassert_equal(
message.payload.result.error_header_marker, error_header_marker, NULL);
zassert_equal(message.payload.result.error_class, test_error_class, NULL);
zassert_equal(message.payload.result.error_code, test_error_code, NULL);
zassert_equal(
message.payload.result.utf8_details_string_len,
strlen(error_details_string), NULL);
ret = memcmp(
message.payload.result.utf8_details_string, error_details_string,
strlen(error_details_string)) == 0
? true
: false;
zassert_equal(ret, true, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, &origin, &dest, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 1,
&error_header_marker, &test_error_class, &test_error_code,
error_details_string);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
/* origin and dest absent, result ok*/
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
test_options(
buf, len, BVLC_SC_RESULT, message_id, NULL, NULL, true, false,
message.hdr.payload, 2, false);
/* data option test */
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, buf_len, buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_INCONSISTENT_PARAMETERS, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* zero payload test */
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PAYLOAD_EXPECTED, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* bad result code */
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
buf[5] = 4;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PARAMETER_OUT_OF_RANGE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* utf-8 string with zero symbol inside */
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 1,
&error_header_marker, &test_error_class, &test_error_code,
error_details_string);
zassert_not_equal(len, 0, NULL);
buf[13] = 0;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_INCONSISTENT_PARAMETERS, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* bad payload case 1 */
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 1,
&error_header_marker, &test_error_class, &test_error_code, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 10, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* bad payload case 2 */
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* bad payload case 3 */
memset(buf, 0, buf_len);
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_result(
buf, buf_len, message_id, NULL, NULL, result_bvlc_function, 0, NULL,
NULL, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 7, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_UNEXPECTED_DATA, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_ENCAPSULATED_NPDU)
#else
static void test_ENCAPSULATED_NPDU(void)
#endif
{
uint8_t buf[256];
size_t len;
uint8_t npdu[256];
size_t npdulen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x1789;
int res;
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS dest;
bool ret;
const char *err_desc = NULL;
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
memset(&origin.address, 0x63, BVLC_SC_VMAC_SIZE);
memset(&dest.address, 0x24, BVLC_SC_VMAC_SIZE);
memset(npdu, 0x99, sizeof(npdu));
npdulen = 50;
/* dest and origin absent */
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, NULL, NULL, npdu, npdulen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ENCAPSULATED_NPDU, message_id, NULL, NULL, true,
true, npdulen);
zassert_equal(ret, true, NULL);
zassert_not_equal(message.hdr.payload, 0, NULL);
zassert_equal(message.hdr.payload_len, npdulen, NULL);
res = memcmp(message.hdr.payload, npdu, npdulen);
zassert_equal(res, 0, NULL);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, NULL, NULL, true,
false, npdu, npdulen, true);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, NULL, NULL, false,
true, npdu, npdulen, true);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, NULL, NULL, true, true,
npdu, npdulen, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is presented, dest is absent */
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, &origin, NULL, npdu, npdulen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, NULL,
true, true, npdulen);
zassert_equal(ret, true, NULL);
zassert_not_equal(message.hdr.payload, 0, NULL);
zassert_equal(message.hdr.payload_len, npdulen, NULL);
res = memcmp(message.hdr.payload, npdu, npdulen);
zassert_equal(res, 0, NULL);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, NULL, true,
false, npdu, npdulen, true);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, NULL, false,
true, npdu, npdulen, true);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, NULL, true,
true, npdu, npdulen, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is absent, dest is presented */
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, NULL, &dest, npdu, npdulen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ENCAPSULATED_NPDU, message_id, NULL, &dest, true,
true, npdulen);
zassert_equal(ret, true, NULL);
zassert_not_equal(message.hdr.payload, 0, NULL);
zassert_equal(message.hdr.payload_len, npdulen, NULL);
res = memcmp(message.hdr.payload, npdu, npdulen);
zassert_equal(res, 0, NULL);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, NULL, &dest, true,
false, npdu, npdulen, true);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, NULL, &dest, false,
true, npdu, npdulen, true);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, NULL, &dest, true,
true, npdu, npdulen, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* both dest and origin are presented */
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, &origin, &dest, npdu, npdulen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, &dest,
true, true, npdulen);
zassert_equal(ret, true, NULL);
zassert_not_equal(message.hdr.payload, 0, NULL);
zassert_equal(message.hdr.payload_len, npdulen, NULL);
res = memcmp(message.hdr.payload, npdu, npdulen);
zassert_equal(res, 0, NULL);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, &dest, true,
false, npdu, npdulen, true);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, &dest, false,
true, npdu, npdulen, true);
test_options(
buf, len, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, &dest, true,
true, npdu, npdulen, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, &origin, &dest, npdu, npdulen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 3 */
ret = bvlc_sc_decode_message(
buf, 13, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 4 */
ret = bvlc_sc_decode_message(
buf, 16, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PAYLOAD_EXPECTED, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 5 */
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* zero payload test */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, &origin, &dest, npdu, 0);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PAYLOAD_EXPECTED, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* 1 byte payload test */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, &origin, &dest, npdu, 1);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ENCAPSULATED_NPDU, message_id, &origin, &dest,
true, true, 1);
zassert_equal(ret, true, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_ADDRESS_RESOLUTION)
#else
static void test_ADDRESS_RESOLUTION(void)
#endif
{
uint8_t buf[256];
size_t len;
uint8_t optbuf[256];
size_t optlen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x514a;
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS dest;
bool ret;
const char *err_desc = NULL;
memset(&origin.address, 0x27, BVLC_SC_VMAC_SIZE);
memset(&dest.address, 0xaa, BVLC_SC_VMAC_SIZE);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* dest and origin absent */
len = bvlc_sc_encode_address_resolution(
buf, sizeof(buf), message_id, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION, message_id, NULL, NULL, true,
true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION, message_id, NULL, NULL, true,
false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is presented, dest is absent */
len = bvlc_sc_encode_address_resolution(
buf, sizeof(buf), message_id, &origin, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION, message_id, &origin, NULL,
true, true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION, message_id, &origin, NULL, true,
false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is absent, dest is presented */
len = bvlc_sc_encode_address_resolution(
buf, sizeof(buf), message_id, NULL, &dest);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION, message_id, NULL, &dest, true,
true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION, message_id, NULL, &dest, true,
false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin and dest are presented */
len = bvlc_sc_encode_address_resolution(
buf, sizeof(buf), message_id, &origin, &dest);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION, message_id, &origin, &dest,
true, true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION, message_id, &origin, &dest, true,
false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_address_resolution(
buf, sizeof(buf), message_id, &origin, &dest);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 3 */
ret = bvlc_sc_decode_message(
buf, 13, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 5 */
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* data options test */
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_INCONSISTENT_PARAMETERS, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_ADDRESS_RESOLUTION_ACK)
#else
static void test_ADDRESS_RESOLUTION_ACK(void)
#endif
{
uint8_t buf[256];
size_t len;
uint8_t optbuf[256];
size_t optlen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0xf1d3;
int res;
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS dest;
bool ret;
char web_socket_uris[256];
const char *err_desc = NULL;
web_socket_uris[0] = 0;
sprintf(web_socket_uris, "%s %s", "web_socket_uri1", "web_socket_uri2");
memset(&origin.address, 0x91, BVLC_SC_VMAC_SIZE);
memset(&dest.address, 0xef, BVLC_SC_VMAC_SIZE);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* dest and origin absent */
len = bvlc_sc_encode_address_resolution_ack(
buf, sizeof(buf), message_id, NULL, NULL, (uint8_t *)web_socket_uris,
strlen(web_socket_uris));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, NULL, NULL,
true, true, strlen(web_socket_uris));
zassert_equal(ret, true, NULL);
res = memcmp(message.hdr.payload, web_socket_uris, strlen(web_socket_uris));
zassert_equal(res, 0, NULL);
zassert_not_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string, NULL,
NULL);
zassert_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string_len,
strlen(web_socket_uris), NULL);
zassert_equal(message.hdr.payload_len, strlen(web_socket_uris), NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, NULL, NULL, true,
false, (uint8_t *)web_socket_uris, strlen(web_socket_uris), true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is presented, dest is absent */
len = bvlc_sc_encode_address_resolution_ack(
buf, sizeof(buf), message_id, &origin, NULL, (uint8_t *)web_socket_uris,
strlen(web_socket_uris));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, &origin, NULL,
true, true, strlen(web_socket_uris));
zassert_equal(ret, true, NULL);
res = memcmp(message.hdr.payload, web_socket_uris, strlen(web_socket_uris));
zassert_equal(res, 0, NULL);
zassert_not_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string, NULL,
NULL);
zassert_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string_len,
strlen(web_socket_uris), NULL);
zassert_equal(message.hdr.payload_len, strlen(web_socket_uris), NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, &origin, NULL,
true, false, (uint8_t *)web_socket_uris, strlen(web_socket_uris), true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is absent, dest is presented */
len = bvlc_sc_encode_address_resolution_ack(
buf, sizeof(buf), message_id, NULL, &dest, (uint8_t *)web_socket_uris,
strlen(web_socket_uris));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, NULL, &dest,
true, true, strlen(web_socket_uris));
zassert_equal(ret, true, NULL);
res = memcmp(message.hdr.payload, web_socket_uris, strlen(web_socket_uris));
zassert_equal(res, 0, NULL);
zassert_not_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string, NULL,
NULL);
zassert_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string_len,
strlen(web_socket_uris), NULL);
zassert_equal(message.hdr.payload_len, strlen(web_socket_uris), NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, NULL, &dest, true,
false, (uint8_t *)web_socket_uris, strlen(web_socket_uris), true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin and dest are presented */
len = bvlc_sc_encode_address_resolution_ack(
buf, sizeof(buf), message_id, &origin, &dest,
(uint8_t *)web_socket_uris, strlen(web_socket_uris));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, &origin,
&dest, true, true, strlen(web_socket_uris));
zassert_equal(ret, true, NULL);
res = memcmp(message.hdr.payload, web_socket_uris, strlen(web_socket_uris));
zassert_equal(res, 0, NULL);
zassert_not_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string, NULL,
NULL);
zassert_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string_len,
strlen(web_socket_uris), NULL);
zassert_equal(message.hdr.payload_len, strlen(web_socket_uris), NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, &origin, &dest,
true, false, (uint8_t *)web_socket_uris, strlen(web_socket_uris), true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* zero payload test */
len = bvlc_sc_encode_address_resolution_ack(
buf, sizeof(buf), message_id, &origin, &dest, NULL, 0);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, &origin,
&dest, true, true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string, NULL,
NULL);
zassert_equal(
message.payload.address_resolution_ack.utf8_websocket_uri_string_len, 0,
NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADDRESS_RESOLUTION_ACK, message_id, &origin, &dest,
true, false, NULL, 0, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_address_resolution_ack(
buf, sizeof(buf), message_id, &origin, &dest,
(uint8_t *)web_socket_uris, strlen(web_socket_uris));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 3 */
ret = bvlc_sc_decode_message(
buf, 13, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 4 */
ret = bvlc_sc_decode_message(
buf, 15, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 5 */
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* data options test */
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_INCONSISTENT_PARAMETERS, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_ADVERTISIMENT)
#else
static void test_ADVERTISIMENT(void)
#endif
{
uint8_t buf[256];
size_t len;
uint8_t optbuf[256];
size_t optlen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0xe2ad;
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS dest;
bool ret;
BACNET_SC_HUB_CONNECTOR_STATE hub_status =
BACNET_SC_HUB_CONNECTOR_STATE_CONNECTED_TO_PRIMARY;
BVLC_SC_DIRECT_CONNECTION_SUPPORT support =
BVLC_SC_DIRECT_CONNECTION_ACCEPT_SUPPORTED;
uint16_t max_bvlc_len = 567;
uint16_t max_npdu_len = 1323;
const char *err_desc = NULL;
memset(&origin.address, 0xe1, BVLC_SC_VMAC_SIZE);
memset(&dest.address, 0x4f, BVLC_SC_VMAC_SIZE);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* dest and origin absent */
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, NULL, NULL, hub_status, support,
max_bvlc_len, max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADVERTISIMENT, message_id, NULL, NULL, true, true,
6);
zassert_equal(ret, true, NULL);
zassert_equal(message.payload.advertisiment.hub_status, hub_status, NULL);
zassert_equal(message.payload.advertisiment.support, support, NULL);
zassert_equal(
message.payload.advertisiment.max_bvlc_len, max_bvlc_len, NULL);
zassert_equal(
message.payload.advertisiment.max_npdu_len, max_npdu_len, NULL);
test_options(
buf, len, BVLC_SC_ADVERTISIMENT, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is presented, dest is absent */
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, &origin, NULL, hub_status, support,
max_bvlc_len, max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADVERTISIMENT, message_id, &origin, NULL, true,
true, 6);
zassert_equal(ret, true, NULL);
zassert_equal(message.payload.advertisiment.hub_status, hub_status, NULL);
zassert_equal(message.payload.advertisiment.support, support, NULL);
zassert_equal(
message.payload.advertisiment.max_bvlc_len, max_bvlc_len, NULL);
zassert_equal(
message.payload.advertisiment.max_npdu_len, max_npdu_len, NULL);
test_options(
buf, len, BVLC_SC_ADVERTISIMENT, message_id, &origin, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is absent, dest is presented */
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, NULL, &dest, hub_status, support,
max_bvlc_len, max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADVERTISIMENT, message_id, NULL, &dest, true,
true, 6);
zassert_equal(ret, true, NULL);
zassert_equal(message.payload.advertisiment.hub_status, hub_status, NULL);
zassert_equal(message.payload.advertisiment.support, support, NULL);
zassert_equal(
message.payload.advertisiment.max_bvlc_len, max_bvlc_len, NULL);
zassert_equal(
message.payload.advertisiment.max_npdu_len, max_npdu_len, NULL);
test_options(
buf, len, BVLC_SC_ADVERTISIMENT, message_id, NULL, &dest, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin and dest are presented */
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, &origin, &dest, hub_status, support,
max_bvlc_len, max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADVERTISIMENT, message_id, &origin, &dest, true,
true, 6);
zassert_equal(ret, true, NULL);
zassert_equal(message.payload.advertisiment.hub_status, hub_status, NULL);
zassert_equal(message.payload.advertisiment.support, support, NULL);
zassert_equal(
message.payload.advertisiment.max_bvlc_len, max_bvlc_len, NULL);
zassert_equal(
message.payload.advertisiment.max_npdu_len, max_npdu_len, NULL);
test_options(
buf, len, BVLC_SC_ADVERTISIMENT, message_id, &origin, &dest, true,
false, message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, &origin, &dest, hub_status, support,
max_bvlc_len, max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 3 */
ret = bvlc_sc_decode_message(
buf, 13, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 4 */
ret = bvlc_sc_decode_message(
buf, 15, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 5 */
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* bad hub connection param */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, NULL, NULL, 5, support, max_bvlc_len,
max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PARAMETER_OUT_OF_RANGE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* bad support param */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, NULL, NULL, hub_status, 4, max_bvlc_len,
max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PARAMETER_OUT_OF_RANGE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* payload len < 6 */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, NULL, NULL, hub_status, support,
max_bvlc_len, max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* zero payload test */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, NULL, NULL, hub_status, support,
max_bvlc_len, max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PAYLOAD_EXPECTED, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* data options presented */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_advertisiment(
buf, sizeof(buf), message_id, NULL, NULL, hub_status, support,
max_bvlc_len, max_npdu_len);
zassert_not_equal(len, 0, NULL);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_INCONSISTENT_PARAMETERS, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_ADVERTISIMENT_SOLICITATION)
#else
static void test_ADVERTISIMENT_SOLICITATION(void)
#endif
{
uint8_t buf[256];
size_t len;
uint8_t optbuf[256];
size_t optlen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0xaf4a;
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS dest;
bool ret;
const char *err_desc = NULL;
memset(&origin.address, 0x17, BVLC_SC_VMAC_SIZE);
memset(&dest.address, 0x1a, BVLC_SC_VMAC_SIZE);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* dest and origin absent */
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), message_id, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADVERTISIMENT_SOLICITATION, message_id, NULL,
NULL, true, true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADVERTISIMENT_SOLICITATION, message_id, NULL, NULL,
true, false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is presented, dest is absent */
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), message_id, &origin, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADVERTISIMENT_SOLICITATION, message_id, &origin,
NULL, true, true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADVERTISIMENT_SOLICITATION, message_id, &origin, NULL,
true, false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is absent, dest is presented */
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), message_id, NULL, &dest);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADVERTISIMENT_SOLICITATION, message_id, NULL,
&dest, true, true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADVERTISIMENT_SOLICITATION, message_id, NULL, &dest,
true, false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin and dest are presented */
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), message_id, &origin, &dest);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_ADVERTISIMENT_SOLICITATION, message_id, &origin,
&dest, true, true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_ADVERTISIMENT_SOLICITATION, message_id, &origin,
&dest, true, false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), message_id, &origin, &dest);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 3 */
ret = bvlc_sc_decode_message(
buf, 13, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 5 */
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* data options test */
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_INCONSISTENT_PARAMETERS, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_CONNECT_REQUEST)
#else
static void test_CONNECT_REQUEST(void)
#endif
{
uint8_t buf[256];
size_t len;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x41af;
int res;
bool ret;
uint16_t max_bvlc_len = 9997;
uint16_t max_npdu_len = 3329;
BACNET_SC_VMAC_ADDRESS local_vmac;
BACNET_SC_UUID local_uuid;
const char *err_desc = NULL;
memset(&local_vmac, 0x88, sizeof(local_vmac));
memset(&local_uuid, 0x22, sizeof(local_uuid));
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_connect_request(
buf, sizeof(buf), message_id, &local_vmac, &local_uuid, max_bvlc_len,
max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_CONNECT_REQUEST, message_id, NULL, NULL, true,
true, 26);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload_len, 26, NULL);
res = memcmp(
message.payload.connect_request.vmac, &local_vmac, BVLC_SC_VMAC_SIZE);
zassert_equal(res, 0, NULL);
res = memcmp(
message.payload.connect_request.uuid, &local_uuid, BVLC_SC_VMAC_SIZE);
zassert_equal(res, 0, NULL);
zassert_equal(
message.payload.connect_request.max_bvlc_len, max_bvlc_len, NULL);
zassert_equal(
message.payload.connect_request.max_npdu_len, max_npdu_len, NULL);
test_options(
buf, len, BVLC_SC_CONNECT_REQUEST, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_connect_request(
buf, sizeof(buf), message_id, &local_vmac, &local_uuid, max_bvlc_len,
max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 3 */
ret = bvlc_sc_decode_message(
buf, 13, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 5 */
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PAYLOAD_EXPECTED, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* message has dest */
buf[1] |= BVLC_SC_CONTROL_DEST_VADDR;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* message has origin */
buf[1] |= BVLC_SC_CONTROL_ORIG_VADDR;
buf[1] &= ~BVLC_SC_CONTROL_DEST_VADDR;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* message has both dest and orign */
buf[1] |= BVLC_SC_CONTROL_ORIG_VADDR;
buf[1] |= BVLC_SC_CONTROL_DEST_VADDR;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_CONNECT_ACCEPT)
#else
static void test_CONNECT_ACCEPT(void)
#endif
{
uint8_t buf[256];
size_t len;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x0203;
int res;
bool ret;
uint16_t max_bvlc_len = 1027;
uint16_t max_npdu_len = 22;
BACNET_SC_VMAC_ADDRESS local_vmac;
BACNET_SC_UUID local_uuid;
const char *err_desc = NULL;
memset(&local_vmac, 0x33, sizeof(local_vmac));
memset(&local_uuid, 0x11, sizeof(local_uuid));
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_connect_accept(
buf, sizeof(buf), message_id, &local_vmac, &local_uuid, max_bvlc_len,
max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_CONNECT_ACCEPT, message_id, NULL, NULL, true,
true, 26);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload_len, 26, NULL);
res = memcmp(
message.payload.connect_accept.vmac, &local_vmac, BVLC_SC_VMAC_SIZE);
zassert_equal(res, 0, NULL);
res = memcmp(
message.payload.connect_accept.uuid, &local_uuid, BVLC_SC_VMAC_SIZE);
zassert_equal(res, 0, NULL);
zassert_equal(
message.payload.connect_accept.max_bvlc_len, max_bvlc_len, NULL);
zassert_equal(
message.payload.connect_accept.max_npdu_len, max_npdu_len, NULL);
test_options(
buf, len, BVLC_SC_CONNECT_ACCEPT, message_id, NULL, NULL, true, false,
message.hdr.payload, message.hdr.payload_len, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_connect_accept(
buf, sizeof(buf), message_id, &local_vmac, &local_uuid, max_bvlc_len,
max_npdu_len);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 3 */
ret = bvlc_sc_decode_message(
buf, 13, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 5 */
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PAYLOAD_EXPECTED, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* message has dest */
buf[1] |= BVLC_SC_CONTROL_DEST_VADDR;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* message has origin */
buf[1] |= BVLC_SC_CONTROL_ORIG_VADDR;
buf[1] &= ~BVLC_SC_CONTROL_DEST_VADDR;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* message has both dest and orign */
buf[1] |= BVLC_SC_CONTROL_ORIG_VADDR;
buf[1] |= BVLC_SC_CONTROL_DEST_VADDR;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_DISCONNECT_REQUEST)
#else
static void test_DISCONNECT_REQUEST(void)
#endif
{
uint8_t buf[256];
size_t len;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x0203;
bool ret;
const char *err_desc = NULL;
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_disconnect_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_DISCONNECT_REQUEST, message_id, NULL, NULL, true,
true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_DISCONNECT_REQUEST, message_id, NULL, NULL, true,
false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_disconnect_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_UNEXPECTED_DATA, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
ret = bvlc_sc_decode_message(
buf, 3, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_DISCARD, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_DISCONNECT_ACK)
#else
static void test_DISCONNECT_ACK(void)
#endif
{
uint8_t buf[256];
size_t len;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x0203;
bool ret;
const char *err_desc = NULL;
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_disconnect_ack(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_DISCONNECT_ACK, message_id, NULL, NULL, true,
true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_DISCONNECT_ACK, message_id, NULL, NULL, true, false,
NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_disconnect_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_UNEXPECTED_DATA, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
ret = bvlc_sc_decode_message(
buf, 3, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_DISCARD, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_HEARTBEAT_REQUEST)
#else
static void test_HEARTBEAT_REQUEST(void)
#endif
{
uint8_t buf[256];
size_t len;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x0203;
bool ret;
const char *err_desc = NULL;
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_HEARTBEAT_REQUEST, message_id, NULL, NULL, true,
true, 0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_HEARTBEAT_REQUEST, message_id, NULL, NULL, true,
false, NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_disconnect_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_UNEXPECTED_DATA, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
ret = bvlc_sc_decode_message(
buf, 3, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_DISCARD, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_HEARTBEAT_ACK)
#else
static void test_HEARTBEAT_ACK(void)
#endif
{
uint8_t buf[256];
size_t len;
uint8_t optbuf[256];
size_t optlen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x0203;
bool ret;
const char *err_desc = NULL;
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
len = bvlc_sc_encode_heartbeat_ack(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_HEARTBEAT_ACK, message_id, NULL, NULL, true, true,
0);
zassert_equal(ret, true, NULL);
zassert_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 0, NULL);
test_options(
buf, len, BVLC_SC_HEARTBEAT_ACK, message_id, NULL, NULL, true, false,
NULL, 0, false);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_heartbeat_ack(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_UNEXPECTED_DATA, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
ret = bvlc_sc_decode_message(
buf, 3, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_DISCARD, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* data options test */
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_INCONSISTENT_PARAMETERS, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_PROPRIETARY_MESSAGE)
#else
static void test_PROPRIETARY_MESSAGE(void)
#endif
{
uint8_t buf[256];
size_t len;
uint8_t optbuf[256];
size_t optlen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x4455;
int res;
bool ret;
uint8_t proprietary_function = 0xea;
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS dest;
uint16_t vendor_id = 0xaabb;
uint8_t data[34];
const char *err_desc = NULL;
memset(data, 0x66, sizeof(data));
memset(&origin.address, 0x2f, BVLC_SC_VMAC_SIZE);
memset(&dest.address, 0xf3, BVLC_SC_VMAC_SIZE);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* dest and origin absent */
len = bvlc_sc_encode_proprietary_message(
buf, sizeof(buf), message_id, NULL, NULL, vendor_id,
proprietary_function, data, sizeof(data));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_PROPRIETARY_MESSAGE, message_id, NULL, NULL, true,
true, 3 + sizeof(data));
zassert_equal(ret, true, NULL);
zassert_not_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 3 + sizeof(data), NULL);
zassert_equal(message.payload.proprietary.vendor_id, vendor_id, NULL);
zassert_equal(
message.payload.proprietary.function, proprietary_function, NULL);
zassert_equal(message.payload.proprietary.data_len, sizeof(data), NULL);
res = memcmp(message.payload.proprietary.data, data, sizeof(data));
zassert_equal(res, 0, NULL);
test_options(
buf, len, BVLC_SC_PROPRIETARY_MESSAGE, message_id, NULL, NULL, true,
false, message.hdr.payload, message.hdr.payload_len, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is presented, dest is absent */
len = bvlc_sc_encode_proprietary_message(
buf, sizeof(buf), message_id, &origin, NULL, vendor_id,
proprietary_function, data, sizeof(data));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_PROPRIETARY_MESSAGE, message_id, &origin, NULL,
true, true, 3 + sizeof(data));
zassert_equal(ret, true, NULL);
zassert_not_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 3 + sizeof(data), NULL);
zassert_equal(message.payload.proprietary.vendor_id, vendor_id, NULL);
zassert_equal(
message.payload.proprietary.function, proprietary_function, NULL);
zassert_equal(message.payload.proprietary.data_len, sizeof(data), NULL);
res = memcmp(message.payload.proprietary.data, data, sizeof(data));
zassert_equal(res, 0, NULL);
test_options(
buf, len, BVLC_SC_PROPRIETARY_MESSAGE, message_id, &origin, NULL, true,
false, message.hdr.payload, message.hdr.payload_len, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin is absent, dest is presented */
len = bvlc_sc_encode_proprietary_message(
buf, sizeof(buf), message_id, NULL, &dest, vendor_id,
proprietary_function, data, sizeof(data));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_PROPRIETARY_MESSAGE, message_id, NULL, &dest,
true, true, 3 + sizeof(data));
zassert_equal(ret, true, NULL);
zassert_not_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 3 + sizeof(data), NULL);
zassert_equal(message.payload.proprietary.vendor_id, vendor_id, NULL);
zassert_equal(
message.payload.proprietary.function, proprietary_function, NULL);
zassert_equal(message.payload.proprietary.data_len, sizeof(data), NULL);
res = memcmp(message.payload.proprietary.data, data, sizeof(data));
zassert_equal(res, 0, NULL);
test_options(
buf, len, BVLC_SC_PROPRIETARY_MESSAGE, message_id, NULL, &dest, true,
false, message.hdr.payload, message.hdr.payload_len, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* origin and dest are presented */
len = bvlc_sc_encode_proprietary_message(
buf, sizeof(buf), message_id, &origin, &dest, vendor_id,
proprietary_function, data, sizeof(data));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = verify_bsc_bvll_header(
&message.hdr, BVLC_SC_PROPRIETARY_MESSAGE, message_id, &origin, &dest,
true, true, 3 + sizeof(data));
zassert_equal(ret, true, NULL);
zassert_not_equal(message.hdr.payload, NULL, NULL);
zassert_equal(message.hdr.payload_len, 3 + sizeof(data), NULL);
zassert_equal(message.payload.proprietary.vendor_id, vendor_id, NULL);
zassert_equal(
message.payload.proprietary.function, proprietary_function, NULL);
zassert_equal(message.payload.proprietary.data_len, sizeof(data), NULL);
res = memcmp(message.payload.proprietary.data, data, sizeof(data));
zassert_equal(res, 0, NULL);
test_options(
buf, len, BVLC_SC_PROPRIETARY_MESSAGE, message_id, &origin, &dest, true,
false, message.hdr.payload, message.hdr.payload_len, true);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_proprietary_message(
buf, sizeof(buf), message_id, &origin, &dest, vendor_id,
proprietary_function, data, sizeof(data));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 5, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 2 */
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 3 */
ret = bvlc_sc_decode_message(
buf, 13, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* truncated message, case 5 */
ret = bvlc_sc_decode_message(
buf, 18, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* data options test */
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_INCONSISTENT_PARAMETERS, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* zero payload test */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message, case 1 */
len = bvlc_sc_encode_proprietary_message(
buf, sizeof(buf), message_id, NULL, NULL, vendor_id,
proprietary_function, data, sizeof(data));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_PAYLOAD_EXPECTED, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* zero payload test */
ret = bvlc_sc_decode_message(
buf, 7, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
zassert_equal(message.payload.proprietary.vendor_id, vendor_id, NULL);
zassert_equal(
message.payload.proprietary.function, proprietary_function, NULL);
zassert_equal(message.payload.proprietary.data_len, 0, NULL);
zassert_equal(message.payload.proprietary.data, NULL, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_BAD_HEADER_OPTIONS)
#else
static void test_BAD_HEADER_OPTIONS(void)
#endif
{
uint8_t buf[256];
uint8_t optbuf[256];
uint8_t npdu[256];
uint16_t npdulen;
size_t len;
size_t optlen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x0203;
bool ret;
uint16_t vendor_id1;
uint8_t proprietary_option_type1;
uint8_t proprietary_data1[17];
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS dest;
const char *err_desc = NULL;
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* form secure path option with data flag enabled (which is incorrect ) */
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
buf[4] |= BVLC_SC_HEADER_DATA;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
/* form unknown header option */
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
buf[4] |= 2;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* form unknown header option */
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
optlen = bvlc_sc_encode_secure_path_option(optbuf, sizeof(optbuf), true);
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
buf[4] |= 2;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_HEADER_ENCODING_ERROR, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated proprietary option, case 1 */
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
ret = bvlc_sc_decode_message(
buf, 6, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated proprietary option, case 2 */
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
ret = bvlc_sc_decode_message(
buf, 9, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message with destination options */
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, 4, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_MESSAGE_INCOMPLETE, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* call add option func with bad parameters */
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_not_equal(optlen, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), NULL, len, optbuf, optlen);
zassert_equal(len, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, 3, optbuf, optlen);
zassert_equal(len, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, 64000, optbuf, 64000);
zassert_equal(len, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, 100, buf, 120, optbuf, optlen);
zassert_equal(len, 0, NULL);
len = bvlc_sc_add_option_to_destination_options(
buf, 101, buf, 100, optbuf, optlen);
zassert_equal(len, 0, NULL);
optbuf[0] |= BVLC_SC_HEADER_MORE;
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, 20, optbuf, optlen);
zassert_equal(len, 0, NULL);
optbuf[0] = 23;
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, 20, optbuf, optlen);
zassert_equal(len, 0, NULL);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* truncated message with destination options */
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_not_equal(len, 0, NULL);
buf[4] = 23;
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_equal(len, 0, NULL);
/* message with incorrect dest options */
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), message_id);
zassert_not_equal(len, 0, NULL);
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
len = bvlc_sc_add_option_to_destination_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
buf[4] = 23;
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, len, optbuf, optlen);
zassert_equal(len, 0, NULL);
/* one more incorrect call to add options */
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
memset(&origin.address, 0x63, BVLC_SC_VMAC_SIZE);
memset(&dest.address, 0x24, BVLC_SC_VMAC_SIZE);
memset(npdu, 0x99, sizeof(npdu));
npdulen = 50;
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, &origin, &dest, npdu, npdulen);
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
len = bvlc_sc_add_option_to_data_options(
buf, sizeof(buf), buf, 4, optbuf, optlen);
zassert_equal(len, 0, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_BAD_ENCODE_PARAMS)
#else
static void test_BAD_ENCODE_PARAMS(void)
#endif
{
uint8_t buf[256];
uint8_t optbuf[256];
uint8_t npdu[256];
uint16_t npdulen;
size_t len;
size_t optlen;
BVLC_SC_DECODED_MESSAGE message;
uint16_t message_id = 0x0203;
uint16_t vendor_id1;
uint8_t proprietary_option_type1;
uint8_t proprietary_data1[17];
BACNET_SC_VMAC_ADDRESS origin;
BACNET_SC_VMAC_ADDRESS dest;
uint8_t error_header_marker = 0xcc;
uint16_t error_class = 0xaa;
uint16_t error_code = 0xdd;
const char *error_details_string = "something bad has happend";
BACNET_SC_VMAC_ADDRESS local_vmac;
BACNET_SC_UUID local_uuid;
uint8_t data[34];
uint8_t proprietary_function = 0xea;
memset(data, 0x66, sizeof(data));
memset(&local_uuid, 0x22, sizeof(local_uuid));
memset(&local_vmac, 0x42, sizeof(local_vmac));
memset(&origin.address, 0x63, BVLC_SC_VMAC_SIZE);
memset(&dest.address, 0x24, BVLC_SC_VMAC_SIZE);
memset(npdu, 0x99, sizeof(npdu));
npdulen = 50;
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
vendor_id1 = 0xdead;
proprietary_option_type1 = 0x77;
memset(proprietary_data1, 0x99, sizeof(proprietary_data1));
/* case 1 */
optlen = bvlc_sc_encode_proprietary_option(
optbuf, sizeof(optbuf), true, vendor_id1, proprietary_option_type1,
proprietary_data1, BVLC_SC_NPDU_SIZE - 3);
zassert_equal(optlen, 0, NULL);
/* case 2 */
optlen = bvlc_sc_encode_proprietary_option(
optbuf, 3, true, vendor_id1, proprietary_option_type1,
proprietary_data1, sizeof(proprietary_data1));
zassert_equal(optlen, 0, NULL);
/* case 3 */
optlen = bvlc_sc_encode_secure_path_option(optbuf, 0, true);
zassert_equal(optlen, 0, NULL);
/* case 4 */
len = bvlc_sc_encode_heartbeat_request(buf, 3, message_id);
zassert_equal(len, 0, NULL);
/* case 5 */
len = bvlc_sc_encode_heartbeat_request(buf, 3, message_id);
zassert_equal(len, 0, NULL);
/* case 6 */
len = bvlc_sc_encode_encapsulated_npdu(
buf, 5, message_id, &origin, NULL, npdu, npdulen);
zassert_equal(len, 0, NULL);
/* case 7 */
len = bvlc_sc_encode_encapsulated_npdu(
buf, 6 + BVLC_SC_VMAC_SIZE, message_id, &origin, &dest, npdu, npdulen);
zassert_equal(len, 0, NULL);
/* case 8 */
len = bvlc_sc_encode_result(
buf, sizeof(buf), message_id, &origin, &dest, 99, 0, NULL, NULL, NULL,
NULL);
zassert_equal(len, 0, NULL);
/* case 9 */
len = bvlc_sc_encode_result(
buf, sizeof(buf), message_id, &origin, &dest, 1, 4, NULL, NULL, NULL,
NULL);
zassert_equal(len, 0, NULL);
/* case 9 */
len = bvlc_sc_encode_result(
buf, sizeof(buf), message_id, &origin, &dest, 1, 1, NULL, NULL, NULL,
NULL);
zassert_equal(len, 0, NULL);
/* case 10 */
len = bvlc_sc_encode_result(
buf, 3, message_id, &origin, &dest, 1, 0, NULL, NULL, NULL, NULL);
zassert_equal(len, 0, NULL);
/* case 11 */
len = bvlc_sc_encode_result(
buf, 5, message_id, NULL, NULL, 1, 0, NULL, NULL, NULL, NULL);
zassert_equal(len, 0, NULL);
/* case 12 */
len = bvlc_sc_encode_result(
buf, 7, message_id, NULL, NULL, 1, 0, (uint8_t *)1, NULL, NULL, NULL);
zassert_equal(len, 0, NULL);
/* case 13 */
len = bvlc_sc_encode_result(
buf, 7, message_id, NULL, NULL, 1, 1, &error_header_marker,
&error_class, &error_code, error_details_string);
zassert_equal(len, 0, NULL);
/* case 13 */
len = bvlc_sc_encode_result(
buf, 12, message_id, NULL, NULL, 1, 1, &error_header_marker,
&error_class, &error_code, error_details_string);
zassert_equal(len, 0, NULL);
/* case 14 */
len = bvlc_sc_encode_encapsulated_npdu(
buf, 3, message_id, NULL, NULL, npdu, npdulen);
zassert_equal(len, 0, NULL);
/* case 15 */
len = bvlc_sc_encode_encapsulated_npdu(
buf, 6, message_id, NULL, NULL, npdu, npdulen);
zassert_equal(len, 0, NULL);
/* case 16 */
len = bvlc_sc_encode_address_resolution_ack(
buf, 3, message_id, NULL, NULL, NULL, 0);
zassert_equal(len, 0, NULL);
/* case 17 */
len = bvlc_sc_encode_advertisiment(
buf, 3, message_id, NULL, NULL, 1, 1, 1, 1);
zassert_equal(len, 0, NULL);
/* case 18 */
len = bvlc_sc_encode_connect_request(
buf, sizeof(buf), message_id, NULL, NULL, 1, 1);
zassert_equal(len, 0, NULL);
/* case 19 */
len = bvlc_sc_encode_connect_request(
buf, 3, message_id, &local_vmac, &local_uuid, 1, 1);
zassert_equal(len, 0, NULL);
/* case 20 */
len = bvlc_sc_encode_connect_request(
buf, 5, message_id, &local_vmac, &local_uuid, 1, 1);
zassert_equal(len, 0, NULL);
/* case 21 */
len = bvlc_sc_encode_connect_accept(
buf, sizeof(buf), message_id, NULL, NULL, 1, 1);
zassert_equal(len, 0, NULL);
/* case 22 */
len = bvlc_sc_encode_connect_accept(
buf, 3, message_id, &local_vmac, &local_uuid, 1, 1);
zassert_equal(len, 0, NULL);
/* case 23 */
len = bvlc_sc_encode_connect_accept(
buf, 5, message_id, &local_vmac, &local_uuid, 1, 1);
zassert_equal(len, 0, NULL);
/* case 24 */
len = bvlc_sc_encode_proprietary_message(
buf, 3, message_id, NULL, NULL, vendor_id1, proprietary_function, data,
sizeof(data));
zassert_equal(len, 0, NULL);
/* case 25 */
len = bvlc_sc_encode_proprietary_message(
buf, 5, message_id, NULL, NULL, vendor_id1, proprietary_function, data,
sizeof(data));
zassert_equal(len, 0, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_BAD_DECODE_PARAMS)
#else
static void test_BAD_DECODE_PARAMS(void)
#endif
{
uint8_t buf[256];
uint8_t npdu[256];
uint16_t npdulen = 50;
size_t len;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
uint16_t message_id = 0x0203;
bool ret;
const char *err_desc = NULL;
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
/* case 1 */
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), message_id, NULL, NULL, npdu, npdulen);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, NULL, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
/* case 2 */
buf[0] = 99;
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, false, NULL);
zassert_equal(error_code, ERROR_CODE_BVLC_FUNCTION_UNKNOWN, NULL);
zassert_equal(error_class, ERROR_CLASS_COMMUNICATION, NULL);
memset(buf, 0, sizeof(buf));
memset(&message, 0, sizeof(message));
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bvlc_sc_tests, test_BROADCAST)
#else
static void test_BROADCAST(void)
#endif
{
uint8_t buf[256];
size_t len;
BACNET_SC_VMAC_ADDRESS dest;
BACNET_SC_VMAC_ADDRESS orig;
bool ret;
uint8_t *pdu;
BVLC_SC_DECODED_MESSAGE message;
uint16_t error_code;
uint16_t error_class;
const char *err_desc = NULL;
BACNET_SC_UUID uuid = { { 0x34 } };
memset(&dest.address, 0xFF, sizeof(dest.address));
memset(&orig.address, 0x12, sizeof(orig.address));
ret = bvlc_sc_is_vmac_broadcast(&dest);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_is_vmac_broadcast(&orig);
zassert_equal(ret, false, NULL);
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), 0xF00D, &orig, &orig);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_pdu_has_dest_broadcast(buf, len);
zassert_equal(ret, false, NULL);
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), 0xF00D, &orig, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_pdu_has_dest_broadcast(buf, len);
zassert_equal(ret, false, NULL);
len = bvlc_sc_encode_disconnect_ack(buf, sizeof(buf), 0xF00D);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_pdu_has_dest_broadcast(buf, len);
zassert_equal(ret, false, NULL);
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), 0xF00D, NULL, &orig);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_pdu_has_dest_broadcast(buf, len);
zassert_equal(ret, false, NULL);
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), 0xF00D, NULL, &dest);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_pdu_has_dest_broadcast(buf, len);
zassert_equal(ret, true, NULL);
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), 0xF00D, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_pdu_has_dest_broadcast(buf, len);
zassert_equal(ret, false, NULL);
pdu = buf;
len = bvlc_sc_set_orig(&pdu, len, &orig);
zassert_equal(len, 4, NULL);
len = bvlc_sc_remove_orig_and_dest(&pdu, len);
zassert_equal(len, 4, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, true, NULL);
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), 0xF00D, NULL, &dest);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, false, NULL);
len = bvlc_sc_encode_connect_request(
buf, sizeof(buf), 0xF00D, &orig, &uuid, 1000, 1000);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, true, NULL);
len = bvlc_sc_encode_connect_accept(
buf, sizeof(buf), 0xF00D, &orig, &uuid, 1000, 1000);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, false, NULL);
len = bvlc_sc_encode_disconnect_request(buf, sizeof(buf), 0xF00D);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, true, NULL);
len = bvlc_sc_encode_encapsulated_npdu(
buf, sizeof(buf), 0xF00D, NULL, NULL, (uint8_t *)&orig, sizeof(orig));
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, true, NULL);
len = bvlc_sc_encode_proprietary_message(
buf, sizeof(buf), 0xF00D, NULL, NULL, 123, 123, NULL, 0);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, false, NULL);
len = bvlc_sc_encode_heartbeat_request(buf, sizeof(buf), 0xF00D);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, true, NULL);
len =
bvlc_sc_encode_address_resolution(buf, sizeof(buf), 0xF00D, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, true, NULL);
len = bvlc_sc_encode_advertisiment_solicitation(
buf, sizeof(buf), 0xF00D, NULL, NULL);
zassert_not_equal(len, 0, NULL);
ret = bvlc_sc_decode_message(
buf, len, &message, &error_code, &error_class, &err_desc);
zassert_equal(ret, true, NULL);
ret = bvlc_sc_need_send_bvlc_result(&message);
zassert_equal(ret, true, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST_SUITE(bvlc_sc_tests, NULL, NULL, NULL, NULL, NULL);
#else
void test_main(void)
{
ztest_test_suite(
bvlc_sc_tests, ztest_unit_test(test_BVLC_RESULT),
ztest_unit_test(test_ENCAPSULATED_NPDU),
ztest_unit_test(test_ADDRESS_RESOLUTION),
ztest_unit_test(test_ADDRESS_RESOLUTION_ACK),
ztest_unit_test(test_ADVERTISIMENT),
ztest_unit_test(test_ADVERTISIMENT_SOLICITATION),
ztest_unit_test(test_CONNECT_REQUEST),
ztest_unit_test(test_CONNECT_ACCEPT),
ztest_unit_test(test_DISCONNECT_REQUEST),
ztest_unit_test(test_DISCONNECT_ACK),
ztest_unit_test(test_HEARTBEAT_REQUEST),
ztest_unit_test(test_HEARTBEAT_ACK),
ztest_unit_test(test_PROPRIETARY_MESSAGE),
ztest_unit_test(test_BAD_HEADER_OPTIONS),
ztest_unit_test(test_BAD_ENCODE_PARAMS),
ztest_unit_test(test_BAD_DECODE_PARAMS),
ztest_unit_test(test_BROADCAST));
ztest_run_test_suite(bvlc_sc_tests);
}
#endif