radius_rx.c

来自「vxworks下radius协议栈 的源代码」· C语言 代码 · 共 584 行 · 第 1/2 页

C
584
字号
					++p_server->statistics.authentication_bad_authenticators_rx;									break;				case RADIUS_ACCOUNTING_RESPONSE:					++p_server->statistics.accounting_bad_authenticators_rx;									break;				default:										break;				}#ifdef __RADIUS_MIB__			semGive (g_sem_radius_mib);#endif			buffer_free (sptr_rx_packet);			rw_container_free_iterator (request_entry_iterator);			return;			}		}	response_attribute_list_handle = radius_create_attribute_list ();		if (response_attribute_list_handle == INVALID_HANDLE)		{#ifdef __RADIUS_MIB__		semTake (g_sem_radius_mib, WAIT_FOREVER);#endif		switch (sptr_rx_packet->header.code)			{			case RADIUS_ACCESS_ACCEPT:			case RADIUS_ACCESS_REJECT:			case RADIUS_ACCESS_CHALLENGE:				++p_server->statistics.authentication_dropped_packets_rx;							break;			case RADIUS_ACCOUNTING_RESPONSE:				++p_server->statistics.accounting_dropped_packets_rx;							break;			default:								break;			}#ifdef __RADIUS_MIB__		semGive (g_sem_radius_mib);#endif		buffer_free (sptr_rx_packet);		rw_container_free_iterator (request_entry_iterator);		return;		}		p_radius_attribute_list_controller = (RADIUS_LIST_CONTROLLER*) response_attribute_list_handle;	if (radius_read_attributes_from_packet (sptr_rx_packet, p_radius_attribute_list_controller) == FAIL)		{#ifdef __RADIUS_MIB__		semTake (g_sem_radius_mib, WAIT_FOREVER);#endif		switch (sptr_rx_packet->header.code)			{			case RADIUS_ACCESS_ACCEPT:			case RADIUS_ACCESS_REJECT:			case RADIUS_ACCESS_CHALLENGE:				++p_server->statistics.authentication_malformed_access_responses_rx;							break;			case RADIUS_ACCOUNTING_RESPONSE:				++p_server->statistics.accounting_malformed_responses_rx;							break;			default:								break;			}#ifdef __RADIUS_MIB__		semGive (g_sem_radius_mib);#endif		radius_delete_attribute_list (response_attribute_list_handle);		buffer_free (sptr_rx_packet);		rw_container_free_iterator (request_entry_iterator);		return;		}#ifdef __EAP__	if ((sptr_rx_packet->header.code == RADIUS_ACCESS_ACCEPT) || (sptr_rx_packet->header.code == RADIUS_ACCESS_REJECT)		|| (sptr_rx_packet->header.code == RADIUS_ACCESS_CHALLENGE))		{		if (radius_verifiy_message_authenticator (sptr_rx_packet, (BYTE *)p_request_entry->packet_header.authenticator,			p_radius_attribute_list_controller, p_server) == FAIL)			{#ifdef __RADIUS_MIB__			semTake (g_sem_radius_mib, WAIT_FOREVER);#endif			switch (sptr_rx_packet->header.code)				{				case RADIUS_ACCESS_ACCEPT:				case RADIUS_ACCESS_REJECT:				case RADIUS_ACCESS_CHALLENGE:					++p_server->statistics.authentication_malformed_access_responses_rx;									break;				case RADIUS_ACCOUNTING_RESPONSE:					++p_server->statistics.accounting_malformed_responses_rx;									break;				default:										break;				}#ifdef __RADIUS_MIB__			semGive (g_sem_radius_mib);#endif			radius_delete_attribute_list (response_attribute_list_handle);			buffer_free (sptr_rx_packet);			rw_container_free_iterator (request_entry_iterator);			return;			}		}#else	if (radius_verify_attributes (sptr_rx_packet->header.code, p_radius_attribute_list_controller) == false)		{#ifdef __RADIUS_MIB__		semTake (g_sem_radius_mib, WAIT_FOREVER);#endif		switch (sptr_rx_packet->header.code)			{			case RADIUS_ACCESS_ACCEPT:			case RADIUS_ACCESS_REJECT:			case RADIUS_ACCESS_CHALLENGE:				++p_server->statistics.authentication_malformed_access_responses_rx;							break;			case RADIUS_ACCOUNTING_RESPONSE:				++p_server->statistics.accounting_malformed_responses_rx;							break;			default:								break;			}#ifdef __RADIUS_MIB__		semGive (g_sem_radius_mib);#endif		radius_delete_attribute_list (response_attribute_list_handle);		buffer_free (sptr_rx_packet);		rw_container_free_iterator (request_entry_iterator);		return;		}#endif /* __EAP__ */	if (sptr_rx_packet->header.code == RADIUS_ACCESS_ACCEPT)		{		if (radius_decrypt_attributes_with_authenticator (p_radius_attribute_list_controller->p_list, (BYTE *)p_request_entry->packet_header.authenticator, p_server) == FAIL)			{			radius_delete_attribute_list (response_attribute_list_handle);			buffer_free (sptr_rx_packet);			rw_container_free_iterator (request_entry_iterator);			return;			}		}	print_radius_attributes (p_radius_attribute_list_controller);#ifdef __RADIUS_MIB__	semTake (g_sem_radius_mib, WAIT_FOREVER);#endif	switch (sptr_rx_packet->header.code)		{		case RADIUS_ACCESS_ACCEPT:		case RADIUS_ACCESS_REJECT:		case RADIUS_ACCESS_CHALLENGE:			--p_server->statistics.authentication_pending_access_requests;			p_server->statistics.authentication_round_trip_time = (rwos_get_system_elapsed_time () - p_request_entry->request_timestamp) / RADIUS_REQUEST_ROUND_TRIP_TIME_UNIT_IN_MSEC;					break;		case RADIUS_ACCOUNTING_RESPONSE:			--p_server->statistics.accounting_pending_access_requests;			p_server->statistics.accounting_round_trip_time = (rwos_get_system_elapsed_time () - p_request_entry->request_timestamp) / RADIUS_REQUEST_ROUND_TRIP_TIME_UNIT_IN_MSEC;					break;		default:						break;		}#ifdef __RADIUS_MIB__	semGive (g_sem_radius_mib);#endif	rwos_mutex_release (rwos_radius_data_mutex);	(*p_request_entry->p_callbacks->fptr_radius_normal_callback) (p_request_entry->request_handle, sptr_rx_packet->header.code, response_attribute_list_handle); 	rwos_mutex_acquire (rwos_radius_data_mutex, WAIT_FOREVER);	radius_free_packet_identifier_per_server (p_server, p_request_entry->packet_header.identifier);	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);		buffer_free (sptr_rx_packet);		rw_container_free_iterator (request_entry_iterator);	--p_server->pending_request_count;	/* tk: check if there has been a call to destroy the server.  Delete the server only		if there is no pending request on the server and there is no pending client who		still owns (i.e. has not freed) all the copies of the server handle.	*/ 	if ((p_server->deleted == true) 		&& (p_server->pending_request_count == 0)		&& (p_server->user_count == 0))		{		radius_printf (RADIUS_TRACE_PRINTF, "Receive done: Server deleted\n");		if (p_server->bp_secret != NULL)			{				table_free (p_server->bp_secret);							}		table_free (p_server);		rw_container_remove (server_iterator);		}	rw_container_free_iterator (server_iterator);	return;}/************************************************************************/void print_radius_packet_header (char *function_name, RADIUS_PACKET_HEADER *sptr_packet_header){	USHORT output_code;	USHORT output_length;	USHORT output_identifier;	char output_buffer[(RADIUS_SIZE_OF_AUTHENTICATOR * sizeof (OUTPUT_BUFFER_ENTRY)) + sizeof (BYTE)];	if (radius.trace_printing_enabled == TRUE)		{		convert_bytes_to_ascii ((BYTE *)&sptr_packet_header->authenticator[0], sizeof (sptr_packet_header->authenticator), &output_buffer[0]);		output_code = sptr_packet_header->code;		output_length = swap (sptr_packet_header->length);		output_identifier = sptr_packet_header->identifier;		radius_printf (RADIUS_TRACE_PRINTF, "%s: code = %d, id = %d, length = %d, authenticator = %s\n",			function_name, output_code, output_identifier, output_length, &output_buffer[0]);		}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?