summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRatan Gupta <ratagupt@in.ibm.com>2017-11-10 17:58:17 +0530
committerRatan Gupta <ratagupt@in.ibm.com>2017-11-16 21:18:28 +0530
commitf66573871b71dafcef29630b1bb2aeb896af51de (patch)
treeb6ebd3f7eef00149c500e9043d591eb6763f9b1f
parent4b4a0080d61eb8346c0aeae07364d416db5399a4 (diff)
downloadphosphor-networkd-f66573871b71dafcef29630b1bb2aeb896af51de.tar.gz
phosphor-networkd-f66573871b71dafcef29630b1bb2aeb896af51de.zip
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>
-rw-r--r--network_manager_main.cpp31
-rw-r--r--rtnetlink_server.cpp23
-rw-r--r--rtnetlink_server.hpp3
3 files changed, 37 insertions, 20 deletions
diff --git a/network_manager_main.cpp b/network_manager_main.cpp
index b08d5ac..3828c9b 100644
--- a/network_manager_main.cpp
+++ b/network_manager_main.cpp
@@ -5,11 +5,14 @@
#include "watch.hpp"
#include "dns_updater.hpp"
-#include <memory>
+#include <linux/netlink.h>
+#include <memory>
+#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/log.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/manager.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
namespace phosphor
{
@@ -53,6 +56,25 @@ void initializeTimers()
std::make_unique<phosphor::network::Timer>(restartFunc);
}
+void createNetLinkSocket(phosphor::Descriptor& smartSock)
+{
+ using namespace phosphor::logging;
+ using InternalFailure = sdbusplus::xyz::openbmc_project::Common::
+ Error::InternalFailure;
+ //RtnetLink socket
+ auto fd = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
+ if (fd < 0)
+ {
+ auto r = -errno;
+ log<level::ERR>("Unable to create the net link socket",
+ entry("ERRNO=%d", r));
+ elog<InternalFailure>();
+ }
+ smartSock.set(fd);
+}
+
+
+
int main(int argc, char *argv[])
{
using namespace phosphor::logging;
@@ -100,8 +122,12 @@ int main(int argc, char *argv[])
phosphor::network::restartNetwork();
}
+ //RtnetLink socket
+ phosphor::Descriptor smartSock;
+ createNetLinkSocket(smartSock);
+
// RTNETLINK event handler
- phosphor::network::rtnetlink::Server svr(eventPtr);
+ phosphor::network::rtnetlink::Server svr(eventPtr, smartSock);
// DNS entry handler
phosphor::network::inotify::Watch watch(eventPtr, DNS_ENTRY_FILE,
@@ -114,7 +140,6 @@ int main(int argc, char *argv[])
// waiting on change events
phosphor::network::dns::updater::processDNSEntries(DNS_ENTRY_FILE);
- // Run the server
sd_event_loop(eventPtr.get());
}
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 @@ static int eventHandler(sd_event_source* es, int fd, uint32_t revents,
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 @@ Server::Server(EventPtr& eventPtr)
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;
diff --git a/rtnetlink_server.hpp b/rtnetlink_server.hpp
index a00e6b7..0991ae0 100644
--- a/rtnetlink_server.hpp
+++ b/rtnetlink_server.hpp
@@ -30,8 +30,9 @@ class Server
* @details Sets up the server to handle incoming RTNETLINK events
*
* @param[in] eventPtr - Unique ptr reference to sd_event.
+ * @param[in] socket - netlink socket.
*/
- Server(EventPtr& eventPtr);
+ Server(EventPtr& eventPtr, const phosphor::Descriptor& socket);
Server() = delete;
~Server() = default;
OpenPOWER on IntegriCloud