JP Abgrall | 4a5f5ca | 2011-06-15 18:37:39 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2011 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 | #ifndef _BANDWIDTH_CONTROLLER_H |
| 17 | #define _BANDWIDTH_CONTROLLER_H |
| 18 | |
Joel Scherpelz | ced1dd9 | 2017-06-28 10:19:52 +0900 | [diff] [blame] | 19 | #include <map> |
| 20 | #include <set> |
JP Abgrall | 4a5f5ca | 2011-06-15 18:37:39 -0700 | [diff] [blame] | 21 | #include <string> |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 22 | #include <utility> |
| 23 | #include <vector> |
Luke Huang | d1ee462 | 2018-06-29 13:49:58 +0800 | [diff] [blame^] | 24 | #include <mutex> |
JP Abgrall | baeccc4 | 2013-06-25 09:44:10 -0700 | [diff] [blame] | 25 | |
Lorenzo Colitti | 13debb8 | 2016-03-27 17:46:30 +0900 | [diff] [blame] | 26 | #include "NetdConstants.h" |
| 27 | |
JP Abgrall | 4a5f5ca | 2011-06-15 18:37:39 -0700 | [diff] [blame] | 28 | class BandwidthController { |
| 29 | public: |
Luke Huang | d1ee462 | 2018-06-29 13:49:58 +0800 | [diff] [blame^] | 30 | std::mutex lock; |
Lorenzo Colitti | dedd271 | 2016-03-22 12:36:29 +0900 | [diff] [blame] | 31 | |
JP Abgrall | fa6f46d | 2011-06-17 23:17:28 -0700 | [diff] [blame] | 32 | BandwidthController(); |
JP Abgrall | 0031cea | 2012-04-17 16:38:23 -0700 | [diff] [blame] | 33 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 34 | int setupIptablesHooks(); |
Chenbo Feng | 95892f3 | 2018-06-07 14:52:02 -0700 | [diff] [blame] | 35 | static bool getBpfStatus(); |
JP Abgrall | 0031cea | 2012-04-17 16:38:23 -0700 | [diff] [blame] | 36 | |
| 37 | int enableBandwidthControl(bool force); |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 38 | int disableBandwidthControl(); |
Lorenzo Colitti | 7618ccb | 2016-03-18 12:36:03 +0900 | [diff] [blame] | 39 | int enableDataSaver(bool enable); |
JP Abgrall | fa6f46d | 2011-06-17 23:17:28 -0700 | [diff] [blame] | 40 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 41 | int setInterfaceSharedQuota(const std::string& iface, int64_t bytes); |
JP Abgrall | 8a93272 | 2011-07-13 19:17:35 -0700 | [diff] [blame] | 42 | int getInterfaceSharedQuota(int64_t *bytes); |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 43 | int removeInterfaceSharedQuota(const std::string& iface); |
JP Abgrall | fa6f46d | 2011-06-17 23:17:28 -0700 | [diff] [blame] | 44 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 45 | int setInterfaceQuota(const std::string& iface, int64_t bytes); |
| 46 | int getInterfaceQuota(const std::string& iface, int64_t* bytes); |
| 47 | int removeInterfaceQuota(const std::string& iface); |
JP Abgrall | 0dad7c2 | 2011-06-24 11:58:14 -0700 | [diff] [blame] | 48 | |
Bernie Innocenti | 15bb55c | 2018-06-03 16:19:51 +0900 | [diff] [blame] | 49 | int addNaughtyApps(int numUids, const char* const appUids[]); |
| 50 | int removeNaughtyApps(int numUids, const char* const appUids[]); |
| 51 | int addNiceApps(int numUids, const char* const appUids[]); |
| 52 | int removeNiceApps(int numUids, const char* const appUids[]); |
JP Abgrall | 4a5f5ca | 2011-06-15 18:37:39 -0700 | [diff] [blame] | 53 | |
JP Abgrall | 8a93272 | 2011-07-13 19:17:35 -0700 | [diff] [blame] | 54 | int setGlobalAlert(int64_t bytes); |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 55 | int removeGlobalAlert(); |
| 56 | int setGlobalAlertInForwardChain(); |
| 57 | int removeGlobalAlertInForwardChain(); |
JP Abgrall | 8a93272 | 2011-07-13 19:17:35 -0700 | [diff] [blame] | 58 | |
| 59 | int setSharedAlert(int64_t bytes); |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 60 | int removeSharedAlert(); |
JP Abgrall | 8a93272 | 2011-07-13 19:17:35 -0700 | [diff] [blame] | 61 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 62 | int setInterfaceAlert(const std::string& iface, int64_t bytes); |
| 63 | int removeInterfaceAlert(const std::string& iface); |
JP Abgrall | 0dad7c2 | 2011-06-24 11:58:14 -0700 | [diff] [blame] | 64 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 65 | static const char LOCAL_INPUT[]; |
| 66 | static const char LOCAL_FORWARD[]; |
| 67 | static const char LOCAL_OUTPUT[]; |
| 68 | static const char LOCAL_RAW_PREROUTING[]; |
| 69 | static const char LOCAL_MANGLE_POSTROUTING[]; |
Jeff Sharkey | 8e188ed | 2012-07-12 18:32:03 -0700 | [diff] [blame] | 70 | |
Chenbo Feng | 95892f3 | 2018-06-07 14:52:02 -0700 | [diff] [blame] | 71 | enum IptJumpOp { IptJumpReject, IptJumpReturn, IptJumpNoAdd }; |
| 72 | enum IptOp { IptOpInsert, IptOpDelete }; |
| 73 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 74 | private: |
Joel Scherpelz | ced1dd9 | 2017-06-28 10:19:52 +0900 | [diff] [blame] | 75 | struct QuotaInfo { |
JP Abgrall | 8a93272 | 2011-07-13 19:17:35 -0700 | [diff] [blame] | 76 | int64_t quota; |
| 77 | int64_t alert; |
| 78 | }; |
JP Abgrall | db7da58 | 2011-09-18 12:57:32 -0700 | [diff] [blame] | 79 | |
JP Abgrall | 26e0d49 | 2011-06-24 19:21:51 -0700 | [diff] [blame] | 80 | enum IptIpVer { IptIpV4, IptIpV6 }; |
Lorenzo Colitti | d9db08c | 2017-04-28 11:06:40 +0900 | [diff] [blame] | 81 | enum IptFullOp { IptFullOpInsert, IptFullOpDelete, IptFullOpAppend }; |
JP Abgrall | 26e0d49 | 2011-06-24 19:21:51 -0700 | [diff] [blame] | 82 | enum QuotaType { QuotaUnique, QuotaShared }; |
| 83 | enum RunCmdErrHandling { RunCmdFailureBad, RunCmdFailureOk }; |
JP Abgrall | 1fb02df | 2012-04-24 23:27:44 -0700 | [diff] [blame] | 84 | #if LOG_NDEBUG |
| 85 | enum IptFailureLog { IptFailShow, IptFailHide }; |
| 86 | #else |
| 87 | enum IptFailureLog { IptFailShow, IptFailHide = IptFailShow }; |
| 88 | #endif |
JP Abgrall | a9ba4cb | 2013-07-02 19:08:48 -0700 | [diff] [blame] | 89 | |
Lorenzo Colitti | aff2879 | 2017-09-26 17:46:18 +0900 | [diff] [blame] | 90 | std::string makeDataSaverCommand(IptablesTarget target, bool enable); |
| 91 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 92 | int manipulateSpecialApps(const std::vector<std::string>& appStrUids, const std::string& chain, |
| 93 | IptJumpOp jumpHandling, IptOp appOp); |
JP Abgrall | 4a5f5ca | 2011-06-15 18:37:39 -0700 | [diff] [blame] | 94 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 95 | int runIptablesAlertCmd(IptOp op, const std::string& alertName, int64_t bytes); |
| 96 | int runIptablesAlertFwdCmd(IptOp op, const std::string& alertName, int64_t bytes); |
JP Abgrall | 8a93272 | 2011-07-13 19:17:35 -0700 | [diff] [blame] | 97 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 98 | int updateQuota(const std::string& alertName, int64_t bytes); |
JP Abgrall | 8a93272 | 2011-07-13 19:17:35 -0700 | [diff] [blame] | 99 | |
Joel Scherpelz | bcad661 | 2017-05-30 10:55:11 +0900 | [diff] [blame] | 100 | int setCostlyAlert(const std::string& costName, int64_t bytes, int64_t* alertBytes); |
| 101 | int removeCostlyAlert(const std::string& costName, int64_t* alertBytes); |
JP Abgrall | 8a93272 | 2011-07-13 19:17:35 -0700 | [diff] [blame] | 102 | |
JP Abgrall | 0e540ec | 2013-08-26 15:13:10 -0700 | [diff] [blame] | 103 | /* |
| 104 | * Attempt to find the bw_costly_* tables that need flushing, |
| 105 | * and flush them. |
| 106 | * If doClean then remove the tables also. |
| 107 | * Deals with both ip4 and ip6 tables. |
| 108 | */ |
| 109 | void flushExistingCostlyTables(bool doClean); |
Lorenzo Colitti | 56c4b1e | 2017-02-01 02:45:10 +0900 | [diff] [blame] | 110 | static void parseAndFlushCostlyTables(const std::string& ruleList, bool doRemove); |
JP Abgrall | 0e540ec | 2013-08-26 15:13:10 -0700 | [diff] [blame] | 111 | |
| 112 | /* |
| 113 | * Attempt to flush our tables. |
| 114 | * If doClean then remove them also. |
| 115 | * Deals with both ip4 and ip6 tables. |
| 116 | */ |
| 117 | void flushCleanTables(bool doClean); |
| 118 | |
Joel Scherpelz | ced1dd9 | 2017-06-28 10:19:52 +0900 | [diff] [blame] | 119 | // For testing. |
| 120 | friend class BandwidthControllerTest; |
| 121 | static int (*execFunction)(int, char **, int *, bool, bool); |
| 122 | static FILE *(*popenFunction)(const char *, const char *); |
| 123 | static int (*iptablesRestoreFunction)(IptablesTarget, const std::string&, std::string *); |
JP Abgrall | db7da58 | 2011-09-18 12:57:32 -0700 | [diff] [blame] | 124 | |
Joel Scherpelz | ced1dd9 | 2017-06-28 10:19:52 +0900 | [diff] [blame] | 125 | static const char *opToString(IptOp op); |
| 126 | static const char *jumpToString(IptJumpOp jumpHandling); |
| 127 | |
Chenbo Feng | 95892f3 | 2018-06-07 14:52:02 -0700 | [diff] [blame] | 128 | bool mBpfSupported; |
| 129 | |
Joel Scherpelz | ced1dd9 | 2017-06-28 10:19:52 +0900 | [diff] [blame] | 130 | int64_t mSharedQuotaBytes = 0; |
| 131 | int64_t mSharedAlertBytes = 0; |
| 132 | int64_t mGlobalAlertBytes = 0; |
JP Abgrall | c6c6734 | 2011-10-07 16:28:54 -0700 | [diff] [blame] | 133 | /* |
| 134 | * This tracks the number of tethers setup. |
| 135 | * The FORWARD chain is updated in the following cases: |
| 136 | * - The 1st time a globalAlert is setup and there are tethers setup. |
| 137 | * - Anytime a globalAlert is removed and there are tethers setup. |
| 138 | * - The 1st tether is setup and there is a globalAlert active. |
| 139 | * - The last tether is removed and there is a globalAlert active. |
| 140 | */ |
Joel Scherpelz | ced1dd9 | 2017-06-28 10:19:52 +0900 | [diff] [blame] | 141 | int mGlobalAlertTetherCount = 0; |
JP Abgrall | c6c6734 | 2011-10-07 16:28:54 -0700 | [diff] [blame] | 142 | |
Joel Scherpelz | ced1dd9 | 2017-06-28 10:19:52 +0900 | [diff] [blame] | 143 | std::map<std::string, QuotaInfo> mQuotaIfaces; |
| 144 | std::set<std::string> mSharedQuotaIfaces; |
JP Abgrall | 4a5f5ca | 2011-06-15 18:37:39 -0700 | [diff] [blame] | 145 | }; |
| 146 | |
| 147 | #endif |