Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6557a246 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN
Browse files

Fix DHCP options sent by DHCP server

Add Android metered option, rebinding time option (T2), and match
current order of options.  Current DHCP server uses subnet_mask,
broadcast_address, router, name_server in this order.

Test: DhcpServerTest.py:test_discover_paramrequestlist passes
      atest FrameworksNetTests passes

Bug: b/109584964
Change-Id: I58f904d5fac306f704c16234fd69c2440fe0803d
parent e59d031f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -218,6 +218,7 @@ public class TetherInterfaceStateMachine extends StateMachine {
                    .setDhcpLeaseTimeSecs(DHCP_LEASE_TIME_SECS)
                    .setDnsServers(addr)
                    .setServerAddr(new LinkAddress(addr, prefixLen))
                    .setMetered(true)
                    .build();
            // TODO: also advertise link MTU
        } catch (DhcpServingParams.InvalidParameterException e) {
+1 −12
Original line number Diff line number Diff line
@@ -70,19 +70,8 @@ class DhcpAckPacket extends DhcpPacket {
    void finishPacket(ByteBuffer buffer) {
        addTlv(buffer, DHCP_MESSAGE_TYPE, DHCP_MESSAGE_TYPE_ACK);
        addTlv(buffer, DHCP_SERVER_IDENTIFIER, mServerIdentifier);
        addTlv(buffer, DHCP_LEASE_TIME, mLeaseTime);

        // the client should renew at 1/2 the lease-expiry interval
        if (mLeaseTime != null) {
            addTlv(buffer, DHCP_RENEWAL_TIME,
                Integer.valueOf(mLeaseTime.intValue() / 2));
        }

        addTlv(buffer, DHCP_SUBNET_MASK, mSubnetMask);
        addTlv(buffer, DHCP_ROUTER, mGateways);
        addTlv(buffer, DHCP_DOMAIN_NAME, mDomainName);
        addTlv(buffer, DHCP_BROADCAST_ADDRESS, mBroadcastAddress);
        addTlv(buffer, DHCP_DNS_SERVER, mDnsServers);
        addCommonServerTlvs(buffer);
        addTlvEnd(buffer);
    }

+1 −12
Original line number Diff line number Diff line
@@ -72,19 +72,8 @@ class DhcpOfferPacket extends DhcpPacket {
    void finishPacket(ByteBuffer buffer) {
        addTlv(buffer, DHCP_MESSAGE_TYPE, DHCP_MESSAGE_TYPE_OFFER);
        addTlv(buffer, DHCP_SERVER_IDENTIFIER, mServerIdentifier);
        addTlv(buffer, DHCP_LEASE_TIME, mLeaseTime);

        // the client should renew at 1/2 the lease-expiry interval
        if (mLeaseTime != null) {
            addTlv(buffer, DHCP_RENEWAL_TIME,
                Integer.valueOf(mLeaseTime.intValue() / 2));
        }

        addTlv(buffer, DHCP_SUBNET_MASK, mSubnetMask);
        addTlv(buffer, DHCP_ROUTER, mGateways);
        addTlv(buffer, DHCP_DOMAIN_NAME, mDomainName);
        addTlv(buffer, DHCP_BROADCAST_ADDRESS, mBroadcastAddress);
        addTlv(buffer, DHCP_DNS_SERVER, mDnsServers);
        addCommonServerTlvs(buffer);
        addTlvEnd(buffer);
    }
}
+30 −2
Original line number Diff line number Diff line
@@ -183,6 +183,11 @@ public abstract class DhcpPacket {
    protected static final byte DHCP_VENDOR_INFO = 43;
    protected String mVendorInfo;

    /**
     * Value of the vendor specific option used to indicate that the network is metered
     */
    public static final String VENDOR_INFO_ANDROID_METERED = "ANDROID_METERED";

    /**
     * DHCP Optional Type: DHCP Requested IP Address
     */
@@ -677,6 +682,23 @@ public abstract class DhcpPacket {
        if (!TextUtils.isEmpty(hn)) addTlv(buf, DHCP_HOST_NAME, hn);
    }

    protected void addCommonServerTlvs(ByteBuffer buf) {
        addTlv(buf, DHCP_LEASE_TIME, mLeaseTime);
        if (mLeaseTime != null && mLeaseTime != INFINITE_LEASE) {
            // The client should renew at 1/2 the lease-expiry interval
            addTlv(buf, DHCP_RENEWAL_TIME, (int) (Integer.toUnsignedLong(mLeaseTime) / 2));
            // Default rebinding time is set as below by RFC2131
            addTlv(buf, DHCP_REBINDING_TIME,
                    (int) (Integer.toUnsignedLong(mLeaseTime) * 875L / 1000L));
        }
        addTlv(buf, DHCP_SUBNET_MASK, mSubnetMask);
        addTlv(buf, DHCP_BROADCAST_ADDRESS, mBroadcastAddress);
        addTlv(buf, DHCP_ROUTER, mGateways);
        addTlv(buf, DHCP_DNS_SERVER, mDnsServers);
        addTlv(buf, DHCP_DOMAIN_NAME, mDomainName);
        addTlv(buf, DHCP_VENDOR_INFO, mVendorInfo);
    }

    /**
     * Converts a MAC from an array of octets to an ASCII string.
     */
@@ -1237,7 +1259,7 @@ public abstract class DhcpPacket {
        boolean broadcast, Inet4Address serverIpAddr, Inet4Address relayIp,
        Inet4Address yourIp, byte[] mac, Integer timeout, Inet4Address netMask,
        Inet4Address bcAddr, List<Inet4Address> gateways, List<Inet4Address> dnsServers,
        Inet4Address dhcpServerIdentifier, String domainName) {
        Inet4Address dhcpServerIdentifier, String domainName, boolean metered) {
        DhcpPacket pkt = new DhcpOfferPacket(
                transactionId, (short) 0, broadcast, serverIpAddr, relayIp,
                INADDR_ANY /* clientIp */, yourIp, mac);
@@ -1248,6 +1270,9 @@ public abstract class DhcpPacket {
        pkt.mServerIdentifier = dhcpServerIdentifier;
        pkt.mSubnetMask = netMask;
        pkt.mBroadcastAddress = bcAddr;
        if (metered) {
            pkt.mVendorInfo = VENDOR_INFO_ANDROID_METERED;
        }
        return pkt.buildPacket(encap, DHCP_CLIENT, DHCP_SERVER);
    }

@@ -1258,7 +1283,7 @@ public abstract class DhcpPacket {
        boolean broadcast, Inet4Address serverIpAddr, Inet4Address relayIp, Inet4Address yourIp,
        byte[] mac, Integer timeout, Inet4Address netMask, Inet4Address bcAddr,
        List<Inet4Address> gateways, List<Inet4Address> dnsServers,
        Inet4Address dhcpServerIdentifier, String domainName) {
        Inet4Address dhcpServerIdentifier, String domainName, boolean metered) {
        DhcpPacket pkt = new DhcpAckPacket(
                transactionId, (short) 0, broadcast, serverIpAddr, relayIp,
                INADDR_ANY /* clientIp */, yourIp, mac);
@@ -1269,6 +1294,9 @@ public abstract class DhcpPacket {
        pkt.mSubnetMask = netMask;
        pkt.mServerIdentifier = dhcpServerIdentifier;
        pkt.mBroadcastAddress = bcAddr;
        if (metered) {
            pkt.mVendorInfo = VENDOR_INFO_ANDROID_METERED;
        }
        return pkt.buildPacket(encap, DHCP_CLIENT, DHCP_SERVER);
    }

+2 −2
Original line number Diff line number Diff line
@@ -354,7 +354,7 @@ public class DhcpServer {
                request.mRelayIp, lease.getNetAddr(), request.mClientMac, timeout, prefixMask,
                broadcastAddr, new ArrayList<>(mServingParams.defaultRouters),
                new ArrayList<>(mServingParams.dnsServers),
                mServingParams.getServerInet4Addr(), null /* domainName */);
                mServingParams.getServerInet4Addr(), null /* domainName */, mServingParams.metered);

        return transmitOfferOrAckPacket(offerPacket, request, lease, clientMac, broadcastFlag);
    }
@@ -371,7 +371,7 @@ public class DhcpServer {
                mServingParams.getPrefixMaskAsAddress(), mServingParams.getBroadcastAddress(),
                new ArrayList<>(mServingParams.defaultRouters),
                new ArrayList<>(mServingParams.dnsServers),
                mServingParams.getServerInet4Addr(), null /* domainName */);
                mServingParams.getServerInet4Addr(), null /* domainName */, mServingParams.metered);

        return transmitOfferOrAckPacket(ackPacket, request, lease, clientMac, broadcastFlag);
    }
Loading