]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Yes, unfortunately the state machines need instance data too
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 25 May 2018 09:49:17 +0000 (15:49 +0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 25 May 2018 10:07:47 +0000 (16:07 +0600)
21 files changed:
src/lib/io/application.h
src/lib/io/io.h
src/lib/io/listen.h
src/lib/io/worker.c
src/main/auth.c
src/modules/proto_detail/proto_detail_process.c
src/modules/proto_dhcpv4/proto_dhcpv4.c
src/modules/proto_dhcpv4/proto_dhcpv4.h
src/modules/proto_dhcpv4/proto_dhcpv4_base.c
src/modules/proto_radius/proto_radius.c
src/modules/proto_radius/proto_radius.h
src/modules/proto_radius/proto_radius_acct.c
src/modules/proto_radius/proto_radius_auth.c
src/modules/proto_radius/proto_radius_coa.c
src/modules/proto_radius/proto_radius_dynamic_client.c
src/modules/proto_radius/proto_radius_status.c
src/modules/proto_vmps/proto_vmps_all.c
src/modules/proto_vmps/proto_vmps_dynamic_client.c
src/tests/util/radius1_test.c
src/tests/util/worker_test.c
src/unlang/op.c

index b86bcc546cdbc53e7cbdbec2889f8d5ed92b2f2b..f0e951df00a07b49f6a5be6f56c6ff74d012300a 100644 (file)
@@ -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.
index a3516dcdbfbbd053b010f0f1a2d2055339a31c49..c0d1b5efce14ee7166962a6a4b51eeed1e6bb89a 100644 (file)
@@ -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.
index 11b275ffd136d8d431ccfad4bf7834668a4ef158..69ab49c3186134024e5e7c44e5295b3e512ec97d 100644 (file)
@@ -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;
 
index 5b4812e1df106548f8a2268ba95ca7e6cf2d24cc..a30fa668df8f13ebb9f75a8ab4016a25d2d4f7f2 100644 (file)
@@ -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);
        }
index 5f30cc436bec56e7ff9e1f68a1e90dc36d2c3814..c52ca4aac34ba59d1f423344b7cf9e6efb3398eb 100644 (file)
@@ -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);
index 75560a145d2abfdcf195f31978aea0c6fca25959..268a104c599695879f0e976841cef16f374af4ab 100644 (file)
@@ -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;
index a15eb235bacd13f586760afa248c355aa6416958..66d25d11e21da119bd76e4262115bdfccb6ac45f 100644 (file)
@@ -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++;
index b1f87a19f48b358496fa11a4805b4b4d7cb4b1c0..11058f422b5a762fb8afa7df27416cd05f7d3ba9 100644 (file)
@@ -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.
index d65cbcbca0ebdee1bab0e4bcd4d618d74f85a8f3..9de692715cbdca72562f96dd447e1f428ae96507 100644 (file)
@@ -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;
index 53043fdcbae7b3c73488e176f9ce08ee409564c2..0430b8f8e0177bebd158953f2ed02012ffb5b1ee 100644 (file)
@@ -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
 };
index 58929be625a16897e095baa87cf08a1d6c81799b..a282b43b371fd01dff68ce7cfafa22d1c7bcaf82 100644 (file)
@@ -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.
index 1bd0b857fdb67bfe53c4a4f6b42a655d57bd8426..6f7a0f92d8db58a2ca048064e0ba08b5f9cc04e7 100644 (file)
@@ -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;
index ff3eee03c45c844712fca69c1d87a9e372165e26..3cffe8c9f37f176ce2374d4f41af059a827398da 100644 (file)
@@ -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;
index ed7480075c39c60cc1332c1df856c5cbfcd8619b..c4b4bb321fd005f9ce532b3519e7c82529464a22 100644 (file)
@@ -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;
index bb39978472425e0b13249d487a31e056443e4744..b629be97e33ebd0c400adc7f2ee781f128984527 100644 (file)
@@ -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;
index c03ea227454ed5caa5bee2fe2a499dd5223d3d9b..128ea920d5757e9e733fb8b905605be37fd29c1a 100644 (file)
@@ -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;
index 3c8b5ba7261353224dd294e1a7c78b5dd8198fe1..1a67f50ad31823216dd562c1fa67a02d373efd3e 100644 (file)
@@ -30,7 +30,7 @@
 #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;
index f459e477b1355847291328033ccd2fe40e2f4f9a..717fd88872a101f0090b3d870f7910be72880afa 100644 (file)
@@ -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;
index 04d0849a03171f9605eb16b8677e722061469324..5e2f8d4dbd1e294f9c0d78b97ec94a07ce87836d 100644 (file)
@@ -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;
index 247f47d72c13ac796ad32a2eb22a10817cd97fbd..86303990118fa3b4ffdd722fdb5aaf7762be4c3f 100644 (file)
@@ -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;
index ca9142561ab2b54809d3d4f389cac4b122c76686..7607c3ed0ef41f3c8bbd908182f7819416e0c768 100644 (file)
@@ -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));