From fd357ef69552ef17e2fcd8283e98091b56a0f96b Mon Sep 17 00:00:00 2001 From: Paul Hu Date: Wed, 1 Nov 2023 16:32:45 +0800 Subject: [PATCH] Add NSD_LIMIT_LABEL_COUNT flag Bug: 307475137 Test: atest FrameworksNetTests android.net.cts.NsdManagerTest Merged-In: I48b1dc26f41549ec4afc71f87e98a02ac773430f Change-Id: Ic4c2e4c0d61b76b1afd556560c18171bdb7a088e --- .../src/com/android/server/NsdService.java | 4 ++- .../connectivity/mdns/MdnsFeatureFlags.java | 29 +++++++++++++++++-- .../mdns/MdnsInterfaceAdvertiser.java | 6 ++-- .../mdns/MdnsMultinetworkSocketClient.java | 8 +++-- .../connectivity/mdns/MdnsPacketReader.java | 9 ++++-- .../mdns/MdnsResponseDecoder.java | 6 ++-- .../connectivity/mdns/MdnsSocketClient.java | 7 +++-- .../MdnsMultinetworkSocketClientTest.java | 4 +-- .../mdns/MdnsPacketReaderTests.java | 4 +-- .../connectivity/mdns/MdnsPacketTest.kt | 5 +++- .../mdns/MdnsResponseDecoderTests.java | 8 +++-- .../mdns/MdnsSocketClientTests.java | 7 +++-- 12 files changed, 71 insertions(+), 26 deletions(-) diff --git a/service-t/src/com/android/server/NsdService.java b/service-t/src/com/android/server/NsdService.java index c74f229e4d..43357e445d 100644 --- a/service-t/src/com/android/server/NsdService.java +++ b/service-t/src/com/android/server/NsdService.java @@ -1647,10 +1647,12 @@ public class NsdService extends INsdManager.Stub { mContext, MdnsFeatureFlags.INCLUDE_INET_ADDRESS_RECORDS_IN_PROBING)) .setIsExpiredServicesRemovalEnabled(mDeps.isTrunkStableFeatureEnabled( MdnsFeatureFlags.NSD_EXPIRED_SERVICES_REMOVAL)) + .setIsLabelCountLimitEnabled(mDeps.isTetheringFeatureNotChickenedOut( + mContext, MdnsFeatureFlags.NSD_LIMIT_LABEL_COUNT)) .build(); mMdnsSocketClient = new MdnsMultinetworkSocketClient(handler.getLooper(), mMdnsSocketProvider, - LOGGER.forSubComponent("MdnsMultinetworkSocketClient")); + LOGGER.forSubComponent("MdnsMultinetworkSocketClient"), flags); mMdnsDiscoveryManager = deps.makeMdnsDiscoveryManager(new ExecutorProvider(), mMdnsSocketClient, LOGGER.forSubComponent("MdnsDiscoveryManager"), flags); handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager)); diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsFeatureFlags.java b/service-t/src/com/android/server/connectivity/mdns/MdnsFeatureFlags.java index 6f7645e971..738c151e7d 100644 --- a/service-t/src/com/android/server/connectivity/mdns/MdnsFeatureFlags.java +++ b/service-t/src/com/android/server/connectivity/mdns/MdnsFeatureFlags.java @@ -36,6 +36,11 @@ public class MdnsFeatureFlags { public static final String NSD_EXPIRED_SERVICES_REMOVAL = "nsd_expired_services_removal"; + /** + * A feature flag to control whether the label count limit should be enabled. + */ + public static final String NSD_LIMIT_LABEL_COUNT = "nsd_limit_label_count"; + // Flag for offload feature public final boolean mIsMdnsOffloadFeatureEnabled; @@ -45,14 +50,20 @@ public class MdnsFeatureFlags { // Flag for expired services removal public final boolean mIsExpiredServicesRemovalEnabled; + // Flag for label count limit + public final boolean mIsLabelCountLimitEnabled; + /** * The constructor for {@link MdnsFeatureFlags}. */ public MdnsFeatureFlags(boolean isOffloadFeatureEnabled, - boolean includeInetAddressRecordsInProbing, boolean isExpiredServicesRemovalEnabled) { + boolean includeInetAddressRecordsInProbing, + boolean isExpiredServicesRemovalEnabled, + boolean isLabelCountLimitEnabled) { mIsMdnsOffloadFeatureEnabled = isOffloadFeatureEnabled; mIncludeInetAddressRecordsInProbing = includeInetAddressRecordsInProbing; mIsExpiredServicesRemovalEnabled = isExpiredServicesRemovalEnabled; + mIsLabelCountLimitEnabled = isLabelCountLimitEnabled; } @@ -67,6 +78,7 @@ public class MdnsFeatureFlags { private boolean mIsMdnsOffloadFeatureEnabled; private boolean mIncludeInetAddressRecordsInProbing; private boolean mIsExpiredServicesRemovalEnabled; + private boolean mIsLabelCountLimitEnabled; /** * The constructor for {@link Builder}. @@ -75,6 +87,7 @@ public class MdnsFeatureFlags { mIsMdnsOffloadFeatureEnabled = false; mIncludeInetAddressRecordsInProbing = false; mIsExpiredServicesRemovalEnabled = true; // Default enabled. + mIsLabelCountLimitEnabled = true; // Default enabled. } /** @@ -108,12 +121,24 @@ public class MdnsFeatureFlags { return this; } + /** + * Set whether the label count limit is enabled. + * + * @see #NSD_LIMIT_LABEL_COUNT + */ + public Builder setIsLabelCountLimitEnabled(boolean isLabelCountLimitEnabled) { + mIsLabelCountLimitEnabled = isLabelCountLimitEnabled; + return this; + } + /** * Builds a {@link MdnsFeatureFlags} with the arguments supplied to this builder. */ public MdnsFeatureFlags build() { return new MdnsFeatureFlags(mIsMdnsOffloadFeatureEnabled, - mIncludeInetAddressRecordsInProbing, mIsExpiredServicesRemovalEnabled); + mIncludeInetAddressRecordsInProbing, + mIsExpiredServicesRemovalEnabled, + mIsLabelCountLimitEnabled); } } } diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiser.java b/service-t/src/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiser.java index 42a6b0d5a4..62c37ade80 100644 --- a/service-t/src/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiser.java +++ b/service-t/src/com/android/server/connectivity/mdns/MdnsInterfaceAdvertiser.java @@ -65,11 +65,12 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand private final MdnsProber mProber; @NonNull private final MdnsReplySender mReplySender; - @NonNull private final SharedLog mSharedLog; @NonNull private final byte[] mPacketCreationBuffer; + @NonNull + private final MdnsFeatureFlags mMdnsFeatureFlags; /** * Callbacks called by {@link MdnsInterfaceAdvertiser} to report status updates. @@ -213,6 +214,7 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand mProber = deps.makeMdnsProber(sharedLog.getTag(), looper, mReplySender, mProbingCallback, sharedLog); mSharedLog = sharedLog; + mMdnsFeatureFlags = mdnsFeatureFlags; } /** @@ -351,7 +353,7 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand public void handlePacket(byte[] recvbuf, int length, InetSocketAddress src) { final MdnsPacket packet; try { - packet = MdnsPacket.parse(new MdnsPacketReader(recvbuf, length)); + packet = MdnsPacket.parse(new MdnsPacketReader(recvbuf, length, mMdnsFeatureFlags)); } catch (MdnsPacket.ParseException e) { mSharedLog.e("Error parsing mDNS packet", e); if (DBG) { diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java b/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java index 4ba691212f..e7b0eaa8a5 100644 --- a/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java +++ b/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java @@ -50,6 +50,7 @@ public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase { @NonNull private final Handler mHandler; @NonNull private final MdnsSocketProvider mSocketProvider; @NonNull private final SharedLog mSharedLog; + @NonNull private final MdnsFeatureFlags mMdnsFeatureFlags; private final ArrayMap mSocketRequests = new ArrayMap<>(); @@ -58,11 +59,12 @@ public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase { private int mReceivedPacketNumber = 0; public MdnsMultinetworkSocketClient(@NonNull Looper looper, - @NonNull MdnsSocketProvider provider, - @NonNull SharedLog sharedLog) { + @NonNull MdnsSocketProvider provider, @NonNull SharedLog sharedLog, + @NonNull MdnsFeatureFlags mdnsFeatureFlags) { mHandler = new Handler(looper); mSocketProvider = provider; mSharedLog = sharedLog; + mMdnsFeatureFlags = mdnsFeatureFlags; } private class InterfaceSocketCallback implements MdnsSocketProvider.SocketCallback { @@ -239,7 +241,7 @@ public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase { final MdnsPacket response; try { - response = MdnsResponseDecoder.parseResponse(recvbuf, length); + response = MdnsResponseDecoder.parseResponse(recvbuf, length, mMdnsFeatureFlags); } catch (MdnsPacket.ParseException e) { if (e.code != MdnsResponseErrorCode.ERROR_NOT_RESPONSE_MESSAGE) { mSharedLog.e(e.getMessage(), e); diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsPacketReader.java b/service-t/src/com/android/server/connectivity/mdns/MdnsPacketReader.java index aa3884494f..49171889d1 100644 --- a/service-t/src/com/android/server/connectivity/mdns/MdnsPacketReader.java +++ b/service-t/src/com/android/server/connectivity/mdns/MdnsPacketReader.java @@ -16,6 +16,7 @@ package com.android.server.connectivity.mdns; +import android.annotation.NonNull; import android.annotation.Nullable; import android.util.SparseArray; @@ -33,21 +34,23 @@ public class MdnsPacketReader { private final byte[] buf; private final int count; private final SparseArray labelDictionary; + private final MdnsFeatureFlags mMdnsFeatureFlags; private int pos; private int limit; /** Constructs a reader for the given packet. */ public MdnsPacketReader(DatagramPacket packet) { - this(packet.getData(), packet.getLength()); + this(packet.getData(), packet.getLength(), MdnsFeatureFlags.newBuilder().build()); } /** Constructs a reader for the given packet. */ - public MdnsPacketReader(byte[] buffer, int length) { + public MdnsPacketReader(byte[] buffer, int length, @NonNull MdnsFeatureFlags mdnsFeatureFlags) { buf = buffer; count = length; pos = 0; limit = -1; labelDictionary = new SparseArray<>(16); + mMdnsFeatureFlags = mdnsFeatureFlags; } /** @@ -269,4 +272,4 @@ public class MdnsPacketReader { this.label = label; } } -} \ No newline at end of file +} 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 050913f460..b812bb491b 100644 --- a/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java +++ b/service-t/src/com/android/server/connectivity/mdns/MdnsResponseDecoder.java @@ -84,9 +84,9 @@ public class MdnsResponseDecoder { * @throws MdnsPacket.ParseException if a response packet could not be parsed. */ @NonNull - public static MdnsPacket parseResponse(@NonNull byte[] recvbuf, int length) - throws MdnsPacket.ParseException { - MdnsPacketReader reader = new MdnsPacketReader(recvbuf, length); + public static MdnsPacket parseResponse(@NonNull byte[] recvbuf, int length, + @NonNull MdnsFeatureFlags mdnsFeatureFlags) throws MdnsPacket.ParseException { + final MdnsPacketReader reader = new MdnsPacketReader(recvbuf, length, mdnsFeatureFlags); final MdnsPacket mdnsPacket; try { diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClient.java b/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClient.java index d18a19bd59..82c8c5bf27 100644 --- a/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClient.java +++ b/service-t/src/com/android/server/connectivity/mdns/MdnsSocketClient.java @@ -105,9 +105,10 @@ public class MdnsSocketClient implements MdnsSocketClientBase { private AtomicInteger packetsCount; @Nullable private Timer checkMulticastResponseTimer; private final SharedLog sharedLog; + @NonNull private final MdnsFeatureFlags mdnsFeatureFlags; public MdnsSocketClient(@NonNull Context context, @NonNull MulticastLock multicastLock, - SharedLog sharedLog) { + SharedLog sharedLog, @NonNull MdnsFeatureFlags mdnsFeatureFlags) { this.sharedLog = sharedLog; this.context = context; this.multicastLock = multicastLock; @@ -116,6 +117,7 @@ public class MdnsSocketClient implements MdnsSocketClientBase { } else { unicastReceiverBuffer = null; } + this.mdnsFeatureFlags = mdnsFeatureFlags; } @Override @@ -454,7 +456,8 @@ public class MdnsSocketClient implements MdnsSocketClientBase { final MdnsPacket response; try { - response = MdnsResponseDecoder.parseResponse(packet.getData(), packet.getLength()); + response = MdnsResponseDecoder.parseResponse( + packet.getData(), packet.getLength(), mdnsFeatureFlags); } catch (MdnsPacket.ParseException e) { sharedLog.w(String.format("Error while decoding %s packet (%d): %d", responseType, packetNumber, e.code)); diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java index 8917ed3f99..ad30ce09bf 100644 --- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java +++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java @@ -82,8 +82,8 @@ public class MdnsMultinetworkSocketClientTest { mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()); mSocketKey = new SocketKey(1000 /* interfaceIndex */); - mSocketClient = new MdnsMultinetworkSocketClient( - mHandlerThread.getLooper(), mProvider, mSharedLog); + mSocketClient = new MdnsMultinetworkSocketClient(mHandlerThread.getLooper(), mProvider, + mSharedLog, MdnsFeatureFlags.newBuilder().build()); mHandler.post(() -> mSocketClient.setCallback(mCallback)); } diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketReaderTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketReaderTests.java index 19d8a0054a..37588b5a4d 100644 --- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketReaderTests.java +++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketReaderTests.java @@ -75,7 +75,7 @@ public class MdnsPacketReaderTests { + "the packet length"); } catch (IOException e) { // Expected - } catch (Exception e) { + } catch (RuntimeException e) { fail(String.format( Locale.ROOT, "Should not have thrown any other exception except " + "for IOException: %s", @@ -83,4 +83,4 @@ public class MdnsPacketReaderTests { } assertEquals(data.length, packetReader.getRemaining()); } -} \ No newline at end of file +} 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 28ea4b6dac..0877b6872b 100644 --- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketTest.kt +++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsPacketTest.kt @@ -27,6 +27,9 @@ import org.junit.runner.RunWith @RunWith(DevSdkIgnoreRunner::class) class MdnsPacketTest { + private fun makeFlags(isLabelCountLimitEnabled: Boolean = false): MdnsFeatureFlags = + MdnsFeatureFlags.newBuilder() + .setIsLabelCountLimitEnabled(isLabelCountLimitEnabled).build() @Test fun testParseQuery() { // Probe packet with 1 question for Android.local, and 4 additionalRecords with 4 addresses @@ -38,7 +41,7 @@ class MdnsPacketTest { "010db8000000000000000000000789" val bytes = HexDump.hexStringToByteArray(packetHex) - val reader = MdnsPacketReader(bytes, bytes.size) + val reader = MdnsPacketReader(bytes, bytes.size, makeFlags()) val packet = MdnsPacket.parse(reader) assertEquals(123, packet.transactionId) diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseDecoderTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseDecoderTests.java index 3fc656ace6..a22e8c6b0c 100644 --- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseDecoderTests.java +++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsResponseDecoderTests.java @@ -17,8 +17,10 @@ package com.android.server.connectivity.mdns; import static android.net.InetAddresses.parseNumericAddress; + import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock; import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2; + import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -337,7 +339,8 @@ public class MdnsResponseDecoderTests { packet.setSocketAddress( new InetSocketAddress(MdnsConstants.getMdnsIPv6Address(), MdnsConstants.MDNS_PORT)); - final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse(data6, data6.length); + final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse( + data6, data6.length, MdnsFeatureFlags.newBuilder().build()); assertNotNull(parsedPacket); final Network network = mock(Network.class); @@ -636,7 +639,8 @@ public class MdnsResponseDecoderTests { private ArraySet decode(MdnsResponseDecoder decoder, byte[] data, Collection existingResponses) throws MdnsPacket.ParseException { - final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse(data, data.length); + final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse( + data, data.length, MdnsFeatureFlags.newBuilder().build()); assertNotNull(parsedPacket); return new ArraySet<>(decoder.augmentResponses(parsedPacket, diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketClientTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketClientTests.java index 74f1c3733c..8b7ab71dba 100644 --- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketClientTests.java +++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsSocketClientTests.java @@ -78,6 +78,7 @@ public class MdnsSocketClientTests { @Mock private SharedLog sharedLog; private MdnsSocketClient mdnsClient; + private MdnsFeatureFlags flags = MdnsFeatureFlags.newBuilder().build(); @Before public void setup() throws RuntimeException, IOException { @@ -86,7 +87,7 @@ public class MdnsSocketClientTests { when(mockWifiManager.createMulticastLock(ArgumentMatchers.anyString())) .thenReturn(mockMulticastLock); - mdnsClient = new MdnsSocketClient(mContext, mockMulticastLock, sharedLog) { + mdnsClient = new MdnsSocketClient(mContext, mockMulticastLock, sharedLog, flags) { @Override MdnsSocket createMdnsSocket(int port, SharedLog sharedLog) throws IOException { if (port == MdnsConstants.MDNS_PORT) { @@ -515,7 +516,7 @@ public class MdnsSocketClientTests { //MdnsConfigsFlagsImpl.allowNetworkInterfaceIndexPropagation.override(true); when(mockMulticastSocket.getInterfaceIndex()).thenReturn(21); - mdnsClient = new MdnsSocketClient(mContext, mockMulticastLock, sharedLog) { + mdnsClient = new MdnsSocketClient(mContext, mockMulticastLock, sharedLog, flags) { @Override MdnsSocket createMdnsSocket(int port, SharedLog sharedLog) { if (port == MdnsConstants.MDNS_PORT) { @@ -538,7 +539,7 @@ public class MdnsSocketClientTests { //MdnsConfigsFlagsImpl.allowNetworkInterfaceIndexPropagation.override(false); when(mockMulticastSocket.getInterfaceIndex()).thenReturn(21); - mdnsClient = new MdnsSocketClient(mContext, mockMulticastLock, sharedLog) { + mdnsClient = new MdnsSocketClient(mContext, mockMulticastLock, sharedLog, flags) { @Override MdnsSocket createMdnsSocket(int port, SharedLog sharedLog) { if (port == MdnsConstants.MDNS_PORT) {