1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 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// 16dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 17c45688bb3881f0c2216e6ec0e19ebda0be33e871Ben Chan#ifndef SHILL_CONNECTION_H_ 18c45688bb3881f0c2216e6ec0e19ebda0be33e871Ben Chan#define SHILL_CONNECTION_H_ 19dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 2013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov#include <deque> 21dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include <string> 22dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include <vector> 23dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 24dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include <base/memory/ref_counted.h> 2513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov#include <base/memory/weak_ptr.h> 26dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include <gtest/gtest_prod.h> // for FRIEND_TEST 27dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 28e93b038972d43fd703b3c68603fb4d02bec6504ePaul Stewart#include "shill/ipconfig.h" 298d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h" 30dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart#include "shill/refptr_types.h" 31e00600e1ec769b3acf0709e843c1f0ae73bd2fdbPaul Stewart#include "shill/technology.h" 32dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 33dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartnamespace shill { 34dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 35608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiuclass ControlInterface; 369a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewartclass DeviceInfo; 37a330ecd23b1ce4112fd7a28f4b2a062b8df10735Peter Qiuclass FirewallProxyInterface; 3813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkovclass RTNLHandler; 39d5d3482e261beaee1a13622143d4abf728165fb9Peter Qiu#if !defined(__ANDROID__) 4023ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawalclass Resolver; 41d5d3482e261beaee1a13622143d4abf728165fb9Peter Qiu#else 42d5d3482e261beaee1a13622143d4abf728165fb9Peter Qiuclass DNSServerProxy; 439429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiuclass DNSServerProxyFactory; 44d5d3482e261beaee1a13622143d4abf728165fb9Peter Qiu#endif // __ANDROID__ 45dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartclass RoutingTable; 4613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkovstruct RoutingTableEntry; 47dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 48dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart// The Conneciton maintains the implemented state of an IPConfig, e.g, 49dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart// the IP address, routing table and DNS table entries. 50dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartclass Connection : public base::RefCounted<Connection> { 51dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart public: 5213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // Clients can instantiate and use Binder to bind to a Connection and get 5313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // notified when the bound Connection disconnects. Note that the client's 5413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // disconnect callback will be executed at most once, and only if the bound 5513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // Connection is destroyed or signals disconnect. The Binder unbinds itself 5613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // from the underlying Connection when the Binder instance is destructed. 5713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov class Binder { 5813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov public: 59a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart Binder(const std::string& name, const base::Closure& disconnect_callback); 6013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov ~Binder(); 6113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 62ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov // Binds to |to_connection|. Unbinds the previous bound connection, if 63cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan // any. Pass nullptr to just unbind this Binder. 64a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart void Attach(const ConnectionRefPtr& to_connection); 6513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 66a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart const std::string& name() const { return name_; } 67cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan bool IsBound() const { return connection_ != nullptr; } 68ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov ConnectionRefPtr connection() const { return connection_.get(); } 6913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 7013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov private: 7113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov friend class Connection; 7213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, Binder); 7313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 7413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // Invoked by |connection_|. 7513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov void OnDisconnect(); 7613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 7713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov const std::string name_; 78ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov base::WeakPtr<Connection> connection_; 7913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov const base::Closure client_disconnect_callback_; 8013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 8113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov DISALLOW_COPY_AND_ASSIGN(Binder); 8213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov }; 8313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 849a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart Connection(int interface_index, 85a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart const std::string& interface_name, 86e00600e1ec769b3acf0709e843c1f0ae73bd2fdbPaul Stewart Technology::Identifier technology_, 87608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu const DeviceInfo* device_info, 88608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu ControlInterface* control_interface); 89dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 90dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // Add the contents of an IPConfig reference to the list of managed state. 91dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // This will replace all previous state for this address family. 92a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual void UpdateFromIPConfig(const IPConfigRefPtr& config); 93dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 94df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart // Return the connection used by the lower binder. 95df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart virtual ConnectionRefPtr GetLowerConnection() const { 96df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart return lower_binder_.connection(); 97df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart } 98df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart 99dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // Sets the current connection as "default", i.e., routes and DNS entries 100dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // should be used by all system components that don't select explicitly. 101c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart virtual bool is_default() const { return is_default_; } 102c1dec4d5cad7c6ee2cd8dbc4f47e4d30403dcca1Paul Stewart virtual void SetIsDefault(bool is_default); 103dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 104a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu // Update and apply the new DNS servers setting to this connection. 105a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual void UpdateDNSServers(const std::vector<std::string>& dns_servers); 106a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu 107a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const std::string& interface_name() const { return interface_name_; } 1084a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart virtual int interface_index() const { return interface_index_; } 109a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const std::vector<std::string>& dns_servers() const { 110c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart return dns_servers_; 111c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart } 1121b9546a8770b80edb45126691977121c4663cb53Samuel Tan virtual uint8_t table_id() const { return table_id_; } 113c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart 114a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const std::string& ipconfig_rpc_identifier() const { 11510241e32c136ba99e7533ca1370e2e8eca241b7cPaul Stewart return ipconfig_rpc_identifier_; 11610241e32c136ba99e7533ca1370e2e8eca241b7cPaul Stewart } 11710241e32c136ba99e7533ca1370e2e8eca241b7cPaul Stewart 11877e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi virtual bool SetupIptableEntries(); 11977e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi virtual bool TearDownIptableEntries(); 12077e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi 121c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart // Request to accept traffic routed to this connection even if it is not 122c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart // the default. This request is ref-counted so the caller must call 123c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart // ReleaseRouting() when they no longer need this facility. 124c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart virtual void RequestRouting(); 125c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart virtual void ReleaseRouting(); 126be5f5b341ba4b85d45ffb6c0430ef5ab84c7b961Paul Stewart 127f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart // Request a host route through this connection. 128a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual bool RequestHostRoute(const IPAddress& destination); 129f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart 130762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi // Request a host route through this connection for a list of IPs in CIDR 131762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi // notation (|excluded_ips_cidr_|). 132762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi virtual bool PinPendingRoutes(int interface_index, RoutingTableEntry entry); 133762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi 1342cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart // Return the subnet name for this connection. 1352cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart virtual std::string GetSubnetName() const; 1362cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart 137a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const IPAddress& local() const { return local_; } 138a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const IPAddress& gateway() const { return gateway_; } 139fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo virtual Technology::Identifier technology() const { return technology_; } 140a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const std::string& tethering() const { return tethering_; } 141a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart void set_tethering(const std::string& tethering) { tethering_ = tethering; } 142fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo 143fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo // Return the lowest connection on which this connection depends. In case of 144cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan // error, a nullptr is returned. 145fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo virtual ConnectionRefPtr GetCarrierConnection(); 1466c72c972614285b2c01fb38afb2ffe06484a544aPaul Stewart 147f3a8f9064976d12c4f8ed3c6a5cc9ea4655c686dPeter Qiu // Return true if this is an IPv6 connection. 148f3a8f9064976d12c4f8ed3c6a5cc9ea4655c686dPeter Qiu virtual bool IsIPv6(); 149f3a8f9064976d12c4f8ed3c6a5cc9ea4655c686dPeter Qiu 15013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov protected: 15113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov friend class base::RefCounted<Connection>; 15213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 15313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov virtual ~Connection(); 1544a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart virtual bool CreateGatewayRoute(); 15513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 156dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart private: 157dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart friend class ConnectionTest; 158dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart FRIEND_TEST(ConnectionTest, AddConfig); 159762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi FRIEND_TEST(ConnectionTest, AddConfigUserTrafficOnly); 16013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, Binder); 16113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, Binders); 162024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart FRIEND_TEST(ConnectionTest, BlackholeIPv6); 163dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart FRIEND_TEST(ConnectionTest, Destructor); 16453a303873f9a89ff0121777476d33afc9b77b987Paul Stewart FRIEND_TEST(ConnectionTest, FixGatewayReachability); 165fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo FRIEND_TEST(ConnectionTest, GetCarrierConnection); 1665b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart FRIEND_TEST(ConnectionTest, InitState); 16713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, OnRouteQueryResponse); 16813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, RequestHostRoute); 169024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart FRIEND_TEST(ConnectionTest, SetMTU); 170a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu FRIEND_TEST(ConnectionTest, UpdateDNSServers); 1715eb0542cb67358d9030367498a4ad741fc42af4fDarin Petkov FRIEND_TEST(VPNServiceTest, OnConnectionDisconnected); 172dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 1737fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint32_t kDefaultMetric; 1747fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint32_t kNonDefaultMetricBase; 175762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi static const uint32_t kMarkForUserTraffic; 176762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi static const uint8_t kSecondaryTableId; 1777cfca0467e47aa91b485c485b92befb33a1fd61fPaul Stewart 1785b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart // Work around misconfigured servers which provide a gateway address that 1795b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart // is unreachable with the provided netmask. 180c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart bool FixGatewayReachability(const IPAddress& local, 181c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart IPAddress* peer, 182c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart IPAddress* gateway, 183c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart const IPAddress& trusted_ip); 1847fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t GetMetric(bool is_default); 185a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart bool PinHostRoute(const IPAddress& trusted_ip, const IPAddress& gateway); 186024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart void SetMTU(int32_t mtu); 187dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 18813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov void OnRouteQueryResponse(int interface_index, 189a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart const RoutingTableEntry& entry); 19013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 191a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart void AttachBinder(Binder* binder); 192a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart void DetachBinder(Binder* binder); 19313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov void NotifyBindersOnDisconnect(); 19413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 19513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov void OnLowerDisconnect(); 19613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 1976f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart // Send our DNS configuration to the resolver. 1986f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart void PushDNSConfig(); 1996f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart 20013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov base::WeakPtrFactory<Connection> weak_ptr_factory_; 20113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 202dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart bool is_default_; 2034a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart bool has_broadcast_domain_; 204c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart int routing_request_count_; 205dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart int interface_index_; 206dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart const std::string interface_name_; 207e00600e1ec769b3acf0709e843c1f0ae73bd2fdbPaul Stewart Technology::Identifier technology_; 208dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart std::vector<std::string> dns_servers_; 209dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart std::vector<std::string> dns_domain_search_; 210762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi std::vector<std::string> excluded_ips_cidr_; 211d62d6035f45ab5caf04a558a70fbc78457775f97Paul Stewart std::string dns_domain_name_; 21210241e32c136ba99e7533ca1370e2e8eca241b7cPaul Stewart std::string ipconfig_rpc_identifier_; 213762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi bool user_traffic_only_; 214762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi uint8_t table_id_; 2154a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart IPAddress local_; 2164a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart IPAddress gateway_; 217dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 2187f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart // Track the tethering status of the Service associated with this connection. 2197f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart // This property is set by a service as it takes ownership of a connection, 2207f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart // and is read by services that are bound through this connection. 2217f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart std::string tethering_; 2227f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart 22313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // A binder to a lower Connection that this Connection depends on, if any. 22413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov Binder lower_binder_; 22513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 22613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // Binders to clients -- usually to upper connections or related services and 22713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // devices. 228a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart std::deque<Binder*> binders_; 22913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 230dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // Store cached copies of singletons for speed/ease of testing 231a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart const DeviceInfo* device_info_; 232d5d3482e261beaee1a13622143d4abf728165fb9Peter Qiu#if !defined(__ANDROID__) 233a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart Resolver* resolver_; 234d5d3482e261beaee1a13622143d4abf728165fb9Peter Qiu#else 2359429723aad30865ab4604a6074dece9c6d45c0ccPeter Qiu DNSServerProxyFactory* dns_server_proxy_factory_; 236d5d3482e261beaee1a13622143d4abf728165fb9Peter Qiu std::unique_ptr<DNSServerProxy> dns_server_proxy_; 237d5d3482e261beaee1a13622143d4abf728165fb9Peter Qiu#endif // __ANDROID__; 238a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart RoutingTable* routing_table_; 239a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart RTNLHandler* rtnl_handler_; 240dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 241608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu ControlInterface* control_interface_; 242a330ecd23b1ce4112fd7a28f4b2a062b8df10735Peter Qiu std::unique_ptr<FirewallProxyInterface> firewall_proxy_; 24377e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi 244dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart DISALLOW_COPY_AND_ASSIGN(Connection); 245dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart}; 246dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 247dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart} // namespace shill 248dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 249c45688bb3881f0c2216e6ec0e19ebda0be33e871Ben Chan#endif // SHILL_CONNECTION_H_ 250