blob: 917832a5f8cc770796505c38ceab192c42eccae6 [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"
Taoyu Lif0370c92019-09-18 15:04:37 +090022#include "arc/network/ndproxy.h"
Garrick Evans3cbac7c2019-04-18 15:31:31 +090023#include "arc/network/socket.h"
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070024
Garrick Evansd2bb8502019-02-20 15:59:35 +090025bool ShouldEnableMultinet() {
26 static const char kLsbReleasePath[] = "/etc/lsb-release";
Garrick Evans0d5f51b2019-06-11 16:12:06 +090027 static int kMinAndroidSdkVersion = 28; // P
Hugo Benichi781e4482019-06-06 10:25:54 +090028 static int kMinChromeMilestone = 76;
Garrick Evansd2bb8502019-02-20 15:59:35 +090029
30 brillo::KeyValueStore store;
31 if (!store.Load(base::FilePath(kLsbReleasePath))) {
32 LOG(ERROR) << "Could not read lsb-release";
33 return false;
34 }
35
36 std::string value;
37 if (!store.GetString("CHROMEOS_ARC_ANDROID_SDK_VERSION", &value)) {
38 LOG(ERROR) << "ARC multi-networking disabled - cannot determine Android "
39 "SDK version";
40 return false;
41 }
42 int ver = 0;
43 if (!base::StringToInt(value.c_str(), &ver)) {
44 LOG(ERROR) << "ARC multi-networking disabled - invalid Android SDK version";
45 return false;
46 }
47 if (ver < kMinAndroidSdkVersion) {
48 LOG(INFO) << "ARC multi-networking disabled for Android SDK " << value;
49 return false;
50 }
51 if (!store.GetString("CHROMEOS_RELEASE_CHROME_MILESTONE", &value)) {
52 LOG(ERROR)
53 << "ARC multi-networking disabled - cannot determine Chrome milestone";
54 return false;
55 }
56 if (atoi(value.c_str()) < kMinChromeMilestone) {
57 LOG(INFO) << "ARC multi-networking disabled for Chrome M" << value;
58 return false;
59 }
60 return true;
61}
62
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070063int main(int argc, char* argv[]) {
64 DEFINE_bool(log_to_stderr, false, "Log to both syslog and stderr");
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080065 DEFINE_int32(
Garrick Evans96e03042019-05-28 14:30:52 +090066 adb_proxy_fd, -1,
67 "Control socket for starting the ADB proxy subprocess. Used internally.");
Taoyu Lif0370c92019-09-18 15:04:37 +090068 DEFINE_int32(
69 nd_proxy_fd, -1,
70 "Control socket for starting the ND proxy subprocess. Used internally.");
Garrick Evansd2bb8502019-02-20 15:59:35 +090071 DEFINE_string(force_multinet, "",
72 "Override auto-detection and toggle multi-networking support.");
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070073
74 brillo::FlagHelper::Init(argc, argv, "ARC network daemon");
75
76 int flags = brillo::kLogToSyslog | brillo::kLogHeader;
77 if (FLAGS_log_to_stderr)
78 flags |= brillo::kLogToStderr;
79 brillo::InitLog(flags);
80
Garrick Evans96e03042019-05-28 14:30:52 +090081 if (FLAGS_adb_proxy_fd >= 0) {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090082 LOG(INFO) << "Spawning adb proxy";
Garrick Evans96e03042019-05-28 14:30:52 +090083 base::ScopedFD fd(FLAGS_adb_proxy_fd);
84 arc_networkd::AdbProxy adb_proxy(std::move(fd));
Garrick Evans3cbac7c2019-04-18 15:31:31 +090085 return adb_proxy.Run();
86 }
87
Taoyu Lif0370c92019-09-18 15:04:37 +090088 if (FLAGS_nd_proxy_fd >= 0) {
89 LOG(INFO) << "Spawning nd proxy";
90 base::ScopedFD fd(FLAGS_nd_proxy_fd);
91 arc_networkd::NDProxy nd_proxy(std::move(fd));
92 return nd_proxy.Run();
93 }
94
Garrick Evans96e03042019-05-28 14:30:52 +090095 auto adb_proxy = std::make_unique<arc_networkd::HelperProcess>();
96 adb_proxy->Start(argc, argv, "--adb_proxy_fd");
97
Taoyu Lif0370c92019-09-18 15:04:37 +090098 auto nd_proxy = std::make_unique<arc_networkd::HelperProcess>();
99 nd_proxy->Start(argc, argv, "--nd_proxy_fd");
100
Garrick Evansd2bb8502019-02-20 15:59:35 +0900101 bool enable_mnet =
102 (FLAGS_force_multinet == "on") ||
103 ((FLAGS_force_multinet != "off") && ShouldEnableMultinet());
Garrick Evans3915af32019-07-25 15:44:34 +0900104 LOG(INFO) << "Starting arc-networkd manager";
Taoyu Lice7caa62019-10-01 15:43:33 +0900105 arc_networkd::Manager manager(std::move(adb_proxy), std::move(nd_proxy),
106 enable_mnet);
Garrick Evans49879532018-12-03 13:15:36 +0900107 return manager.Run();
Kevin Cernekee95d4ae92016-06-19 10:26:29 -0700108}