From: Alan T. DeKok Date: Fri, 27 Aug 2021 14:22:14 +0000 (-0400) Subject: pass instance / thread instance to track_create X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2f597ee187a1b62ffba1ee8db36c1265ebf4180d;p=thirdparty%2Ffreeradius-server.git pass instance / thread instance to track_create in preparation for doing more aggressive cleanups of tracking entries --- diff --git a/src/lib/io/app_io.h b/src/lib/io/app_io.h index b040a083b88..f57db729c04 100644 --- a/src/lib/io/app_io.h +++ b/src/lib/io/app_io.h @@ -64,8 +64,8 @@ typedef struct { fr_io_nak_t nak; //!< Function to send a NAK. - fr_io_track_create_t track; //!< create a tracking structure - fr_io_track_cmp_t compare; //!< compare two tracking structures + fr_io_track_create_t track_create; //!< create a tracking structure + fr_io_track_cmp_t track_compare; //!< compare two tracking structures fr_io_connection_set_t connection_set; //!< set src/dst IP/port of a connection fr_io_network_get_t network_get; //!< get dynamic network information diff --git a/src/lib/io/base.h b/src/lib/io/base.h index 25633ed342d..8d9d90b1cb9 100644 --- a/src/lib/io/base.h +++ b/src/lib/io/base.h @@ -261,6 +261,9 @@ typedef void (*fr_io_data_vnode_t)(fr_listen_t *li, uint32_t fflags); * * For passing to fr_io_track_cmp_t * + * @param[in] instance the context for this function + * @param[in] thread_instance the thread instance for this function + * @param[in] client the client associated with this packet * @param[in] ctx The parent talloc ctx * @param[in] packet The packet being summarized * @param[in] packet_len Length of the packet being summarized @@ -268,7 +271,7 @@ typedef void (*fr_io_data_vnode_t)(fr_listen_t *li, uint32_t fflags); * - NULL on error * - !NULL the packet tracking structure */ -typedef void *(*fr_io_track_create_t)(TALLOC_CTX *ctx, uint8_t const *packet, size_t packet_len); +typedef void *(*fr_io_track_create_t)(void const *instance, void *thread_instance, RADCLIENT *client, TALLOC_CTX *ctx, uint8_t const *packet, size_t packet_len); /** Compare two tracking structures for storing in a duplicate detection tree. * diff --git a/src/lib/io/master.c b/src/lib/io/master.c index fd3672645f8..003bb5933a6 100644 --- a/src/lib/io/master.c +++ b/src/lib/io/master.c @@ -280,10 +280,10 @@ static int8_t track_cmp(void const *one, void const *two) /* * Call the per-protocol comparison function. */ - ret = a->client->inst->app_io->compare(a->client->inst->app_io_instance, - a->client->thread->child->thread_instance, - a->client->radclient, - a->packet, b->packet); + ret = a->client->inst->app_io->track_compare(a->client->inst->app_io_instance, + a->client->thread->child->thread_instance, + a->client->radclient, + a->packet, b->packet); return CMP(ret, 0); } @@ -306,10 +306,10 @@ static int8_t track_connected_cmp(void const *one, void const *two) * Note that we pass the connection "client", as * we may do negotiation specific to this connection. */ - ret = a->client->inst->app_io->compare(a->client->inst->app_io_instance, - a->client->connection->child->thread_instance, - a->client->connection->client->radclient, - a->packet, b->packet); + ret = a->client->inst->app_io->track_compare(a->client->inst->app_io_instance, + a->client->connection->child->thread_instance, + a->client->connection->client->radclient, + a->packet, b->packet); return CMP(ret, 0); } @@ -890,7 +890,10 @@ static fr_io_track_t *fr_io_track_add(fr_io_client_t *client, * We are checking for duplicates, see if there is a dup * already in the tree. */ - track->packet = client->inst->app_io->track(track, packet, packet_len); + track->packet = client->inst->app_io->track_create(client->inst->app_io_instance, + client->thread->child->thread_instance, + client->radclient, + track, packet, packet_len); if (!track->packet) { talloc_free(track); return NULL; @@ -1463,7 +1466,7 @@ do_read: * Create the packet tracking table for this client. */ if (inst->app_io->track_duplicates) { - fr_assert(inst->app_io->compare != NULL); + fr_assert(inst->app_io->track_compare != NULL); MEM(client->table = fr_rb_inline_talloc_alloc(client, fr_io_track_t, node, track_cmp, NULL)); } @@ -2581,8 +2584,8 @@ static int mod_bootstrap(void *instance, CONF_SECTION *cs) } else { FR_TIME_DELTA_BOUND_CHECK("cleanup_delay", inst->cleanup_delay, >=, fr_time_delta_from_sec(1)); - if (!inst->app_io->track) { - cf_log_err(inst->app_io_conf, "Internal error: 'track_duplicates' is set, but there is no 'track' function"); + if (!inst->app_io->track_create) { + cf_log_err(inst->app_io_conf, "Internal error: 'track_duplicates' is set, but there is no 'track create' function"); return -1; } } diff --git a/src/listen/dhcpv4/proto_dhcpv4_udp.c b/src/listen/dhcpv4/proto_dhcpv4_udp.c index db92ca929f4..6e53ab05a7a 100644 --- a/src/listen/dhcpv4/proto_dhcpv4_udp.c +++ b/src/listen/dhcpv4/proto_dhcpv4_udp.c @@ -580,7 +580,8 @@ static int mod_fd_set(fr_listen_t *li, int fd) } -static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *packet, size_t packet_len) +static void *mod_track_create(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + TALLOC_CTX *ctx, uint8_t const *packet, size_t packet_len) { proto_dhcpv4_track_t *track; dhcp_packet_t const *dhcp = (dhcp_packet_t const *) packet; @@ -618,8 +619,8 @@ static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *packet, size_t pac return track; } -static int mod_compare(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, - void const *one, void const *two) +static int mod_track_compare(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + void const *one, void const *two) { int ret; proto_dhcpv4_track_t const *a = one; @@ -817,8 +818,8 @@ fr_app_io_t proto_dhcpv4_udp = { .read = mod_read, .write = mod_write, .fd_set = mod_fd_set, - .track = mod_track_create, - .compare = mod_compare, + .track_create = mod_track_create, + .track_compare = mod_track_compare, .connection_set = mod_connection_set, .network_get = mod_network_get, .client_find = mod_client_find, diff --git a/src/listen/dhcpv6/proto_dhcpv6_udp.c b/src/listen/dhcpv6/proto_dhcpv6_udp.c index 6b6ab424784..5c05a41ffc1 100644 --- a/src/listen/dhcpv6/proto_dhcpv6_udp.c +++ b/src/listen/dhcpv6/proto_dhcpv6_udp.c @@ -379,7 +379,8 @@ static int mod_fd_set(fr_listen_t *li, int fd) return 0; } -static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *packet, size_t packet_len) +static void *mod_track_create(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + TALLOC_CTX *ctx, uint8_t const *packet, size_t packet_len) { proto_dhcpv6_track_t *track; uint8_t const *option; @@ -430,8 +431,8 @@ static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *packet, size_t pac } -static int mod_compare(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, - void const *one, void const *two) +static int mod_track_compare(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + void const *one, void const *two) { int ret; proto_dhcpv6_track_t const *a = one; @@ -665,8 +666,8 @@ fr_app_io_t proto_dhcpv6_udp = { .read = mod_read, .write = mod_write, .fd_set = mod_fd_set, - .track = mod_track_create, - .compare = mod_compare, + .track_create = mod_track_create, + .track_compare = mod_track_compare, .connection_set = mod_connection_set, .network_get = mod_network_get, .client_find = mod_client_find, diff --git a/src/listen/radius/proto_radius_tcp.c b/src/listen/radius/proto_radius_tcp.c index b03fd554911..6784d52d25d 100644 --- a/src/listen/radius/proto_radius_tcp.c +++ b/src/listen/radius/proto_radius_tcp.c @@ -345,8 +345,8 @@ static int mod_fd_set(fr_listen_t *li, int fd) return 0; } -static int mod_compare(void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, - void const *one, void const *two) +static int mod_track_compare(void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + void const *one, void const *two) { int ret; proto_radius_tcp_t const *inst = talloc_get_type_abort_const(instance, proto_radius_tcp_t); @@ -594,7 +594,7 @@ fr_app_io_t proto_radius_tcp = { .read = mod_read, .write = mod_write, .fd_set = mod_fd_set, - .compare = mod_compare, + .track_compare = mod_track_compare, .connection_set = mod_connection_set, .network_get = mod_network_get, .client_find = mod_client_find, diff --git a/src/listen/radius/proto_radius_udp.c b/src/listen/radius/proto_radius_udp.c index bd648f45b7d..6b0877aac3e 100644 --- a/src/listen/radius/proto_radius_udp.c +++ b/src/listen/radius/proto_radius_udp.c @@ -379,13 +379,14 @@ static int mod_fd_set(fr_listen_t *li, int fd) return 0; } -static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *packet, UNUSED size_t packet_len) +static void *mod_track_create(void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + TALLOC_CTX *ctx, uint8_t const *packet, UNUSED size_t packet_len) { return talloc_memdup(ctx, packet, RADIUS_HEADER_LENGTH); } -static int mod_compare(void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, - void const *one, void const *two) +static int mod_track_compare(void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + void const *one, void const *two) { int ret; proto_radius_udp_t const *inst = talloc_get_type_abort_const(instance, proto_radius_udp_t); @@ -543,8 +544,8 @@ fr_app_io_t proto_radius_udp = { .read = mod_read, .write = mod_write, .fd_set = mod_fd_set, - .track = mod_track_create, - .compare = mod_compare, + .track_create = mod_track_create, + .track_compare = mod_track_compare, .connection_set = mod_connection_set, .network_get = mod_network_get, .client_find = mod_client_find, diff --git a/src/listen/tacacs/proto_tacacs_tcp.c b/src/listen/tacacs/proto_tacacs_tcp.c index 07ff4572da1..03a033a289b 100644 --- a/src/listen/tacacs/proto_tacacs_tcp.c +++ b/src/listen/tacacs/proto_tacacs_tcp.c @@ -318,7 +318,8 @@ static int mod_fd_set(fr_listen_t *li, int fd) return 0; } -static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *buffer, UNUSED size_t buffer_len) +static void *mod_track_create(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + TALLOC_CTX *ctx, uint8_t const *buffer, UNUSED size_t buffer_len) { fr_tacacs_packet_t const *pkt = (fr_tacacs_packet_t const *) buffer; proto_tacacs_track_t *track; @@ -357,8 +358,8 @@ static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *buffer, UNUSED siz return track; } -static int mod_compare(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, - void const *one, void const *two) +static int mod_track_compare(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + void const *one, void const *two) { int ret; proto_tacacs_track_t const *a = talloc_get_type_abort_const(one, proto_tacacs_track_t); @@ -487,8 +488,8 @@ fr_app_io_t proto_tacacs_tcp = { .read = mod_read, .write = mod_write, .fd_set = mod_fd_set, - .track = mod_track_create, - .compare = mod_compare, + .track_create = mod_track_create, + .track_compare = mod_track_compare, .connection_set = mod_connection_set, .network_get = mod_network_get, .client_find = mod_client_find, diff --git a/src/listen/vmps/proto_vmps_udp.c b/src/listen/vmps/proto_vmps_udp.c index f36692d74b9..42f7d7abf99 100644 --- a/src/listen/vmps/proto_vmps_udp.c +++ b/src/listen/vmps/proto_vmps_udp.c @@ -348,7 +348,8 @@ static int mod_fd_set(fr_listen_t *li, int fd) return 0; } -static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *buffer, size_t buffer_len) +static void *mod_track_create(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + TALLOC_CTX *ctx, uint8_t const *buffer, size_t buffer_len) { proto_vmps_track_t *track; @@ -370,8 +371,8 @@ static void *mod_track_create(TALLOC_CTX *ctx, uint8_t const *buffer, size_t buf return track; } -static int mod_compare(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, - void const *one, void const *two) +static int mod_track_compare(UNUSED void const *instance, UNUSED void *thread_instance, UNUSED RADCLIENT *client, + void const *one, void const *two) { proto_vmps_track_t const *a = talloc_get_type_abort_const(one, proto_vmps_track_t); proto_vmps_track_t const *b = talloc_get_type_abort_const(two, proto_vmps_track_t); @@ -518,8 +519,8 @@ fr_app_io_t proto_vmps_udp = { .read = mod_read, .write = mod_write, .fd_set = mod_fd_set, - .track = mod_track_create, - .compare = mod_compare, + .track_create = mod_track_create, + .track_compare = mod_track_compare, .connection_set = mod_connection_set, .network_get = mod_network_get, .client_find = mod_client_find,