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

📄 nat_tcp_state.c

📁 VXWORKS NAT 部分源代码3 有兴趣朋友可以参考下
💻 C
字号:
/* nat_configure.c */

/* Copyright 2000-2003 Wind River Systems, Inc. */

/* @format.tab-size 4, @format.use-tabs true, @format.new-line lf */

/*
modification history
--------------------
01a,23apr03,zhu  updated copyright
Date	Init	Comment
080701	tk		Add code to make an event callback to the external agent upon
				TCP session termination.
*/
#include "nat.h"
/************************************************************************/
void tcp_state_transistion_global_rx (BYTE_ENUM (NAT_TCP_STATE_INPUT) state_input,
	NAT_CURRENCY_TRANSLATION_ENTRY *sptr_tcp_translation_entry)
{
	BYTE_ENUM (NAT_TCP_PORT_STATE) current_state;

	nat_printf (NAT_PRINTF_TRACE, "TCP state transition (inbound packet)\n");

	if (state_input == NAT_ACK)
	{
		current_state = sptr_tcp_translation_entry->local_state;
	
		sptr_tcp_translation_entry->local_state = 
			nat.tcp_state_table[current_state].transistion_table[state_input].next_state;
/*
		if (nat.tcp_state_table[current_state].transistion_table[state_input].new_connection_timer_value != NULL)
		{
			sptr_tcp_translation_entry->local_connection_timer = 
				*nat.tcp_state_table[current_state].transistion_table[state_input].new_connection_timer_value;
		}
*/
		nat_printf (NAT_PRINTF_TRACE, "local state = %d, next state = %d\n",
			current_state, sptr_tcp_translation_entry->local_state);
	}
	else
	{
		current_state = sptr_tcp_translation_entry->global_state;

		sptr_tcp_translation_entry->global_state = 
			nat.tcp_state_table[current_state].transistion_table[state_input].next_state;
/*
		if (nat.tcp_state_table[current_state].transistion_table[state_input].new_connection_timer_value != NULL)
		{
			sptr_tcp_translation_entry->global_connection_timer = 
				*nat.tcp_state_table[current_state].transistion_table[state_input].new_connection_timer_value;
		}
*/
		if (nat.tcp_state_table[current_state].transistion_table[state_input].fptr_transistion_function != NULL)
		{
			(*nat.tcp_state_table[current_state].transistion_table[state_input].fptr_transistion_function)
				(state_input, current_state, GLOBAL_RX_PACKET, sptr_tcp_translation_entry);
		}

		nat_printf (NAT_PRINTF_TRACE, "global state = %d, next state = %d\n",
				current_state, sptr_tcp_translation_entry->global_state);
	}
}
/************************************************************************/
void tcp_state_transistion_local_rx (BYTE_ENUM (NAT_TCP_STATE_INPUT) state_input,
	NAT_CURRENCY_TRANSLATION_ENTRY *sptr_tcp_translation_entry)
{
	BYTE_ENUM (NAT_TCP_PORT_STATE) current_state;
	NAT_EVENT_INFO	event_info;

	nat_printf (NAT_PRINTF_TRACE, "TCP state transition (outbound packet)\n");

	if (state_input == NAT_ACK)
	{
		current_state = sptr_tcp_translation_entry->global_state;
	
		sptr_tcp_translation_entry->global_state = 
			nat.tcp_state_table[current_state].transistion_table[state_input].next_state;
/*
		if (nat.tcp_state_table[current_state].transistion_table[state_input].new_connection_timer_value != NULL)
		{
			sptr_tcp_translation_entry->global_connection_timer = 
				*nat.tcp_state_table[current_state].transistion_table[state_input].new_connection_timer_value;
		}
*/
		nat_printf (NAT_PRINTF_TRACE, "global state = %d, next state = %d\n",
			current_state, sptr_tcp_translation_entry->global_state);

	}
	else
	{
		current_state = sptr_tcp_translation_entry->local_state;

		sptr_tcp_translation_entry->local_state = 
			nat.tcp_state_table[current_state].transistion_table[state_input].next_state;
/*
		if (nat.tcp_state_table[current_state].transistion_table[state_input].new_connection_timer_value != NULL)
		{
			sptr_tcp_translation_entry->local_connection_timer = 
				*nat.tcp_state_table[current_state].transistion_table[state_input].new_connection_timer_value;
		}
*/
		if (nat.tcp_state_table[current_state].transistion_table[state_input].fptr_transistion_function != NULL)
		{
			(*nat.tcp_state_table[current_state].transistion_table[state_input].fptr_transistion_function)
				(state_input, current_state, LOCAL_RX_PACKET, sptr_tcp_translation_entry);
		}

		nat_printf (NAT_PRINTF_TRACE, "local state = %d, next state = %d\n",
			current_state, sptr_tcp_translation_entry->local_state);
	}

	/* if TCP flag is set to FIN, and the packet is going to an external agent,
	   make an event callback to the agent to notify the session termination.
	*/
	if (state_input == NAT_FIN)
	{
		if (nat.agent_info != NULL)
		{
			/*event_info.bind_info = (NAT_BIND_INFO *) sptr_tcp_translation_entry->bind_id;*/
			
			if (nat.agent_info->event_callback == NULL)
			{
				
				return;
			}
			nat.agent_info->event_callback((u_long)&nat, 
					nat.agent_info->id, NAT_BIND_TERMINATION, &event_info);
		}
	}
}
/************************************************************************/
void tcp_reset_state_handler (BYTE_ENUM (NAT_TCP_STATE_INPUT) state_input,
		BYTE_ENUM (NAT_TCP_PORT_STATE) current_state, BYTE_ENUM (NAT_PACKET_DIRECTION) packet_direction,
		NAT_CURRENCY_TRANSLATION_ENTRY *sptr_tcp_translation_entry)
{

	PARAMETER_NOT_USED (current_state);
	PARAMETER_NOT_USED (state_input);							

	if (packet_direction == LOCAL_RX_PACKET)
	{
		tcp_state_transistion_global_rx (NAT_FORCED_RESET, sptr_tcp_translation_entry);
	}
	else
	{
		tcp_state_transistion_local_rx (NAT_FORCED_RESET, sptr_tcp_translation_entry);
	}
	
}
/************************************************************************/
void tcp_syn_state_handler (BYTE_ENUM (NAT_TCP_STATE_INPUT) state_input,
		BYTE_ENUM (NAT_TCP_PORT_STATE) current_state, BYTE_ENUM (NAT_PACKET_DIRECTION) packet_direction,
		NAT_CURRENCY_TRANSLATION_ENTRY *sptr_tcp_translation_entry)
{

	PARAMETER_NOT_USED (current_state);
	PARAMETER_NOT_USED (state_input);		

	if (packet_direction == LOCAL_RX_PACKET)
	{
		delete_sequence_entry_list (&sptr_tcp_translation_entry->local_sequence_delta_list);
	}
	else
	{
		delete_sequence_entry_list (&sptr_tcp_translation_entry->global_sequence_delta_list);
	}

}

⌨️ 快捷键说明

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