common/netdispatcher.cpp (45 lines of code) (raw):

#include "common/netdispatcher.h" #include <map> using namespace swss; #define MUTEX std::lock_guard<std::mutex> _lock(m_mutex); NetDispatcher& NetDispatcher::getInstance() { static NetDispatcher gInstance; return gInstance; } void NetDispatcher::registerMessageHandler(int nlmsg_type, NetMsg *callback) { MUTEX; if (m_handlers.find(nlmsg_type) != m_handlers.end()) throw "Trying to register on already registered netlink message"; m_handlers[nlmsg_type] = callback; } void NetDispatcher::unregisterMessageHandler(int nlmsg_type) { MUTEX; auto it = m_handlers.find(nlmsg_type); if (it == m_handlers.end()) throw "Trying to unregister non existing handler"; m_handlers.erase(it); } void NetDispatcher::nlCallback(struct nl_object *obj, void *context) { NetMsg *callback = (NetMsg *)context; callback->onMsg(nl_object_get_msgtype(obj), obj); } NetMsg* NetDispatcher::getCallback(int nlmsg_type) { MUTEX; auto callback = m_handlers.find(nlmsg_type); if (callback == m_handlers.end()) return nullptr; return callback->second; } void NetDispatcher::onNetlinkMessage(struct nl_msg *msg) { struct nlmsghdr *nlmsghdr = nlmsg_hdr(msg); auto callback = getCallback(nlmsghdr->nlmsg_type); /* Drop not registered messages */ if (callback == nullptr) return; nl_msg_parse(msg, NetDispatcher::nlCallback, (callback)); }