• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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 _TETHER_CONTROLLER_H
18 #define _TETHER_CONTROLLER_H
19 
20 #include <list>
21 #include <set>
22 #include <string>
23 
24 #include <netdutils/StatusOr.h>
25 #include <sysutils/SocketClient.h>
26 
27 #include "NetdConstants.h"
28 
29 namespace android {
30 namespace net {
31 
32 using android::netdutils::StatusOr;
33 
34 class TetherController {
35 private:
36     struct ForwardingDownstream {
37         std::string iface;
38         bool active;
39     };
40 
41     std::list<std::string> mInterfaces;
42 
43     // Map upstream iface -> downstream iface. A pair is in the map if forwarding was enabled at
44     // some point since the controller was initialized.
45     std::multimap<std::string, ForwardingDownstream> mFwdIfaces;
46 
47     // NetId to use for forwarded DNS queries. This may not be the default
48     // network, e.g., in the case where we are tethering to a DUN APN.
49     unsigned               mDnsNetId;
50     std::list<std::string> mDnsForwarders;
51     pid_t                  mDaemonPid;
52     int                    mDaemonFd;
53     std::set<std::string>  mForwardingRequests;
54 
55 public:
56 
57     TetherController();
58     virtual ~TetherController();
59 
60     bool enableForwarding(const char* requester);
61     bool disableForwarding(const char* requester);
62     size_t forwardingRequestCount();
63 
64     int startTethering(int num_addrs, char **dhcp_ranges);
65     int stopTethering();
66     bool isTetheringStarted();
67 
68     unsigned getDnsNetId();
69     int setDnsForwarders(unsigned netId, char **servers, int numServers);
70     const std::list<std::string> &getDnsForwarders() const;
71 
72     int tetherInterface(const char *interface);
73     int untetherInterface(const char *interface);
74     const std::list<std::string> &getTetheredInterfaceList() const;
75     bool applyDnsInterfaces();
76 
77     int enableNat(const char* intIface, const char* extIface);
78     int disableNat(const char* intIface, const char* extIface);
79     int setupIptablesHooks();
80 
81     class TetherStats {
82     public:
83         TetherStats() = default;
TetherStats(std::string intIfn,std::string extIfn,int64_t rxB,int64_t rxP,int64_t txB,int64_t txP)84         TetherStats(std::string intIfn, std::string extIfn,
85                 int64_t rxB, int64_t rxP,
86                 int64_t txB, int64_t txP)
87                         : intIface(intIfn), extIface(extIfn),
88                             rxBytes(rxB), rxPackets(rxP),
89                             txBytes(txB), txPackets(txP) {};
90         std::string intIface;
91         std::string extIface;
92         int64_t rxBytes = -1;
93         int64_t rxPackets = -1;
94         int64_t txBytes = -1;
95         int64_t txPackets = -1;
96 
addStatsIfMatch(const TetherStats & other)97         bool addStatsIfMatch(const TetherStats& other) {
98             if (intIface == other.intIface && extIface == other.extIface) {
99                 rxBytes   += other.rxBytes;
100                 rxPackets += other.rxPackets;
101                 txBytes   += other.txBytes;
102                 txPackets += other.txPackets;
103                 return true;
104             }
105             return false;
106         }
107     };
108 
109     typedef std::vector<TetherStats> TetherStatsList;
110 
111     StatusOr<TetherStatsList> getTetherStats();
112 
113     /*
114      * extraProcessingInfo: contains raw parsed data, and error info.
115      * This strongly requires that setup of the rules is in a specific order:
116      *  in:intIface out:extIface
117      *  in:extIface out:intIface
118      * and the rules are grouped in pairs when more that one tethering was setup.
119      */
120     static int addForwardChainStats(TetherStatsList& statsList, const std::string& iptOutput,
121                                     std::string &extraProcessingInfo);
122 
123     static constexpr const char* LOCAL_FORWARD               = "tetherctrl_FORWARD";
124     static constexpr const char* LOCAL_MANGLE_FORWARD        = "tetherctrl_mangle_FORWARD";
125     static constexpr const char* LOCAL_NAT_POSTROUTING       = "tetherctrl_nat_POSTROUTING";
126     static constexpr const char* LOCAL_RAW_PREROUTING        = "tetherctrl_raw_PREROUTING";
127     static constexpr const char* LOCAL_TETHER_COUNTERS_CHAIN = "tetherctrl_counters";
128 
129     android::RWLock lock;
130 
131 private:
132     bool setIpFwdEnabled();
133 
134     int setupIPv6CountersChain();
135     static std::string makeTetherCountingRule(const char *if1, const char *if2);
136     ForwardingDownstream* findForwardingDownstream(const std::string& intIface,
137         const std::string& extIface);
138     void addForwardingPair(const std::string& intIface, const std::string& extIface);
139     void markForwardingPairDisabled(const std::string& intIface, const std::string& extIface);
140 
141     bool isForwardingPairEnabled(const std::string& intIface, const std::string& extIface);
142     bool isAnyForwardingEnabledOnUpstream(const std::string& extIface);
143     bool isAnyForwardingPairEnabled();
144     bool tetherCountingRuleExists(const std::string& iface1, const std::string& iface2);
145 
146     int setDefaults();
147     int setForwardRules(bool set, const char *intIface, const char *extIface);
148     int setTetherCountingRules(bool add, const char *intIface, const char *extIface);
149 
150     static void addStats(TetherStatsList& statsList, const TetherStats& stats);
151 
152     // For testing.
153     friend class TetherControllerTest;
154     static int (*iptablesRestoreFunction)(IptablesTarget, const std::string&, std::string *);
155 };
156 
157 }  // namespace net
158 }  // namespace android
159 
160 #endif
161