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