Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Inet] Add Openthread Native ipv6 address #17352

Merged
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
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));
jepenven-silabs marked this conversation as resolved.
Show resolved Hide resolved
}
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