Changeset 259338 in webkit
- Timestamp:
- Apr 1, 2020 2:08:26 AM (4 years ago)
- Location:
- trunk/Source
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r259335 r259338 1 2020-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 1 15 2020-03-31 Simon Fraser <simon.fraser@apple.com> 2 16 -
trunk/Source/WebCore/platform/network/DNS.h
r237944 r259338 28 28 #if OS(WINDOWS) 29 29 #include <winsock2.h> 30 #include <ws2tcpip.h> 30 31 #else 31 32 #include <netinet/in.h> … … 33 34 34 35 #include <wtf/Forward.h> 36 #include <wtf/Optional.h> 37 #include <wtf/Variant.h> 35 38 36 39 namespace WebCore { 37 40 38 class WEBCORE_EXPORTIPAddress {41 class IPAddress { 39 42 public: 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) 41 46 { 42 memset(&m_address, 0, sizeof(struct sockaddr_in));43 m_address = address;44 47 } 45 48 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); } 47 59 48 60 private: 49 struct sockaddr_inm_address;61 Variant<struct in_addr, struct in6_addr> m_address; 50 62 }; 51 63 52 64 enum class DNSError { Unknown, CannotResolve, Cancelled }; 53 65 54 using DNSAddressesOrError = Expected<Vector< WebCore::IPAddress>, DNSError>;55 using DNSCompletionHandler = WTF::CompletionHandler<void(DNSAddressesOrError&&)>;66 using DNSAddressesOrError = Expected<Vector<IPAddress>, DNSError>; 67 using DNSCompletionHandler = CompletionHandler<void(DNSAddressesOrError&&)>; 56 68 57 69 WEBCORE_EXPORT void prefetchDNS(const String& hostname); … … 59 71 WEBCORE_EXPORT void stopResolveDNS(uint64_t identifier); 60 72 73 inline 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 { }; 61 80 } 81 82 } -
trunk/Source/WebCore/platform/network/soup/DNSResolveQueueSoup.cpp
r248846 r259338 144 144 addresses.reserveInitialCapacity(1); 145 145 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 } 149 156 150 157 completionHandler(addresses); -
trunk/Source/WebKit/ChangeLog
r259336 r259338 1 2020-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 1 17 2020-03-31 Megan Gardner <megan_gardner@apple.com> 2 18 -
trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp
r256185 r259338 202 202 } 203 203 204 #if PLATFORM(COCOA)205 204 206 205 void NetworkRTCProvider::createResolver(LibWebRTCResolverIdentifier identifier, const String& address) 207 206 { 208 auto resolver = NetworkRTCResolver::create(identifier, [this, identifier](WebCore::DNSAddressesOrError&& result) mutable{207 WebCore::DNSCompletionHandler completionHandler = [this, identifier](auto&& result) { 209 208 if (!result.has_value()) { 210 209 if (result.error() != WebCore::DNSError::Cancelled) … … 213 212 } 214 213 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)); 221 228 resolver->start(address); 222 229 m_resolvers.add(identifier, WTFMove(resolver)); 230 #else 231 WebCore::resolveDNS(address, identifier.toUInt64(), WTFMove(completionHandler)); 232 #endif 223 233 } 224 234 225 235 void NetworkRTCProvider::stopResolver(LibWebRTCResolverIdentifier identifier) 226 236 { 237 #if PLATFORM(COCOA) 227 238 if (auto resolver = m_resolvers.take(identifier)) 228 239 resolver->stop(); 229 }230 231 240 #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 {254 241 WebCore::stopResolveDNS(identifier.toUInt64()); 255 } 256 257 #endif 242 #endif 243 } 258 244 259 245 void NetworkRTCProvider::closeListeningSockets(Function<void()>&& completionHandler) -
trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCResolverCocoa.cpp
r256185 r259338 56 56 for (size_t index = 0; index < count; ++index) { 57 57 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); 62 60 } 63 61 if (addresses.isEmpty()) {
Note: See TracChangeset
for help on using the changeset viewer.