From: Alan T. DeKok Date: Tue, 2 Mar 2021 13:47:11 +0000 (-0500) Subject: move dhcpv4 to using new process / listen API X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=933df9c84d32f2776423f54b828131d609438b93;p=thirdparty%2Ffreeradius-server.git move dhcpv4 to using new process / listen API --- diff --git a/src/listen/dhcpv4/proto_dhcpv4.c b/src/listen/dhcpv4/proto_dhcpv4.c index 6be6029836e..92baf28df85 100644 --- a/src/listen/dhcpv4/proto_dhcpv4.c +++ b/src/listen/dhcpv4/proto_dhcpv4.c @@ -77,7 +77,7 @@ static CONF_PARSER const limit_config[] = { */ static CONF_PARSER const proto_dhcpv4_config[] = { { FR_CONF_OFFSET("type", FR_TYPE_VOID | FR_TYPE_MULTI | FR_TYPE_NOT_EMPTY, proto_dhcpv4_t, - type_submodule), .func = type_parse }, + allowed_types), .func = type_parse }, { FR_CONF_OFFSET("transport", FR_TYPE_VOID, proto_dhcpv4_t, io.submodule), .func = transport_parse }, @@ -116,25 +116,27 @@ fr_dict_attr_autoload_t proto_dhcpv4_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_DHCP_DISCOVER] = "process", - [FR_DHCP_OFFER] = "process", - [FR_DHCP_REQUEST] = "process", - [FR_DHCP_DECLINE] = "process", - [FR_DHCP_ACK] = "process", - [FR_DHCP_NAK] = "process", - [FR_DHCP_RELEASE] = "process", - [FR_DHCP_INFORM] = "process", - [FR_DHCP_LEASE_QUERY] = "process", - }; proto_dhcpv4_t *inst = talloc_get_type_abort(parent, proto_dhcpv4_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_dhcpv4", - 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_DHCP_MAX)) { + 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 @@ -334,38 +336,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_dhcpv4_t const *inst = talloc_get_type_abort_const(instance, proto_dhcpv4_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_DHCP_MAX); - - 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'", dhcp_message_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); } @@ -387,7 +362,7 @@ static int mod_priority_set(void const *instance, uint8_t const *buffer, size_t */ if (!inst->priorities[code[2]]) return 0; - if (!inst->type_submodule_by_code[code[2]]) return -1; + if (!inst->allowed[code[2]]) return -1; /* * @todo - if we cared, we could also return -1 for "this diff --git a/src/listen/dhcpv4/proto_dhcpv4.h b/src/listen/dhcpv4/proto_dhcpv4.h index 3a2e6b27920..97097205574 100644 --- a/src/listen/dhcpv4/proto_dhcpv4.h +++ b/src/listen/dhcpv4/proto_dhcpv4.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_DHCP_MAX]; //!< Lookup process entry point by code. + char **allowed_types; //!< names for for 'type = ...' + bool allowed[FR_DHCP_MAX]; //!< 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/dhcpv4/all.mk b/src/process/dhcpv4/all.mk index a2742f55f0c..d1624e853bc 100644 --- a/src/process/dhcpv4/all.mk +++ b/src/process/dhcpv4/all.mk @@ -1 +1,9 @@ -SUBMAKEFILES := proto_dhcpv4_process.mk +TARGETNAME := process_dhcpv4 + +ifneq "$(TARGETNAME)" "" +TARGET := $(TARGETNAME).a +endif + +SOURCES := base.c + +TGT_PREREQS := libfreeradius-util.a libfreeradius-dhcpv4.a diff --git a/src/process/dhcpv4/proto_dhcpv4_process.c b/src/process/dhcpv4/base.c similarity index 95% rename from src/process/dhcpv4/proto_dhcpv4_process.c rename to src/process/dhcpv4/base.c index 5ada8ce92b9..745eb0a57aa 100644 --- a/src/process/dhcpv4/proto_dhcpv4_process.c +++ b/src/process/dhcpv4/base.c @@ -16,17 +16,17 @@ /** * $Id$ - * @file proto_dhcpv4/proto_dhcpv4_process.c + * @file src/process/dhcpv4/base.c * @brief Base DORA, etc. DHCPV4 processing. * * @copyright 2018 The Freeradius server project. * @copyright 2018 Alan DeKok (aland@deployingradius.com) */ -#define LOG_PREFIX "proto_dhcpv4 - " +#define LOG_PREFIX "process_dhcpv4 - " #include #include -#include +#include #include #include #include @@ -35,8 +35,8 @@ static fr_dict_t const *dict_dhcpv4; -extern fr_dict_autoload_t proto_dhcpv4_process_dict[]; -fr_dict_autoload_t proto_dhcpv4_process_dict[] = { +extern fr_dict_autoload_t process_dhcpv4_dict[]; +fr_dict_autoload_t process_dhcpv4_dict[] = { { .out = &dict_dhcpv4, .proto = "dhcpv4" }, { NULL } }; @@ -44,8 +44,8 @@ fr_dict_autoload_t proto_dhcpv4_process_dict[] = { static fr_dict_attr_t const *attr_message_type; static fr_dict_attr_t const *attr_yiaddr; -extern fr_dict_attr_autoload_t proto_dhcpv4_process_dict_attr[]; -fr_dict_attr_autoload_t proto_dhcpv4_process_dict_attr[] = { +extern fr_dict_attr_autoload_t process_dhcpv4_dict_attr[]; +fr_dict_attr_autoload_t process_dhcpv4_dict_attr[] = { { .out = &attr_message_type, .name = "Message-Type", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4}, { .out = &attr_yiaddr, .name = "Your-IP-Address", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4}, { NULL } @@ -410,10 +410,11 @@ static const virtual_server_compile_t compile_list[] = { }; -extern fr_app_worker_t proto_dhcpv4_process; -fr_app_worker_t proto_dhcpv4_process = { +extern fr_process_module_t process_dhcpv4; +fr_process_module_t process_dhcpv4 = { .magic = RLM_MODULE_INIT, - .name = "dhcpv4_process", - .entry_point = mod_process, + .name = "process_dhcpv4", + .process = mod_process, .compile_list = compile_list, + .dict = &dict_dhcpv4, }; diff --git a/src/process/dhcpv4/proto_dhcpv4_process.mk b/src/process/dhcpv4/proto_dhcpv4_process.mk deleted file mode 100644 index b421d4f82cc..00000000000 --- a/src/process/dhcpv4/proto_dhcpv4_process.mk +++ /dev/null @@ -1,9 +0,0 @@ -TARGETNAME := proto_dhcpv4_process - -ifneq "$(TARGETNAME)" "" -TARGET := $(TARGETNAME).a -endif - -SOURCES := proto_dhcpv4_process.c - -TGT_PREREQS := libfreeradius-util.a libfreeradius-radius.a libfreeradius-dhcpv4.a