int netlink_wrapper::handle_events() { m_cache_lock.lock(); nl_logfunc("--->handle_events"); BULLSEYE_EXCLUDE_BLOCK_START if (!m_handle) { nl_logerr("Cannot handle events before opening the channel. please call first open_channel()"); m_cache_lock.unlock(); return -1; } BULLSEYE_EXCLUDE_BLOCK_END int n = nl_cache_mngr_data_ready(m_mngr); //int n = nl_recvmsgs_default(m_handle); nl_logfunc("nl_recvmsgs=%d", n); if (n < 0) nl_logdbg("recvmsgs returned with error = %d", n); nl_logfunc("<---handle_events"); m_cache_lock.unlock(); return n; }
static gboolean _g_water_nl_source_dispatch(GSource *source, G_GNUC_UNUSED GSourceFunc callback_, G_GNUC_UNUSED gpointer user_data) { GWaterNlSource *self = (GWaterNlSource *)source; if ( self->cache_mngr != NULL ) nl_cache_mngr_data_ready(self->cache_mngr); else if ( self->sock != NULL ) nl_recvmsgs_default(self->sock); else g_assert_not_reached(); return G_SOURCE_CONTINUE; }
/** * Check for event notifications * @arg mngr Cache Manager * @arg timeout Upper limit poll() will block, in milliseconds. * * Causes poll() to be called to check for new event notifications * being available. Automatically receives and handles available * notifications. * * This functionally is ideally called regularly during an idle * period. * * @return A positive value if at least one update was handled, 0 * for none, or a negative error code. */ int nl_cache_mngr_poll(struct nl_cache_mngr *mngr, int timeout) { int ret; struct pollfd fds = { .fd = nl_socket_get_fd(mngr->cm_handle), .events = POLLIN, }; NL_DBG(3, "Cache manager %p, poll() fd %d\n", mngr, fds.fd); ret = poll(&fds, 1, timeout); NL_DBG(3, "Cache manager %p, poll() returned %d\n", mngr, ret); if (ret < 0) return -nl_syserr2nlerr(errno); if (ret == 0) return 0; return nl_cache_mngr_data_ready(mngr); } /** * Receive available event notifications * @arg mngr Cache manager * * This function can be called if the socket associated to the manager * contains updates to be received. This function should not be used * if nl_cache_mngr_poll() is used. * * @return A positive value if at least one update was handled, 0 * for none, or a negative error code. */ int nl_cache_mngr_data_ready(struct nl_cache_mngr *mngr) { int err; err = nl_recvmsgs_default(mngr->cm_handle); if (err < 0) return err; return 1; }
/** * Check for event notifications * @arg mngr Cache Manager * @arg timeout Upper limit poll() will block, in milliseconds. * * Causes poll() to be called to check for new event notifications * being available. Calls nl_cache_mngr_data_ready() to process * available data. * * This functionally is ideally called regularly during an idle * period. * * A timeout can be specified in milliseconds to limit the time the * function will wait for updates. * * @see nl_cache_mngr_data_ready() * * @return The number of messages processed or a negative error code. */ int nl_cache_mngr_poll(struct nl_cache_mngr *mngr, int timeout) { int ret; struct pollfd fds = { .fd = nl_socket_get_fd(mngr->cm_sock), .events = POLLIN, }; NL_DBG(3, "Cache manager %p, poll() fd %d\n", mngr, fds.fd); ret = poll(&fds, 1, timeout); NL_DBG(3, "Cache manager %p, poll() returned %d\n", mngr, ret); if (ret < 0) return -nl_syserr2nlerr(errno); /* No events, return */ if (ret == 0) return 0; return nl_cache_mngr_data_ready(mngr); } /** * Receive available event notifications * @arg mngr Cache manager * * This function can be called if the socket associated to the manager * contains updates to be received. This function should only be used * if nl_cache_mngr_poll() is not used. * * The function will process messages until there is no more data to * be read from the socket. * * @see nl_cache_mngr_poll() * * @return The number of messages processed or a negative error code. */ int nl_cache_mngr_data_ready(struct nl_cache_mngr *mngr) { int err, nread = 0; struct nl_cb *cb; NL_DBG(2, "Cache manager %p, reading new data from fd %d\n", mngr, nl_socket_get_fd(mngr->cm_sock)); cb = nl_cb_clone(mngr->cm_sock->s_cb); if (cb == NULL) return -NLE_NOMEM; nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, event_input, mngr); while ((err = nl_recvmsgs_report(mngr->cm_sock, cb)) > 0) { NL_DBG(2, "Cache manager %p, recvmsgs read %d messages\n", mngr, err); nread += err; } nl_cb_put(cb); if (err < 0 && err != -NLE_AGAIN) return err; return nread; }
static void route_cache_mngr_socket_cb(void) { nl_cache_mngr_data_ready(route_cache_mngr); }
void NetlinkPoller::handlerReady(uint16_t /*events*/) noexcept { nl_cache_mngr_data_ready(manager_); return; }