📄 radius_interface.c
字号:
{ p_server = rw_container_at (server_iterator); if ((p_server->deleted == false) && (p_server->ip_address == ip_address) && (p_server->port == port)) { if (p_server->type == type) { ++p_server->user_count; rwos_mutex_release (rwos_radius_data_mutex); return ((RADIUS_SERVER_HANDLE) server_iterator); /* server_iterator already points to the new server */ } } rw_container_next (server_iterator); } rw_container_free_iterator (server_iterator); radius_printf (RADIUS_ALARM_PRINTF,"RADIUS: radius_find_server_with_specified_parameters: Could not find server of type %d\r\n", (UINT) type); rwos_mutex_release (rwos_radius_data_mutex); return (INVALID_HANDLE);}/*****************************************************************************************/RADIUS_ATTRIBUTE_LIST_HANDLE radius_create_attribute_list(void){ RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) table_malloc (1, sizeof (RADIUS_LIST_CONTROLLER)); p_radius_attribute_list_controller->p_list = rw_list_create (NULL); p_radius_attribute_list_controller->iterator = rw_container_create_iterator (p_radius_attribute_list_controller->p_list); return ((RADIUS_ATTRIBUTE_LIST_HANDLE) p_radius_attribute_list_controller);}/*****************************************************************************************/bool radius_add_attribute_to_list (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle, enum RADIUS_ATTRIBUTE_TYPE attribute_type, UINT value_length, BYTE *bptr_value){ RADIUS_ATTRIBUTE_ENTRY* p_attribute; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; p_attribute = (RADIUS_ATTRIBUTE_ENTRY* ) table_malloc (1, (sizeof (RADIUS_ATTRIBUTE_ENTRY) + value_length)); if (p_attribute == NULL) { return (false); } p_attribute->type = attribute_type; p_attribute->length_of_attribute_value = value_length; memcpy (&p_attribute->value[0], bptr_value, value_length); rw_container_add_back (p_radius_attribute_list_controller->p_list, (RW_CONTAINER_ITEM*) p_attribute); return (true);}/*****************************************************************************************/bool radius_remove_attribute_from_list (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle){ RADIUS_ATTRIBUTE_ENTRY* p_attribute; RW_CONTAINER_ITERATOR attribute_iterator; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; attribute_iterator = p_radius_attribute_list_controller->iterator; p_attribute = rw_container_at (attribute_iterator); rw_container_remove (attribute_iterator); table_free (p_attribute); return (true);}/*****************************************************************************************/bool radius_remove_attribute (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle, enum RADIUS_ATTRIBUTE_TYPE attribute_type){ RADIUS_ATTRIBUTE_ENTRY* p_attribute; RW_CONTAINER_ITERATOR attribute_iterator; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; attribute_iterator = p_radius_attribute_list_controller->iterator; rw_container_goto_front (attribute_iterator); while (rw_container_is_at_end (attribute_iterator) == false) { p_attribute = rw_container_at (attribute_iterator); if (p_attribute->type == attribute_type) { rw_container_remove (attribute_iterator); table_free (p_attribute); return (true); } rw_container_next (attribute_iterator); } return (false);}/*****************************************************************************************/bool radius_delete_attribute_list (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle){ RADIUS_ATTRIBUTE_ENTRY* p_attribute; RW_CONTAINER_ITERATOR attribute_iterator; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; attribute_iterator = p_radius_attribute_list_controller->iterator; rw_container_goto_front (attribute_iterator); while (rw_container_is_at_end (attribute_iterator) == false) { p_attribute = rw_container_at (attribute_iterator); rw_container_remove (attribute_iterator); table_free (p_attribute); } rw_container_free_iterator (attribute_iterator); rw_container_free (p_radius_attribute_list_controller->p_list); table_free (p_radius_attribute_list_controller); return (true);}/*****************************************************************************************/bool radius_attribute_list_goto_first_attribute (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle){ RW_CONTAINER_ITERATOR attribute_iterator; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; attribute_iterator = p_radius_attribute_list_controller->iterator; rw_container_goto_front (attribute_iterator); if (rw_container_is_at_end (attribute_iterator) == true) { return (false); } return (true);}/*****************************************************************************************/bool radius_attribute_list_goto_next_attribute (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle){ RW_CONTAINER_ITERATOR attribute_iterator; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; attribute_iterator = p_radius_attribute_list_controller->iterator; rw_container_next (attribute_iterator); if (rw_container_is_at_end (attribute_iterator) == true) { return (false); } return (true);}/*****************************************************************************************/enum RADIUS_ATTRIBUTE_TYPE radius_attribute_list_get_attribute_type (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle){ RADIUS_ATTRIBUTE_ENTRY* p_attribute; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; p_attribute = rw_container_at (p_radius_attribute_list_controller->iterator); return (p_attribute->type);}/*****************************************************************************************/UINT radius_attribute_list_get_attribute_length (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle){ RADIUS_ATTRIBUTE_ENTRY* p_attribute; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; p_attribute = rw_container_at (p_radius_attribute_list_controller->iterator); return (p_attribute->length_of_attribute_value);}/*****************************************************************************************/bool radius_attribute_list_get_attribute_value (RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle, BYTE* p_buffer, UINT buffer_length){ RADIUS_ATTRIBUTE_ENTRY* p_attribute; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (attribute_list_handle == INVALID_HANDLE) { return (false); } p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; p_attribute = rw_container_at (p_radius_attribute_list_controller->iterator); memcpy (p_buffer, p_attribute->value, buffer_length); return (true);}/*****************************************************************************************/bool radius_server_request (RADIUS_SERVER_HANDLE server_handle, RADIUS_REQUEST_HANDLE radius_request_handle, RADIUS_REQUEST_CALLBACKS *p_callbacks, enum RADIUS_CODE code, RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle){ bool verify_attributes; bool error_callback_called; bool any_server = false; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; if (server_handle == INVALID_HANDLE) { (*p_callbacks->fptr_radius_error_callback) (radius_request_handle, RADIUS_INVALID_SERVER_SPECIFIED); return(false); } rwos_mutex_acquire (rwos_radius_data_mutex, WAIT_FOREVER); error_callback_called = false; p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; verify_attributes = radius_verify_attributes (code, p_radius_attribute_list_controller); if (verify_attributes == false) { radius_printf (RADIUS_ALARM_PRINTF, "RADIUS: radius_server_request: attributes verification failed\n"); rwos_mutex_release (rwos_radius_data_mutex); (*p_callbacks->fptr_radius_error_callback) (radius_request_handle, RADIUS_ILLEGAL_ATTRIBUTE_LIST); return (false); } if (radius_send_packet (server_handle, radius_request_handle, p_callbacks, code, attribute_list_handle, &error_callback_called, any_server) == FAIL) { radius_printf (RADIUS_ALARM_PRINTF, "RADIUS: radius_server_request: failed to send the packet\n"); rwos_mutex_release (rwos_radius_data_mutex); if (error_callback_called == false) { (*p_callbacks->fptr_radius_error_callback) (radius_request_handle, RADIUS_UDP_SEND_ERROR); } return (false); } rwos_mutex_release (rwos_radius_data_mutex); return (true);}/*****************************************************************************************/bool radius_any_server_request (RADIUS_SERVER_HANDLE server_handle, RADIUS_REQUEST_HANDLE radius_request_handle, RADIUS_REQUEST_CALLBACKS *p_callbacks, enum RADIUS_CODE code, RADIUS_ATTRIBUTE_LIST_HANDLE attribute_list_handle){ bool verify_attributes; bool error_callback_called; bool any_server = true; RADIUS_LIST_CONTROLLER* p_radius_attribute_list_controller; RADIUS_SERVER_HANDLE svr_handle; enum RADIUS_SERVER_TYPE server_type = RADIUS_AUTHENTICATION_SERVER_TYPE; if (server_handle == (RADIUS_SERVER_HANDLE)ANY_RADIUS_SERVER) { switch (code) { case RADIUS_ACCESS_REQUEST: server_type = RADIUS_AUTHENTICATION_SERVER_TYPE; break; case RADIUS_ACCOUNTING_REQUEST: server_type = RADIUS_ACCOUNTING_SERVER_TYPE; break; default: /* shouldn't happen */ printf("Error: Invalid request!\n"); break; } svr_handle = radius_get_first_server(server_type); if (svr_handle == INVALID_HANDLE) { /* This shouldn't happen unless there is no server of the requested type is configured in the radiuscfg.c and user never created any server of the type */ printf("Error: Can't find server of the requested type!\n"); (*p_callbacks->fptr_radius_error_callback) (radius_request_handle, RADIUS_SERVER_NOT_FOUND); return(false); } } else { svr_handle = server_handle; if (svr_handle == INVALID_HANDLE) { (*p_callbacks->fptr_radius_error_callback) (radius_request_handle, RADIUS_INVALID_SERVER_SPECIFIED); return(false); } } rwos_mutex_acquire (rwos_radius_data_mutex, WAIT_FOREVER); error_callback_called = false; p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) attribute_list_handle; verify_attributes = radius_verify_attributes (code, p_radius_attribute_list_controller); if (verify_attributes == false) { radius_printf (RADIUS_ALARM_PRINTF, "RADIUS: radius_server_request: attributes verification failed\n"); rwos_mutex_release (rwos_radius_data_mutex); (*p_callbacks->fptr_radius_error_callback) (radius_request_handle, RADIUS_ILLEGAL_ATTRIBUTE_LIST); return (false); } if (radius_send_packet (svr_handle, radius_request_handle, p_callbacks, code, attribute_list_handle, &error_callback_called, any_server) == FAIL) { radius_printf (RADIUS_ALARM_PRINTF, "RADIUS: radius_server_request: failed to send the packet\n"); rwos_mutex_release (rwos_radius_data_mutex); if (error_callback_called == false) { (*p_callbacks->fptr_radius_error_callback) (radius_request_handle, RADIUS_UDP_SEND_ERROR); } return (false); } rwos_mutex_release (rwos_radius_data_mutex); return (true);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -