rtnetlink: Switch to stdplus::Fd
Simplifies the code a little bit and will allow us to remove the
Descriptor.
Change-Id: If78ea4478fed9f818bcf1d00ef1c952cb5c7df00
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/network_manager_main.cpp b/src/network_manager_main.cpp
index 802b7d6..b72e32d 100644
--- a/src/network_manager_main.cpp
+++ b/src/network_manager_main.cpp
@@ -265,19 +265,6 @@
} // namespace network
} // namespace phosphor
-void createNetLinkSocket(phosphor::Descriptor& smartSock)
-{
- // RtnetLink socket
- auto fd = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
- if (fd < 0)
- {
- log<level::ERR>("Unable to create the net link socket",
- entry("ERRNO=%d", errno));
- elog<InternalFailure>();
- }
- smartSock.set(fd);
-}
-
int main(int /*argc*/, char** /*argv*/)
{
phosphor::network::initializeTimers();
@@ -315,12 +302,8 @@
phosphor::network::manager->reloadConfigs();
}
- // RtnetLink socket
- phosphor::Descriptor smartSock;
- createNetLinkSocket(smartSock);
-
// RTNETLINK event handler
- phosphor::network::rtnetlink::Server svr(eventPtr, smartSock);
+ phosphor::network::rtnetlink::Server svr(eventPtr);
#ifdef SYNC_MAC_FROM_INVENTORY
std::ifstream in(configFile);
diff --git a/src/rtnetlink_server.cpp b/src/rtnetlink_server.cpp
index b7b7cb3..3722a678 100644
--- a/src/rtnetlink_server.cpp
+++ b/src/rtnetlink_server.cpp
@@ -1,19 +1,15 @@
#include "rtnetlink_server.hpp"
-#include "types.hpp"
-#include "util.hpp"
-
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
-#include <net/if.h>
#include <netinet/in.h>
-#include <sys/types.h>
-#include <systemd/sd-daemon.h>
-#include <unistd.h>
#include <memory>
#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/log.hpp>
+#include <stdplus/fd/create.hpp>
+#include <stdplus/fd/ops.hpp>
+#include <stdplus/signal.hpp>
#include <string_view>
#include <xyz/openbmc_project/Common/error.hpp>
@@ -96,64 +92,49 @@
return 0;
}
-Server::Server(EventPtr& eventPtr, const phosphor::Descriptor& smartSock)
+static stdplus::ManagedFd makeSock()
+{
+ using namespace stdplus::fd;
+
+ auto sock = socket(SocketDomain::Netlink, SocketType::Raw,
+ static_cast<stdplus::fd::SocketProto>(NETLINK_ROUTE));
+
+ sock.fcntlSetfl(sock.fcntlGetfl().set(FileFlag::NonBlock));
+
+ sockaddr_nl local{};
+ local.nl_family = AF_NETLINK;
+ local.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
+ RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_NEIGH;
+ bind(sock, local);
+
+ return sock;
+}
+
+Server::Server(EventPtr& eventPtr) : sock(makeSock())
{
using namespace phosphor::logging;
using InternalFailure =
sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
- struct sockaddr_nl addr
- {
- };
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)
- {
- r = -errno;
- goto finish;
- }
- /* Block SIGTERM first, so that the event loop can handle it */
- if (sigprocmask(SIG_BLOCK, &ss, NULL) < 0)
- {
- r = -errno;
- goto finish;
- }
-
/* Let's make use of the default handler and "floating"
reference features of sd_event_add_signal() */
+ stdplus::signal::block(SIGTERM);
r = sd_event_add_signal(eventPtr.get(), NULL, SIGTERM, NULL, NULL);
if (r < 0)
{
goto finish;
}
+ stdplus::signal::block(SIGINT);
r = sd_event_add_signal(eventPtr.get(), NULL, SIGINT, NULL, NULL);
if (r < 0)
{
goto finish;
}
- std::memset(&addr, 0, sizeof(addr));
- addr.nl_family = AF_NETLINK;
- addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
- RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_NEIGH;
-
- if (bind(smartSock(), (struct sockaddr*)&addr, sizeof(addr)) < 0)
- {
- r = -errno;
- goto finish;
- }
-
- r = sd_event_add_io(eventPtr.get(), nullptr, smartSock(), EPOLLIN,
+ r = sd_event_add_io(eventPtr.get(), nullptr, sock.get(), EPOLLIN,
eventHandler, nullptr);
if (r < 0)
{
diff --git a/src/rtnetlink_server.hpp b/src/rtnetlink_server.hpp
index e62f51c..aca3744 100644
--- a/src/rtnetlink_server.hpp
+++ b/src/rtnetlink_server.hpp
@@ -1,9 +1,8 @@
#pragma once
#include "types.hpp"
-#include "util.hpp"
-#include <systemd/sd-event.h>
+#include <stdplus/fd/managed.hpp>
namespace phosphor
{
@@ -31,14 +30,16 @@
* @param[in] eventPtr - Unique ptr reference to sd_event.
* @param[in] socket - netlink socket.
*/
- Server(EventPtr& eventPtr, const phosphor::Descriptor& socket);
+ Server(EventPtr& eventPtr);
- Server() = delete;
- ~Server() = default;
- Server(const Server&) = delete;
- Server& operator=(const Server&) = delete;
- Server(Server&&) = default;
- Server& operator=(Server&&) = default;
+ /** @brief Gets the socket associated with this netlink server */
+ inline stdplus::Fd& getSock()
+ {
+ return sock;
+ }
+
+ private:
+ stdplus::ManagedFd sock;
};
} // namespace rtnetlink