summaryrefslogtreecommitdiff
path: root/src/android/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/net')
-rw-r--r--src/android/net/dhcp/DhcpLeaseRepository.java16
-rw-r--r--src/android/net/dhcp/DhcpServer.java7
-rw-r--r--src/android/net/dhcp/DhcpServingParams.java28
3 files changed, 42 insertions, 9 deletions
diff --git a/src/android/net/dhcp/DhcpLeaseRepository.java b/src/android/net/dhcp/DhcpLeaseRepository.java
index d0dc389..3639a2d 100644
--- a/src/android/net/dhcp/DhcpLeaseRepository.java
+++ b/src/android/net/dhcp/DhcpLeaseRepository.java
@@ -80,6 +80,8 @@ class DhcpLeaseRepository {
private int mSubnetMask;
private int mNumAddresses;
private long mLeaseTimeMs;
+ @Nullable
+ private Inet4Address mClientAddr;
/**
* Next timestamp when committed or declined leases should be checked for expired ones. This
@@ -128,21 +130,24 @@ class DhcpLeaseRepository {
private final LinkedHashMap<Inet4Address, Long> mDeclinedAddrs = new LinkedHashMap<>();
DhcpLeaseRepository(@NonNull IpPrefix prefix, @NonNull Set<Inet4Address> reservedAddrs,
- long leaseTimeMs, @NonNull SharedLog log, @NonNull Clock clock) {
- updateParams(prefix, reservedAddrs, leaseTimeMs);
+ long leaseTimeMs, @Nullable Inet4Address clientAddr, @NonNull SharedLog log,
+ @NonNull Clock clock) {
mLog = log;
mClock = clock;
+ mClientAddr = clientAddr;
+ updateParams(prefix, reservedAddrs, leaseTimeMs, clientAddr);
}
public void updateParams(@NonNull IpPrefix prefix, @NonNull Set<Inet4Address> reservedAddrs,
- long leaseTimeMs) {
+ long leaseTimeMs, @Nullable Inet4Address clientAddr) {
mPrefix = prefix;
mReservedAddrs = Collections.unmodifiableSet(new HashSet<>(reservedAddrs));
mPrefixLength = prefix.getPrefixLength();
mSubnetMask = prefixLengthToV4NetmaskIntHTH(mPrefixLength);
mSubnetAddr = inet4AddressToIntHTH((Inet4Address) prefix.getAddress()) & mSubnetMask;
- mNumAddresses = 1 << (IPV4_ADDR_BITS - prefix.getPrefixLength());
+ mNumAddresses = clientAddr != null ? 1 : 1 << (IPV4_ADDR_BITS - prefix.getPrefixLength());
mLeaseTimeMs = leaseTimeMs;
+ mClientAddr = clientAddr;
cleanMap(mDeclinedAddrs);
if (cleanMap(mCommittedLeases)) {
@@ -514,6 +519,9 @@ class DhcpLeaseRepository {
* address (with the ordering in {@link #getAddrIndex(int)}) is returned.
*/
private int getValidAddress(int addr) {
+ // Only mClientAddr is valid if static client address is enforced.
+ if (mClientAddr != null) return inet4AddressToIntHTH(mClientAddr);
+
final int lastByteMask = 0xff;
int addrIndex = getAddrIndex(addr); // 0-based index of the address in the subnet
diff --git a/src/android/net/dhcp/DhcpServer.java b/src/android/net/dhcp/DhcpServer.java
index 064aa5d..429b10c 100644
--- a/src/android/net/dhcp/DhcpServer.java
+++ b/src/android/net/dhcp/DhcpServer.java
@@ -205,8 +205,8 @@ public class DhcpServer extends IDhcpServer.Stub {
@NonNull SharedLog log, @NonNull Clock clock) {
return new DhcpLeaseRepository(
DhcpServingParams.makeIpPrefix(servingParams.serverAddr),
- servingParams.excludedAddrs,
- servingParams.dhcpLeaseTimeSecs * 1000, log.forSubComponent(REPO_TAG), clock);
+ servingParams.excludedAddrs, servingParams.dhcpLeaseTimeSecs * 1000,
+ servingParams.clientAddr, log.forSubComponent(REPO_TAG), clock);
}
@Override
@@ -351,7 +351,8 @@ public class DhcpServer extends IDhcpServer.Stub {
mLeaseRepo.updateParams(
DhcpServingParams.makeIpPrefix(mServingParams.serverAddr),
params.excludedAddrs,
- params.dhcpLeaseTimeSecs);
+ params.dhcpLeaseTimeSecs,
+ params.clientAddr);
cb = pair.second;
break;
diff --git a/src/android/net/dhcp/DhcpServingParams.java b/src/android/net/dhcp/DhcpServingParams.java
index eafe44e..63f847d 100644
--- a/src/android/net/dhcp/DhcpServingParams.java
+++ b/src/android/net/dhcp/DhcpServingParams.java
@@ -85,6 +85,12 @@ public class DhcpServingParams {
public final boolean metered;
/**
+ * Client inet address. This will be the only address offered by DhcpServer if set.
+ */
+ @Nullable
+ public final Inet4Address clientAddr;
+
+ /**
* Checked exception thrown when some parameters used to build {@link DhcpServingParams} are
* missing or invalid.
*/
@@ -97,7 +103,7 @@ public class DhcpServingParams {
private DhcpServingParams(@NonNull LinkAddress serverAddr,
@NonNull Set<Inet4Address> defaultRouters,
@NonNull Set<Inet4Address> dnsServers, @NonNull Set<Inet4Address> excludedAddrs,
- long dhcpLeaseTimeSecs, int linkMtu, boolean metered) {
+ long dhcpLeaseTimeSecs, int linkMtu, boolean metered, Inet4Address clientAddr) {
this.serverAddr = serverAddr;
this.defaultRouters = defaultRouters;
this.dnsServers = dnsServers;
@@ -105,6 +111,7 @@ public class DhcpServingParams {
this.dhcpLeaseTimeSecs = dhcpLeaseTimeSecs;
this.linkMtu = linkMtu;
this.metered = metered;
+ this.clientAddr = clientAddr;
}
/**
@@ -119,6 +126,11 @@ public class DhcpServingParams {
final LinkAddress serverAddr = new LinkAddress(
intToInet4AddressHTH(parcel.serverAddr),
parcel.serverAddrPrefixLength);
+ Inet4Address clientAddr = null;
+ if (parcel.clientAddr != 0) {
+ clientAddr = intToInet4AddressHTH(parcel.clientAddr);
+ }
+
return new Builder()
.setServerAddr(serverAddr)
.setDefaultRouters(toInet4AddressSet(parcel.defaultRouters))
@@ -127,6 +139,7 @@ public class DhcpServingParams {
.setDhcpLeaseTimeSecs(parcel.dhcpLeaseTimeSecs)
.setLinkMtu(parcel.linkMtu)
.setMetered(parcel.metered)
+ .setClientAddr(clientAddr)
.build();
}
@@ -181,6 +194,7 @@ public class DhcpServingParams {
private long mDhcpLeaseTimeSecs;
private int mLinkMtu = MTU_UNSET;
private boolean mMetered;
+ private Inet4Address mClientAddr;
/**
* Set the server address and served prefix for the DHCP server.
@@ -305,6 +319,16 @@ public class DhcpServingParams {
}
/**
+ * Set the client address.
+ *
+ * <p>If not set, the default value is null.
+ */
+ public Builder setClientAddr(@Nullable Inet4Address clientAddr) {
+ this.mClientAddr = clientAddr;
+ return this;
+ }
+
+ /**
* Create a new {@link DhcpServingParams} instance based on parameters set in the builder.
*
* <p>This method has no side-effects. If it does not throw, a valid
@@ -358,7 +382,7 @@ public class DhcpServingParams {
Collections.unmodifiableSet(new HashSet<>(mDefaultRouters)),
Collections.unmodifiableSet(new HashSet<>(mDnsServers)),
Collections.unmodifiableSet(excl),
- mDhcpLeaseTimeSecs, mLinkMtu, mMetered);
+ mDhcpLeaseTimeSecs, mLinkMtu, mMetered, mClientAddr);
}
}