Parse totalRetrans variable in TcpInfo
Bug: 265107451
Test: atest NetworkStackTests
Change-Id: If9864def655ba9ef94ff0cebab97285e455dcaef
diff --git a/src/com/android/networkstack/netlink/TcpInfo.java b/src/com/android/networkstack/netlink/TcpInfo.java
index 31a408f..3cc08c2 100644
--- a/src/com/android/networkstack/netlink/TcpInfo.java
+++ b/src/com/android/networkstack/netlink/TcpInfo.java
@@ -19,8 +19,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-
-import com.android.internal.annotations.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
@@ -97,10 +96,13 @@
static final int SEGS_IN_OFFSET = getFieldOffset(Field.SEGS_IN);
@VisibleForTesting
static final int SEGS_OUT_OFFSET = getFieldOffset(Field.SEGS_OUT);
+ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+ static final int TOTAL_RETRANS_OFFSET = getFieldOffset(Field.TOTAL_RETRANS);
final int mSegsIn;
final int mSegsOut;
final int mLost;
final int mRetransmits;
+ final int mTotalRetrans;
private static int getFieldOffset(@NonNull final Field needle) {
int offset = 0;
@@ -122,18 +124,20 @@
mSegsOut = bytes.getInt(start + SEGS_OUT_OFFSET);
mLost = bytes.getInt(start + LOST_OFFSET);
mRetransmits = bytes.get(start + RETRANSMITS_OFFSET);
+ mTotalRetrans = bytes.get(start + TOTAL_RETRANS_OFFSET);
// tcp_info structure grows over time as new fields are added. Jump to the end of the
// structure, as unknown fields might remain at the end of the structure if the tcp_info
// struct was expanded.
bytes.position(Math.min(infolen + start, bytes.limit()));
}
- @VisibleForTesting
- TcpInfo(int retransmits, int lost, int segsOut, int segsIn) {
+ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+ TcpInfo(int retransmits, int lost, int segsOut, int segsIn, int totalRetrans) {
mRetransmits = retransmits;
mLost = lost;
mSegsOut = segsOut;
mSegsIn = segsIn;
+ mTotalRetrans = totalRetrans;
}
/** Parse a TcpInfo from a giving ByteBuffer with a specific length. */
@@ -180,17 +184,18 @@
TcpInfo other = (TcpInfo) obj;
return mSegsIn == other.mSegsIn && mSegsOut == other.mSegsOut
- && mRetransmits == other.mRetransmits && mLost == other.mLost;
+ && mRetransmits == other.mRetransmits && mLost == other.mLost
+ && mTotalRetrans == other.mTotalRetrans;
}
@Override
public int hashCode() {
- return Objects.hash(mLost, mRetransmits, mSegsIn, mSegsOut);
+ return Objects.hash(mLost, mRetransmits, mSegsIn, mSegsOut, mTotalRetrans);
}
@Override
public String toString() {
return "TcpInfo{lost=" + mLost + ", retransmit=" + mRetransmits + ", received=" + mSegsIn
- + ", sent=" + mSegsOut + "}";
+ + ", sent=" + mSegsOut + ", totalRetrans=" + mTotalRetrans + "}";
}
}
diff --git a/tests/unit/src/com/android/networkstack/netlink/TcpInfoTest.java b/tests/unit/src/com/android/networkstack/netlink/TcpInfoTest.java
index c362044..bf2ca9d 100644
--- a/tests/unit/src/com/android/networkstack/netlink/TcpInfoTest.java
+++ b/tests/unit/src/com/android/networkstack/netlink/TcpInfoTest.java
@@ -75,7 +75,7 @@
"02000000" + // reordering = 3
"00000000" + // rcvrtt = 0
"30560100" + // rcvspace = 87600
- "00000000" + // totalRetrans = 0
+ "05000000" + // totalRetrans = 5
"53AC000000000000" + // pacingRate = 44115
"FFFFFFFFFFFFFFFF" + // maxPacingRate = 18446744073709551615
"0100000000000001" + // bytesAcked = 1
@@ -92,8 +92,8 @@
"0000000000000000"; // sndBufLimited = 0
private static final byte[] TCP_INFO_BYTES =
HexEncoding.decode(TCP_INFO_HEX.toCharArray(), false);
- private static final TcpInfo TEST_TCPINFO =
- new TcpInfo(0 /* retransmits */, 0 /* lost */, 2 /* segsOut */, 1 /* segsIn */);
+ private static final TcpInfo TEST_TCPINFO = new TcpInfo(0 /* retransmits */, 0 /* lost */,
+ 2 /* segsOut */, 1 /* segsIn */, 5 /* totalRetrans */);
private static final String EXPANDED_TCP_INFO_HEX = TCP_INFO_HEX
+ "00000000" // tcpi_delivered
@@ -134,6 +134,7 @@
public void testFieldOffset() {
assertEquals(TcpInfo.RETRANSMITS_OFFSET, 2);
assertEquals(TcpInfo.LOST_OFFSET, 32);
+ assertEquals(TcpInfo.TOTAL_RETRANS_OFFSET, 100);
assertEquals(TcpInfo.SEGS_OUT_OFFSET, 136);
assertEquals(TcpInfo.SEGS_IN_OFFSET, 140);
}
diff --git a/tests/unit/src/com/android/networkstack/netlink/TcpSocketTrackerTest.java b/tests/unit/src/com/android/networkstack/netlink/TcpSocketTrackerTest.java
index 2af99b6..7b32518 100644
--- a/tests/unit/src/com/android/networkstack/netlink/TcpSocketTrackerTest.java
+++ b/tests/unit/src/com/android/networkstack/netlink/TcpSocketTrackerTest.java
@@ -21,10 +21,13 @@
import static android.os.PowerManager.ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED;
import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
import static android.system.OsConstants.AF_INET;
+
import static com.android.net.module.util.NetworkStackConstants.DNS_OVER_TLS_PORT;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
@@ -92,8 +95,8 @@
composeSockDiagTcpHex(0 /* lost */, 10 /* sent */);
private static final byte[] SOCK_DIAG_TCP_INET_ZERO_LOST_BYTES =
HexEncoding.decode(SOCK_DIAG_TCP_ZERO_LOST_HEX.toCharArray(), false);
- private static final TcpInfo TEST_TCPINFO =
- new TcpInfo(5 /* retransmits */, 0 /* lost */, 10 /* segsOut */, 0 /* segsIn */);
+ private static final TcpInfo TEST_TCPINFO = new TcpInfo(5 /* retransmits */, 0 /* lost */,
+ 10 /* segsOut */, 0 /* segsIn */, 5 /* totalRetrans */);
private static final String NLMSG_DONE_HEX =
// struct nlmsghdr
"14000000" // length = 20
@@ -535,7 +538,7 @@
"03000000" + // reordering = 3
"00000000" + // rcvrtt = 0
"30560100" + // rcvspace = 87600
- "00000000" + // totalRetrans = 0
+ "05000000" + // totalRetrans = 5
"53AC000000000000" + // pacingRate = 44115
"FFFFFFFFFFFFFFFF" + // maxPacingRate = 18446744073709551615
"0100000000000000" + // bytesAcked = 1