From: Alan T. DeKok Date: Wed, 15 Nov 2017 23:55:10 +0000 (-0500) Subject: add 'nr' to event_list_set() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3519a9263db91ce89ceb451efe1b04205a99ac2;p=thirdparty%2Ffreeradius-server.git add 'nr' to event_list_set() so that if a reader needs to poke the network, it can do so --- diff --git a/src/lib/io/application.h b/src/lib/io/application.h index a25340058fc..b8047ddf882 100644 --- a/src/lib/io/application.h +++ b/src/lib/io/application.h @@ -47,7 +47,7 @@ typedef void (*fr_app_process_set_t)(void const *instance, REQUEST *request); /** Called by the network thread to pass an event list for the module to use for timer events */ -typedef void (*fr_app_event_list_set_t)(void *instance, fr_event_list_t *el); +typedef void (*fr_app_event_list_set_t)(void *instance, fr_event_list_t *el, void *nr); /** Describes a new application (protocol) * diff --git a/src/lib/io/network.c b/src/lib/io/network.c index 4f3bcc6160a..77402e341e0 100644 --- a/src/lib/io/network.c +++ b/src/lib/io/network.c @@ -657,7 +657,7 @@ static void fr_network_socket_callback(void *ctx, void const *data, size_t data_ app_io = s->listen->app_io; - if (app_io->event_list_set) app_io->event_list_set(s->listen->app_io_instance, nr->el); + if (app_io->event_list_set) app_io->event_list_set(s->listen->app_io_instance, nr->el, nr); rad_assert(app_io->fd); s->fd = app_io->fd(s->listen->app_io_instance); @@ -718,7 +718,7 @@ static void fr_network_directory_callback(void *ctx, void const *data, size_t da app_io = s->listen->app_io; - if (app_io->event_list_set) app_io->event_list_set(s->listen->app_io_instance, nr->el); + if (app_io->event_list_set) app_io->event_list_set(s->listen->app_io_instance, nr->el, nr); rad_assert(app_io->fd); s->fd = app_io->fd(s->listen->app_io_instance); @@ -1221,3 +1221,25 @@ int fr_network_worker_add(fr_network_t *nr, fr_worker_t *worker) return rcode; } + +/** Signal the network to read from a listener + * + * @param nr the network + * @param worker the worker + */ +void fr_network_listen_read(fr_network_t *nr, fr_listen_t const *listen) +{ + fr_network_socket_t my_socket, *s; + + (void) talloc_get_type_abort(nr, fr_network_t); + (void) talloc_get_type_abort(listen, fr_listen_t); + + my_socket.listen = listen; + s = rbtree_finddata(nr->sockets, &my_socket); + if (!s) return; + + /* + * Go read the socket. + */ + fr_network_read(nr->el, s->fd, 0, s); +} diff --git a/src/lib/io/network.h b/src/lib/io/network.h index 9abe90392a1..29d6413ed89 100644 --- a/src/lib/io/network.h +++ b/src/lib/io/network.h @@ -41,6 +41,7 @@ void fr_network(fr_network_t *nr) CC_HINT(nonnull); int fr_network_socket_add(fr_network_t *nr, fr_listen_t const *io) CC_HINT(nonnull); int fr_network_directory_add(fr_network_t *nr, fr_listen_t const *listen) CC_HINT(nonnull); int fr_network_worker_add(fr_network_t *nr, fr_worker_t *worker) CC_HINT(nonnull); +void fr_network_listen_read(fr_network_t *nr, fr_listen_t const *listen) CC_HINT(nonnull); #ifdef __cplusplus } diff --git a/src/modules/proto_detail/proto_detail_file.c b/src/modules/proto_detail/proto_detail_file.c index 50d38c51079..954694f0916 100644 --- a/src/modules/proto_detail/proto_detail_file.c +++ b/src/modules/proto_detail/proto_detail_file.c @@ -492,8 +492,9 @@ static void work_init(proto_detail_file_t *inst) * * @param[in] instance of the detail worker * @param[in] el the event list + * @param[in] nr context from the network side */ -static void mod_event_list_set(void *instance, fr_event_list_t *el) +static void mod_event_list_set(void *instance, fr_event_list_t *el, UNUSED void *nr) { proto_detail_file_t *inst = talloc_get_type_abort(instance, proto_detail_file_t); #ifdef __linux__ diff --git a/src/modules/proto_detail/proto_detail_work.c b/src/modules/proto_detail/proto_detail_work.c index 1e0781b112b..266dc2391ff 100644 --- a/src/modules/proto_detail/proto_detail_work.c +++ b/src/modules/proto_detail/proto_detail_work.c @@ -707,8 +707,9 @@ static int mod_fd(void const *instance) * * @param[in] instance of the detail worker * @param[in] el the event list + * @param[in] nr context from the network side */ -static void mod_event_list_set(void *instance, fr_event_list_t *el) +static void mod_event_list_set(void *instance, fr_event_list_t *el, void *nr) { proto_detail_work_t *inst = talloc_get_type_abort(instance, proto_detail_work_t); diff --git a/src/modules/proto_radius/proto_radius_udp.c b/src/modules/proto_radius/proto_radius_udp.c index 7490272d2e4..824f48c75bf 100644 --- a/src/modules/proto_radius/proto_radius_udp.c +++ b/src/modules/proto_radius/proto_radius_udp.c @@ -578,8 +578,9 @@ static int mod_fd(void const *instance) * * @param[in] instance of the RADIUS UDP I/O path. * @param[in] el the event list + * @param[in] nr_ctx context from the network side */ -static void mod_event_list_set(void *instance, fr_event_list_t *el) +static void mod_event_list_set(void *instance, fr_event_list_t *el, UNUSED void *nr_ctx) { proto_radius_udp_t *inst;