1cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi/* 2cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * Copyright (C) 2016 The Android Open Source Project 3cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * 4cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * Licensed under the Apache License, Version 2.0 (the "License"); 5cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * you may not use this file except in compliance with the License. 6cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * You may obtain a copy of the License at 7cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * 8cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * http://www.apache.org/licenses/LICENSE-2.0 9cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * 10cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * Unless required by applicable law or agreed to in writing, software 11cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * distributed under the License is distributed on an "AS IS" BASIS, 12cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * See the License for the specific language governing permissions and 14cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * limitations under the License. 15cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi */ 16cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 17cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichipackage android.net.metrics; 18cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 19cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichiimport android.annotation.SystemApi; 20cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichiimport android.os.Parcel; 21cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichiimport android.os.Parcelable; 22cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 23cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi/** 24cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * An event logged when the APF packet socket receives an RA packet. 25cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi * {@hide} 26cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi */ 27cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi@SystemApi 28cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichipublic final class RaEvent implements Parcelable { 29cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 306ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi /** {@hide} */ 316ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public static final long NO_LIFETIME = -1L; 326ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 33cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi // Lifetime in seconds of options found in a single RA packet. 34cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi // When an option is not set, the value of the associated field is -1; 35cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public final long routerLifetime; 36cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public final long prefixValidLifetime; 37cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public final long prefixPreferredLifetime; 38cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public final long routeInfoLifetime; 39cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public final long rdnssLifetime; 40cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public final long dnsslLifetime; 41cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 42cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi /** {@hide} */ 43cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public RaEvent(long routerLifetime, long prefixValidLifetime, long prefixPreferredLifetime, 44cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi long routeInfoLifetime, long rdnssLifetime, long dnsslLifetime) { 45cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi this.routerLifetime = routerLifetime; 46cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi this.prefixValidLifetime = prefixValidLifetime; 47cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi this.prefixPreferredLifetime = prefixPreferredLifetime; 48cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi this.routeInfoLifetime = routeInfoLifetime; 49cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi this.rdnssLifetime = rdnssLifetime; 50cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi this.dnsslLifetime = dnsslLifetime; 51cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi } 52cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 53cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi private RaEvent(Parcel in) { 54cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi routerLifetime = in.readLong(); 55cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi prefixValidLifetime = in.readLong(); 56cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi prefixPreferredLifetime = in.readLong(); 57cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi routeInfoLifetime = in.readLong(); 58cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi rdnssLifetime = in.readLong(); 59cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi dnsslLifetime = in.readLong(); 60cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi } 61cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 62cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi @Override 63cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public void writeToParcel(Parcel out, int flags) { 64cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi out.writeLong(routerLifetime); 65cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi out.writeLong(prefixValidLifetime); 66cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi out.writeLong(prefixPreferredLifetime); 67cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi out.writeLong(routeInfoLifetime); 68cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi out.writeLong(rdnssLifetime); 69cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi out.writeLong(dnsslLifetime); 70cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi } 71cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 72cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi @Override 73cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public int describeContents() { 74cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi return 0; 75cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi } 76cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 77cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi @Override 78cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public String toString() { 79cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi return new StringBuilder("RaEvent(lifetimes: ") 80cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi .append(String.format("router=%ds, ", routerLifetime)) 81cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi .append(String.format("prefix_valid=%ds, ", prefixValidLifetime)) 82cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi .append(String.format("prefix_preferred=%ds, ", prefixPreferredLifetime)) 83cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi .append(String.format("route_info=%ds, ", routeInfoLifetime)) 84cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi .append(String.format("rdnss=%ds, ", rdnssLifetime)) 85cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi .append(String.format("dnssl=%ds)", dnsslLifetime)) 86cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi .toString(); 87cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi } 88cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 89cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public static final Parcelable.Creator<RaEvent> CREATOR = new Parcelable.Creator<RaEvent>() { 90cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public RaEvent createFromParcel(Parcel in) { 91cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi return new RaEvent(in); 92cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi } 93cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi 94cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi public RaEvent[] newArray(int size) { 95cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi return new RaEvent[size]; 96cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi } 97cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi }; 986ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 996ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi /** {@hide} */ 1006ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public static class Builder { 1016ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1026ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi long routerLifetime = NO_LIFETIME; 1036ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi long prefixValidLifetime = NO_LIFETIME; 1046ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi long prefixPreferredLifetime = NO_LIFETIME; 1056ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi long routeInfoLifetime = NO_LIFETIME; 1066ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi long rdnssLifetime = NO_LIFETIME; 1076ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi long dnsslLifetime = NO_LIFETIME; 1086ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1096ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public Builder() { 1106ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1116ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1126ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public RaEvent build() { 1136ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return new RaEvent(routerLifetime, prefixValidLifetime, prefixPreferredLifetime, 1146ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi routeInfoLifetime, rdnssLifetime, dnsslLifetime); 1156ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1166ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1176ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public Builder updateRouterLifetime(long lifetime) { 1186ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi routerLifetime = updateLifetime(routerLifetime, lifetime); 1196ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return this; 1206ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1216ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1226ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public Builder updatePrefixValidLifetime(long lifetime) { 1236ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi prefixValidLifetime = updateLifetime(prefixValidLifetime, lifetime); 1246ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return this; 1256ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1266ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1276ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public Builder updatePrefixPreferredLifetime(long lifetime) { 1286ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi prefixPreferredLifetime = updateLifetime(prefixPreferredLifetime, lifetime); 1296ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return this; 1306ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1316ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1326ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public Builder updateRouteInfoLifetime(long lifetime) { 1336ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi routeInfoLifetime = updateLifetime(routeInfoLifetime, lifetime); 1346ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return this; 1356ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1366ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1376ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public Builder updateRdnssLifetime(long lifetime) { 1386ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi rdnssLifetime = updateLifetime(rdnssLifetime, lifetime); 1396ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return this; 1406ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1416ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1426ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi public Builder updateDnsslLifetime(long lifetime) { 1436ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi dnsslLifetime = updateLifetime(dnsslLifetime, lifetime); 1446ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return this; 1456ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1466ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi 1476ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi private long updateLifetime(long currentLifetime, long newLifetime) { 1486ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi if (currentLifetime == RaEvent.NO_LIFETIME) { 1496ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return newLifetime; 1506ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1516ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi return Math.min(currentLifetime, newLifetime); 1526ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 1536ccd51a338fed39217cb3a5c0f229ed547918634Hugo Benichi } 154cfbf7414a14cf91d1b5c83154aab54c32d6be76aHugo Benichi} 155