📄 nat_tcp_state.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 copyrightDate Init Comment080701 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, TCP_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, TCP_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, TCP_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, TCP_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 + -