/**
* $Id$
*
- * @file include/stats.h
+ * @file include/state.h
* @brief Track overarching 'state' of the authentication session over multiple packets.
*
* @copyright 2014 The FreeRADIUS server project
fr_state_tree_t *fr_state_tree_init(TALLOC_CTX *ctx, uint32_t max_sessions, uint32_t timeout);
-void fr_state_discard(fr_state_tree_t *state, REQUEST *request, RADIUS_PACKET *original);
+void fr_state_discard(fr_state_tree_t *state, REQUEST *request);
-void fr_state_to_request(fr_state_tree_t *state, REQUEST *request, RADIUS_PACKET *packet);
-int fr_request_to_state(fr_state_tree_t *state, REQUEST *request, RADIUS_PACKET *original, RADIUS_PACKET *packet);
+void fr_state_to_request(fr_state_tree_t *state, REQUEST *request);
+int fr_request_to_state(fr_state_tree_t *state, REQUEST *request);
/*
* Stats
/** Called when sending an Access-Accept/Access-Reject to discard state information
*
*/
-void fr_state_discard(fr_state_tree_t *state, REQUEST *request, RADIUS_PACKET *original)
+void fr_state_discard(fr_state_tree_t *state, REQUEST *request)
{
fr_state_entry_t *entry;
PTHREAD_MUTEX_LOCK(&state->mutex);
- entry = state_entry_find(state, request, original);
+ entry = state_entry_find(state, request, request->packet);
if (!entry) {
PTHREAD_MUTEX_UNLOCK(&state->mutex);
return;
*
* @note Called with the mutex free.
*/
-void fr_state_to_request(fr_state_tree_t *state, REQUEST *request, RADIUS_PACKET *packet)
+void fr_state_to_request(fr_state_tree_t *state, REQUEST *request)
{
fr_state_entry_t *entry;
TALLOC_CTX *old_ctx = NULL;
PTHREAD_MUTEX_LOCK(&state->mutex);
- entry = state_entry_find(state, request, packet);
+ entry = state_entry_find(state, request, request->packet);
if (entry) {
(void)talloc_get_type_abort(entry, fr_state_entry_t);
if (entry->thawed) {
*
* Also creates a new state entry.
*/
-int fr_request_to_state(fr_state_tree_t *state, REQUEST *request, RADIUS_PACKET *original, RADIUS_PACKET *packet)
+int fr_request_to_state(fr_state_tree_t *state, REQUEST *request)
{
fr_state_entry_t *entry, *old;
request_data_t *data;
PTHREAD_MUTEX_LOCK(&state->mutex);
- old = original ? state_entry_find(state, request, original) : NULL;
+ old = request->packet ? state_entry_find(state, request, request->packet) : NULL;
- entry = state_entry_create(state, request, packet, old);
+ entry = state_entry_create(state, request, request->reply, old);
if (!entry) {
PTHREAD_MUTEX_UNLOCK(&state->mutex);
RERROR("Creating state entry failed");
/*
* Grab the VPS and data associated with the State attribute.
*/
- if (!request->parent) fr_state_to_request(global_state, request, request->packet);
+ if (!request->parent) fr_state_to_request(global_state, request);
/*
* Push the conf section into the unlang stack.
/*
* We can't create a valid response
*/
- if (fr_request_to_state(global_state, request, request->packet, request->reply) < 0) {
+ if (fr_request_to_state(global_state, request) < 0) {
request->reply->code = FR_CODE_DO_NOT_RESPOND;
return FR_IO_REPLY;
}
} else {
- fr_state_discard(global_state, request, request->packet);
+ fr_state_discard(global_state, request);
}
}
/* FIXME only for seq_id greater than 1 */
if (tacacs_type(request->packet) == TAC_PLUS_AUTHEN) {
state_add(request, request->packet);
- fr_state_to_request(global_state, request, request->packet);
+ fr_state_to_request(global_state, request);
}
RDEBUG("Running 'recv %s' from file %s", cf_section_name2(unlang), cf_filename(unlang));
if (request->master_state == REQUEST_STOP_PROCESSING) {
stop_processing:
if (tacacs_type(request->packet) == TAC_PLUS_AUTHEN)
- fr_state_discard(global_state, request, request->packet);
+ fr_state_discard(global_state, request);
goto done;
}
case TAC_PLUS_AUTHEN_STATUS_RESTART:
case TAC_PLUS_AUTHEN_STATUS_ERROR:
case TAC_PLUS_AUTHEN_STATUS_FOLLOW:
- fr_state_discard(global_state, request, request->packet);
+ fr_state_discard(global_state, request);
break;
default:
vp = fr_pair_find_by_da(request->packet->vps,
/* authentication would continue but seq_no cannot continue */
if (vp->vp_uint8 == 253) {
RWARN("Sequence number would wrap, restarting authentication");
- fr_state_discard(global_state, request, request->packet);
+ fr_state_discard(global_state, request);
fr_pair_list_free(&request->reply->vps);
MEM(pair_update_reply(&vp, attr_tacacs_authentication_status) >= 0);
} else {
state_add(request, request->reply);
request->reply->code = 1; /* FIXME: util.c:request_verify() */
- fr_request_to_state(global_state, request,
- request->packet, request->reply);
+ fr_request_to_state(global_state, request);
}
}
} else {
- fr_state_discard(global_state, request, request->packet);
+ fr_state_discard(global_state, request);
}
}