![]() |
The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
|
Execute compiled unlang structures using an iterative interpret. More...
#include <freeradius-devel/unlang/action.h>
#include <freeradius-devel/unlang/interpret.h>
#include <freeradius-devel/util/timer.h>
#include <freeradius-devel/server/base.h>
#include <freeradius-devel/server/modpriv.h>
#include <freeradius-devel/server/rcode.h>
#include <freeradius-devel/unlang/xlat_func.h>
#include <freeradius-devel/unlang/mod_action.h>
#include "interpret_priv.h"
#include "unlang_priv.h"
#include "module_priv.h"
#include <freeradius-devel/unlang/module_priv.h>
Go to the source code of this file.
Data Structures | |
struct | unlang_variable_ref_t |
Macros | |
#define | DUMP_STACK if (DEBUG_ENABLED5) stack_dump(request) |
Functions | |
static int | _local_variables_free (unlang_variable_ref_t *ref) |
static void | actions_dump (request_t *request, unlang_t const *instruction) |
static int | find_result_p_location (result_p_location_t *location, void **chunk, request_t *request, void *ptr) |
Try and figure out where result_p points to. | |
static void | frame_dump (request_t *request, unlang_stack_frame_t *frame, bool with_actions) |
static unlang_frame_action_t | frame_eval (request_t *request, unlang_stack_frame_t *frame) |
Evaluates all the unlang nodes in a section. | |
static void | instruction_done_debug (request_t *request, unlang_stack_frame_t *frame, unlang_t const *instruction) |
static void | instruction_dump (request_t *request, unlang_t const *instruction) |
static void | instruction_retry_handler (UNUSED fr_timer_list_t *tl, UNUSED fr_time_t now, void *ctx) |
static void | instruction_timeout_handler (UNUSED fr_timer_list_t *tl, UNUSED fr_time_t now, void *ctx) |
static unlang_frame_action_t | result_calculate (request_t *request, unlang_stack_frame_t *frame, unlang_result_t *result) |
Update the current result after each instruction, and after popping each stack frame. | |
static unlang_frame_action_t | result_pop (request_t *request, unlang_stack_frame_t *frame, unlang_result_t *result) |
Function called to merge inter-stack-frame results. | |
void | stack_dump (request_t *request) |
static void | stack_dump_body (request_t *request, bool with_actions) |
void | stack_dump_with_actions (request_t *request) |
static void | unlang_cancel_event (UNUSED fr_timer_list_t *tl, UNUSED fr_time_t now, void *uctx) |
Signal the request to stop executing. | |
static xlat_action_t | unlang_cancel_xlat (TALLOC_CTX *ctx, fr_dcursor_t *out, UNUSED xlat_ctx_t const *xctx, request_t *request, fr_value_box_list_t *args) |
Allows a request to dynamically alter its own lifetime. | |
void | unlang_interpet_frame_discard (request_t *request) |
Discard the bottom most frame on the request's stack. | |
rlm_rcode_t | unlang_interpret (request_t *request, bool running) |
Run the interpreter for a current request. | |
fr_event_list_t * | unlang_interpret_event_list (request_t *request) |
Get the event list for the current interpreter. | |
TALLOC_CTX * | unlang_interpret_frame_talloc_ctx (request_t *request) |
Get a talloc_ctx which is valid only for this frame. | |
unlang_interpret_t * | unlang_interpret_get (request_t *request) |
Get the interpreter set for a request. | |
unlang_interpret_t * | unlang_interpret_get_thread_default (void) |
Get the default interpreter for this thread. | |
unlang_interpret_t * | unlang_interpret_init (TALLOC_CTX *ctx, fr_event_list_t *el, unlang_request_func_t *funcs, void *uctx) |
Initialize a unlang compiler / interpret. | |
int | unlang_interpret_init_global (TALLOC_CTX *ctx) |
bool | unlang_interpret_is_resumable (request_t *request) |
Check if a request as resumable. | |
void | unlang_interpret_mark_runnable (request_t *request) |
Mark a request as resumable. | |
unlang_mod_action_t | unlang_interpret_priority (request_t *request) |
Get the last instruction priority OR the last frame that was popped. | |
int | unlang_interpret_push (unlang_result_t *result_p, request_t *request, unlang_t const *instruction, unlang_frame_conf_t const *conf, bool do_next_sibling) |
Push a new frame onto the stack. | |
unlang_action_t | unlang_interpret_push_children (unlang_result_t *p_result, request_t *request, rlm_rcode_t default_rcode, bool do_next_sibling) |
Push the children of the current frame onto a new frame onto the stack. | |
int | unlang_interpret_push_instruction (unlang_result_t *p_result, request_t *request, void *instruction, unlang_frame_conf_t const *conf) |
Push an instruction onto the request stack for later interpretation. | |
int | unlang_interpret_push_section (unlang_result_t *p_result, request_t *request, CONF_SECTION *cs, unlang_frame_conf_t const *conf) |
Push a configuration section onto the request stack for later interpretation. | |
rlm_rcode_t | unlang_interpret_rcode (request_t *request) |
Get the last instruction result OR the last frame that was popped. | |
static void | unlang_interpret_request_detach (request_t *request) |
Tell the interpreter to detach the request. | |
void | unlang_interpret_request_done (request_t *request) |
Indicate to the caller of the interpreter that this request is complete. | |
void | unlang_interpret_request_prioritise (request_t *request, uint32_t priority) |
unlang_result_t * | unlang_interpret_result (request_t *request) |
Get the last instruction result OR the last frame that was popped. | |
void | unlang_interpret_set (request_t *request, unlang_interpret_t *intp) |
Set a specific interpreter for a request. | |
void | unlang_interpret_set_thread_default (unlang_interpret_t *intp) |
Set the default interpreter for this thread. | |
int | unlang_interpret_set_timeout (request_t *request, fr_time_delta_t timeout) |
Set a timeout for a request. | |
void | unlang_interpret_signal (request_t *request, fr_signal_t action) |
Send a signal (usually stop) to a request. | |
void * | unlang_interpret_stack_alloc (TALLOC_CTX *ctx) |
Allocate a new unlang stack. | |
int | unlang_interpret_stack_depth (request_t *request) |
Return the depth of the request's stack. | |
static xlat_action_t | unlang_interpret_xlat (TALLOC_CTX *ctx, fr_dcursor_t *out, UNUSED xlat_ctx_t const *xctx, request_t *request, fr_value_box_list_t *in) |
Get information about the interpreter state. | |
bool | unlang_request_is_cancelled (request_t const *request) |
Return whether a request has been cancelled. | |
bool | unlang_request_is_done (request_t const *request) |
Return whether a request has been marked done. | |
bool | unlang_request_is_scheduled (request_t const *request) |
Return whether a request is currently scheduled. | |
void | unlang_stack_signal (request_t *request, fr_signal_t action, int limit) |
Delivers a frame to one or more frames in the stack. | |
Variables | |
static unlang_group_t | empty_group |
static _Thread_local unlang_interpret_t * | intp_thread_default |
The default interpreter instance for this thread. | |
static fr_table_num_ordered_t const | result_p_location_table [] |
static size_t | result_p_location_table_len = NUM_ELEMENTS(result_p_location_table) |
static fr_table_num_ordered_t const | unlang_action_table [] |
static size_t | unlang_action_table_len = NUM_ELEMENTS(unlang_action_table) |
static xlat_arg_parser_t const | unlang_cancel_xlat_args [] |
static fr_table_num_ordered_t const | unlang_frame_action_table [] |
static size_t | unlang_frame_action_table_len = NUM_ELEMENTS(unlang_frame_action_table) |
static xlat_arg_parser_t const | unlang_interpret_xlat_args [] |
Execute compiled unlang structures using an iterative interpret.
Definition in file interpret.c.
struct unlang_variable_ref_t |
Definition at line 348 of file interpret.c.
Data Fields | ||
---|---|---|
fr_dict_t const * | old_dict | the previous dictionary for the request |
request_t * | request | the request |
#define DUMP_STACK if (DEBUG_ENABLED5) stack_dump(request) |
Definition at line 259 of file interpret.c.
enum result_p_location_t |
Enumerator | |
---|---|
RESULT_P_LOCATION_UNKNOWN | |
RESULT_P_LOCATION_FRAME | |
RESULT_P_LOCATION_SCRATCH | |
RESULT_P_LOCATION_STATE | |
RESULT_P_LOCATION_MODULE_RCTX | |
RESULT_P_LOCATION_FUNCTION_RCTX |
Definition at line 64 of file interpret.c.
|
static |
Definition at line 353 of file interpret.c.
Definition at line 161 of file interpret.c.
|
static |
Try and figure out where result_p points to.
If it's somewhere other than these three locations, it's probably wrong.
Definition at line 77 of file interpret.c.
|
static |
Definition at line 179 of file interpret.c.
|
inlinestatic |
Evaluates all the unlang nodes in a section.
This function interprets a list of unlang instructions at a given level using the same stack frame, and pushes additional frames onto the stack as needed.
This function can be seen as moving horizontally.
[in] | request | The current request. |
[in] | frame | The current stack frame. |
Definition at line 727 of file interpret.c.
|
inlinestatic |
|
static |
Definition at line 1469 of file interpret.c.
|
static |
Definition at line 1485 of file interpret.c.
|
inlinestatic |
Update the current result after each instruction, and after popping each stack frame.
[in] | request | The current request. |
Definition at line 453 of file interpret.c.
|
inlinestatic |
Function called to merge inter-stack-frame results.
This function is called whenever a frame is popped from the stack.
'result' is the result from the frame being popped, and 'frame' is the next highest frame in the stack.
The logic here is very similar to result_eval(), with two important differences:
Definition at line 656 of file interpret.c.
void stack_dump | ( | request_t * | request | ) |
Definition at line 235 of file interpret.c.
void stack_dump_with_actions | ( | request_t * | request | ) |
|
static |
Signal the request to stop executing.
The request can't be running at this point because we're in the event loop. This means the request is always in a consistent state when the timeout event fires, even if that's state is waiting on I/O.
Definition at line 1691 of file interpret.c.
|
static |
Allows a request to dynamically alter its own lifetime.
cancel(<timeout>)
If timeout is 0, then the request is immediately cancelled.
Definition at line 1711 of file interpret.c.
void unlang_interpet_frame_discard | ( | request_t * | request | ) |
Discard the bottom most frame on the request's stack.
This is used for cleaning up after errors. i.e. the caller uses a push function, and experiences an error and needs to remove the frame that was just pushed.
Definition at line 1986 of file interpret.c.
rlm_rcode_t unlang_interpret | ( | request_t * | request, |
bool | running | ||
) |
Run the interpreter for a current request.
This function runs the interpreter for a request. It deals with popping stack frames, and calaculating the final result for the frame.
[in] | request | to run. If this is an internal request the request may be freed by the interpreter. |
[in] | running | Is the interpreter already running. |
Definition at line 941 of file interpret.c.
fr_event_list_t * unlang_interpret_event_list | ( | request_t * | request | ) |
Get the event list for the current interpreter.
Definition at line 2013 of file interpret.c.
TALLOC_CTX * unlang_interpret_frame_talloc_ctx | ( | request_t * | request | ) |
Get a talloc_ctx which is valid only for this frame.
[in] | request | The current request. |
Definition at line 1661 of file interpret.c.
unlang_interpret_t * unlang_interpret_get | ( | request_t * | request | ) |
Get the interpreter set for a request.
Definition at line 2003 of file interpret.c.
unlang_interpret_t * unlang_interpret_get_thread_default | ( | void | ) |
Get the default interpreter for this thread.
This allows detached requests to be executed asynchronously
Definition at line 2036 of file interpret.c.
unlang_interpret_t * unlang_interpret_init | ( | TALLOC_CTX * | ctx, |
fr_event_list_t * | el, | ||
unlang_request_func_t * | funcs, | ||
void * | uctx | ||
) |
Initialize a unlang compiler / interpret.
[in] | ctx | to bind lifetime of the interpret to. Shouldn't be any free order issues here as the interpret itself has no state. But event loop should be stopped before freeing the interpret. |
[in] | el | for any timer or I/O events. |
[in] | funcs | Callbacks to used to communicate request state to our owner. |
[in] | uctx | Data to pass to callbacks. |
Definition at line 1953 of file interpret.c.
int unlang_interpret_init_global | ( | TALLOC_CTX * | ctx | ) |
Definition at line 2043 of file interpret.c.
Check if a request as resumable.
[in] | request | The current request. |
Definition at line 1598 of file interpret.c.
void unlang_interpret_mark_runnable | ( | request_t * | request | ) |
Mark a request as resumable.
It's not called "unlang_interpret", because it doesn't actually resume the request, it just schedules it for resumption.
[in] | request | The current request. |
Definition at line 1616 of file interpret.c.
unlang_mod_action_t unlang_interpret_priority | ( | request_t * | request | ) |
Get the last instruction priority OR the last frame that was popped.
[in] | request | The current request. |
Definition at line 1551 of file interpret.c.
int unlang_interpret_push | ( | unlang_result_t * | result_p, |
request_t * | request, | ||
unlang_t const * | instruction, | ||
unlang_frame_conf_t const * | conf, | ||
bool | do_next_sibling | ||
) |
Push a new frame onto the stack.
[in] | result_p | Where to write the result of evaluating the section. If NULL, results will be written to frame->section_result and will be automatically merged with the next highest frame when this one is popped. |
[in] | request | to push the frame onto. |
[in] | instruction | One or more unlang_t nodes describing the operations to execute. |
[in] | conf | Configuration for the frame. If NULL, the following values areused:
|
[in] | do_next_sibling | Whether to only execute the first node in the unlang_t program or to execute subsequent nodes. |
Definition at line 283 of file interpret.c.
unlang_action_t unlang_interpret_push_children | ( | unlang_result_t * | p_result, |
request_t * | request, | ||
rlm_rcode_t | default_rcode, | ||
bool | do_next_sibling | ||
) |
Push the children of the current frame onto a new frame onto the stack.
[out] | p_result | set to RLM_MOULDE_FAIL if pushing the children fails |
[in] | request | to push the frame onto. |
[in] | default_rcode | The default result. |
[in] | do_next_sibling | Whether to only execute the first node in the unlang_t program or to execute subsequent nodes. |
Definition at line 389 of file interpret.c.
int unlang_interpret_push_instruction | ( | unlang_result_t * | p_result, |
request_t * | request, | ||
void * | instruction, | ||
unlang_frame_conf_t const * | conf | ||
) |
Push an instruction onto the request stack for later interpretation.
Definition at line 1166 of file interpret.c.
int unlang_interpret_push_section | ( | unlang_result_t * | p_result, |
request_t * | request, | ||
CONF_SECTION * | cs, | ||
unlang_frame_conf_t const * | conf | ||
) |
Push a configuration section onto the request stack for later interpretation.
Definition at line 1143 of file interpret.c.
rlm_rcode_t unlang_interpret_rcode | ( | request_t * | request | ) |
Get the last instruction result OR the last frame that was popped.
[in] | request | The current request. |
Definition at line 1541 of file interpret.c.
|
inlinestatic |
Tell the interpreter to detach the request.
This function should not be called directly use unlang_interpret_signal(request, FR_SIGNAL_DETACH) instead. This will ensure all frames on the request's stack receive the detach signal.
Definition at line 1286 of file interpret.c.
void unlang_interpret_request_done | ( | request_t * | request | ) |
Indicate to the caller of the interpreter that this request is complete.
Definition at line 1255 of file interpret.c.
unlang_result_t * unlang_interpret_result | ( | request_t * | request | ) |
Get the last instruction result OR the last frame that was popped.
[in] | request | The current request. |
Definition at line 1561 of file interpret.c.
void unlang_interpret_set | ( | request_t * | request, |
unlang_interpret_t * | intp | ||
) |
Set a specific interpreter for a request.
Definition at line 1994 of file interpret.c.
void unlang_interpret_set_thread_default | ( | unlang_interpret_t * | intp | ) |
Set the default interpreter for this thread.
Definition at line 2025 of file interpret.c.
int unlang_interpret_set_timeout | ( | request_t * | request, |
fr_time_delta_t | timeout | ||
) |
Set a timeout for a request.
The timeout is associated with the current stack frame.
Definition at line 1504 of file interpret.c.
void unlang_interpret_signal | ( | request_t * | request, |
fr_signal_t | action | ||
) |
Send a signal (usually stop) to a request.
This is typically called via an "async" action, i.e. an action outside of the normal processing of the request.
[in] | request | The current request. |
[in] | action | to signal. |
Definition at line 1396 of file interpret.c.
void * unlang_interpret_stack_alloc | ( | TALLOC_CTX * | ctx | ) |
Allocate a new unlang stack.
[in] | ctx | to allocate stack in. |
Definition at line 1194 of file interpret.c.
int unlang_interpret_stack_depth | ( | request_t * | request | ) |
Return the depth of the request's stack.
Definition at line 1529 of file interpret.c.
Return whether a request has been cancelled.
Definition at line 1579 of file interpret.c.
Return whether a request has been marked done.
Definition at line 1586 of file interpret.c.
Return whether a request is currently scheduled.
Definition at line 1569 of file interpret.c.
void unlang_stack_signal | ( | request_t * | request, |
fr_signal_t | action, | ||
int | limit | ||
) |
Delivers a frame to one or more frames in the stack.
This is typically called via an "async" action, i.e. an action outside of the normal processing of the request.
For FR_SIGNAL_CANCEL all frames are marked up for cancellation, but the cancellation is handled by the interpret.
Other signal types are delivered immediately, inrrespecitve of whether the request is currently being processed or not.
Signaling stops at the "limit" frame. This is so that keywords such as "timeout" and "limit" can signal frames lower than theirs to stop, but then continue with their own work.
[in] | request | The current request. |
[in] | action | to signal. |
[in] | limit | the frame at which to stop signaling. |
Definition at line 1336 of file interpret.c.
|
static |
Definition at line 1119 of file interpret.c.
|
static |
The default interpreter instance for this thread.
Definition at line 43 of file interpret.c.
|
static |
Definition at line 137 of file interpret.c.
|
static |
Definition at line 144 of file interpret.c.
|
static |
Definition at line 45 of file interpret.c.
|
static |
Definition at line 52 of file interpret.c.
|
static |
Definition at line 1676 of file interpret.c.
|
static |
Definition at line 54 of file interpret.c.
|
static |
Definition at line 59 of file interpret.c.
|
static |
Definition at line 1785 of file interpret.c.