]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
API to allow sending packets directly to the worker
authorAlan T. DeKok <aland@freeradius.org>
Mon, 13 Mar 2023 18:29:09 +0000 (14:29 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 14 Mar 2023 21:10:40 +0000 (17:10 -0400)
src/lib/io/network.c
src/lib/io/network.h

index ba27a4497dceb0c0c32ea36e192065a33fe07b9f..9884c4b18785943e723938aef2ee5ab3f8b6e3c1 100644 (file)
@@ -853,9 +853,6 @@ static void fr_network_read(UNUSED fr_event_list_t *el, int sockfd, UNUSED int f
        fr_network_t            *nr = s->nr;
        ssize_t                 data_size;
        fr_channel_data_t       *cd, *next;
-#ifndef NDEBUG
-       fr_time_t               now;
-#endif
 
        if (!fr_cond_assert_msg(s->listen->fd == sockfd, "Expected listen->fd (%u) to be equal event fd (%u)",
                                s->listen->fd, sockfd)) return;
@@ -944,9 +941,6 @@ next_message:
         *      duplicate.
         */
        cd->m.when = fr_time();
-#ifndef NDEBUG
-       now = cd->m.when;
-#endif
        cd->listen = s->listen;
 
        /*
@@ -972,12 +966,6 @@ next_message:
                }
        }
 
-       /*
-        *      Ensure this hasn't been somehow corrupted during
-        *      ring buffer allocation.
-        */
-       fr_assert(fr_time_eq(cd->m.when, now));
-
        if (fr_network_send_request(nr, cd) < 0) {
                talloc_free(cd->packet_ctx); /* not sure what else to do here */
                fr_message_done(&cd->m);
@@ -1006,6 +994,44 @@ next_message:
        }
 }
 
+int fr_network_sendto_worker(fr_network_t *nr, fr_listen_t *li, void *packet_ctx, uint8_t const *data, size_t data_len, fr_time_t recv_time)
+{
+       fr_channel_data_t *cd;
+       fr_network_socket_t *s;
+
+       s = fr_rb_find(nr->sockets, &(fr_network_socket_t){ .listen = li });
+       if (!s) return -1;
+
+       cd = (fr_channel_data_t *) fr_message_alloc(s->ms, NULL, data_len);
+       if (!cd) return -1;
+
+       s->stats.in++;
+
+       cd->request.is_dup = false;
+       cd->priority = PRIORITY_NORMAL;
+
+       cd->m.when = recv_time;
+       cd->listen = li;
+       cd->packet_ctx = packet_ctx;
+
+       memcpy(cd->m.data, data, data_len);
+
+       if (fr_network_send_request(nr, cd) < 0) {
+               talloc_free(packet_ctx);
+               fr_message_done(&cd->m);
+               nr->stats.dropped++;
+               s->stats.dropped++;
+
+       } else {
+               /*
+                *      One more packet sent to a worker.
+                */
+               s->outstanding++;
+       }
+
+       return 0;
+}
+
 
 /** Get a notification that a vnode changed
  *
index 3ec48557acdb8bf7a2567a094630263620c260a5..b3816649e7c40f21f8b4b9f60a83b726bdd53719 100644 (file)
@@ -61,6 +61,8 @@ void          fr_network_listen_write(fr_network_t *nr, fr_listen_t *li, uint8_t const *
 
 int            fr_network_listen_inject(fr_network_t *nr, fr_listen_t *li, uint8_t const *packet, size_t packet_len, fr_time_t recv_time);
 
+int            fr_network_sendto_worker(fr_network_t *nr, fr_listen_t *li, void *packet_ctx, uint8_t const *data, size_t data_len, fr_time_t recv_time);
+
 int            fr_network_listen_send_packet(fr_network_t *nr, fr_listen_t *parent, fr_listen_t *li,
                                              const uint8_t *buffer, size_t buflen, fr_time_t recv_time, void *packet_ctx) CC_HINT(nonnull(1,2,3,4));