blob: 48b4da91ce85eda048bb647115b26c2f57ef3009 [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";
27 static int kMinAndroidSdkVersion = 28; // P
28 static int kMinChromeMilestone = INT_MAX; // TODO(garrick)
29
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 Evans3cbac7c2019-04-18 15:31:31 +090068 // TODO(garrick): Enable along with corresponding sslh.conf change.
69 DEFINE_bool(adb_proxy, false, "Run ADB proxy");
Garrick Evansd2bb8502019-02-20 15:59:35 +090070 DEFINE_string(force_multinet, "",
71 "Override auto-detection and toggle multi-networking support.");
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070072
73 brillo::FlagHelper::Init(argc, argv, "ARC network daemon");
74
75 int flags = brillo::kLogToSyslog | brillo::kLogHeader;
76 if (FLAGS_log_to_stderr)
77 flags |= brillo::kLogToStderr;
78 brillo::InitLog(flags);
79
Hugo Benichi935eca92018-07-03 13:47:24 +090080 LOG(INFO) << "Starting arc-networkd "
Garrick Evans49879532018-12-03 13:15:36 +090081 << (FLAGS_ip_helper_fd >= 0 ? "helper" : "manager");
Hugo Benichi935eca92018-07-03 13:47:24 +090082
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080083 if (FLAGS_ip_helper_fd >= 0) {
84 base::ScopedFD fd(FLAGS_ip_helper_fd);
Garrick Evans49879532018-12-03 13:15:36 +090085 arc_networkd::IpHelper ip_helper{std::move(fd)};
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080086 return ip_helper.Run();
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080087 }
Garrick Evans49879532018-12-03 13:15:36 +090088
Garrick Evans3cbac7c2019-04-18 15:31:31 +090089 if (FLAGS_adb_proxy > 0 && fork() == 0) {
90 LOG(INFO) << "Spawning adb proxy";
91 arc_networkd::AdbProxy adb_proxy;
92 return adb_proxy.Run();
93 }
94
95 LOG(INFO) << "Running manager";
Garrick Evans49879532018-12-03 13:15:36 +090096 auto ip_helper = std::make_unique<arc_networkd::HelperProcess>();
97 ip_helper->Start(argc, argv, "--ip_helper_fd");
98
Garrick Evansd2bb8502019-02-20 15:59:35 +090099 bool enable_mnet =
100 (FLAGS_force_multinet == "on") ||
101 ((FLAGS_force_multinet != "off") && ShouldEnableMultinet());
102 arc_networkd::Manager manager{std::move(ip_helper), enable_mnet};
Garrick Evans49879532018-12-03 13:15:36 +0900103 return manager.Run();
Kevin Cernekee95d4ae92016-06-19 10:26:29 -0700104}