• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 package com.android.server.net;
17 
18 import static android.net.ConnectivityManager.BLOCKED_REASON_NONE;
19 import static android.net.ConnectivityManager.FIREWALL_CHAIN_DOZABLE;
20 import static android.net.ConnectivityManager.FIREWALL_CHAIN_LOW_POWER_STANDBY;
21 import static android.net.ConnectivityManager.FIREWALL_CHAIN_POWERSAVE;
22 import static android.net.ConnectivityManager.FIREWALL_CHAIN_RESTRICTED;
23 import static android.net.ConnectivityManager.FIREWALL_CHAIN_STANDBY;
24 import static android.net.INetd.FIREWALL_RULE_ALLOW;
25 import static android.net.INetd.FIREWALL_RULE_DENY;
26 import static android.net.NetworkPolicyManager.ALLOWED_REASON_NONE;
27 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE;
28 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_LOW_POWER_STANDBY;
29 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_POWERSAVE;
30 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_RESTRICTED;
31 import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY;
32 import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT;
33 import static android.os.PowerExemptionManager.reasonCodeToString;
34 import static android.os.Process.INVALID_UID;
35 
36 import android.annotation.Nullable;
37 import android.app.ActivityManager;
38 import android.app.ActivityManager.ProcessCapability;
39 import android.net.NetworkPolicyManager;
40 import android.os.UserHandle;
41 import android.util.Log;
42 import android.util.Slog;
43 
44 import com.android.internal.util.IndentingPrintWriter;
45 import com.android.internal.util.RingBuffer;
46 import com.android.server.am.ProcessList;
47 import com.android.server.net.NetworkPolicyManagerService.UidBlockedState;
48 
49 import java.text.SimpleDateFormat;
50 import java.util.Arrays;
51 import java.util.Date;
52 import java.util.Set;
53 
54 public class NetworkPolicyLogger {
55     static final String TAG = "NetworkPolicy";
56 
57     static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
58     static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE);
59 
60     private static final int MAX_LOG_SIZE =
61             ActivityManager.isLowRamDeviceStatic() ? 100 : 400;
62     private static final int MAX_NETWORK_BLOCKED_LOG_SIZE =
63             ActivityManager.isLowRamDeviceStatic() ? 100 : 400;
64 
65     private static final int EVENT_TYPE_GENERIC = 0;
66     private static final int EVENT_NETWORK_BLOCKED = 1;
67     private static final int EVENT_UID_STATE_CHANGED = 2;
68     private static final int EVENT_POLICIES_CHANGED = 3;
69     private static final int EVENT_METEREDNESS_CHANGED = 4;
70     private static final int EVENT_USER_STATE_REMOVED = 5;
71     private static final int EVENT_RESTRICT_BG_CHANGED = 6;
72     private static final int EVENT_DEVICE_IDLE_MODE_ENABLED = 7;
73     private static final int EVENT_APP_IDLE_STATE_CHANGED = 8;
74     private static final int EVENT_PAROLE_STATE_CHANGED = 9;
75     private static final int EVENT_TEMP_POWER_SAVE_WL_CHANGED = 10;
76     private static final int EVENT_UID_FIREWALL_RULE_CHANGED = 11;
77     private static final int EVENT_FIREWALL_CHAIN_ENABLED = 12;
78     private static final int EVENT_UPDATE_METERED_RESTRICTED_PKGS = 13;
79     private static final int EVENT_APP_IDLE_WL_CHANGED = 14;
80     private static final int EVENT_METERED_ALLOWLIST_CHANGED = 15;
81     private static final int EVENT_METERED_DENYLIST_CHANGED = 16;
82 
83     private final LogBuffer mNetworkBlockedBuffer = new LogBuffer(MAX_NETWORK_BLOCKED_LOG_SIZE);
84     private final LogBuffer mUidStateChangeBuffer = new LogBuffer(MAX_LOG_SIZE);
85     private final LogBuffer mEventsBuffer = new LogBuffer(MAX_LOG_SIZE);
86 
87     private int mDebugUid = INVALID_UID;
88 
89     private final Object mLock = new Object();
90 
networkBlocked(int uid, @Nullable UidBlockedState uidBlockedState)91     void networkBlocked(int uid, @Nullable UidBlockedState uidBlockedState) {
92         synchronized (mLock) {
93             if (LOGD || uid == mDebugUid) {
94                 Slog.d(TAG, "Blocked state of " + uid + ": " + uidBlockedState.toString());
95             }
96             if (uidBlockedState == null) {
97                 mNetworkBlockedBuffer.networkBlocked(uid, BLOCKED_REASON_NONE, ALLOWED_REASON_NONE,
98                         BLOCKED_REASON_NONE);
99             } else {
100                 mNetworkBlockedBuffer.networkBlocked(uid, uidBlockedState.blockedReasons,
101                         uidBlockedState.allowedReasons, uidBlockedState.effectiveBlockedReasons);
102             }
103         }
104     }
105 
uidStateChanged(int uid, int procState, long procStateSeq, @ProcessCapability int capability)106     void uidStateChanged(int uid, int procState, long procStateSeq,
107             @ProcessCapability int capability) {
108         synchronized (mLock) {
109             if (LOGV || uid == mDebugUid) {
110                 Slog.v(TAG, uid + " state changed to "
111                         + ProcessList.makeProcStateString(procState) + ",seq=" + procStateSeq
112                         + ",cap=" + ActivityManager.getCapabilitiesSummary(capability));
113             }
114             mUidStateChangeBuffer.uidStateChanged(uid, procState, procStateSeq, capability);
115         }
116     }
117 
event(String msg)118     void event(String msg) {
119         synchronized (mLock) {
120             if (LOGV) Slog.v(TAG, msg);
121             mEventsBuffer.event(msg);
122         }
123     }
124 
uidPolicyChanged(int uid, int oldPolicy, int newPolicy)125     void uidPolicyChanged(int uid, int oldPolicy, int newPolicy) {
126         synchronized (mLock) {
127             if (LOGV || uid == mDebugUid) {
128                 Slog.v(TAG,
129                         getPolicyChangedLog(uid, oldPolicy, newPolicy));
130             }
131             mEventsBuffer.uidPolicyChanged(uid, oldPolicy, newPolicy);
132         }
133     }
134 
meterednessChanged(int netId, boolean newMetered)135     void meterednessChanged(int netId, boolean newMetered) {
136         synchronized (mLock) {
137             if (LOGD || mDebugUid != INVALID_UID) {
138                 Slog.d(TAG,
139                         getMeterednessChangedLog(netId, newMetered));
140             }
141             mEventsBuffer.meterednessChanged(netId, newMetered);
142         }
143     }
144 
removingUserState(int userId)145     void removingUserState(int userId) {
146         synchronized (mLock) {
147             if (LOGD || mDebugUid != INVALID_UID) {
148                 Slog.d(TAG, getUserRemovedLog(userId));
149             }
150             mEventsBuffer.userRemoved(userId);
151         }
152     }
153 
restrictBackgroundChanged(boolean oldValue, boolean newValue)154     void restrictBackgroundChanged(boolean oldValue, boolean newValue) {
155         synchronized (mLock) {
156             if (LOGD || mDebugUid != INVALID_UID) {
157                 Slog.d(TAG,
158                         getRestrictBackgroundChangedLog(oldValue, newValue));
159             }
160             mEventsBuffer.restrictBackgroundChanged(oldValue, newValue);
161         }
162     }
163 
deviceIdleModeEnabled(boolean enabled)164     void deviceIdleModeEnabled(boolean enabled) {
165         synchronized (mLock) {
166             if (LOGD || mDebugUid != INVALID_UID) {
167                 Slog.d(TAG, getDeviceIdleModeEnabled(enabled));
168             }
169             mEventsBuffer.deviceIdleModeEnabled(enabled);
170         }
171     }
172 
appIdleStateChanged(int uid, boolean idle)173     void appIdleStateChanged(int uid, boolean idle) {
174         synchronized (mLock) {
175             if (LOGD || uid == mDebugUid) {
176                 Slog.d(TAG, getAppIdleChangedLog(uid, idle));
177             }
178             mEventsBuffer.appIdleStateChanged(uid, idle);
179         }
180     }
181 
appIdleWlChanged(int uid, boolean isWhitelisted)182     void appIdleWlChanged(int uid, boolean isWhitelisted) {
183         synchronized (mLock) {
184             if (LOGD || uid == mDebugUid) {
185                 Slog.d(TAG, getAppIdleWlChangedLog(uid, isWhitelisted));
186             }
187             mEventsBuffer.appIdleWlChanged(uid, isWhitelisted);
188         }
189     }
190 
paroleStateChanged(boolean paroleOn)191     void paroleStateChanged(boolean paroleOn) {
192         synchronized (mLock) {
193             if (LOGD || mDebugUid != INVALID_UID) {
194                 Slog.d(TAG, getParoleStateChanged(paroleOn));
195             }
196             mEventsBuffer.paroleStateChanged(paroleOn);
197         }
198     }
199 
tempPowerSaveWlChanged(int appId, boolean added, int reasonCode, String reason)200     void tempPowerSaveWlChanged(int appId, boolean added, int reasonCode, String reason) {
201         synchronized (mLock) {
202             if (LOGV || appId == UserHandle.getAppId(mDebugUid)) {
203                 Slog.v(TAG, getTempPowerSaveWlChangedLog(appId, added, reasonCode, reason));
204             }
205             mEventsBuffer.tempPowerSaveWlChanged(appId, added, reasonCode, reason);
206         }
207     }
208 
uidFirewallRuleChanged(int chain, int uid, int rule)209     void uidFirewallRuleChanged(int chain, int uid, int rule) {
210         synchronized (mLock) {
211             if (LOGV || uid == mDebugUid) {
212                 Slog.v(TAG,
213                         getUidFirewallRuleChangedLog(chain, uid, rule));
214             }
215             mEventsBuffer.uidFirewallRuleChanged(chain, uid, rule);
216         }
217     }
218 
firewallChainEnabled(int chain, boolean enabled)219     void firewallChainEnabled(int chain, boolean enabled) {
220         synchronized (mLock) {
221             if (LOGD || mDebugUid != INVALID_UID) {
222                 Slog.d(TAG,
223                         getFirewallChainEnabledLog(chain, enabled));
224             }
225             mEventsBuffer.firewallChainEnabled(chain, enabled);
226         }
227     }
228 
firewallRulesChanged(int chain, int[] uids, int[] rules)229     void firewallRulesChanged(int chain, int[] uids, int[] rules) {
230         synchronized (mLock) {
231             final String log = "Firewall rules changed for " + getFirewallChainName(chain)
232                     + "; uids=" + Arrays.toString(uids) + "; rules=" + Arrays.toString(rules);
233             if (LOGD || mDebugUid != INVALID_UID) {
234                 Slog.d(TAG, log);
235             }
236             mEventsBuffer.event(log);
237         }
238     }
239 
meteredRestrictedPkgsChanged(Set<Integer> restrictedUids)240     void meteredRestrictedPkgsChanged(Set<Integer> restrictedUids) {
241         synchronized (mLock) {
242             final String log = "Metered restricted uids: " + restrictedUids;
243             if (LOGD || mDebugUid != INVALID_UID) {
244                 Slog.d(TAG, log);
245             }
246             mEventsBuffer.event(log);
247         }
248     }
249 
meteredAllowlistChanged(int uid, boolean added)250     void meteredAllowlistChanged(int uid, boolean added) {
251         synchronized (mLock) {
252             if (LOGD || mDebugUid == uid) {
253                 Slog.d(TAG, getMeteredAllowlistChangedLog(uid, added));
254             }
255             mEventsBuffer.meteredAllowlistChanged(uid, added);
256         }
257     }
258 
meteredDenylistChanged(int uid, boolean added)259     void meteredDenylistChanged(int uid, boolean added) {
260         synchronized (mLock) {
261             if (LOGD || mDebugUid == uid) {
262                 Slog.d(TAG, getMeteredDenylistChangedLog(uid, added));
263             }
264             mEventsBuffer.meteredDenylistChanged(uid, added);
265         }
266     }
267 
setDebugUid(int uid)268     void setDebugUid(int uid) {
269         mDebugUid = uid;
270     }
271 
dumpLogs(IndentingPrintWriter pw)272     void dumpLogs(IndentingPrintWriter pw) {
273         synchronized (mLock) {
274             pw.println();
275             pw.println("mEventLogs (most recent first):");
276             pw.increaseIndent();
277             mEventsBuffer.reverseDump(pw);
278             pw.decreaseIndent();
279 
280             pw.println();
281             pw.println("mNetworkBlockedLogs (most recent first):");
282             pw.increaseIndent();
283             mNetworkBlockedBuffer.reverseDump(pw);
284             pw.decreaseIndent();
285 
286             pw.println();
287             pw.println("mUidStateChangeLogs (most recent first):");
288             pw.increaseIndent();
289             mUidStateChangeBuffer.reverseDump(pw);
290             pw.decreaseIndent();
291         }
292     }
293 
getPolicyChangedLog(int uid, int oldPolicy, int newPolicy)294     private static String getPolicyChangedLog(int uid, int oldPolicy, int newPolicy) {
295         return "Policy for " + uid + " changed from "
296                 + NetworkPolicyManager.uidPoliciesToString(oldPolicy) + " to "
297                 + NetworkPolicyManager.uidPoliciesToString(newPolicy);
298     }
299 
getMeterednessChangedLog(int netId, boolean newMetered)300     private static String getMeterednessChangedLog(int netId, boolean newMetered) {
301         return "Meteredness of netId=" + netId + " changed to " + newMetered;
302     }
303 
getUserRemovedLog(int userId)304     private static String getUserRemovedLog(int userId) {
305         return "Remove state for u" + userId;
306     }
307 
getRestrictBackgroundChangedLog(boolean oldValue, boolean newValue)308     private static String getRestrictBackgroundChangedLog(boolean oldValue, boolean newValue) {
309         return "Changed restrictBackground: " + oldValue + "->" + newValue;
310     }
311 
getDeviceIdleModeEnabled(boolean enabled)312     private static String getDeviceIdleModeEnabled(boolean enabled) {
313         return "DeviceIdleMode enabled: " + enabled;
314     }
315 
getAppIdleChangedLog(int uid, boolean idle)316     private static String getAppIdleChangedLog(int uid, boolean idle) {
317         return "App idle state of uid " + uid + ": " + idle;
318     }
319 
getAppIdleWlChangedLog(int uid, boolean isWhitelisted)320     private static String getAppIdleWlChangedLog(int uid, boolean isWhitelisted) {
321         return "App idle whitelist state of uid " + uid + ": " + isWhitelisted;
322     }
323 
getParoleStateChanged(boolean paroleOn)324     private static String getParoleStateChanged(boolean paroleOn) {
325         return "Parole state: " + paroleOn;
326     }
327 
getTempPowerSaveWlChangedLog(int appId, boolean added, int reasonCode, String reason)328     private static String getTempPowerSaveWlChangedLog(int appId, boolean added,
329             int reasonCode, String reason) {
330         return "temp-power-save whitelist for " + appId + " changed to: " + added
331                 + "; reason=" + reasonCodeToString(reasonCode) + " <" + reason + ">";
332     }
333 
getUidFirewallRuleChangedLog(int chain, int uid, int rule)334     private static String getUidFirewallRuleChangedLog(int chain, int uid, int rule) {
335         return String.format("Firewall rule changed: %d-%s-%s",
336                 uid, getFirewallChainName(chain), getFirewallRuleName(rule));
337     }
338 
getFirewallChainEnabledLog(int chain, boolean enabled)339     private static String getFirewallChainEnabledLog(int chain, boolean enabled) {
340         return "Firewall chain " + getFirewallChainName(chain) + " state: " + enabled;
341     }
342 
getMeteredAllowlistChangedLog(int uid, boolean added)343     private static String getMeteredAllowlistChangedLog(int uid, boolean added) {
344         return "metered-allowlist for " + uid + " changed to " + added;
345     }
346 
getMeteredDenylistChangedLog(int uid, boolean added)347     private static String getMeteredDenylistChangedLog(int uid, boolean added) {
348         return "metered-denylist for " + uid + " changed to " + added;
349     }
350 
getFirewallChainName(int chain)351     private static String getFirewallChainName(int chain) {
352         switch (chain) {
353             case FIREWALL_CHAIN_DOZABLE:
354                 return FIREWALL_CHAIN_NAME_DOZABLE;
355             case FIREWALL_CHAIN_STANDBY:
356                 return FIREWALL_CHAIN_NAME_STANDBY;
357             case FIREWALL_CHAIN_POWERSAVE:
358                 return FIREWALL_CHAIN_NAME_POWERSAVE;
359             case FIREWALL_CHAIN_RESTRICTED:
360                 return FIREWALL_CHAIN_NAME_RESTRICTED;
361             case FIREWALL_CHAIN_LOW_POWER_STANDBY:
362                 return FIREWALL_CHAIN_NAME_LOW_POWER_STANDBY;
363             default:
364                 return String.valueOf(chain);
365         }
366     }
367 
getFirewallRuleName(int rule)368     private static String getFirewallRuleName(int rule) {
369         switch (rule) {
370             case FIREWALL_RULE_DEFAULT:
371                 return "default";
372             case FIREWALL_RULE_ALLOW:
373                 return "allow";
374             case FIREWALL_RULE_DENY:
375                 return "deny";
376             default:
377                 return String.valueOf(rule);
378         }
379     }
380 
381     private final static class LogBuffer extends RingBuffer<Data> {
382         private static final SimpleDateFormat sFormatter
383                 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS");
384         private static final Date sDate = new Date();
385 
LogBuffer(int capacity)386         public LogBuffer(int capacity) {
387             super(Data.class, capacity);
388         }
389 
uidStateChanged(int uid, int procState, long procStateSeq, @ProcessCapability int capability)390         public void uidStateChanged(int uid, int procState, long procStateSeq,
391                 @ProcessCapability int capability) {
392             final Data data = getNextSlot();
393             if (data == null) return;
394 
395             data.reset();
396             data.type = EVENT_UID_STATE_CHANGED;
397             data.ifield1 = uid;
398             data.ifield2 = procState;
399             data.ifield3 = capability;
400             data.lfield1 = procStateSeq;
401             data.timeStamp = System.currentTimeMillis();
402         }
403 
event(String msg)404         public void event(String msg) {
405             final Data data = getNextSlot();
406             if (data == null) return;
407 
408             data.reset();
409             data.type = EVENT_TYPE_GENERIC;
410             data.sfield1 = msg;
411             data.timeStamp = System.currentTimeMillis();
412         }
413 
networkBlocked(int uid, int blockedReasons, int allowedReasons, int effectiveBlockedReasons)414         public void networkBlocked(int uid, int blockedReasons, int allowedReasons,
415                 int effectiveBlockedReasons) {
416             final Data data = getNextSlot();
417             if (data == null) return;
418 
419             data.reset();
420             data.type = EVENT_NETWORK_BLOCKED;
421             data.ifield1 = uid;
422             data.ifield2 = blockedReasons;
423             data.ifield3 = allowedReasons;
424             data.ifield4 = effectiveBlockedReasons;
425             data.timeStamp = System.currentTimeMillis();
426         }
427 
uidPolicyChanged(int uid, int oldPolicy, int newPolicy)428         public void uidPolicyChanged(int uid, int oldPolicy, int newPolicy) {
429             final Data data = getNextSlot();
430             if (data == null) return;
431 
432             data.reset();
433             data.type = EVENT_POLICIES_CHANGED;
434             data.ifield1 = uid;
435             data.ifield2 = oldPolicy;
436             data.ifield3 = newPolicy;
437             data.timeStamp = System.currentTimeMillis();
438         }
439 
meterednessChanged(int netId, boolean newMetered)440         public void meterednessChanged(int netId, boolean newMetered) {
441             final Data data = getNextSlot();
442             if (data == null) return;
443 
444             data.reset();
445             data.type = EVENT_METEREDNESS_CHANGED;
446             data.ifield1 = netId;
447             data.bfield1 = newMetered;
448             data.timeStamp = System.currentTimeMillis();
449         }
450 
userRemoved(int userId)451         public void userRemoved(int userId) {
452             final Data data = getNextSlot();
453             if (data == null) return;
454 
455             data.reset();
456             data.type = EVENT_USER_STATE_REMOVED;
457             data.ifield1 = userId;
458             data.timeStamp = System.currentTimeMillis();
459         }
460 
restrictBackgroundChanged(boolean oldValue, boolean newValue)461         public void restrictBackgroundChanged(boolean oldValue, boolean newValue) {
462             final Data data = getNextSlot();
463             if (data == null) return;
464 
465             data.reset();
466             data.type = EVENT_RESTRICT_BG_CHANGED;
467             data.bfield1 = oldValue;
468             data.bfield2 = newValue;
469             data.timeStamp = System.currentTimeMillis();
470         }
471 
deviceIdleModeEnabled(boolean enabled)472         public void deviceIdleModeEnabled(boolean enabled) {
473             final Data data = getNextSlot();
474             if (data == null) return;
475 
476             data.reset();
477             data.type = EVENT_DEVICE_IDLE_MODE_ENABLED;
478             data.bfield1 = enabled;
479             data.timeStamp = System.currentTimeMillis();
480         }
481 
appIdleStateChanged(int uid, boolean idle)482         public void appIdleStateChanged(int uid, boolean idle) {
483             final Data data = getNextSlot();
484             if (data == null) return;
485 
486             data.reset();
487             data.type = EVENT_APP_IDLE_STATE_CHANGED;
488             data.ifield1 = uid;
489             data.bfield1 = idle;
490             data.timeStamp = System.currentTimeMillis();
491         }
492 
appIdleWlChanged(int uid, boolean isWhitelisted)493         public void appIdleWlChanged(int uid, boolean isWhitelisted) {
494             final Data data = getNextSlot();
495             if (data == null) return;
496 
497             data.reset();
498             data.type = EVENT_APP_IDLE_WL_CHANGED;
499             data.ifield1 = uid;
500             data.bfield1 = isWhitelisted;
501             data.timeStamp = System.currentTimeMillis();
502         }
503 
paroleStateChanged(boolean paroleOn)504         public void paroleStateChanged(boolean paroleOn) {
505             final Data data = getNextSlot();
506             if (data == null) return;
507 
508             data.reset();
509             data.type = EVENT_PAROLE_STATE_CHANGED;
510             data.bfield1 = paroleOn;
511             data.timeStamp = System.currentTimeMillis();
512         }
513 
tempPowerSaveWlChanged(int appId, boolean added, int reasonCode, String reason)514         public void tempPowerSaveWlChanged(int appId, boolean added,
515                 int reasonCode, String reason) {
516             final Data data = getNextSlot();
517             if (data == null) return;
518 
519             data.reset();
520             data.type = EVENT_TEMP_POWER_SAVE_WL_CHANGED;
521             data.ifield1 = appId;
522             data.ifield2 = reasonCode;
523             data.bfield1 = added;
524             data.sfield1 = reason;
525             data.timeStamp = System.currentTimeMillis();
526         }
527 
uidFirewallRuleChanged(int chain, int uid, int rule)528         public void uidFirewallRuleChanged(int chain, int uid, int rule) {
529             final Data data = getNextSlot();
530             if (data == null) return;
531 
532             data.reset();
533             data.type = EVENT_UID_FIREWALL_RULE_CHANGED;
534             data.ifield1 = chain;
535             data.ifield2 = uid;
536             data.ifield3 = rule;
537             data.timeStamp = System.currentTimeMillis();
538         }
539 
firewallChainEnabled(int chain, boolean enabled)540         public void firewallChainEnabled(int chain, boolean enabled) {
541             final Data data = getNextSlot();
542             if (data == null) return;
543 
544             data.reset();
545             data.type = EVENT_FIREWALL_CHAIN_ENABLED;
546             data.ifield1 = chain;
547             data.bfield1 = enabled;
548             data.timeStamp = System.currentTimeMillis();
549         }
550 
meteredAllowlistChanged(int uid, boolean added)551         public void meteredAllowlistChanged(int uid, boolean added) {
552             final Data data = getNextSlot();
553             if (data == null) return;
554 
555             data.reset();
556             data.type = EVENT_METERED_ALLOWLIST_CHANGED;
557             data.ifield1 = uid;
558             data.bfield1 = added;
559             data.timeStamp = System.currentTimeMillis();
560         }
561 
meteredDenylistChanged(int uid, boolean added)562         public void meteredDenylistChanged(int uid, boolean added) {
563             final Data data = getNextSlot();
564             if (data == null) return;
565 
566             data.reset();
567             data.type = EVENT_METERED_DENYLIST_CHANGED;
568             data.ifield1 = uid;
569             data.bfield1 = added;
570             data.timeStamp = System.currentTimeMillis();
571         }
572 
reverseDump(IndentingPrintWriter pw)573         public void reverseDump(IndentingPrintWriter pw) {
574             final Data[] allData = toArray();
575             for (int i = allData.length - 1; i >= 0; --i) {
576                 if (allData[i] == null) {
577                     pw.println("NULL");
578                     continue;
579                 }
580                 pw.print(formatDate(allData[i].timeStamp));
581                 pw.print(" - ");
582                 pw.println(getContent(allData[i]));
583             }
584         }
585 
getContent(Data data)586         public String getContent(Data data) {
587             switch (data.type) {
588                 case EVENT_TYPE_GENERIC:
589                     return data.sfield1;
590                 case EVENT_NETWORK_BLOCKED:
591                     return data.ifield1 + "-" + UidBlockedState.toString(
592                             data.ifield2, data.ifield3, data.ifield4);
593                 case EVENT_UID_STATE_CHANGED:
594                     return data.ifield1 + ":" + ProcessList.makeProcStateString(data.ifield2)
595                             + ":" + ActivityManager.getCapabilitiesSummary(data.ifield3)
596                             + ":" + data.lfield1;
597                 case EVENT_POLICIES_CHANGED:
598                     return getPolicyChangedLog(data.ifield1, data.ifield2, data.ifield3);
599                 case EVENT_METEREDNESS_CHANGED:
600                     return getMeterednessChangedLog(data.ifield1, data.bfield1);
601                 case EVENT_USER_STATE_REMOVED:
602                     return getUserRemovedLog(data.ifield1);
603                 case EVENT_RESTRICT_BG_CHANGED:
604                     return getRestrictBackgroundChangedLog(data.bfield1, data.bfield2);
605                 case EVENT_DEVICE_IDLE_MODE_ENABLED:
606                     return getDeviceIdleModeEnabled(data.bfield1);
607                 case EVENT_APP_IDLE_STATE_CHANGED:
608                     return getAppIdleChangedLog(data.ifield1, data.bfield1);
609                 case EVENT_APP_IDLE_WL_CHANGED:
610                     return getAppIdleWlChangedLog(data.ifield1, data.bfield1);
611                 case EVENT_PAROLE_STATE_CHANGED:
612                     return getParoleStateChanged(data.bfield1);
613                 case EVENT_TEMP_POWER_SAVE_WL_CHANGED:
614                     return getTempPowerSaveWlChangedLog(data.ifield1, data.bfield1,
615                             data.ifield2, data.sfield1);
616                 case EVENT_UID_FIREWALL_RULE_CHANGED:
617                     return getUidFirewallRuleChangedLog(data.ifield1, data.ifield2, data.ifield3);
618                 case EVENT_FIREWALL_CHAIN_ENABLED:
619                     return getFirewallChainEnabledLog(data.ifield1, data.bfield1);
620                 case EVENT_METERED_ALLOWLIST_CHANGED:
621                     return getMeteredAllowlistChangedLog(data.ifield1, data.bfield1);
622                 case EVENT_METERED_DENYLIST_CHANGED:
623                     return getMeteredDenylistChangedLog(data.ifield1, data.bfield1);
624                 default:
625                     return String.valueOf(data.type);
626             }
627         }
628 
formatDate(long millis)629         private String formatDate(long millis) {
630             sDate.setTime(millis);
631             return sFormatter.format(sDate);
632         }
633     }
634 
635     /**
636      * Container class for all networkpolicy events data.
637      *
638      * Note: This class needs to be public for RingBuffer class to be able to create
639      * new instances of this.
640      */
641     public static final class Data {
642         public int type;
643         public long timeStamp;
644 
645         public int ifield1;
646         public int ifield2;
647         public int ifield3;
648         public int ifield4;
649         public long lfield1;
650         public boolean bfield1;
651         public boolean bfield2;
652         public String sfield1;
653 
reset()654         public void reset(){
655             sfield1 = null;
656         }
657     }
658 }
659