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 28 namespace shill { 29 30 class ControlInterface; 31 class Error; 32 class 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. 37 class 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 { OptionsOptions48 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