rtnetlink_server: Use netlink parser code

Change-Id: I97a8fd1c692973a8ac97171dfaf309cfc9cfceb1
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/rtnetlink_server.cpp b/src/rtnetlink_server.cpp
index d14b28e..cf68340 100644
--- a/src/rtnetlink_server.cpp
+++ b/src/rtnetlink_server.cpp
@@ -1,5 +1,6 @@
 #include "rtnetlink_server.hpp"
 
+#include "netlink.hpp"
 #include "types.hpp"
 
 #include <linux/netlink.h>
@@ -18,10 +19,11 @@
 
 extern std::unique_ptr<Timer> refreshObjectTimer;
 
-namespace rtnetlink
+namespace netlink
 {
 
-static bool shouldRefresh(const struct nlmsghdr& hdr, std::string_view data)
+static bool shouldRefresh(const struct nlmsghdr& hdr,
+                          std::string_view data) noexcept
 {
     switch (hdr.nlmsg_type)
     {
@@ -49,41 +51,17 @@
     return false;
 }
 
-/* Call Back for the sd event loop */
+static void handler(const nlmsghdr& hdr, std::string_view data)
+{
+    if (shouldRefresh(hdr, data) && !refreshObjectTimer->isEnabled())
+    {
+        refreshObjectTimer->restartOnce(refreshTimeout);
+    }
+}
+
 static void eventHandler(sdeventplus::source::IO&, int fd, uint32_t)
 {
-    std::array<char, BUFSIZE> buffer = {};
-    int len{};
-
-    auto netLinkHeader = reinterpret_cast<struct nlmsghdr*>(buffer.data());
-
-    while ((len = recv(fd, netLinkHeader, buffer.size(), 0)) > 0)
-    {
-        for (; (NLMSG_OK(netLinkHeader, len)) &&
-               (netLinkHeader->nlmsg_type != NLMSG_DONE);
-             netLinkHeader = NLMSG_NEXT(netLinkHeader, len))
-        {
-            std::string_view data(
-                reinterpret_cast<const char*>(NLMSG_DATA(netLinkHeader)),
-                netLinkHeader->nlmsg_len - NLMSG_HDRLEN);
-            if (shouldRefresh(*netLinkHeader, data))
-            {
-                // starting the timer here to make sure that we don't want
-                // create the child objects multiple times.
-                if (!refreshObjectTimer->isEnabled())
-                {
-                    // if start timer throws exception then let the application
-                    // crash
-                    refreshObjectTimer->restartOnce(refreshTimeout);
-                } // end if
-            }     // end if
-
-        } // end for
-
-        buffer.fill('\0');
-
-        netLinkHeader = reinterpret_cast<struct nlmsghdr*>(buffer.data());
-    } // end while
+    receive(fd, handler);
 }
 
 static stdplus::ManagedFd makeSock()
@@ -109,6 +87,6 @@
 {
 }
 
-} // namespace rtnetlink
+} // namespace netlink
 } // namespace network
 } // namespace phosphor