blob: 19854c3ff4819df16e147bbfe3a78d8a48196710 [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
11#include <base/files/scoped_file.h>
Garrick Evansd2bb8502019-02-20 15:59:35 +090012#include <base/files/file_util.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"
21#include "arc/network/ip_helper.h"
22#include "arc/network/manager.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(
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090066 ip_helper_fd, -1,
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080067 "Control socket for starting an IpHelper subprocess. Used internally.");
Garrick Evansa7556db2019-05-07 11:22:40 +090068 DEFINE_bool(adb_proxy, true, "Run ADB proxy");
Garrick Evansd2bb8502019-02-20 15:59:35 +090069 DEFINE_string(force_multinet, "",
70 "Override auto-detection and toggle multi-networking support.");
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070071
72 brillo::FlagHelper::Init(argc, argv, "ARC network daemon");
73
74 int flags = brillo::kLogToSyslog | brillo::kLogHeader;
75 if (FLAGS_log_to_stderr)
76 flags |= brillo::kLogToStderr;
77 brillo::InitLog(flags);
78
Hugo Benichi935eca92018-07-03 13:47:24 +090079 LOG(INFO) << "Starting arc-networkd "
Garrick Evans49879532018-12-03 13:15:36 +090080 << (FLAGS_ip_helper_fd >= 0 ? "helper" : "manager");
Hugo Benichi935eca92018-07-03 13:47:24 +090081
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080082 if (FLAGS_ip_helper_fd >= 0) {
83 base::ScopedFD fd(FLAGS_ip_helper_fd);
Garrick Evans49879532018-12-03 13:15:36 +090084 arc_networkd::IpHelper ip_helper{std::move(fd)};
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080085 return ip_helper.Run();
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080086 }
Garrick Evans49879532018-12-03 13:15:36 +090087
Garrick Evansa7556db2019-05-07 11:22:40 +090088 if (fork() == 0) {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090089 LOG(INFO) << "Spawning adb proxy";
90 arc_networkd::AdbProxy adb_proxy;
91 return adb_proxy.Run();
92 }
93
94 LOG(INFO) << "Running manager";
Garrick Evans49879532018-12-03 13:15:36 +090095 auto ip_helper = std::make_unique<arc_networkd::HelperProcess>();
96 ip_helper->Start(argc, argv, "--ip_helper_fd");
97
Garrick Evansd2bb8502019-02-20 15:59:35 +090098 bool enable_mnet =
99 (FLAGS_force_multinet == "on") ||
100 ((FLAGS_force_multinet != "off") && ShouldEnableMultinet());
101 arc_networkd::Manager manager{std::move(ip_helper), enable_mnet};
Garrick Evans49879532018-12-03 13:15:36 +0900102 return manager.Run();
Kevin Cernekee95d4ae92016-06-19 10:26:29 -0700103}