| // Copyright 2016 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ARC_NETWORKD_IP_HELPER_H_ |
| #define ARC_NETWORKD_IP_HELPER_H_ |
| |
| #include <netinet/in.h> |
| #include <sys/socket.h> |
| |
| #include <memory> |
| #include <string> |
| |
| #include <base/files/scoped_file.h> |
| #include <base/macros.h> |
| #include <base/memory/weak_ptr.h> |
| #include <base/message_loop/message_loop.h> |
| #include <brillo/daemons/daemon.h> |
| |
| #include "arc-networkd/arc_ip_config.h" |
| #include "arc-networkd/ipc.pb.h" |
| #include "arc-networkd/options.h" |
| |
| using MessageLoopForIO = base::MessageLoopForIO; |
| |
| namespace arc_networkd { |
| |
| // Main loop for the IP helper process. |
| // This object is used in the subprocess. |
| class IpHelper : public brillo::Daemon, public base::MessageLoopForIO::Watcher { |
| public: |
| explicit IpHelper(const Options& opt, base::ScopedFD control_fd); |
| |
| protected: |
| // Overrides Daemon init callback. |
| int OnInit() override; |
| |
| // Overrides MessageLoopForIO callbacks for new data on |control_fd_|. |
| void OnFileCanReadWithoutBlocking(int fd) override; |
| void OnFileCanWriteWithoutBlocking(int fd) override {} |
| |
| // Runs every |kContainerRetryDelaySeconds| until the ARC container comes |
| // up. |
| void InitialSetup(); |
| |
| // Handle |pending_command_|. |
| void HandleCommand(); |
| |
| // Helper function to extract raw IPv6 address from a protobuf string. |
| const struct in6_addr& ExtractAddr6(const std::string& in); |
| |
| // Validate interface name string. |
| bool ValidateIfname(const std::string& in); |
| |
| private: |
| base::ScopedFD control_fd_; |
| MessageLoopForIO::FileDescriptorWatcher control_watcher_; |
| |
| int con_init_tries_{0}; |
| bool init_done_{false}; |
| |
| IpHelperMessage pending_command_; |
| std::unique_ptr<ArcIpConfig> arc_ip_config_; |
| |
| base::WeakPtrFactory<IpHelper> weak_factory_{this}; |
| |
| DISALLOW_COPY_AND_ASSIGN(IpHelper); |
| }; |
| |
| } // namespace arc_networkd |
| |
| #endif // ARC_NETWORKD_IP_HELPER_H_ |