Loading common/moduleutils/src/android/net/ip/ConntrackMonitor.java +15 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,21 @@ public class ConntrackMonitor extends NetlinkMonitor { return Objects.hash(msgType, tupleOrig, tupleReply, status, timeoutSec); } @Override public String toString() { return "ConntrackEvent{ " + "msg_type{" + NetlinkConstants.stringForNlMsgType(msgType, OsConstants.NETLINK_NETFILTER) + "}, " + "tuple_orig{" + tupleOrig + "}, " + "tuple_reply{" + tupleReply + "}, " + "status{" + status + "(" + ConntrackMessage.stringForIpConntrackStatus(status) + ")" + "}, " + "timeout_sec{" + Integer.toUnsignedLong(timeoutSec) + "} " + "}"; } /** * Check the established NAT session conntrack message. * Loading common/netlinkclient/src/android/net/netlink/ConntrackMessage.java +99 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,19 @@ public class ConntrackMessage extends NetlinkMessage { public int hashCode() { return Objects.hash(srcIp, dstIp, srcPort, dstPort, protoNum); } @Override public String toString() { final String srcIpStr = (srcIp == null) ? "null" : srcIp.getHostAddress(); final String dstIpStr = (dstIp == null) ? "null" : dstIp.getHostAddress(); final String protoStr = NetlinkConstants.stringForProtocol(protoNum); return "Tuple{ " + protoStr + ": " + srcIpStr + ":" + Short.toUnsignedInt(srcPort) + " -> " + dstIpStr + ":" + Short.toUnsignedInt(dstPort) + " }"; } } /** Loading Loading @@ -450,4 +463,90 @@ public class ConntrackMessage extends NetlinkMessage { public short getMessageType() { return (short) (getHeader().nlmsg_type & ~(NetlinkConstants.NFNL_SUBSYS_CTNETLINK << 8)); } /** * Convert an ip conntrack status to a string. */ public static String stringForIpConntrackStatus(int flags) { final StringBuilder sb = new StringBuilder(); if ((flags & IPS_EXPECTED) != 0) { sb.append("IPS_EXPECTED"); } if ((flags & IPS_SEEN_REPLY) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_SEEN_REPLY"); } if ((flags & IPS_ASSURED) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_ASSURED"); } if ((flags & IPS_CONFIRMED) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_CONFIRMED"); } if ((flags & IPS_SRC_NAT) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_SRC_NAT"); } if ((flags & IPS_DST_NAT) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_DST_NAT"); } if ((flags & IPS_SEQ_ADJUST) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_SEQ_ADJUST"); } if ((flags & IPS_SRC_NAT_DONE) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_SRC_NAT_DONE"); } if ((flags & IPS_DST_NAT_DONE) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_DST_NAT_DONE"); } if ((flags & IPS_DYING) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_DYING"); } if ((flags & IPS_FIXED_TIMEOUT) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_FIXED_TIMEOUT"); } if ((flags & IPS_TEMPLATE) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_TEMPLATE"); } if ((flags & IPS_UNTRACKED) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_UNTRACKED"); } if ((flags & IPS_HELPER) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_HELPER"); } if ((flags & IPS_OFFLOAD) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_OFFLOAD"); } if ((flags & IPS_HW_OFFLOAD) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_HW_OFFLOAD"); } return sb.toString(); } @Override public String toString() { return "ConntrackMessage{ " + "nlmsghdr{" + (mHeader == null ? "" : mHeader.toString(OsConstants.NETLINK_NETFILTER)) + "}, " + "nfgenmsg{" + nfGenMsg + "}, " + "tuple_orig{" + tupleOrig + "}, " + "tuple_reply{" + tupleReply + "}, " + "status{" + status + "(" + stringForIpConntrackStatus(status) + ")" + "}, " + "timeout_sec{" + Integer.toUnsignedLong(timeoutSec) + "} " + "}"; } } common/netlinkclient/src/android/net/netlink/StructNfGenMsg.java +11 −0 Original line number Diff line number Diff line Loading @@ -89,4 +89,15 @@ public class StructNfGenMsg { private static boolean hasAvailableSpace(@NonNull ByteBuffer byteBuffer) { return byteBuffer.remaining() >= STRUCT_SIZE; } @Override public String toString() { final String familyStr = NetlinkConstants.stringForAddressFamily(nfgen_family); return "NfGenMsg{ " + "nfgen_family{" + familyStr + "}, " + "version{" + Byte.toUnsignedInt(version) + "}, " + "res_id{" + Short.toUnsignedInt(res_id) + "} " + "}"; } } tests/unit/src/android/net/ip/ConntrackMonitorTest.java +20 −1 Original line number Diff line number Diff line Loading @@ -257,6 +257,26 @@ public class ConntrackMonitorTest { assertNotEquals(e, timeoutSecNotEqual); } // TODO: consider moving to a common file for sharing. private static void assertContains(String actualValue, String expectedSubstring) { if (actualValue.contains(expectedSubstring)) return; fail("\"" + actualValue + "\" does not contain \"" + expectedSubstring + "\""); } @Test public void testToString() { final ConntrackEvent event = makeTestConntrackEvent(IPCTNL_MSG_CT_NEW, 0x198 /* status */, 120 /* timeoutSec */); final String s = event.toString(); // Verify the converted string of msg_type, tuple_orig, tuple_reply, status and timeout. assertContains(s, "IPCTNL_MSG_CT_NEW"); assertContains(s, "IPPROTO_TCP: 192.168.80.12:62449 -> 140.112.8.116:443"); assertContains(s, "IPPROTO_TCP: 140.112.8.116:443 -> 100.81.179.1:62449"); assertContains(s, "IPS_CONFIRMED|IPS_SRC_NAT|IPS_SRC_NAT_DONE|IPS_DST_NAT_DONE"); assertContains(s, "timeout_sec{120}"); } public static final String CT_V4DELETE_TCP_HEX = // CHECKSTYLE:OFF IndentationCheck // struct nlmsghdr Loading Loading @@ -317,5 +337,4 @@ public class ConntrackMonitorTest { mConntrackMonitor.sendMessage(CT_V4DELETE_TCP_BYTES); verify(mConsumer, timeout(TIMEOUT_MS)).accept(eq(expectedEvent)); } } tests/unit/src/android/net/netlink/ConntrackMessageTest.java +30 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeTrue; import android.system.OsConstants; Loading Loading @@ -402,4 +403,33 @@ public class ConntrackMessageTest { } assertEquals(4, messageCount); } // TODO: consider moving to a common file for sharing. private static void assertContains(String actualValue, String expectedSubstring) { if (actualValue.contains(expectedSubstring)) return; fail("\"" + actualValue + "\" does not contain \"" + expectedSubstring + "\""); } @Test public void testToString() { assumeTrue(USING_LE); final ByteBuffer byteBuffer = ByteBuffer.wrap(CT_V4NEW_TCP_BYTES); byteBuffer.order(ByteOrder.nativeOrder()); final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, OsConstants.NETLINK_NETFILTER); assertNotNull(msg); assertTrue(msg instanceof ConntrackMessage); final ConntrackMessage conntrackMessage = (ConntrackMessage) msg; final String s = conntrackMessage.toString(); // Verify the converted string of nlmsg_type, tuple_orig, tuple_reply, status and timeout. // Note that the "nlmsg_flags" string doesn't verify because the flags which have the same // value is not distinguishable now. See StructNlMsgHdr#stringForNlMsgFlags. // TODO: verify the converted string of nlmsg_flags once it has fixed. assertContains(s, "IPCTNL_MSG_CT_NEW"); assertContains(s, "IPPROTO_TCP: 192.168.80.12:62449 -> 140.112.8.116:443"); assertContains(s, "IPPROTO_TCP: 140.112.8.116:443 -> 100.81.179.1:62449"); assertContains(s, "IPS_CONFIRMED|IPS_SRC_NAT|IPS_SRC_NAT_DONE|IPS_DST_NAT_DONE"); assertContains(s, "timeout_sec{120}"); } } Loading
common/moduleutils/src/android/net/ip/ConntrackMonitor.java +15 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,21 @@ public class ConntrackMonitor extends NetlinkMonitor { return Objects.hash(msgType, tupleOrig, tupleReply, status, timeoutSec); } @Override public String toString() { return "ConntrackEvent{ " + "msg_type{" + NetlinkConstants.stringForNlMsgType(msgType, OsConstants.NETLINK_NETFILTER) + "}, " + "tuple_orig{" + tupleOrig + "}, " + "tuple_reply{" + tupleReply + "}, " + "status{" + status + "(" + ConntrackMessage.stringForIpConntrackStatus(status) + ")" + "}, " + "timeout_sec{" + Integer.toUnsignedLong(timeoutSec) + "} " + "}"; } /** * Check the established NAT session conntrack message. * Loading
common/netlinkclient/src/android/net/netlink/ConntrackMessage.java +99 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,19 @@ public class ConntrackMessage extends NetlinkMessage { public int hashCode() { return Objects.hash(srcIp, dstIp, srcPort, dstPort, protoNum); } @Override public String toString() { final String srcIpStr = (srcIp == null) ? "null" : srcIp.getHostAddress(); final String dstIpStr = (dstIp == null) ? "null" : dstIp.getHostAddress(); final String protoStr = NetlinkConstants.stringForProtocol(protoNum); return "Tuple{ " + protoStr + ": " + srcIpStr + ":" + Short.toUnsignedInt(srcPort) + " -> " + dstIpStr + ":" + Short.toUnsignedInt(dstPort) + " }"; } } /** Loading Loading @@ -450,4 +463,90 @@ public class ConntrackMessage extends NetlinkMessage { public short getMessageType() { return (short) (getHeader().nlmsg_type & ~(NetlinkConstants.NFNL_SUBSYS_CTNETLINK << 8)); } /** * Convert an ip conntrack status to a string. */ public static String stringForIpConntrackStatus(int flags) { final StringBuilder sb = new StringBuilder(); if ((flags & IPS_EXPECTED) != 0) { sb.append("IPS_EXPECTED"); } if ((flags & IPS_SEEN_REPLY) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_SEEN_REPLY"); } if ((flags & IPS_ASSURED) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_ASSURED"); } if ((flags & IPS_CONFIRMED) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_CONFIRMED"); } if ((flags & IPS_SRC_NAT) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_SRC_NAT"); } if ((flags & IPS_DST_NAT) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_DST_NAT"); } if ((flags & IPS_SEQ_ADJUST) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_SEQ_ADJUST"); } if ((flags & IPS_SRC_NAT_DONE) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_SRC_NAT_DONE"); } if ((flags & IPS_DST_NAT_DONE) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_DST_NAT_DONE"); } if ((flags & IPS_DYING) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_DYING"); } if ((flags & IPS_FIXED_TIMEOUT) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_FIXED_TIMEOUT"); } if ((flags & IPS_TEMPLATE) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_TEMPLATE"); } if ((flags & IPS_UNTRACKED) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_UNTRACKED"); } if ((flags & IPS_HELPER) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_HELPER"); } if ((flags & IPS_OFFLOAD) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_OFFLOAD"); } if ((flags & IPS_HW_OFFLOAD) != 0) { if (sb.length() > 0) sb.append("|"); sb.append("IPS_HW_OFFLOAD"); } return sb.toString(); } @Override public String toString() { return "ConntrackMessage{ " + "nlmsghdr{" + (mHeader == null ? "" : mHeader.toString(OsConstants.NETLINK_NETFILTER)) + "}, " + "nfgenmsg{" + nfGenMsg + "}, " + "tuple_orig{" + tupleOrig + "}, " + "tuple_reply{" + tupleReply + "}, " + "status{" + status + "(" + stringForIpConntrackStatus(status) + ")" + "}, " + "timeout_sec{" + Integer.toUnsignedLong(timeoutSec) + "} " + "}"; } }
common/netlinkclient/src/android/net/netlink/StructNfGenMsg.java +11 −0 Original line number Diff line number Diff line Loading @@ -89,4 +89,15 @@ public class StructNfGenMsg { private static boolean hasAvailableSpace(@NonNull ByteBuffer byteBuffer) { return byteBuffer.remaining() >= STRUCT_SIZE; } @Override public String toString() { final String familyStr = NetlinkConstants.stringForAddressFamily(nfgen_family); return "NfGenMsg{ " + "nfgen_family{" + familyStr + "}, " + "version{" + Byte.toUnsignedInt(version) + "}, " + "res_id{" + Short.toUnsignedInt(res_id) + "} " + "}"; } }
tests/unit/src/android/net/ip/ConntrackMonitorTest.java +20 −1 Original line number Diff line number Diff line Loading @@ -257,6 +257,26 @@ public class ConntrackMonitorTest { assertNotEquals(e, timeoutSecNotEqual); } // TODO: consider moving to a common file for sharing. private static void assertContains(String actualValue, String expectedSubstring) { if (actualValue.contains(expectedSubstring)) return; fail("\"" + actualValue + "\" does not contain \"" + expectedSubstring + "\""); } @Test public void testToString() { final ConntrackEvent event = makeTestConntrackEvent(IPCTNL_MSG_CT_NEW, 0x198 /* status */, 120 /* timeoutSec */); final String s = event.toString(); // Verify the converted string of msg_type, tuple_orig, tuple_reply, status and timeout. assertContains(s, "IPCTNL_MSG_CT_NEW"); assertContains(s, "IPPROTO_TCP: 192.168.80.12:62449 -> 140.112.8.116:443"); assertContains(s, "IPPROTO_TCP: 140.112.8.116:443 -> 100.81.179.1:62449"); assertContains(s, "IPS_CONFIRMED|IPS_SRC_NAT|IPS_SRC_NAT_DONE|IPS_DST_NAT_DONE"); assertContains(s, "timeout_sec{120}"); } public static final String CT_V4DELETE_TCP_HEX = // CHECKSTYLE:OFF IndentationCheck // struct nlmsghdr Loading Loading @@ -317,5 +337,4 @@ public class ConntrackMonitorTest { mConntrackMonitor.sendMessage(CT_V4DELETE_TCP_BYTES); verify(mConsumer, timeout(TIMEOUT_MS)).accept(eq(expectedEvent)); } }
tests/unit/src/android/net/netlink/ConntrackMessageTest.java +30 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeTrue; import android.system.OsConstants; Loading Loading @@ -402,4 +403,33 @@ public class ConntrackMessageTest { } assertEquals(4, messageCount); } // TODO: consider moving to a common file for sharing. private static void assertContains(String actualValue, String expectedSubstring) { if (actualValue.contains(expectedSubstring)) return; fail("\"" + actualValue + "\" does not contain \"" + expectedSubstring + "\""); } @Test public void testToString() { assumeTrue(USING_LE); final ByteBuffer byteBuffer = ByteBuffer.wrap(CT_V4NEW_TCP_BYTES); byteBuffer.order(ByteOrder.nativeOrder()); final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, OsConstants.NETLINK_NETFILTER); assertNotNull(msg); assertTrue(msg instanceof ConntrackMessage); final ConntrackMessage conntrackMessage = (ConntrackMessage) msg; final String s = conntrackMessage.toString(); // Verify the converted string of nlmsg_type, tuple_orig, tuple_reply, status and timeout. // Note that the "nlmsg_flags" string doesn't verify because the flags which have the same // value is not distinguishable now. See StructNlMsgHdr#stringForNlMsgFlags. // TODO: verify the converted string of nlmsg_flags once it has fixed. assertContains(s, "IPCTNL_MSG_CT_NEW"); assertContains(s, "IPPROTO_TCP: 192.168.80.12:62449 -> 140.112.8.116:443"); assertContains(s, "IPPROTO_TCP: 140.112.8.116:443 -> 100.81.179.1:62449"); assertContains(s, "IPS_CONFIRMED|IPS_SRC_NAT|IPS_SRC_NAT_DONE|IPS_DST_NAT_DONE"); assertContains(s, "timeout_sec{120}"); } }