1//
2// Copyright (C) 2015 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#ifndef SHILL_PPP_DAEMON_H_
18#define SHILL_PPP_DAEMON_H_
19
20#include <string>
21
22#include <base/callback.h>
23#include <base/memory/weak_ptr.h>
24#include <gtest/gtest_prod.h>
25
26#include "shill/external_task.h"
27
28namespace shill {
29
30class ControlInterface;
31class Error;
32class ProcessManager;
33
34// PPPDaemon provides control over the configuration and instantiation of pppd
35// processes.  All pppd instances created through PPPDaemon will use shill's
36// pppd plugin.
37class PPPDaemon {
38 public:
39  // The type of callback invoked when an ExternalTask wrapping a pppd instance
40  // dies.  The first argument is the pid of the process, the second is the exit
41  // code.
42  typedef base::Callback<void(pid_t, int)> DeathCallback;
43
44  // Provides options used when preparing a pppd task for execution.  These map
45  // to pppd command-line options.  Refer to https://ppp.samba.org/pppd.html for
46  // more details about the meaning of each.
47  struct Options {
48    Options()
49        : debug(false),
50          no_detach(false),
51          no_default_route(false),
52          use_peer_dns(false),
53          use_shim_plugin(true),
54          use_pppoe_plugin(false),
55          lcp_echo_interval(kUnspecifiedValue),
56          lcp_echo_failure(kUnspecifiedValue),
57          max_fail(kUnspecifiedValue),
58          use_ipv6(false) {}
59
60    // Causes pppd to emit log messages useful for debugging connectivity.
61    bool debug;
62
63    // Causes pppd to not fork and daemonize, remaining attached to the
64    // controlling terminal that spawned it.
65    bool no_detach;
66
67    // Stops pppd from modifying the routing table.
68    bool no_default_route;
69
70    // Instructs pppd to request DNS servers from the remote server.
71    bool use_peer_dns;
72
73    // If set, will cause the shill pppd plugin to be used at the creation of
74    // the pppd instace.  This will result in connectivity events being plumbed
75    // over D-Bus to the RPCTaskDelegate provided during PPPDaemon::Start.
76    bool use_shim_plugin;
77
78    // If set, enables the rp-pppoe plugin which allows pppd to be used over
79    // ethernet devices.
80    bool use_pppoe_plugin;
81
82    // The number of seconds between sending LCP echo requests.
83    uint32_t lcp_echo_interval;
84
85    // The number of missed LCP echo responses tolerated before disconnecting.
86    uint32_t lcp_echo_failure;
87
88    // The number of allowed failed consecutive connection attempts before
89    // giving up.  A value of 0 means there is no limit.
90    uint32_t max_fail;
91
92    // Instructs pppd to request an IPv6 address from the remote server.
93    bool use_ipv6;
94  };
95
96  // The path to the pppd plugin provided by shill.
97  static const char kShimPluginPath[];
98
99  // Starts a pppd instance.  |options| provides the configuration for the
100  // instance to be started, |device| specifies which device the PPP connection
101  // is to be established on, |death_callback| will be invoked when the
102  // underlying pppd process dies.  |error| is populated if the task cannot be
103  // started, and nullptr is returned.
104  static std::unique_ptr<ExternalTask> Start(
105      ControlInterface* control_interface,
106      ProcessManager* process_manager,
107      const base::WeakPtr<RPCTaskDelegate>& task_delegate,
108      const Options& options,
109      const std::string& device,
110      const DeathCallback& death_callback,
111      Error* error);
112
113 private:
114  FRIEND_TEST(PPPDaemonTest, PluginUsed);
115
116  static const char kDaemonPath[];
117  static const char kPPPoEPluginPath[];
118  static const uint32_t kUnspecifiedValue;
119
120  PPPDaemon();
121  ~PPPDaemon();
122
123  DISALLOW_COPY_AND_ASSIGN(PPPDaemon);
124};
125
126}  // namespace shill
127
128#endif  // SHILL_PPP_DAEMON_H_
129