• 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/DumpWriter.h>
25 #include <netdutils/StatusOr.h>
26 #include <sysutils/SocketClient.h>
27 
28 #include "NetdConstants.h"
29 #include "android-base/result.h"
30 
31 #include "android/net/TetherOffloadRuleParcel.h"
32 
33 #include "mainline/XtBpfProgLocations.h"
34 
35 namespace android {
36 namespace net {
37 
38 class TetherController {
39   private:
40     struct ForwardingDownstream {
41         std::string iface;
42         bool active;
43     };
44 
45     std::list<std::string> mInterfaces;
46 
47     // Map upstream iface -> downstream iface. A pair is in the map if forwarding was enabled at
48     // some point since the controller was initialized.
49     std::multimap<std::string, ForwardingDownstream> mFwdIfaces;
50 
51     bool mIsTetheringStarted = false;
52 
53     // NetId to use for forwarded DNS queries. This may not be the default
54     // network, e.g., in the case where we are tethering to a DUN APN.
55     unsigned               mDnsNetId = 0;
56     std::list<std::string> mDnsForwarders;
57     pid_t                  mDaemonPid = 0;
58     int                    mDaemonFd = -1;
59     std::set<std::string>  mForwardingRequests;
60 
61     struct DnsmasqState {
62         static int sendCmd(int daemonFd, const std::string& cmd);
63 
64         // List of downstream interfaces on which to serve. The format used is:
65         //     update_ifaces|<ifname1>|<ifname2>|...
66         std::string update_ifaces_cmd;
67         // Forwarding (upstream) DNS configuration to use. The format used is:
68         //     update_dns|<hex_socket_mark>|<ip1>|<ip2>|...
69         std::string update_dns_cmd;
70 
71         void clear();
72         int sendAllState(int daemonFd) const;
73     } mDnsmasqState{};
74 
75   public:
76     TetherController();
77     ~TetherController() = default;
78 
79     bool enableForwarding(const char* requester);
80     bool disableForwarding(const char* requester);
81     const std::set<std::string>& getIpfwdRequesterList() const;
82 
83     //TODO: Clean up the overload function
84     int startTethering(bool isLegacyDnsProxy, int num_addrs, char** dhcp_ranges);
85     int startTethering(bool isLegacyDnsProxy, const std::vector<std::string>& dhcpRanges);
86     int stopTethering();
87     bool isTetheringStarted();
88 
89     unsigned getDnsNetId();
90     int setDnsForwarders(unsigned netId, char **servers, int numServers);
91     int setDnsForwarders(unsigned netId, const std::vector<std::string>& servers);
92     const std::list<std::string> &getDnsForwarders() const;
93 
94     int tetherInterface(const char *interface);
95     int untetherInterface(const char *interface);
96     const std::list<std::string> &getTetheredInterfaceList() const;
97     bool applyDnsInterfaces();
98 
99     int enableNat(const char* intIface, const char* extIface);
100     int disableNat(const char* intIface, const char* extIface);
101     int setupIptablesHooks();
102 
103     class TetherStats {
104       public:
105         TetherStats() = default;
TetherStats(std::string intIfn,std::string extIfn,int64_t rxB,int64_t rxP,int64_t txB,int64_t txP)106         TetherStats(std::string intIfn, std::string extIfn,
107                 int64_t rxB, int64_t rxP,
108                 int64_t txB, int64_t txP)
109                         : intIface(intIfn), extIface(extIfn),
110                             rxBytes(rxB), rxPackets(rxP),
111                             txBytes(txB), txPackets(txP) {};
112         std::string intIface;
113         std::string extIface;
114         int64_t rxBytes = -1;
115         int64_t rxPackets = -1;
116         int64_t txBytes = -1;
117         int64_t txPackets = -1;
118 
addStatsIfMatch(const TetherStats & other)119         bool addStatsIfMatch(const TetherStats& other) {
120             if (intIface == other.intIface && extIface == other.extIface) {
121                 rxBytes   += other.rxBytes;
122                 rxPackets += other.rxPackets;
123                 txBytes   += other.txBytes;
124                 txPackets += other.txPackets;
125                 return true;
126             }
127             return false;
128         }
129     };
130 
131     typedef std::vector<TetherStats> TetherStatsList;
132 
133     netdutils::StatusOr<TetherStatsList> getTetherStats();
134 
135     /*
136      * extraProcessingInfo: contains raw parsed data, and error info.
137      * This strongly requires that setup of the rules is in a specific order:
138      *  in:intIface out:extIface
139      *  in:extIface out:intIface
140      * and the rules are grouped in pairs when more that one tethering was setup.
141      */
142     static int addForwardChainStats(TetherStatsList& statsList, const std::string& iptOutput,
143                                     std::string &extraProcessingInfo);
144 
145     static constexpr const char* LOCAL_FORWARD               = "tetherctrl_FORWARD";
146     static constexpr const char* LOCAL_MANGLE_FORWARD        = "tetherctrl_mangle_FORWARD";
147     static constexpr const char* LOCAL_NAT_POSTROUTING       = "tetherctrl_nat_POSTROUTING";
148     static constexpr const char* LOCAL_RAW_PREROUTING        = "tetherctrl_raw_PREROUTING";
149     static constexpr const char* LOCAL_TETHER_COUNTERS_CHAIN = "tetherctrl_counters";
150 
151     std::mutex lock;
152 
153     void dump(netdutils::DumpWriter& dw);
154     void dumpIfaces(netdutils::DumpWriter& dw);
155 
156   private:
157     bool setIpFwdEnabled();
158     std::vector<char*> toCstrVec(const std::vector<std::string>& addrs);
159     int setupIPv6CountersChain();
160     static std::string makeTetherCountingRule(const char *if1, const char *if2);
161     ForwardingDownstream* findForwardingDownstream(const std::string& intIface,
162         const std::string& extIface);
163     void addForwardingPair(const std::string& intIface, const std::string& extIface);
164     void markForwardingPairDisabled(const std::string& intIface, const std::string& extIface);
165 
166     bool isForwardingPairEnabled(const std::string& intIface, const std::string& extIface);
167     bool isAnyForwardingEnabledOnUpstream(const std::string& extIface);
168     bool isAnyForwardingPairEnabled();
169     bool tetherCountingRuleExists(const std::string& iface1, const std::string& iface2);
170 
171     int setDefaults();
172     int setTetherGlobalAlertRule();
173     int setForwardRules(bool set, const char *intIface, const char *extIface);
174     int setTetherCountingRules(bool add, const char *intIface, const char *extIface);
175 
176     static void addStats(TetherStatsList& statsList, const TetherStats& stats);
177 
178     // For testing.
179     friend class TetherControllerTest;
180     static int (*iptablesRestoreFunction)(IptablesTarget, const std::string&, std::string *);
181 };
182 
183 }  // namespace net
184 }  // namespace android
185 
186 #endif
187