/** * Allocate new cache manager * @arg sk Netlink socket or NULL to auto allocate * @arg protocol Netlink protocol this manager is used for * @arg flags Flags (\c NL_AUTO_PROVIDE) * @arg result Result pointer * * Allocates a new cache manager for the specified netlink protocol. * * 1. If sk is not specified (\c NULL) a netlink socket matching the * specified protocol will be automatically allocated. * * 2. The socket will be put in non-blocking mode and sequence checking * will be disabled regardless of whether the socket was provided by * the caller or automatically allocated. * * 3. The socket will be connected. * * If the flag \c NL_AUTO_PROVIDE is specified, any cache added to the * manager will automatically be made available to other users using * nl_cache_mngt_provide(). * * @note If the socket is provided by the caller, it is NOT recommended * to use the socket for anything else besides receiving netlink * notifications. * * @return 0 on success or a negative error code. */ int nl_cache_mngr_alloc(struct nl_sock *sk, int protocol, int flags, struct nl_cache_mngr **result) { struct nl_cache_mngr *mngr; int err = -NLE_NOMEM; /* Catch abuse of flags */ if (flags & NL_ALLOCATED_SOCK) BUG(); mngr = calloc(1, sizeof(*mngr)); if (!mngr) return -NLE_NOMEM; if (!sk) { if (!(sk = nl_socket_alloc())) goto errout; flags |= NL_ALLOCATED_SOCK; } mngr->cm_sock = sk; mngr->cm_nassocs = NASSOC_INIT; mngr->cm_protocol = protocol; mngr->cm_flags = flags; mngr->cm_assocs = calloc(mngr->cm_nassocs, sizeof(struct nl_cache_assoc)); if (!mngr->cm_assocs) goto errout; /* Required to receive async event notifications */ nl_socket_disable_seq_check(mngr->cm_sock); if ((err = nl_connect(mngr->cm_sock, protocol)) < 0) goto errout; if ((err = nl_socket_set_nonblocking(mngr->cm_sock)) < 0) goto errout; /* Create and allocate socket for sync cache fills */ mngr->cm_sync_sock = nl_socket_alloc(); if (!mngr->cm_sync_sock) { err = -NLE_NOMEM; goto errout; } if ((err = nl_connect(mngr->cm_sync_sock, protocol)) < 0) goto errout_free_sync_sock; NL_DBG(1, "Allocated cache manager %p, protocol %d, %d caches\n", mngr, protocol, mngr->cm_nassocs); *result = mngr; return 0; errout_free_sync_sock: nl_socket_free(mngr->cm_sync_sock); errout: nl_cache_mngr_free(mngr); return err; }
void ind_ovs_port_finish(void) { ind_soc_socket_unregister(nl_cache_mngr_get_fd(route_cache_mngr)); nl_cache_mngr_free(route_cache_mngr); nl_socket_free(route_cache_sock); }
int main(int argc, char *argv[]) { struct nl_cache_mngr *mngr; struct nl_cache *cache; int err, i; dp.dp_fd = stdout; signal(SIGINT, sigint); err = nl_cache_mngr_alloc(NULL, NETLINK_ROUTE, NL_AUTO_PROVIDE, &mngr); if (err < 0) nl_cli_fatal(err, "Unable to allocate cache manager: %s", nl_geterror(err)); for (i = 1; i < argc; i++) { err = nl_cache_mngr_add(mngr, argv[i], &change_cb, NULL, &cache); if (err < 0) nl_cli_fatal(err, "Unable to add cache %s: %s", argv[i], nl_geterror(err)); } while (!quit) { int err = nl_cache_mngr_poll(mngr, 1000); if (err < 0 && err != -NLE_INTR) nl_cli_fatal(err, "Polling failed: %s", nl_geterror(err)); nl_cache_mngr_info(mngr, &dp); } nl_cache_mngr_free(mngr); return 0; }
int main(int argc, char *argv[]) { struct nl_cache_mngr *mngr; struct nl_sock *sock; struct nl_cache *ct; sock = nlt_socket_alloc(); mngr = nl_cache_mngr_alloc(sock, NETLINK_NETFILTER, NL_AUTO_PROVIDE); if (!mngr) { nl_perror("nl_cache_mngr_alloc"); return -1; } ct = nl_cache_mngr_add(mngr, "netfilter/ct", &change_cb); if (ct == NULL) { nl_perror("nl_cache_mngr_add(netfilter/ct)"); return -1; } for (;;) { int err = nl_cache_mngr_poll(mngr, 5000); if (err < 0) { nl_perror("nl_cache_mngr_poll()"); return -1; } } nl_cache_mngr_free(mngr); return 0; }
static void _g_water_nl_source_finalize(GSource *source) { GWaterNlSource *self = (GWaterNlSource *)source; if ( self->owned ) { nl_socket_free(self->sock); nl_cache_mngr_free(self->cache_mngr); } }
netlink_wrapper::~netlink_wrapper() { nl_logdbg( "---> netlink_route_listener DTOR"); nl_cache_mngr_free(m_mngr); nl_cache_free(m_cache_link); nl_cache_free(m_cache_neigh); nl_cache_free(m_cache_route); nl_handle_destroy(m_handle); subject_map_iter iter = m_subjects_map.begin(); while (iter != m_subjects_map.end()) { delete iter->second; iter = iter++; } nl_logdbg( "<--- netlink_route_listener DTOR"); }
/** * Allocate new cache manager * @arg sk Netlink socket. * @arg protocol Netlink Protocol this manager is used for * @arg flags Flags * @arg result Result pointer * * @return 0 on success or a negative error code. */ int nl_cache_mngr_alloc(struct nl_sock *sk, int protocol, int flags, struct nl_cache_mngr **result) { struct nl_cache_mngr *mngr; int err = -NLE_NOMEM; if (sk == NULL) BUG(); mngr = calloc(1, sizeof(*mngr)); if (!mngr) goto errout; mngr->cm_handle = sk; mngr->cm_nassocs = 32; mngr->cm_protocol = protocol; mngr->cm_flags = flags; mngr->cm_assocs = calloc(mngr->cm_nassocs, sizeof(struct nl_cache_assoc)); if (!mngr->cm_assocs) goto errout; nl_socket_modify_cb(mngr->cm_handle, NL_CB_VALID, NL_CB_CUSTOM, event_input, mngr); /* Required to receive async event notifications */ nl_socket_disable_seq_check(mngr->cm_handle); if ((err = nl_connect(mngr->cm_handle, protocol) < 0)) goto errout; if ((err = nl_socket_set_nonblocking(mngr->cm_handle) < 0)) goto errout; NL_DBG(1, "Allocated cache manager %p, protocol %d, %d caches\n", mngr, protocol, mngr->cm_nassocs); *result = mngr; return 0; errout: nl_cache_mngr_free(mngr); return err; }
int main(int argc, char *argv[]) { struct nl_cache_mngr *mngr; struct nl_cache *lc, *nc, *ac, *rc; struct nl_sock *sock; int err; signal(SIGINT, sigint); sock = nlt_alloc_socket(); err = nl_cache_mngr_alloc(sock, NETLINK_ROUTE, NL_AUTO_PROVIDE, &mngr); if (err < 0) fatal(err, "Unable to allocate cache manager: %s", nl_geterror(err)); if ((err = nl_cache_mngr_add(mngr, "route/link", &change_cb, &lc)) < 0) fatal(err, "Unable to add cache route/link: %s", nl_geterror(err)); if ((err = nl_cache_mngr_add(mngr, "route/neigh", &change_cb, &nc)) < 0) fatal(err, "Unable to add cache route/neigh: %s", nl_geterror(err)); if ((err = nl_cache_mngr_add(mngr, "route/addr", &change_cb, &ac)) < 0) fatal(err, "Unable to add cache route/addr: %s", nl_geterror(err)); if ((err = nl_cache_mngr_add(mngr, "route/route", &change_cb, &rc)) < 0) fatal(err, "Unable to add cache route/route: %s", nl_geterror(err)); while (!quit) { int err = nl_cache_mngr_poll(mngr, 5000); if (err < 0 && err != -NLE_INTR) fatal(err, "Polling failed: %s", nl_geterror(err)); } nl_cache_mngr_free(mngr); nl_socket_free(sock); return 0; }