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..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,8 +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')) + 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..2dfdc2c6 100644 --- a/source/WanManager/wanmgr_dhcp_event_handler.c +++ b/source/WanManager/wanmgr_dhcp_event_handler.c @@ -194,6 +194,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 +248,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) {