blob: 728319614ba74569a209c554c749eda0d0f34786 [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>
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070011#include <base/logging.h>
12#include <brillo/flag_helper.h>
13#include <brillo/syslog_logging.h>
14
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090015#include "arc/network/helper_process.h"
16#include "arc/network/ip_helper.h"
17#include "arc/network/manager.h"
18#include "arc/network/options.h"
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070019
20int main(int argc, char* argv[]) {
21 DEFINE_bool(log_to_stderr, false, "Log to both syslog and stderr");
Kevin Cernekee035d3a32017-09-12 20:46:49 -070022 DEFINE_string(internal_interface, "arcbr0",
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070023 "Name of the host interface that connects to the guest");
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090024 DEFINE_string(mdns_ip, "100.115.92.2",
Kevin Cernekee73e09202017-06-17 20:55:09 -070025 "Guest IP to replace with the LAN IP in mDNS responses");
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070026 DEFINE_string(container_interface, "arc0",
27 "Name of the guest interface that connects to the host");
28 DEFINE_int32(con_netns, 0, "Container's network namespace (PID)");
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080029 DEFINE_int32(
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090030 ip_helper_fd, -1,
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080031 "Control socket for starting an IpHelper subprocess. Used internally.");
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070032
33 brillo::FlagHelper::Init(argc, argv, "ARC network daemon");
34
35 int flags = brillo::kLogToSyslog | brillo::kLogHeader;
36 if (FLAGS_log_to_stderr)
37 flags |= brillo::kLogToStderr;
38 brillo::InitLog(flags);
39
Kevin Cernekee4e62cc12016-12-03 11:50:53 -080040 arc_networkd::Options opt;
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070041 opt.int_ifname = FLAGS_internal_interface;
Kevin Cernekee73e09202017-06-17 20:55:09 -070042 opt.mdns_ipaddr = FLAGS_mdns_ip;
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070043 opt.con_ifname = FLAGS_container_interface;
44 opt.con_netns = FLAGS_con_netns;
45
Hugo Benichi935eca92018-07-03 13:47:24 +090046 LOG(INFO) << "Starting arc-networkd "
47 << (FLAGS_ip_helper_fd >= 0 ? "helper" : "manager")
48 << " with Option "
49 << "{ netns=" << opt.con_netns
50 << ", host ifname=" << opt.int_ifname
51 << ", guest ifname=" << opt.con_ifname
52 << ", mdns ip=" << opt.mdns_ipaddr
53 << " }";
54
Kevin Cernekee27bcaa62016-12-03 11:16:26 -080055 if (FLAGS_ip_helper_fd >= 0) {
56 base::ScopedFD fd(FLAGS_ip_helper_fd);
57 arc_networkd::IpHelper ip_helper{opt, std::move(fd)};
58 return ip_helper.Run();
59 } else {
60 std::unique_ptr<arc_networkd::HelperProcess> ip_helper(
61 new arc_networkd::HelperProcess());
62 ip_helper->Start(argc, argv, "--ip_helper_fd");
63
64 arc_networkd::Manager manager{opt, std::move(ip_helper)};
65 return manager.Run();
66 }
Kevin Cernekee95d4ae92016-06-19 10:26:29 -070067}