Многие функции участвуют в переходе состояния.Но в целом есть одна общая функция, которая просто меняет состояние: tcp_set_state ().
Выполнение grep в источниках net / ipv4 / *. C:
tcp.c: tcp_set_state(sk, ns);
tcp.c: tcp_set_state(sk, TCP_CLOSE);
tcp.c: tcp_set_state(sk, TCP_CLOSE);
tcp.c: tcp_set_state(sk, TCP_CLOSE);
tcp.c: tcp_set_state(sk, TCP_CLOSE);
tcp.c: tcp_set_state(sk, TCP_CLOSE);
tcp.c: tcp_set_state(sk, TCP_CLOSE);
tcp_input.c: tcp_set_state(sk, TCP_CLOSE_WAIT);
tcp_input.c: tcp_set_state(sk, TCP_CLOSING);
tcp_input.c: tcp_set_state(sk, TCP_ESTABLISHED);
tcp_input.c: tcp_set_state(sk, TCP_SYN_RECV);
tcp_input.c: tcp_set_state(sk, TCP_ESTABLISHED);
tcp_input.c: tcp_set_state(sk, TCP_FIN_WAIT2);
tcp_ipv4.c: tcp_set_state(sk, TCP_SYN_SENT);
tcp_ipv4.c: tcp_set_state(sk, TCP_CLOSE);
и теперь случайным образомвыбрал один из них:
tcp.c: tcp_fin (), который обрабатывает переход состояния FIN:
static void tcp_fin(struct sock *sk)
{
struct tcp_sock *tp = tcp_sk(sk);
const struct dst_entry *dst;
inet_csk_schedule_ack(sk);
sk->sk_shutdown |= RCV_SHUTDOWN;
sock_set_flag(sk, SOCK_DONE);
switch (sk->sk_state) {
case TCP_SYN_RECV:
case TCP_ESTABLISHED:
/* Move to CLOSE_WAIT */
tcp_set_state(sk, TCP_CLOSE_WAIT);
Таким образом, вы можете видеть сверху до (т.е. TCP_SYN_RECV) и послесостояние изменено функцией tcp_set_state ().
В другой функции (также tcp_input.c):
static int tcp_rcv_synsent_state_process()
Здесь указывается значение TCP_SYN_RECV посредством вызова tcp_set_state (), а затем продолжаетсяс другой обработкой, а также.
Любой из приведенных выше сценариев охватывает обработку состояний после состояния TCP_SYN_RECV.