Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions source/WanManager/wanmgr_dhcp_event_handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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);

Expand Down
79 changes: 55 additions & 24 deletions source/WanManager/wanmgr_interface_sm.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <unistd.h>
#include <pthread.h>
#include <ifaddrs.h>
#include <linux/if_addr.h>
#include <sys/syscall.h>
#include "wanmgr_interface_sm.h"
#include "wanmgr_utils.h"
Expand Down Expand Up @@ -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.
*
Expand All @@ -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;
Expand All @@ -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';
Expand Down Expand Up @@ -1892,8 +1920,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;
}
Comment on lines +1923 to +1927
}
else if(pVirtIf->IP.ConnectivityCheckType == WAN_CONNECTIVITY_TYPE_IHC)
{
Expand Down
Loading