webrtc/rtc_base/ifaddrs_converter.cc
Taylor Brandstetter 01cb5f2cee Fix issue where sockets bound to temporary IPv6 addresses are discarded.
Also removing the implicit InterfaceAddress constructor that takes an
IPAddress, so that issues like this won't happen in the future.

And adding a convenience "Network::AddIP" method that takes an
IPAddress, so that code doing that (previously relying on the implicit
constructor) will continue to work.

Bug: webrtc:8972
Change-Id: Id5cf0fca481cfee3f8ab83412fcb41886535bba2
Reviewed-on: https://webrtc-review.googlesource.com/59461
Reviewed-by: Peter Thatcher <pthatcher@webrtc.org>
Commit-Queue: Taylor Brandstetter <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22504}
2018-03-19 19:22:31 +00:00

60 lines
1.8 KiB
C++

/*
* Copyright 2015 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "rtc_base/ifaddrs_converter.h"
namespace rtc {
IfAddrsConverter::IfAddrsConverter() {}
IfAddrsConverter::~IfAddrsConverter() {}
bool IfAddrsConverter::ConvertIfAddrsToIPAddress(
const struct ifaddrs* interface,
InterfaceAddress* ip,
IPAddress* mask) {
switch (interface->ifa_addr->sa_family) {
case AF_INET: {
*ip = InterfaceAddress(IPAddress(
reinterpret_cast<sockaddr_in*>(interface->ifa_addr)->sin_addr));
*mask = IPAddress(
reinterpret_cast<sockaddr_in*>(interface->ifa_netmask)->sin_addr);
return true;
}
case AF_INET6: {
int ip_attributes = IPV6_ADDRESS_FLAG_NONE;
if (!ConvertNativeAttributesToIPAttributes(interface, &ip_attributes)) {
return false;
}
*ip = InterfaceAddress(
reinterpret_cast<sockaddr_in6*>(interface->ifa_addr)->sin6_addr,
ip_attributes);
*mask = IPAddress(
reinterpret_cast<sockaddr_in6*>(interface->ifa_netmask)->sin6_addr);
return true;
}
default: { return false; }
}
}
bool IfAddrsConverter::ConvertNativeAttributesToIPAttributes(
const struct ifaddrs* interface,
int* ip_attributes) {
*ip_attributes = IPV6_ADDRESS_FLAG_NONE;
return true;
}
#if !defined(WEBRTC_MAC)
// For MAC and IOS, it's defined in macifaddrs_converter.cc
IfAddrsConverter* CreateIfAddrsConverter() {
return new IfAddrsConverter();
}
#endif
} // namespace rtc