Home | History | Annotate | Download | only in server
      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;
     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 
     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