From a13c9c4dbf81fdf65985347a061eb3fe24d8ad31 Mon Sep 17 00:00:00 2001 From: rirfha948 Date: Wed, 1 Apr 2026 04:57:18 +0000 Subject: [PATCH 1/3] RDKB-63098: [ONESTACK]-Handle IPv6 delegation for business vs residential Partner ID as part of single build Reason for change: Prefix delegation handling Test Procedure: - Build OneStack Image - In Business-mode, Check dibbler server is started and server.conf has prefix-delegation class - In Residential-mode, check whether device behaves as a non-CBR device Risks: None Priority: P1 Signed-off-by: rirfha948 --- source/firewall/firewall_ipv6.c | 46 ++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/source/firewall/firewall_ipv6.c b/source/firewall/firewall_ipv6.c index 57f4a705..e635d6a6 100644 --- a/source/firewall/firewall_ipv6.c +++ b/source/firewall/firewall_ipv6.c @@ -189,7 +189,6 @@ int numifs = sizeof(ifnames) / sizeof(*ifnames); #ifdef _ONESTACK_PRODUCT_REQ_ #define COSA_DML_DHCPV6_CLIENT_IFNAME "erouter0" -#define COSA_DML_DHCPV6C_PREF_SYSEVENT_NAME "tr_"COSA_DML_DHCPV6_CLIENT_IFNAME"_dhcpv6_client_v6pref" #endif /* **************************************************************** @@ -496,6 +495,10 @@ void do_ipv6_filter_table(FILE *fp){ char request[256], response[256], cm_ipv6addr[40]; unsigned int a[16] = {0}; #endif +#if defined (_ONESTACK_PRODUCT_REQ_) + char current_wan_interface[64] = {0}; + char sysevent_name[128] = {0}; +#endif fprintf(fp, "*filter\n"); fprintf(fp, ":INPUT ACCEPT [0:0]\n"); @@ -1263,7 +1266,15 @@ void do_ipv6_filter_table(FILE *fp){ #ifdef _ONESTACK_PRODUCT_REQ_ if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) { - sysevent_get(sysevent_fd, sysevent_token, COSA_DML_DHCPV6C_PREF_SYSEVENT_NAME, prefix, sizeof(prefix)); + sysevent_get(sysevent_fd, sysevent_token, "current_wan_ifname", current_wan_interface, sizeof(current_wan_interface)); + /* If current_wan_ifname is not set yet, fall back to the default DHCPv6 client interface */ + if (current_wan_interface[0] == '\0') + { + strncpy(current_wan_interface, COSA_DML_DHCPV6_CLIENT_IFNAME, sizeof(current_wan_interface) - 1); + current_wan_interface[sizeof(current_wan_interface) - 1] = '\0'; + } + snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); + sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); } else { @@ -1278,7 +1289,16 @@ void do_ipv6_filter_table(FILE *fp){ #ifdef _ONESTACK_PRODUCT_REQ_ if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) { - sysevent_get(sysevent_fd, sysevent_token, COSA_DML_DHCPV6C_PREF_SYSEVENT_NAME, prefix, sizeof(prefix)); + sysevent_get(sysevent_fd, sysevent_token, "current_wan_ifname", current_wan_interface, sizeof(current_wan_interface)); + /* If current_wan_ifname is not set yet, fall back to the default DHCPv6 client interface */ + if (current_wan_interface[0] == '\0') + { + strncpy(current_wan_interface, COSA_DML_DHCPV6_CLIENT_IFNAME, sizeof(current_wan_interface) - 1); + current_wan_interface[sizeof(current_wan_interface) - 1] = '\0'; + } + snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); + sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); + } else { @@ -2134,6 +2154,10 @@ typedef enum{ void applyRoutingRules(FILE* fp,ipv6_type type) { FIREWALL_DEBUG("Entering applyRoutingRules, ipv6_type is %d \n" COMMA type); +#if defined (_ONESTACK_PRODUCT_REQ_) + char current_wan_interface[64] = {0}; + char sysevent_name[128] = {0}; +#endif char prefix[64] ; memset(prefix,0,sizeof(prefix)); int i ; @@ -2143,18 +2167,26 @@ void applyRoutingRules(FILE* fp,ipv6_type type) } else { -#ifdef _ONESTACK_PRODUCT_REQ_ + #ifdef _ONESTACK_PRODUCT_REQ_ if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) { - sysevent_get(sysevent_fd, sysevent_token, COSA_DML_DHCPV6C_PREF_SYSEVENT_NAME, prefix, sizeof(prefix)); + sysevent_get(sysevent_fd, sysevent_token, "current_wan_ifname", current_wan_interface, sizeof(current_wan_interface)); + /* If current_wan_ifname is not set yet, fall back to the default DHCPv6 client interface */ + if (current_wan_interface[0] == '\0') + { + strncpy(current_wan_interface, COSA_DML_DHCPV6_CLIENT_IFNAME, sizeof(current_wan_interface) - 1); + current_wan_interface[sizeof(current_wan_interface) - 1] = '\0'; + } + snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); + sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); } else { sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); } -#else + #else sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); -#endif + #endif } if (strlen(prefix) != 0 ) { From 6fca25f7aa9df0cbc0c1b5749b373362975abd97 Mon Sep 17 00:00:00 2001 From: rirfha948 Date: Thu, 2 Apr 2026 04:50:57 +0000 Subject: [PATCH 2/3] Current_wan_ifname NULL check handling --- source/firewall/firewall_ipv6.c | 48 ++++++++++++--------------------- 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/source/firewall/firewall_ipv6.c b/source/firewall/firewall_ipv6.c index e635d6a6..0603f183 100644 --- a/source/firewall/firewall_ipv6.c +++ b/source/firewall/firewall_ipv6.c @@ -187,9 +187,6 @@ int numifs = sizeof(ifnames) / sizeof(*ifnames); #define V6_PORTSCANPROTECT "v6_PortScanProtect" #define V6_IPFLOODDETECT "v6_IPFloodDetect" -#ifdef _ONESTACK_PRODUCT_REQ_ -#define COSA_DML_DHCPV6_CLIENT_IFNAME "erouter0" -#endif /* **************************************************************** * IPv6 Firewall * @@ -1267,21 +1264,15 @@ void do_ipv6_filter_table(FILE *fp){ if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) { sysevent_get(sysevent_fd, sysevent_token, "current_wan_ifname", current_wan_interface, sizeof(current_wan_interface)); - /* If current_wan_ifname is not set yet, fall back to the default DHCPv6 client interface */ - if (current_wan_interface[0] == '\0') - { - strncpy(current_wan_interface, COSA_DML_DHCPV6_CLIENT_IFNAME, sizeof(current_wan_interface) - 1); - current_wan_interface[sizeof(current_wan_interface) - 1] = '\0'; - } - snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); - sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); + snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); + sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); } else { - sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); + sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); } #else - sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); + sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); #endif } @@ -1289,15 +1280,9 @@ void do_ipv6_filter_table(FILE *fp){ #ifdef _ONESTACK_PRODUCT_REQ_ if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) { - sysevent_get(sysevent_fd, sysevent_token, "current_wan_ifname", current_wan_interface, sizeof(current_wan_interface)); - /* If current_wan_ifname is not set yet, fall back to the default DHCPv6 client interface */ - if (current_wan_interface[0] == '\0') - { - strncpy(current_wan_interface, COSA_DML_DHCPV6_CLIENT_IFNAME, sizeof(current_wan_interface) - 1); - current_wan_interface[sizeof(current_wan_interface) - 1] = '\0'; - } - snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); - sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); + sysevent_get(sysevent_fd, sysevent_token, "current_wan_ifname", current_wan_interface, sizeof(current_wan_interface)); + snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); + sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); } else @@ -1320,7 +1305,7 @@ void do_ipv6_filter_table(FILE *fp){ #if defined (_COSA_FOR_BCI_) || defined (_ONESTACK_PRODUCT_REQ_) /* adding forward rule for PD traffic */ #ifdef _ONESTACK_PRODUCT_REQ_ - if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) + if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION) && (strlen(current_wan_interface) != 0)) { fprintf(fp, "-A FORWARD -s %s -i %s -j ACCEPT\n", prefix, lan_ifname); if (strncasecmp(firewall_levelv6, "Custom", strlen("Custom")) == 0) @@ -2168,15 +2153,9 @@ void applyRoutingRules(FILE* fp,ipv6_type type) else { #ifdef _ONESTACK_PRODUCT_REQ_ - if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) + if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) { sysevent_get(sysevent_fd, sysevent_token, "current_wan_ifname", current_wan_interface, sizeof(current_wan_interface)); - /* If current_wan_ifname is not set yet, fall back to the default DHCPv6 client interface */ - if (current_wan_interface[0] == '\0') - { - strncpy(current_wan_interface, COSA_DML_DHCPV6_CLIENT_IFNAME, sizeof(current_wan_interface) - 1); - current_wan_interface[sizeof(current_wan_interface) - 1] = '\0'; - } snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); } @@ -2188,7 +2167,14 @@ void applyRoutingRules(FILE* fp,ipv6_type type) sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); #endif } - if (strlen(prefix) != 0 ) + /* Add firewall rules only if prefix is not NULL and current_wan_ifname is not NULL*/ + #ifdef _ONESTACK_PRODUCT_REQ_ + if ((strlen(prefix) != 0) && + (!isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION) || + (strlen(current_wan_interface) != 0))) + #else + if (strlen(prefix) != 0) + #endif { char *token_pref =NULL; token_pref = strtok(prefix,"/"); From ee94baaa4433ad3a607f003f23956641545fed66 Mon Sep 17 00:00:00 2001 From: rirfha948 Date: Thu, 2 Apr 2026 13:36:57 +0530 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- source/firewall/firewall_ipv6.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/source/firewall/firewall_ipv6.c b/source/firewall/firewall_ipv6.c index 0603f183..57421e0c 100644 --- a/source/firewall/firewall_ipv6.c +++ b/source/firewall/firewall_ipv6.c @@ -1305,7 +1305,7 @@ void do_ipv6_filter_table(FILE *fp){ #if defined (_COSA_FOR_BCI_) || defined (_ONESTACK_PRODUCT_REQ_) /* adding forward rule for PD traffic */ #ifdef _ONESTACK_PRODUCT_REQ_ - if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION) && (strlen(current_wan_interface) != 0)) + if (isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) { fprintf(fp, "-A FORWARD -s %s -i %s -j ACCEPT\n", prefix, lan_ifname); if (strncasecmp(firewall_levelv6, "Custom", strlen("Custom")) == 0) @@ -2156,8 +2156,15 @@ void applyRoutingRules(FILE* fp,ipv6_type type) if(isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION)) { sysevent_get(sysevent_fd, sysevent_token, "current_wan_ifname", current_wan_interface, sizeof(current_wan_interface)); - snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); - sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); + if (current_wan_interface[0] != '\0') + { + snprintf(sysevent_name, sizeof(sysevent_name), "tr_%s_dhcpv6_client_v6pref", current_wan_interface); + sysevent_get(sysevent_fd, sysevent_token, sysevent_name, prefix, sizeof(prefix)); + } + else + { + sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); + } } else { @@ -2167,10 +2174,11 @@ void applyRoutingRules(FILE* fp,ipv6_type type) sysevent_get(sysevent_fd, sysevent_token, "ipv6_prefix", prefix, sizeof(prefix)); #endif } - /* Add firewall rules only if prefix is not NULL and current_wan_ifname is not NULL*/ + /* Add firewall rules only if prefix is non-empty and, when IPv6 delegation is enabled, current_wan_interface is also non-empty */ #ifdef _ONESTACK_PRODUCT_REQ_ if ((strlen(prefix) != 0) && (!isFeatureSupportedInCurrentMode(FEATURE_IPV6_DELEGATION) || + (ULA_IPV6 == type) || (strlen(current_wan_interface) != 0))) #else if (strlen(prefix) != 0)