From 9ecbaaa0a7f04a5bd8c25af49a97709c86224d69 Mon Sep 17 00:00:00 2001 From: LakshminarayananShenbagaraj Date: Tue, 29 Sep 2026 22:40:52 +0100 Subject: [PATCH 1/3] RDKB-66929 : [Rogers][8.6p4s4] Device inaccessible and loses internet | When GW switch back to router from bridge mode. Reason for change: When the CPE is in bridge mode router advertisement has been received for solicit via rdisc6 due to the reason IPv6 default gateway has not been filled up for connectivity checki. For Recovery, we have to restart connectivity check either IPv4 or IPv6 default gateway not valid case. Test Procedure: 1. Connectivity check should start with valid parameters. Risks: High Signed-off-by: LakshminarayananShenbagaraj --- .../wanmgr_rbus_handler_apis.c | 5 +- source/WanManager/wanmgr_dhcp_event_handler.c | 7 +- source/WanManager/wanmgr_interface_sm.c | 78 +++++++++++++------ 3 files changed, 62 insertions(+), 28 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c index b6e7a8c9..74a8d4cf 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c @@ -1960,8 +1960,9 @@ ANSC_STATUS WanMgr_Configure_TAD_WCC(DML_VIRTUAL_IFACE *p_VirtIf, WCC_EVENT Eve int iErrorCode = 0; - if(Event != WCC_STOP && (p_VirtIf->IP.Ipv4Data.dnsServer[0] == '\0') && (p_VirtIf->IP.Ipv4Data.dnsServer1[0] == '\0') && - (p_VirtIf->IP.Ipv6Data.nameserver[0] == '\0') && (p_VirtIf->IP.Ipv6Data.nameserver1[0] == '\0')) + if(Event != WCC_STOP && ((p_VirtIf->IP.Ipv4Data.dnsServer[0] == '\0') && (p_VirtIf->IP.Ipv4Data.dnsServer1[0] == '\0') && + (p_VirtIf->IP.Ipv6Data.nameserver[0] == '\0') && (p_VirtIf->IP.Ipv6Data.nameserver1[0] == '\0')) || + ((p_VirtIf->IP.Ipv6RA.acDefaultGw[0] == '\0') && (p_VirtIf->IP.Ipv4Data.gateway[0] == '\0'))) { CcspTraceError(("%s %d: DNS servers are not configured. (TAD) DNS health check not triggered\n",__FUNCTION__, __LINE__)); return ANSC_STATUS_FAILURE; diff --git a/source/WanManager/wanmgr_dhcp_event_handler.c b/source/WanManager/wanmgr_dhcp_event_handler.c index 58f43632..bf660e98 100644 --- a/source/WanManager/wanmgr_dhcp_event_handler.c +++ b/source/WanManager/wanmgr_dhcp_event_handler.c @@ -83,9 +83,6 @@ static void copyDhcpv6Data(WANMGR_IPV6_DATA* pDhcpv6Data, const DHCP_MGR_IPV6_MS "| mapeAssigned : %-40d |\n" #ifdef FEATURE_MAPT "| maptAssigned : %-40d |\n" -#endif -#ifdef FEATURE_DSLITE_V2 - "| aftrName : %-40s |\n" #endif "=================================================================\n", leaseInfo->ifname, leaseInfo->address, leaseInfo->nameserver, leaseInfo->nameserver1, @@ -194,6 +191,8 @@ void WanMgr_ProcessDhcpClientEvent(DhcpEventThreadArgs *eventData) copyDhcpv4Data(&(pVirtIf->IP.Ipv4Data), &(eventData->lease.v4)); pVirtIf->IP.Ipv4Changed = TRUE; + CcspTraceInfo(("%s %d - IPv4 - RestartConnectivityCheck triggered. \n", __FUNCTION__, __LINE__)); + pVirtIf->IP.RestartConnectivityCheck = TRUE; WanManager_UpdateInterfaceStatus(pVirtIf, WANMGR_IFACE_CONNECTION_UP); char param_name[256] = {0}; @@ -246,6 +245,8 @@ void WanMgr_ProcessDhcpClientEvent(DhcpEventThreadArgs *eventData) DHCP_MGR_IPV6_MSG* leaseInfo = &(eventData->lease.v6); copyDhcpv6Data(&(pVirtIf->IP.Ipv6Data), leaseInfo); pVirtIf->IP.Ipv6Changed = TRUE; + CcspTraceInfo(("%s %d - IPv6 - RestartConnectivityCheck triggered. \n", __FUNCTION__, __LINE__)); + pVirtIf->IP.RestartConnectivityCheck = TRUE; //TODO : WAN ip creation from IA_PD if required. address assignment on LAN bridge. WanManager_UpdateInterfaceStatus(pVirtIf, WANMGR_IFACE_CONNECTION_IPV6_UP); diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index a9ef8766..4433ae27 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "wanmgr_interface_sm.h" #include "wanmgr_utils.h" @@ -1065,6 +1066,51 @@ int wan_updateDNS(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl, BOOL addIPv4, BOOL } +static int WanMgr_IsIpv6DADComplete(const char *ifName) +{ + char address[33] = {0}; + char device[64] = {0}; + char line[BUFLEN_128] = {0}; + int addressFound = 0; + int dadIncomplete = 0; + unsigned int ifIndex = 0; + unsigned int prefixLength = 0; + unsigned int scope = 0; + unsigned int flags = 0; + FILE *fp = NULL; + + if (ifName == NULL || ifName[0] == '\0') + { + return 0; + } + + fp = fopen("/proc/net/if_inet6", "r"); + + if (fp == NULL) + { + CcspTraceError(("%s %d - Failed to open /proc/net/if_inet6: %s\n", + __FUNCTION__, __LINE__, strerror(errno))); + return 0; + } + + while (fgets(line, sizeof(line), fp) != NULL) + { + if (sscanf(line, "%32s %x %x %x %x %63s", address, &ifIndex, + &prefixLength, &scope, &flags, device) == 6 && + strcmp(device, ifName) == 0) + { + addressFound = 1; + if ((flags & (IFA_F_TENTATIVE | IFA_F_DADFAILED)) != 0) + { + dadIncomplete = 1; + } + } + } + + fclose(fp); + return addressFound && !dadIncomplete; +} + /** * @brief Checks if the IPv6 address is ready to use. * @@ -1092,30 +1138,13 @@ static int checkIpv6AddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) for(int i=0; i<15; i++) { - buffer[0] = '\0'; - if(dad_flag == 0) - { - if ((fp_dad = v_secure_popen("r","ip address show dev %s tentative", p_VirtIf->Name))) - { - if(fp_dad != NULL) - { - fgets(buffer, BUFLEN_256, fp_dad); - if(strlen(buffer) == 0 ) - { - dad_flag = 1; - } - v_secure_pclose(fp_dad); - } - } - } - if(dad_flag == 0) - { - sleep(1); - } - else + if (WanMgr_IsIpv6DADComplete(p_VirtIf->Name)) { + dad_flag = 1; break; } + + sleep(1); } buffer[0] = '\0'; @@ -2008,8 +2037,11 @@ static ANSC_STATUS WanMgr_StartConnectivityCheck(WanMgr_IfaceSM_Controller_t* pW if(pVirtIf->IP.ConnectivityCheckType == WAN_CONNECTIVITY_TYPE_TAD) { CcspTraceInfo(("%s %d ConnectivityCheck Type is TAD \n", __FUNCTION__, __LINE__)); - WanMgr_Configure_TAD_WCC( pVirtIf, (pVirtIf->IP.ConnectivityCheckRunning && pVirtIf->IP.RestartConnectivityCheck) ? WCC_RESTART : WCC_START); - pVirtIf->IP.ConnectivityCheckRunning = TRUE; + if ( WanMgr_Configure_TAD_WCC( pVirtIf, (pVirtIf->IP.ConnectivityCheckRunning && pVirtIf->IP.RestartConnectivityCheck) ? WCC_RESTART : WCC_START) == ANSC_STATUS_SUCCESS ) + { + CcspTraceInfo(("%s %d - Successfully configured TAD WCC for interface %s \n", __FUNCTION__, __LINE__, pVirtIf->Name)); + pVirtIf->IP.ConnectivityCheckRunning = TRUE; + } } else if(pVirtIf->IP.ConnectivityCheckType == WAN_CONNECTIVITY_TYPE_IHC) { From 63ab166086287e74e8e910752a659729a83dffbd Mon Sep 17 00:00:00 2001 From: LakshminarayananShenbagaraj Date: Tue, 29 Sep 2026 22:47:14 +0100 Subject: [PATCH 2/3] RDKB-66929 : [Rogers][8.6p4s4] Device inaccessible and loses internet | When GW switch back to router from bridge mode. Reason for change: When the CPE is in bridge mode router advertisement has been received for solicit via rdisc6 due to the reason IPv6 default gateway has not been filled up for connectivity checki. For Recovery, we have to restart connectivity check either IPv4 or IPv6 default gateway not valid case. Test Procedure: 1. Connectivity check should start with valid parameters. Risks: High Signed-off-by: LakshminarayananShenbagaraj --- source/WanManager/wanmgr_dhcp_event_handler.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/WanManager/wanmgr_dhcp_event_handler.c b/source/WanManager/wanmgr_dhcp_event_handler.c index bf660e98..2dfdc2c6 100644 --- a/source/WanManager/wanmgr_dhcp_event_handler.c +++ b/source/WanManager/wanmgr_dhcp_event_handler.c @@ -83,6 +83,9 @@ static void copyDhcpv6Data(WANMGR_IPV6_DATA* pDhcpv6Data, const DHCP_MGR_IPV6_MS "| mapeAssigned : %-40d |\n" #ifdef FEATURE_MAPT "| maptAssigned : %-40d |\n" +#endif +#ifdef FEATURE_DSLITE_V2 + "| aftrName : %-40s |\n" #endif "=================================================================\n", leaseInfo->ifname, leaseInfo->address, leaseInfo->nameserver, leaseInfo->nameserver1, From e94681dce0fdf92f818ec6e6091aa649d0421ab2 Mon Sep 17 00:00:00 2001 From: LakshminarayananShenbagaraj <166714137+LakshminarayananShenbagaraj@users.noreply.github.com> Date: Wed, 30 Sep 2026 16:20:48 +0100 Subject: [PATCH 3/3] Potential fix for pull request finding 'STOP gateway validation incorrectly prevents stop events' Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c index 74a8d4cf..64783253 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c @@ -1960,9 +1960,10 @@ ANSC_STATUS WanMgr_Configure_TAD_WCC(DML_VIRTUAL_IFACE *p_VirtIf, WCC_EVENT Eve int iErrorCode = 0; - if(Event != WCC_STOP && ((p_VirtIf->IP.Ipv4Data.dnsServer[0] == '\0') && (p_VirtIf->IP.Ipv4Data.dnsServer1[0] == '\0') && - (p_VirtIf->IP.Ipv6Data.nameserver[0] == '\0') && (p_VirtIf->IP.Ipv6Data.nameserver1[0] == '\0')) || - ((p_VirtIf->IP.Ipv6RA.acDefaultGw[0] == '\0') && (p_VirtIf->IP.Ipv4Data.gateway[0] == '\0'))) + if (Event != WCC_STOP && + (((p_VirtIf->IP.Ipv4Data.dnsServer[0] == '\0') && (p_VirtIf->IP.Ipv4Data.dnsServer1[0] == '\0') && + (p_VirtIf->IP.Ipv6Data.nameserver[0] == '\0') && (p_VirtIf->IP.Ipv6Data.nameserver1[0] == '\0')) || + ((p_VirtIf->IP.Ipv6RA.acDefaultGw[0] == '\0') && (p_VirtIf->IP.Ipv4Data.gateway[0] == '\0')))) { CcspTraceError(("%s %d: DNS servers are not configured. (TAD) DNS health check not triggered\n",__FUNCTION__, __LINE__)); return ANSC_STATUS_FAILURE;