1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2015 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 162dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 172dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#ifndef SHILL_PPPOE_PPPOE_SERVICE_H_ 182dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#define SHILL_PPPOE_PPPOE_SERVICE_H_ 192dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 202dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include <map> 212dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include <string> 222dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 232dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include <gtest/gtest_prod.h> 242dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 252dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/ethernet/ethernet.h" 262dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/ethernet/ethernet_service.h" 272dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/refptr_types.h" 282dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#include "shill/rpc_task.h" 292dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 302dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellynamespace shill { 312dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 322dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass ControlInterface; 332dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass Error; 342dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass EventDispatcher; 352dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass ExternalTask; 362dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass Manager; 372dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass Metrics; 38d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiuclass PPPDeviceFactory; 39a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiuclass ProcessManager; 402dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass StoreInterface; 412dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 422dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly// PPPoEService is an EthernetService that manages PPPoE connectivity on a 432dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly// single Ethernet device. To do this it spawns and manages pppd instances. 442dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly// When pppX interfaces are created in the course of a connection they are 452dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly// wrapped with a PPPDevice, and are made to SelectService the PPPoEService that 462dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly// created them. 472dc218e49e210b64ecf7d83946ec257ef1529171Garret Kellyclass PPPoEService : public EthernetService, public RPCTaskDelegate { 482dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly public: 4996ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart PPPoEService(ControlInterface* control_interface, 5096ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart EventDispatcher* dispatcher, 5196ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart Metrics* metrics, 5296ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart Manager* manager, 532dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly base::WeakPtr<Ethernet> ethernet); 542dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly ~PPPoEService() override; 552dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 562dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly // Inherited from EthernetService. 5796ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart void Connect(Error* error, const char* reason) override; 5896ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart void Disconnect(Error* error, const char* reason) override; 5996ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart bool Load(StoreInterface* storage) override; 6096ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart bool Save(StoreInterface* storage) override; 612dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly bool Unload() override; 622dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 638e60d61b13fedf9cb75f1d4f1762605375837d98Peter Qiu // Inherited from Service. 648e60d61b13fedf9cb75f1d4f1762605375837d98Peter Qiu std::string GetInnerDeviceRpcIdentifier() const override; 658e60d61b13fedf9cb75f1d4f1762605375837d98Peter Qiu 662dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly // Inherited from RPCTaskDelegate. 6796ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart void GetLogin(std::string* user, std::string* password) override; 6896ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart void Notify(const std::string& reason, 6996ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart const std::map<std::string, std::string>& dict) override; 702dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 712dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly private: 72a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu friend class PPPoEServiceTest; 732dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly FRIEND_TEST(PPPoEServiceTest, Disconnect); 74d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu FRIEND_TEST(PPPoEServiceTest, OnPPPConnected); 752dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 7675fba8153398eddb3a8623ba8621b8801fda4087Garret Kelly static const int kDefaultLCPEchoInterval; 7775fba8153398eddb3a8623ba8621b8801fda4087Garret Kelly static const int kDefaultLCPEchoFailure; 78b84e02c3d496696577bd9365dd134eb14570e050Garret Kelly static const int kDefaultMaxAuthFailure; 7975fba8153398eddb3a8623ba8621b8801fda4087Garret Kelly 802dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly void OnPPPAuthenticating(); 812dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly void OnPPPAuthenticated(); 8296ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart void OnPPPConnected(const std::map<std::string, std::string>& params); 832dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly void OnPPPDisconnected(); 842dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly void OnPPPDied(pid_t pid, int exit); 852dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 8696ca1fbf5b9ccbbad56b44d93040fe1d1100bebePaul Stewart ControlInterface* control_interface_; 87d1d3278b365e866a7381de2a640219b51fe0e27aPeter Qiu PPPDeviceFactory* ppp_device_factory_; 88a24480aaca4d392d6d08cebdc508ee49615839d3Peter Qiu ProcessManager* process_manager_; 892dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 902dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly std::string username_; 912dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly std::string password_; 9275fba8153398eddb3a8623ba8621b8801fda4087Garret Kelly int lcp_echo_interval_; 9375fba8153398eddb3a8623ba8621b8801fda4087Garret Kelly int lcp_echo_failure_; 94b84e02c3d496696577bd9365dd134eb14570e050Garret Kelly int max_auth_failure_; 952dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 962dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly bool authenticating_; 972dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly std::unique_ptr<ExternalTask> pppd_; 982dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly PPPDeviceRefPtr ppp_device_; 992dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1002dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly base::WeakPtrFactory<PPPoEService> weak_ptr_factory_; 1012dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1022dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly DISALLOW_COPY_AND_ASSIGN(PPPoEService); 1032dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly}; 1042dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1052dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly} // namespace shill 1062dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly 1072dc218e49e210b64ecf7d83946ec257ef1529171Garret Kelly#endif // SHILL_PPPOE_PPPOE_SERVICE_H_ 108