blob: e3a6a65fb7217e4d2745b4128635dd9ae86f829e [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
5#include <unistd.h>
6
Kevin Cernekee27bcaa62016-12-03 11:16:26 -08007#include <memory>
8#include <utility>
9
10#include <base/files/scoped_file.h>
Garrick Evansd2bb8502019-02-20 15:59:35 +090011#include <base/files/file_util.h>
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070012#include <base/logging.h>
Garrick Evansd2bb8502019-02-20 15:59:35 +090013#include <base/strings/string_number_conversions.h>
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070014#include <brillo/flag_helper.h>
Garrick Evansd2bb8502019-02-20 15:59:35 +090015#include <brillo/key_value_store.h>
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070016#include <brillo/syslog_logging.h>
17
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090018#include "arc/network/helper_process.h"
19#include "arc/network/ip_helper.h"
20#include "arc/network/manager.h"
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070021
Garrick Evansd2bb8502019-02-20 15:59:35 +090022bool ShouldEnableMultinet() {
23 static const char kLsbReleasePath[] = "/etc/lsb-release";
24 static int kMinAndroidSdkVersion = 28; // P
25 static int kMinChromeMilestone = INT_MAX; // TODO(garrick)
26
27 brillo::KeyValueStore store;
28 if (!store.Load(base::FilePath(kLsbReleasePath))) {
29 LOG(ERROR) << "Could not read lsb-release";
30 return false;
31 }
32
33 std::string value;
34 if (!store.GetString("CHROMEOS_ARC_ANDROID_SDK_VERSION", &value)) {
35 LOG(ERROR) << "ARC multi-networking disabled - cannot determine Android "
36 "SDK version";
37 return false;
38 }
39 int ver = 0;
40 if (!base::StringToInt(value.c_str(), &ver)) {
41 LOG(ERROR) << "ARC multi-networking disabled - invalid Android SDK version";
42 return false;
43 }
44 if (ver < kMinAndroidSdkVersion) {
45 LOG(INFO) << "ARC multi-networking disabled for Android SDK " << value;
46 return false;
47 }
48 if (!store.GetString("CHROMEOS_RELEASE_CHROME_MILESTONE", &value)) {
49 LOG(ERROR)
50 << "ARC multi-networking disabled - cannot determine Chrome milestone";
51 return false;
52 }
53 if (atoi(value.c_str()) < kMinChromeMilestone) {
54 LOG(INFO) << "ARC multi-networking disabled for Chrome M" << value;
55 return false;
56 }
57 return true;
58}
59
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070060int main(int argc, char* argv[]) {
61 DEFINE_bool(log_to_stderr, false, "Log to both syslog and stderr");
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080062 DEFINE_int32(
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090063 ip_helper_fd, -1,
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080064 "Control socket for starting an IpHelper subprocess. Used internally.");
Garrick Evansd2bb8502019-02-20 15:59:35 +090065 DEFINE_string(force_multinet, "",
66 "Override auto-detection and toggle multi-networking support.");
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070067
68 brillo::FlagHelper::Init(argc, argv, "ARC network daemon");
69
70 int flags = brillo::kLogToSyslog | brillo::kLogHeader;
71 if (FLAGS_log_to_stderr)
72 flags |= brillo::kLogToStderr;
73 brillo::InitLog(flags);
74
Hugo Benichi935eca92018-07-03 13:47:24 +090075 LOG(INFO) << "Starting arc-networkd "
Garrick Evans49879532018-12-03 13:15:36 +090076 << (FLAGS_ip_helper_fd >= 0 ? "helper" : "manager");
Hugo Benichi935eca92018-07-03 13:47:24 +090077
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080078 if (FLAGS_ip_helper_fd >= 0) {
79 base::ScopedFD fd(FLAGS_ip_helper_fd);
Garrick Evans49879532018-12-03 13:15:36 +090080 arc_networkd::IpHelper ip_helper{std::move(fd)};
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080081 return ip_helper.Run();
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080082 }
Garrick Evans49879532018-12-03 13:15:36 +090083
84 auto ip_helper = std::make_unique<arc_networkd::HelperProcess>();
85 ip_helper->Start(argc, argv, "--ip_helper_fd");
86
Garrick Evansd2bb8502019-02-20 15:59:35 +090087 bool enable_mnet =
88 (FLAGS_force_multinet == "on") ||
89 ((FLAGS_force_multinet != "off") && ShouldEnableMultinet());
90 arc_networkd::Manager manager{std::move(ip_helper), enable_mnet};
Garrick Evans49879532018-12-03 13:15:36 +090091 return manager.Run();
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070092}