*/
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 },
* - 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
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)
*/
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
/**
* $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>
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 }
};
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 },
};
-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,
};