Loading services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +1 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading services/net/java/android/net/dhcp/DhcpAckPacket.java +3 −14 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); } Loading services/net/java/android/net/dhcp/DhcpNakPacket.java +4 −3 Original line number Diff line number Diff line Loading @@ -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() { Loading services/net/java/android/net/dhcp/DhcpOfferPacket.java +3 −14 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); } } services/net/java/android/net/dhcp/DhcpPacket.java +44 −13 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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. */ Loading Loading @@ -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( Loading @@ -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) { Loading Loading @@ -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; Loading @@ -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); } Loading @@ -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; Loading @@ -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); } Loading @@ -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 Loading
services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +1 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading
services/net/java/android/net/dhcp/DhcpAckPacket.java +3 −14 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); } Loading
services/net/java/android/net/dhcp/DhcpNakPacket.java +4 −3 Original line number Diff line number Diff line Loading @@ -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() { Loading
services/net/java/android/net/dhcp/DhcpOfferPacket.java +3 −14 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); } }
services/net/java/android/net/dhcp/DhcpPacket.java +44 −13 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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. */ Loading Loading @@ -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( Loading @@ -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) { Loading Loading @@ -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; Loading @@ -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); } Loading @@ -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; Loading @@ -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); } Loading @@ -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