Merge "Limit the translation code on NAT-T keepalive" into main
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user