BandwidthController.h revision 8a93272255f1b7e3083a97e1e28ddf675c0c7fb0
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
19#include <list>
20#include <string>
21#include <utility>  // for pair
22class BandwidthController {
23public:
24    BandwidthController();
25    int enableBandwidthControl(void);
26    int disableBandwidthControl(void);
27
28    int setInterfaceSharedQuota(const char *iface, int64_t bytes);
29    int getInterfaceSharedQuota(int64_t *bytes);
30    int removeInterfaceSharedQuota(const char *iface);
31
32    int setInterfaceQuota(const char *iface, int64_t bytes);
33    int getInterfaceQuota(const char *iface, int64_t *bytes);
34    int removeInterfaceQuota(const char *iface);
35
36    int addNaughtyApps(int numUids, char *appUids[]);
37    int removeNaughtyApps(int numUids, char *appUids[]);
38
39    int setGlobalAlert(int64_t bytes);
40    int removeGlobalAlert(void);
41
42    int setSharedAlert(int64_t bytes);
43    int removeSharedAlert(void);
44
45    int setInterfaceAlert(const char *iface, int64_t bytes);
46    int removeInterfaceAlert(const char *iface);
47
48protected:
49    class QuotaInfo {
50    public:
51      QuotaInfo(std::string ifn, int64_t q, int64_t a)
52              : ifaceName(ifn), quota(q), alert(a) {};
53        std::string ifaceName;
54        int64_t quota;
55        int64_t alert;
56    };
57    enum IptIpVer { IptIpV4, IptIpV6 };
58    enum IptOp { IptOpInsert, IptOpReplace, IptOpDelete };
59    enum IptRejectOp { IptRejectAdd, IptRejectNoAdd };
60    enum NaughtyAppOp { NaughtyAppOpAdd, NaughtyAppOpRemove };
61    enum QuotaType { QuotaUnique, QuotaShared };
62    enum RunCmdErrHandling { RunCmdFailureBad, RunCmdFailureOk };
63
64    std::list<std::string> sharedQuotaIfaces;
65    int64_t sharedQuotaBytes;
66    int64_t sharedAlertBytes;
67
68    std::list<QuotaInfo> quotaIfaces;
69
70    std::list<int /*appUid*/> naughtyAppUids;
71    int maninpulateNaughtyApps(int numUids, char *appStrUids[], NaughtyAppOp appOp);
72
73    int prepCostlyIface(const char *ifn, QuotaType quotaType);
74    int cleanupCostlyIface(const char *ifn, QuotaType quotaType);
75
76    std::string makeIptablesNaughtyCmd(IptOp op, int uid);
77    std::string makeIptablesQuotaCmd(IptOp op, const char *costName, int64_t quota);
78
79    int runIptablesAlertCmd(IptOp op, const char *alertName, int64_t bytes);
80
81    /* Runs for both ipv4 and ipv6 iptables */
82    int runCommands(int numCommands, const char *commands[], RunCmdErrHandling cmdErrHandling);
83    /* Runs for both ipv4 and ipv6 iptables, appends -j REJECT --reject-with ...  */
84    static int runIpxtablesCmd(const char *cmd, IptRejectOp rejectHandling);
85    static int runIptablesCmd(const char *cmd, IptRejectOp rejectHandling, IptIpVer iptIpVer);
86
87    // Provides strncpy() + check overflow.
88    static int StrncpyAndCheck(char *buffer, const char *src, size_t buffSize);
89
90    int updateQuota(const char *alertName, int64_t bytes);
91
92    int64_t globalAlertBytes;
93    int setCostlyAlert(const char *costName, int64_t bytes, int64_t *alertBytes);
94    int removeCostlyAlert(const char *costName, int64_t *alertBytes);
95
96
97private:
98    static const char *cleanupCommands[];
99    static const char *setupCommands[];
100    static const char *basicAccountingCommands[];
101    static const int MAX_CMD_LEN;
102    static const int MAX_IFACENAME_LEN;
103    static const int MAX_CMD_ARGS;
104    static const char IPTABLES_PATH[];
105    static const char IP6TABLES_PATH[];
106    static const char ALERT_IPT_TEMPLATE[];
107    static const int ALERT_RULE_POS_IN_COSTLY_CHAIN;
108};
109
110#endif
111