From: Alan T. DeKok Date: Sat, 30 Mar 2024 17:52:58 +0000 (-0400) Subject: add "cancel packet" API X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3c0a1a3f1a95a0be024a24e5aa63f678e965db9;p=thirdparty%2Ffreeradius-server.git add "cancel packet" API --- diff --git a/src/protocols/radius/client.c b/src/protocols/radius/client.c index a860eaffb10..05ac61f4045 100644 --- a/src/protocols/radius/client.c +++ b/src/protocols/radius/client.c @@ -264,6 +264,30 @@ static void radius_client_retry_release(fr_bio_t *bio, fr_bio_retry_entry_t *ret fr_radius_code_id_push(my->codes, id_ctx->packet); } +/** Cancel one packet. + * + * The packet can have a reply, or not. It doesn't matter. + * + * This also frees any IDs associated with the packet. + */ +int fr_radius_client_fd_bio_cancel(fr_bio_packet_t *bio, fr_packet_t *packet) +{ + fr_radius_id_ctx_t *id_ctx; + fr_radius_client_fd_bio_t *my = talloc_get_type_abort(bio, fr_radius_client_fd_bio_t); + + if (!my->retry) return 0; + + id_ctx = fr_radius_code_id_find(my->codes, packet->code, packet->id); + if (!id_ctx || !id_ctx->retry_ctx) return 0; + + fr_assert(id_ctx->packet == packet); + + if (fr_bio_retry_entry_cancel(my->retry, id_ctx->retry_ctx) < 0) return -1; + + id_ctx->retry_ctx = NULL; + return 0; +} + int fr_radius_client_fd_bio_read(fr_bio_packet_t *bio, void **request_ctx_p, fr_packet_t **packet_p, TALLOC_CTX *out_ctx, fr_pair_list_t *out) { diff --git a/src/protocols/radius/client.h b/src/protocols/radius/client.h index 28bb4003d0d..5917fcfffe7 100644 --- a/src/protocols/radius/client.h +++ b/src/protocols/radius/client.h @@ -46,3 +46,5 @@ fr_bio_packet_t *fr_radius_client_bio_alloc(TALLOC_CTX *ctx, fr_radius_client_co fr_bio_t *fr_radius_client_bio_get_fd(fr_bio_packet_t *bio) CC_HINT(nonnull); int fr_radius_client_bio_connect(fr_bio_packet_t *bio) CC_HINT(nonnull); + +int fr_radius_client_fd_bio_cancel(fr_bio_packet_t *bio, fr_packet_t *packet) CC_HINT(nonnull);