]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add "cancel packet" API
authorAlan T. DeKok <aland@freeradius.org>
Sat, 30 Mar 2024 17:52:58 +0000 (13:52 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 30 Mar 2024 22:13:46 +0000 (18:13 -0400)
src/protocols/radius/client.c
src/protocols/radius/client.h

index a860eaffb104d6c167858fa67440896bc5acf2a1..05ac61f4045d2033fba88d170961317c8bbeabaf 100644 (file)
@@ -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)
 {
index 28bb4003d0d632fc29f39686d37959e3754334f9..5917fcfffe789d6b15d9ff09eee0f3af7dcbcb1f 100644 (file)
@@ -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);