1 /*
2  * Copyright (C) 2018 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 
17 package android.net.dhcp;
18 
19 import static android.net.shared.Inet4AddressUtils.inet4AddressToIntHTH;
20 
21 import android.annotation.NonNull;
22 import android.net.LinkAddress;
23 
24 import com.google.android.collect.Sets;
25 
26 import java.net.Inet4Address;
27 import java.util.Collection;
28 import java.util.Set;
29 
30 /**
31  * Subclass of {@link DhcpServingParamsParcel} with additional utility methods for building.
32  *
33  * <p>This utility class does not check for validity of the parameters: invalid parameters are
34  * reported by the receiving module when unparceling the parcel.
35  *
36  * @see DhcpServingParams
37  * @hide
38  */
39 public class DhcpServingParamsParcelExt extends DhcpServingParamsParcel {
40     public static final int MTU_UNSET = 0;
41 
42     /**
43      * Set the server address and served prefix for the DHCP server.
44      *
45      * <p>This parameter is required.
46      */
setServerAddr(@onNull LinkAddress serverAddr)47     public DhcpServingParamsParcelExt setServerAddr(@NonNull LinkAddress serverAddr) {
48         this.serverAddr = inet4AddressToIntHTH((Inet4Address) serverAddr.getAddress());
49         this.serverAddrPrefixLength = serverAddr.getPrefixLength();
50         return this;
51     }
52 
53     /**
54      * Set the default routers to be advertised to DHCP clients.
55      *
56      * <p>Each router must be inside the served prefix. This may be an empty set, but it must
57      * always be set explicitly.
58      */
setDefaultRouters(@onNull Set<Inet4Address> defaultRouters)59     public DhcpServingParamsParcelExt setDefaultRouters(@NonNull Set<Inet4Address> defaultRouters) {
60         this.defaultRouters = toIntArray(defaultRouters);
61         return this;
62     }
63 
64     /**
65      * Set the default routers to be advertised to DHCP clients.
66      *
67      * <p>Each router must be inside the served prefix. This may be an empty list of routers,
68      * but it must always be set explicitly.
69      */
setDefaultRouters(@onNull Inet4Address... defaultRouters)70     public DhcpServingParamsParcelExt setDefaultRouters(@NonNull Inet4Address... defaultRouters) {
71         return setDefaultRouters(Sets.newArraySet(defaultRouters));
72     }
73 
74     /**
75      * Convenience method to build the parameters with no default router.
76      *
77      * <p>Equivalent to calling {@link #setDefaultRouters(Inet4Address...)} with no address.
78      */
setNoDefaultRouter()79     public DhcpServingParamsParcelExt setNoDefaultRouter() {
80         return setDefaultRouters();
81     }
82 
83     /**
84      * Set the DNS servers to be advertised to DHCP clients.
85      *
86      * <p>This may be an empty set, but it must always be set explicitly.
87      */
setDnsServers(@onNull Set<Inet4Address> dnsServers)88     public DhcpServingParamsParcelExt setDnsServers(@NonNull Set<Inet4Address> dnsServers) {
89         this.dnsServers = toIntArray(dnsServers);
90         return this;
91     }
92 
93     /**
94      * Set the DNS servers to be advertised to DHCP clients.
95      *
96      * <p>This may be an empty list of servers, but it must always be set explicitly.
97      */
setDnsServers(@onNull Inet4Address... dnsServers)98     public DhcpServingParamsParcelExt setDnsServers(@NonNull Inet4Address... dnsServers) {
99         return setDnsServers(Sets.newArraySet(dnsServers));
100     }
101 
102     /**
103      * Convenience method to build the parameters with no DNS server.
104      *
105      * <p>Equivalent to calling {@link #setDnsServers(Inet4Address...)} with no address.
106      */
setNoDnsServer()107     public DhcpServingParamsParcelExt setNoDnsServer() {
108         return setDnsServers();
109     }
110 
111     /**
112      * Set excluded addresses that the DHCP server is not allowed to assign to clients.
113      *
114      * <p>This parameter is optional. DNS servers and default routers are always excluded
115      * and do not need to be set here.
116      */
setExcludedAddrs(@onNull Set<Inet4Address> excludedAddrs)117     public DhcpServingParamsParcelExt setExcludedAddrs(@NonNull Set<Inet4Address> excludedAddrs) {
118         this.excludedAddrs = toIntArray(excludedAddrs);
119         return this;
120     }
121 
122     /**
123      * Set excluded addresses that the DHCP server is not allowed to assign to clients.
124      *
125      * <p>This parameter is optional. DNS servers and default routers are always excluded
126      * and do not need to be set here.
127      */
setExcludedAddrs(@onNull Inet4Address... excludedAddrs)128     public DhcpServingParamsParcelExt setExcludedAddrs(@NonNull Inet4Address... excludedAddrs) {
129         return setExcludedAddrs(Sets.newArraySet(excludedAddrs));
130     }
131 
132     /**
133      * Set the lease time for leases assigned by the DHCP server.
134      *
135      * <p>This parameter is required.
136      */
setDhcpLeaseTimeSecs(long dhcpLeaseTimeSecs)137     public DhcpServingParamsParcelExt setDhcpLeaseTimeSecs(long dhcpLeaseTimeSecs) {
138         this.dhcpLeaseTimeSecs = dhcpLeaseTimeSecs;
139         return this;
140     }
141 
142     /**
143      * Set the link MTU to be advertised to DHCP clients.
144      *
145      * <p>If set to {@link #MTU_UNSET}, no MTU will be advertised to clients. This parameter
146      * is optional and defaults to {@link #MTU_UNSET}.
147      */
setLinkMtu(int linkMtu)148     public DhcpServingParamsParcelExt setLinkMtu(int linkMtu) {
149         this.linkMtu = linkMtu;
150         return this;
151     }
152 
153     /**
154      * Set whether the DHCP server should send the ANDROID_METERED vendor-specific option.
155      *
156      * <p>If not set, the default value is false.
157      */
setMetered(boolean metered)158     public DhcpServingParamsParcelExt setMetered(boolean metered) {
159         this.metered = metered;
160         return this;
161     }
162 
toIntArray(@onNull Collection<Inet4Address> addrs)163     private static int[] toIntArray(@NonNull Collection<Inet4Address> addrs) {
164         int[] res = new int[addrs.size()];
165         int i = 0;
166         for (Inet4Address addr : addrs) {
167             res[i] = inet4AddressToIntHTH(addr);
168             i++;
169         }
170         return res;
171     }
172 }
173