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