Merge changes Ia9865c75,I47d9d53d,Idbe10c36

* changes:
  Fix some checkstyle nits in DhcpPacketTest.
  Additional code for server name in DHCP packets.
  Parse the server host name field of the dhcp package
This commit is contained in:
Lorenzo Colitti
2019-04-29 00:50:30 +00:00
committed by Gerrit Code Review
6 changed files with 89 additions and 18 deletions

View File

@@ -64,6 +64,8 @@ public final class DhcpResults implements Parcelable {
@UnsupportedAppUsage @UnsupportedAppUsage
public int mtu; public int mtu;
public String serverHostName;
public DhcpResults() { public DhcpResults() {
super(); super();
} }
@@ -97,6 +99,7 @@ public final class DhcpResults implements Parcelable {
vendorInfo = source.vendorInfo; vendorInfo = source.vendorInfo;
leaseDuration = source.leaseDuration; leaseDuration = source.leaseDuration;
mtu = source.mtu; mtu = source.mtu;
serverHostName = source.serverHostName;
} }
} }
@@ -129,6 +132,7 @@ public final class DhcpResults implements Parcelable {
vendorInfo = null; vendorInfo = null;
leaseDuration = 0; leaseDuration = 0;
mtu = 0; mtu = 0;
serverHostName = null;
} }
@Override @Override
@@ -139,6 +143,7 @@ public final class DhcpResults implements Parcelable {
str.append(" Vendor info ").append(vendorInfo); str.append(" Vendor info ").append(vendorInfo);
str.append(" lease ").append(leaseDuration).append(" seconds"); str.append(" lease ").append(leaseDuration).append(" seconds");
if (mtu != 0) str.append(" MTU ").append(mtu); if (mtu != 0) str.append(" MTU ").append(mtu);
str.append(" Servername ").append(serverHostName);
return str.toString(); return str.toString();
} }
@@ -154,6 +159,7 @@ public final class DhcpResults implements Parcelable {
return toStaticIpConfiguration().equals(target.toStaticIpConfiguration()) return toStaticIpConfiguration().equals(target.toStaticIpConfiguration())
&& Objects.equals(serverAddress, target.serverAddress) && Objects.equals(serverAddress, target.serverAddress)
&& Objects.equals(vendorInfo, target.vendorInfo) && Objects.equals(vendorInfo, target.vendorInfo)
&& Objects.equals(serverHostName, target.serverHostName)
&& leaseDuration == target.leaseDuration && leaseDuration == target.leaseDuration
&& mtu == target.mtu; && mtu == target.mtu;
} }
@@ -179,6 +185,7 @@ public final class DhcpResults implements Parcelable {
dest.writeInt(mtu); dest.writeInt(mtu);
InetAddressUtils.parcelInetAddress(dest, serverAddress, flags); InetAddressUtils.parcelInetAddress(dest, serverAddress, flags);
dest.writeString(vendorInfo); dest.writeString(vendorInfo);
dest.writeString(serverHostName);
} }
@Override @Override
@@ -193,6 +200,7 @@ public final class DhcpResults implements Parcelable {
dhcpResults.mtu = in.readInt(); dhcpResults.mtu = in.readInt();
dhcpResults.serverAddress = (Inet4Address) InetAddressUtils.unparcelInetAddress(in); dhcpResults.serverAddress = (Inet4Address) InetAddressUtils.unparcelInetAddress(in);
dhcpResults.vendorInfo = in.readString(); dhcpResults.vendorInfo = in.readString();
dhcpResults.serverHostName = in.readString();
return dhcpResults; return dhcpResults;
} }

View File

@@ -194,6 +194,18 @@ public abstract class DhcpPacket {
*/ */
public static final String VENDOR_INFO_ANDROID_METERED = "ANDROID_METERED"; public static final String VENDOR_INFO_ANDROID_METERED = "ANDROID_METERED";
/**
* DHCP Optional Type: Option overload option
*/
protected static final byte DHCP_OPTION_OVERLOAD = 52;
/**
* Possible values of the option overload option.
*/
private static final byte OPTION_OVERLOAD_FILE = 1;
private static final byte OPTION_OVERLOAD_SNAME = 2;
private static final byte OPTION_OVERLOAD_BOTH = 3;
/** /**
* DHCP Optional Type: DHCP Requested IP Address * DHCP Optional Type: DHCP Requested IP Address
*/ */
@@ -308,6 +320,11 @@ public abstract class DhcpPacket {
*/ */
protected final byte[] mClientMac; protected final byte[] mClientMac;
/**
* The server host name from server.
*/
protected String mServerHostName;
/** /**
* Asks the packet object to create a ByteBuffer serialization of * Asks the packet object to create a ByteBuffer serialization of
* the packet for transmission. * the packet for transmission.
@@ -848,6 +865,8 @@ public abstract class DhcpPacket {
Inet4Address ipDst = null; Inet4Address ipDst = null;
Inet4Address bcAddr = null; Inet4Address bcAddr = null;
Inet4Address requestedIp = null; Inet4Address requestedIp = null;
String serverHostName;
byte optionOverload = 0;
// The following are all unsigned integers. Internally we store them as signed integers of // The following are all unsigned integers. Internally we store them as signed integers of
// the same length because that way we're guaranteed that they can't be out of the range of // the same length because that way we're guaranteed that they can't be out of the range of
@@ -989,9 +1008,9 @@ public abstract class DhcpPacket {
packet.get(clientMac); packet.get(clientMac);
// skip over address padding (16 octets allocated) // skip over address padding (16 octets allocated)
packet.position(packet.position() + (16 - addrLen) packet.position(packet.position() + (16 - addrLen));
+ 64 // skip server host name (64 chars) serverHostName = readAsciiString(packet, 64, false);
+ 128); // skip boot file name (128 chars) packet.position(packet.position() + 128);
// Ensure this is a DHCP packet with a magic cookie, and not BOOTP. http://b/31850211 // Ensure this is a DHCP packet with a magic cookie, and not BOOTP. http://b/31850211
if (packet.remaining() < 4) { if (packet.remaining() < 4) {
@@ -1102,6 +1121,11 @@ public abstract class DhcpPacket {
// Embedded nulls are safe as this does not get passed to netd. // Embedded nulls are safe as this does not get passed to netd.
vendorInfo = readAsciiString(packet, optionLen, true); vendorInfo = readAsciiString(packet, optionLen, true);
break; break;
case DHCP_OPTION_OVERLOAD:
expectedLen = 1;
optionOverload = packet.get();
optionOverload &= OPTION_OVERLOAD_BOTH;
break;
default: default:
// ignore any other parameters // ignore any other parameters
for (int i = 0; i < optionLen; i++) { for (int i = 0; i < optionLen; i++) {
@@ -1192,6 +1216,11 @@ public abstract class DhcpPacket {
newPacket.mT2 = T2; newPacket.mT2 = T2;
newPacket.mVendorId = vendorId; newPacket.mVendorId = vendorId;
newPacket.mVendorInfo = vendorInfo; newPacket.mVendorInfo = vendorInfo;
if ((optionOverload & OPTION_OVERLOAD_SNAME) == 0) {
newPacket.mServerHostName = serverHostName;
} else {
newPacket.mServerHostName = "";
}
return newPacket; return newPacket;
} }
@@ -1251,6 +1280,7 @@ public abstract class DhcpPacket {
results.vendorInfo = mVendorInfo; results.vendorInfo = mVendorInfo;
results.leaseDuration = (mLeaseTime != null) ? mLeaseTime : INFINITE_LEASE; results.leaseDuration = (mLeaseTime != null) ? mLeaseTime : INFINITE_LEASE;
results.mtu = (mMtu != null && MIN_MTU <= mMtu && mMtu <= MAX_MTU) ? mMtu : 0; results.mtu = (mMtu != null && MIN_MTU <= mMtu && mMtu <= MAX_MTU) ? mMtu : 0;
results.serverHostName = mServerHostName;
return results; return results;
} }

View File

@@ -302,8 +302,9 @@ public class DhcpPacketTest {
} }
private void assertDhcpResults(String ipAddress, String gateway, String dnsServersString, private void assertDhcpResults(String ipAddress, String gateway, String dnsServersString,
String domains, String serverAddress, String vendorInfo, int leaseDuration, String domains, String serverAddress, String serverHostName, String vendorInfo,
boolean hasMeteredHint, int mtu, DhcpResults dhcpResults) throws Exception { int leaseDuration, boolean hasMeteredHint, int mtu, DhcpResults dhcpResults)
throws Exception {
assertEquals(new LinkAddress(ipAddress), dhcpResults.ipAddress); assertEquals(new LinkAddress(ipAddress), dhcpResults.ipAddress);
assertEquals(v4Address(gateway), dhcpResults.gateway); assertEquals(v4Address(gateway), dhcpResults.gateway);
@@ -316,6 +317,7 @@ public class DhcpPacketTest {
assertEquals(domains, dhcpResults.domains); assertEquals(domains, dhcpResults.domains);
assertEquals(v4Address(serverAddress), dhcpResults.serverAddress); assertEquals(v4Address(serverAddress), dhcpResults.serverAddress);
assertEquals(serverHostName, dhcpResults.serverHostName);
assertEquals(vendorInfo, dhcpResults.vendorInfo); assertEquals(vendorInfo, dhcpResults.vendorInfo);
assertEquals(leaseDuration, dhcpResults.leaseDuration); assertEquals(leaseDuration, dhcpResults.leaseDuration);
assertEquals(hasMeteredHint, dhcpResults.hasMeteredHint()); assertEquals(hasMeteredHint, dhcpResults.hasMeteredHint());
@@ -327,6 +329,7 @@ public class DhcpPacketTest {
// TODO: Turn all of these into golden files. This will probably require using // TODO: Turn all of these into golden files. This will probably require using
// androidx.test.InstrumentationRegistry for obtaining a Context object // androidx.test.InstrumentationRegistry for obtaining a Context object
// to read such golden files, along with an appropriate Android.mk. // to read such golden files, along with an appropriate Android.mk.
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header. // IP header.
"451001480000000080118849c0a89003c0a89ff7" + "451001480000000080118849c0a89003c0a89ff7" +
@@ -347,16 +350,18 @@ public class DhcpPacketTest {
// Options // Options
"638253633501023604c0a89003330400001c200104fffff0000304c0a89ffe06080808080808080404" + "638253633501023604c0a89003330400001c200104fffff0000304c0a89ffe06080808080808080404" +
"3a0400000e103b040000189cff00000000000000000000")); "3a0400000e103b040000189cff00000000000000000000"));
// CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3); DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3);
assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null. assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null.
DhcpResults dhcpResults = offerPacket.toDhcpResults(); DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("192.168.159.247/20", "192.168.159.254", "8.8.8.8,8.8.4.4", assertDhcpResults("192.168.159.247/20", "192.168.159.254", "8.8.8.8,8.8.4.4",
null, "192.168.144.3", null, 7200, false, 0, dhcpResults); null, "192.168.144.3", "", null, 7200, false, 0, dhcpResults);
} }
@Test @Test
public void testOffer2() throws Exception { public void testOffer2() throws Exception {
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header. // IP header.
"450001518d0600004011144dc0a82b01c0a82bf7" + "450001518d0600004011144dc0a82b01c0a82bf7" +
@@ -366,9 +371,9 @@ public class DhcpPacketTest {
"02010600dfc23d1f0002000000000000c0a82bf7c0a82b0100000000" + "02010600dfc23d1f0002000000000000c0a82bf7c0a82b0100000000" +
// MAC address. // MAC address.
"30766ff2a90c00000000000000000000" + "30766ff2a90c00000000000000000000" +
// Server name. // Server name ("dhcp.android.com" plus invalid "AAAA" after null terminator).
"0000000000000000000000000000000000000000000000000000000000000000" + "646863702e616e64726f69642e636f6d00000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000" + "0000000000004141414100000000000000000000000000000000000000000000" +
// File. // File.
"0000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000" +
@@ -377,13 +382,15 @@ public class DhcpPacketTest {
// Options // Options
"638253633501023604c0a82b01330400000e103a04000007083b0400000c4e0104ffffff00" + "638253633501023604c0a82b01330400000e103a04000007083b0400000c4e0104ffffff00" +
"1c04c0a82bff0304c0a82b010604c0a82b012b0f414e44524f49445f4d455445524544ff")); "1c04c0a82bff0304c0a82b010604c0a82b012b0f414e44524f49445f4d455445524544ff"));
// CHECKSTYLE:ON Generated code
assertEquals(337, packet.limit()); assertEquals(337, packet.limit());
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3); DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3);
assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null. assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null.
DhcpResults dhcpResults = offerPacket.toDhcpResults(); DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("192.168.43.247/24", "192.168.43.1", "192.168.43.1", assertDhcpResults("192.168.43.247/24", "192.168.43.1", "192.168.43.1",
null, "192.168.43.1", "ANDROID_METERED", 3600, true, 0, dhcpResults); null, "192.168.43.1", "dhcp.android.com", "ANDROID_METERED", 3600, true, 0,
dhcpResults);
assertTrue(dhcpResults.hasMeteredHint()); assertTrue(dhcpResults.hasMeteredHint());
} }
@@ -588,11 +595,12 @@ public class DhcpPacketTest {
assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null. assertTrue(offerPacket instanceof DhcpOfferPacket); // Implicitly checks it's non-null.
DhcpResults dhcpResults = offerPacket.toDhcpResults(); DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("192.168.159.247/20", "192.168.159.254", "8.8.8.8,8.8.4.4", assertDhcpResults("192.168.159.247/20", "192.168.159.254", "8.8.8.8,8.8.4.4",
null, "192.168.144.3", null, 7200, false, expectedMtu, dhcpResults); null, "192.168.144.3", "", null, 7200, false, expectedMtu, dhcpResults);
} }
@Test @Test
public void testMtu() throws Exception { public void testMtu() throws Exception {
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header. // IP header.
"451001480000000080118849c0a89003c0a89ff7" + "451001480000000080118849c0a89003c0a89ff7" +
@@ -613,6 +621,7 @@ public class DhcpPacketTest {
// Options // Options
"638253633501023604c0a89003330400001c200104fffff0000304c0a89ffe06080808080808080404" + "638253633501023604c0a89003330400001c200104fffff0000304c0a89ffe06080808080808080404" +
"3a0400000e103b040000189cff00000000")); "3a0400000e103b040000189cff00000000"));
// CHECKSTYLE:ON Generated code
checkMtu(packet, 0, null); checkMtu(packet, 0, null);
checkMtu(packet, 0, mtuBytes(1501)); checkMtu(packet, 0, mtuBytes(1501));
@@ -629,6 +638,7 @@ public class DhcpPacketTest {
@Test @Test
public void testBadHwaddrLength() throws Exception { public void testBadHwaddrLength() throws Exception {
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header. // IP header.
"450001518d0600004011144dc0a82b01c0a82bf7" + "450001518d0600004011144dc0a82b01c0a82bf7" +
@@ -649,6 +659,7 @@ public class DhcpPacketTest {
// Options // Options
"638253633501023604c0a82b01330400000e103a04000007083b0400000c4e0104ffffff00" + "638253633501023604c0a82b01330400000e103a04000007083b0400000c4e0104ffffff00" +
"1c04c0a82bff0304c0a82b010604c0a82b012b0f414e44524f49445f4d455445524544ff")); "1c04c0a82bff0304c0a82b010604c0a82b012b0f414e44524f49445f4d455445524544ff"));
// CHECKSTYLE:ON Generated code
String expectedClientMac = "30766FF2A90C"; String expectedClientMac = "30766FF2A90C";
final int hwAddrLenOffset = 20 + 8 + 2; final int hwAddrLenOffset = 20 + 8 + 2;
@@ -705,6 +716,7 @@ public class DhcpPacketTest {
// store any information in the overloaded fields). // store any information in the overloaded fields).
// //
// For now, we just check that it parses correctly. // For now, we just check that it parses correctly.
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header. // Ethernet header.
"b4cef6000000e80462236e300800" + "b4cef6000000e80462236e300800" +
@@ -727,16 +739,18 @@ public class DhcpPacketTest {
// Options // Options
"638253633501023604010101010104ffff000033040000a8c03401030304ac1101010604ac110101" + "638253633501023604010101010104ffff000033040000a8c03401030304ac1101010604ac110101" +
"0000000000000000000000000000000000000000000000ff000000")); "0000000000000000000000000000000000000000000000ff000000"));
// CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2); DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
assertTrue(offerPacket instanceof DhcpOfferPacket); assertTrue(offerPacket instanceof DhcpOfferPacket);
DhcpResults dhcpResults = offerPacket.toDhcpResults(); DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("172.17.152.118/16", "172.17.1.1", "172.17.1.1", assertDhcpResults("172.17.152.118/16", "172.17.1.1", "172.17.1.1",
null, "1.1.1.1", null, 43200, false, 0, dhcpResults); null, "1.1.1.1", "", null, 43200, false, 0, dhcpResults);
} }
@Test @Test
public void testBug2111() throws Exception { public void testBug2111() throws Exception {
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header. // IP header.
"4500014c00000000ff119beac3eaf3880a3f5d04" + "4500014c00000000ff119beac3eaf3880a3f5d04" +
@@ -757,16 +771,18 @@ public class DhcpPacketTest {
// Options. // Options.
"638253633501023604c00002fe33040000bfc60104fffff00003040a3f50010608c0000201c0000202" + "638253633501023604c00002fe33040000bfc60104fffff00003040a3f50010608c0000201c0000202" +
"0f0f646f6d61696e3132332e636f2e756b0000000000ff00000000")); "0f0f646f6d61696e3132332e636f2e756b0000000000ff00000000"));
// CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3); DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3);
assertTrue(offerPacket instanceof DhcpOfferPacket); assertTrue(offerPacket instanceof DhcpOfferPacket);
DhcpResults dhcpResults = offerPacket.toDhcpResults(); DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("10.63.93.4/20", "10.63.80.1", "192.0.2.1,192.0.2.2", assertDhcpResults("10.63.93.4/20", "10.63.80.1", "192.0.2.1,192.0.2.2",
"domain123.co.uk", "192.0.2.254", null, 49094, false, 0, dhcpResults); "domain123.co.uk", "192.0.2.254", "", null, 49094, false, 0, dhcpResults);
} }
@Test @Test
public void testBug2136() throws Exception { public void testBug2136() throws Exception {
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header. // Ethernet header.
"bcf5ac000000d0c7890000000800" + "bcf5ac000000d0c7890000000800" +
@@ -789,17 +805,19 @@ public class DhcpPacketTest {
// Options. // Options.
"6382536335010236040a20ff80330400001c200104fffff00003040a20900106089458413494584135" + "6382536335010236040a20ff80330400001c200104fffff00003040a20900106089458413494584135" +
"0f0b6c616e63732e61632e756b000000000000000000ff00000000")); "0f0b6c616e63732e61632e756b000000000000000000ff00000000"));
// CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2); DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
assertTrue(offerPacket instanceof DhcpOfferPacket); assertTrue(offerPacket instanceof DhcpOfferPacket);
assertEquals("BCF5AC000000", HexDump.toHexString(offerPacket.getClientMac())); assertEquals("BCF5AC000000", HexDump.toHexString(offerPacket.getClientMac()));
DhcpResults dhcpResults = offerPacket.toDhcpResults(); DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("10.32.158.205/20", "10.32.144.1", "148.88.65.52,148.88.65.53", assertDhcpResults("10.32.158.205/20", "10.32.144.1", "148.88.65.52,148.88.65.53",
"lancs.ac.uk", "10.32.255.128", null, 7200, false, 0, dhcpResults); "lancs.ac.uk", "10.32.255.128", "", null, 7200, false, 0, dhcpResults);
} }
@Test @Test
public void testUdpServerAnySourcePort() throws Exception { public void testUdpServerAnySourcePort() throws Exception {
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header. // Ethernet header.
"9cd917000000001c2e0000000800" + "9cd917000000001c2e0000000800" +
@@ -823,6 +841,7 @@ public class DhcpPacketTest {
// Options. // Options.
"6382536335010236040a0169fc3304000151800104ffff000003040a0fc817060cd1818003d1819403" + "6382536335010236040a0169fc3304000151800104ffff000003040a0fc817060cd1818003d1819403" +
"d18180060f0777766d2e6564751c040a0fffffff000000")); "d18180060f0777766d2e6564751c040a0fffffff000000"));
// CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2); DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
assertTrue(offerPacket instanceof DhcpOfferPacket); assertTrue(offerPacket instanceof DhcpOfferPacket);
@@ -830,11 +849,12 @@ public class DhcpPacketTest {
DhcpResults dhcpResults = offerPacket.toDhcpResults(); DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("10.15.122.242/16", "10.15.200.23", assertDhcpResults("10.15.122.242/16", "10.15.200.23",
"209.129.128.3,209.129.148.3,209.129.128.6", "209.129.128.3,209.129.148.3,209.129.128.6",
"wvm.edu", "10.1.105.252", null, 86400, false, 0, dhcpResults); "wvm.edu", "10.1.105.252", "", null, 86400, false, 0, dhcpResults);
} }
@Test @Test
public void testUdpInvalidDstPort() throws Exception { public void testUdpInvalidDstPort() throws Exception {
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header. // Ethernet header.
"9cd917000000001c2e0000000800" + "9cd917000000001c2e0000000800" +
@@ -858,6 +878,7 @@ public class DhcpPacketTest {
// Options. // Options.
"6382536335010236040a0169fc3304000151800104ffff000003040a0fc817060cd1818003d1819403" + "6382536335010236040a0169fc3304000151800104ffff000003040a0fc817060cd1818003d1819403" +
"d18180060f0777766d2e6564751c040a0fffffff000000")); "d18180060f0777766d2e6564751c040a0fffffff000000"));
// CHECKSTYLE:ON Generated code
try { try {
DhcpPacket.decodeFullPacket(packet, ENCAP_L2); DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
@@ -867,6 +888,7 @@ public class DhcpPacketTest {
@Test @Test
public void testMultipleRouters() throws Exception { public void testMultipleRouters() throws Exception {
// CHECKSTYLE:OFF Generated code
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray( final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// Ethernet header. // Ethernet header.
"fc3d93000000" + "081735000000" + "0800" + "fc3d93000000" + "081735000000" + "0800" +
@@ -889,13 +911,14 @@ public class DhcpPacketTest {
// Options. // Options.
"638253633501023604c0abbd023304000070803a04000038403b04000062700104ffffff00" + "638253633501023604c0abbd023304000070803a04000038403b04000062700104ffffff00" +
"0308c0a8bd01ffffff0006080808080808080404ff000000000000")); "0308c0a8bd01ffffff0006080808080808080404ff000000000000"));
// CHECKSTYLE:ON Generated code
DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2); DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2);
assertTrue(offerPacket instanceof DhcpOfferPacket); assertTrue(offerPacket instanceof DhcpOfferPacket);
assertEquals("FC3D93000000", HexDump.toHexString(offerPacket.getClientMac())); assertEquals("FC3D93000000", HexDump.toHexString(offerPacket.getClientMac()));
DhcpResults dhcpResults = offerPacket.toDhcpResults(); DhcpResults dhcpResults = offerPacket.toDhcpResults();
assertDhcpResults("192.168.189.49/24", "192.168.189.1", "8.8.8.8,8.8.4.4", 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, 0, dhcpResults); null, "192.171.189.2", "", null, 28800, false, 0, dhcpResults);
} }
@Test @Test

View File

@@ -24,4 +24,5 @@ parcelable DhcpResultsParcelable {
int mtu; int mtu;
String serverAddress; String serverAddress;
String vendorInfo; String vendorInfo;
} String serverHostName;
}

View File

@@ -41,6 +41,7 @@ public final class IpConfigurationParcelableUtil {
p.mtu = results.mtu; p.mtu = results.mtu;
p.serverAddress = parcelAddress(results.serverAddress); p.serverAddress = parcelAddress(results.serverAddress);
p.vendorInfo = results.vendorInfo; p.vendorInfo = results.vendorInfo;
p.serverHostName = results.serverHostName;
return p; return p;
} }
@@ -54,6 +55,7 @@ public final class IpConfigurationParcelableUtil {
results.mtu = p.mtu; results.mtu = p.mtu;
results.serverAddress = (Inet4Address) unparcelAddress(p.serverAddress); results.serverAddress = (Inet4Address) unparcelAddress(p.serverAddress);
results.vendorInfo = p.vendorInfo; results.vendorInfo = p.vendorInfo;
results.serverHostName = p.serverHostName;
return results; return results;
} }

View File

@@ -55,9 +55,10 @@ public class IpConfigurationParcelableUtilTest {
mDhcpResults.serverAddress = (Inet4Address) parseNumericAddress("192.168.44.44"); mDhcpResults.serverAddress = (Inet4Address) parseNumericAddress("192.168.44.44");
mDhcpResults.vendorInfo = "TEST_VENDOR_INFO"; mDhcpResults.vendorInfo = "TEST_VENDOR_INFO";
mDhcpResults.leaseDuration = 3600; mDhcpResults.leaseDuration = 3600;
mDhcpResults.serverHostName = "dhcp.example.com";
mDhcpResults.mtu = 1450; mDhcpResults.mtu = 1450;
// Any added DhcpResults field must be included in equals() to be tested properly // Any added DhcpResults field must be included in equals() to be tested properly
assertFieldCountEquals(8, DhcpResults.class); assertFieldCountEquals(9, DhcpResults.class);
} }
@Test @Test
@@ -101,6 +102,12 @@ public class IpConfigurationParcelableUtilTest {
doDhcpResultsParcelUnparcelTest(); doDhcpResultsParcelUnparcelTest();
} }
@Test
public void testParcelUnparcelDhcpResults_NullServerHostName() {
mDhcpResults.serverHostName = null;
doDhcpResultsParcelUnparcelTest();
}
private void doDhcpResultsParcelUnparcelTest() { private void doDhcpResultsParcelUnparcelTest() {
final DhcpResults unparceled = fromStableParcelable(toStableParcelable(mDhcpResults)); final DhcpResults unparceled = fromStableParcelable(toStableParcelable(mDhcpResults));
assertEquals(mDhcpResults, unparceled); assertEquals(mDhcpResults, unparceled);