FR_BIO_COMMON;
fr_bio_verify_t verify; //!< verify data to see if we have a packet.
+ void *verify_ctx; //!< verify context
fr_bio_buf_t read_buffer; //!< buffering for reads
fr_bio_buf_t write_buffer; //!< buffering for writes
* @todo - if we're allowed more than one packet in the buffer, we should just call
* fr_bio_mem_read_verify(), or this function should call fr_bio_mem_call_verify().
*/
- switch (my->verify((fr_bio_t *) my, packet_ctx, buffer, &want)) {
+ switch (my->verify((fr_bio_t *) my, my->verify_ctx, packet_ctx, buffer, &want)) {
/*
* The data in the buffer is exactly a packet. Return that.
*
want = end - packet;
- switch (my->verify((fr_bio_t *) my, packet_ctx, packet, &want)) {
+ switch (my->verify((fr_bio_t *) my, my->verify_ctx, packet_ctx, packet, &want)) {
/*
* The data in the buffer is exactly a packet. Return that.
*
my->bio.write = fr_bio_next_write;
}
my->priv_cb.eof = fr_bio_mem_eof;
- my->priv_cb.flush = fr_bio_mem_flush;
+ my->priv_cb.write_resume = fr_bio_mem_write_resume;
fr_bio_chain(&my->bio, next);
* - <0 on error
* - 0 on success
*/
-int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, bool datagram)
+int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, void *verify_ctx, bool datagram)
{
fr_bio_mem_t *my = talloc_get_type_abort(bio, fr_bio_mem_t);
}
my->verify = verify;
+ my->verify_ctx = verify_ctx;
/*
* If we are writing datagrams, then we cannot buffer individual datagrams. We must write
* update the packet_ctx to say "dup", and then return OK.
*
* @param bio the bio to read
+ * @param verify_ctx data specific for verifying
* @param packet_ctx as passed in to fr_bio_read()
* @param buffer pointer to the raw data
* @param[in,out] size in: size of data in the buffer. out: size of the packet to return, or data to discard.
* @return action to take
*/
-typedef fr_bio_verify_action_t (*fr_bio_verify_t)(fr_bio_t *bio, void *packet_ctx, const void *buffer, size_t *size);
+typedef fr_bio_verify_action_t (*fr_bio_verify_t)(fr_bio_t *bio, void *verify_ctx, void *packet_ctx, const void *buffer, size_t *size);
fr_bio_t *fr_bio_mem_alloc(TALLOC_CTX *ctx, size_t read_size, size_t write_size, fr_bio_t *next) CC_HINT(nonnull);
void fr_bio_mem_read_discard(fr_bio_t *bio, size_t size) CC_HINT(nonnull);
-int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, bool datagram) CC_HINT(nonnull);
+int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, void *verify_ctx, bool datagram) CC_HINT(nonnull);
int fr_bio_mem_write_resume(fr_bio_t *bio) CC_HINT(nonnull);
/** Callback for RADIUS packet verification.
*
*/
-fr_bio_verify_action_t fr_radius_bio_verify(fr_bio_t *bio, UNUSED void *packet_ctx, const void *data, size_t *size)
+fr_bio_verify_action_t fr_radius_bio_verify(UNUSED fr_bio_t *bio, void *verify_ctx, UNUSED void *packet_ctx, const void *data, size_t *size)
{
decode_fail_t failure;
size_t in_buffer = *size;
- fr_radius_bio_verify_t *uctx = bio->uctx;
+ fr_radius_bio_verify_t *uctx = verify_ctx;
uint8_t const *hdr = data;
if (in_buffer < 4) {
/** And verify a datagram packet.
*
*/
-fr_bio_verify_action_t fr_radius_bio_verify_datagram(fr_bio_t *bio, UNUSED void *packet_ctx, const void *data, size_t *size)
+fr_bio_verify_action_t fr_radius_bio_verify_datagram(UNUSED fr_bio_t *bio, void *verify_ctx, UNUSED void *packet_ctx, const void *data, size_t *size)
{
decode_fail_t failure;
size_t in_buffer = *size;
- fr_radius_bio_verify_t *uctx = bio->uctx;
+ fr_radius_bio_verify_t *uctx = verify_ctx;
uint8_t const *hdr = data;
if (in_buffer < RADIUS_HEADER_LENGTH) return FR_BIO_VERIFY_DISCARD;
bool limit_proxy_state;
} fr_radius_bio_verify_t;
-fr_bio_verify_action_t fr_radius_bio_verify(fr_bio_t *bio, UNUSED void *packet_ctx, const void *data, size_t *size);
+fr_bio_verify_action_t fr_radius_bio_verify(fr_bio_t *bio, void *verify_ctx, void *packet_ctx, const void *data, size_t *size) CC_HINT(nonnull(1,2,4));
-fr_bio_verify_action_t fr_radius_bio_verify_datagram(fr_bio_t *bio, UNUSED void *packet_ctx, const void *data, size_t *size);
+fr_bio_verify_action_t fr_radius_bio_verify_datagram(fr_bio_t *bio, void *verify_ctx , void *packet_ctx, const void *data, size_t *size) CC_HINT(nonnull(1,2,4));
my->mem = fr_bio_mem_alloc(my, read_size, 2 * 4096, my->fd);
if (!my->mem) goto fail;
- my->mem->uctx = &my->cfg.verify;
+ my->mem->uctx = my;
if (cfg->packet_cb_cfg.retry) rewrite = radius_client_retry;
my = fr_radius_client_fd_bio_alloc(ctx, 2 * 4096, cfg, fd_cfg);
if (!my) return NULL;
- if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify, true) < 0) {
+ if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify, &my->cfg.verify, true) < 0) {
talloc_free(my);
return NULL;
}
my = fr_radius_client_fd_bio_alloc(ctx, 2 * 4096, cfg, fd_cfg);
if (!my) return NULL;
- if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify_datagram, true) < 0) {
+ if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify_datagram, &my->cfg.verify, true) < 0) {
talloc_free(my);
return NULL;
}
my = fr_radius_server_fd_bio_alloc(ctx, 2 * 4096, cfg, fd_cfg);
if (!my) return NULL;
- if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify_datagram, true) < 0) {
+ if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify_datagram, &my->cfg.verify, true) < 0) {
fail:
talloc_free(my);
return NULL;