diff options
| author | Lorenzo Colitti <lorenzo@google.com> | 2016-03-25 13:38:19 +0900 |
|---|---|---|
| committer | Lorenzo Colitti <lorenzo@google.com> | 2016-03-27 21:43:44 +0900 |
| commit | 464eabecf1174154b8f61845610c3f4f0ca294b3 (patch) | |
| tree | 33fbbaf5d9c2a3931e7b76a82198f208ba1fb087 /server/BandwidthControllerTest.cpp | |
| parent | 94a7b43ecb13094313d5f1bdc2515be760a0b6be (diff) | |
Attempt to make data saver mode work for real.
The data saver refactoring change was incorrect in >= two ways:
1. It relied on the bw_costly_shared chain, which is currently
unused. NetworkManagementService just has a "TODO: support
quota shared across interfaces" comment about it. What
actually happens when setting quota is that each costly
interface chain (e.g., bw_costly_rmnet_data0) directly hooks
in the bw_penalty box chain.
2. Implementing app whitelisting using "RETURN" inside
bw_happy_box was pointless because if data saver was enabled,
there was a REJECT at the end of the bw_costly_shared chain
that it was returning to.
Instead, go back to the previous approach which hooked
bw_happy_box at the end of bw_penalty_box. Also, add an
additional bw_data_saver rule at the end of bw_happy_box.
bw_data_saver only contains one rule: RETURN if data saver is
enabled or REJECT if data saver is disabled.
That way:
1. If the app is blacklisted, bw_penalty_box REJECTs. If not:
2. If the app is whitelisted (system apps are always whitelisted)
bw_happy_box RETURNs to bw_costly_rmnet_data0, skipping
bw_data_saver.
3. If an app is neither blacklisted nor whitelisted, bw_happy_box
jumps to bw_data_saver. If data saver is enabled, it REJECTs
the packet, and if not, it RETURNs to bw_costly_rmnet_data0.
4. When we RETURN to bw_costly_rmnet_data0, either because the
app is whitelisted, or because data saver is off,
bw_costly_rmnet_data0 applies mobile data usage limits,
and then RETURNs to bw_OUTPUT, which calls xt_qtaguid, etc.
Bug: 26685616
Bug: 27506285
Change-Id: If15397afde6862d95827a1fdd30f60efd7fab66a
Diffstat (limited to 'server/BandwidthControllerTest.cpp')
| -rw-r--r-- | server/BandwidthControllerTest.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/server/BandwidthControllerTest.cpp b/server/BandwidthControllerTest.cpp index 4a59883a..82518302 100644 --- a/server/BandwidthControllerTest.cpp +++ b/server/BandwidthControllerTest.cpp @@ -26,7 +26,7 @@ std::vector<std::string> gCmds = {}; -extern "C" int fake_android_fork_exec(int argc, char* argv[], int *status, bool, bool) { +int fake_android_fork_exec(int argc, char* argv[], int *status, bool, bool) { std::string cmd = argv[0]; for (int i = 1; i < argc; i++) { cmd += " "; @@ -72,6 +72,7 @@ TEST_F(BandwidthControllerTest, TestEnableBandwidthControl) { "-F bw_FORWARD", "-F bw_happy_box", "-F bw_penalty_box", + "-F bw_data_saver", "-F bw_costly_shared", "-t raw -F bw_raw_PREROUTING", "-t mangle -F bw_mangle_POSTROUTING", @@ -80,9 +81,10 @@ TEST_F(BandwidthControllerTest, TestEnableBandwidthControl) { "-t raw -A bw_raw_PREROUTING -m owner --socket-exists", "-t mangle -A bw_mangle_POSTROUTING -m owner --socket-exists", "-A bw_costly_shared --jump bw_penalty_box", - "-A bw_costly_shared --jump bw_happy_box", - "-A bw_costly_shared --jump RETURN", - "-A bw_happy_box -m owner --uid-owner 0-9999 --jump RETURN", + "-A bw_penalty_box --jump bw_happy_box", + "-A bw_happy_box --jump bw_data_saver", + "-A bw_data_saver -j RETURN", + "-I bw_happy_box -m owner --uid-owner 0-9999 --jump RETURN", }; expectIptablesCommands(expected); } @@ -90,13 +92,13 @@ TEST_F(BandwidthControllerTest, TestEnableBandwidthControl) { TEST_F(BandwidthControllerTest, TestEnableDataSaver) { mBw.enableDataSaver(true); std::vector<std::string> expected = { - "-R bw_costly_shared 3 --jump REJECT", + "-R bw_data_saver 1 --jump REJECT", }; expectIptablesCommands(expected); mBw.enableDataSaver(false); expected = { - "-R bw_costly_shared 3 --jump RETURN", + "-R bw_data_saver 1 --jump RETURN", }; expectIptablesCommands(expected); } |
