From 77a886bbe0831967aa7e18d24a26f3ef0c4f8515 Mon Sep 17 00:00:00 2001 From: David Rebbe Date: Tue, 21 Jul 2026 17:30:21 +0000 Subject: [PATCH] C2: Validate MAC network IDs --- api/icsneoc2/icsneoc2.cpp | 9 +++++++-- examples/c2/device_info/src/main.c | 2 +- include/icsneo/icsneoc2.h | 3 ++- test/unit/icsneoc2.cpp | 25 +++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/api/icsneoc2/icsneoc2.cpp b/api/icsneoc2/icsneoc2.cpp index defe87d..87a2e6a 100644 --- a/api/icsneoc2/icsneoc2.cpp +++ b/api/icsneoc2/icsneoc2.cpp @@ -5,6 +5,7 @@ #include "icsneo/device/devicefinder.h" #include "icsneo/icsneocpp.h" #include "icsneo/communication/io.h" +#include "icsneo/communication/network.h" #include #include @@ -505,14 +506,18 @@ icsneoc2_error_t icsneoc2_device_mac_addresses_enumerate(const icsneoc2_device_t } tail = node; } + *mac_entries = head; return icsneoc2_error_success; } -icsneoc2_error_t icsneoc2_mac_network_id_get(const icsneoc2_mac_addr_entry_t* mac_address, _icsneoc2_netid_t* network_id) { +icsneoc2_error_t icsneoc2_mac_network_id_get(const icsneoc2_mac_addr_entry_t* mac_address, icsneoc2_netid_t* network_id) { if(!mac_address || !network_id) { return icsneoc2_error_invalid_parameters; } - *network_id = static_cast<_icsneoc2_netid_t>(mac_address->network_id); + const auto netid = static_cast(mac_address->network_id); + *network_id = Network::GetCoreMiniNetworkFromNetID(netid).has_value() + ? mac_address->network_id + : static_cast(icsneoc2_netid_invalid); return icsneoc2_error_success; } diff --git a/examples/c2/device_info/src/main.c b/examples/c2/device_info/src/main.c index 1e38722..d9dc331 100644 --- a/examples/c2/device_info/src/main.c +++ b/examples/c2/device_info/src/main.c @@ -112,7 +112,7 @@ int main() { } printf("MACs: %u entr%s\n", mac_count, mac_count == 1 ? "y" : "ies"); for(icsneoc2_mac_addr_entry_t* cur = macs; cur; cur = icsneoc2_mac_addresses_next(cur)) { - _icsneoc2_netid_t network_id; + icsneoc2_netid_t network_id; icsneoc2_mac_network_id_get(cur, &network_id); printf(" Network %-5u ", (unsigned)network_id); uint8_t address[6]; diff --git a/include/icsneo/icsneoc2.h b/include/icsneo/icsneoc2.h index 4f5f9dd..af6372d 100644 --- a/include/icsneo/icsneoc2.h +++ b/include/icsneo/icsneoc2.h @@ -372,10 +372,11 @@ icsneoc2_error_t icsneoc2_device_mac_addresses_enumerate(const icsneoc2_device_t * * @param[in] mac_address The MAC address object to get the network ID of. * @param[out] network_id Pointer to an icsneoc2_netid_t to copy the network ID into. + * Unrecognized values are normalized to icsneoc2_netid_invalid. * * @return icsneoc2_error_t icsneoc2_error success if successful, icsneoc2_error_invalid_parameters on failure. */ -icsneoc2_error_t icsneoc2_mac_network_id_get(const icsneoc2_mac_addr_entry_t* mac_address, _icsneoc2_netid_t* network_id); +icsneoc2_error_t icsneoc2_mac_network_id_get(const icsneoc2_mac_addr_entry_t* mac_address, icsneoc2_netid_t* network_id); /** * Get the MAC Address bytes of a MAC address. diff --git a/test/unit/icsneoc2.cpp b/test/unit/icsneoc2.cpp index 55f7e1b..95b7bb3 100644 --- a/test/unit/icsneoc2.cpp +++ b/test/unit/icsneoc2.cpp @@ -2153,3 +2153,28 @@ TEST(icsneoc2, test_gptp_enum_alignment) ASSERT_EQ(sizeof(RADGPTPRole), sizeof(icsneoc2_gptp_role_t)); } +TEST(icsneoc2, test_mac_network_id_get) +{ + icsneoc2_mac_addr_entry_t entry {}; + icsneoc2_netid_t network_id = 0; + + entry.network_id = icsneoc2_netid_ethernet_01; + ASSERT_EQ(icsneoc2_error_success, icsneoc2_mac_network_id_get(&entry, &network_id)); + ASSERT_EQ(icsneoc2_netid_ethernet_01, network_id); + + entry.network_id = 43; + network_id = 0; + ASSERT_EQ(icsneoc2_error_success, icsneoc2_mac_network_id_get(&entry, &network_id)); + ASSERT_EQ(icsneoc2_netid_invalid, network_id); + + entry.network_id = icsneoc2_netid_invalid; + network_id = 0; + ASSERT_EQ(icsneoc2_error_success, icsneoc2_mac_network_id_get(&entry, &network_id)); + ASSERT_EQ(icsneoc2_netid_invalid, network_id); + + ASSERT_EQ(icsneoc2_error_invalid_parameters, + icsneoc2_mac_network_id_get(nullptr, &network_id)); + ASSERT_EQ(icsneoc2_error_invalid_parameters, + icsneoc2_mac_network_id_get(&entry, nullptr)); +} +