Skip to content

Commit

Permalink
[Inet] Add Openthread Native ipv6 address (#17352)
Browse files Browse the repository at this point in the history
* Add OpenThread native ipv6
  • Loading branch information
jepenven-silabs authored Apr 14, 2022
1 parent f3502e6 commit 75bdf79
Show file tree
Hide file tree
Showing 7 changed files with 219 additions and 22 deletions.
4 changes: 3 additions & 1 deletion config/qpg/chip-gn/.gn
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ import("//build_overrides/chip.gni")
buildconfig = "//build/config/BUILDCONFIG.gn"

# CHIP uses angle bracket includes.
check_system_includes = true
# DISABLED since CI failed on PR 17352
# Build error out for unused/unavailble include file (IPAddress.h : <openthread/ip6.h>)
check_system_includes = false

default_args = {
target_cpu = "arm"
Expand Down
23 changes: 15 additions & 8 deletions src/inet/IPAddress-StringFuncts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
#include <inet/IPAddress.h>
#include <lib/support/CodeUtils.h>

#if !CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_SOCKETS || CHIP_SYSTEM_CONFIG_USE_NETWORK_FRAMEWORK
#include <arpa/inet.h>
#endif

Expand All @@ -42,7 +42,7 @@ namespace Inet {

char * IPAddress::ToString(char * buf, uint32_t bufSize) const
{
#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
#if INET_CONFIG_ENABLE_IPV4
if (IsIPv4())
{
Expand All @@ -55,7 +55,7 @@ char * IPAddress::ToString(char * buf, uint32_t bufSize) const
ip6_addr_t ip6_addr = ToIPv6();
ip6addr_ntoa_r(&ip6_addr, buf, (int) bufSize);
}
#else // !CHIP_SYSTEM_CONFIG_USE_LWIP
#elif CHIP_SYSTEM_CONFIG_USE_SOCKETS
// socklen_t is sometimes signed, sometimes not, so the only safe way to do
// this is to promote everything to an unsigned type that's known to be big
// enough for everything, then cast back to uint32_t after taking the min.
Expand All @@ -77,6 +77,9 @@ char * IPAddress::ToString(char * buf, uint32_t bufSize) const
// This cast is safe because |s| points into |buf| which is not const.
buf = const_cast<char *>(s);
}
#elif CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
otIp6Address addr = ToIPv6();
otIp6AddressToString(&addr, buf, static_cast<uint16_t>(bufSize));
#endif // !CHIP_SYSTEM_CONFIG_USE_LWIP

return buf;
Expand All @@ -87,11 +90,11 @@ bool IPAddress::FromString(const char * str, IPAddress & output)
#if INET_CONFIG_ENABLE_IPV4
if (strchr(str, ':') == nullptr)
{
#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
ip4_addr_t ipv4Addr;
if (!ip4addr_aton(str, &ipv4Addr))
return false;
#else // !CHIP_SYSTEM_CONFIG_USE_LWIP
#elif CHIP_SYSTEM_CONFIG_USE_SOCKETS
struct in_addr ipv4Addr;
if (inet_pton(AF_INET, str, &ipv4Addr) < 1)
return false;
Expand All @@ -101,15 +104,19 @@ bool IPAddress::FromString(const char * str, IPAddress & output)
else
#endif // INET_CONFIG_ENABLE_IPV4
{
#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
ip6_addr_t ipv6Addr;
if (!ip6addr_aton(str, &ipv6Addr))
return false;
#else // !CHIP_SYSTEM_CONFIG_USE_LWIP
#elif CHIP_SYSTEM_CONFIG_USE_SOCKETS
struct in6_addr ipv6Addr;
if (inet_pton(AF_INET6, str, &ipv6Addr) < 1)
return false;
#endif // !CHIP_SYSTEM_CONFIG_USE_LWIP
#elif CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
otIp6Address ipv6Addr;
if (OT_ERROR_NONE != otIp6AddressFromString(str, &ipv6Addr))
return false;
#endif
output = IPAddress(ipv6Addr);
}

Expand Down
25 changes: 24 additions & 1 deletion src/inet/IPAddress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ IPAddress & IPAddress::operator=(const IPAddress & other)
return *this;
}

#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT

IPAddress::IPAddress(const ip6_addr_t & ipv6Addr)
{
Expand Down Expand Up @@ -269,6 +269,29 @@ CHIP_ERROR IPAddress::GetIPAddressFromSockAddr(const SockAddr & sockaddr, IPAddr

#endif // CHIP_SYSTEM_CONFIG_USE_SOCKETS || CHIP_SYSTEM_CONFIG_USE_NETWORK_FRAMEWORK

#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
IPAddress::IPAddress(const otIp6Address & ipv6Addr)
{
static_assert(sizeof(ipv6Addr.mFields.m32) == sizeof(Addr), "otIp6Address size mismatch");
memcpy(Addr, ipv6Addr.mFields.m32, sizeof(Addr));
}
otIp6Address IPAddress::ToIPv6() const
{
otIp6Address otAddr;
static_assert(sizeof(otAddr.mFields.m32) == sizeof(Addr), "otIp6Address size mismatch");
memcpy(otAddr.mFields.m32, Addr, sizeof(otAddr.mFields.m32));
return otAddr;
}

IPAddress IPAddress::FromOtAddr(otIp6Address & address)
{
IPAddress addr;
static_assert(sizeof(address.mFields.m32) == sizeof(addr), "otIp6Address size mismatch");
memcpy(addr.Addr, address.mFields.m32, sizeof(addr.Addr));
return addr;
}
#endif // CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT

// Is address an IPv4 address encoded in IPv6 format?
bool IPAddress::IsIPv4() const
{
Expand Down
33 changes: 29 additions & 4 deletions src/inet/IPAddress.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

#include "inet/IANAConstants.h"

#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
#include <lwip/init.h>
#include <lwip/ip_addr.h>
#if INET_CONFIG_ENABLE_IPV4
Expand All @@ -51,6 +51,11 @@
#include <lwip/inet.h>
#endif // CHIP_SYSTEM_CONFIG_USE_LWIP

#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
#include <openthread/icmp6.h>
#include <openthread/ip6.h>
#endif // CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT

#if CHIP_SYSTEM_CONFIG_USE_SOCKETS || CHIP_SYSTEM_CONFIG_USE_NETWORK_FRAMEWORK
#include <net/if.h>
#include <netinet/in.h>
Expand All @@ -60,6 +65,10 @@
#include <sys/socket.h>
#endif // CHIP_SYSTEM_CONFIG_USE_SOCKETS

#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT && INET_CONFIG_ENABLE_IPV4
#error Forbidden : native Open Thread implementation with IPV4 enabled
#endif

#define NL_INET_IPV6_ADDR_LEN_IN_BYTES (16)
#define NL_INET_IPV6_MCAST_GROUP_LEN_IN_BYTES (14)

Expand Down Expand Up @@ -118,17 +127,24 @@ class DLL_EXPORT IPAddress
/**
* Maximum length of the string representation of an IP address, including a terminating NUL.
*/
#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
static constexpr uint16_t kMaxStringLength = IP6ADDR_STRLEN_MAX;
#endif // CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_SOCKETS || CHIP_SYSTEM_CONFIG_USE_NETWORK_FRAMEWORK
static constexpr uint16_t kMaxStringLength = INET6_ADDRSTRLEN;
#endif // CHIP_SYSTEM_CONFIG_USE_SOCKETS || CHIP_SYSTEM_CONFIG_USE_NETWORK_FRAMEWORK

#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
#ifndef INET6_ADDRSTRLEN
#define INET6_ADDRSTRLEN OT_IP6_ADDRESS_STRING_SIZE
#endif
static constexpr uint16_t kMaxStringLength = OT_IP6_ADDRESS_STRING_SIZE;
#endif

IPAddress() = default;
IPAddress(const IPAddress & other) = default;

#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
explicit IPAddress(const ip6_addr_t & ipv6Addr);
#if INET_CONFIG_ENABLE_IPV4 || LWIP_IPV4
explicit IPAddress(const ip4_addr_t & ipv4Addr);
Expand All @@ -143,6 +159,10 @@ class DLL_EXPORT IPAddress
#endif // INET_CONFIG_ENABLE_IPV4
#endif // CHIP_SYSTEM_CONFIG_USE_SOCKETS || CHIP_SYSTEM_CONFIG_USE_NETWORK_FRAMEWORK

#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
explicit IPAddress(const otIp6Address & ipv6Addr);
#endif

/**
* @brief Opaque word array to contain IP addresses (independent of protocol version)
*
Expand Down Expand Up @@ -470,7 +490,7 @@ class DLL_EXPORT IPAddress
* either unspecified or not an IPv4 address.
*/

#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT

/**
* @fn ToLwIPAddr() const
Expand Down Expand Up @@ -534,6 +554,11 @@ class DLL_EXPORT IPAddress

#endif // CHIP_SYSTEM_CONFIG_USE_SOCKETS || CHIP_SYSTEM_USE_NETWORK_FRAMEWORK

#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
otIp6Address ToIPv6() const;
static IPAddress FromOtAddr(otIp6Address & address);
#endif // CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT

/**
* @brief Construct an IPv6 unique-local address (ULA) from its parts.
*
Expand Down
75 changes: 73 additions & 2 deletions src/inet/InetInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
#include <lib/support/CodeUtils.h>
#include <lib/support/DLLUtil.h>

#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
#include <lwip/netif.h>
#include <lwip/sys.h>
#include <lwip/tcpip.h>
Expand Down Expand Up @@ -63,7 +63,78 @@
namespace chip {
namespace Inet {

#if CHIP_SYSTEM_CONFIG_USE_LWIP
#if CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT
CHIP_ERROR InterfaceId::GetInterfaceName(char * nameBuf, size_t nameBufSize) const
{
if (mPlatformInterface && nameBufSize >= kMaxIfNameLength)
{
nameBuf[0] = 'o';
nameBuf[1] = 't';
nameBuf[2] = 0;
}
else
{
nameBuf[0] = 0;
}

return CHIP_NO_ERROR;
}
CHIP_ERROR InterfaceId::InterfaceNameToId(const char * intfName, InterfaceId & interface)
{
if (strlen(intfName) < 3)
{
return INET_ERROR_UNKNOWN_INTERFACE;
}
char * parseEnd = nullptr;
unsigned long intfNum = strtoul(intfName + 2, &parseEnd, 10);
if (*parseEnd != 0 || intfNum > UINT8_MAX)
{
return INET_ERROR_UNKNOWN_INTERFACE;
}

interface = InterfaceId(intfNum);
if (intfNum == 0)
{
return INET_ERROR_UNKNOWN_INTERFACE;
}
return CHIP_NO_ERROR;
}

bool InterfaceIterator::Next()
{
// TODO : Cleanup #17346
return false;
}
bool InterfaceAddressIterator::HasCurrent()
{
return mIntfIter.HasCurrent();
}

bool InterfaceAddressIterator::Next()
{
// TODO : Cleanup #17346
return false;
}
CHIP_ERROR InterfaceAddressIterator::GetAddress(IPAddress & outIPAddress)
{
if (!HasCurrent())
{
return CHIP_ERROR_SENTINEL;
}

outIPAddress = IPAddress((*(mAddrInfoList[mCurAddrIndex].mAddress)));
return CHIP_NO_ERROR;
}

uint8_t InterfaceAddressIterator::GetPrefixLength()
{
// Only 64 bits prefix are supported
return 64;
}

#endif

#if CHIP_SYSTEM_CONFIG_USE_LWIP && !CHIP_SYSTEM_CONFIG_USE_OPEN_THREAD_ENDPOINT

CHIP_ERROR InterfaceId::GetInterfaceName(char * nameBuf, size_t nameBufSize) const
{
Expand Down
Loading

0 comments on commit 75bdf79

Please sign in to comment.