From: Arran Cudbard-Bell Date: Fri, 25 May 2018 09:49:17 +0000 (+0600) Subject: Yes, unfortunately the state machines need instance data too X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ffe027be8065c7e476c18a9ca1dcc0df4ab4c83e;p=thirdparty%2Ffreeradius-server.git Yes, unfortunately the state machines need instance data too --- diff --git a/src/lib/io/application.h b/src/lib/io/application.h index b86bcc546cd..f0e951df00a 100644 --- a/src/lib/io/application.h +++ b/src/lib/io/application.h @@ -122,7 +122,7 @@ typedef struct { ///< 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. diff --git a/src/lib/io/io.h b/src/lib/io/io.h index a3516dcdbfb..c0d1b5efce1 100644 --- a/src/lib/io/io.h +++ b/src/lib/io/io.h @@ -306,8 +306,11 @@ typedef int (*fr_io_signal_t)(void const *instance); /** 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. diff --git a/src/lib/io/listen.h b/src/lib/io/listen.h index 11b275ffd13..69ab49c3186 100644 --- a/src/lib/io/listen.h +++ b/src/lib/io/listen.h @@ -39,10 +39,13 @@ struct fr_listen { * 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; diff --git a/src/lib/io/worker.c b/src/lib/io/worker.c index 5b4812e1df1..a30fa668df8 100644 --- a/src/lib/io/worker.c +++ b/src/lib/io/worker.c @@ -584,7 +584,7 @@ finished: 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 @@ -943,7 +943,7 @@ nak: * 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; } @@ -1014,10 +1014,10 @@ static void fr_worker_run_request(fr_worker_t *worker, REQUEST *request) 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); } diff --git a/src/main/auth.c b/src/main/auth.c index 5f30cc436be..c52ca4aac34 100644 --- a/src/main/auth.c +++ b/src/main/auth.c @@ -507,7 +507,7 @@ static rlm_rcode_t virtual_server_async(REQUEST *request, bool parent) } 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); diff --git a/src/modules/proto_detail/proto_detail_process.c b/src/modules/proto_detail/proto_detail_process.c index 75560a145d2..268a104c599 100644 --- a/src/modules/proto_detail/proto_detail_process.c +++ b/src/modules/proto_detail/proto_detail_process.c @@ -48,7 +48,7 @@ fr_dict_attr_autoload_t proto_detail_process_dict_attr[] = { { 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; diff --git a/src/modules/proto_dhcpv4/proto_dhcpv4.c b/src/modules/proto_dhcpv4/proto_dhcpv4.c index a15eb235bac..66d25d11e21 100644 --- a/src/modules/proto_dhcpv4/proto_dhcpv4.c +++ b/src/modules/proto_dhcpv4/proto_dhcpv4.c @@ -415,9 +415,9 @@ static ssize_t mod_encode(void const *instance, REQUEST *request, uint8_t *buffe 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); @@ -437,13 +437,14 @@ static void mod_entry_point_set(void const *instance, REQUEST *request) 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; } @@ -459,7 +460,7 @@ static int mod_priority_set(void const *instance, uint8_t const *buffer, UNUSED */ 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 @@ -666,7 +667,7 @@ static int mod_instantiate(void *instance, CONF_SECTION *conf) 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++; diff --git a/src/modules/proto_dhcpv4/proto_dhcpv4.h b/src/modules/proto_dhcpv4/proto_dhcpv4.h index b1f87a19f48..11058f422b5 100644 --- a/src/modules/proto_dhcpv4/proto_dhcpv4.h +++ b/src/modules/proto_dhcpv4/proto_dhcpv4.h @@ -35,7 +35,7 @@ typedef struct proto_dhcpv4_t { 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. diff --git a/src/modules/proto_dhcpv4/proto_dhcpv4_base.c b/src/modules/proto_dhcpv4/proto_dhcpv4_base.c index d65cbcbca0e..9de692715cb 100644 --- a/src/modules/proto_dhcpv4/proto_dhcpv4_base.c +++ b/src/modules/proto_dhcpv4/proto_dhcpv4_base.c @@ -71,7 +71,7 @@ static int reply_fail[FR_DHCP_INFORM + 1] = { [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; diff --git a/src/modules/proto_radius/proto_radius.c b/src/modules/proto_radius/proto_radius.c index 53043fdcbae..0430b8f8e01 100644 --- a/src/modules/proto_radius/proto_radius.c +++ b/src/modules/proto_radius/proto_radius.c @@ -488,7 +488,7 @@ static ssize_t mod_encode(void const *instance, REQUEST *request, uint8_t *buffe 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); @@ -505,17 +505,19 @@ static void mod_entry_point_set(void const *instance, REQUEST *request) 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; } @@ -531,7 +533,7 @@ static int mod_priority_set(void const *instance, uint8_t const *buffer, UNUSED */ 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 @@ -766,7 +768,7 @@ static int mod_instantiate(void *instance, CONF_SECTION *conf) 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++; @@ -946,16 +948,16 @@ static int mod_bootstrap(void *instance, CONF_SECTION *conf) } 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 }; diff --git a/src/modules/proto_radius/proto_radius.h b/src/modules/proto_radius/proto_radius.h index 58929be625a..a282b43b371 100644 --- a/src/modules/proto_radius/proto_radius.h +++ b/src/modules/proto_radius/proto_radius.h @@ -35,8 +35,7 @@ typedef struct proto_radius_t { 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. diff --git a/src/modules/proto_radius/proto_radius_acct.c b/src/modules/proto_radius/proto_radius_acct.c index 1bd0b857fdb..6f7a0f92d8d 100644 --- a/src/modules/proto_radius/proto_radius_acct.c +++ b/src/modules/proto_radius/proto_radius_acct.c @@ -46,7 +46,7 @@ fr_dict_attr_autoload_t proto_radius_acct_dict_attr[] = { { 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; diff --git a/src/modules/proto_radius/proto_radius_auth.c b/src/modules/proto_radius/proto_radius_auth.c index ff3eee03c45..3cffe8c9f37 100644 --- a/src/modules/proto_radius/proto_radius_auth.c +++ b/src/modules/proto_radius/proto_radius_auth.c @@ -151,7 +151,7 @@ static void CC_HINT(format (printf, 3, 4)) auth_message(REQUEST *request, bool g 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; diff --git a/src/modules/proto_radius/proto_radius_coa.c b/src/modules/proto_radius/proto_radius_coa.c index ed7480075c3..c4b4bb321fd 100644 --- a/src/modules/proto_radius/proto_radius_coa.c +++ b/src/modules/proto_radius/proto_radius_coa.c @@ -45,7 +45,7 @@ fr_dict_attr_autoload_t proto_radius_coa_dict_attr[] = { { 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; diff --git a/src/modules/proto_radius/proto_radius_dynamic_client.c b/src/modules/proto_radius/proto_radius_dynamic_client.c index bb399784724..b629be97e33 100644 --- a/src/modules/proto_radius/proto_radius_dynamic_client.c +++ b/src/modules/proto_radius/proto_radius_dynamic_client.c @@ -53,7 +53,7 @@ fr_dict_attr_autoload_t proto_radius_dynamic_client_dict_attr[] = { { 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; diff --git a/src/modules/proto_radius/proto_radius_status.c b/src/modules/proto_radius/proto_radius_status.c index c03ea227454..128ea920d57 100644 --- a/src/modules/proto_radius/proto_radius_status.c +++ b/src/modules/proto_radius/proto_radius_status.c @@ -45,7 +45,7 @@ fr_dict_attr_autoload_t proto_radius_status_dict_attr[] = { { 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; diff --git a/src/modules/proto_vmps/proto_vmps_all.c b/src/modules/proto_vmps/proto_vmps_all.c index 3c8b5ba7261..1a67f50ad31 100644 --- a/src/modules/proto_vmps/proto_vmps_all.c +++ b/src/modules/proto_vmps/proto_vmps_all.c @@ -30,7 +30,7 @@ #include #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; diff --git a/src/modules/proto_vmps/proto_vmps_dynamic_client.c b/src/modules/proto_vmps/proto_vmps_dynamic_client.c index f459e477b13..717fd88872a 100644 --- a/src/modules/proto_vmps/proto_vmps_dynamic_client.c +++ b/src/modules/proto_vmps/proto_vmps_dynamic_client.c @@ -33,7 +33,7 @@ #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; diff --git a/src/tests/util/radius1_test.c b/src/tests/util/radius1_test.c index 04d0849a031..5e2f8d4dbd1 100644 --- a/src/tests/util/radius1_test.c +++ b/src/tests/util/radius1_test.c @@ -89,7 +89,7 @@ static void NEVER_RETURNS usage(void) 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; diff --git a/src/tests/util/worker_test.c b/src/tests/util/worker_test.c index 247f47d72c1..86303990118 100644 --- a/src/tests/util/worker_test.c +++ b/src/tests/util/worker_test.c @@ -99,7 +99,7 @@ static void NEVER_RETURNS usage(void) 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; diff --git a/src/unlang/op.c b/src/unlang/op.c index ca9142561ab..7607c3ed0ef 100644 --- a/src/unlang/op.c +++ b/src/unlang/op.c @@ -433,7 +433,7 @@ static unlang_action_t unlang_group(REQUEST *request, * * 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; @@ -717,7 +717,7 @@ static unlang_action_t unlang_call(REQUEST *request, * (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));