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