]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
move dhcpv4 to using new process / listen API
authorAlan T. DeKok <aland@freeradius.org>
Tue, 2 Mar 2021 13:47:11 +0000 (08:47 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 2 Mar 2021 13:47:11 +0000 (08:47 -0500)
src/listen/dhcpv4/proto_dhcpv4.c
src/listen/dhcpv4/proto_dhcpv4.h
src/process/dhcpv4/all.mk
src/process/dhcpv4/base.c [moved from src/process/dhcpv4/proto_dhcpv4_process.c with 95% similarity]
src/process/dhcpv4/proto_dhcpv4_process.mk [deleted file]

index 6be6029836eeb60bf1fd9fae78e9c81250ae1a7f..92baf28df85f31143a927a690ca3f59bbb47ebc9 100644 (file)
@@ -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
index 3a2e6b279208f2cf5ad70fc25fb6b4ce8848cb3d..9709720557487a0ee6ddf765438d237242617b7b 100644 (file)
@@ -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.
index a2742f55f0c534b0ea61c26448596a1394b7ad4a..d1624e853bc13c8458fc4a14840dae666c4fd6f8 100644 (file)
@@ -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
similarity index 95%
rename from src/process/dhcpv4/proto_dhcpv4_process.c
rename to src/process/dhcpv4/base.c
index 5ada8ce92b9446d698dc469512b14e96e55cb1fd..745eb0a57aabcccae4670e8ac69ce64fcfdd90d4 100644 (file)
 
 /**
  * $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 <freeradius-devel/io/application.h>
 #include <freeradius-devel/server/protocol.h>
-#include <freeradius-devel/server/module.h>
+#include <freeradius-devel/server/process.h>
 #include <freeradius-devel/unlang/base.h>
 #include <freeradius-devel/util/dict.h>
 #include <freeradius-devel/util/debug.h>
@@ -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 (file)
index b421d4f..0000000
+++ /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