connection.h revision a330ecd23b1ce4112fd7a28f4b2a062b8df10735
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; 3923ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawalclass Resolver; 40dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartclass RoutingTable; 4113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkovstruct RoutingTableEntry; 42dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 43dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart// The Conneciton maintains the implemented state of an IPConfig, e.g, 44dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart// the IP address, routing table and DNS table entries. 45dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewartclass Connection : public base::RefCounted<Connection> { 46dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart public: 4713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // Clients can instantiate and use Binder to bind to a Connection and get 4813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // notified when the bound Connection disconnects. Note that the client's 4913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // disconnect callback will be executed at most once, and only if the bound 5013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // Connection is destroyed or signals disconnect. The Binder unbinds itself 5113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // from the underlying Connection when the Binder instance is destructed. 5213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov class Binder { 5313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov public: 54a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart Binder(const std::string& name, const base::Closure& disconnect_callback); 5513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov ~Binder(); 5613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 57ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov // Binds to |to_connection|. Unbinds the previous bound connection, if 58cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan // any. Pass nullptr to just unbind this Binder. 59a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart void Attach(const ConnectionRefPtr& to_connection); 6013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 61a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart const std::string& name() const { return name_; } 62cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan bool IsBound() const { return connection_ != nullptr; } 63ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov ConnectionRefPtr connection() const { return connection_.get(); } 6413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 6513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov private: 6613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov friend class Connection; 6713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, Binder); 6813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 6913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // Invoked by |connection_|. 7013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov void OnDisconnect(); 7113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 7213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov const std::string name_; 73ef1f9fec08b3a251a84ae3e4ef7ef15fdc2a1544Darin Petkov base::WeakPtr<Connection> connection_; 7413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov const base::Closure client_disconnect_callback_; 7513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 7613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov DISALLOW_COPY_AND_ASSIGN(Binder); 7713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov }; 7813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 799a908080fc2a72dbf06f995b878fc8a3693b725aPaul Stewart Connection(int interface_index, 80a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart const std::string& interface_name, 81e00600e1ec769b3acf0709e843c1f0ae73bd2fdbPaul Stewart Technology::Identifier technology_, 82608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu const DeviceInfo* device_info, 83608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu ControlInterface* control_interface); 84dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 85dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // Add the contents of an IPConfig reference to the list of managed state. 86dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // This will replace all previous state for this address family. 87a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual void UpdateFromIPConfig(const IPConfigRefPtr& config); 88dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 89df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart // Return the connection used by the lower binder. 90df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart virtual ConnectionRefPtr GetLowerConnection() const { 91df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart return lower_binder_.connection(); 92df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart } 93df3c0a897bc74cb3a9800332b8359a364ca2f753Paul Stewart 94dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // Sets the current connection as "default", i.e., routes and DNS entries 95dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // should be used by all system components that don't select explicitly. 96c681fa0742cabc686ccabaf0fdf6ce12dd7046b2Paul Stewart virtual bool is_default() const { return is_default_; } 97c1dec4d5cad7c6ee2cd8dbc4f47e4d30403dcca1Paul Stewart virtual void SetIsDefault(bool is_default); 98dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 99a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu // Update and apply the new DNS servers setting to this connection. 100a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual void UpdateDNSServers(const std::vector<std::string>& dns_servers); 101a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu 102a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const std::string& interface_name() const { return interface_name_; } 1034a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart virtual int interface_index() const { return interface_index_; } 104a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const std::vector<std::string>& dns_servers() const { 105c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart return dns_servers_; 106c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart } 1071b9546a8770b80edb45126691977121c4663cb53Samuel Tan virtual uint8_t table_id() const { return table_id_; } 108c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart 109a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const std::string& ipconfig_rpc_identifier() const { 11010241e32c136ba99e7533ca1370e2e8eca241b7cPaul Stewart return ipconfig_rpc_identifier_; 11110241e32c136ba99e7533ca1370e2e8eca241b7cPaul Stewart } 11210241e32c136ba99e7533ca1370e2e8eca241b7cPaul Stewart 11377e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi virtual bool SetupIptableEntries(); 11477e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi virtual bool TearDownIptableEntries(); 11577e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi 116c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart // Request to accept traffic routed to this connection even if it is not 117c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart // the default. This request is ref-counted so the caller must call 118c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart // ReleaseRouting() when they no longer need this facility. 119c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart virtual void RequestRouting(); 120c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart virtual void ReleaseRouting(); 121be5f5b341ba4b85d45ffb6c0430ef5ab84c7b961Paul Stewart 122f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart // Request a host route through this connection. 123a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual bool RequestHostRoute(const IPAddress& destination); 124f748a36f2cde2b1ac7fc543cc710c81cb431cc2fPaul Stewart 125762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi // Request a host route through this connection for a list of IPs in CIDR 126762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi // notation (|excluded_ips_cidr_|). 127762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi virtual bool PinPendingRoutes(int interface_index, RoutingTableEntry entry); 128762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi 1292cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart // Return the subnet name for this connection. 1302cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart virtual std::string GetSubnetName() const; 1312cb3fa7317cfa3248cff72d0b9d64c4f2f630472Paul Stewart 132a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const IPAddress& local() const { return local_; } 133a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const IPAddress& gateway() const { return gateway_; } 134fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo virtual Technology::Identifier technology() const { return technology_; } 135a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart virtual const std::string& tethering() const { return tethering_; } 136a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart void set_tethering(const std::string& tethering) { tethering_ = tethering; } 137fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo 138fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo // Return the lowest connection on which this connection depends. In case of 139cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan // error, a nullptr is returned. 140fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo virtual ConnectionRefPtr GetCarrierConnection(); 1416c72c972614285b2c01fb38afb2ffe06484a544aPaul Stewart 142f3a8f9064976d12c4f8ed3c6a5cc9ea4655c686dPeter Qiu // Return true if this is an IPv6 connection. 143f3a8f9064976d12c4f8ed3c6a5cc9ea4655c686dPeter Qiu virtual bool IsIPv6(); 144f3a8f9064976d12c4f8ed3c6a5cc9ea4655c686dPeter Qiu 14513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov protected: 14613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov friend class base::RefCounted<Connection>; 14713e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 14813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov virtual ~Connection(); 1494a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart virtual bool CreateGatewayRoute(); 15013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 151dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart private: 152dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart friend class ConnectionTest; 153dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart FRIEND_TEST(ConnectionTest, AddConfig); 154762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi FRIEND_TEST(ConnectionTest, AddConfigUserTrafficOnly); 15513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, Binder); 15613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, Binders); 157024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart FRIEND_TEST(ConnectionTest, BlackholeIPv6); 158dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart FRIEND_TEST(ConnectionTest, Destructor); 15953a303873f9a89ff0121777476d33afc9b77b987Paul Stewart FRIEND_TEST(ConnectionTest, FixGatewayReachability); 160fddc09ac26ba77cabb59810f01b705fca2efd10bAlex Deymo FRIEND_TEST(ConnectionTest, GetCarrierConnection); 1615b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart FRIEND_TEST(ConnectionTest, InitState); 16213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, OnRouteQueryResponse); 16313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov FRIEND_TEST(ConnectionTest, RequestHostRoute); 164024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart FRIEND_TEST(ConnectionTest, SetMTU); 165a89154bfedfd8872242083ffe4f084fdc774c078Peter Qiu FRIEND_TEST(ConnectionTest, UpdateDNSServers); 1665eb0542cb67358d9030367498a4ad741fc42af4fDarin Petkov FRIEND_TEST(VPNServiceTest, OnConnectionDisconnected); 167dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 1687fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint32_t kDefaultMetric; 1697fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint32_t kNonDefaultMetricBase; 170762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi static const uint32_t kMarkForUserTraffic; 171762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi static const uint8_t kSecondaryTableId; 1727cfca0467e47aa91b485c485b92befb33a1fd61fPaul Stewart 1735b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart // Work around misconfigured servers which provide a gateway address that 1745b7ba8c2e9e5ab5e67c68d0cde963141beb501d8Paul Stewart // is unreachable with the provided netmask. 175c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart bool FixGatewayReachability(const IPAddress& local, 176c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart IPAddress* peer, 177c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart IPAddress* gateway, 178c8fab0c129ea3e55fd89719f6e16c78ca505e05cPaul Stewart const IPAddress& trusted_ip); 1797fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t GetMetric(bool is_default); 180a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart bool PinHostRoute(const IPAddress& trusted_ip, const IPAddress& gateway); 181024a6c80bc8474d828af6d961ea7fe0d67d69587Paul Stewart void SetMTU(int32_t mtu); 182dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 18313e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov void OnRouteQueryResponse(int interface_index, 184a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart const RoutingTableEntry& entry); 18513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 186a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart void AttachBinder(Binder* binder); 187a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart void DetachBinder(Binder* binder); 18813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov void NotifyBindersOnDisconnect(); 18913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 19013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov void OnLowerDisconnect(); 19113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 1926f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart // Send our DNS configuration to the resolver. 1936f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart void PushDNSConfig(); 1946f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart 19513e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov base::WeakPtrFactory<Connection> weak_ptr_factory_; 19613e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 197dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart bool is_default_; 1984a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart bool has_broadcast_domain_; 199c8f4bef3c2a277d052f96ae06e67d3e7ab44a592Paul Stewart int routing_request_count_; 200dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart int interface_index_; 201dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart const std::string interface_name_; 202e00600e1ec769b3acf0709e843c1f0ae73bd2fdbPaul Stewart Technology::Identifier technology_; 203dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart std::vector<std::string> dns_servers_; 204dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart std::vector<std::string> dns_domain_search_; 205762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi std::vector<std::string> excluded_ips_cidr_; 206d62d6035f45ab5caf04a558a70fbc78457775f97Paul Stewart std::string dns_domain_name_; 20710241e32c136ba99e7533ca1370e2e8eca241b7cPaul Stewart std::string ipconfig_rpc_identifier_; 208762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi bool user_traffic_only_; 209762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi uint8_t table_id_; 2104a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart IPAddress local_; 2114a6748d492214afcb7c484668fa8cfd3ad963f10Paul Stewart IPAddress gateway_; 212dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 2137f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart // Track the tethering status of the Service associated with this connection. 2147f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart // This property is set by a service as it takes ownership of a connection, 2157f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart // and is read by services that are bound through this connection. 2167f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart std::string tethering_; 2177f5d9c0847d08ff4cd1fc7c0c8ae4117421e75c8Paul Stewart 21813e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // A binder to a lower Connection that this Connection depends on, if any. 21913e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov Binder lower_binder_; 22013e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 22113e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // Binders to clients -- usually to upper connections or related services and 22213e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov // devices. 223a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart std::deque<Binder*> binders_; 22413e6d55b9dd86148ae68588f367c48e81ad33b74Darin Petkov 225dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart // Store cached copies of singletons for speed/ease of testing 226a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart const DeviceInfo* device_info_; 227a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart Resolver* resolver_; 228a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart RoutingTable* routing_table_; 229a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewart RTNLHandler* rtnl_handler_; 230dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 231608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu ControlInterface* control_interface_; 232a330ecd23b1ce4112fd7a28f4b2a062b8df10735Peter Qiu std::unique_ptr<FirewallProxyInterface> firewall_proxy_; 23377e768323e57058b4660bb72ba2544a1cbe6d435Prabhu Kaliamoorthi 234dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart DISALLOW_COPY_AND_ASSIGN(Connection); 235dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart}; 236dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 237dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart} // namespace shill 238dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart 239c45688bb3881f0c2216e6ec0e19ebda0be33e871Ben Chan#endif // SHILL_CONNECTION_H_ 240