diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsPacket.java b/service-t/src/com/android/server/connectivity/mdns/MdnsPacket.java index 7fa3f845ea4c15cf3ff7c70917cd6e6da3caa256..1fabd4987c7163b958010badbb531a385938af45 100644 --- a/service-t/src/com/android/server/connectivity/mdns/MdnsPacket.java +++ b/service-t/src/com/android/server/connectivity/mdns/MdnsPacket.java @@ -31,6 +31,7 @@ import java.util.List; public class MdnsPacket { private static final String TAG = MdnsPacket.class.getSimpleName(); + public final int transactionId; public final int flags; @NonNull public final List<MdnsRecord> questions; @@ -46,6 +47,15 @@ public class MdnsPacket { @NonNull List<MdnsRecord> answers, @NonNull List<MdnsRecord> authorityRecords, @NonNull List<MdnsRecord> additionalRecords) { + this(0, flags, questions, answers, authorityRecords, additionalRecords); + } + + MdnsPacket(int transactionId, int flags, + @NonNull List<MdnsRecord> questions, + @NonNull List<MdnsRecord> answers, + @NonNull List<MdnsRecord> authorityRecords, + @NonNull List<MdnsRecord> additionalRecords) { + this.transactionId = transactionId; this.flags = flags; this.questions = Collections.unmodifiableList(questions); this.answers = Collections.unmodifiableList(answers); @@ -70,15 +80,16 @@ public class MdnsPacket { */ @NonNull public static MdnsPacket parse(@NonNull MdnsPacketReader reader) throws ParseException { + final int transactionId; final int flags; try { - reader.readUInt16(); // transaction ID (not used) + transactionId = reader.readUInt16(); flags = reader.readUInt16(); } catch (EOFException e) { throw new ParseException(MdnsResponseErrorCode.ERROR_END_OF_FILE, "Reached the end of the mDNS response unexpectedly.", e); } - return parseRecordsSection(reader, flags); + return parseRecordsSection(reader, flags, transactionId); } /** @@ -86,8 +97,8 @@ public class MdnsPacket { * * The records section starts with the questions count, just after the packet flags. */ - public static MdnsPacket parseRecordsSection(@NonNull MdnsPacketReader reader, int flags) - throws ParseException { + public static MdnsPacket parseRecordsSection(@NonNull MdnsPacketReader reader, int flags, + int transactionId) throws ParseException { try { final int numQuestions = reader.readUInt16(); final int numAnswers = reader.readUInt16(); @@ -99,7 +110,7 @@ public class MdnsPacket { final ArrayList<MdnsRecord> authority = parseRecords(reader, numAuthority, false); final ArrayList<MdnsRecord> additional = parseRecords(reader, numAdditional, false); - return new MdnsPacket(flags, questions, answers, authority, additional); + return new MdnsPacket(transactionId, flags, questions, answers, authority, additional); } catch (EOFException e) { throw new ParseException(MdnsResponseErrorCode.ERROR_END_OF_FILE, "Reached the end of the mDNS response unexpectedly.", e); diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java b/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java index a3cc0eba5b43b59d19aa9cf3273e32b0fb12596a..050913f460c930d3fecaab1e1e1dc81299633fe4 100644 --- a/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java +++ b/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java @@ -90,14 +90,14 @@ public class MdnsResponseDecoder { final MdnsPacket mdnsPacket; try { - reader.readUInt16(); // transaction ID (not used) + final int transactionId = reader.readUInt16(); int flags = reader.readUInt16(); if ((flags & MdnsConstants.FLAGS_RESPONSE_MASK) != MdnsConstants.FLAGS_RESPONSE) { throw new MdnsPacket.ParseException( MdnsResponseErrorCode.ERROR_NOT_RESPONSE_MESSAGE, "Not a response", null); } - mdnsPacket = MdnsPacket.parseRecordsSection(reader, flags); + mdnsPacket = MdnsPacket.parseRecordsSection(reader, flags, transactionId); if (mdnsPacket.answers.size() < 1) { throw new MdnsPacket.ParseException( MdnsResponseErrorCode.ERROR_NO_ANSWERS, "Response has no answers", diff --git a/service-t/src/com/android/server/connectivity/mdns/util/MdnsUtils.java b/service-t/src/com/android/server/connectivity/mdns/util/MdnsUtils.java index 0dcc560e4645a4bb07b128f530e3515b6320674c..d0f3d9af32313ebc0458d8be263650b9cc6b1714 100644 --- a/service-t/src/com/android/server/connectivity/mdns/util/MdnsUtils.java +++ b/service-t/src/com/android/server/connectivity/mdns/util/MdnsUtils.java @@ -189,7 +189,7 @@ public class MdnsUtils { // TODO: support packets over size (send in multiple packets with TC bit set) final MdnsPacketWriter writer = new MdnsPacketWriter(packetCreationBuffer); - writer.writeUInt16(0); // Transaction ID (advertisement: 0) + writer.writeUInt16(packet.transactionId); // Transaction ID (advertisement: 0) writer.writeUInt16(packet.flags); // Response, authoritative (rfc6762 18.4) writer.writeUInt16(packet.questions.size()); // questions count writer.writeUInt16(packet.answers.size()); // answers count diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketTest.kt index b667e5fde55113a7578f21c76340d69fa6c4718a..28ea4b6dac075fd6f7555313d7e6c32072a708f3 100644 --- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketTest.kt +++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketTest.kt @@ -32,7 +32,7 @@ class MdnsPacketTest { // Probe packet with 1 question for Android.local, and 4 additionalRecords with 4 addresses // for Android.local (similar to legacy mdnsresponder probes, although it used to put 4 // identical questions(!!) for Android.local when there were 4 addresses). - val packetHex = "00000000000100000004000007416e64726f6964056c6f63616c0000ff0001c00c000100" + + val packetHex = "007b0000000100000004000007416e64726f6964056c6f63616c0000ff0001c00c000100" + "01000000780004c000027bc00c001c000100000078001020010db8000000000000000000000123c0" + "0c001c000100000078001020010db8000000000000000000000456c00c001c000100000078001020" + "010db8000000000000000000000789" @@ -41,6 +41,7 @@ class MdnsPacketTest { val reader = MdnsPacketReader(bytes, bytes.size) val packet = MdnsPacket.parse(reader) + assertEquals(123, packet.transactionId) assertEquals(1, packet.questions.size) assertEquals(0, packet.answers.size) assertEquals(4, packet.authorityRecords.size) diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordRepositoryTest.kt b/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordRepositoryTest.kt index 88fb66aac17490bb05c6ef96683fd66c6575fa58..c9b502e35208fe880dc7565876bf2a1af07cb632 100644 --- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordRepositoryTest.kt +++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsRecordRepositoryTest.kt @@ -105,6 +105,7 @@ class MdnsRecordRepositoryTest { assertEquals(TEST_SERVICE_ID_1, probingInfo.serviceId) val packet = probingInfo.getPacket(0) + assertEquals(0, packet.transactionId) assertEquals(MdnsConstants.FLAGS_QUERY, packet.flags) assertEquals(0, packet.answers.size) assertEquals(0, packet.additionalRecords.size) @@ -173,6 +174,7 @@ class MdnsRecordRepositoryTest { assertEquals(1, repository.servicesCount) val packet = exitAnnouncement.getPacket(0) + assertEquals(0, packet.transactionId) assertEquals(0x8400 /* response, authoritative */, packet.flags) assertEquals(0, packet.questions.size) assertEquals(0, packet.authorityRecords.size) @@ -202,6 +204,7 @@ class MdnsRecordRepositoryTest { assertEquals(1, repository.servicesCount) val packet = exitAnnouncement.getPacket(0) + assertEquals(0, packet.transactionId) assertEquals(0x8400 /* response, authoritative */, packet.flags) assertEquals(0, packet.questions.size) assertEquals(0, packet.authorityRecords.size) @@ -249,6 +252,7 @@ class MdnsRecordRepositoryTest { repository.onAdvertisementSent(TEST_SERVICE_ID_1, 2 /* sentPacketCount */) val packet = announcementInfo.getPacket(0) + assertEquals(0, packet.transactionId) assertEquals(0x8400 /* response, authoritative */, packet.flags) assertEquals(0, packet.questions.size) assertEquals(0, packet.authorityRecords.size) @@ -372,6 +376,7 @@ class MdnsRecordRepositoryTest { val serviceName = arrayOf("MyTestService", "_testservice", "_tcp", "local") val serviceType = arrayOf("_testservice", "_tcp", "local") val offloadPacket = repository.getOffloadPacket(TEST_SERVICE_ID_1) + assertEquals(0, offloadPacket.transactionId) assertEquals(0x8400, offloadPacket.flags) assertEquals(0, offloadPacket.questions.size) assertEquals(0, offloadPacket.additionalRecords.size)