blob: 5650e31106ef1743731f36daedf19697def8753c [file] [log] [blame]
Wayne Ma0ea3bdc2022-01-12 01:12:11 +08001/*
2 * Copyright (C) 2022 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
17package com.android.server;
18
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +000019import static android.net.ConnectivityManager.FIREWALL_CHAIN_DOZABLE;
20import static android.net.ConnectivityManager.FIREWALL_CHAIN_LOW_POWER_STANDBY;
21import static android.net.ConnectivityManager.FIREWALL_CHAIN_OEM_DENY_1;
22import static android.net.ConnectivityManager.FIREWALL_CHAIN_OEM_DENY_2;
23import static android.net.ConnectivityManager.FIREWALL_CHAIN_OEM_DENY_3;
24import static android.net.ConnectivityManager.FIREWALL_CHAIN_POWERSAVE;
25import static android.net.ConnectivityManager.FIREWALL_CHAIN_RESTRICTED;
26import static android.net.ConnectivityManager.FIREWALL_CHAIN_STANDBY;
Motomu Utsumi18b287d2022-06-19 10:45:30 +000027import static android.system.OsConstants.EINVAL;
Ken Chene6d511f2022-01-25 11:10:42 +080028import static android.system.OsConstants.EOPNOTSUPP;
29
Wayne Ma2fde98c2022-01-17 18:04:05 +080030import android.net.INetd;
31import android.os.RemoteException;
Wayne Ma0ea3bdc2022-01-12 01:12:11 +080032import android.os.ServiceSpecificException;
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +000033import android.system.ErrnoException;
Wayne Ma0ea3bdc2022-01-12 01:12:11 +080034import android.system.Os;
35import android.util.Log;
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +000036import android.util.SparseLongArray;
Wayne Ma0ea3bdc2022-01-12 01:12:11 +080037
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +000038import com.android.internal.annotations.VisibleForTesting;
Ken Chenf5f51332022-01-28 10:08:16 +080039import com.android.modules.utils.build.SdkLevel;
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +000040import com.android.net.module.util.BpfMap;
41import com.android.net.module.util.Struct.U32;
Ken Chenf5f51332022-01-28 10:08:16 +080042
Ken Chene6d511f2022-01-25 11:10:42 +080043import java.io.FileDescriptor;
44import java.io.IOException;
45
Wayne Ma0ea3bdc2022-01-12 01:12:11 +080046/**
47 * BpfNetMaps is responsible for providing traffic controller relevant functionality.
48 *
49 * {@hide}
50 */
51public class BpfNetMaps {
Motomu Utsumi305975f2022-06-27 09:24:32 +000052 private static final boolean PRE_T = !SdkLevel.isAtLeastT();
53 static {
54 if (!PRE_T) {
55 System.loadLibrary("service-connectivity");
56 }
57 }
58
Wayne Ma0ea3bdc2022-01-12 01:12:11 +080059 private static final String TAG = "BpfNetMaps";
Wayne Ma2fde98c2022-01-17 18:04:05 +080060 private final INetd mNetd;
Ken Chenf5f51332022-01-28 10:08:16 +080061 // Use legacy netd for releases before T.
Ken Chenf5f51332022-01-28 10:08:16 +080062 private static boolean sInitialized = false;
Wayne Ma0ea3bdc2022-01-12 01:12:11 +080063
Motomu Utsumi18b287d2022-06-19 10:45:30 +000064 // Lock for sConfigurationMap entry for UID_RULES_CONFIGURATION_KEY.
65 // This entry is not accessed by others.
66 // BpfNetMaps acquires this lock while sequence of read, modify, and write.
67 private static final Object sUidRulesConfigBpfMapLock = new Object();
68
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +000069 private static final String CONFIGURATION_MAP_PATH =
70 "/sys/fs/bpf/netd_shared/map_netd_configuration_map";
71 private static final U32 UID_RULES_CONFIGURATION_KEY = new U32(0);
72 private static BpfMap<U32, U32> sConfigurationMap = null;
73
74 // LINT.IfChange(match_type)
75 private static final long NO_MATCH = 0;
76 private static final long HAPPY_BOX_MATCH = (1 << 0);
77 private static final long PENALTY_BOX_MATCH = (1 << 1);
78 private static final long DOZABLE_MATCH = (1 << 2);
79 private static final long STANDBY_MATCH = (1 << 3);
80 private static final long POWERSAVE_MATCH = (1 << 4);
81 private static final long RESTRICTED_MATCH = (1 << 5);
82 private static final long LOW_POWER_STANDBY_MATCH = (1 << 6);
83 private static final long IIF_MATCH = (1 << 7);
84 private static final long LOCKDOWN_VPN_MATCH = (1 << 8);
85 private static final long OEM_DENY_1_MATCH = (1 << 9);
86 private static final long OEM_DENY_2_MATCH = (1 << 10);
87 private static final long OEM_DENY_3_MATCH = (1 << 11);
88 // LINT.ThenChange(packages/modules/Connectivity/bpf_progs/bpf_shared.h)
89
90 // TODO: Use Java BpfMap instead of JNI code (TrafficController) for map update.
91 // Currently, BpfNetMaps uses TrafficController for map update and TrafficController
92 // (changeUidOwnerRule and toggleUidOwnerMap) also does conversion from "firewall chain" to
93 // "match". Migrating map update from JNI to Java BpfMap will solve this duplication.
94 private static final SparseLongArray FIREWALL_CHAIN_TO_MATCH = new SparseLongArray();
95 static {
96 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_DOZABLE, DOZABLE_MATCH);
97 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_STANDBY, STANDBY_MATCH);
98 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_POWERSAVE, POWERSAVE_MATCH);
99 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_RESTRICTED, RESTRICTED_MATCH);
100 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_LOW_POWER_STANDBY, LOW_POWER_STANDBY_MATCH);
101 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_OEM_DENY_1, OEM_DENY_1_MATCH);
102 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_OEM_DENY_2, OEM_DENY_2_MATCH);
103 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_OEM_DENY_3, OEM_DENY_3_MATCH);
104 }
105
106 /**
Motomu Utsumi305975f2022-06-27 09:24:32 +0000107 * Set configurationMap for test.
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000108 */
109 @VisibleForTesting
Motomu Utsumi305975f2022-06-27 09:24:32 +0000110 public static void setConfigurationMapForTest(BpfMap<U32, U32> configurationMap) {
111 sConfigurationMap = configurationMap;
112 }
113
114 private static BpfMap<U32, U32> getConfigurationMap() {
115 try {
116 return new BpfMap<>(
117 CONFIGURATION_MAP_PATH, BpfMap.BPF_F_RDWR, U32.class, U32.class);
118 } catch (ErrnoException e) {
119 throw new IllegalStateException("Cannot open netd configuration map", e);
120 }
121 }
122
123 private static void setBpfMaps() {
124 if (sConfigurationMap == null) {
125 sConfigurationMap = getConfigurationMap();
126 }
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000127 }
128
Ken Chenf5f51332022-01-28 10:08:16 +0800129 /**
130 * Initializes the class if it is not already initialized. This method will open maps but not
131 * cause any other effects. This method may be called multiple times on any thread.
132 */
133 private static synchronized void ensureInitialized() {
134 if (sInitialized) return;
Motomu Utsumi305975f2022-06-27 09:24:32 +0000135 setBpfMaps();
136 native_init();
Ken Chenf5f51332022-01-28 10:08:16 +0800137 sInitialized = true;
Wayne Ma2fde98c2022-01-17 18:04:05 +0800138 }
139
markchien49e944c2022-03-01 15:22:20 +0800140 /** Constructor used after T that doesn't need to use netd anymore. */
141 public BpfNetMaps() {
142 this(null);
143
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000144 if (PRE_T) throw new IllegalArgumentException("BpfNetMaps need to use netd before T");
markchien49e944c2022-03-01 15:22:20 +0800145 }
146
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000147 public BpfNetMaps(final INetd netd) {
Motomu Utsumi305975f2022-06-27 09:24:32 +0000148 if (!PRE_T) {
149 ensureInitialized();
150 }
Wayne Ma2fde98c2022-01-17 18:04:05 +0800151 mNetd = netd;
Wayne Ma790c83e2022-01-13 10:35:05 +0800152 }
153
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000154 /**
155 * Get corresponding match from firewall chain.
156 */
157 @VisibleForTesting
158 public long getMatchByFirewallChain(final int chain) {
159 final long match = FIREWALL_CHAIN_TO_MATCH.get(chain, NO_MATCH);
160 if (match == NO_MATCH) {
Motomu Utsumi18b287d2022-06-19 10:45:30 +0000161 throw new ServiceSpecificException(EINVAL, "Invalid firewall chain: " + chain);
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000162 }
163 return match;
164 }
165
Ken Chenf5f51332022-01-28 10:08:16 +0800166 private void maybeThrow(final int err, final String msg) {
167 if (err != 0) {
168 throw new ServiceSpecificException(err, msg + ": " + Os.strerror(err));
169 }
170 }
171
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000172 private void throwIfPreT(final String msg) {
173 if (PRE_T) {
Motomu Utsumi18b287d2022-06-19 10:45:30 +0000174 throw new UnsupportedOperationException(msg);
175 }
176 }
177
Ken Chenf5f51332022-01-28 10:08:16 +0800178 /**
179 * Add naughty app bandwidth rule for specific app
180 *
181 * @param uid uid of target app
Ken Chenf5f51332022-01-28 10:08:16 +0800182 * @throws ServiceSpecificException in case of failure, with an error code indicating the
183 * cause of the failure.
184 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900185 public void addNaughtyApp(final int uid) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800186 final int err = native_addNaughtyApp(uid);
Ken Chenf5f51332022-01-28 10:08:16 +0800187 maybeThrow(err, "Unable to add naughty app");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800188 }
189
Ken Chenf5f51332022-01-28 10:08:16 +0800190 /**
191 * Remove naughty app bandwidth rule for specific app
192 *
193 * @param uid uid of target app
Ken Chenf5f51332022-01-28 10:08:16 +0800194 * @throws ServiceSpecificException in case of failure, with an error code indicating the
195 * cause of the failure.
196 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900197 public void removeNaughtyApp(final int uid) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800198 final int err = native_removeNaughtyApp(uid);
Ken Chenf5f51332022-01-28 10:08:16 +0800199 maybeThrow(err, "Unable to remove naughty app");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800200 }
201
Ken Chenf5f51332022-01-28 10:08:16 +0800202 /**
203 * Add nice app bandwidth rule for specific app
204 *
205 * @param uid uid of target app
Ken Chenf5f51332022-01-28 10:08:16 +0800206 * @throws ServiceSpecificException in case of failure, with an error code indicating the
207 * cause of the failure.
208 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900209 public void addNiceApp(final int uid) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800210 final int err = native_addNiceApp(uid);
Ken Chenf5f51332022-01-28 10:08:16 +0800211 maybeThrow(err, "Unable to add nice app");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800212 }
213
Ken Chenf5f51332022-01-28 10:08:16 +0800214 /**
215 * Remove nice app bandwidth rule for specific app
216 *
217 * @param uid uid of target app
Ken Chenf5f51332022-01-28 10:08:16 +0800218 * @throws ServiceSpecificException in case of failure, with an error code indicating the
219 * cause of the failure.
220 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900221 public void removeNiceApp(final int uid) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800222 final int err = native_removeNiceApp(uid);
Ken Chenf5f51332022-01-28 10:08:16 +0800223 maybeThrow(err, "Unable to remove nice app");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800224 }
225
Ken Chenf5f51332022-01-28 10:08:16 +0800226 /**
227 * Set target firewall child chain
228 *
229 * @param childChain target chain to enable
230 * @param enable whether to enable or disable child chain.
Motomu Utsumi18b287d2022-06-19 10:45:30 +0000231 * @throws UnsupportedOperationException if called on pre-T devices.
Ken Chenf5f51332022-01-28 10:08:16 +0800232 * @throws ServiceSpecificException in case of failure, with an error code indicating the
233 * cause of the failure.
234 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900235 public void setChildChain(final int childChain, final boolean enable) {
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000236 throwIfPreT("setChildChain is not available on pre-T devices");
Motomu Utsumi18b287d2022-06-19 10:45:30 +0000237
238 final long match = getMatchByFirewallChain(childChain);
239 try {
240 synchronized (sUidRulesConfigBpfMapLock) {
241 final U32 config = sConfigurationMap.getValue(UID_RULES_CONFIGURATION_KEY);
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000242 final long newConfig = enable ? (config.val | match) : (config.val & ~match);
Motomu Utsumi18b287d2022-06-19 10:45:30 +0000243 sConfigurationMap.updateEntry(UID_RULES_CONFIGURATION_KEY, new U32(newConfig));
244 }
245 } catch (ErrnoException e) {
246 throw new ServiceSpecificException(e.errno,
247 "Unable to set child chain: " + Os.strerror(e.errno));
248 }
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800249 }
250
251 /**
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000252 * Get the specified firewall chain's status.
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000253 *
254 * @param childChain target chain
255 * @return {@code true} if chain is enabled, {@code false} if chain is not enabled.
256 * @throws UnsupportedOperationException if called on pre-T devices.
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000257 * @throws ServiceSpecificException in case of failure, with an error code indicating the
258 * cause of the failure.
259 */
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000260 public boolean isChainEnabled(final int childChain) {
261 throwIfPreT("isChainEnabled is not available on pre-T devices");
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000262
263 final long match = getMatchByFirewallChain(childChain);
264 try {
265 final U32 config = sConfigurationMap.getValue(UID_RULES_CONFIGURATION_KEY);
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000266 return (config.val & match) != 0;
267 } catch (ErrnoException e) {
268 throw new ServiceSpecificException(e.errno,
269 "Unable to get firewall chain status: " + Os.strerror(e.errno));
270 }
271 }
272
273 /**
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800274 * Replaces the contents of the specified UID-based firewall chain.
275 *
276 * The chain may be an allowlist chain or a denylist chain. A denylist chain contains DROP
277 * rules for the specified UIDs and a RETURN rule at the end. An allowlist chain contains RETURN
Ken Chenf5f51332022-01-28 10:08:16 +0800278 * rules for the system UID range (0 to {@code UID_APP} - 1), RETURN rules for the specified
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800279 * UIDs, and a DROP rule at the end. The chain will be created if it does not exist.
280 *
Ken Chenf5f51332022-01-28 10:08:16 +0800281 * @param chainName The name of the chain to replace.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800282 * @param isAllowlist Whether this is an allowlist or denylist chain.
Ken Chenf5f51332022-01-28 10:08:16 +0800283 * @param uids The list of UIDs to allow/deny.
284 * @return 0 if the chain was successfully replaced, errno otherwise.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800285 */
286 public int replaceUidChain(final String chainName, final boolean isAllowlist,
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900287 final int[] uids) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800288 final int err = native_replaceUidChain(chainName, isAllowlist, uids);
289 if (err != 0) {
290 Log.e(TAG, "replaceUidChain failed: " + Os.strerror(-err));
291 }
292 return -err;
293 }
294
Ken Chenf5f51332022-01-28 10:08:16 +0800295 /**
296 * Set firewall rule for uid
297 *
298 * @param childChain target chain
299 * @param uid uid to allow/deny
300 * @param firewallRule either FIREWALL_RULE_ALLOW or FIREWALL_RULE_DENY
Ken Chenf5f51332022-01-28 10:08:16 +0800301 * @throws ServiceSpecificException in case of failure, with an error code indicating the
302 * cause of the failure.
303 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900304 public void setUidRule(final int childChain, final int uid, final int firewallRule) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800305 final int err = native_setUidRule(childChain, uid, firewallRule);
Ken Chenf5f51332022-01-28 10:08:16 +0800306 maybeThrow(err, "Unable to set uid rule");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800307 }
308
309 /**
310 * Add ingress interface filtering rules to a list of UIDs
311 *
312 * For a given uid, once a filtering rule is added, the kernel will only allow packets from the
313 * allowed interface and loopback to be sent to the list of UIDs.
314 *
315 * Calling this method on one or more UIDs with an existing filtering rule but a different
316 * interface name will result in the filtering rule being updated to allow the new interface
317 * instead. Otherwise calling this method will not affect existing rules set on other UIDs.
318 *
319 * @param ifName the name of the interface on which the filtering rules will allow packets to
Ken Chenf5f51332022-01-28 10:08:16 +0800320 * be received.
321 * @param uids an array of UIDs which the filtering rules will be set
322 * @throws RemoteException when netd has crashed.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800323 * @throws ServiceSpecificException in case of failure, with an error code indicating the
Ken Chenf5f51332022-01-28 10:08:16 +0800324 * cause of the failure.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800325 */
Ken Chenf5f51332022-01-28 10:08:16 +0800326 public void addUidInterfaceRules(final String ifName, final int[] uids) throws RemoteException {
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000327 if (PRE_T) {
Ken Chenf5f51332022-01-28 10:08:16 +0800328 mNetd.firewallAddUidInterfaceRules(ifName, uids);
Wayne Ma2fde98c2022-01-17 18:04:05 +0800329 return;
330 }
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800331 final int err = native_addUidInterfaceRules(ifName, uids);
Ken Chenf5f51332022-01-28 10:08:16 +0800332 maybeThrow(err, "Unable to add uid interface rules");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800333 }
334
335 /**
336 * Remove ingress interface filtering rules from a list of UIDs
337 *
338 * Clear the ingress interface filtering rules from the list of UIDs which were previously set
339 * by addUidInterfaceRules(). Ignore any uid which does not have filtering rule.
340 *
341 * @param uids an array of UIDs from which the filtering rules will be removed
Ken Chenf5f51332022-01-28 10:08:16 +0800342 * @throws RemoteException when netd has crashed.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800343 * @throws ServiceSpecificException in case of failure, with an error code indicating the
Ken Chenf5f51332022-01-28 10:08:16 +0800344 * cause of the failure.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800345 */
Ken Chenf5f51332022-01-28 10:08:16 +0800346 public void removeUidInterfaceRules(final int[] uids) throws RemoteException {
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000347 if (PRE_T) {
Ken Chenf5f51332022-01-28 10:08:16 +0800348 mNetd.firewallRemoveUidInterfaceRules(uids);
Wayne Ma2fde98c2022-01-17 18:04:05 +0800349 return;
350 }
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800351 final int err = native_removeUidInterfaceRules(uids);
Ken Chenf5f51332022-01-28 10:08:16 +0800352 maybeThrow(err, "Unable to remove uid interface rules");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800353 }
354
Ken Chenf5f51332022-01-28 10:08:16 +0800355 /**
Motomu Utsumi8b42e6d2022-05-19 06:23:40 +0000356 * Update lockdown rule for uid
357 *
358 * @param uid target uid to add/remove the rule
359 * @param add {@code true} to add the rule, {@code false} to remove the rule.
360 * @throws ServiceSpecificException in case of failure, with an error code indicating the
361 * cause of the failure.
362 */
363 public void updateUidLockdownRule(final int uid, final boolean add) {
364 final int err = native_updateUidLockdownRule(uid, add);
365 maybeThrow(err, "Unable to update lockdown rule");
366 }
367
368 /**
Ken Chenf5f51332022-01-28 10:08:16 +0800369 * Request netd to change the current active network stats map.
370 *
Ken Chenf5f51332022-01-28 10:08:16 +0800371 * @throws ServiceSpecificException in case of failure, with an error code indicating the
372 * cause of the failure.
373 */
markchien49e944c2022-03-01 15:22:20 +0800374 public void swapActiveStatsMap() {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800375 final int err = native_swapActiveStatsMap();
Ken Chenf5f51332022-01-28 10:08:16 +0800376 maybeThrow(err, "Unable to swap active stats map");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800377 }
378
Ken Chenf5f51332022-01-28 10:08:16 +0800379 /**
380 * Assigns android.permission.INTERNET and/or android.permission.UPDATE_DEVICE_STATS to the uids
381 * specified. Or remove all permissions from the uids.
382 *
383 * @param permissions The permission to grant, it could be either PERMISSION_INTERNET and/or
384 * PERMISSION_UPDATE_DEVICE_STATS. If the permission is NO_PERMISSIONS, then
385 * revoke all permissions for the uids.
386 * @param uids uid of users to grant permission
387 * @throws RemoteException when netd has crashed.
388 */
389 public void setNetPermForUids(final int permissions, final int[] uids) throws RemoteException {
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000390 if (PRE_T) {
Ken Chenf5f51332022-01-28 10:08:16 +0800391 mNetd.trafficSetNetPermForUids(permissions, uids);
Wayne Ma2fde98c2022-01-17 18:04:05 +0800392 return;
393 }
394 native_setPermissionForUids(permissions, uids);
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800395 }
396
Ken Chene6d511f2022-01-25 11:10:42 +0800397 /**
398 * Dump BPF maps
399 *
400 * @param fd file descriptor to output
401 * @throws IOException when file descriptor is invalid.
402 * @throws ServiceSpecificException when the method is called on an unsupported device.
403 */
404 public void dump(final FileDescriptor fd, boolean verbose)
405 throws IOException, ServiceSpecificException {
Motomu Utsumi25cf86f2022-06-27 08:50:19 +0000406 if (PRE_T) {
Ken Chene6d511f2022-01-25 11:10:42 +0800407 throw new ServiceSpecificException(
408 EOPNOTSUPP, "dumpsys connectivity trafficcontroller dump not available on pre-T"
409 + " devices, use dumpsys netd trafficcontroller instead.");
410 }
411 native_dump(fd, verbose);
412 }
413
Wayne Ma790c83e2022-01-13 10:35:05 +0800414 private static native void native_init();
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800415 private native int native_addNaughtyApp(int uid);
416 private native int native_removeNaughtyApp(int uid);
417 private native int native_addNiceApp(int uid);
418 private native int native_removeNiceApp(int uid);
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800419 private native int native_replaceUidChain(String name, boolean isAllowlist, int[] uids);
420 private native int native_setUidRule(int childChain, int uid, int firewallRule);
421 private native int native_addUidInterfaceRules(String ifName, int[] uids);
422 private native int native_removeUidInterfaceRules(int[] uids);
Motomu Utsumi8b42e6d2022-05-19 06:23:40 +0000423 private native int native_updateUidLockdownRule(int uid, boolean add);
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800424 private native int native_swapActiveStatsMap();
Wayne Ma2fde98c2022-01-17 18:04:05 +0800425 private native void native_setPermissionForUids(int permissions, int[] uids);
Ken Chene6d511f2022-01-25 11:10:42 +0800426 private native void native_dump(FileDescriptor fd, boolean verbose);
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800427}