From: Alan T. DeKok Date: Tue, 26 Sep 2017 16:08:35 +0000 (-0400) Subject: allow priorities to be configurable X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d41b62e92bc2986b2811176df1feb1607d0d50e1;p=thirdparty%2Ffreeradius-server.git allow priorities to be configurable --- diff --git a/src/modules/proto_radius/proto_radius_udp.c b/src/modules/proto_radius/proto_radius_udp.c index c7ab8a89300..8952160b3fc 100644 --- a/src/modules/proto_radius/proto_radius_udp.c +++ b/src/modules/proto_radius/proto_radius_udp.c @@ -68,6 +68,8 @@ typedef struct { fr_tracking_t *ft; //!< tracking table uint32_t cleanup_delay; //!< cleanup delay for Access-Request packets + + uint32_t priorities[FR_MAX_PACKET_CODE]; //!< priorities for individual packets } proto_radius_udp_t; static const CONF_PARSER udp_listen_config[] = { @@ -86,6 +88,35 @@ static const CONF_PARSER udp_listen_config[] = { CONF_PARSER_TERMINATOR }; + +/* + * Allow configurable priorities for each listener. + */ +static uint32_t priorities[FR_MAX_PACKET_CODE] = { + [FR_CODE_ACCESS_REQUEST] = PRIORITY_HIGH, + [FR_CODE_ACCOUNTING_REQUEST] = PRIORITY_LOW, + [FR_CODE_COA_REQUEST] = PRIORITY_NORMAL, + [FR_CODE_DISCONNECT_REQUEST] = PRIORITY_NORMAL, + [FR_CODE_STATUS_SERVER] = PRIORITY_NOW, +}; + + +static const CONF_PARSER priority_config[] = { + { FR_CONF_OFFSET("Access-Request", FR_TYPE_UINT32, proto_radius_udp_t, priorities[FR_CODE_ACCESS_REQUEST]), + .dflt = STRINGIFY(PRIORITY_HIGH) }, + { FR_CONF_OFFSET("Accounting-Request", FR_TYPE_UINT32, proto_radius_udp_t, priorities[FR_CODE_ACCOUNTING_REQUEST]), + .dflt = STRINGIFY(PRIORITY_LOW) }, + { FR_CONF_OFFSET("CoA-Request", FR_TYPE_UINT32, proto_radius_udp_t, priorities[FR_CODE_COA_REQUEST]), + .dflt = STRINGIFY(PRIORITY_NORMAL) }, + { FR_CONF_OFFSET("Disconnect-Request", FR_TYPE_UINT32, proto_radius_udp_t, priorities[FR_CODE_DISCONNECT_REQUEST]), + .dflt = STRINGIFY(PRIORITY_NORMAL) }, + { FR_CONF_OFFSET("Status-Server", FR_TYPE_UINT32, proto_radius_udp_t, priorities[FR_CODE_STATUS_SERVER]), + .dflt = STRINGIFY(PRIORITY_NOW) }, + + + CONF_PARSER_TERMINATOR +}; + static void mod_cleanup_delay(UNUSED fr_event_list_t *el, UNUSED struct timeval *now, void *uctx) { fr_tracking_entry_t *track = uctx; @@ -172,14 +203,6 @@ static int mod_decode(UNUSED void const *instance, REQUEST *request, UNUSED uint return 0; } -static uint32_t priorities[FR_MAX_PACKET_CODE] = { - [FR_CODE_ACCESS_REQUEST] = PRIORITY_HIGH, - [FR_CODE_ACCOUNTING_REQUEST] = PRIORITY_LOW, - [FR_CODE_COA_REQUEST] = PRIORITY_NORMAL, - [FR_CODE_DISCONNECT_REQUEST] = PRIORITY_NORMAL, - [FR_CODE_STATUS_SERVER] = PRIORITY_NOW, -}; - static ssize_t mod_read(void *instance, void **packet_ctx, fr_time_t **recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority) { proto_radius_udp_t const *inst = talloc_get_type_abort(instance, proto_radius_udp_t); @@ -544,10 +567,11 @@ static int mod_instantiate(void *instance, CONF_SECTION *cs) return 0; } -static int mod_bootstrap(void *instance, UNUSED CONF_SECTION *cs) +static int mod_bootstrap(void *instance, CONF_SECTION *cs) { proto_radius_udp_t *inst = talloc_get_type_abort(instance, proto_radius_udp_t); dl_instance_t const *dl_inst; + CONF_SECTION *subcs; /* * Find the dl_instance_t holding our instance data @@ -559,6 +583,20 @@ static int mod_bootstrap(void *instance, UNUSED CONF_SECTION *cs) inst->parent = talloc_get_type_abort(dl_inst->parent->data, proto_radius_t); + /* + * Hide this for now. It's only for people who know what + * they're doing. + */ + subcs = cf_section_find(cs, "priority", NULL); + if (subcs) { + if (cf_section_rules_push(subcs, priority_config) < 0) return -1; + if (cf_section_parse(NULL, NULL, subcs) < 0) return -1; + + } else { + rad_assert(sizeof(inst->priorities) == sizeof(priorities)); + memcpy(&inst->priorities, &priorities, sizeof(priorities)); + } + return 0; }