blob: 69eb5c70423fd23c33e98a230a6b26af77e0902c [file] [log] [blame]
Kevin Cernekee95d4ae92016-06-19 10:26:29 -07001// Copyright 2016 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Garrick Evans3cbac7c2019-04-18 15:31:31 +09005#include <sys/socket.h>
Kevin Cernekee95d4ae92016-06-19 10:26:29 -07006#include <unistd.h>
7
Kevin Cernekee27bcaa62016-12-03 11:16:26 -08008#include <memory>
9#include <utility>
10
Garrick Evansd2bb8502019-02-20 15:59:35 +090011#include <base/files/file_util.h>
Taoyu Lice7caa62019-10-01 15:43:33 +090012#include <base/files/scoped_file.h>
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070013#include <base/logging.h>
Garrick Evansd2bb8502019-02-20 15:59:35 +090014#include <base/strings/string_number_conversions.h>
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070015#include <brillo/flag_helper.h>
Garrick Evansd2bb8502019-02-20 15:59:35 +090016#include <brillo/key_value_store.h>
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070017#include <brillo/syslog_logging.h>
18
Garrick Evans3cbac7c2019-04-18 15:31:31 +090019#include "arc/network/adb_proxy.h"
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090020#include "arc/network/helper_process.h"
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090021#include "arc/network/manager.h"
Jason Jeremy Imand89b5f52019-10-24 10:39:17 +090022#include "arc/network/multicast_forwarder.h"
Taoyu Lif0370c92019-09-18 15:04:37 +090023#include "arc/network/ndproxy.h"
Garrick Evans3cbac7c2019-04-18 15:31:31 +090024#include "arc/network/socket.h"
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070025
Garrick Evansd2bb8502019-02-20 15:59:35 +090026bool ShouldEnableMultinet() {
27 static const char kLsbReleasePath[] = "/etc/lsb-release";
Garrick Evans0d5f51b2019-06-11 16:12:06 +090028 static int kMinAndroidSdkVersion = 28; // P
Hugo Benichi781e4482019-06-06 10:25:54 +090029 static int kMinChromeMilestone = 76;
Garrick Evansd2bb8502019-02-20 15:59:35 +090030
31 brillo::KeyValueStore store;
32 if (!store.Load(base::FilePath(kLsbReleasePath))) {
33 LOG(ERROR) << "Could not read lsb-release";
34 return false;
35 }
36
37 std::string value;
38 if (!store.GetString("CHROMEOS_ARC_ANDROID_SDK_VERSION", &value)) {
39 LOG(ERROR) << "ARC multi-networking disabled - cannot determine Android "
40 "SDK version";
41 return false;
42 }
43 int ver = 0;
44 if (!base::StringToInt(value.c_str(), &ver)) {
45 LOG(ERROR) << "ARC multi-networking disabled - invalid Android SDK version";
46 return false;
47 }
48 if (ver < kMinAndroidSdkVersion) {
49 LOG(INFO) << "ARC multi-networking disabled for Android SDK " << value;
50 return false;
51 }
52 if (!store.GetString("CHROMEOS_RELEASE_CHROME_MILESTONE", &value)) {
53 LOG(ERROR)
54 << "ARC multi-networking disabled - cannot determine Chrome milestone";
55 return false;
56 }
57 if (atoi(value.c_str()) < kMinChromeMilestone) {
58 LOG(INFO) << "ARC multi-networking disabled for Chrome M" << value;
59 return false;
60 }
61 return true;
62}
63
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070064int main(int argc, char* argv[]) {
65 DEFINE_bool(log_to_stderr, false, "Log to both syslog and stderr");
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080066 DEFINE_int32(
Garrick Evans96e03042019-05-28 14:30:52 +090067 adb_proxy_fd, -1,
68 "Control socket for starting the ADB proxy subprocess. Used internally.");
Jason Jeremy Imand89b5f52019-10-24 10:39:17 +090069 DEFINE_int32(mcast_proxy_fd, -1,
70 "Control socket for starting the multicast proxy "
71 "subprocess. Used internally.");
Taoyu Lif0370c92019-09-18 15:04:37 +090072 DEFINE_int32(
73 nd_proxy_fd, -1,
74 "Control socket for starting the ND proxy subprocess. Used internally.");
Garrick Evansd2bb8502019-02-20 15:59:35 +090075 DEFINE_string(force_multinet, "",
76 "Override auto-detection and toggle multi-networking support.");
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070077
78 brillo::FlagHelper::Init(argc, argv, "ARC network daemon");
79
80 int flags = brillo::kLogToSyslog | brillo::kLogHeader;
81 if (FLAGS_log_to_stderr)
82 flags |= brillo::kLogToStderr;
83 brillo::InitLog(flags);
84
Garrick Evans96e03042019-05-28 14:30:52 +090085 if (FLAGS_adb_proxy_fd >= 0) {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090086 LOG(INFO) << "Spawning adb proxy";
Garrick Evans96e03042019-05-28 14:30:52 +090087 base::ScopedFD fd(FLAGS_adb_proxy_fd);
88 arc_networkd::AdbProxy adb_proxy(std::move(fd));
Garrick Evans3cbac7c2019-04-18 15:31:31 +090089 return adb_proxy.Run();
90 }
91
Taoyu Lif0370c92019-09-18 15:04:37 +090092 if (FLAGS_nd_proxy_fd >= 0) {
93 LOG(INFO) << "Spawning nd proxy";
94 base::ScopedFD fd(FLAGS_nd_proxy_fd);
95 arc_networkd::NDProxy nd_proxy(std::move(fd));
96 return nd_proxy.Run();
97 }
98
Jason Jeremy Imand89b5f52019-10-24 10:39:17 +090099 if (FLAGS_mcast_proxy_fd >= 0) {
100 LOG(INFO) << "Spawning multicast proxy";
101 base::ScopedFD fd(FLAGS_mcast_proxy_fd);
102 arc_networkd::MulticastProxy mcast_proxy(std::move(fd));
103 return mcast_proxy.Run();
104 }
105
Garrick Evans96e03042019-05-28 14:30:52 +0900106 auto adb_proxy = std::make_unique<arc_networkd::HelperProcess>();
107 adb_proxy->Start(argc, argv, "--adb_proxy_fd");
108
Jason Jeremy Imand89b5f52019-10-24 10:39:17 +0900109 auto mcast_proxy = std::make_unique<arc_networkd::HelperProcess>();
110 mcast_proxy->Start(argc, argv, "--mcast_proxy_fd");
111
Taoyu Lif0370c92019-09-18 15:04:37 +0900112 auto nd_proxy = std::make_unique<arc_networkd::HelperProcess>();
113 nd_proxy->Start(argc, argv, "--nd_proxy_fd");
114
Garrick Evansd2bb8502019-02-20 15:59:35 +0900115 bool enable_mnet =
116 (FLAGS_force_multinet == "on") ||
117 ((FLAGS_force_multinet != "off") && ShouldEnableMultinet());
Garrick Evans3915af32019-07-25 15:44:34 +0900118 LOG(INFO) << "Starting arc-networkd manager";
Jason Jeremy Imand89b5f52019-10-24 10:39:17 +0900119 arc_networkd::Manager manager(std::move(adb_proxy), std::move(mcast_proxy),
120 std::move(nd_proxy), enable_mnet);
Garrick Evans49879532018-12-03 13:15:36 +0900121 return manager.Run();
Kevin Cernekee95d4ae92016-06-19 10:26:29 -0700122}