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 111e0bae9a..781a04e6cf 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 ff37639283..527236695c 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/src/com/android/net/module/util/netlink/StructNlMsgHdrTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/netlink/StructNlMsgHdrTest.java index b7f68c6236..a0d8b8cc06 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"); + } }