From bcb97f3ecdc9aa7edc9f3a4714fa29ca86bbc97b Mon Sep 17 00:00:00 2001 From: LakshminarayananShenbagaraj Date: Wed, 16 Sep 2026 13:07:53 +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 --- source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c | 5 +++-- source/WanManager/wanmgr_dhcp_event_handler.c | 4 ++++ source/WanManager/wanmgr_interface_sm.c | 7 +++++-- 3 files changed, 12 insertions(+), 4 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..b61ef1b6 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 7a8efad1..ffe246b1 100644 --- a/source/WanManager/wanmgr_dhcp_event_handler.c +++ b/source/WanManager/wanmgr_dhcp_event_handler.c @@ -186,6 +186,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}; @@ -238,6 +240,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 e7580be8..8d250806 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1892,8 +1892,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 d97da0da68502009e94ed8371379d1d9030b0165 Mon Sep 17 00:00:00 2001 From: LakshminarayananShenbagaraj Date: Wed, 16 Sep 2026 13:49:53 +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: Connectivity check should start with valid parameters. Risks: High Signed-off-by: LakshminarayananShenbagaraj --- source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c | 4 ++-- 1 file changed, 2 insertions(+), 2 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 b61ef1b6..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 @@ -1961,8 +1961,8 @@ ANSC_STATUS WanMgr_Configure_TAD_WCC(DML_VIRTUAL_IFACE *p_VirtIf, WCC_EVENT Eve 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'))) + (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; From 69360fe4986edc5b9e9eabe2f8834b3fe0227162 Mon Sep 17 00:00:00 2001 From: LakshminarayananShenbagaraj Date: Thu, 24 Sep 2026 00:13:31 +0100 Subject: [PATCH 3/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_interface_sm.c | 72 +++++++++++++++++-------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 8d250806..22aab001 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" @@ -1033,6 +1034,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. * @@ -1046,7 +1092,6 @@ int wan_updateDNS(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl, BOOL addIPv4, BOOL static int checkIpv6AddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) { char buffer[BUFLEN_256] = {0}; - FILE *fp_dad = NULL; FILE *fp_route = NULL; int dad_flag = 0; int route_flag = 0; @@ -1060,30 +1105,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';