📄 radius_timer.c
字号:
/* radius_timer.c *//* Implementations of RADIUS timer handlers, including checking pending *//* request for retransmission, and checking incoming RADIUS packets. *//* Copyright 1984 - 2000 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history____________________Date Init Change description031102 md Enhancement - moving polling socket read to seperate tasks and replace taskLock/unLock with rwos_radius_data_mutex111501 md Removed excessive log messages111401 md Fixed SPR#70426 - pool packet identifiers per server092701 md Fixed SPR#70639 retransmission of accounting requests with RADIUS_ACCT_DELAY_TIME attribute052301 tk Took out check_delay_retransmit_count. Not only it is redundant, it may cause packet identifier to be freed prematurely.040501 tk Added code to handle request timer for back-up RADIUS server020801 tk Added code in radius_timer_check_socket_event to improve transport rate.012601 tk ifdef all RADIUS MIBs code with __RADIUS_MIB__121900 md Moved radius_timer_check_socket_event out to use seperate timer and added check_delay_retransmit_count()121900 md Merged from visual source safe*/#ifdef __RADIUS_DEBUG__#include <logLib.h> #endif#include "radius.h"#ifdef __RADIUS_MIB__#include "radius_mib_include.h"#endifextern RWOS_MUTEX rwos_radius_data_mutex;static void check_packet_id_reused_timer_per_server (void);static void check_outstanding_radius_request_ages (void);/************************************************************************/void radius_timer (void* p_user){ PARAMETER_NOT_USED (p_user); rwos_mutex_acquire (rwos_radius_data_mutex, WAIT_FOREVER); if (radius.timer_enabled == FALSE) { rwos_mutex_release (rwos_radius_data_mutex); return; } check_packet_id_reused_timer_per_server (); check_outstanding_radius_request_ages (); rwos_mutex_release (rwos_radius_data_mutex);}/***********************************************************************************/static void check_packet_id_reused_timer_per_server (void){ RW_CONTAINER_ITERATOR server_iterator; RADIUS_SERVER* p_server; UINT id_counter; server_iterator = rw_container_create_copy_of_iterator (radius.server_controller.iterator); rw_container_goto_front (server_iterator); while (rw_container_is_at_end (server_iterator) == false) { p_server = rw_container_at (server_iterator); for (id_counter = 0; id_counter <= RADIUS_HIGHEST_PACKET_IDENTIFIER; ++id_counter) { if (p_server->pool_id_config[id_counter].time_before_reused > 0) { --p_server->pool_id_config[id_counter].time_before_reused; if (p_server->pool_id_config[id_counter].time_before_reused == 0) { p_server->pool_id_config[id_counter].packet_pool_id = TRUE; } } } rw_container_next (server_iterator); } rw_container_free_iterator (server_iterator);}/*************************************************************************************/static void check_outstanding_radius_request_ages (){ RW_CONTAINER_ITERATOR request_entry_iterator; RADIUS_REQUEST_ENTRY* p_request_entry; RADIUS_SERVER* p_server; request_entry_iterator = rw_container_create_copy_of_iterator (radius.request_controller.iterator); rw_container_goto_front (request_entry_iterator); while (rw_container_is_at_end (request_entry_iterator) == false) { p_request_entry = rw_container_at (request_entry_iterator); ++p_request_entry->request_time; if (p_request_entry->backup_server == false) { p_server = (RADIUS_SERVER*) rw_container_at ((RW_CONTAINER_ITERATOR) p_request_entry->server_handle); } else /* for handling backup server */ { p_server = (RADIUS_SERVER*) rw_container_at ((RW_CONTAINER_ITERATOR) p_request_entry->backup_server_handle); } /* tk - use '>=' instead of '>' since request_time starts from 0 */ if (p_request_entry->request_time >= p_server->retransmission_interval) { #ifdef __RADIUS_MIB__ semTake (g_sem_radius_mib, WAIT_FOREVER); #endif switch (p_request_entry->packet_header.code) { case RADIUS_ACCESS_REQUEST: ++p_server->statistics.authentication_timeouts; break; case RADIUS_ACCOUNTING_REQUEST: ++p_server->statistics.accounting_timeouts; break; default: /* should not happen! */ break; } #ifdef __RADIUS_MIB__ semGive (g_sem_radius_mib); #endif p_request_entry->request_time = 0; if (resend_radius_packet (p_request_entry) == FAIL) { radius_printf (RADIUS_ALARM_PRINTF, "RADIUS: check_outstanding_radius_request_ages: failed to resend request.\n"); rw_container_remove (request_entry_iterator); if (p_request_entry->sptr_packet != NULL) { buffer_free (p_request_entry->sptr_packet); } if (p_request_entry->p_callbacks != NULL) { buffer_free (p_request_entry->p_callbacks); } table_free (p_request_entry); continue; } } rw_container_next (request_entry_iterator); } rw_container_free_iterator (request_entry_iterator);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -