diff options
Diffstat (limited to 'platform')
-rw-r--r-- | platform/BUILD.gn | 36 | ||||
-rw-r--r-- | platform/api/tls_connection.cc | 2 | ||||
-rw-r--r-- | platform/api/tls_connection.h | 5 | ||||
-rw-r--r-- | platform/api/tls_connection_factory.cc | 2 | ||||
-rw-r--r-- | platform/api/tls_connection_factory.h | 3 | ||||
-rw-r--r-- | platform/api/udp_socket.cc | 2 | ||||
-rw-r--r-- | platform/api/udp_socket.h | 4 | ||||
-rw-r--r-- | platform/base/error.cc | 6 | ||||
-rw-r--r-- | platform/base/error.h | 8 | ||||
-rw-r--r-- | platform/base/interface_info.cc | 6 | ||||
-rw-r--r-- | platform/base/interface_info.h | 3 | ||||
-rw-r--r-- | platform/base/trace_logging_types.h | 2 | ||||
-rw-r--r-- | platform/impl/network_interface_linux.cc | 58 | ||||
-rw-r--r-- | platform/impl/network_interface_mac.cc | 10 | ||||
-rw-r--r-- | platform/impl/network_interface_win.cc | 5 | ||||
-rw-r--r-- | platform/impl/task_runner.cc | 1 | ||||
-rw-r--r-- | platform/impl/tls_connection_posix.cc | 8 | ||||
-rw-r--r-- | platform/impl/tls_connection_posix.h | 1 | ||||
-rw-r--r-- | platform/test/mock_tls_connection.h | 4 |
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) { |