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