Changeset 259338 in webkit


Ignore:
Timestamp:
Apr 1, 2020 2:08:26 AM (4 years ago)
Author:
youenn@apple.com
Message:

Support resolution of IPv6 STUN/TURN addresses
https://bugs.webkit.org/show_bug.cgi?id=209808

Reviewed by Eric Carlson.

Source/WebCore:

Add family access to IPAddress to support both IPv4 and IPv6.
Store IPAddress internal value as IPv6 and cast them to IPv4 on demand.

  • platform/network/DNS.h:
  • platform/network/soup/DNSResolveQueueSoup.cpp:

(WebCore::resolvedWithObserverCallback):

Source/WebKit:

Update code to support IPv6 addresses when doing DNS resolution of TURN/STUN servers.
Refactor code to share more code between Cocoa ports and non Cocoa ports.
Manually tested with external IPv6 TURN servers.

  • NetworkProcess/webrtc/NetworkRTCProvider.cpp:

(WebKit::NetworkRTCProvider::createResolver):

  • NetworkProcess/webrtc/NetworkRTCResolverCocoa.cpp:

(WebKit::resolvedName):

Location:
trunk/Source
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r259335 r259338  
     12020-04-01  youenn fablet  <youenn@apple.com>
     2
     3        Support resolution of IPv6 STUN/TURN addresses
     4        https://bugs.webkit.org/show_bug.cgi?id=209808
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add family access to IPAddress to support both IPv4 and IPv6.
     9        Store IPAddress internal value as IPv6 and cast them to IPv4 on demand.
     10
     11        * platform/network/DNS.h:
     12        * platform/network/soup/DNSResolveQueueSoup.cpp:
     13        (WebCore::resolvedWithObserverCallback):
     14
    1152020-03-31  Simon Fraser  <simon.fraser@apple.com>
    216
  • trunk/Source/WebCore/platform/network/DNS.h

    r237944 r259338  
    2828#if OS(WINDOWS)
    2929#include <winsock2.h>
     30#include <ws2tcpip.h>
    3031#else
    3132#include <netinet/in.h>
     
    3334
    3435#include <wtf/Forward.h>
     36#include <wtf/Optional.h>
     37#include <wtf/Variant.h>
    3538
    3639namespace WebCore {
    3740
    38 class WEBCORE_EXPORT IPAddress {
     41class IPAddress {
    3942public:
    40     explicit IPAddress(const struct sockaddr_in& address)
     43    static Optional<IPAddress> fromSockAddrIn6(const struct sockaddr_in6&);
     44    explicit IPAddress(const struct in_addr& address)
     45        : m_address(address)
    4146    {
    42         memset(&m_address, 0, sizeof(struct sockaddr_in));
    43         m_address = address;
    4447    }
    4548
    46     const struct in_addr& getSinAddr() { return m_address.sin_addr; };
     49    explicit IPAddress(const struct in6_addr& address)
     50        : m_address(address)
     51    {
     52    }
     53
     54    bool isIPv4() const { return WTF::holds_alternative<struct in_addr>(m_address); }
     55    bool isIPv6() const { return WTF::holds_alternative<struct in6_addr>(m_address); }
     56
     57    const struct in_addr& ipv4Address() const { return WTF::get<struct in_addr>(m_address); }
     58    const struct in6_addr& ipv6Address() const { return WTF::get<struct in6_addr>(m_address); }
    4759
    4860private:
    49     struct sockaddr_in m_address;
     61    Variant<struct in_addr, struct in6_addr> m_address;
    5062};
    5163
    5264enum class DNSError { Unknown, CannotResolve, Cancelled };
    5365
    54 using DNSAddressesOrError = Expected<Vector<WebCore::IPAddress>, DNSError>;
    55 using DNSCompletionHandler = WTF::CompletionHandler<void(DNSAddressesOrError&&)>;
     66using DNSAddressesOrError = Expected<Vector<IPAddress>, DNSError>;
     67using DNSCompletionHandler = CompletionHandler<void(DNSAddressesOrError&&)>;
    5668
    5769WEBCORE_EXPORT void prefetchDNS(const String& hostname);
     
    5971WEBCORE_EXPORT void stopResolveDNS(uint64_t identifier);
    6072
     73inline Optional<IPAddress> IPAddress::fromSockAddrIn6(const struct sockaddr_in6& address)
     74{
     75    if (address.sin6_family == AF_INET6)
     76        return IPAddress { address.sin6_addr };
     77    if (address.sin6_family == AF_INET)
     78        return IPAddress {reinterpret_cast<const struct sockaddr_in&>(address).sin_addr };
     79    return { };
    6180}
     81
     82}
  • trunk/Source/WebCore/platform/network/soup/DNSResolveQueueSoup.cpp

    r248846 r259338  
    144144    addresses.reserveInitialCapacity(1);
    145145    int len;
    146     auto* ipAddress = reinterpret_cast<const struct sockaddr_in*>(soup_address_get_sockaddr(address, &len));
    147     for (unsigned i = 0; i < sizeof(*ipAddress) / len; i++)
    148         addresses.uncheckedAppend(WebCore::IPAddress(ipAddress[i]));
     146    // FIXME: Support multiple addresses, IPv6 and IPv4.
     147    auto* ipAddress = soup_address_get_sockaddr(address, &len);
     148    if (ipAddress) {
     149        if (auto address = IPAddress::fromSockAddrIn6(reinterpret_cast<const struct sockaddr_in6&>(*ipAddress)))
     150            addresses.uncheckedAppend(*address);
     151    }
     152    if (addresses.isEmpty()) {
     153        completionHandler(makeUnexpected(WebCore::DNSError::CannotResolve));
     154        return;
     155    }
    149156
    150157    completionHandler(addresses);
  • trunk/Source/WebKit/ChangeLog

    r259336 r259338  
     12020-04-01  youenn fablet  <youenn@apple.com>
     2
     3        Support resolution of IPv6 STUN/TURN addresses
     4        https://bugs.webkit.org/show_bug.cgi?id=209808
     5
     6        Reviewed by Eric Carlson.
     7
     8        Update code to support IPv6 addresses when doing DNS resolution of TURN/STUN servers.
     9        Refactor code to share more code between Cocoa ports and non Cocoa ports.
     10        Manually tested with external IPv6 TURN servers.
     11
     12        * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
     13        (WebKit::NetworkRTCProvider::createResolver):
     14        * NetworkProcess/webrtc/NetworkRTCResolverCocoa.cpp:
     15        (WebKit::resolvedName):
     16
    1172020-03-31  Megan Gardner  <megan_gardner@apple.com>
    218
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp

    r256185 r259338  
    202202}
    203203
    204 #if PLATFORM(COCOA)
    205204
    206205void NetworkRTCProvider::createResolver(LibWebRTCResolverIdentifier identifier, const String& address)
    207206{
    208     auto resolver = NetworkRTCResolver::create(identifier, [this, identifier](WebCore::DNSAddressesOrError&& result) mutable {
     207    WebCore::DNSCompletionHandler completionHandler = [this, identifier](auto&& result) {
    209208        if (!result.has_value()) {
    210209            if (result.error() != WebCore::DNSError::Cancelled)
     
    213212        }
    214213
    215         auto addresses = WTF::map(result.value(), [] (auto& address) {
    216             return RTCNetwork::IPAddress { rtc::IPAddress { address.getSinAddr() } };
    217         });
    218 
    219         m_connection->connection().send(Messages::WebRTCResolver::SetResolvedAddress(addresses), identifier);
    220     });
     214        Vector<RTCNetwork::IPAddress> ipAddresses;
     215        ipAddresses.reserveInitialCapacity(result.value().size());
     216        for (auto& address : result.value()) {
     217            if (address.isIPv4())
     218                ipAddresses.uncheckedAppend(rtc::IPAddress { address.ipv4Address() });
     219            else if (address.isIPv6())
     220                ipAddresses.uncheckedAppend(rtc::IPAddress { address.ipv6Address() });
     221        }
     222
     223        m_connection->connection().send(Messages::WebRTCResolver::SetResolvedAddress(ipAddresses), identifier);
     224    };
     225
     226#if PLATFORM(COCOA)
     227    auto resolver = NetworkRTCResolver::create(identifier, WTFMove(completionHandler));
    221228    resolver->start(address);
    222229    m_resolvers.add(identifier, WTFMove(resolver));
     230#else
     231    WebCore::resolveDNS(address, identifier.toUInt64(), WTFMove(completionHandler));
     232#endif
    223233}
    224234
    225235void NetworkRTCProvider::stopResolver(LibWebRTCResolverIdentifier identifier)
    226236{
     237#if PLATFORM(COCOA)
    227238    if (auto resolver = m_resolvers.take(identifier))
    228239        resolver->stop();
    229 }
    230 
    231240#else
    232 
    233 void NetworkRTCProvider::createResolver(LibWebRTCResolverIdentifier identifier, const String& address)
    234 {
    235     auto completionHandler = [this, identifier](WebCore::DNSAddressesOrError&& result) mutable {
    236         if (!result.has_value()) {
    237             if (result.error() != WebCore::DNSError::Cancelled)
    238                 m_connection->connection().send(Messages::WebRTCResolver::ResolvedAddressError(1), identifier);
    239             return;
    240         }
    241 
    242         auto addresses = WTF::map(result.value(), [] (auto& address) {
    243             return RTCNetwork::IPAddress { rtc::IPAddress { address.getSinAddr() } };
    244         });
    245 
    246         m_connection->connection().send(Messages::WebRTCResolver::SetResolvedAddress(addresses), identifier);
    247     };
    248 
    249     WebCore::resolveDNS(address, identifier.toUInt64(), WTFMove(completionHandler));
    250 }
    251 
    252 void NetworkRTCProvider::stopResolver(LibWebRTCResolverIdentifier identifier)
    253 {
    254241    WebCore::stopResolveDNS(identifier.toUInt64());
    255 }
    256 
    257 #endif
     242#endif
     243}
    258244
    259245void NetworkRTCProvider::closeListeningSockets(Function<void()>&& completionHandler)
  • trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolverCocoa.cpp

    r256185 r259338  
    5656    for (size_t index = 0; index < count; ++index) {
    5757        CFDataRef data = (CFDataRef)CFArrayGetValueAtIndex(resolvedAddresses, index);
    58         auto* address = reinterpret_cast<const struct sockaddr_in*>(CFDataGetBytePtr(data));
    59         if (address->sin_family == AF_INET)
    60             addresses.uncheckedAppend(WebCore::IPAddress(*address));
    61         // FIXME: We should probably return AF_INET6 addresses as well.
     58        if (auto address = IPAddress::fromSockAddrIn6(*reinterpret_cast<const struct sockaddr_in6*>(CFDataGetBytePtr(data))))
     59            addresses.uncheckedAppend(*address);
    6260    }
    6361    if (addresses.isEmpty()) {
Note: See TracChangeset for help on using the changeset viewer.