⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radius_interface.c

📁 vxworks下radius协议栈 的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		{		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 + -