aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
Diffstat (limited to 'platform')
-rw-r--r--platform/BUILD.gn36
-rw-r--r--platform/api/tls_connection.cc2
-rw-r--r--platform/api/tls_connection.h5
-rw-r--r--platform/api/tls_connection_factory.cc2
-rw-r--r--platform/api/tls_connection_factory.h3
-rw-r--r--platform/api/udp_socket.cc2
-rw-r--r--platform/api/udp_socket.h4
-rw-r--r--platform/base/error.cc6
-rw-r--r--platform/base/error.h8
-rw-r--r--platform/base/interface_info.cc6
-rw-r--r--platform/base/interface_info.h3
-rw-r--r--platform/base/trace_logging_types.h2
-rw-r--r--platform/impl/network_interface_linux.cc58
-rw-r--r--platform/impl/network_interface_mac.cc10
-rw-r--r--platform/impl/network_interface_win.cc5
-rw-r--r--platform/impl/task_runner.cc1
-rw-r--r--platform/impl/tls_connection_posix.cc8
-rw-r--r--platform/impl/tls_connection_posix.h1
-rw-r--r--platform/test/mock_tls_connection.h4
19 files changed, 109 insertions, 57 deletions
diff --git a/platform/BUILD.gn b/platform/BUILD.gn
index e98067f1..304c0853 100644
--- a/platform/BUILD.gn
+++ b/platform/BUILD.gn
@@ -33,6 +33,15 @@ source_set("base") {
public_configs = [ "../build:openscreen_include_dirs" ]
}
+# Public API source files. May depend on nothing except :base.
+source_set("logging") {
+ defines = []
+
+ sources = [ "api/logging.h" ]
+
+ public_deps = [ ":base" ]
+}
+
# Public API source files. These may depend on nothing except :base.
source_set("api") {
defines = []
@@ -56,7 +65,10 @@ source_set("api") {
"api/udp_socket.h",
]
- public_deps = [ ":base" ]
+ public_deps = [
+ ":base",
+ ":logging",
+ ]
}
# The following target is only activated in standalone builds (see :platform).
@@ -211,10 +223,22 @@ source_set("unittests") {
"base/udp_packet_unittest.cc",
]
+ deps = [
+ ":platform",
+ ":test",
+ "../third_party/abseil",
+ "../third_party/boringssl",
+ "../third_party/googletest:gmock",
+ "../third_party/googletest:gtest",
+ "../util",
+ ]
+
# The socket integration tests assume that you can Bind with UDP sockets,
# which is simply not true when we are built inside of Chromium.
if (!build_with_chromium) {
sources += [ "api/socket_integration_unittest.cc" ]
+
+ deps += [ ":standalone_impl" ]
}
# The unit tests in impl/ assume the standalone implementation is being used.
@@ -238,14 +262,4 @@ source_set("unittests") {
]
}
}
-
- deps = [
- ":platform",
- ":test",
- "../third_party/abseil",
- "../third_party/boringssl",
- "../third_party/googletest:gmock",
- "../third_party/googletest:gtest",
- "../util",
- ]
}
diff --git a/platform/api/tls_connection.cc b/platform/api/tls_connection.cc
index 9668c114..12fdc5cd 100644
--- a/platform/api/tls_connection.cc
+++ b/platform/api/tls_connection.cc
@@ -9,4 +9,6 @@ namespace openscreen {
TlsConnection::TlsConnection() = default;
TlsConnection::~TlsConnection() = default;
+TlsConnection::Client::~Client() = default;
+
} // namespace openscreen
diff --git a/platform/api/tls_connection.h b/platform/api/tls_connection.h
index 4d409cb5..1f47bce6 100644
--- a/platform/api/tls_connection.h
+++ b/platform/api/tls_connection.h
@@ -26,7 +26,7 @@ class TlsConnection {
std::vector<uint8_t> block) = 0;
protected:
- virtual ~Client() = default;
+ virtual ~Client();
};
virtual ~TlsConnection();
@@ -40,9 +40,6 @@ class TlsConnection {
// Sends a message. Returns true iff the message will be sent.
[[nodiscard]] virtual bool Send(const void* data, size_t len) = 0;
- // Get the local address.
- virtual IPEndpoint GetLocalEndpoint() const = 0;
-
// Get the connected remote address.
virtual IPEndpoint GetRemoteEndpoint() const = 0;
diff --git a/platform/api/tls_connection_factory.cc b/platform/api/tls_connection_factory.cc
index e64078f1..c23c9e7e 100644
--- a/platform/api/tls_connection_factory.cc
+++ b/platform/api/tls_connection_factory.cc
@@ -9,4 +9,6 @@ namespace openscreen {
TlsConnectionFactory::TlsConnectionFactory() = default;
TlsConnectionFactory::~TlsConnectionFactory() = default;
+TlsConnectionFactory::Client::~Client() = default;
+
} // namespace openscreen
diff --git a/platform/api/tls_connection_factory.h b/platform/api/tls_connection_factory.h
index 80dc8ac6..b9d1e2f5 100644
--- a/platform/api/tls_connection_factory.h
+++ b/platform/api/tls_connection_factory.h
@@ -46,6 +46,9 @@ class TlsConnectionFactory {
// Called when a non-recoverable error occurs.
virtual void OnError(TlsConnectionFactory* factory, Error error) = 0;
+
+ protected:
+ virtual ~Client();
};
// The connection factory requires a client for yielding creation results
diff --git a/platform/api/udp_socket.cc b/platform/api/udp_socket.cc
index 47eba8bd..d895cf04 100644
--- a/platform/api/udp_socket.cc
+++ b/platform/api/udp_socket.cc
@@ -9,4 +9,6 @@ namespace openscreen {
UdpSocket::UdpSocket() = default;
UdpSocket::~UdpSocket() = default;
+UdpSocket::Client::~Client() = default;
+
} // namespace openscreen
diff --git a/platform/api/udp_socket.h b/platform/api/udp_socket.h
index 3baf4119..d77d95f9 100644
--- a/platform/api/udp_socket.h
+++ b/platform/api/udp_socket.h
@@ -30,7 +30,6 @@ class UdpSocket {
// Client for the UdpSocket class.
class Client {
public:
- virtual ~Client() = default;
// Method called when the UDP socket is bound. Default implementation
// does nothing, as clients may not care about the socket bind state.
@@ -49,6 +48,9 @@ class UdpSocket {
// Method called when a packet is read.
virtual void OnRead(UdpSocket* socket, ErrorOr<UdpPacket> packet) = 0;
+
+ protected:
+ virtual ~Client();
};
// Constants used to specify how we want packets sent from this socket.
diff --git a/platform/base/error.cc b/platform/base/error.cc
index bad8a84f..a9a146e3 100644
--- a/platform/base/error.cc
+++ b/platform/base/error.cc
@@ -254,10 +254,16 @@ std::ostream& operator<<(std::ostream& os, const Error::Code& code) {
return os << "ProcessReceivedRecordFailure";
case Error::Code::kUnknownCodec:
return os << "UnknownCodec";
+ case Error::Code::kInvalidCodecParameter:
+ return os << "InvalidCodecParameter";
case Error::Code::kSocketFailure:
return os << "SocketFailure";
case Error::Code::kUnencryptedOffer:
return os << "UnencryptedOffer";
+ case Error::Code::kRemotingNotSupported:
+ return os << "RemotingNotSupported";
+ case Error::Code::kNegotiationFailure:
+ return os << "NegotiationFailure";
case Error::Code::kNone:
break;
}
diff --git a/platform/base/error.h b/platform/base/error.h
index 9deacd2f..2f9216f2 100644
--- a/platform/base/error.h
+++ b/platform/base/error.h
@@ -186,8 +186,14 @@ class Error {
// Cast streaming errors
kTypeError,
kUnknownCodec,
+ kInvalidCodecParameter,
kSocketFailure,
- kUnencryptedOffer
+ kUnencryptedOffer,
+ kRemotingNotSupported,
+
+ // A negotiation failure means that the current negotiation must be
+ // restarted by the sender.
+ kNegotiationFailure,
};
Error();
diff --git a/platform/base/interface_info.cc b/platform/base/interface_info.cc
index 2ada91be..5fb8c62f 100644
--- a/platform/base/interface_info.cc
+++ b/platform/base/interface_info.cc
@@ -5,6 +5,7 @@
#include "platform/base/interface_info.h"
#include <algorithm>
+#include <utility>
namespace openscreen {
@@ -46,6 +47,11 @@ IPAddress InterfaceInfo::GetIpAddressV6() const {
return IPAddress{};
}
+bool InterfaceInfo::HasHardwareAddress() const {
+ return std::any_of(hardware_address.begin(), hardware_address.end(),
+ [](uint8_t e) { return e != 0; });
+}
+
std::ostream& operator<<(std::ostream& out, const IPSubnet& subnet) {
if (subnet.address.IsV6()) {
out << '[';
diff --git a/platform/base/interface_info.h b/platform/base/interface_info.h
index 81686063..01944870 100644
--- a/platform/base/interface_info.h
+++ b/platform/base/interface_info.h
@@ -63,6 +63,9 @@ struct InterfaceInfo {
IPAddress GetIpAddressV4() const;
IPAddress GetIpAddressV6() const;
+ // Returns true if |hardware_address| is non-zero.
+ bool HasHardwareAddress() const;
+
InterfaceInfo();
InterfaceInfo(NetworkInterfaceIndex index,
const uint8_t hardware_address[6],
diff --git a/platform/base/trace_logging_types.h b/platform/base/trace_logging_types.h
index 257feaff..73592557 100644
--- a/platform/base/trace_logging_types.h
+++ b/platform/base/trace_logging_types.h
@@ -62,6 +62,8 @@ struct TraceCategory {
kStandaloneReceiver = 0x01 << 4,
kDiscovery = 0x01 << 5,
kStandaloneSender = 0x01 << 6,
+ kReceiver = 0x01 << 7,
+ kSender = 0x01 << 8
};
};
diff --git a/platform/impl/network_interface_linux.cc b/platform/impl/network_interface_linux.cc
index 48351ae8..1678acd7 100644
--- a/platform/impl/network_interface_linux.cc
+++ b/platform/impl/network_interface_linux.cc
@@ -168,13 +168,14 @@ std::vector<InterfaceInfo> GetLinkInfo() {
request.header.nlmsg_pid = 0;
request.msg.ifi_family = AF_UNSPEC;
struct iovec iov = {&request, request.header.nlmsg_len};
- struct msghdr msg = {&peer,
- sizeof(peer),
- &iov,
- /* msg_iovlen */ 1,
- /* msg_control */ nullptr,
- /* msg_controllen */ 0,
- /* msg_flags */ 0};
+ struct msghdr msg = {};
+ msg.msg_name = &peer;
+ msg.msg_namelen = sizeof(peer);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = nullptr;
+ msg.msg_controllen = 0;
+ msg.msg_flags = 0;
if (sendmsg(fd.get(), &msg, 0) < 0) {
OSP_LOG_ERROR << "netlink sendmsg() failed: " << errno << " - "
<< strerror(errno);
@@ -187,14 +188,16 @@ std::vector<InterfaceInfo> GetLinkInfo() {
char buf[kNetlinkRecvmsgBufSize];
struct iovec iov = {buf, sizeof(buf)};
struct sockaddr_nl source_address;
- struct msghdr msg;
+ struct msghdr msg = {};
struct nlmsghdr* netlink_header;
- msg = {&source_address, sizeof(source_address), &iov,
- /* msg_iovlen */ 1,
- /* msg_control */ nullptr,
- /* msg_controllen */ 0,
- /* msg_flags */ 0};
+ msg.msg_name = &source_address;
+ msg.msg_namelen = sizeof(source_address);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1,
+ msg.msg_control = nullptr,
+ msg.msg_controllen = 0,
+ msg.msg_flags = 0;
bool done = false;
while (!done) {
@@ -269,13 +272,14 @@ void PopulateSubnetsOrClearList(std::vector<InterfaceInfo>* info_list) {
request.header.nlmsg_pid = 0;
request.msg.ifa_family = AF_UNSPEC;
struct iovec iov = {&request, request.header.nlmsg_len};
- struct msghdr msg = {&peer,
- sizeof(peer),
- &iov,
- /* msg_iovlen */ 1,
- /* msg_control */ nullptr,
- /* msg_controllen */ 0,
- /* msg_flags */ 0};
+ struct msghdr msg = {};
+ msg.msg_name = &peer;
+ msg.msg_namelen = sizeof(peer);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = nullptr;
+ msg.msg_controllen = 0;
+ msg.msg_flags = 0;
if (sendmsg(fd.get(), &msg, 0) < 0) {
OSP_LOG_ERROR << "sendmsg failed: " << errno << " - " << strerror(errno);
info_list->clear();
@@ -287,14 +291,16 @@ void PopulateSubnetsOrClearList(std::vector<InterfaceInfo>* info_list) {
char buf[kNetlinkRecvmsgBufSize];
struct iovec iov = {buf, sizeof(buf)};
struct sockaddr_nl source_address;
- struct msghdr msg;
+ struct msghdr msg = {};
struct nlmsghdr* netlink_header;
- msg = {&source_address, sizeof(source_address), &iov,
- /* msg_iovlen */ 1,
- /* msg_control */ nullptr,
- /* msg_controllen */ 0,
- /* msg_flags */ 0};
+ msg.msg_name = &source_address;
+ msg.msg_namelen = sizeof(source_address);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = nullptr;
+ msg.msg_controllen = 0;
+ msg.msg_flags = 0;
bool done = false;
while (!done) {
size_t len = recvmsg(fd.get(), &msg, 0);
diff --git a/platform/impl/network_interface_mac.cc b/platform/impl/network_interface_mac.cc
index bb7bd583..e101beba 100644
--- a/platform/impl/network_interface_mac.cc
+++ b/platform/impl/network_interface_mac.cc
@@ -6,6 +6,7 @@
#include <net/if_dl.h>
#include <net/if_media.h>
#include <netinet/in.h>
+#include <netinet/in_var.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
@@ -133,6 +134,15 @@ std::vector<InterfaceInfo> ProcessInterfacesList(ifaddrs* interfaces) {
memcpy(&interface->hardware_address[0], &lladdr[0],
sizeof(interface->hardware_address));
} else if (cur->ifa_addr->sa_family == AF_INET6) { // Ipv6 address.
+ struct in6_ifreq ifr = {};
+ // Reject network interfaces that have a deprecated flag set.
+ strncpy(ifr.ifr_name, cur->ifa_name, sizeof(ifr.ifr_name) - 1);
+ memcpy(&ifr.ifr_ifru.ifru_addr, cur->ifa_addr, cur->ifa_addr->sa_len);
+ if (ioctl(ioctl_socket.get(), SIOCGIFAFLAG_IN6, &ifr) != 0 ||
+ ifr.ifr_ifru.ifru_flags & IN6_IFF_DEPRECATED) {
+ continue;
+ }
+
auto* const addr_in6 =
reinterpret_cast<const sockaddr_in6*>(cur->ifa_addr);
uint8_t tmp[sizeof(addr_in6->sin6_addr.s6_addr)];
diff --git a/platform/impl/network_interface_win.cc b/platform/impl/network_interface_win.cc
index f90d35d2..c3095457 100644
--- a/platform/impl/network_interface_win.cc
+++ b/platform/impl/network_interface_win.cc
@@ -16,7 +16,6 @@ std::vector<InterfaceInfo> GetAllInterfaces() {
constexpr size_t INITIAL_BUFFER_SIZE = 15000;
ULONG outbuflen = INITIAL_BUFFER_SIZE;
std::vector<unsigned char> charbuf(INITIAL_BUFFER_SIZE);
- PIP_ADAPTER_ADDRESSES paddrs = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(charbuf.data());
DWORD ret = NO_ERROR;
constexpr int MAX_RETRIES = 5;
@@ -25,7 +24,7 @@ std::vector<InterfaceInfo> GetAllInterfaces() {
ret = GetAdaptersAddresses(AF_UNSPEC /* get both v4/v6 addrs */,
GAA_FLAG_INCLUDE_PREFIX,
NULL,
- paddrs,
+ reinterpret_cast<IP_ADAPTER_ADDRESSES*>(charbuf.data()),
&outbuflen);
if (ret == ERROR_BUFFER_OVERFLOW) {
charbuf.resize(outbuflen);
@@ -40,7 +39,7 @@ std::vector<InterfaceInfo> GetAllInterfaces() {
}
std::vector<InterfaceInfo> infos;
- auto pcurraddrs = paddrs;
+ auto pcurraddrs = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(charbuf.data());
while (pcurraddrs != nullptr) {
// TODO: return the interfaces
OSP_DVLOG << "\tIfIndex=" << pcurraddrs->IfIndex;
diff --git a/platform/impl/task_runner.cc b/platform/impl/task_runner.cc
index f306e792..35b9a5e2 100644
--- a/platform/impl/task_runner.cc
+++ b/platform/impl/task_runner.cc
@@ -129,7 +129,6 @@ void TaskRunnerImpl::RequestStopSoon() {
}
void TaskRunnerImpl::RunRunnableTasks() {
- OSP_DVLOG << "Running " << running_tasks_.size() << " tasks...";
for (TaskWithMetadata& running_task : running_tasks_) {
// Move the task to the stack so that its bound state is freed immediately
// after being run.
diff --git a/platform/impl/tls_connection_posix.cc b/platform/impl/tls_connection_posix.cc
index ad77fdec..779541bc 100644
--- a/platform/impl/tls_connection_posix.cc
+++ b/platform/impl/tls_connection_posix.cc
@@ -102,14 +102,6 @@ bool TlsConnectionPosix::Send(const void* data, size_t len) {
return buffer_.Push(data, len);
}
-IPEndpoint TlsConnectionPosix::GetLocalEndpoint() const {
- OSP_DCHECK(task_runner_->IsRunningOnTaskRunner());
-
- absl::optional<IPEndpoint> endpoint = socket_->local_address();
- OSP_DCHECK(endpoint.has_value());
- return endpoint.value();
-}
-
IPEndpoint TlsConnectionPosix::GetRemoteEndpoint() const {
OSP_DCHECK(task_runner_->IsRunningOnTaskRunner());
diff --git a/platform/impl/tls_connection_posix.h b/platform/impl/tls_connection_posix.h
index c78bf5f1..5655ffe0 100644
--- a/platform/impl/tls_connection_posix.h
+++ b/platform/impl/tls_connection_posix.h
@@ -34,7 +34,6 @@ class TlsConnectionPosix : public TlsConnection {
// TlsConnection overrides.
void SetClient(Client* client) override;
bool Send(const void* data, size_t len) override;
- IPEndpoint GetLocalEndpoint() const override;
IPEndpoint GetRemoteEndpoint() const override;
// Registers |this| with the platform TlsDataRouterPosix. This is called
diff --git a/platform/test/mock_tls_connection.h b/platform/test/mock_tls_connection.h
index 1865c9e9..66d7adce 100644
--- a/platform/test/mock_tls_connection.h
+++ b/platform/test/mock_tls_connection.h
@@ -5,6 +5,9 @@
#ifndef PLATFORM_TEST_MOCK_TLS_CONNECTION_H_
#define PLATFORM_TEST_MOCK_TLS_CONNECTION_H_
+#include <utility>
+#include <vector>
+
#include "gmock/gmock.h"
#include "platform/api/tls_connection.h"
@@ -24,7 +27,6 @@ class MockTlsConnection : public TlsConnection {
MOCK_METHOD(bool, Send, (const void* data, size_t len), (override));
- IPEndpoint GetLocalEndpoint() const override { return local_address_; }
IPEndpoint GetRemoteEndpoint() const override { return remote_address_; }
void OnError(Error error) {