Merge "Limit the translation code on NAT-T keepalive" into main

This commit is contained in:
Chiachang Wang
2023-07-10 00:28:10 +00:00
committed by Gerrit Code Review
2 changed files with 54 additions and 25 deletions

View File

@@ -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;

View File

@@ -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<TcpKeepalivePacketData> 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<NattKeepalivePacketData> 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));
}
}