nothing used it, so it's not necessary.
The base IO routines should just read packets. The code which adds
tracking should instead check for duplicates.
* @param[in] buffer_len the length of the buffer
* @param[out] leftover bytes left in the buffer after reading a full packet.
* @param[out] priority priority of this packet (0 = low, 65535 = high)
- * @param[out] dup is it dup or new
* @return
* - <0 on error
* - >=0 length of the data read or written.
*/
-typedef ssize_t (*fr_io_data_read_t)(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority, bool *dup);
+typedef ssize_t (*fr_io_data_read_t)(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority);
/** Write a socket.
*
union {
struct {
fr_time_t recv_time; //!< time original request was received (network -> worker)
- bool is_dup; //!< dup, new, etc.
} request;
struct {
* The app_io->read does the transport-specific data read.
*/
static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p,
- uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority, bool *is_dup)
+ uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority)
{
fr_io_instance_t const *inst;
fr_io_thread_t *thread;
fr_listen_t *child;
int value, accept_fd = -1;
- fr_assert(is_dup != NULL);
- *is_dup = false;
-
get_inst(li, &inst, &thread, &connection, &child);
track = new_track = NULL;
* functions which do all of the TLS work.
*/
packet_len = inst->app_io->read(child, (void **) &local_address, &recv_time,
- buffer, buffer_len, leftover, priority, is_dup);
+ buffer, buffer_len, leftover, priority);
if (packet_len <= 0) {
return packet_len;
}
* "live" packets.
*/
if (!track) {
- track = fr_io_track_add(client, &address, buffer, packet_len, recv_time, is_dup);
+ bool is_dup = false;
+
+ track = fr_io_track_add(client, &address, buffer, packet_len, recv_time, &is_dup);
if (!track) {
DEBUG("Failed tracking packet from client %s - discarding it",
client->radclient->shortname);
/*
* If there's a cached reply, just send that and don't do anything else.
*/
- if (*is_dup) {
+ if (is_dup) {
fr_network_t *nr;
if (track->do_not_respond) {
if (!cd) return -1;
cd->listen = parent;
- cd->request.is_dup = false;
cd->priority = PRIORITY_NORMAL;
cd->packet_ctx = packet_ctx;
cd->request.recv_time = recv_time;
return;
}
- cd->request.is_dup = false;
cd->priority = PRIORITY_NORMAL;
/*
* connection.
*/
data_size = s->listen->app_io->read(s->listen, &cd->packet_ctx, &cd->request.recv_time,
- cd->m.data, cd->m.rb_size, &s->leftover, &cd->priority, &cd->request.is_dup);
+ cd->m.data, cd->m.rb_size, &s->leftover, &cd->priority);
if (data_size == 0) {
/*
* Cache the message for later. This is
s->stats.in++;
- cd->request.is_dup = false;
cd->priority = PRIORITY_NORMAL;
cd->m.when = recv_time;
static void worker_request_bootstrap(fr_worker_t *worker, fr_channel_data_t *cd, fr_time_t now)
{
- bool is_dup;
int ret = -1;
request_t *request;
TALLOC_CTX *ctx;
/*
* We're done with this message.
*/
- is_dup = cd->request.is_dup;
fr_message_done(&cd->m);
/*
old = fr_rb_find(worker->dedup, request);
if (!old) {
- /*
- * Ignore duplicate packets where we've
- * already sent the reply.
- */
- if (is_dup) {
- RDEBUG("Got duplicate packet notice after we had sent a reply - ignoring");
- fr_channel_null_reply(request->async->channel);
- talloc_free(request);
- return;
- }
goto insert_new;
}
CONF_PARSER_TERMINATOR
};
-static ssize_t mod_read(fr_listen_t *li, UNUSED void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+static ssize_t mod_read(fr_listen_t *li, UNUSED void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority)
{
proto_arp_ethernet_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_arp_ethernet_thread_t);
int ret;
static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len,
- size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+ size_t *leftover, UNUSED uint32_t *priority)
{
proto_bfd_udp_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_bfd_udp_t);
proto_bfd_udp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_bfd_udp_thread_t);
/*
* Run a command.
*/
-static ssize_t mod_read_command(fr_listen_t *li, UNUSED void **packet_ctx, UNUSED fr_time_t *recv_time_p, uint8_t *buffer, UNUSED size_t buffer_len, UNUSED size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup
-)
+static ssize_t mod_read_command(fr_listen_t *li, UNUSED void **packet_ctx, UNUSED fr_time_t *recv_time_p, uint8_t *buffer, UNUSED size_t buffer_len, UNUSED size_t *leftover, UNUSED uint32_t *priority)
{
proto_control_unix_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_control_unix_t);
proto_control_unix_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_control_unix_thread_t);
/*
* Process an initial connection request.
*/
-static ssize_t mod_read_init(fr_listen_t *li, UNUSED void **packet_ctx, UNUSED fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, UNUSED size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup
-)
+static ssize_t mod_read_init(fr_listen_t *li, UNUSED void **packet_ctx, UNUSED fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, UNUSED size_t *leftover, UNUSED uint32_t *priority)
{
proto_control_unix_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_control_unix_thread_t);
fr_conduit_hdr_t *hdr = (fr_conduit_hdr_t *) buffer;
return 0;
}
-static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority, bool *is_dup)
+static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority)
{
proto_control_unix_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_control_unix_thread_t);
ssize_t data_size;
/*
* Run the state machine to process the rest of the packet.
*/
- return thread->read(li, packet_ctx, recv_time_p, buffer, (size_t) data_size, leftover, priority, is_dup);
+ return thread->read(li, packet_ctx, recv_time_p, buffer, (size_t) data_size, leftover, priority);
}
return 0;
}
-static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority)
{
proto_cron_crontab_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_cron_crontab_t);
proto_cron_crontab_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_cron_crontab_thread_t);
{ 0 }
};
-static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority, UNUSED bool *is_dup)
+static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority)
{
proto_detail_work_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_detail_work_t);
proto_detail_work_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_detail_work_thread_t);
};
static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len,
- size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+ size_t *leftover, UNUSED uint32_t *priority)
{
proto_dhcpv4_udp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_dhcpv4_udp_thread_t);
fr_io_address_t *address, **address_p;
};
static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len,
- size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+ size_t *leftover, UNUSED uint32_t *priority)
{
proto_dhcpv6_udp_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_dhcpv6_udp_t);
proto_dhcpv6_udp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_dhcpv6_udp_thread_t);
};
static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len,
- size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+ size_t *leftover, UNUSED uint32_t *priority)
{
// proto_dns_udp_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_dns_udp_t);
proto_dns_udp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_dns_udp_thread_t);
* addition to their other data.
*/
static ssize_t proto_ldap_child_mod_read(fr_listen_t *li, UNUSED void **packet_ctx, UNUSED fr_time_t *recv_time_p, UNUSED uint8_t *buffer,
- UNUSED size_t buffer_len, UNUSED size_t *leftover, UNUSED uint32_t *priority,
- UNUSED bool *is_dup)
+ UNUSED size_t buffer_len, UNUSED size_t *leftover, UNUSED uint32_t *priority)
{
proto_ldap_sync_ldap_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_ldap_sync_ldap_thread_t);
fr_ldap_connection_t *conn = talloc_get_type_abort(thread->conn->h, fr_ldap_connection_t);
};
-static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority)
{
proto_load_step_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_load_step_t);
proto_load_step_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_load_step_thread_t);
};
-static ssize_t mod_read(fr_listen_t *li, UNUSED void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+static ssize_t mod_read(fr_listen_t *li, UNUSED void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority)
{
proto_radius_tcp_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_radius_tcp_t);
proto_radius_tcp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_radius_tcp_thread_t);
};
-static ssize_t mod_read(fr_listen_t *li, UNUSED void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+static ssize_t mod_read(fr_listen_t *li, UNUSED void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority)
{
proto_radius_tcp_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_radius_tcp_t);
proto_radius_tcp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_radius_tcp_thread_t);
static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len,
- size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+ size_t *leftover, UNUSED uint32_t *priority)
{
proto_radius_udp_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_radius_udp_t);
proto_radius_udp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_radius_udp_thread_t);
* *leftover must be subtracted from buffer_len when
* calculating free space in the buffer.
* @param[out] priority unused.
- * @param[out] is_dup packets are never duplicated
* @return
* - >0 when a packet was read successfully.
* - 0 when we read a partial packet.
*/
static ssize_t mod_read(fr_listen_t *li, UNUSED void **packet_ctx, fr_time_t *recv_time_p,
uint8_t *buffer, size_t buffer_len, size_t *leftover,
- UNUSED uint32_t *priority, bool *is_dup)
+ UNUSED uint32_t *priority)
{
proto_tacacs_tcp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_tacacs_tcp_thread_t);
ssize_t data_size, packet_len;
size_t in_buffer;
- *is_dup = false;
-
/*
* Read data into the buffer.
*/
};
-static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority, UNUSED bool *is_dup)
+static ssize_t mod_read(fr_listen_t *li, void **packet_ctx, fr_time_t *recv_time_p, uint8_t *buffer, size_t buffer_len, size_t *leftover, UNUSED uint32_t *priority)
{
proto_vmps_udp_t const *inst = talloc_get_type_abort_const(li->app_io_instance, proto_vmps_udp_t);
proto_vmps_udp_thread_t *thread = talloc_get_type_abort(li->thread_instance, proto_vmps_udp_thread_t);