From 36c3651b0669e37c289a1996123aa123d1f590ab Mon Sep 17 00:00:00 2001 From: "mark a. foltz" Date: Tue, 24 Aug 2021 14:21:09 -0700 Subject: [Open Screen] Generate unique id for loopback. The standalone receiver was not initiating discovery when passed the loopback interface, because it has no hardware address. Re-enable discovery for interfaces without hardware addresses, and generate a random unique ID as a fallback for receivers with missing addesses. Bug: b/197659239 Change-Id: I7d72ee8616f1b463220320b06a8b0318798d040e Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/3116549 Commit-Queue: mark a. foltz Reviewed-by: Jordan Bayles --- cast/README.md | 4 ++-- cast/standalone_receiver/cast_service.cc | 17 +++++++++++++++-- cast/standalone_receiver/main.cc | 9 --------- cast/standalone_sender/main.cc | 3 ++- platform/base/interface_info.cc | 6 ++++++ platform/base/interface_info.h | 3 +++ 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/cast/README.md b/cast/README.md index d9e96486..8af2b47d 100644 --- a/cast/README.md +++ b/cast/README.md @@ -37,12 +37,12 @@ the cast_receiver with `-g`, and both should be written out to files: These generated credentials can be passed in to start a session, e.g. ``` -./out/Default/cast_receiver -d generated_root_cast_receiver.crt -p generated_root_cast_receiver.key lo0 -x +./out/Default/cast_receiver -d generated_root_cast_receiver.crt -p generated_root_cast_receiver.key lo0 ``` And then passed to the cast sender to connect and start a streaming session: ``` - $ ./out/Default/cast_sender -d generated_root_cast_receiver.crt ~/video-1080-mp4.mp4 + $ ./out/Default/cast_sender -d generated_root_cast_receiver.crt lo0 ~/video-1080-mp4.mp4 ``` When running on Mac OS X, also pass the `-x` flag to the cast receiver to diff --git a/cast/standalone_receiver/cast_service.cc b/cast/standalone_receiver/cast_service.cc index 0e3d9c9c..92ffce93 100644 --- a/cast/standalone_receiver/cast_service.cc +++ b/cast/standalone_receiver/cast_service.cc @@ -4,12 +4,16 @@ #include "cast/standalone_receiver/cast_service.h" +#include + +#include #include #include "discovery/common/config.h" #include "platform/api/tls_connection_factory.h" #include "platform/base/interface_info.h" #include "platform/base/tls_listen_options.h" +#include "util/crypto/random_bytes.h" #include "util/osp_logging.h" #include "util/stringprintf.h" @@ -19,6 +23,7 @@ namespace cast { namespace { constexpr uint16_t kDefaultCastServicePort = 8010; +constexpr int kCastUniqueIdLength = 6; constexpr int kDefaultMaxBacklogSize = 64; const TlsListenOptions kDefaultListenOptions{kDefaultMaxBacklogSize}; @@ -69,8 +74,16 @@ CastService::CastService(CastService::Configuration config) if (discovery_publisher_) { ReceiverInfo info; info.port = local_endpoint_.port; - info.unique_id = HexEncode(config.interface.hardware_address.data(), - config.interface.hardware_address.size()); + if (config.interface.HasHardwareAddress()) { + info.unique_id = HexEncode(config.interface.hardware_address.data(), + config.interface.hardware_address.size()); + } else { + OSP_LOG_WARN << "Hardware address for interface " << config.interface.name + << " is empty. Generating a random unique_id."; + std::array random_bytes; + GenerateRandomBytes(random_bytes.data(), kCastUniqueIdLength); + info.unique_id = HexEncode(random_bytes.data(), kCastUniqueIdLength); + } info.friendly_name = config.friendly_name; info.model_name = config.model_name; info.capabilities = kHasVideoOutput | kHasAudioOutput; diff --git a/cast/standalone_receiver/main.cc b/cast/standalone_receiver/main.cc index fb4ada9a..ac001f58 100644 --- a/cast/standalone_receiver/main.cc +++ b/cast/standalone_receiver/main.cc @@ -224,15 +224,6 @@ int RunStandaloneReceiver(int argc, char* argv[]) { const InterfaceInfo interface = GetInterfaceInfoFromName(interface_name); OSP_CHECK(interface.GetIpAddressV4() || interface.GetIpAddressV6()); - if (std::all_of(interface.hardware_address.begin(), - interface.hardware_address.end(), - [](int e) { return e == 0; })) { - OSP_LOG_WARN - << "Hardware address is empty. Either you are on a loopback device " - "or getting the network interface information failed somehow. " - "Discovery publishing will be disabled."; - enable_discovery = false; - } auto* const task_runner = new TaskRunnerImpl(&Clock::now); PlatformClientPosix::Create(milliseconds(50), diff --git a/cast/standalone_sender/main.cc b/cast/standalone_sender/main.cc index 22a9b6fa..71923d7e 100644 --- a/cast/standalone_sender/main.cc +++ b/cast/standalone_sender/main.cc @@ -23,6 +23,7 @@ #include "platform/api/time.h" #include "platform/base/error.h" #include "platform/base/ip_address.h" +#include "platform/impl/network_interface.h" #include "platform/impl/platform_client_posix.h" #include "platform/impl/task_runner.h" #include "platform/impl/text_trace_logging_platform.h" @@ -214,7 +215,7 @@ int StandaloneSenderMain(int argc, char* argv[]) { IPEndpoint remote_endpoint = ParseAsEndpoint(iface_or_endpoint); if (!remote_endpoint.port) { - for (const InterfaceInfo& interface : GetNetworkInterfaces()) { + for (const InterfaceInfo& interface : GetAllInterfaces()) { if (interface.name == iface_or_endpoint) { ReceiverChooser chooser(interface, task_runner, [&](IPEndpoint endpoint) { 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 +#include 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], -- cgit v1.2.3