?? nat_tcp_state.c
字號(hào):
/* 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);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -