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

Commit 6717a6f9 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN Committed by Gerrit Code Review
Browse files

Merge changes I58f904d5,Ie0bf7804

* changes:
  Fix DHCP options sent by DHCP server
  Fix BOOTP fields for server-generated DHCP packets
parents b0896e61 6557a246
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) {
+3 −14
Original line number Diff line number Diff line
@@ -30,8 +30,8 @@ class DhcpAckPacket extends DhcpPacket {
    private final Inet4Address mSrcIp;

    DhcpAckPacket(int transId, short secs, boolean broadcast, Inet4Address serverAddress,
                  Inet4Address clientIp, Inet4Address yourIp, byte[] clientMac) {
        super(transId, secs, clientIp, yourIp, serverAddress, INADDR_ANY, clientMac, broadcast);
            Inet4Address relayIp, Inet4Address clientIp, Inet4Address yourIp, byte[] clientMac) {
        super(transId, secs, clientIp, yourIp, serverAddress, relayIp, clientMac, broadcast);
        mBroadcast = broadcast;
        mSrcIp = serverAddress;
    }
@@ -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);
    }

+4 −3
Original line number Diff line number Diff line
@@ -26,9 +26,10 @@ class DhcpNakPacket extends DhcpPacket {
    /**
     * Generates a NAK packet with the specified parameters.
     */
    DhcpNakPacket(int transId, short secs, Inet4Address nextIp, Inet4Address relayIp,
            byte[] clientMac, boolean broadcast) {
        super(transId, secs, INADDR_ANY, INADDR_ANY, nextIp, relayIp, clientMac, broadcast);
    DhcpNakPacket(int transId, short secs, Inet4Address relayIp, byte[] clientMac,
            boolean broadcast) {
        super(transId, secs, INADDR_ANY /* clientIp */, INADDR_ANY /* yourIp */,
                INADDR_ANY /* nextIp */, relayIp, clientMac, broadcast);
    }

    public String toString() {
+3 −14
Original line number Diff line number Diff line
@@ -32,8 +32,8 @@ class DhcpOfferPacket extends DhcpPacket {
     * Generates a OFFER packet with the specified parameters.
     */
    DhcpOfferPacket(int transId, short secs, boolean broadcast, Inet4Address serverAddress,
                    Inet4Address clientIp, Inet4Address yourIp, byte[] clientMac) {
        super(transId, secs, clientIp, yourIp, INADDR_ANY, INADDR_ANY, clientMac, broadcast);
            Inet4Address relayIp, Inet4Address clientIp, Inet4Address yourIp, byte[] clientMac) {
        super(transId, secs, clientIp, yourIp, serverAddress, relayIp, clientMac, broadcast);
        mSrcIp = serverAddress;
    }

@@ -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);
    }
}
+44 −13
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.
     */
@@ -1085,7 +1107,7 @@ public abstract class DhcpPacket {
                break;
            case DHCP_MESSAGE_TYPE_OFFER:
                newPacket = new DhcpOfferPacket(
                    transactionId, secs, broadcast, ipSrc, clientIp, yourIp, clientMac);
                    transactionId, secs, broadcast, ipSrc, relayIp, clientIp, yourIp, clientMac);
                break;
            case DHCP_MESSAGE_TYPE_REQUEST:
                newPacket = new DhcpRequestPacket(
@@ -1098,11 +1120,11 @@ public abstract class DhcpPacket {
                break;
            case DHCP_MESSAGE_TYPE_ACK:
                newPacket = new DhcpAckPacket(
                    transactionId, secs, broadcast, ipSrc, clientIp, yourIp, clientMac);
                    transactionId, secs, broadcast, ipSrc, relayIp, clientIp, yourIp, clientMac);
                break;
            case DHCP_MESSAGE_TYPE_NAK:
                newPacket = new DhcpNakPacket(
                        transactionId, secs, nextIp, relayIp, clientMac, broadcast);
                        transactionId, secs, relayIp, clientMac, broadcast);
                break;
            case DHCP_MESSAGE_TYPE_RELEASE:
                if (serverIdentifier == null) {
@@ -1234,12 +1256,13 @@ public abstract class DhcpPacket {
     * parameters.
     */
    public static ByteBuffer buildOfferPacket(int encap, int transactionId,
        boolean broadcast, Inet4Address serverIpAddr, Inet4Address clientIpAddr,
        byte[] mac, Integer timeout, Inet4Address netMask, Inet4Address bcAddr,
        List<Inet4Address> gateways, List<Inet4Address> dnsServers,
        Inet4Address dhcpServerIdentifier, String domainName) {
        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, boolean metered) {
        DhcpPacket pkt = new DhcpOfferPacket(
            transactionId, (short) 0, broadcast, serverIpAddr, INADDR_ANY, clientIpAddr, mac);
                transactionId, (short) 0, broadcast, serverIpAddr, relayIp,
                INADDR_ANY /* clientIp */, yourIp, mac);
        pkt.mGateways = gateways;
        pkt.mDnsServers = dnsServers;
        pkt.mLeaseTime = timeout;
@@ -1247,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);
    }

@@ -1254,12 +1280,13 @@ public abstract class DhcpPacket {
     * Builds a DHCP-ACK packet from the required specified parameters.
     */
    public static ByteBuffer buildAckPacket(int encap, int transactionId,
        boolean broadcast, Inet4Address serverIpAddr, Inet4Address clientIpAddr,
        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, INADDR_ANY, clientIpAddr, mac);
                transactionId, (short) 0, broadcast, serverIpAddr, relayIp,
                INADDR_ANY /* clientIp */, yourIp, mac);
        pkt.mGateways = gateways;
        pkt.mDnsServers = dnsServers;
        pkt.mLeaseTime = timeout;
@@ -1267,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);
    }

@@ -1274,10 +1304,11 @@ public abstract class DhcpPacket {
     * Builds a DHCP-NAK packet from the required specified parameters.
     */
    public static ByteBuffer buildNakPacket(int encap, int transactionId, Inet4Address serverIpAddr,
            byte[] mac, boolean broadcast, String message) {
            Inet4Address relayIp, byte[] mac, boolean broadcast, String message) {
        DhcpPacket pkt = new DhcpNakPacket(
                transactionId, (short) 0, serverIpAddr, serverIpAddr, mac, broadcast);
                transactionId, (short) 0, relayIp, mac, broadcast);
        pkt.mMessage = message;
        pkt.mServerIdentifier = serverIpAddr;
        return pkt.buildPacket(encap, DHCP_CLIENT, DHCP_SERVER);
    }

Loading