⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 259690 in webkit


Ignore:
Timestamp:
Apr 7, 2020, 5:32:31 PM (6 years ago)
Author:
Alan Coon
Message:

Cherry-pick r259338. rdar://problem/61269727

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):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259338 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Location:
branches/safari-609-branch/Source
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-609-branch/Source/WebCore/ChangeLog

    r259689 r259690  
     12020-04-07  Russell Epstein  <repstein@apple.com>
     2
     3        Cherry-pick r259338. rdar://problem/61269727
     4
     5    Support resolution of IPv6 STUN/TURN addresses
     6    https://bugs.webkit.org/show_bug.cgi?id=209808
     7   
     8    Reviewed by Eric Carlson.
     9   
     10    Source/WebCore:
     11   
     12    Add family access to IPAddress to support both IPv4 and IPv6.
     13    Store IPAddress internal value as IPv6 and cast them to IPv4 on demand.
     14   
     15    * platform/network/DNS.h:
     16    * platform/network/soup/DNSResolveQueueSoup.cpp:
     17    (WebCore::resolvedWithObserverCallback):
     18   
     19    Source/WebKit:
     20   
     21    Update code to support IPv6 addresses when doing DNS resolution of TURN/STUN servers.
     22    Refactor code to share more code between Cocoa ports and non Cocoa ports.
     23    Manually tested with external IPv6 TURN servers.
     24   
     25    * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
     26    (WebKit::NetworkRTCProvider::createResolver):
     27    * NetworkProcess/webrtc/NetworkRTCResolverCocoa.cpp:
     28    (WebKit::resolvedName):
     29   
     30    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259338 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     31
     32    2020-04-01  youenn fablet  <youenn@apple.com>
     33
     34            Support resolution of IPv6 STUN/TURN addresses
     35            https://bugs.webkit.org/show_bug.cgi?id=209808
     36
     37            Reviewed by Eric Carlson.
     38
     39            Add family access to IPAddress to support both IPv4 and IPv6.
     40            Store IPAddress internal value as IPv6 and cast them to IPv4 on demand.
     41
     42            * platform/network/DNS.h:
     43            * platform/network/soup/DNSResolveQueueSoup.cpp:
     44            (WebCore::resolvedWithObserverCallback):
     45
    1462020-04-07  Russell Epstein  <repstein@apple.com>
    247
  • branches/safari-609-branch/Source/WebCore/platform/network/DNS.h

    r237944 r259690  
    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}
  • branches/safari-609-branch/Source/WebCore/platform/network/soup/DNSResolveQueueSoup.cpp

    r248846 r259690  
    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);
  • branches/safari-609-branch/Source/WebKit/ChangeLog

    r259689 r259690  
     12020-04-07  Russell Epstein  <repstein@apple.com>
     2
     3        Cherry-pick r259338. rdar://problem/61269727
     4
     5    Support resolution of IPv6 STUN/TURN addresses
     6    https://bugs.webkit.org/show_bug.cgi?id=209808
     7   
     8    Reviewed by Eric Carlson.
     9   
     10    Source/WebCore:
     11   
     12    Add family access to IPAddress to support both IPv4 and IPv6.
     13    Store IPAddress internal value as IPv6 and cast them to IPv4 on demand.
     14   
     15    * platform/network/DNS.h:
     16    * platform/network/soup/DNSResolveQueueSoup.cpp:
     17    (WebCore::resolvedWithObserverCallback):
     18   
     19    Source/WebKit:
     20   
     21    Update code to support IPv6 addresses when doing DNS resolution of TURN/STUN servers.
     22    Refactor code to share more code between Cocoa ports and non Cocoa ports.
     23    Manually tested with external IPv6 TURN servers.
     24   
     25    * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
     26    (WebKit::NetworkRTCProvider::createResolver):
     27    * NetworkProcess/webrtc/NetworkRTCResolverCocoa.cpp:
     28    (WebKit::resolvedName):
     29   
     30    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259338 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     31
     32    2020-04-01  youenn fablet  <youenn@apple.com>
     33
     34            Support resolution of IPv6 STUN/TURN addresses
     35            https://bugs.webkit.org/show_bug.cgi?id=209808
     36
     37            Reviewed by Eric Carlson.
     38
     39            Update code to support IPv6 addresses when doing DNS resolution of TURN/STUN servers.
     40            Refactor code to share more code between Cocoa ports and non Cocoa ports.
     41            Manually tested with external IPv6 TURN servers.
     42
     43            * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
     44            (WebKit::NetworkRTCProvider::createResolver):
     45            * NetworkProcess/webrtc/NetworkRTCResolverCocoa.cpp:
     46            (WebKit::resolvedName):
     47
    1482020-04-07  Russell Epstein  <repstein@apple.com>
    249
  • branches/safari-609-branch/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp

    r253699 r259690  
    202202}
    203203
    204 #if PLATFORM(COCOA)
    205204
    206205void NetworkRTCProvider::createResolver(uint64_t 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(uint64_t 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(uint64_t 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, WTFMove(completionHandler));
    250 }
    251 
    252 void NetworkRTCProvider::stopResolver(uint64_t identifier)
    253 {
    254     WebCore::stopResolveDNS(identifier);
    255 }
    256 
    257 #endif
     241    WebCore::stopResolveDNS(identifier.toUInt64());
     242#endif
     243}
    258244
    259245void NetworkRTCProvider::closeListeningSockets(Function<void()>&& completionHandler)
  • branches/safari-609-branch/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolverCocoa.cpp

    r231235 r259690  
    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.