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