Update StructInetDiagMsg to parse all the fields
Bug: 270298713
Test: atest NetworkStaticLibTests
Change-Id: I782eca50b6db6dca88ee933edb5d5d19223886dd
diff --git a/staticlibs/device/com/android/net/module/util/netlink/StructInetDiagMsg.java b/staticlibs/device/com/android/net/module/util/netlink/StructInetDiagMsg.java
index e7fc02f..cbd895d 100644
--- a/staticlibs/device/com/android/net/module/util/netlink/StructInetDiagMsg.java
+++ b/staticlibs/device/com/android/net/module/util/netlink/StructInetDiagMsg.java
@@ -43,14 +43,22 @@
*/
public class StructInetDiagMsg {
public static final int STRUCT_SIZE = 4 + StructInetDiagSockId.STRUCT_SIZE + 20;
- // Offset to the id field from the beginning of inet_diag_msg struct
- private static final int IDIAG_SOCK_ID_OFFSET = 4;
- // Offset to the idiag_uid field from the beginning of inet_diag_msg struct
- private static final int IDIAG_UID_OFFSET =
- IDIAG_SOCK_ID_OFFSET + StructInetDiagSockId.STRUCT_SIZE + 12;
- public int idiag_uid;
+ public short idiag_family;
+ public short idiag_state;
+ public short idiag_timer;
+ public short idiag_retrans;
@NonNull
public StructInetDiagSockId id;
+ public long idiag_expires;
+ public long idiag_rqueue;
+ public long idiag_wqueue;
+ // Use int for uid since other code use int for uid and uid fits to int
+ public int idiag_uid;
+ public long idiag_inode;
+
+ private static short unsignedByte(byte b) {
+ return (short) (b & 0xFF);
+ }
/**
* Parse inet diag netlink message from buffer.
@@ -60,26 +68,36 @@
if (byteBuffer.remaining() < STRUCT_SIZE) {
return null;
}
- final int baseOffset = byteBuffer.position();
StructInetDiagMsg struct = new StructInetDiagMsg();
- final byte family = byteBuffer.get();
- byteBuffer.position(baseOffset + IDIAG_SOCK_ID_OFFSET);
- struct.id = StructInetDiagSockId.parse(byteBuffer, family);
+ struct.idiag_family = unsignedByte(byteBuffer.get());
+ struct.idiag_state = unsignedByte(byteBuffer.get());
+ struct.idiag_timer = unsignedByte(byteBuffer.get());
+ struct.idiag_retrans = unsignedByte(byteBuffer.get());
+ struct.id = StructInetDiagSockId.parse(byteBuffer, struct.idiag_family);
if (struct.id == null) {
return null;
}
- struct.idiag_uid = byteBuffer.getInt(baseOffset + IDIAG_UID_OFFSET);
-
- // Move position to the end of the inet_diag_msg
- byteBuffer.position(baseOffset + STRUCT_SIZE);
+ struct.idiag_expires = Integer.toUnsignedLong(byteBuffer.getInt());
+ struct.idiag_rqueue = Integer.toUnsignedLong(byteBuffer.getInt());
+ struct.idiag_wqueue = Integer.toUnsignedLong(byteBuffer.getInt());
+ struct.idiag_uid = byteBuffer.getInt();
+ struct.idiag_inode = Integer.toUnsignedLong(byteBuffer.getInt());
return struct;
}
@Override
public String toString() {
return "StructInetDiagMsg{ "
- + "idiag_uid{" + idiag_uid + "}, "
+ + "idiag_family{" + idiag_family + "}, "
+ + "idiag_state{" + idiag_state + "}, "
+ + "idiag_timer{" + idiag_timer + "}, "
+ + "idiag_retrans{" + idiag_retrans + "}, "
+ "id{" + id + "}, "
+ + "idiag_expires{" + idiag_expires + "}, "
+ + "idiag_rqueue{" + idiag_rqueue + "}, "
+ + "idiag_wqueue{" + idiag_wqueue + "}, "
+ + "idiag_uid{" + idiag_uid + "}, "
+ + "idiag_inode{" + idiag_inode + "}, "
+ "}";
}
}
diff --git a/staticlibs/device/com/android/net/module/util/netlink/StructInetDiagSockId.java b/staticlibs/device/com/android/net/module/util/netlink/StructInetDiagSockId.java
index 648a020..1e728ea 100644
--- a/staticlibs/device/com/android/net/module/util/netlink/StructInetDiagSockId.java
+++ b/staticlibs/device/com/android/net/module/util/netlink/StructInetDiagSockId.java
@@ -80,7 +80,7 @@
* Parse inet diag socket id from buffer.
*/
@Nullable
- public static StructInetDiagSockId parse(final ByteBuffer byteBuffer, final byte family) {
+ public static StructInetDiagSockId parse(final ByteBuffer byteBuffer, final short family) {
if (byteBuffer.remaining() < STRUCT_SIZE) {
return null;
}
diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/netlink/InetDiagSocketTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/netlink/InetDiagSocketTest.java
index d81422f..6837c83 100644
--- a/staticlibs/tests/unit/src/com/android/net/module/util/netlink/InetDiagSocketTest.java
+++ b/staticlibs/tests/unit/src/com/android/net/module/util/netlink/InetDiagSocketTest.java
@@ -248,9 +248,9 @@
"f5220000" + // pid
// struct inet_diag_msg
"0a" + // family = AF_INET6
- "01" + // idiag_state
- "00" + // idiag_timer
- "00" + // idiag_retrans
+ "01" + // idiag_state = 1
+ "02" + // idiag_timer = 2
+ "ff" + // idiag_retrans = 255
// inet_diag_sockid
"a817" + // idiag_sport = 43031
"960f" + // idiag_dport = 38415
@@ -258,11 +258,11 @@
"20010db8000000000000000000000002" + // idiag_dst = 2001:db8::2
"07000000" + // idiag_if = 7
"5800000000000000" + // idiag_cookie = 88
- "00000000" + // idiag_expires
- "00000000" + // idiag_rqueue
- "00000000" + // idiag_wqueue
+ "04000000" + // idiag_expires = 4
+ "05000000" + // idiag_rqueue = 5
+ "06000000" + // idiag_wqueue = 6
"a3270000" + // idiag_uid = 10147
- "A57E1900"; // idiag_inode
+ "a57e19f0"; // idiag_inode = 4028202661
private void assertInetDiagMsg1(final NetlinkMessage msg) {
assertNotNull(msg);
@@ -276,12 +276,20 @@
0 /* seq */,
8949 /* pid */);
- assertEquals(10147, inetDiagMsg.inetDiagMsg.idiag_uid);
+ assertEquals(AF_INET6, inetDiagMsg.inetDiagMsg.idiag_family);
+ assertEquals(1, inetDiagMsg.inetDiagMsg.idiag_state);
+ assertEquals(2, inetDiagMsg.inetDiagMsg.idiag_timer);
+ assertEquals(255, inetDiagMsg.inetDiagMsg.idiag_retrans);
assertInetDiagSockId(inetDiagMsg.inetDiagMsg.id,
new InetSocketAddress(InetAddresses.parseNumericAddress("2001:db8::1"), 43031),
new InetSocketAddress(InetAddresses.parseNumericAddress("2001:db8::2"), 38415),
7 /* ifIndex */,
88 /* cookie */);
+ assertEquals(4, inetDiagMsg.inetDiagMsg.idiag_expires);
+ assertEquals(5, inetDiagMsg.inetDiagMsg.idiag_rqueue);
+ assertEquals(6, inetDiagMsg.inetDiagMsg.idiag_wqueue);
+ assertEquals(10147, inetDiagMsg.inetDiagMsg.idiag_uid);
+ assertEquals(4028202661L, inetDiagMsg.inetDiagMsg.idiag_inode);
}
// Hexadecimal representation of InetDiagMessage
@@ -294,9 +302,9 @@
"f5220000" + // pid
// struct inet_diag_msg
"0a" + // family = AF_INET6
- "01" + // idiag_state
- "00" + // idiag_timer
- "00" + // idiag_retrans
+ "02" + // idiag_state = 2
+ "10" + // idiag_timer = 16
+ "20" + // idiag_retrans = 32
// inet_diag_sockid
"a845" + // idiag_sport = 43077
"01bb" + // idiag_dport = 443
@@ -304,11 +312,11 @@
"20010db8000000000000000000000004" + // idiag_dst = 2001:db8::4
"08000000" + // idiag_if = 8
"6300000000000000" + // idiag_cookie = 99
- "00000000" + // idiag_expires
- "00000000" + // idiag_rqueue
- "00000000" + // idiag_wqueue
+ "30000000" + // idiag_expires = 48
+ "40000000" + // idiag_rqueue = 64
+ "50000000" + // idiag_wqueue = 80
"39300000" + // idiag_uid = 12345
- "A57E1900"; // idiag_inode
+ "851a0000"; // idiag_inode = 6789
private void assertInetDiagMsg2(final NetlinkMessage msg) {
assertNotNull(msg);
@@ -322,12 +330,20 @@
0 /* seq */,
8949 /* pid */);
- assertEquals(12345, inetDiagMsg.inetDiagMsg.idiag_uid);
+ assertEquals(AF_INET6, inetDiagMsg.inetDiagMsg.idiag_family);
+ assertEquals(2, inetDiagMsg.inetDiagMsg.idiag_state);
+ assertEquals(16, inetDiagMsg.inetDiagMsg.idiag_timer);
+ assertEquals(32, inetDiagMsg.inetDiagMsg.idiag_retrans);
assertInetDiagSockId(inetDiagMsg.inetDiagMsg.id,
new InetSocketAddress(InetAddresses.parseNumericAddress("2001:db8::3"), 43077),
new InetSocketAddress(InetAddresses.parseNumericAddress("2001:db8::4"), 443),
8 /* ifIndex */,
99 /* cookie */);
+ assertEquals(48, inetDiagMsg.inetDiagMsg.idiag_expires);
+ assertEquals(64, inetDiagMsg.inetDiagMsg.idiag_rqueue);
+ assertEquals(80, inetDiagMsg.inetDiagMsg.idiag_wqueue);
+ assertEquals(12345, inetDiagMsg.inetDiagMsg.idiag_uid);
+ assertEquals(6789, inetDiagMsg.inetDiagMsg.idiag_inode);
}
private static final byte[] INET_DIAG_MSG_BYTES =