Fix IPv6 address scope bug

Signed-off-by: Ciupis, Jedrzej <jedrzej.ciupis@nordicsemi.no>
This commit is contained in:
Ciupis, Jedrzej
2017-08-10 14:32:00 +02:00
parent 7099531e0e
commit 9c20f2f18d

View File

@@ -328,12 +328,15 @@ int UDPPort6::unicast(const uint8_t* buf, uint32_t length, SensorNetAddress* add
hints.ai_family = AF_INET6; // use IPv6 hints.ai_family = AF_INET6; // use IPv6
hints.ai_socktype = SOCK_DGRAM; hints.ai_socktype = SOCK_DGRAM;
int port = 0;
string portStr; string portStr;
if(addr->getPortNo() != 0) if(addr->getPortNo() != 0)
{ {
portStr = to_string(addr->getPortNo()); port = htons(addr->getPortNo());
portStr = to_string(port);
} else { } else {
portStr = to_string(_uniPortNo); port = _uniPortNo;
portStr = to_string(port);
} }
if(strlen(_interfaceName) != 0) if(strlen(_interfaceName) != 0)
@@ -341,8 +344,16 @@ int UDPPort6::unicast(const uint8_t* buf, uint32_t length, SensorNetAddress* add
strcpy(destStr, addr->getAddress()); strcpy(destStr, addr->getAddress());
strcat(destStr,"%"); strcat(destStr,"%");
strcat(destStr,_interfaceName); strcat(destStr,_interfaceName);
getaddrinfo(destStr, portStr.c_str(), &hints, &res); if(IN6_IS_ADDR_LINKLOCAL(addr->getAddress()))
{
getaddrinfo(destStr, portStr.c_str(), &hints, &res);
}
else
{
getaddrinfo(addr->getAddress(), portStr.c_str(), &hints, &res);
}
} else { } else {
strcpy(destStr, addr->getAddress());
getaddrinfo(addr->getAddress(), portStr.c_str(), &hints, &res); getaddrinfo(addr->getAddress(), portStr.c_str(), &hints, &res);
} }
@@ -353,7 +364,7 @@ int UDPPort6::unicast(const uint8_t* buf, uint32_t length, SensorNetAddress* add
WRITELOG("errno in UDPPort::unicast(sendto): %d, %s\n",status,strerror(status)); WRITELOG("errno in UDPPort::unicast(sendto): %d, %s\n",status,strerror(status));
} }
WRITELOG("unicast sendto %s, port: %d length = %d\n", destStr,portStr.c_str(),status); WRITELOG("unicast sendto %s, port: %d length = %d\n", destStr,port,status);
return status; return status;
} }
@@ -376,7 +387,15 @@ int UDPPort6::broadcast(const uint8_t* buf, uint32_t length)
strcpy(destStr, _grpAddr.getAddress()); strcpy(destStr, _grpAddr.getAddress());
strcat(destStr,"%"); strcat(destStr,"%");
strcat(destStr,_interfaceName); strcat(destStr,_interfaceName);
err = getaddrinfo(destStr, std::to_string(_uniPortNo).c_str(), &hint, &info ); if(IN6_IS_ADDR_MC_NODELOCAL(_grpAddr.getAddress()) ||
IN6_IS_ADDR_MC_LINKLOCAL(_grpAddr.getAddress()))
{
err = getaddrinfo(destStr, std::to_string(_uniPortNo).c_str(), &hint, &info );
}
else
{
err = getaddrinfo(_grpAddr.getAddress(), std::to_string(_uniPortNo).c_str(), &hint, &info );
}
} else { } else {
err = getaddrinfo(_grpAddr.getAddress(), std::to_string(_uniPortNo).c_str(), &hint, &info ); err = getaddrinfo(_grpAddr.getAddress(), std::to_string(_uniPortNo).c_str(), &hint, &info );
} }