diff --git a/staticlibs/device/com/android/net/module/util/netlink/NetlinkMessage.java b/staticlibs/device/com/android/net/module/util/netlink/NetlinkMessage.java index 111e0bae9a5abe9deefce5c3c5c042a05c7c7589..781a04e6cf095071f113b9884ea485743604950b 100644 --- a/staticlibs/device/com/android/net/module/util/netlink/NetlinkMessage.java +++ b/staticlibs/device/com/android/net/module/util/netlink/NetlinkMessage.java @@ -142,6 +142,7 @@ public class NetlinkMessage { return (NetlinkMessage) RtNetlinkAddressMessage.parse(nlmsghdr, byteBuffer); case NetlinkConstants.RTM_NEWROUTE: case NetlinkConstants.RTM_DELROUTE: + case NetlinkConstants.RTM_GETROUTE: return (NetlinkMessage) RtNetlinkRouteMessage.parse(nlmsghdr, byteBuffer); case NetlinkConstants.RTM_NEWNEIGH: case NetlinkConstants.RTM_DELNEIGH: diff --git a/staticlibs/device/com/android/net/module/util/netlink/StructNlMsgHdr.java b/staticlibs/device/com/android/net/module/util/netlink/StructNlMsgHdr.java index ff37639283ba2fe7f741b6f7702a30e4022fb33a..527236695cb64078eccac8535a8326f45a4c65ee 100644 --- a/staticlibs/device/com/android/net/module/util/netlink/StructNlMsgHdr.java +++ b/staticlibs/device/com/android/net/module/util/netlink/StructNlMsgHdr.java @@ -71,13 +71,17 @@ public class StructNlMsgHdr { } sb.append("NLM_F_ECHO"); } - if ((flags & NLM_F_ROOT) != 0) { + if ((flags & NLM_F_DUMP) == NLM_F_DUMP) { + if (sb.length() > 0) { + sb.append("|"); + } + sb.append("NLM_F_DUMP"); + } else if ((flags & NLM_F_ROOT) != 0) { // NLM_F_DUMP = NLM_F_ROOT | NLM_F_MATCH if (sb.length() > 0) { sb.append("|"); } sb.append("NLM_F_ROOT"); - } - if ((flags & NLM_F_MATCH) != 0) { + } else if ((flags & NLM_F_MATCH) != 0) { if (sb.length() > 0) { sb.append("|"); } diff --git a/staticlibs/tests/unit/Android.bp b/staticlibs/tests/unit/Android.bp index 031e52f87852d4b5a96897528a67cb6a55c02c4a..0dfca57f4435d93faeb5e43e5fd5855386b1fb37 100644 --- a/staticlibs/tests/unit/Android.bp +++ b/staticlibs/tests/unit/Android.bp @@ -33,7 +33,10 @@ android_library { "//packages/modules/Connectivity/Tethering/tests:__subpackages__", "//packages/modules/NetworkStack/tests/integration", ], - lint: { strict_updatability_linting: true }, + lint: { + strict_updatability_linting: true, + test: true + }, } android_test { diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/netlink/StructNlMsgHdrTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/netlink/StructNlMsgHdrTest.java index b7f68c6236d0c8c8425764a62aed89d12c1f283b..a0d8b8cc062c00af9085a4aaf8864960b103bc53 100644 --- a/staticlibs/tests/unit/src/com/android/net/module/util/netlink/StructNlMsgHdrTest.java +++ b/staticlibs/tests/unit/src/com/android/net/module/util/netlink/StructNlMsgHdrTest.java @@ -16,6 +16,7 @@ package com.android.net.module.util.netlink; +import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_DUMP; import static org.junit.Assert.fail; import android.system.OsConstants; @@ -48,10 +49,14 @@ public class StructNlMsgHdrTest { public static final String TEST_NLMSG_PID_STR = "nlmsg_pid{5678}"; private StructNlMsgHdr makeStructNlMsgHdr(short type) { + return makeStructNlMsgHdr(type, TEST_NLMSG_FLAGS); + } + + private StructNlMsgHdr makeStructNlMsgHdr(short type, short flags) { final StructNlMsgHdr struct = new StructNlMsgHdr(); struct.nlmsg_len = TEST_NLMSG_LEN; struct.nlmsg_type = type; - struct.nlmsg_flags = TEST_NLMSG_FLAGS; + struct.nlmsg_flags = flags; struct.nlmsg_seq = TEST_NLMSG_SEQ; struct.nlmsg_pid = TEST_NLMSG_PID; return struct; @@ -62,6 +67,11 @@ public class StructNlMsgHdrTest { fail("\"" + actualValue + "\" does not contain \"" + expectedSubstring + "\""); } + private static void assertNotContains(String actualValue, String unexpectedSubstring) { + if (!actualValue.contains(unexpectedSubstring)) return; + fail("\"" + actualValue + "\" contains \"" + unexpectedSubstring + "\""); + } + @Test public void testToString() { StructNlMsgHdr struct = makeStructNlMsgHdr(NetlinkConstants.RTM_NEWADDR); @@ -99,4 +109,31 @@ public class StructNlMsgHdrTest { assertContains(s, TEST_NLMSG_PID_STR); assertContains(s, "nlmsg_type{20(SOCK_DIAG_BY_FAMILY)}"); } + + @Test + public void testToString_flags_dumpRequest() { + final short flags = StructNlMsgHdr.NLM_F_REQUEST | StructNlMsgHdr.NLM_F_DUMP; + StructNlMsgHdr struct = makeStructNlMsgHdr(NetlinkConstants.RTM_GETROUTE, flags); + + String s = struct.toString(OsConstants.NETLINK_ROUTE); + + assertContains(s, "RTM_GETROUTE"); + assertContains(s, "NLM_F_REQUEST"); + assertContains(s, "NLM_F_DUMP"); + // NLM_F_DUMP = NLM_F_ROOT | NLM_F_MATCH; + assertNotContains(s, "NLM_F_MATCH"); + assertNotContains(s, "NLM_F_ROOT"); + } + + @Test + public void testToString_flags_root() { + final short flags = StructNlMsgHdr.NLM_F_ROOT; + StructNlMsgHdr struct = makeStructNlMsgHdr(NetlinkConstants.RTM_GETROUTE, flags); + + String s = struct.toString(OsConstants.NETLINK_ROUTE); + + assertContains(s, "NLM_F_ROOT"); + // NLM_F_DUMP = NLM_F_ROOT | NLM_F_MATCH; + assertNotContains(s, "NLM_F_DUMP"); + } }