aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormark a. foltz <mfoltz@chromium.org>2021-08-24 14:21:09 -0700
committerOpenscreen LUCI CQ <openscreen-scoped@luci-project-accounts.iam.gserviceaccount.com>2021-08-24 22:39:02 +0000
commit36c3651b0669e37c289a1996123aa123d1f590ab (patch)
tree936b08055aa3a48d4373291dc981e3157d8810b2
parent8f61e5d17d581c029fb5f827a0bc5e1d2bb3acec (diff)
downloadopenscreen-36c3651b0669e37c289a1996123aa123d1f590ab.tar.gz
[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 <mfoltz@chromium.org> Reviewed-by: Jordan Bayles <jophba@chromium.org>
-rw-r--r--cast/README.md4
-rw-r--r--cast/standalone_receiver/cast_service.cc17
-rw-r--r--cast/standalone_receiver/main.cc9
-rw-r--r--cast/standalone_sender/main.cc3
-rw-r--r--platform/base/interface_info.cc6
-rw-r--r--platform/base/interface_info.h3
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 <stdint.h>
+
+#include <array>
#include <utility>
#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<uint8_t, kCastUniqueIdLength> 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 <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],