rtnetlink_server: Use netlink parser code

Change-Id: I97a8fd1c692973a8ac97171dfaf309cfc9cfceb1
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/netlink.cpp b/src/netlink.cpp
index 5bc876f..ed1278f 100644
--- a/src/netlink.cpp
+++ b/src/netlink.cpp
@@ -78,53 +78,6 @@
     }
 }
 
-static void receive(int sock, ReceiveCallback cb)
-{
-    // We need to make sure we have enough room for an entire packet otherwise
-    // it gets truncated. The netlink docs guarantee packets will not exceed 8K
-    std::array<char, 8192> buf;
-
-    iovec iov{};
-    iov.iov_base = buf.data();
-    iov.iov_len = buf.size();
-
-    sockaddr_nl from{};
-    from.nl_family = AF_NETLINK;
-
-    msghdr hdr{};
-    hdr.msg_name = &from;
-    hdr.msg_namelen = sizeof(from);
-    hdr.msg_iov = &iov;
-    hdr.msg_iovlen = 1;
-
-    // We only do multiple recvs if we have a MULTI type message
-    bool done = true;
-    do
-    {
-        ssize_t recvd = recvmsg(sock, &hdr, 0);
-        if (recvd < 0)
-        {
-            throw std::system_error(errno, std::generic_category(),
-                                    "netlink recvmsg");
-        }
-        if (recvd == 0)
-        {
-            throw std::runtime_error("netlink recvmsg: Got empty payload");
-        }
-
-        std::string_view msgs(buf.data(), recvd);
-        do
-        {
-            processMsg(msgs, done, cb);
-        } while (!done && !msgs.empty());
-
-        if (done && !msgs.empty())
-        {
-            throw std::runtime_error("Extra unprocessed netlink messages");
-        }
-    } while (!done);
-}
-
 static void requestSend(int sock, void* data, size_t size)
 {
     sockaddr_nl dst{};
@@ -170,6 +123,57 @@
 
 } // namespace detail
 
+void receive(int sock, ReceiveCallback cb)
+{
+    // We need to make sure we have enough room for an entire packet otherwise
+    // it gets truncated. The netlink docs guarantee packets will not exceed 8K
+    std::array<char, 8192> buf;
+
+    iovec iov{};
+    iov.iov_base = buf.data();
+    iov.iov_len = buf.size();
+
+    sockaddr_nl from{};
+    from.nl_family = AF_NETLINK;
+
+    msghdr hdr{};
+    hdr.msg_name = &from;
+    hdr.msg_namelen = sizeof(from);
+    hdr.msg_iov = &iov;
+    hdr.msg_iovlen = 1;
+
+    // We only do multiple recvs if we have a MULTI type message
+    bool done = true;
+    do
+    {
+        ssize_t recvd = recvmsg(sock, &hdr, 0);
+        if (recvd < 0)
+        {
+            throw std::system_error(errno, std::generic_category(),
+                                    "netlink recvmsg");
+        }
+        if (recvd == 0)
+        {
+            if (!done)
+            {
+                throw std::runtime_error("netlink recvmsg: Got empty payload");
+            }
+            return;
+        }
+
+        std::string_view msgs(buf.data(), recvd);
+        do
+        {
+            detail::processMsg(msgs, done, cb);
+        } while (!done && !msgs.empty());
+
+        if (done && !msgs.empty())
+        {
+            throw std::runtime_error("Extra unprocessed netlink messages");
+        }
+    } while (!done);
+}
+
 std::tuple<rtattr, std::string_view> extractRtAttr(std::string_view& data)
 {
     auto hdr = stdplus::raw::copyFrom<rtattr>(data);