1 //
2 // Copyright (C) 2014 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef SHILL_CELLULAR_CELLULAR_BEARER_H_
18 #define SHILL_CELLULAR_CELLULAR_BEARER_H_
19 
20 #include <memory>
21 #include <string>
22 #include <vector>
23 
24 #include <base/macros.h>
25 #include <gtest/gtest_prod.h>
26 
27 #include "shill/ipconfig.h"
28 
29 namespace shill {
30 
31 class DBusPropertiesProxyInterface;
32 class ControlInterface;
33 
34 // A class for observing property changes of a bearer object exposed by
35 // ModemManager.
36 class CellularBearer {
37  public:
38   // Constructs a cellular bearer for observing property changes of a
39   // corresponding bearer object, at the DBus path |dbus_path| of DBus service
40   // |dbus_service|,  exposed by ModemManager. The ownership of |proxy_factory|
41   // is not transferred, and should outlive this object.
42   //
43   // TODO(benchan): Use a context object approach to pass objects like
44   // ControlInterface through constructor.
45   CellularBearer(ControlInterface* control_interface,
46                  const std::string& dbus_path,
47                  const std::string& dbus_service);
48   ~CellularBearer();
49 
50   // Initializes this object by creating a DBus properties proxy to observe
51   // property changes of the corresponding bearer object exposed by ModemManager
52   // and also fetching the current properties of the bearer.  Returns true on
53   // success or false if it fails to the DBus properties proxy.
54   bool Init();
55 
56   // Callback upon property changes of the bearer.
57   void OnPropertiesChanged(
58       const std::string& interface,
59       const KeyValueStore& changed_properties,
60       const std::vector<std::string>& invalidated_properties);
61 
dbus_path()62   const std::string& dbus_path() const { return dbus_path_; }
dbus_service()63   const std::string& dbus_service() const { return dbus_service_; }
64 
connected()65   bool connected() const { return connected_; }
data_interface()66   const std::string& data_interface() const { return data_interface_; }
ipv4_config_method()67   IPConfig::Method ipv4_config_method() const { return ipv4_config_method_; }
ipv4_config_properties()68   const IPConfig::Properties* ipv4_config_properties() const {
69     return ipv4_config_properties_.get();
70   }
ipv6_config_method()71   IPConfig::Method ipv6_config_method() const { return ipv6_config_method_; }
ipv6_config_properties()72   const IPConfig::Properties* ipv6_config_properties() const {
73     return ipv6_config_properties_.get();
74   }
75 
76  private:
77   friend class CellularBearerTest;
78   FRIEND_TEST(CellularTest, EstablishLinkDHCP);
79   FRIEND_TEST(CellularTest, EstablishLinkPPP);
80   FRIEND_TEST(CellularTest, EstablishLinkStatic);
81 
82   // Gets the IP configuration method and properties from |properties|.
83   // |address_family| specifies the IP address family of the configuration.
84   // |ipconfig_method| and |ipconfig_properties| are used to return the IP
85   // configuration method and properties and should be non-NULL.
86   void GetIPConfigMethodAndProperties(
87       const KeyValueStore& properties,
88       IPAddress::Family address_family,
89       IPConfig::Method* ipconfig_method,
90       std::unique_ptr<IPConfig::Properties>* ipconfig_properties) const;
91 
92   // Resets bearer properties.
93   void ResetProperties();
94 
95   // Updates bearer properties by fetching the current properties of the
96   // corresponding bearer object exposed by ModemManager over DBus.
97   void UpdateProperties();
98 
99   // Setters for unit tests.
set_connected(bool connected)100   void set_connected(bool connected) { connected_ = connected; }
set_data_interface(const std::string & data_interface)101   void set_data_interface(const std::string& data_interface) {
102     data_interface_ = data_interface;
103   }
set_ipv4_config_method(IPConfig::Method ipv4_config_method)104   void set_ipv4_config_method(IPConfig::Method ipv4_config_method) {
105     ipv4_config_method_ = ipv4_config_method;
106   }
set_ipv4_config_properties(std::unique_ptr<IPConfig::Properties> ipv4_config_properties)107   void set_ipv4_config_properties(
108       std::unique_ptr<IPConfig::Properties> ipv4_config_properties) {
109     ipv4_config_properties_ = std::move(ipv4_config_properties);
110   }
set_ipv6_config_method(IPConfig::Method ipv6_config_method)111   void set_ipv6_config_method(IPConfig::Method ipv6_config_method) {
112     ipv6_config_method_ = ipv6_config_method;
113   }
set_ipv6_config_properties(std::unique_ptr<IPConfig::Properties> ipv6_config_properties)114   void set_ipv6_config_properties(
115       std::unique_ptr<IPConfig::Properties> ipv6_config_properties) {
116     ipv6_config_properties_ = std::move(ipv6_config_properties);
117   }
118 
119   ControlInterface* control_interface_;
120   std::string dbus_path_;
121   std::string dbus_service_;
122   std::unique_ptr<DBusPropertiesProxyInterface> dbus_properties_proxy_;
123   bool connected_;
124   std::string data_interface_;
125 
126   // If |ipv4_config_method_| is set to |IPConfig::kMethodStatic|,
127   // |ipv4_config_properties_| is guaranteed to contain valid IP configuration
128   // properties. Otherwise, |ipv4_config_properties_| is set to nullptr.
129   // |ipv6_config_properties_| is handled similarly.
130   IPConfig::Method ipv4_config_method_;
131   std::unique_ptr<IPConfig::Properties> ipv4_config_properties_;
132   IPConfig::Method ipv6_config_method_;
133   std::unique_ptr<IPConfig::Properties> ipv6_config_properties_;
134 
135   DISALLOW_COPY_AND_ASSIGN(CellularBearer);
136 };
137 
138 }  // namespace shill
139 
140 #endif  // SHILL_CELLULAR_CELLULAR_BEARER_H_
141