BandwidthController.h revision 0dad7c2f1f6994fbe5e85b9e1fc72d29d6453211
14a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall/*
24a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * Copyright (C) 2011 The Android Open Source Project
34a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall *
44a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * Licensed under the Apache License, Version 2.0 (the "License");
54a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * you may not use this file except in compliance with the License.
64a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * You may obtain a copy of the License at
74a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall *
84a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall *      http://www.apache.org/licenses/LICENSE-2.0
94a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall *
104a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * Unless required by applicable law or agreed to in writing, software
114a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * distributed under the License is distributed on an "AS IS" BASIS,
124a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * See the License for the specific language governing permissions and
144a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall * limitations under the License.
154a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall */
164a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#ifndef _BANDWIDTH_CONTROLLER_H
174a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#define _BANDWIDTH_CONTROLLER_H
184a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall
194a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#include <list>
204a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#include <string>
21fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall#include <utility>  // for pair
224a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrallclass BandwidthController {
234a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrallpublic:
24fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    BandwidthController();
25fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    int enableBandwidthControl(void);
26fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    int disableBandwidthControl(void);
27fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall
280dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    int setInterfaceSharedQuota(const char *iface, int64_t bytes);
29fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    int removeInterfaceSharedQuota(const char *iface);
30fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall
310dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    int setInterfaceQuota(const char *iface, int64_t bytes);
320dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    int removeInterfaceQuota(const char *iface);
330dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall
34fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    int addNaughtyApps(int numUids, char *appUids[]);
35fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    int removeNaughtyApps(int numUids, char *appUids[]);
364a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall
370dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall
384a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrallprotected:
39fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    typedef std::pair<std::string /*ifaceName*/, int64_t /*quota*/> QuotaInfo;
40fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    enum IptOp {IptOpInsert, IptOpReplace, IptOpDelete};
410dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall
42fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    int64_t sharedQuotaBytes;
430dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    std::list<std::string> sharedQuotaIfaces;
440dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall
450dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    std::list<QuotaInfo> quotaIfaces;
460dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall
47fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    std::list<int /*appUid*/> naughtyAppUids;
48fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    int maninpulateNaughtyApps(int numUids, char *appStrUids[], bool doAdd);
494a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall
500dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    int prepCostlyIface(const char *ifn, bool isShared);
510dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    int cleanupCostlyIface(const char *ifn, bool isShared);
520dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall
530dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    std::string makeIptablesNaughtyCmd(IptOp op, int uid);
540dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    std::string makeIptablesQuotaCmd(IptOp op, char *costName, int64_t quota);
550dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall
560dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    /* Runs for both ipv4 and ipv6 iptables */
570dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    int runCommands(int numCommands, const char *commands[], bool allowFailure);
580dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    /* Runs for both ipv4 and ipv6 iptables, appends -j REJECT --reject-with ...  */
590dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    static int runIpxtablesCmd(const char *cmd, bool appendReject);
600dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall    static int runIptablesCmd(const char *cmd, bool appendReject, bool isIp6);
610dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall
624a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrallprivate:
63fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    static const char *cleanupCommands[];
64fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    static const char *setupCommands[];
65fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    static const char *basicAccountingCommands[];
66fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    static const int MAX_CMD_LEN;
67fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    static const int MAX_IFACENAME_LEN;
68fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    static const int MAX_CMD_ARGS;
69fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    static const char IPTABLES_PATH[];
70fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall    static const char IP6TABLES_PATH[];
714a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall
724a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall};
734a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall
744a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#endif
75