diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2020-03-30 04:23:55 +0000 |
---|---|---|
committer | Mark Chien <markchien@google.com> | 2020-04-10 10:05:01 +0000 |
commit | fd1649fc1801a201af30ef03f7bf33c43085ee8b (patch) | |
tree | 3adc8be7c44b54bc1af74a4969d17eb75fa2d024 /src/android/net/dhcp/DhcpLeaseRepository.java | |
parent | 6fb2a069f996e86c31998e0e0088cba5d311c7db (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.java | 16 |
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 |