From: Alan T. DeKok Date: Thu, 9 Mar 2023 23:21:21 +0000 (-0500) Subject: avoid a bounce through the event loop in fr_network_listen_inject() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ccd91c6ad6410a07a876013fe4fe367b1c31a0ee;p=thirdparty%2Ffreeradius-server.git avoid a bounce through the event loop in fr_network_listen_inject() --- diff --git a/src/lib/io/network.c b/src/lib/io/network.c index 1575dd8f1e1..ba27a4497dc 100644 --- a/src/lib/io/network.c +++ b/src/lib/io/network.c @@ -386,17 +386,34 @@ int fr_network_listen_inject(fr_network_t *nr, fr_listen_t *li, uint8_t const *p fr_ring_buffer_t *rb; fr_network_inject_t my_inject; - rb = fr_network_rb_init(); - if (!rb) return -1; - - (void) talloc_get_type_abort(nr, fr_network_t); - (void) talloc_get_type_abort(li, fr_listen_t); - /* * Can't inject to injection-less destinations. */ if (!li->app_io->inject) return -1; + /* + * Avoid a bounce through the event loop if we're being called from the network thread. + */ + if (is_network_thread(nr)) { + fr_network_socket_t *s; + + s = fr_rb_find(nr->sockets, &(fr_network_socket_t){ .listen = li }); + if (!s) return -1; + + /* + * Inject the packet. The master.c mod_read() routine will then take care of avoiding + * IO, and instead return the packet to the network side. + */ + if (li->app_io->inject(li, packet, packet_len, recv_time) == 0) { + fr_network_read(nr->el, li->fd, 0, s); + } + + return 0; + } + + rb = fr_network_rb_init(); + if (!rb) return -1; + my_inject.listen = li; my_inject.packet = talloc_memdup(NULL, packet, packet_len); my_inject.packet_len = packet_len;