Skip to content

Commit

Permalink
compile correct method, based on packets we receive
Browse files Browse the repository at this point in the history
  • Loading branch information
alandekok committed Nov 10, 2017
1 parent a3d380a commit 1d7274c
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 5 deletions.
27 changes: 26 additions & 1 deletion src/modules/proto_detail/proto_detail.c
Expand Up @@ -87,6 +87,8 @@ static int type_parse(TALLOC_CTX *ctx, void *out, CONF_ITEM *ci, UNUSED CONF_PAR
fr_dict_attr_t const *da;
fr_dict_enum_t const *type_enum;
uint32_t code;
dl_instance_t *process_dl;
proto_detail_process_t *process_inst;

rad_assert(listen_cs && (strcmp(cf_section_name1(listen_cs), "listen") == 0));

Expand Down Expand Up @@ -125,7 +127,30 @@ static int type_parse(TALLOC_CTX *ctx, void *out, CONF_ITEM *ci, UNUSED CONF_PAR
/*
* Parent dl_instance_t added in virtual_servers.c (listen_parse)
*/
return dl_instance(ctx, out, listen_cs, parent_inst, "process", DL_TYPE_SUBMODULE);
if (dl_instance(ctx, out, listen_cs, parent_inst, "process", DL_TYPE_SUBMODULE) < 0) {
return -1;
}

process_dl = *(dl_instance_t **) out;
process_inst = process_dl->data;

switch (code) {
default:
return -1;

case FR_CODE_ACCOUNTING_REQUEST:
process_inst->recv_type = MOD_PREACCT;
process_inst->send_type = MOD_ACCOUNTING;
break;

case FR_CODE_COA_REQUEST:
case FR_CODE_DISCONNECT_REQUEST:
process_inst->recv_type = MOD_RECV_COA;
process_inst->send_type = MOD_SEND_COA;
break;
}

return 0;
}

/** Wrapper around dl_instance
Expand Down
7 changes: 7 additions & 0 deletions src/modules/proto_detail/proto_detail.h
Expand Up @@ -25,6 +25,8 @@
*/
RCSIDH(detail_h, "$Id$")

#include <freeradius-devel/modules.h>

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -113,6 +115,11 @@ typedef struct proto_detail_work_t {
fr_event_timer_t const *ev; //!< for detail file timers.
} proto_detail_work_t;

typedef struct proto_detail_process_t {
rlm_components_t recv_type;
rlm_components_t send_type;
} proto_detail_process_t;

#ifdef __cplusplus
}
#endif
Expand Down
11 changes: 7 additions & 4 deletions src/modules/proto_detail/proto_detail_process.c
Expand Up @@ -28,6 +28,7 @@
#include <freeradius-devel/dict.h>
#include <freeradius-devel/state.h>
#include <freeradius-devel/rad_assert.h>
#include "proto_detail.h"

static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
{
Expand Down Expand Up @@ -201,28 +202,29 @@ static fr_io_final_t mod_process(REQUEST *request, fr_io_action_t action)
}


static int mod_instantiate(UNUSED void *instance, CONF_SECTION *listen_cs)
static int mod_instantiate(void *instance, CONF_SECTION *listen_cs)
{
int rcode;
CONF_SECTION *server_cs;
proto_detail_process_t *inst = talloc_get_type_abort(instance, proto_detail_process_t);

rad_assert(listen_cs);

server_cs = cf_item_to_section(cf_parent(listen_cs));
rad_assert(strcmp(cf_section_name1(server_cs), "server") == 0);

rcode = unlang_compile_subsection(server_cs, "recv", NULL, MOD_AUTHORIZE);
rcode = unlang_compile_subsection(server_cs, "recv", NULL, inst->recv_type);
if (rcode < 0) return rcode;
if (rcode == 0) {
cf_log_err(server_cs, "Failed finding 'recv { ... }' section of virtual server %s",
cf_section_name2(server_cs));
return -1;
}

rcode = unlang_compile_subsection(server_cs, "send", "ok", MOD_POST_AUTH);
rcode = unlang_compile_subsection(server_cs, "send", "ok", inst->send_type);
if (rcode < 0) return rcode;

rcode = unlang_compile_subsection(server_cs, "send", "fail", MOD_POST_AUTH);
rcode = unlang_compile_subsection(server_cs, "send", "fail", inst->send_type);
if (rcode < 0) return rcode;

return 0;
Expand All @@ -232,6 +234,7 @@ extern fr_app_process_t proto_detail_process;
fr_app_process_t proto_detail_process = {
.magic = RLM_MODULE_INIT,
.name = "detail_process",
.inst_size = sizeof(proto_detail_process_t),
.instantiate = mod_instantiate,
.process = mod_process,
};

0 comments on commit 1d7274c

Please sign in to comment.