Create netlink socket outside from rtnetlink server

As socket lifetime goes out of scope before starting the
sd event loop,so now create the socket outside and pass
it to rtnetlink server.

Resolves openbmc/openbmc#2562
Resolves openbmc/openbmc#2575
Resolves openbmc/openbmc#2632

Change-Id: If80a9cc3556c201a8864836e738d23fcef80b9e7
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
diff --git a/rtnetlink_server.cpp b/rtnetlink_server.cpp
index 2e1c5bb..955706c 100644
--- a/rtnetlink_server.cpp
+++ b/rtnetlink_server.cpp
@@ -65,20 +65,21 @@
     return 0;
 }
 
-Server::Server(EventPtr& eventPtr)
+Server::Server(EventPtr& eventPtr, const phosphor::Descriptor& smartSock)
 {
     using namespace phosphor::logging;
     using InternalFailure = sdbusplus::xyz::openbmc_project::Common::
                                     Error::InternalFailure;
     struct sockaddr_nl addr {};
-
-    int fd = -1;
-    phosphor::Descriptor smartSock(fd);
-
     int r {};
 
     sigset_t ss {};
-
+    // check that the given socket is valid or not.
+    if(smartSock() < 0)
+    {
+        r = -EBADF;
+        goto finish;
+    }
 
     if (sigemptyset(&ss) < 0 || sigaddset(&ss, SIGTERM) < 0 ||
         sigaddset(&ss, SIGINT) < 0)
@@ -108,16 +109,6 @@
         goto finish;
     }
 
-    fd = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
-    if (fd < 0)
-    {
-        r = -errno;
-        goto finish;
-    }
-
-    smartSock.set(fd);
-    fd = -1;
-
     memset(&addr, 0, sizeof(addr));
     addr.nl_family = AF_NETLINK;
     addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;