]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
move DHCPv6 to using new process / listen API
authorAlan T. DeKok <aland@freeradius.org>
Thu, 11 Mar 2021 15:43:38 +0000 (10:43 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 11 Mar 2021 17:21:02 +0000 (12:21 -0500)
src/listen/dhcpv6/proto_dhcpv6.c
src/listen/dhcpv6/proto_dhcpv6.h
src/process/dhcpv6/all.mk
src/process/dhcpv6/base.c [moved from src/process/dhcpv6/proto_dhcpv6_process.c with 96% similarity]
src/process/dhcpv6/proto_dhcpv6_process.mk [deleted file]

index ba502956ea8e1813de65554148e4b7fbbec518e4..4cbf103389db4d0b0e173223d78a23f308ca62dd 100644 (file)
@@ -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
index d0b7151ed6f1189ce5f64ab54edbc10d0cf1b525..cb7bab07eab56c947d3797eefbcd24320df3d4d9 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_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.
index d8fd6e835fcc8ca49c1e652c56bf4c36658f774e..239d7da111a4bc6a84f640e5a1a5969ad1dfab96 100644 (file)
@@ -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
similarity index 96%
rename from src/process/dhcpv6/proto_dhcpv6_process.c
rename to src/process/dhcpv6/base.c
index bd660dd8582df139c31e06af446437c1ab1db71f..0fdc0f9aa68be987d191d1b02b9baab88c850adf 100644 (file)
 
 /**
  * $Id$
- * @file proto_dhcpv6/proto_dhcpv6_process.c
+ * @file src/process/dhcpv6/base.c
  * @brief Base DHCPV6 processing.
  *
  * @copyright 2020 Network RADIUS SARL <legal@networkradius.com>
  */
-#define LOG_PREFIX "proto_dhcpv6 - "
+#define LOG_PREFIX "process_dhcpv6 - "
 
 #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>
@@ -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 (file)
index 7401791..0000000
+++ /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