Added Who-Is-Router process for Notification Class recipient unknown router addresses. (#1243)

* Added Who-Is-Router-To-Network process in basic Notification Class when recipient address is missing the router MAC address.

* Added buffer_length parameter to octet string buffer decode functions

* Fixed BACnet address handling for I-Am-Router address updating the recipient list address for the next hop router.

* Changed VMAC encoding and decoding to use octet string buffer API to reduce stack RAM.
This commit is contained in:
Steve Karg
2026-02-25 09:58:38 -06:00
committed by GitHub
parent e11cd319da
commit cf4f62f7e0
14 changed files with 225 additions and 69 deletions
+25 -15
View File
@@ -150,6 +150,12 @@ static void test_BACNET_ADDRESS(void)
zassert_equal(dest.mac_len, 0, NULL);
zassert_equal(dest.len, 0, NULL);
zassert_equal(dest.net, 0, NULL);
/* copy the MAC to the ADR */
bacnet_address_from_ascii(&src, "{192.168.1.1:47808,0,0}");
zassert_equal(src.mac_len, 6, "len=%d", src.mac_len);
bacnet_address_router_set(&dest, &src);
zassert_equal(dest.mac_len, 6, "len=%d", dest.mac_len);
zassert_equal(dest.len, 0, NULL);
}
#if defined(CONFIG_ZTEST_NEW_API)
@@ -282,13 +288,13 @@ static void test_BACnetAddress_Codec(void)
zassert_equal(len, test_len, "len=%d test_len=%d", len, test_len);
test_len = bacnet_address_decode(apdu, sizeof(apdu), &test_value);
zassert_equal(len, test_len, NULL);
zassert_equal(value.net, test_value.net, NULL);
zassert_equal(value.mac_len, test_value.mac_len, NULL);
zassert_equal(value.len, test_value.len, NULL);
zassert_equal(value.len, 3, NULL);
zassert_equal(value.adr[0], test_value.adr[0], NULL);
zassert_equal(value.adr[1], test_value.adr[1], NULL);
zassert_equal(value.adr[2], test_value.adr[2], NULL);
zassert_equal(test_value.net, value.net, NULL);
zassert_equal(test_value.len, value.len, NULL);
zassert_equal(test_value.len, 3, NULL);
zassert_equal(test_value.adr[0], value.adr[0], NULL);
zassert_equal(test_value.adr[1], value.adr[1], NULL);
zassert_equal(test_value.adr[2], value.adr[2], NULL);
zassert_equal(test_value.mac_len, 0, NULL);
/* context tagged */
tag_number = 1;
len = encode_context_bacnet_address(NULL, tag_number, &value);
@@ -299,17 +305,21 @@ static void test_BACnetAddress_Codec(void)
test_len = bacnet_address_context_decode(
apdu, sizeof(apdu), tag_number, &test_value);
zassert_equal(len, test_len, NULL);
zassert_equal(value.net, test_value.net, NULL);
zassert_equal(value.mac_len, test_value.mac_len, NULL);
zassert_equal(value.mac_len, 6, NULL);
zassert_equal(test_value.len, value.len, NULL);
zassert_equal(test_value.len, 3, NULL);
zassert_equal(test_value.adr[0], value.adr[0], NULL);
zassert_equal(test_value.adr[1], value.adr[1], NULL);
zassert_equal(test_value.adr[2], value.adr[2], NULL);
zassert_equal(test_value.mac_len, 0, NULL);
/* validate deprecated function */
test_len = decode_context_bacnet_address(apdu, tag_number, &test_value);
zassert_equal(len, test_len, NULL);
zassert_equal(value.net, test_value.net, NULL);
zassert_equal(value.mac_len, test_value.mac_len, NULL);
zassert_equal(value.mac_len, 6, NULL);
test_len = bacnet_address_context_decode(
apdu, sizeof(apdu), tag_number, &test_value);
zassert_equal(test_value.len, value.len, NULL);
zassert_equal(test_value.len, 3, NULL);
zassert_equal(test_value.adr[0], value.adr[0], NULL);
zassert_equal(test_value.adr[1], value.adr[1], NULL);
zassert_equal(test_value.adr[2], value.adr[2], NULL);
zassert_equal(test_value.mac_len, 0, NULL);
/* negative tests - NULL value */
test_len =
bacnet_address_context_decode(apdu, sizeof(apdu), tag_number, NULL);