From: Alan T. DeKok Date: Fri, 3 May 2019 17:33:47 +0000 (-0400) Subject: have the worker signal the request directly X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21af134dba9364b6b791007bcadaced8d2144bf7;p=thirdparty%2Ffreeradius-server.git have the worker signal the request directly now that everything is integrated, the workers can call unlang functions. Since the worker can signal unlang directly, we no longer need fr_io_action_t, or to pass it as a parameter to the process functions. --- diff --git a/src/lib/io/base.h b/src/lib/io/base.h index abbc787e685..f36ee13fbd9 100644 --- a/src/lib/io/base.h +++ b/src/lib/io/base.h @@ -45,16 +45,6 @@ typedef struct { uint64_t dropped; } fr_io_stats_t; -/** - * Tell an async process function if it should run or exit. - */ -typedef enum { - FR_IO_ACTION_INVALID = 0, - FR_IO_ACTION_RUN, - FR_IO_ACTION_DONE, - FR_IO_ACTION_DUP, -} fr_io_action_t; - /** * Answer from an async process function if the worker should yield, * reply, or drop the request. @@ -339,7 +329,7 @@ typedef int (*fr_io_close_t)(fr_listen_t *li); * for the #fr_app_worker_t that gave us the * entry point. */ -typedef fr_io_final_t (*fr_io_process_t)(void const *instance, REQUEST *request, fr_io_action_t action); +typedef fr_io_final_t (*fr_io_process_t)(void const *instance, REQUEST *request); /* * Structures and definitions for the master IO handler. diff --git a/src/lib/io/worker.c b/src/lib/io/worker.c index 04cb7ae0d22..b19b49303a9 100644 --- a/src/lib/io/worker.c +++ b/src/lib/io/worker.c @@ -1013,7 +1013,7 @@ static void fr_worker_run_request(fr_worker_t *worker, REQUEST *request) if ((*request->async->original_recv_time == request->async->recv_time) && (request->async->fake || fr_channel_active(request->async->channel))) { - final = request->async->process(request->async->process_inst, request, FR_IO_ACTION_RUN); + final = request->async->process(request->async->process_inst, request); } else { unlang_interpret_signal(request, FR_SIGNAL_CANCEL); diff --git a/src/lib/server/auth.c b/src/lib/server/auth.c index 3ba463b231e..1368d4dec4f 100644 --- a/src/lib/server/auth.c +++ b/src/lib/server/auth.c @@ -159,7 +159,7 @@ runit: } RDEBUG("server %s {", cf_section_name2(request->server_cs)); - final = request->async->process(request->async->process_inst, request, FR_IO_ACTION_RUN); + final = request->async->process(request->async->process_inst, request); RDEBUG("} # server %s", cf_section_name2(request->server_cs)); fr_cond_assert(final == FR_IO_REPLY); diff --git a/src/lib/server/virtual_servers.h b/src/lib/server/virtual_servers.h index 87b40486ea7..f1a5da79f78 100644 --- a/src/lib/server/virtual_servers.h +++ b/src/lib/server/virtual_servers.h @@ -89,10 +89,20 @@ bool listen_record(fr_listen_t *li) CC_HINT(nonnull); int fr_app_process_bootstrap(CONF_SECTION *server, dl_instance_t **type_submodule, CONF_SECTION *conf); int fr_app_process_instantiate(CONF_SECTION *server, dl_instance_t **type_submodule, dl_instance_t **type_submodule_by_code, int code_max, CONF_SECTION *conf); + +/** Module methods which are allowed in virtual servers. + * + */ +typedef struct { + char const *name; + char const *name2; +} virtual_server_method_t; + typedef struct { char const *name; char const *name2; rlm_components_t component; + virtual_server_method_t *methods; } virtual_server_compile_t; #define COMPILE_TERMINATOR { .name = NULL, .name2 = NULL } diff --git a/src/lib/unlang/call.c b/src/lib/unlang/call.c index 04b269d928c..a7e0457d3c6 100644 --- a/src/lib/unlang/call.c +++ b/src/lib/unlang/call.c @@ -114,7 +114,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->async->process_inst, request, FR_IO_ACTION_RUN); + final = request->async->process(request->async->process_inst, request); RDEBUG("} # server %s", server); diff --git a/src/lib/unlang/io.c b/src/lib/unlang/io.c index 7d86892ca4e..39abfa279fa 100644 --- a/src/lib/unlang/io.c +++ b/src/lib/unlang/io.c @@ -33,21 +33,12 @@ RCSID("$Id$") * * This is a shim function added to 'fake' requests by the subrequest and parallel keywords. */ -fr_io_final_t unlang_io_process_interpret(UNUSED void const *instance, REQUEST *request, fr_io_action_t action) +fr_io_final_t unlang_io_process_interpret(UNUSED void const *instance, REQUEST *request) { rlm_rcode_t rcode; REQUEST_VERIFY(request); - /* - * Pass this through asynchronously to the module which - * is waiting for something to happen. - */ - if (action != FR_IO_ACTION_RUN) { - unlang_interpret_signal(request, (fr_state_signal_t) action); - return FR_IO_DONE; - } - rcode = unlang_interpret_resume(request); if (request->master_state == REQUEST_STOP_PROCESSING) return FR_IO_DONE; diff --git a/src/lib/unlang/unlang_priv.h b/src/lib/unlang/unlang_priv.h index ba51f21cb80..a404347c2ea 100644 --- a/src/lib/unlang/unlang_priv.h +++ b/src/lib/unlang/unlang_priv.h @@ -357,7 +357,7 @@ void unlang_op_free(void); * * @{ */ -fr_io_final_t unlang_io_process_interpret(UNUSED void const *instance, REQUEST *request, fr_io_action_t action); +fr_io_final_t unlang_io_process_interpret(UNUSED void const *instance, REQUEST *request); REQUEST *unlang_io_subrequest_alloc(REQUEST *parent, fr_dict_t const *namespace, bool detachable); diff --git a/src/modules/proto_detail/proto_detail_process.c b/src/modules/proto_detail/proto_detail_process.c index 04851cbddca..ca2e768b0f3 100644 --- a/src/modules/proto_detail/proto_detail_process.c +++ b/src/modules/proto_detail/proto_detail_process.c @@ -47,7 +47,7 @@ fr_dict_attr_autoload_t proto_detail_process_dict_attr[] = { { NULL } }; -static fr_io_final_t mod_process(void const *instance, REQUEST *request, fr_io_action_t action) +static fr_io_final_t mod_process(void const *instance, REQUEST *request) { VALUE_PAIR *vp; rlm_rcode_t rcode; @@ -56,15 +56,6 @@ static fr_io_final_t mod_process(void const *instance, REQUEST *request, fr_io_a REQUEST_VERIFY(request); - /* - * Pass this through asynchronously to the module which - * is waiting for something to happen. - */ - if (action != FR_IO_ACTION_RUN) { - unlang_interpret_signal(request, (fr_state_signal_t) action); - return FR_IO_DONE; - } - switch (request->request_state) { case REQUEST_INIT: RDEBUG("Received %s ID %i", diff --git a/src/modules/proto_dhcpv4/proto_dhcpv4_base.c b/src/modules/proto_dhcpv4/proto_dhcpv4_base.c index f419b7922b2..06ad3ac3366 100644 --- a/src/modules/proto_dhcpv4/proto_dhcpv4_base.c +++ b/src/modules/proto_dhcpv4/proto_dhcpv4_base.c @@ -119,7 +119,7 @@ static void dhcpv4_packet_debug(REQUEST *request, RADIUS_PACKET *packet, bool re } } -static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, UNUSED fr_io_action_t action) +static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request) { rlm_rcode_t rcode; CONF_SECTION *unlang; diff --git a/src/modules/proto_radius/proto_radius_acct.c b/src/modules/proto_radius/proto_radius_acct.c index 25728908b0e..0f8ac54b12a 100644 --- a/src/modules/proto_radius/proto_radius_acct.c +++ b/src/modules/proto_radius/proto_radius_acct.c @@ -48,7 +48,7 @@ fr_dict_attr_autoload_t proto_radius_acct_dict_attr[] = { }; -static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action) +static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request) { VALUE_PAIR *vp; rlm_rcode_t rcode; @@ -57,15 +57,6 @@ static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, REQUEST_VERIFY(request); - /* - * Pass this through asynchronously to the module which - * is waiting for something to happen. - */ - if (action != FR_IO_ACTION_RUN) { - unlang_interpret_signal(request, (fr_state_signal_t) action); - return FR_IO_DONE; - } - switch (request->request_state) { case REQUEST_INIT: if (request->parent && RDEBUG_ENABLED) { diff --git a/src/modules/proto_radius/proto_radius_auth.c b/src/modules/proto_radius/proto_radius_auth.c index e39cbabcd72..58b49b1c5d8 100644 --- a/src/modules/proto_radius/proto_radius_auth.c +++ b/src/modules/proto_radius/proto_radius_auth.c @@ -240,7 +240,7 @@ static void CC_HINT(format (printf, 4, 5)) auth_message(proto_radius_auth_t cons talloc_free(msg); } -static fr_io_final_t mod_process(void const *instance, REQUEST *request, fr_io_action_t action) +static fr_io_final_t mod_process(void const *instance, REQUEST *request) { proto_radius_auth_t const *inst = instance; VALUE_PAIR *vp, *auth_type; @@ -251,15 +251,6 @@ static fr_io_final_t mod_process(void const *instance, REQUEST *request, fr_io_a REQUEST_VERIFY(request); - /* - * Pass this through asynchronously to the module which - * is waiting for something to happen. - */ - if (action != FR_IO_ACTION_RUN) { - unlang_interpret_signal(request, (fr_state_signal_t) action); - return FR_IO_DONE; - } - switch (request->request_state) { case REQUEST_INIT: if (request->parent && RDEBUG_ENABLED) { diff --git a/src/modules/proto_radius/proto_radius_coa.c b/src/modules/proto_radius/proto_radius_coa.c index 316e8f8cacf..aa56772b9f7 100644 --- a/src/modules/proto_radius/proto_radius_coa.c +++ b/src/modules/proto_radius/proto_radius_coa.c @@ -49,7 +49,7 @@ fr_dict_attr_autoload_t proto_radius_coa_dict_attr[] = { { NULL } }; -static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action) +static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request) { VALUE_PAIR *vp; rlm_rcode_t rcode; @@ -58,15 +58,6 @@ static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, REQUEST_VERIFY(request); - /* - * Pass this through asynchronously to the module which - * is waiting for something to happen. - */ - if (action != FR_IO_ACTION_RUN) { - unlang_interpret_signal(request, (fr_state_signal_t) action); - return FR_IO_DONE; - } - switch (request->request_state) { case REQUEST_INIT: if (request->parent && RDEBUG_ENABLED) { diff --git a/src/modules/proto_radius/proto_radius_dynamic_client.c b/src/modules/proto_radius/proto_radius_dynamic_client.c index bd9c1e24ead..7f78da84a2f 100644 --- a/src/modules/proto_radius/proto_radius_dynamic_client.c +++ b/src/modules/proto_radius/proto_radius_dynamic_client.c @@ -57,22 +57,13 @@ fr_dict_attr_autoload_t proto_radius_dynamic_client_dict_attr[] = { { NULL } }; -static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action) +static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request) { rlm_rcode_t rcode; CONF_SECTION *unlang; REQUEST_VERIFY(request); - /* - * Pass this through asynchronously to the module which - * is waiting for something to happen. - */ - if (action != FR_IO_ACTION_RUN) { - unlang_interpret_signal(request, (fr_state_signal_t) action); - return FR_IO_DONE; - } - switch (request->request_state) { case REQUEST_INIT: request->component = "radius"; diff --git a/src/modules/proto_radius/proto_radius_status.c b/src/modules/proto_radius/proto_radius_status.c index 40d54235d9a..3076b90a769 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(UNUSED void const *instance, REQUEST *request, fr_io_action_t action) +static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request) { rlm_rcode_t rcode; CONF_SECTION *unlang; @@ -54,15 +54,6 @@ static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, REQUEST_VERIFY(request); - /* - * Pass this through asynchronously to the module which - * is waiting for something to happen. - */ - if (action != FR_IO_ACTION_RUN) { - unlang_interpret_signal(request, (fr_state_signal_t) action); - return FR_IO_DONE; - } - switch (request->request_state) { case REQUEST_INIT: if (request->parent && RDEBUG_ENABLED) { diff --git a/src/modules/proto_vmps/proto_vmps_all.c b/src/modules/proto_vmps/proto_vmps_all.c index 327d31359a3..682a70b37d0 100644 --- a/src/modules/proto_vmps/proto_vmps_all.c +++ b/src/modules/proto_vmps/proto_vmps_all.c @@ -48,7 +48,7 @@ fr_dict_attr_autoload_t proto_vmps_all_dict_attr[] = { { NULL } }; -static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, UNUSED fr_io_action_t action) +static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request) { 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 498281bbc94..eb631bd49c5 100644 --- a/src/modules/proto_vmps/proto_vmps_dynamic_client.c +++ b/src/modules/proto_vmps/proto_vmps_dynamic_client.c @@ -57,22 +57,13 @@ fr_dict_attr_autoload_t proto_vmps_dynamic_client_dict_attr[] = { #define CLIENT_ADD (1) #define CLIENT_NAK (257) -static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request, fr_io_action_t action) +static fr_io_final_t mod_process(UNUSED void const *instance, REQUEST *request) { rlm_rcode_t rcode; CONF_SECTION *unlang; REQUEST_VERIFY(request); - /* - * Pass this through asynchronously to the module which - * is waiting for something to happen. - */ - if (action != FR_IO_ACTION_RUN) { - unlang_interpret_signal(request, (fr_state_signal_t) action); - return FR_IO_DONE; - } - switch (request->request_state) { case REQUEST_INIT: RDEBUG("Received %s ID %i", fr_vmps_codes[request->packet->code], request->packet->id);