diff --git a/service/src/com/android/server/connectivity/KeepaliveTracker.java b/service/src/com/android/server/connectivity/KeepaliveTracker.java index 125c2694a9..2ce186f238 100644 --- a/service/src/com/android/server/connectivity/KeepaliveTracker.java +++ b/service/src/com/android/server/connectivity/KeepaliveTracker.java @@ -553,6 +553,8 @@ public class KeepaliveTracker { private KeepaliveInfo handleUpdateKeepaliveForClat(KeepaliveInfo ki) throws InvalidSocketException, InvalidPacketException { + // Translation applies to only NAT-T keepalive + if (ki.mType != KeepaliveInfo.TYPE_NATT) return ki; // Only try to translate address if the packet source address is the clat's source address. if (!ki.mPacket.getSrcAddress().equals(ki.getNai().getClatv4SrcAddress())) return ki; diff --git a/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java b/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java index eeffbe1570..b30c9ce16c 100644 --- a/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java +++ b/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java @@ -612,17 +612,60 @@ public class AutomaticOnOffKeepaliveTrackerTest { verifyNoMoreInteractions(ignoreStubs(testInfo.socketKeepaliveCallback)); } - @Test - public void testStartNattKeepalive_addressTranslationOnClat() throws Exception { - final InetAddress v6AddrSrc = InetAddresses.parseNumericAddress("2001:db8::1"); - final InetAddress v6AddrDst = InetAddresses.parseNumericAddress("2001:db8::2"); - doReturn(v6AddrDst).when(mNai).translateV4toClatV6(any()); - doReturn(v6AddrSrc).when(mNai).getClatv6SrcAddress(); + private void setupTestNaiForClat(InetAddress v6Src, InetAddress v6Dst) throws Exception { + doReturn(v6Dst).when(mNai).translateV4toClatV6(any()); + doReturn(v6Src).when(mNai).getClatv6SrcAddress(); doReturn(InetAddress.getByAddress(V4_SRC_ADDR)).when(mNai).getClatv4SrcAddress(); // Setup nai to add clat address final LinkProperties stacked = new LinkProperties(); stacked.setInterfaceName(TEST_V4_IFACE); + final InetAddress srcAddress = InetAddress.getByAddress( + new byte[] { (byte) 192, 0, 0, (byte) 129 }); + mNai.linkProperties.addLinkAddress(new LinkAddress(srcAddress, 24)); mNai.linkProperties.addStackedLink(stacked); + } + + private TestKeepaliveInfo doStartTcpKeepalive(InetAddress srcAddr) throws Exception { + final KeepalivePacketData kpd = new TcpKeepalivePacketData( + srcAddr, + 12345 /* srcPort */, + InetAddress.getByAddress(new byte[] { 8, 8, 8, 8}) /* dstAddr */, + 12345 /* dstPort */, new byte[] {1}, 111 /* tcpSeq */, + 222 /* tcpAck */, 800 /* tcpWindow */, 2 /* tcpWindowScale */, + 4 /* ipTos */, 64 /* ipTtl */); + final TestKeepaliveInfo testInfo = new TestKeepaliveInfo(kpd); + + final KeepaliveInfo ki = mKeepaliveTracker.new KeepaliveInfo( + testInfo.socketKeepaliveCallback, mNai, kpd, + TEST_KEEPALIVE_INTERVAL_SEC, KeepaliveInfo.TYPE_TCP, testInfo.fd); + mKeepaliveTracker.setReturnedKeepaliveInfo(ki); + + // Setup TCP keepalive. + mAOOKeepaliveTracker.startTcpKeepalive(mNai, testInfo.fd, TEST_KEEPALIVE_INTERVAL_SEC, + testInfo.socketKeepaliveCallback); + HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS); + return testInfo; + } + @Test + public void testStartTcpKeepalive_addressTranslationOnClat() throws Exception { + setupTestNaiForClat(InetAddresses.parseNumericAddress("2001:db8::1") /* v6Src */, + InetAddresses.parseNumericAddress("2001:db8::2") /* v6Dst */); + final InetAddress srcAddr = InetAddress.getByAddress(V4_SRC_ADDR); + doStartTcpKeepalive(srcAddr); + final ArgumentCaptor tpdCaptor = + ArgumentCaptor.forClass(TcpKeepalivePacketData.class); + verify(mNai).onStartTcpSocketKeepalive( + eq(TEST_SLOT), eq(TEST_KEEPALIVE_INTERVAL_SEC), tpdCaptor.capture()); + final TcpKeepalivePacketData tpd = tpdCaptor.getValue(); + // Verify the addresses still be the same address when clat is started. + assertEquals(srcAddr, tpd.getSrcAddress()); + } + + @Test + public void testStartNattKeepalive_addressTranslationOnClat() throws Exception { + final InetAddress v6AddrSrc = InetAddresses.parseNumericAddress("2001:db8::1"); + final InetAddress v6AddrDst = InetAddresses.parseNumericAddress("2001:db8::2"); + setupTestNaiForClat(v6AddrSrc, v6AddrDst); final TestKeepaliveInfo testInfo = doStartNattKeepalive(); final ArgumentCaptor kpdCaptor = @@ -899,24 +942,8 @@ public class AutomaticOnOffKeepaliveTrackerTest { new byte[] { (byte) 192, 0, 0, (byte) 129 }); mNai.linkProperties.addLinkAddress(new LinkAddress(srcAddress, 24)); - final KeepalivePacketData kpd = new TcpKeepalivePacketData( - InetAddress.getByAddress(new byte[] { (byte) 192, 0, 0, (byte) 129 }) /* srcAddr */, - 12345 /* srcPort */, - InetAddress.getByAddress(new byte[] { 8, 8, 8, 8}) /* dstAddr */, - 12345 /* dstPort */, new byte[] {1}, 111 /* tcpSeq */, - 222 /* tcpAck */, 800 /* tcpWindow */, 2 /* tcpWindowScale */, - 4 /* ipTos */, 64 /* ipTtl */); - final TestKeepaliveInfo testInfo = new TestKeepaliveInfo(kpd); - - final KeepaliveInfo ki = mKeepaliveTracker.new KeepaliveInfo( - testInfo.socketKeepaliveCallback, mNai, kpd, - TEST_KEEPALIVE_INTERVAL_SEC, KeepaliveInfo.TYPE_TCP, testInfo.fd); - mKeepaliveTracker.setReturnedKeepaliveInfo(ki); - - // Setup TCP keepalive. - mAOOKeepaliveTracker.startTcpKeepalive(mNai, testInfo.fd, TEST_KEEPALIVE_INTERVAL_SEC, - testInfo.socketKeepaliveCallback); - HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS); + final TestKeepaliveInfo testInfo = + doStartTcpKeepalive(InetAddress.getByAddress(V4_SRC_ADDR)); // A closed socket will result in EVENT_HANGUP and trigger error to // FileDescriptorEventListener. @@ -924,6 +951,6 @@ public class AutomaticOnOffKeepaliveTrackerTest { HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS); // The keepalive should be removed in AutomaticOnOffKeepaliveTracker. - getAutoKiForBinder(testInfo.binder); + assertNull(getAutoKiForBinder(testInfo.binder)); } }