Merge "Handle v4-mapped v6 address in Struct parsing" into main

This commit is contained in:
Motomu Utsumi
2023-10-31 12:02:47 +00:00
committed by Gerrit Code Review
2 changed files with 16 additions and 1 deletions

View File

@@ -422,7 +422,14 @@ public class Struct {
final byte[] address = new byte[isIpv6 ? 16 : 4]; final byte[] address = new byte[isIpv6 ? 16 : 4];
buf.get(address); buf.get(address);
try { try {
if (isIpv6) {
// Using Inet6Address.getByAddress since InetAddress.getByAddress converts
// v4-mapped v6 address to v4 address internally and returns Inet4Address.
value = Inet6Address.getByAddress(
null /* host */, address, -1 /* scope_id */);
} else {
value = InetAddress.getByAddress(address); value = InetAddress.getByAddress(address);
}
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
throw new IllegalArgumentException("illegal length of IP address", e); throw new IllegalArgumentException("illegal length of IP address", e);
} }

View File

@@ -765,6 +765,14 @@ public class StructTest {
msg.writeToBytes(ByteOrder.BIG_ENDIAN)); msg.writeToBytes(ByteOrder.BIG_ENDIAN));
} }
@Test
public void testV4MappedV6Address() {
final IpAddressMessage msg = doParsingMessageTest("c0a86401"
+ "00000000000000000000ffffc0a86401", IpAddressMessage.class, ByteOrder.BIG_ENDIAN);
assertEquals(TEST_IPV4_ADDRESS, msg.ipv4Address);
assertEquals(InetAddressUtils.v4MappedV6Address(TEST_IPV4_ADDRESS), msg.ipv6Address);
}
public static class WrongIpAddressType extends Struct { public static class WrongIpAddressType extends Struct {
@Field(order = 0, type = Type.Ipv4Address) public byte[] ipv4Address; @Field(order = 0, type = Type.Ipv4Address) public byte[] ipv4Address;
@Field(order = 1, type = Type.Ipv6Address) public byte[] ipv6Address; @Field(order = 1, type = Type.Ipv6Address) public byte[] ipv6Address;