summaryrefslogtreecommitdiff
path: root/src/android/net/dhcp/DhcpLeaseRepository.java
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2020-03-30 04:23:55 +0000
committerMark Chien <markchien@google.com>2020-04-10 10:05:01 +0000
commitfd1649fc1801a201af30ef03f7bf33c43085ee8b (patch)
tree3adc8be7c44b54bc1af74a4969d17eb75fa2d024 /src/android/net/dhcp/DhcpLeaseRepository.java
parent6fb2a069f996e86c31998e0e0088cba5d311c7db (diff)
Support specific client address configuration
If specific config "clientAddr" is set, the DHCP server will only offer "clientAddr". This is for peer-to-peer use case. If there are multiple clients for which "clientAddr" is already in use, dhcp server will not offer other addresses to clients. Bug: 141256482 Test: manual atest NetworkStackNextTests Merged-In: I96bc24a9c30bfc48dff38c3c4456085694fd381c Change-Id: I96bc24a9c30bfc48dff38c3c4456085694fd381c
Diffstat (limited to 'src/android/net/dhcp/DhcpLeaseRepository.java')
-rw-r--r--src/android/net/dhcp/DhcpLeaseRepository.java16
1 files changed, 12 insertions, 4 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