Loading services/net/java/android/net/dhcp/DhcpPacket.java +17 −2 Original line number Diff line number Diff line Loading @@ -291,6 +291,11 @@ abstract class DhcpPacket { */ abstract void finishPacket(ByteBuffer buffer); // Set in unit tests, to ensure that the test does not break when run on different devices and // on different releases. static String testOverrideVendorId = null; static String testOverrideHostname = null; protected DhcpPacket(int transId, short secs, Inet4Address clientIp, Inet4Address yourIp, Inet4Address nextIp, Inet4Address relayIp, byte[] clientMac, boolean broadcast) { Loading Loading @@ -593,6 +598,16 @@ abstract class DhcpPacket { buf.put((byte) 0xFF); } private String getVendorId() { if (testOverrideVendorId != null) return testOverrideVendorId; return "android-dhcp-" + Build.VERSION.RELEASE; } private String getHostname() { if (testOverrideHostname != null) return testOverrideHostname; return SystemProperties.get("net.hostname"); } /** * Adds common client TLVs. * Loading @@ -601,8 +616,8 @@ abstract class DhcpPacket { */ protected void addCommonClientTlvs(ByteBuffer buf) { addTlv(buf, DHCP_MAX_MESSAGE_SIZE, (short) MAX_LENGTH); addTlv(buf, DHCP_VENDOR_CLASS_ID, "android-dhcp-" + Build.VERSION.RELEASE); addTlv(buf, DHCP_HOST_NAME, SystemProperties.get("net.hostname")); addTlv(buf, DHCP_VENDOR_CLASS_ID, getVendorId()); addTlv(buf, DHCP_HOST_NAME, getHostname()); } /** Loading services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java +95 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import java.util.ArrayList; import junit.framework.TestCase; import libcore.util.HexEncoding; import java.util.Arrays; import static android.net.dhcp.DhcpPacket.*; Loading @@ -47,6 +48,11 @@ public class DhcpPacketTest extends TestCase { return (Inet4Address) NetworkUtils.numericToInetAddress(addrString); } public void setUp() { DhcpPacket.testOverrideVendorId = "android-dhcp-???"; DhcpPacket.testOverrideHostname = "android-01234567890abcde"; } class TestDhcpPacket extends DhcpPacket { private byte mType; // TODO: Make this a map of option numbers to bytes instead. Loading Loading @@ -584,4 +590,93 @@ public class DhcpPacketTest extends TestCase { assertDhcpResults("192.168.189.49/24", "192.168.189.1", "8.8.8.8,8.8.4.4", null, "192.171.189.2", null, 28800, false, dhcpResults); } @SmallTest public void testDiscoverPacket() throws Exception { short secs = 7; int transactionId = 0xdeadbeef; byte[] hwaddr = { (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a }; byte[] params = new byte[] { DHCP_SUBNET_MASK, DHCP_ROUTER, DHCP_DNS_SERVER, DHCP_DOMAIN_NAME, DHCP_MTU, DHCP_LEASE_TIME, }; ByteBuffer packet = DhcpPacket.buildDiscoverPacket( DhcpPacket.ENCAP_L2, transactionId, secs, hwaddr, false /* do unicast */, params); byte[] headers = new byte[] { // Ethernet header. (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a, (byte) 0x08, (byte) 0x00, // IP header. (byte) 0x45, (byte) 0x10, (byte) 0x01, (byte) 0x52, (byte) 0x00, (byte) 0x00, (byte) 0x40, (byte) 0x00, (byte) 0x40, (byte) 0x11, (byte) 0x39, (byte) 0x8c, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, // UDP header. (byte) 0x00, (byte) 0x44, (byte) 0x00, (byte) 0x43, (byte) 0x01, (byte) 0x3e, (byte) 0xd8, (byte) 0xa4, // BOOTP. (byte) 0x01, (byte) 0x01, (byte) 0x06, (byte) 0x00, (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef, (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a }; byte[] options = new byte[] { // Magic cookie 0x63825363. (byte) 0x63, (byte) 0x82, (byte) 0x53, (byte) 0x63, // Message type DISCOVER. (byte) 0x35, (byte) 0x01, (byte) 0x01, // Client identifier Ethernet, da:01:19:5b:b1:7a. (byte) 0x3d, (byte) 0x07, (byte) 0x01, (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a, // Max message size 1500. (byte) 0x39, (byte) 0x02, (byte) 0x05, (byte) 0xdc, // Version "android-dhcp-???". (byte) 0x3c, (byte) 0x10, 'a', 'n', 'd', 'r', 'o', 'i', 'd', '-', 'd', 'h', 'c', 'p', '-', '?', '?', '?', // Hostname "android-01234567890abcde" (byte) 0x0c, (byte) 0x18, 'a', 'n', 'd', 'r', 'o', 'i', 'd', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', // Requested parameter list. (byte) 0x37, (byte) 0x06, DHCP_SUBNET_MASK, DHCP_ROUTER, DHCP_DNS_SERVER, DHCP_DOMAIN_NAME, DHCP_MTU, DHCP_LEASE_TIME, // End options. (byte) 0xff, // Our packets are always of even length. TODO: find out why and possibly fix it. (byte) 0x00 }; byte[] expected = new byte[DhcpPacket.MIN_PACKET_LENGTH_L2 + options.length]; assertTrue((expected.length & 1) == 0); System.arraycopy(headers, 0, expected, 0, headers.length); System.arraycopy(options, 0, expected, DhcpPacket.MIN_PACKET_LENGTH_L2, options.length); byte[] actual = new byte[packet.limit()]; packet.get(actual); String msg = "Expected:\n " + Arrays.toString(expected) + "\nActual:\n " + Arrays.toString(actual); assertTrue(msg, Arrays.equals(expected, actual)); } } Loading
services/net/java/android/net/dhcp/DhcpPacket.java +17 −2 Original line number Diff line number Diff line Loading @@ -291,6 +291,11 @@ abstract class DhcpPacket { */ abstract void finishPacket(ByteBuffer buffer); // Set in unit tests, to ensure that the test does not break when run on different devices and // on different releases. static String testOverrideVendorId = null; static String testOverrideHostname = null; protected DhcpPacket(int transId, short secs, Inet4Address clientIp, Inet4Address yourIp, Inet4Address nextIp, Inet4Address relayIp, byte[] clientMac, boolean broadcast) { Loading Loading @@ -593,6 +598,16 @@ abstract class DhcpPacket { buf.put((byte) 0xFF); } private String getVendorId() { if (testOverrideVendorId != null) return testOverrideVendorId; return "android-dhcp-" + Build.VERSION.RELEASE; } private String getHostname() { if (testOverrideHostname != null) return testOverrideHostname; return SystemProperties.get("net.hostname"); } /** * Adds common client TLVs. * Loading @@ -601,8 +616,8 @@ abstract class DhcpPacket { */ protected void addCommonClientTlvs(ByteBuffer buf) { addTlv(buf, DHCP_MAX_MESSAGE_SIZE, (short) MAX_LENGTH); addTlv(buf, DHCP_VENDOR_CLASS_ID, "android-dhcp-" + Build.VERSION.RELEASE); addTlv(buf, DHCP_HOST_NAME, SystemProperties.get("net.hostname")); addTlv(buf, DHCP_VENDOR_CLASS_ID, getVendorId()); addTlv(buf, DHCP_HOST_NAME, getHostname()); } /** Loading
services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java +95 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import java.util.ArrayList; import junit.framework.TestCase; import libcore.util.HexEncoding; import java.util.Arrays; import static android.net.dhcp.DhcpPacket.*; Loading @@ -47,6 +48,11 @@ public class DhcpPacketTest extends TestCase { return (Inet4Address) NetworkUtils.numericToInetAddress(addrString); } public void setUp() { DhcpPacket.testOverrideVendorId = "android-dhcp-???"; DhcpPacket.testOverrideHostname = "android-01234567890abcde"; } class TestDhcpPacket extends DhcpPacket { private byte mType; // TODO: Make this a map of option numbers to bytes instead. Loading Loading @@ -584,4 +590,93 @@ public class DhcpPacketTest extends TestCase { assertDhcpResults("192.168.189.49/24", "192.168.189.1", "8.8.8.8,8.8.4.4", null, "192.171.189.2", null, 28800, false, dhcpResults); } @SmallTest public void testDiscoverPacket() throws Exception { short secs = 7; int transactionId = 0xdeadbeef; byte[] hwaddr = { (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a }; byte[] params = new byte[] { DHCP_SUBNET_MASK, DHCP_ROUTER, DHCP_DNS_SERVER, DHCP_DOMAIN_NAME, DHCP_MTU, DHCP_LEASE_TIME, }; ByteBuffer packet = DhcpPacket.buildDiscoverPacket( DhcpPacket.ENCAP_L2, transactionId, secs, hwaddr, false /* do unicast */, params); byte[] headers = new byte[] { // Ethernet header. (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a, (byte) 0x08, (byte) 0x00, // IP header. (byte) 0x45, (byte) 0x10, (byte) 0x01, (byte) 0x52, (byte) 0x00, (byte) 0x00, (byte) 0x40, (byte) 0x00, (byte) 0x40, (byte) 0x11, (byte) 0x39, (byte) 0x8c, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, // UDP header. (byte) 0x00, (byte) 0x44, (byte) 0x00, (byte) 0x43, (byte) 0x01, (byte) 0x3e, (byte) 0xd8, (byte) 0xa4, // BOOTP. (byte) 0x01, (byte) 0x01, (byte) 0x06, (byte) 0x00, (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef, (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a }; byte[] options = new byte[] { // Magic cookie 0x63825363. (byte) 0x63, (byte) 0x82, (byte) 0x53, (byte) 0x63, // Message type DISCOVER. (byte) 0x35, (byte) 0x01, (byte) 0x01, // Client identifier Ethernet, da:01:19:5b:b1:7a. (byte) 0x3d, (byte) 0x07, (byte) 0x01, (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a, // Max message size 1500. (byte) 0x39, (byte) 0x02, (byte) 0x05, (byte) 0xdc, // Version "android-dhcp-???". (byte) 0x3c, (byte) 0x10, 'a', 'n', 'd', 'r', 'o', 'i', 'd', '-', 'd', 'h', 'c', 'p', '-', '?', '?', '?', // Hostname "android-01234567890abcde" (byte) 0x0c, (byte) 0x18, 'a', 'n', 'd', 'r', 'o', 'i', 'd', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', // Requested parameter list. (byte) 0x37, (byte) 0x06, DHCP_SUBNET_MASK, DHCP_ROUTER, DHCP_DNS_SERVER, DHCP_DOMAIN_NAME, DHCP_MTU, DHCP_LEASE_TIME, // End options. (byte) 0xff, // Our packets are always of even length. TODO: find out why and possibly fix it. (byte) 0x00 }; byte[] expected = new byte[DhcpPacket.MIN_PACKET_LENGTH_L2 + options.length]; assertTrue((expected.length & 1) == 0); System.arraycopy(headers, 0, expected, 0, headers.length); System.arraycopy(options, 0, expected, DhcpPacket.MIN_PACKET_LENGTH_L2, options.length); byte[] actual = new byte[packet.limit()]; packet.get(actual); String msg = "Expected:\n " + Arrays.toString(expected) + "\nActual:\n " + Arrays.toString(actual); assertTrue(msg, Arrays.equals(expected, actual)); } }