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