From 117728ce80728c5860a0884fd8ab3ee62f32eca1 Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Tue, 3 Mar 2026 10:55:30 +0530 Subject: [PATCH 01/12] RDKEMW-14910 IPv6 ULA field in network interface API response returns Link-Local address instead of ULA address --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 28 +++++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index 85326d63..cd387042 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -768,25 +768,43 @@ namespace WPEFramework if(ip6_config) ipArray = nm_ip_config_get_addresses(ip6_config); else - NMLOG_WARNING("no IPv6 configurtion on %s", interface.c_str()); + NMLOG_WARNING("no IPv6 configuration on %s", interface.c_str()); if(ipArray) { for (int i = 0; i < ipArray->len; i++) { ipAddr = static_cast(ipArray->pdata[i]); + + if(ipAddr) + { + GVariant *scope = nm_ip_address_get_attribute(ipAddr, NM_IP_ROUTE_ATTRIBUTE_SCOPE); + if (scope) { + NMLOG_INFO("GVariant type: %s", g_variant_get_type_string(scope)); + } + } if(ipAddr) ipStr = nm_ip_address_get_address(ipAddr); if(!ipStr.empty()) { - if (ipStr.compare(0, 5, "fe80:") == 0 || ipStr.compare(0, 6, "fe80::") == 0) + if (ipStr.compare(0, 4, "fe80") == 0) + { + // Link-local address (fe80::/10) — valid only on the local link, not routable + // Used for neighbor discovery, router solicitation only + NMLOG_INFO("link-local ip: %s", ipStr.c_str()); + } + else if (ipStr.compare(0, 2, "fd") == 0 || ipStr.compare(0, 2, "fc") == 0) { - result.ula = ipStr; - NMLOG_INFO("link-local ip: %s", result.ula.c_str()); + // ULA - Unique Local Address (fc00::/7, practically fd00::/8) RFC 4193 — private, non-routable address space + result.prefix = nm_ip_address_get_prefix(ipAddr); + if(result.ula.empty()) // take one ula address + result.ula = ipStr; + NMLOG_INFO("ula ip: %s/%d", result.ula.c_str(), result.prefix); } else { + // Global Unicast Address (2000::/3) — public, internet-routable result.prefix = nm_ip_address_get_prefix(ipAddr); - if(result.ipaddress.empty()) // SLAAC mutiple ip not added + if(result.ipaddress.empty()) // SLAAC multiple ip not added result.ipaddress = ipStr; NMLOG_INFO("global ip %s/%d", ipStr.c_str(), result.prefix); } From 4423fcf7d129010dabdec141d5eefae32eac4fb5 Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Mon, 16 Mar 2026 16:06:15 +0530 Subject: [PATCH 02/12] updated print --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index cd387042..31b957b1 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -780,6 +780,7 @@ namespace WPEFramework GVariant *scope = nm_ip_address_get_attribute(ipAddr, NM_IP_ROUTE_ATTRIBUTE_SCOPE); if (scope) { NMLOG_INFO("GVariant type: %s", g_variant_get_type_string(scope)); + NMLOG_INFO("GVariant Byte: %u", (unsigned) g_variant_get_byte(scope)); } } if(ipAddr) From c4521e41f257f87ece146c73d83926d1862f8a30 Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Tue, 17 Mar 2026 11:27:57 +0530 Subject: [PATCH 03/12] Test update --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index 31b957b1..7cb3353a 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -777,6 +777,16 @@ namespace WPEFramework if(ipAddr) { + char **attributeNames = nm_ip_address_get_attribute_names(ipAddr); + if (attributeNames) + { + for (guint attrIdx = 0; attributeNames[attrIdx] != NULL; ++attrIdx) + { + NMLOG_INFO("IPv6 attribute[%u]: %s", attrIdx, attributeNames[attrIdx]); + } + g_strfreev(attributeNames); + } + GVariant *scope = nm_ip_address_get_attribute(ipAddr, NM_IP_ROUTE_ATTRIBUTE_SCOPE); if (scope) { NMLOG_INFO("GVariant type: %s", g_variant_get_type_string(scope)); From 322337ee8b5d8f807fbfd286ff330a3199a23c8a Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Tue, 17 Mar 2026 12:12:50 +0530 Subject: [PATCH 04/12] log line attiribute --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index 7cb3353a..e6bb00df 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -777,6 +777,7 @@ namespace WPEFramework if(ipAddr) { + NMLOG_INFO("Processing IPv6 address #%d for interface %s", i, interface.c_str()); char **attributeNames = nm_ip_address_get_attribute_names(ipAddr); if (attributeNames) { @@ -786,12 +787,21 @@ namespace WPEFramework } g_strfreev(attributeNames); } + else + { + NMLOG_WARNING("No attributes found for IPv6 address #%d on interface %s", i, interface.c_str()); + } GVariant *scope = nm_ip_address_get_attribute(ipAddr, NM_IP_ROUTE_ATTRIBUTE_SCOPE); if (scope) { NMLOG_INFO("GVariant type: %s", g_variant_get_type_string(scope)); NMLOG_INFO("GVariant Byte: %u", (unsigned) g_variant_get_byte(scope)); } + else + { + NMLOG_WARNING("No scope attribute found for IPv6 address #%d on interface %s", i, interface.c_str()); + } + } if(ipAddr) ipStr = nm_ip_address_get_address(ipAddr); From 0e94052ae3b9cc0c984fb5242a5c68d31109f7f1 Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Tue, 17 Mar 2026 12:45:03 +0530 Subject: [PATCH 05/12] revert all test changes --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 29 ----------------------- 1 file changed, 29 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index e6bb00df..31d2e532 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -774,35 +774,6 @@ namespace WPEFramework for (int i = 0; i < ipArray->len; i++) { ipAddr = static_cast(ipArray->pdata[i]); - - if(ipAddr) - { - NMLOG_INFO("Processing IPv6 address #%d for interface %s", i, interface.c_str()); - char **attributeNames = nm_ip_address_get_attribute_names(ipAddr); - if (attributeNames) - { - for (guint attrIdx = 0; attributeNames[attrIdx] != NULL; ++attrIdx) - { - NMLOG_INFO("IPv6 attribute[%u]: %s", attrIdx, attributeNames[attrIdx]); - } - g_strfreev(attributeNames); - } - else - { - NMLOG_WARNING("No attributes found for IPv6 address #%d on interface %s", i, interface.c_str()); - } - - GVariant *scope = nm_ip_address_get_attribute(ipAddr, NM_IP_ROUTE_ATTRIBUTE_SCOPE); - if (scope) { - NMLOG_INFO("GVariant type: %s", g_variant_get_type_string(scope)); - NMLOG_INFO("GVariant Byte: %u", (unsigned) g_variant_get_byte(scope)); - } - else - { - NMLOG_WARNING("No scope attribute found for IPv6 address #%d on interface %s", i, interface.c_str()); - } - - } if(ipAddr) ipStr = nm_ip_address_get_address(ipAddr); if(!ipStr.empty()) From 075d8ec445aa84bb494c3ea42fd9eff3090ceeb2 Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Tue, 24 Mar 2026 15:57:28 +0530 Subject: [PATCH 06/12] updated the workflow --- plugin/gnome/NetworkManagerGnomeEvents.cpp | 5 +++++ plugin/gnome/NetworkManagerGnomeProxy.cpp | 15 ++++++--------- tests/l2Test/libnm/l2_test_libnmproxy.cpp | 7 +++++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeEvents.cpp b/plugin/gnome/NetworkManagerGnomeEvents.cpp index fd6ab361..294d7d79 100644 --- a/plugin/gnome/NetworkManagerGnomeEvents.cpp +++ b/plugin/gnome/NetworkManagerGnomeEvents.cpp @@ -353,6 +353,11 @@ namespace WPEFramework NMLOG_DEBUG("%s It's link-local ip", ipAddress.c_str()); continue; // It's link-local so skiping } + else if (ipAddress.compare(0, 2, "fd") == 0 || ipAddress.compare(0, 2, "fc") == 0) + { + NMLOG_DEBUG("%s It's unique local ip", ipAddress.c_str()); + continue; // It's unique local so skipping + } GnomeNetworkManagerEvents::onAddressChangeCb(iface, ipAddress, true, true); break; // SLAAC protocol may include multip ipv6 address posting only one Global address } diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index 31d2e532..f96112c8 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -778,13 +778,7 @@ namespace WPEFramework ipStr = nm_ip_address_get_address(ipAddr); if(!ipStr.empty()) { - if (ipStr.compare(0, 4, "fe80") == 0) - { - // Link-local address (fe80::/10) — valid only on the local link, not routable - // Used for neighbor discovery, router solicitation only - NMLOG_INFO("link-local ip: %s", ipStr.c_str()); - } - else if (ipStr.compare(0, 2, "fd") == 0 || ipStr.compare(0, 2, "fc") == 0) + if (ipStr.compare(0, 2, "fd") == 0 || ipStr.compare(0, 2, "fc") == 0) { // ULA - Unique Local Address (fc00::/7, practically fd00::/8) RFC 4193 — private, non-routable address space result.prefix = nm_ip_address_get_prefix(ipAddr); @@ -792,14 +786,17 @@ namespace WPEFramework result.ula = ipStr; NMLOG_INFO("ula ip: %s/%d", result.ula.c_str(), result.prefix); } - else + else if(ipStr.compare(0, 4, "fe80") != 0) { - // Global Unicast Address (2000::/3) — public, internet-routable result.prefix = nm_ip_address_get_prefix(ipAddr); if(result.ipaddress.empty()) // SLAAC multiple ip not added result.ipaddress = ipStr; NMLOG_INFO("global ip %s/%d", ipStr.c_str(), result.prefix); } + else + { + NMLOG_DEBUG("Skipping link-local IPv6 address: %s", ipStr.c_str()); + } } } diff --git a/tests/l2Test/libnm/l2_test_libnmproxy.cpp b/tests/l2Test/libnm/l2_test_libnmproxy.cpp index 9cb4de3c..4f618664 100644 --- a/tests/l2Test/libnm/l2_test_libnmproxy.cpp +++ b/tests/l2Test/libnm/l2_test_libnmproxy.cpp @@ -827,6 +827,7 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) g_ptr_array_add(dummyActiveConn, ethActiveConn); g_ptr_array_add(ipvAddr, ipv6Addr); g_ptr_array_add(ipvAddr, reinterpret_cast(0x100176)); + g_ptr_array_add(ipvAddr, reinterpret_cast(0x100177)); EXPECT_CALL(*p_libnmWrapsImplMock, nm_dhcp_config_get_one_option(::testing::_, ::testing::_)) .WillOnce(::testing::Return("2001:db8::1")); @@ -842,11 +843,13 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) .WillOnce(::testing::Return("2001:4860:4860::1")); EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_address_get_prefix(::testing::_)) + .WillOnce(::testing::Return(64)) .WillOnce(::testing::Return(64)); EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_address_get_address(::testing::_)) + .WillOnce(::testing::Return("fe80::1234:5678:abcd:ef01")) .WillOnce(::testing::Return("2001:db8:1:2:3:4:5:6")) - .WillOnce(::testing::Return("fe80::1234:5678:abcd:ef01")); + .WillOnce(::testing::Return("fd12:3456:789a::1")); EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_config_get_addresses(::testing::_)) .WillOnce(::testing::Return(reinterpret_cast(ipvAddr))); @@ -881,7 +884,7 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) EXPECT_TRUE(response.find("\"primarydns\":\"2001:4860:4860::8888\"") != std::string::npos); EXPECT_TRUE(response.find("\"interface\":\"eth0\"") != std::string::npos); EXPECT_TRUE(response.find("\"ipaddress\":\"2001:db8:1:2:3:4:5:6\"") != std::string::npos); - EXPECT_TRUE(response.find("\"ula\":\"fe80::1234:5678:abcd:ef01\"") != std::string::npos); + EXPECT_TRUE(response.find("\"ula\":\"fd12:3456:789a::1\"") != std::string::npos); EXPECT_TRUE(response.find("\"prefix\":64") != std::string::npos); EXPECT_TRUE(response.find("\"dhcpserver\":\"2001:db8::1\"") != std::string::npos); EXPECT_TRUE(response.find("\"gateway\":\"2001:4860:4860::1\"") != std::string::npos); From 317cf45de34f6bd4d7707f6d8540179720a73c52 Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Tue, 24 Mar 2026 16:28:32 +0530 Subject: [PATCH 07/12] updated copilot review comment --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index f96112c8..05cb59ec 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -771,11 +771,17 @@ namespace WPEFramework NMLOG_WARNING("no IPv6 configuration on %s", interface.c_str()); if(ipArray) { - for (int i = 0; i < ipArray->len; i++) + for (guint i = 0; i < ipArray->len; i++) { ipAddr = static_cast(ipArray->pdata[i]); - if(ipAddr) - ipStr = nm_ip_address_get_address(ipAddr); + if(ipAddr == nullptr) + { + NMLOG_WARNING("Failed to get IP address from NMIPAddress struct"); + continue; + } + + ipStr = nm_ip_address_get_address(ipAddr); + if(!ipStr.empty()) { if (ipStr.compare(0, 2, "fd") == 0 || ipStr.compare(0, 2, "fc") == 0) From 21f76612dd0c2096868756f2028dc2db452c249d Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Tue, 24 Mar 2026 16:51:16 +0530 Subject: [PATCH 08/12] update co pilot review --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 5 ++--- tests/l2Test/libnm/l2_test_libnmproxy.cpp | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index 05cb59ec..c66cdcaf 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -784,17 +784,16 @@ namespace WPEFramework if(!ipStr.empty()) { + result.prefix = nm_ip_address_get_prefix(ipAddr); if (ipStr.compare(0, 2, "fd") == 0 || ipStr.compare(0, 2, "fc") == 0) { // ULA - Unique Local Address (fc00::/7, practically fd00::/8) RFC 4193 — private, non-routable address space - result.prefix = nm_ip_address_get_prefix(ipAddr); - if(result.ula.empty()) // take one ula address + if(result.ula.empty()) result.ula = ipStr; NMLOG_INFO("ula ip: %s/%d", result.ula.c_str(), result.prefix); } else if(ipStr.compare(0, 4, "fe80") != 0) { - result.prefix = nm_ip_address_get_prefix(ipAddr); if(result.ipaddress.empty()) // SLAAC multiple ip not added result.ipaddress = ipStr; NMLOG_INFO("global ip %s/%d", ipStr.c_str(), result.prefix); diff --git a/tests/l2Test/libnm/l2_test_libnmproxy.cpp b/tests/l2Test/libnm/l2_test_libnmproxy.cpp index 4f618664..7e205188 100644 --- a/tests/l2Test/libnm/l2_test_libnmproxy.cpp +++ b/tests/l2Test/libnm/l2_test_libnmproxy.cpp @@ -844,7 +844,8 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_address_get_prefix(::testing::_)) .WillOnce(::testing::Return(64)) - .WillOnce(::testing::Return(64)); + .WillOnce(::testing::Return(64)) + .WillOnce(::testing::Return(48)); EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_address_get_address(::testing::_)) .WillOnce(::testing::Return("fe80::1234:5678:abcd:ef01")) @@ -885,7 +886,7 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) EXPECT_TRUE(response.find("\"interface\":\"eth0\"") != std::string::npos); EXPECT_TRUE(response.find("\"ipaddress\":\"2001:db8:1:2:3:4:5:6\"") != std::string::npos); EXPECT_TRUE(response.find("\"ula\":\"fd12:3456:789a::1\"") != std::string::npos); - EXPECT_TRUE(response.find("\"prefix\":64") != std::string::npos); + EXPECT_TRUE(response.find("\"prefix\":48") != std::string::npos); EXPECT_TRUE(response.find("\"dhcpserver\":\"2001:db8::1\"") != std::string::npos); EXPECT_TRUE(response.find("\"gateway\":\"2001:4860:4860::1\"") != std::string::npos); From 474d4f96f10b1ebcb952d18c5b616d58032e843b Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Tue, 24 Mar 2026 16:57:39 +0530 Subject: [PATCH 09/12] update prifix --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 4 ++-- tests/l2Test/libnm/l2_test_libnmproxy.cpp | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index c66cdcaf..a9485273 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -784,7 +784,6 @@ namespace WPEFramework if(!ipStr.empty()) { - result.prefix = nm_ip_address_get_prefix(ipAddr); if (ipStr.compare(0, 2, "fd") == 0 || ipStr.compare(0, 2, "fc") == 0) { // ULA - Unique Local Address (fc00::/7, practically fd00::/8) RFC 4193 — private, non-routable address space @@ -792,8 +791,9 @@ namespace WPEFramework result.ula = ipStr; NMLOG_INFO("ula ip: %s/%d", result.ula.c_str(), result.prefix); } - else if(ipStr.compare(0, 4, "fe80") != 0) + else if(ipStr.compare(0, 4, "fe80") != 0) // Skip link-local IPv6 addresses (fe80::/10) { + result.prefix = nm_ip_address_get_prefix(ipAddr); if(result.ipaddress.empty()) // SLAAC multiple ip not added result.ipaddress = ipStr; NMLOG_INFO("global ip %s/%d", ipStr.c_str(), result.prefix); diff --git a/tests/l2Test/libnm/l2_test_libnmproxy.cpp b/tests/l2Test/libnm/l2_test_libnmproxy.cpp index 7e205188..7870b261 100644 --- a/tests/l2Test/libnm/l2_test_libnmproxy.cpp +++ b/tests/l2Test/libnm/l2_test_libnmproxy.cpp @@ -843,9 +843,7 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) .WillOnce(::testing::Return("2001:4860:4860::1")); EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_address_get_prefix(::testing::_)) - .WillOnce(::testing::Return(64)) - .WillOnce(::testing::Return(64)) - .WillOnce(::testing::Return(48)); + .WillOnce(::testing::Return(64)); EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_address_get_address(::testing::_)) .WillOnce(::testing::Return("fe80::1234:5678:abcd:ef01")) @@ -886,7 +884,7 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) EXPECT_TRUE(response.find("\"interface\":\"eth0\"") != std::string::npos); EXPECT_TRUE(response.find("\"ipaddress\":\"2001:db8:1:2:3:4:5:6\"") != std::string::npos); EXPECT_TRUE(response.find("\"ula\":\"fd12:3456:789a::1\"") != std::string::npos); - EXPECT_TRUE(response.find("\"prefix\":48") != std::string::npos); + EXPECT_TRUE(response.find("\"prefix\":64") != std::string::npos); EXPECT_TRUE(response.find("\"dhcpserver\":\"2001:db8::1\"") != std::string::npos); EXPECT_TRUE(response.find("\"gateway\":\"2001:4860:4860::1\"") != std::string::npos); From caabbe4db441fb70ad8d4d2d2fd1f93370a5193a Mon Sep 17 00:00:00 2001 From: Karunakaran A <48997923+karuna2git@users.noreply.github.com> Date: Tue, 24 Mar 2026 09:24:28 -0400 Subject: [PATCH 10/12] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- plugin/gnome/NetworkManagerGnomeEvents.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/gnome/NetworkManagerGnomeEvents.cpp b/plugin/gnome/NetworkManagerGnomeEvents.cpp index b316b79b..ff1690ce 100644 --- a/plugin/gnome/NetworkManagerGnomeEvents.cpp +++ b/plugin/gnome/NetworkManagerGnomeEvents.cpp @@ -352,7 +352,7 @@ namespace WPEFramework { NMLOG_DEBUG("%s It's unique local ip", ipAddress.c_str()); continue; // It's unique local so skipping - } + } GnomeNetworkManagerEvents::onAddressChangeCb(iface, ipAddress, true, true); break; // SLAAC protocol may include multip ipv6 address posting only one Global address } From 6fb33dc947954fa256fcefe730a9aee8ac8039fb Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Wed, 25 Mar 2026 17:07:32 +0530 Subject: [PATCH 11/12] update copilot review comment --- plugin/gnome/NetworkManagerGnomeProxy.cpp | 14 +++++++++----- tests/l2Test/libnm/l2_test_libnmproxy.cpp | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index a9485273..18b0dfe2 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -784,15 +784,18 @@ namespace WPEFramework if(!ipStr.empty()) { - if (ipStr.compare(0, 2, "fd") == 0 || ipStr.compare(0, 2, "fc") == 0) + if(ipStr.compare(0, 2, "fc") == 0 || ipStr.compare(0, 2, "fd") == 0) { - // ULA - Unique Local Address (fc00::/7, practically fd00::/8) RFC 4193 — private, non-routable address space + // ULA - Unique Local Address (RFC 4193, fc00::/7) + // fc00::/7 covers first bytes 0xfc and 0xfd, so the string starts with "fc" or "fd". if(result.ula.empty()) result.ula = ipStr; - NMLOG_INFO("ula ip: %s/%d", result.ula.c_str(), result.prefix); + NMLOG_INFO("ula ip: %s", result.ula.c_str()); } - else if(ipStr.compare(0, 4, "fe80") != 0) // Skip link-local IPv6 addresses (fe80::/10) + else if(ipStr[0] == '2' || ipStr[0] == '3') { + // Global Unicast Address (RFC 4291, 2000::/3) + // 2000::/3 covers first bytes 0x20-0x3f, which in hex string always starts with '2' or '3'. result.prefix = nm_ip_address_get_prefix(ipAddr); if(result.ipaddress.empty()) // SLAAC multiple ip not added result.ipaddress = ipStr; @@ -800,7 +803,8 @@ namespace WPEFramework } else { - NMLOG_DEBUG("Skipping link-local IPv6 address: %s", ipStr.c_str()); + // Skip everything else: link-local (fe80::/10), loopback (::1), multicast (ff00::/8), etc. + NMLOG_DEBUG("Skipping non-global IPv6 address: %s", ipStr.c_str()); } } } diff --git a/tests/l2Test/libnm/l2_test_libnmproxy.cpp b/tests/l2Test/libnm/l2_test_libnmproxy.cpp index 7870b261..f0d218e6 100644 --- a/tests/l2Test/libnm/l2_test_libnmproxy.cpp +++ b/tests/l2Test/libnm/l2_test_libnmproxy.cpp @@ -843,7 +843,7 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) .WillOnce(::testing::Return("2001:4860:4860::1")); EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_address_get_prefix(::testing::_)) - .WillOnce(::testing::Return(64)); + .WillOnce(::testing::Return(48)); EXPECT_CALL(*p_libnmWrapsImplMock, nm_ip_address_get_address(::testing::_)) .WillOnce(::testing::Return("fe80::1234:5678:abcd:ef01")) @@ -884,7 +884,7 @@ TEST_F(NetworkManagerTest, GetIPSettings_ipv6_config_valid) EXPECT_TRUE(response.find("\"interface\":\"eth0\"") != std::string::npos); EXPECT_TRUE(response.find("\"ipaddress\":\"2001:db8:1:2:3:4:5:6\"") != std::string::npos); EXPECT_TRUE(response.find("\"ula\":\"fd12:3456:789a::1\"") != std::string::npos); - EXPECT_TRUE(response.find("\"prefix\":64") != std::string::npos); + EXPECT_TRUE(response.find("\"prefix\":48") != std::string::npos); EXPECT_TRUE(response.find("\"dhcpserver\":\"2001:db8::1\"") != std::string::npos); EXPECT_TRUE(response.find("\"gateway\":\"2001:4860:4860::1\"") != std::string::npos); From d903883ad9563f3ce6cc5d5df24a1ce8904727fd Mon Sep 17 00:00:00 2001 From: Muhammed Rafi C Date: Wed, 25 Mar 2026 17:37:49 +0530 Subject: [PATCH 12/12] update review comments --- plugin/gnome/NetworkManagerGnomeEvents.cpp | 14 ++++++-------- plugin/gnome/NetworkManagerGnomeProxy.cpp | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/plugin/gnome/NetworkManagerGnomeEvents.cpp b/plugin/gnome/NetworkManagerGnomeEvents.cpp index ff1690ce..852adcad 100644 --- a/plugin/gnome/NetworkManagerGnomeEvents.cpp +++ b/plugin/gnome/NetworkManagerGnomeEvents.cpp @@ -343,16 +343,14 @@ namespace WPEFramework //int prefix = nm_ip_address_get_prefix(address); if(ipaddr != NULL) { std::string ipAddress = ipaddr; - if (ipAddress.compare(0, 5, "fe80:") == 0 || - ipAddress.compare(0, 6, "fe80::") == 0) { - NMLOG_DEBUG("%s It's link-local ip", ipAddress.c_str()); - continue; // It's link-local so skiping - } - else if (ipAddress.compare(0, 2, "fd") == 0 || ipAddress.compare(0, 2, "fc") == 0) + if(ipAddress[0] != '2' && ipAddress[0] != '3') { - NMLOG_DEBUG("%s It's unique local ip", ipAddress.c_str()); - continue; // It's unique local so skipping + // Global Unicast Address (RFC 4291, 2000::/3) + // 2000::/3 covers first bytes 0x20-0x3f, which in hex string always starts with '2' or '3'. + NMLOG_DEBUG("%s Not a global unicast address", ipAddress.c_str()); + continue; } + GnomeNetworkManagerEvents::onAddressChangeCb(iface, ipAddress, true, true); break; // SLAAC protocol may include multip ipv6 address posting only one Global address } diff --git a/plugin/gnome/NetworkManagerGnomeProxy.cpp b/plugin/gnome/NetworkManagerGnomeProxy.cpp index 18b0dfe2..6f3f22cc 100644 --- a/plugin/gnome/NetworkManagerGnomeProxy.cpp +++ b/plugin/gnome/NetworkManagerGnomeProxy.cpp @@ -700,7 +700,7 @@ namespace WPEFramework NMLOG_WARNING("no IPv4 configurtion on %s", interface.c_str()); if(ipByte) { - for (int i = 0; i < ipByte->len; i++) + for (guint i = 0; i < ipByte->len; i++) { ipAddr = static_cast(ipByte->pdata[i]); if(ipAddr)