From: Alan T. DeKok Date: Thu, 11 Mar 2021 15:43:38 +0000 (-0500) Subject: move DHCPv6 to using new process / listen API X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6207cdd05e07f6f708dc1ed56563c1c583bb9ef5;p=thirdparty%2Ffreeradius-server.git move DHCPv6 to using new process / listen API --- diff --git a/src/listen/dhcpv6/proto_dhcpv6.c b/src/listen/dhcpv6/proto_dhcpv6.c index ba502956ea8..4cbf103389d 100644 --- a/src/listen/dhcpv6/proto_dhcpv6.c +++ b/src/listen/dhcpv6/proto_dhcpv6.c @@ -78,7 +78,7 @@ static CONF_PARSER const limit_config[] = { */ static CONF_PARSER const proto_dhcpv6_config[] = { { FR_CONF_OFFSET("type", FR_TYPE_VOID | FR_TYPE_MULTI | FR_TYPE_NOT_EMPTY, proto_dhcpv6_t, - type_submodule), .func = type_parse }, + allowed_types), .func = type_parse }, { FR_CONF_OFFSET("transport", FR_TYPE_VOID, proto_dhcpv6_t, io.submodule), .func = transport_parse }, @@ -116,24 +116,27 @@ fr_dict_attr_autoload_t proto_dhcpv6_dict_attr[] = { * - 0 on success. * - -1 on failure. */ -static int type_parse(TALLOC_CTX *ctx, void *out, void *parent, +static int type_parse(UNUSED TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, UNUSED CONF_PARSER const *rule) { - static char const *type_lib_table[FR_DHCPV6_MAX_CODE] = { - [FR_DHCPV6_SOLICIT] = "process", - [FR_DHCPV6_REQUEST] = "process", - [FR_DHCPV6_RENEW] = "process", - [FR_DHCPV6_REBIND] = "process", - [FR_DHCPV6_RELEASE] = "process", - [FR_DHCPV6_DECLINE] = "process", - [FR_DHCPV6_INFORMATION_REQUEST] = "process", - [FR_DHCPV6_RELAY_FORWARD] = "process" - }; proto_dhcpv6_t *inst = talloc_get_type_abort(parent, proto_dhcpv6_t); + fr_dict_enum_t *dv; + CONF_PAIR *cp; + char const *value; - return fr_app_process_type_parse(ctx, out, ci, attr_packet_type, "proto_dhcpv6", - type_lib_table, NUM_ELEMENTS(type_lib_table), - inst->type_submodule_by_code, NUM_ELEMENTS(inst->type_submodule_by_code)); + cp = cf_item_to_pair(ci); + value = cf_pair_value(cp); + + dv = fr_dict_enum_by_name(attr_packet_type, value, -1); + if (!dv || (dv->value->vb_uint32 >= FR_DHCPV6_MAX_CODE)) { + cf_log_err(ci, "Unknown DHCPv4 packet type '%s'", value); + return -1; + } + + inst->allowed[dv->value->vb_uint32] = true; + *((char const **) out) = value; + + return 0; } /** Wrapper around dl_instance @@ -338,38 +341,11 @@ static ssize_t mod_encode(void const *instance, request_t *request, uint8_t *buf return data_len; } -static void mod_entry_point_set(void const *instance, request_t *request) +static void mod_entry_point_set(UNUSED void const *instance, request_t *request) { - proto_dhcpv6_t const *inst = talloc_get_type_abort_const(instance, proto_dhcpv6_t); - dl_module_inst_t *type_submodule; - fr_io_track_t *track = request->async->packet_ctx; - - fr_assert(request->packet->code != 0); - fr_assert(request->packet->code < FR_DHCPV6_MAX_CODE); - - request->server_cs = inst->io.server_cs; - - /* - * 'track' can be NULL when there's no network listener. - */ - if (inst->io.app_io && (track->dynamic == request->async->recv_time)) { - fr_app_worker_t const *app_process; - - app_process = (fr_app_worker_t const *) inst->io.dynamic_submodule->module->common; - - request->async->process = app_process->entry_point; - track->dynamic = 0; - return; - } - - type_submodule = inst->type_submodule_by_code[request->packet->code]; - if (!type_submodule) { - REDEBUG("The server is not configured to accept 'type = %s'", fr_dhcpv6_packet_types[request->packet->code]); - return; - } + fr_assert(request->server_cs != NULL); - request->async->process = ((fr_app_worker_t const *)type_submodule->module->common)->entry_point; - request->async->process_inst = type_submodule->data; + virtual_server_entry_point_set(request); } static int mod_priority_set(void const *instance, uint8_t const *buffer, UNUSED size_t buflen) @@ -384,7 +360,7 @@ static int mod_priority_set(void const *instance, uint8_t const *buffer, UNUSED */ if (!inst->priorities[buffer[0]]) return 0; - if (!inst->type_submodule_by_code[buffer[0]]) return -1; + if (!inst->allowed[buffer[0]]) return -1; /* * @todo - if we cared, we could also return -1 for "this diff --git a/src/listen/dhcpv6/proto_dhcpv6.h b/src/listen/dhcpv6/proto_dhcpv6.h index d0b7151ed6f..cb7bab07eab 100644 --- a/src/listen/dhcpv6/proto_dhcpv6.h +++ b/src/listen/dhcpv6/proto_dhcpv6.h @@ -32,8 +32,8 @@ typedef struct { fr_io_instance_t io; //!< wrapper for IO abstraction - dl_module_inst_t **type_submodule; //!< Instance of the various types - dl_module_inst_t *type_submodule_by_code[FR_DHCPV6_MAX_CODE]; //!< Lookup process entry point by code. + char **allowed_types; //!< names for for 'type = ...' + bool allowed[FR_DHCPV6_MAX_CODE]; //!< indexed by value uint32_t max_packet_size; //!< for message ring buffer. uint32_t num_messages; //!< for message ring buffer. diff --git a/src/process/dhcpv6/all.mk b/src/process/dhcpv6/all.mk index d8fd6e835fc..239d7da111a 100644 --- a/src/process/dhcpv6/all.mk +++ b/src/process/dhcpv6/all.mk @@ -1 +1,9 @@ -SUBMAKEFILES := proto_dhcpv6_process.mk +TARGETNAME := process_dhcpv6 + +ifneq "$(TARGETNAME)" "" +TARGET := $(TARGETNAME).a +endif + +SOURCES := base.c + +TGT_PREREQS := libfreeradius-util.a libfreeradius-dhcpv6.a diff --git a/src/process/dhcpv6/proto_dhcpv6_process.c b/src/process/dhcpv6/base.c similarity index 96% rename from src/process/dhcpv6/proto_dhcpv6_process.c rename to src/process/dhcpv6/base.c index bd660dd8582..0fdc0f9aa68 100644 --- a/src/process/dhcpv6/proto_dhcpv6_process.c +++ b/src/process/dhcpv6/base.c @@ -16,16 +16,16 @@ /** * $Id$ - * @file proto_dhcpv6/proto_dhcpv6_process.c + * @file src/process/dhcpv6/base.c * @brief Base DHCPV6 processing. * * @copyright 2020 Network RADIUS SARL */ -#define LOG_PREFIX "proto_dhcpv6 - " +#define LOG_PREFIX "process_dhcpv6 - " #include #include -#include +#include #include #include #include @@ -38,8 +38,8 @@ static fr_dict_t const *dict_dhcpv6; -extern fr_dict_autoload_t proto_dhcpv6_process_dict[]; -fr_dict_autoload_t proto_dhcpv6_process_dict[] = { +extern fr_dict_autoload_t process_dhcpv6_dict[]; +fr_dict_autoload_t process_dhcpv6_dict[] = { { .out = &dict_dhcpv6, .proto = "dhcpv6" }, { NULL } }; @@ -52,8 +52,8 @@ static fr_dict_attr_t const *attr_relay_link_address; static fr_dict_attr_t const *attr_relay_peer_address; static fr_dict_attr_t const *attr_transaction_id; -extern fr_dict_attr_autoload_t proto_dhcpv6_process_dict_attr[]; -fr_dict_attr_autoload_t proto_dhcpv6_process_dict_attr[] = { +extern fr_dict_attr_autoload_t process_dhcpv6_dict_attr[]; +fr_dict_attr_autoload_t process_dhcpv6_dict_attr[] = { { .out = &attr_client_id, .name = "Client-ID", .type = FR_TYPE_STRUCT, .dict = &dict_dhcpv6 }, { .out = &attr_hop_count, .name = "Hop-Count", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv6 }, { .out = &attr_interface_id, .name = "Interface-ID", .type = FR_TYPE_OCTETS, .dict = &dict_dhcpv6 }, @@ -412,10 +412,11 @@ static const virtual_server_compile_t compile_list[] = { }; -extern fr_app_worker_t proto_dhcpv6_process; -fr_app_worker_t proto_dhcpv6_process = { +extern fr_process_module_t process_dhcpv6; +fr_process_module_t process_dhcpv6 = { .magic = RLM_MODULE_INIT, - .name = "dhcpv6_process", - .entry_point = mod_process, + .name = "process_dhcpv6", + .process = mod_process, .compile_list = compile_list, + .dict = &dict_dhcpv6, }; diff --git a/src/process/dhcpv6/proto_dhcpv6_process.mk b/src/process/dhcpv6/proto_dhcpv6_process.mk deleted file mode 100644 index 740179158bd..00000000000 --- a/src/process/dhcpv6/proto_dhcpv6_process.mk +++ /dev/null @@ -1,9 +0,0 @@ -TARGETNAME := proto_dhcpv6_process - -ifneq "$(TARGETNAME)" "" -TARGET := $(TARGETNAME).a -endif - -SOURCES := proto_dhcpv6_process.c - -TGT_PREREQS := libfreeradius-util.a libfreeradius-radius.a libfreeradius-dhcpv6.a