///< Here for convenience, so that encode operations common
///< to all #fr_app_io_t can be performed by the #fr_app_t.
- fr_app_entry_point_set_t entry_point_set; //!< Callback to Set the entry point into the state machine
+ fr_app_entry_point_set_t entry_point_set;//!< Callback to Set the entry point into the state machine
///< provided by the fr_app_process_t.
///< We need a function this as the #fr_app_process_t might
///< change based on the packet we received.
/** Process a request through the transport async state machine.
*
+ * @param[in] instance Usually the #fr_app_process_t instance data.
+ * for the #fr_app_process_t that gave us the
+ * entry point.
*/
-typedef fr_io_final_t (*fr_io_process_t)(REQUEST *request, fr_io_action_t action);
+typedef fr_io_final_t (*fr_io_process_t)(void const *instance, REQUEST *request, fr_io_action_t action);
/*
* Structures and definitions for the master IO handler.
* Minimal data structure to use the new code.
*/
struct fr_async_t {
+ fr_io_process_t process; //!< The current state function.
+ void *process_inst; //!< Instance data for the current state machine.
+
fr_time_t recv_time;
fr_time_t *original_recv_time;
fr_event_list_t *el;
- fr_io_process_t process; //!< The current state function.
+
fr_time_tracking_t tracking;
fr_channel_t *channel;
static void worker_stop_request(fr_worker_t *worker, REQUEST *request, fr_time_t now)
{
fr_time_tracking_resume(&request->async->tracking, now);
- (void) request->async->process(request, FR_IO_ACTION_DONE);
+ (void) request->async->process(request->async->process_inst, request, FR_IO_ACTION_DONE);
/*
* The request is ALWAYS in the time_order list. It MAY
* running, but is yielded. It MAY clean
* itself up, or do something...
*/
- (void) old->async->process(old, FR_IO_ACTION_DUP);
+ (void) old->async->process(request->async->process_inst, old, FR_IO_ACTION_DUP);
return NULL;
}
if ((*request->async->original_recv_time == request->async->recv_time) &&
(request->async->detached ||
fr_channel_active(request->async->channel))) {
- final = request->async->process(request, FR_IO_ACTION_RUN);
+ final = request->async->process(request->async->process_inst, request, FR_IO_ACTION_RUN);
} else {
- final = request->async->process(request, FR_IO_ACTION_DONE);
+ final = request->async->process(request->async->process_inst, request, FR_IO_ACTION_DONE);
rad_assert(final == FR_IO_DONE);
}
}
RDEBUG("server %s {", cf_section_name2(request->server_cs));
- final = request->async->process(request, FR_IO_ACTION_RUN);
+ final = request->async->process(request->async->process_inst, request, FR_IO_ACTION_RUN);
RDEBUG("} # server %s", cf_section_name2(request->server_cs));
fr_cond_assert(final == FR_IO_REPLY);
{ NULL }
};
-static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action)
{
VALUE_PAIR *vp;
rlm_rcode_t rcode;
static void mod_entry_point_set(void const *instance, REQUEST *request)
{
- proto_dhcpv4_t const *inst = talloc_get_type_abort_const(instance, proto_dhcpv4_t);
- fr_io_process_t process;
- fr_io_track_t *track = request->async->packet_ctx;
+ proto_dhcpv4_t const *inst = talloc_get_type_abort_const(instance, proto_dhcpv4_t);
+ dl_instance_t *type_submodule;
+ fr_io_track_t *track = request->async->packet_ctx;
rad_assert(request->packet->code != 0);
rad_assert(request->packet->code < FR_DHCP_MAX);
return;
}
- process = inst->entry_point_by_code[request->packet->code];
- if (!process) {
- REDEBUG("proto_dhcpv4 - No module available to handle packet code %i", request->packet->code);
+ type_submodule = inst->type_submodule_by_code[request->packet->code];
+ if (!type_submodule) {
+ REDEBUG("No module available to handle packet code %i", request->packet->code);
return;
}
- request->async->process = process;
+ request->async->process = ((fr_app_process_t const *)type_submodule->module->common)->entry_point;
+ request->async->process_inst = type_submodule->data;
}
*/
if (!inst->priorities[buffer[0]]) return 0;
- if (!inst->entry_point_by_code[buffer[0]]) return -1;
+ if (!inst->type_submodule_by_code[buffer[0]]) return -1;
/*
* @todo - if we cared, we could also return -1 for "this
if (!fr_cond_assert(enumv)) return -1;
code = enumv->value->vb_uint32;
- inst->entry_point_by_code[code] = app_process->entry_point; /* Store the process function */
+ inst->type_submodule_by_code[code] = inst->type_submodule[i];
rad_assert(inst->code_allowed[code] == true);
i++;
dl_instance_t **type_submodule; //!< Instance of the various types
dl_instance_t *dynamic_submodule; //!< proto_dhcpv4_dynamic_client
//!< only one instance per type allowed.
- fr_io_process_t entry_point_by_code[FR_DHCP_MAX]; //!< Lookup process entry point by code.
+ dl_instance_t *type_submodule_by_code[FR_DHCP_MAX]; //!< Lookup process entry point by code.
uint32_t max_packet_size; //!< for message ring buffer.
uint32_t num_messages; //!< for message ring buffer.
[FR_DHCP_INFORM] = FR_DHCP_NAK,
};
-static fr_io_final_t mod_process(REQUEST *request, UNUSED fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, UNUSED fr_io_action_t action)
{
rlm_rcode_t rcode;
CONF_SECTION *unlang;
static void mod_entry_point_set(void const *instance, REQUEST *request)
{
proto_radius_t const *inst = talloc_get_type_abort_const(instance, proto_radius_t);
- fr_io_process_t process;
+ dl_instance_t *type_submodule;
fr_io_track_t *track = request->async->packet_ctx;
rad_assert(request->packet->code != 0);
app_process = (fr_app_process_t const *) inst->dynamic_submodule->module->common;
request->async->process = app_process->entry_point;
+ request->async->process_inst = inst->dynamic_submodule;
track->dynamic = 0;
return;
}
- process = inst->entry_point_by_code[request->packet->code];
- if (!process) {
- REDEBUG("proto_radius - No module available to handle packet code %i", request->packet->code);
+ type_submodule = inst->type_submodule_by_code[request->packet->code];
+ if (!type_submodule) {
+ REDEBUG("No module available to handle packet code %i", request->packet->code);
return;
}
- request->async->process = process;
+ request->async->process = ((fr_app_process_t const *)type_submodule->module->common)->entry_point;
+ request->async->process_inst = type_submodule->data;
}
*/
if (!inst->priorities[buffer[0]]) return 0;
- if (!inst->entry_point_by_code[buffer[0]]) return -1;
+ if (!inst->type_submodule_by_code[buffer[0]]) return -1;
/*
* @todo - if we cared, we could also return -1 for "this
if (!fr_cond_assert(enumv)) return -1;
code = enumv->value->vb_uint32;
- inst->entry_point_by_code[code] = app_process->entry_point; /* Store the process function */
+ inst->type_submodule_by_code[code] = inst->type_submodule[i]; /* Store the process function */
rad_assert(inst->code_allowed[code] == true);
i++;
}
fr_app_t proto_radius = {
- .magic = RLM_MODULE_INIT,
- .name = "radius",
- .config = proto_radius_config,
- .inst_size = sizeof(proto_radius_t),
-
- .bootstrap = mod_bootstrap,
- .instantiate = mod_instantiate,
- .open = mod_open,
- .decode = mod_decode,
- .encode = mod_encode,
+ .magic = RLM_MODULE_INIT,
+ .name = "radius",
+ .config = proto_radius_config,
+ .inst_size = sizeof(proto_radius_t),
+
+ .bootstrap = mod_bootstrap,
+ .instantiate = mod_instantiate,
+ .open = mod_open,
+ .decode = mod_decode,
+ .encode = mod_encode,
.entry_point_set = mod_entry_point_set,
- .priority = mod_priority_set
+ .priority = mod_priority_set
};
dl_instance_t **type_submodule; //!< Instance of the various types
dl_instance_t *dynamic_submodule; //!< proto_radius_dynamic_client
//!< only one instance per type allowed.
- fr_io_process_t entry_point_by_code[FR_MAX_PACKET_CODE]; //!< Lookup process entry point by code.
- void *process_instance_by_code[FR_MAX_PACKET_CODE]; //!< Lookup process instance by code.
+ dl_instance_t *type_submodule_by_code[FR_MAX_PACKET_CODE]; //!< Lookup process entry point by code.
uint32_t max_packet_size; //!< for message ring buffer.
uint32_t num_messages; //!< for message ring buffer.
{ NULL }
};
-static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action)
{
VALUE_PAIR *vp;
rlm_rcode_t rcode;
talloc_free(msg);
}
-static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action)
{
VALUE_PAIR *vp, *auth_type;
rlm_rcode_t rcode;
{ NULL }
};
-static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action)
{
VALUE_PAIR *vp;
rlm_rcode_t rcode;
{ NULL }
};
-static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action)
{
rlm_rcode_t rcode;
CONF_SECTION *unlang;
{ NULL }
};
-static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action)
{
rlm_rcode_t rcode;
CONF_SECTION *unlang;
#include <freeradius-devel/rad_assert.h>
#include "vqp.h"
-static fr_io_final_t mod_process(REQUEST *request, UNUSED fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, UNUSED fr_io_action_t action)
{
rlm_rcode_t rcode;
CONF_SECTION *unlang;
#define CLIENT_ADD (1)
#define CLIENT_NAK (257)
-static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action)
{
rlm_rcode_t rcode;
CONF_SECTION *unlang;
exit(EXIT_FAILURE);
}
-static fr_io_final_t test_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t test_process(void const *instance, REQUEST *request, fr_io_action_t action)
{
MPRINT1("\t\tPROCESS --- request %"PRIu64" action %d\n", request->number, action);
return FR_IO_REPLY;
exit(EXIT_FAILURE);
}
-static fr_io_final_t test_process(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t test_process(UNUSED void const *inst, REQUEST *request, fr_io_action_t action)
{
MPRINT1("\t\tPROCESS --- request %"PRIu64" action %d\n", request->number, action);
return FR_IO_REPLY;
*
* Just run some "unlang", but don't do anything else.
*/
-static fr_io_final_t unlang_process_continue(REQUEST *request, fr_io_action_t action)
+static fr_io_final_t unlang_process_continue(UNUSED void const *instance, REQUEST *request, fr_io_action_t action)
{
rlm_rcode_t rcode;
* (e.g. Access-Request -> Accounting-Request) unless
* we're in a subrequest.
*/
- final = request->async->process(request, FR_IO_ACTION_RUN);
+ final = request->async->process(request->async->process_inst, request, FR_IO_ACTION_RUN);
RDEBUG("} # server %s", cf_section_name2(g->server_cs));