From: Alan T. DeKok Date: Wed, 18 Jan 2017 19:45:13 +0000 (-0500) Subject: move receiver to callbacks X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=050d389f47840b30e0b6383dc688cd6365cd8697;p=thirdparty%2Ffreeradius-server.git move receiver to callbacks The receive can now receive additional control-plane messages. such as "new socket". --- diff --git a/src/util/receiver.c b/src/util/receiver.c index 9d268de1afd..858a7f61628 100644 --- a/src/util/receiver.c +++ b/src/util/receiver.c @@ -238,17 +238,18 @@ static int fr_receiver_idle(void *ctx, struct timeval *wake) } -/** Handle a receiver control message for a channel +/** Handle a receiver control message callback for a channel * - * @param[in] rc the receiver + * @param[in] ctx the receiver * @param[in] data the message * @param[in] data_size size of the data * @param[in] now the current time */ -static void fr_receiver_channel_message(fr_receiver_t *rc, void const *data, size_t data_size, fr_time_t now) +static void fr_receiver_channel_callback(void *ctx, void const *data, size_t data_size, fr_time_t now) { fr_channel_event_t ce; fr_channel_t *ch; + fr_receiver_t *rc = ctx; ce = fr_channel_service_message(now, &ch, data, data_size); switch (ce) { @@ -297,6 +298,7 @@ static void fr_receiver_evfilt_user(UNUSED int kq, struct kevent const *kev, voi { fr_time_t now; fr_receiver_t *rc = ctx; + uint8_t data[256]; #ifndef NDEBUG talloc_get_type_abort(rc, fr_receiver_t); @@ -312,18 +314,7 @@ static void fr_receiver_evfilt_user(UNUSED int kq, struct kevent const *kev, voi /* * Service all available control-plane events */ - while (true) { - uint32_t id; - size_t data_size; - char data[256]; - - data_size = fr_control_message_pop(rc->aq_control, &id, data, sizeof(data)); - if (!data_size) return; - - rad_assert(id == FR_CONTROL_ID_CHANNEL); - - fr_receiver_channel_message(rc, data, data_size, now); - } + fr_control_service(rc->control, data, sizeof(data), now); } @@ -366,6 +357,11 @@ fr_receiver_t *fr_receiver_create(TALLOC_CTX *ctx, uint32_t num_transports, fr_t return NULL; } + if (fr_control_callback_add(rc->control, FR_CONTROL_ID_CHANNEL, rc, fr_receiver_channel_callback) < 0) { + talloc_free(rc); + return NULL; + } + if (fr_event_user_insert(rc->el, fr_receiver_evfilt_user, rc) < 0) { talloc_free(rc); return NULL;