blob: 7af50f9f8b97766d0e6aede35ade0d76c2b31896 [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;
27import static android.system.OsConstants.ENOENT;
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 {
52 private static final String TAG = "BpfNetMaps";
Wayne Ma2fde98c2022-01-17 18:04:05 +080053 private final INetd mNetd;
Ken Chenf5f51332022-01-28 10:08:16 +080054 // Use legacy netd for releases before T.
Patrick Rohr216dfc82022-02-01 16:01:49 +010055 private static final boolean USE_NETD = !SdkLevel.isAtLeastT();
Ken Chenf5f51332022-01-28 10:08:16 +080056 private static boolean sInitialized = false;
Wayne Ma0ea3bdc2022-01-12 01:12:11 +080057
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +000058 private static final String CONFIGURATION_MAP_PATH =
59 "/sys/fs/bpf/netd_shared/map_netd_configuration_map";
60 private static final U32 UID_RULES_CONFIGURATION_KEY = new U32(0);
61 private static BpfMap<U32, U32> sConfigurationMap = null;
62
63 // LINT.IfChange(match_type)
64 private static final long NO_MATCH = 0;
65 private static final long HAPPY_BOX_MATCH = (1 << 0);
66 private static final long PENALTY_BOX_MATCH = (1 << 1);
67 private static final long DOZABLE_MATCH = (1 << 2);
68 private static final long STANDBY_MATCH = (1 << 3);
69 private static final long POWERSAVE_MATCH = (1 << 4);
70 private static final long RESTRICTED_MATCH = (1 << 5);
71 private static final long LOW_POWER_STANDBY_MATCH = (1 << 6);
72 private static final long IIF_MATCH = (1 << 7);
73 private static final long LOCKDOWN_VPN_MATCH = (1 << 8);
74 private static final long OEM_DENY_1_MATCH = (1 << 9);
75 private static final long OEM_DENY_2_MATCH = (1 << 10);
76 private static final long OEM_DENY_3_MATCH = (1 << 11);
77 // LINT.ThenChange(packages/modules/Connectivity/bpf_progs/bpf_shared.h)
78
79 // TODO: Use Java BpfMap instead of JNI code (TrafficController) for map update.
80 // Currently, BpfNetMaps uses TrafficController for map update and TrafficController
81 // (changeUidOwnerRule and toggleUidOwnerMap) also does conversion from "firewall chain" to
82 // "match". Migrating map update from JNI to Java BpfMap will solve this duplication.
83 private static final SparseLongArray FIREWALL_CHAIN_TO_MATCH = new SparseLongArray();
84 static {
85 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_DOZABLE, DOZABLE_MATCH);
86 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_STANDBY, STANDBY_MATCH);
87 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_POWERSAVE, POWERSAVE_MATCH);
88 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_RESTRICTED, RESTRICTED_MATCH);
89 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_LOW_POWER_STANDBY, LOW_POWER_STANDBY_MATCH);
90 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_OEM_DENY_1, OEM_DENY_1_MATCH);
91 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_OEM_DENY_2, OEM_DENY_2_MATCH);
92 FIREWALL_CHAIN_TO_MATCH.put(FIREWALL_CHAIN_OEM_DENY_3, OEM_DENY_3_MATCH);
93 }
94
95 /**
96 * Only tests or BpfNetMaps#ensureInitialized can call this function.
97 */
98 @VisibleForTesting
99 public static void initialize(final Dependencies deps) {
100 sConfigurationMap = deps.getConfigurationMap();
101 }
102
Ken Chenf5f51332022-01-28 10:08:16 +0800103 /**
104 * Initializes the class if it is not already initialized. This method will open maps but not
105 * cause any other effects. This method may be called multiple times on any thread.
106 */
107 private static synchronized void ensureInitialized() {
108 if (sInitialized) return;
109 if (!USE_NETD) {
110 System.loadLibrary("service-connectivity");
Wayne Ma2fde98c2022-01-17 18:04:05 +0800111 native_init();
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000112 initialize(new Dependencies());
Wayne Ma2fde98c2022-01-17 18:04:05 +0800113 }
Ken Chenf5f51332022-01-28 10:08:16 +0800114 sInitialized = true;
Wayne Ma2fde98c2022-01-17 18:04:05 +0800115 }
116
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000117 /**
118 * Dependencies of BpfNetMaps, for injection in tests.
119 */
120 @VisibleForTesting
121 public static class Dependencies {
122 /**
123 * Get configuration BPF map.
124 */
125 public BpfMap<U32, U32> getConfigurationMap() {
126 try {
127 return new BpfMap<>(
128 CONFIGURATION_MAP_PATH, BpfMap.BPF_F_RDWR, U32.class, U32.class);
129 } catch (ErrnoException e) {
130 Log.e(TAG, "Cannot open netd configuration map: " + e);
131 return null;
132 }
133 }
134 }
135
markchien49e944c2022-03-01 15:22:20 +0800136 /** Constructor used after T that doesn't need to use netd anymore. */
137 public BpfNetMaps() {
138 this(null);
139
140 if (USE_NETD) throw new IllegalArgumentException("BpfNetMaps need to use netd before T");
141 }
142
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000143 public BpfNetMaps(final INetd netd) {
Ken Chenf5f51332022-01-28 10:08:16 +0800144 ensureInitialized();
Wayne Ma2fde98c2022-01-17 18:04:05 +0800145 mNetd = netd;
Wayne Ma790c83e2022-01-13 10:35:05 +0800146 }
147
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000148 /**
149 * Get corresponding match from firewall chain.
150 */
151 @VisibleForTesting
152 public long getMatchByFirewallChain(final int chain) {
153 final long match = FIREWALL_CHAIN_TO_MATCH.get(chain, NO_MATCH);
154 if (match == NO_MATCH) {
155 throw new IllegalArgumentException("Invalid firewall chain: " + chain);
156 }
157 return match;
158 }
159
Ken Chenf5f51332022-01-28 10:08:16 +0800160 private void maybeThrow(final int err, final String msg) {
161 if (err != 0) {
162 throw new ServiceSpecificException(err, msg + ": " + Os.strerror(err));
163 }
164 }
165
166 /**
167 * Add naughty app bandwidth rule for specific app
168 *
169 * @param uid uid of target app
Ken Chenf5f51332022-01-28 10:08:16 +0800170 * @throws ServiceSpecificException in case of failure, with an error code indicating the
171 * cause of the failure.
172 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900173 public void addNaughtyApp(final int uid) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800174 final int err = native_addNaughtyApp(uid);
Ken Chenf5f51332022-01-28 10:08:16 +0800175 maybeThrow(err, "Unable to add naughty app");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800176 }
177
Ken Chenf5f51332022-01-28 10:08:16 +0800178 /**
179 * Remove 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 removeNaughtyApp(final int uid) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800186 final int err = native_removeNaughtyApp(uid);
Ken Chenf5f51332022-01-28 10:08:16 +0800187 maybeThrow(err, "Unable to remove naughty app");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800188 }
189
Ken Chenf5f51332022-01-28 10:08:16 +0800190 /**
191 * Add nice 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 addNiceApp(final int uid) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800198 final int err = native_addNiceApp(uid);
Ken Chenf5f51332022-01-28 10:08:16 +0800199 maybeThrow(err, "Unable to add nice app");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800200 }
201
Ken Chenf5f51332022-01-28 10:08:16 +0800202 /**
203 * Remove 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 removeNiceApp(final int uid) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800210 final int err = native_removeNiceApp(uid);
Ken Chenf5f51332022-01-28 10:08:16 +0800211 maybeThrow(err, "Unable to remove nice app");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800212 }
213
Ken Chenf5f51332022-01-28 10:08:16 +0800214 /**
215 * Set target firewall child chain
216 *
217 * @param childChain target chain to enable
218 * @param enable whether to enable or disable child chain.
Ken Chenf5f51332022-01-28 10:08:16 +0800219 * @throws ServiceSpecificException in case of failure, with an error code indicating the
220 * cause of the failure.
221 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900222 public void setChildChain(final int childChain, final boolean enable) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800223 final int err = native_setChildChain(childChain, enable);
Ken Chenf5f51332022-01-28 10:08:16 +0800224 maybeThrow(err, "Unable to set child chain");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800225 }
226
227 /**
Motomu Utsumibe3ff1e2022-06-08 10:05:07 +0000228 * Get the specified firewall chain status.
229 *
230 * @param childChain target chain
231 * @return {@code true} if chain is enabled, {@code false} if chain is not enabled.
232 * @throws UnsupportedOperationException if called on pre-T devices.
233 * @throws IllegalArgumentException if {@code childChain} is a invalid value.
234 * @throws ServiceSpecificException in case of failure, with an error code indicating the
235 * cause of the failure.
236 */
237 public boolean getChainEnabled(final int childChain) {
238 if (USE_NETD) {
239 throw new UnsupportedOperationException("getChainEnabled is not available on pre-T"
240 + " devices");
241 }
242
243 final long match = getMatchByFirewallChain(childChain);
244 try {
245 final U32 config = sConfigurationMap.getValue(UID_RULES_CONFIGURATION_KEY);
246 if (config == null) {
247 throw new ServiceSpecificException(ENOENT,
248 "Unable to get firewall chain status: sConfigurationMap does not have"
249 + " entry for UID_RULES_CONFIGURATION_KEY");
250 }
251 return (config.val & match) != 0;
252 } catch (ErrnoException e) {
253 throw new ServiceSpecificException(e.errno,
254 "Unable to get firewall chain status: " + Os.strerror(e.errno));
255 }
256 }
257
258 /**
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800259 * Replaces the contents of the specified UID-based firewall chain.
260 *
261 * The chain may be an allowlist chain or a denylist chain. A denylist chain contains DROP
262 * rules for the specified UIDs and a RETURN rule at the end. An allowlist chain contains RETURN
Ken Chenf5f51332022-01-28 10:08:16 +0800263 * rules for the system UID range (0 to {@code UID_APP} - 1), RETURN rules for the specified
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800264 * UIDs, and a DROP rule at the end. The chain will be created if it does not exist.
265 *
Ken Chenf5f51332022-01-28 10:08:16 +0800266 * @param chainName The name of the chain to replace.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800267 * @param isAllowlist Whether this is an allowlist or denylist chain.
Ken Chenf5f51332022-01-28 10:08:16 +0800268 * @param uids The list of UIDs to allow/deny.
269 * @return 0 if the chain was successfully replaced, errno otherwise.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800270 */
271 public int replaceUidChain(final String chainName, final boolean isAllowlist,
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900272 final int[] uids) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800273 final int err = native_replaceUidChain(chainName, isAllowlist, uids);
274 if (err != 0) {
275 Log.e(TAG, "replaceUidChain failed: " + Os.strerror(-err));
276 }
277 return -err;
278 }
279
Ken Chenf5f51332022-01-28 10:08:16 +0800280 /**
281 * Set firewall rule for uid
282 *
283 * @param childChain target chain
284 * @param uid uid to allow/deny
285 * @param firewallRule either FIREWALL_RULE_ALLOW or FIREWALL_RULE_DENY
Ken Chenf5f51332022-01-28 10:08:16 +0800286 * @throws ServiceSpecificException in case of failure, with an error code indicating the
287 * cause of the failure.
288 */
Lorenzo Colitti82244fd2022-03-04 23:15:00 +0900289 public void setUidRule(final int childChain, final int uid, final int firewallRule) {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800290 final int err = native_setUidRule(childChain, uid, firewallRule);
Ken Chenf5f51332022-01-28 10:08:16 +0800291 maybeThrow(err, "Unable to set uid rule");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800292 }
293
294 /**
295 * Add ingress interface filtering rules to a list of UIDs
296 *
297 * For a given uid, once a filtering rule is added, the kernel will only allow packets from the
298 * allowed interface and loopback to be sent to the list of UIDs.
299 *
300 * Calling this method on one or more UIDs with an existing filtering rule but a different
301 * interface name will result in the filtering rule being updated to allow the new interface
302 * instead. Otherwise calling this method will not affect existing rules set on other UIDs.
303 *
304 * @param ifName the name of the interface on which the filtering rules will allow packets to
Ken Chenf5f51332022-01-28 10:08:16 +0800305 * be received.
306 * @param uids an array of UIDs which the filtering rules will be set
307 * @throws RemoteException when netd has crashed.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800308 * @throws ServiceSpecificException in case of failure, with an error code indicating the
Ken Chenf5f51332022-01-28 10:08:16 +0800309 * cause of the failure.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800310 */
Ken Chenf5f51332022-01-28 10:08:16 +0800311 public void addUidInterfaceRules(final String ifName, final int[] uids) throws RemoteException {
312 if (USE_NETD) {
313 mNetd.firewallAddUidInterfaceRules(ifName, uids);
Wayne Ma2fde98c2022-01-17 18:04:05 +0800314 return;
315 }
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800316 final int err = native_addUidInterfaceRules(ifName, uids);
Ken Chenf5f51332022-01-28 10:08:16 +0800317 maybeThrow(err, "Unable to add uid interface rules");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800318 }
319
320 /**
321 * Remove ingress interface filtering rules from a list of UIDs
322 *
323 * Clear the ingress interface filtering rules from the list of UIDs which were previously set
324 * by addUidInterfaceRules(). Ignore any uid which does not have filtering rule.
325 *
326 * @param uids an array of UIDs from which the filtering rules will be removed
Ken Chenf5f51332022-01-28 10:08:16 +0800327 * @throws RemoteException when netd has crashed.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800328 * @throws ServiceSpecificException in case of failure, with an error code indicating the
Ken Chenf5f51332022-01-28 10:08:16 +0800329 * cause of the failure.
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800330 */
Ken Chenf5f51332022-01-28 10:08:16 +0800331 public void removeUidInterfaceRules(final int[] uids) throws RemoteException {
332 if (USE_NETD) {
333 mNetd.firewallRemoveUidInterfaceRules(uids);
Wayne Ma2fde98c2022-01-17 18:04:05 +0800334 return;
335 }
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800336 final int err = native_removeUidInterfaceRules(uids);
Ken Chenf5f51332022-01-28 10:08:16 +0800337 maybeThrow(err, "Unable to remove uid interface rules");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800338 }
339
Ken Chenf5f51332022-01-28 10:08:16 +0800340 /**
Motomu Utsumi8b42e6d2022-05-19 06:23:40 +0000341 * Update lockdown rule for uid
342 *
343 * @param uid target uid to add/remove the rule
344 * @param add {@code true} to add the rule, {@code false} to remove the rule.
345 * @throws ServiceSpecificException in case of failure, with an error code indicating the
346 * cause of the failure.
347 */
348 public void updateUidLockdownRule(final int uid, final boolean add) {
349 final int err = native_updateUidLockdownRule(uid, add);
350 maybeThrow(err, "Unable to update lockdown rule");
351 }
352
353 /**
Ken Chenf5f51332022-01-28 10:08:16 +0800354 * Request netd to change the current active network stats map.
355 *
Ken Chenf5f51332022-01-28 10:08:16 +0800356 * @throws ServiceSpecificException in case of failure, with an error code indicating the
357 * cause of the failure.
358 */
markchien49e944c2022-03-01 15:22:20 +0800359 public void swapActiveStatsMap() {
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800360 final int err = native_swapActiveStatsMap();
Ken Chenf5f51332022-01-28 10:08:16 +0800361 maybeThrow(err, "Unable to swap active stats map");
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800362 }
363
Ken Chenf5f51332022-01-28 10:08:16 +0800364 /**
365 * Assigns android.permission.INTERNET and/or android.permission.UPDATE_DEVICE_STATS to the uids
366 * specified. Or remove all permissions from the uids.
367 *
368 * @param permissions The permission to grant, it could be either PERMISSION_INTERNET and/or
369 * PERMISSION_UPDATE_DEVICE_STATS. If the permission is NO_PERMISSIONS, then
370 * revoke all permissions for the uids.
371 * @param uids uid of users to grant permission
372 * @throws RemoteException when netd has crashed.
373 */
374 public void setNetPermForUids(final int permissions, final int[] uids) throws RemoteException {
375 if (USE_NETD) {
376 mNetd.trafficSetNetPermForUids(permissions, uids);
Wayne Ma2fde98c2022-01-17 18:04:05 +0800377 return;
378 }
379 native_setPermissionForUids(permissions, uids);
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800380 }
381
Ken Chene6d511f2022-01-25 11:10:42 +0800382 /**
383 * Dump BPF maps
384 *
385 * @param fd file descriptor to output
386 * @throws IOException when file descriptor is invalid.
387 * @throws ServiceSpecificException when the method is called on an unsupported device.
388 */
389 public void dump(final FileDescriptor fd, boolean verbose)
390 throws IOException, ServiceSpecificException {
391 if (USE_NETD) {
392 throw new ServiceSpecificException(
393 EOPNOTSUPP, "dumpsys connectivity trafficcontroller dump not available on pre-T"
394 + " devices, use dumpsys netd trafficcontroller instead.");
395 }
396 native_dump(fd, verbose);
397 }
398
Wayne Ma790c83e2022-01-13 10:35:05 +0800399 private static native void native_init();
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800400 private native int native_addNaughtyApp(int uid);
401 private native int native_removeNaughtyApp(int uid);
402 private native int native_addNiceApp(int uid);
403 private native int native_removeNiceApp(int uid);
404 private native int native_setChildChain(int childChain, boolean enable);
405 private native int native_replaceUidChain(String name, boolean isAllowlist, int[] uids);
406 private native int native_setUidRule(int childChain, int uid, int firewallRule);
407 private native int native_addUidInterfaceRules(String ifName, int[] uids);
408 private native int native_removeUidInterfaceRules(int[] uids);
Motomu Utsumi8b42e6d2022-05-19 06:23:40 +0000409 private native int native_updateUidLockdownRule(int uid, boolean add);
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800410 private native int native_swapActiveStatsMap();
Wayne Ma2fde98c2022-01-17 18:04:05 +0800411 private native void native_setPermissionForUids(int permissions, int[] uids);
Ken Chene6d511f2022-01-25 11:10:42 +0800412 private native void native_dump(FileDescriptor fd, boolean verbose);
Wayne Ma0ea3bdc2022-01-12 01:12:11 +0800413}