From: Alan T. DeKok Date: Mon, 26 Feb 2024 13:38:06 +0000 (-0500) Subject: fr_bio_packet_t handlers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50cfb96c32a27cb76f4eb1c83fa1d71a75d1f1d7;p=thirdparty%2Ffreeradius-server.git fr_bio_packet_t handlers --- diff --git a/src/lib/bio/packet.h b/src/lib/bio/packet.h new file mode 100644 index 00000000000..02810c81704 --- /dev/null +++ b/src/lib/bio/packet.h @@ -0,0 +1,96 @@ +#pragma once +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * $Id$ + * @file lib/bio/packet.h + * @brief Binary IO abstractions for #fr_radius_packet_t + * + * @copyright 2024 Network RADIUS SAS (legal@networkradius.com) + */ +RCSIDH(lib_bio_packet_h, "$Id$") + +#include +#include + +// @todo - _CONST + +typedef struct fr_bio_packet_s fr_bio_packet_t; + +/** Read a packet and pairs from the network + * + * @param bio the packet-based bio + * @param packet_ctx any per-packet additional context needed + * @param packet_p the output packet descriptor. Contains raw protocol data (IDs, counts, etc.) + * @param out the decoded pairs from the packet + * @return + * - <0 on error + * - 0 for success (*packet_p may still be NULL tho) + */ +typedef int (*fr_bio_packet_read_t)(fr_bio_packet_t *bio, void *packet_ctx, fr_radius_packet_t **packet_p, fr_pair_list_t *out); + +/** Write a packet and pairs from the network + * + * @param bio the packet-based bio + * @param packet_ctx any per-packet additional context needed (e.g. request for reply) + * @param packet the output packet descriptor. Contains raw protocol data (IDs, counts, etc.) + * @param list the pairs to encode in the packet + * @return + * - <0 on error (EOF, fail, etc,) + * - 0 for success + */ +typedef int (*fr_bio_packet_write_t)(fr_bio_packet_t *bio, void *packet_ctx, fr_radius_packet_t *packet, fr_pair_list_t *list); + +/** Release an outgoing packet. + * + * @param bio the packet-based bio + * @param packet_ctx any per-packet additional context needed (e.g. request for reply) + * @param packet the output packet descriptor. Contains raw protocol data (IDs, counts, etc.) + * @return + * - <0 on error + * - 0 for success + */ +typedef int (*fr_bio_packet_release_t)(fr_bio_packet_t *bio, void *packet_ctx, fr_radius_packet_t *packet); + +struct fr_bio_packet_s { + void *uctx; //!< user ctx, caller can manually set it. + + fr_bio_packet_read_t read; //!< read from the underlying bio + fr_bio_packet_write_t write; //!< write to the underlying bio + + fr_bio_packet_release_t release; //!< cancel an outstanding packet + + fr_bio_t *bio; //!< underlying bio for IO +}; + + +static inline CC_HINT(nonnull) int fr_bio_packet_read(fr_bio_packet_t *bio, void *packet_ctx, fr_radius_packet_t **packet_p, fr_pair_list_t *out) +{ + return bio->read(bio, packet_ctx, packet_p, out); +} + +static inline CC_HINT(nonnull) int fr_bio_packet_write(fr_bio_packet_t *bio, void *packet_ctx, fr_radius_packet_t *packet, fr_pair_list_t *list) +{ + return bio->write(bio, packet_ctx, packet, list); +} + +static inline CC_HINT(nonnull) int fr_bio_packet_release(fr_bio_packet_t *bio, void *packet_ctx, fr_radius_packet_t *packet) +{ + if (!bio->release) return 0; + + return bio->release(bio, packet_ctx, packet); +}