bip: decouple broadcast destination port from bind port (#1311)
Co-authored-by: Leunar Kalludra <Leunar.Kalludra@de.bosch.com>
This commit is contained in:
@@ -243,6 +243,7 @@ elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||
list(APPEND testdirs
|
||||
ports/linux/bsc_event
|
||||
ports/linux/bip_subnet
|
||||
ports/bip_broadcast_port
|
||||
)
|
||||
|
||||
elseif(WIN32)
|
||||
@@ -250,12 +251,14 @@ elseif(WIN32)
|
||||
|
||||
list(APPEND testdirs
|
||||
ports/win32/bsc_event
|
||||
ports/bip_broadcast_port
|
||||
)
|
||||
|
||||
elseif(APPLE)
|
||||
message(STATUS "Added ports specific tests for APPLE")
|
||||
list(APPEND testdirs
|
||||
ports/bsd/bsc_event
|
||||
ports/bip_broadcast_port
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -186,6 +186,34 @@ static void test_Initiate_Original_Broadcast_NPDU(void)
|
||||
test_cleanup();
|
||||
}
|
||||
|
||||
static void test_Initiate_Original_Broadcast_NPDU_Uses_Broadcast_Port(void)
|
||||
{
|
||||
uint8_t pdu[MAX_APDU] = { 0 };
|
||||
int npdu_len = 0;
|
||||
int apdu_len = 0;
|
||||
int pdu_len = 0;
|
||||
BACNET_ADDRESS dest = { 0 };
|
||||
BACNET_NPDU_DATA npdu_data = { 0 };
|
||||
|
||||
test_setup();
|
||||
IUT.BIP_Addr.port = 0xBAC1U;
|
||||
IUT.BIP_Broadcast_Addr.port = 0xBAC2U;
|
||||
|
||||
dest.net = BACNET_BROADCAST_NETWORK;
|
||||
npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL);
|
||||
npdu_len = npdu_encode_pdu(&pdu[0], &dest, &IUT.BACnet_Address, &npdu_data);
|
||||
apdu_len = iam_encode_apdu(
|
||||
&pdu[npdu_len], IUT.Device_ID, MAX_APDU, SEGMENTATION_NONE,
|
||||
BACNET_VENDOR_ID);
|
||||
pdu_len = npdu_len + apdu_len;
|
||||
bvlc_send_pdu(&dest, &npdu_data, pdu, pdu_len);
|
||||
|
||||
assert(Test_Sent_Message_Type == BVLC_ORIGINAL_BROADCAST_NPDU);
|
||||
assert(Test_Sent_Message_Dest.port == IUT.BIP_Broadcast_Addr.port);
|
||||
assert(Test_Sent_Message_Dest.port != IUT.BIP_Addr.port);
|
||||
test_cleanup();
|
||||
}
|
||||
|
||||
static void test_BBMD_Result(void)
|
||||
{
|
||||
int result = 0;
|
||||
@@ -232,6 +260,7 @@ int main(void)
|
||||
/* individual tests */
|
||||
test_BBMD_Result();
|
||||
test_Initiate_Original_Broadcast_NPDU();
|
||||
test_Initiate_Original_Broadcast_NPDU_Uses_Broadcast_Port();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -80,6 +80,11 @@ void bip_set_port(uint16_t port)
|
||||
ztest_check_expected_value(port);
|
||||
}
|
||||
|
||||
void bip_set_broadcast_port(uint16_t port)
|
||||
{
|
||||
ztest_check_expected_value(port);
|
||||
}
|
||||
|
||||
bool bip_port_changed(void)
|
||||
{
|
||||
return ztest_get_return_value();
|
||||
@@ -90,6 +95,11 @@ uint16_t bip_get_port(void)
|
||||
return ztest_get_return_value();
|
||||
}
|
||||
|
||||
uint16_t bip_get_broadcast_port(void)
|
||||
{
|
||||
return ztest_get_return_value();
|
||||
}
|
||||
|
||||
bool bip_set_addr(const BACNET_IP_ADDRESS *addr)
|
||||
{
|
||||
ztest_check_expected_data(addr, sizeof(BACNET_IP_ADDRESS));
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
|
||||
get_filename_component(basename ${CMAKE_CURRENT_SOURCE_DIR} NAME)
|
||||
|
||||
project(test_${basename}
|
||||
VERSION 1.0.0
|
||||
LANGUAGES C)
|
||||
|
||||
string(REGEX REPLACE
|
||||
"/test/ports/[a-zA-Z_/-]*$"
|
||||
"/src"
|
||||
SRC_DIR
|
||||
${CMAKE_CURRENT_SOURCE_DIR})
|
||||
string(REGEX REPLACE
|
||||
"/test/ports/[a-zA-Z_/-]*$"
|
||||
"/ports"
|
||||
PORTS_DIR
|
||||
${CMAKE_CURRENT_SOURCE_DIR})
|
||||
string(REGEX REPLACE
|
||||
"/test/ports/[a-zA-Z_/-]*$"
|
||||
"/test"
|
||||
TST_DIR
|
||||
${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(ZTST_DIR "${TST_DIR}/ztest/src")
|
||||
|
||||
add_compile_definitions(
|
||||
BACNET_BIG_ENDIAN=0
|
||||
CONFIG_ZTEST=1
|
||||
BACNET_STACK_DEPRECATED_DISABLE=1
|
||||
)
|
||||
|
||||
include_directories(
|
||||
${SRC_DIR}
|
||||
${TST_DIR}/ztest/include
|
||||
)
|
||||
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||
set(PORT_BIP_SOURCE ${PORTS_DIR}/linux/bip-init.c)
|
||||
find_package(Threads REQUIRED)
|
||||
elseif(WIN32)
|
||||
set(PORT_BIP_SOURCE ${PORTS_DIR}/win32/bip-init.c)
|
||||
add_compile_definitions(BACNET_PORT=win32)
|
||||
elseif(APPLE)
|
||||
set(PORT_BIP_SOURCE ${PORTS_DIR}/bsd/bip-init.c)
|
||||
else()
|
||||
message(FATAL_ERROR "bip_broadcast_port test is only supported on Linux, macOS, and Windows")
|
||||
endif()
|
||||
|
||||
add_executable(${PROJECT_NAME}
|
||||
${PORT_BIP_SOURCE}
|
||||
${SRC_DIR}/bacnet/basic/sys/debug.c
|
||||
./src/bvlc_stubs.c
|
||||
./src/main.c
|
||||
${ZTST_DIR}/ztest_mock.c
|
||||
${ZTST_DIR}/ztest.c
|
||||
)
|
||||
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||
target_link_libraries(${PROJECT_NAME} Threads::Threads)
|
||||
elseif(WIN32)
|
||||
target_link_libraries(${PROJECT_NAME} ws2_32)
|
||||
endif()
|
||||
@@ -0,0 +1,48 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#include "bacnet/basic/bbmd/h_bbmd.h"
|
||||
|
||||
int bvlc_handler(
|
||||
BACNET_IP_ADDRESS *addr,
|
||||
BACNET_ADDRESS *src,
|
||||
uint8_t *npdu,
|
||||
uint16_t npdu_len)
|
||||
{
|
||||
(void)addr;
|
||||
(void)src;
|
||||
(void)npdu;
|
||||
(void)npdu_len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bvlc_broadcast_handler(
|
||||
BACNET_IP_ADDRESS *addr,
|
||||
BACNET_ADDRESS *src,
|
||||
uint8_t *npdu,
|
||||
uint16_t npdu_len)
|
||||
{
|
||||
(void)addr;
|
||||
(void)src;
|
||||
(void)npdu;
|
||||
(void)npdu_len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bvlc_send_pdu(
|
||||
const BACNET_ADDRESS *dest,
|
||||
const BACNET_NPDU_DATA *npdu_data,
|
||||
const uint8_t *pdu,
|
||||
unsigned pdu_len)
|
||||
{
|
||||
(void)dest;
|
||||
(void)npdu_data;
|
||||
(void)pdu;
|
||||
(void)pdu_len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bvlc_init(void)
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* @file
|
||||
* @brief Tests for separating BACnet/IP bind and broadcast destination ports
|
||||
* @copyright SPDX-License-Identifier: MIT
|
||||
*/
|
||||
#include <zephyr/ztest.h>
|
||||
#include <bacnet/datalink/bip.h>
|
||||
|
||||
static uint16_t bip_address_port(const BACNET_ADDRESS *address)
|
||||
{
|
||||
return ((uint16_t)address->mac[4] << 8) | address->mac[5];
|
||||
}
|
||||
|
||||
static void test_broadcast_port_defaults_to_bind_port(void)
|
||||
{
|
||||
BACNET_ADDRESS broadcast = { 0 };
|
||||
BACNET_IP_ADDRESS broadcast_addr = { 0 };
|
||||
|
||||
bip_cleanup();
|
||||
bip_set_port(0xBAC1U);
|
||||
|
||||
zassert_equal(bip_get_port(), 0xBAC1U, NULL);
|
||||
zassert_equal(bip_get_broadcast_port(), 0xBAC1U, NULL);
|
||||
|
||||
bip_get_broadcast_address(&broadcast);
|
||||
zassert_equal(bip_address_port(&broadcast), 0xBAC1U, NULL);
|
||||
|
||||
zassert_true(bip_get_broadcast_addr(&broadcast_addr), NULL);
|
||||
zassert_equal(broadcast_addr.port, 0xBAC1U, NULL);
|
||||
}
|
||||
|
||||
static void test_broadcast_port_can_differ_from_bind_port(void)
|
||||
{
|
||||
BACNET_ADDRESS local = { 0 };
|
||||
BACNET_ADDRESS broadcast = { 0 };
|
||||
BACNET_IP_ADDRESS broadcast_addr = { 0 };
|
||||
|
||||
bip_cleanup();
|
||||
bip_set_port(0xBAC1U);
|
||||
bip_set_broadcast_port(0xBAC2U);
|
||||
|
||||
zassert_equal(bip_get_port(), 0xBAC1U, NULL);
|
||||
zassert_equal(bip_get_broadcast_port(), 0xBAC2U, NULL);
|
||||
|
||||
bip_get_my_address(&local);
|
||||
zassert_equal(bip_address_port(&local), 0xBAC1U, NULL);
|
||||
|
||||
bip_get_broadcast_address(&broadcast);
|
||||
zassert_equal(bip_address_port(&broadcast), 0xBAC2U, NULL);
|
||||
|
||||
zassert_true(bip_get_broadcast_addr(&broadcast_addr), NULL);
|
||||
zassert_equal(broadcast_addr.port, 0xBAC2U, NULL);
|
||||
}
|
||||
|
||||
void test_main(void)
|
||||
{
|
||||
ztest_test_suite(
|
||||
bip_broadcast_port_test,
|
||||
ztest_unit_test(test_broadcast_port_defaults_to_bind_port),
|
||||
ztest_unit_test(test_broadcast_port_can_differ_from_bind_port));
|
||||
ztest_run_test_suite(bip_broadcast_port_test);
|
||||
}
|
||||
Reference in New Issue
Block a user