Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_usrreq.c
Show First 20 Lines • Show All 1,110 Lines • ▼ Show 20 Lines | #endif /* INET */ | ||||
} | } | ||||
#endif /* INET6 */ | #endif /* INET6 */ | ||||
default: | default: | ||||
error = EAFNOSUPPORT; | error = EAFNOSUPPORT; | ||||
goto out; | goto out; | ||||
} | } | ||||
} | } | ||||
if (!(flags & PRUS_OOB)) { | if (!(flags & PRUS_OOB)) { | ||||
if (tp->t_acktime == 0) | |||||
tp->t_acktime = ticks; | |||||
sbappendstream(&so->so_snd, m, flags); | sbappendstream(&so->so_snd, m, flags); | ||||
m = NULL; | m = NULL; | ||||
if (nam && tp->t_state < TCPS_SYN_SENT) { | if (nam && tp->t_state < TCPS_SYN_SENT) { | ||||
KASSERT(tp->t_state == TCPS_CLOSED, | KASSERT(tp->t_state == TCPS_CLOSED, | ||||
("%s: tp %p is listening", __func__, tp)); | ("%s: tp %p is listening", __func__, tp)); | ||||
/* | /* | ||||
* Do implied connect if not yet connected, | * Do implied connect if not yet connected, | ||||
▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | #endif | ||||
/* | /* | ||||
* According to RFC961 (Assigned Protocols), | * According to RFC961 (Assigned Protocols), | ||||
* the urgent pointer points to the last octet | * the urgent pointer points to the last octet | ||||
* of urgent data. We continue, however, | * of urgent data. We continue, however, | ||||
* to consider it to indicate the first octet | * to consider it to indicate the first octet | ||||
* of data past the urgent section. | * of data past the urgent section. | ||||
* Otherwise, snd_up should be one lower. | * Otherwise, snd_up should be one lower. | ||||
*/ | */ | ||||
if (tp->t_acktime == 0) | |||||
tp->t_acktime = ticks; | |||||
sbappendstream_locked(&so->so_snd, m, flags); | sbappendstream_locked(&so->so_snd, m, flags); | ||||
SOCKBUF_UNLOCK(&so->so_snd); | SOCKBUF_UNLOCK(&so->so_snd); | ||||
m = NULL; | m = NULL; | ||||
if (nam && tp->t_state < TCPS_SYN_SENT) { | if (nam && tp->t_state < TCPS_SYN_SENT) { | ||||
/* | /* | ||||
* Do implied connect if not yet connected, | * Do implied connect if not yet connected, | ||||
* initialize window to default value, and | * initialize window to default value, and | ||||
* initialize maxseg using peer's cached MSS. | * initialize maxseg using peer's cached MSS. | ||||
▲ Show 20 Lines • Show All 1,157 Lines • ▼ Show 20 Lines | case TCP_RXTLS_ENABLE: | ||||
INP_WUNLOCK(inp); | INP_WUNLOCK(inp); | ||||
error = sooptcopyin(sopt, &tls, sizeof(tls), | error = sooptcopyin(sopt, &tls, sizeof(tls), | ||||
sizeof(tls)); | sizeof(tls)); | ||||
if (error) | if (error) | ||||
break; | break; | ||||
error = ktls_enable_rx(so, &tls); | error = ktls_enable_rx(so, &tls); | ||||
break; | break; | ||||
#endif | #endif | ||||
case TCP_MAXUNACKTIME: | |||||
case TCP_KEEPIDLE: | case TCP_KEEPIDLE: | ||||
case TCP_KEEPINTVL: | case TCP_KEEPINTVL: | ||||
case TCP_KEEPINIT: | case TCP_KEEPINIT: | ||||
INP_WUNLOCK(inp); | INP_WUNLOCK(inp); | ||||
error = sooptcopyin(sopt, &ui, sizeof(ui), sizeof(ui)); | error = sooptcopyin(sopt, &ui, sizeof(ui), sizeof(ui)); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
if (ui > (UINT_MAX / hz)) { | if (ui > (UINT_MAX / hz)) { | ||||
error = EINVAL; | error = EINVAL; | ||||
break; | break; | ||||
} | } | ||||
ui *= hz; | ui *= hz; | ||||
INP_WLOCK_RECHECK(inp); | INP_WLOCK_RECHECK(inp); | ||||
switch (sopt->sopt_name) { | switch (sopt->sopt_name) { | ||||
case TCP_MAXUNACKTIME: | |||||
tp->t_maxunacktime = ui; | |||||
break; | |||||
case TCP_KEEPIDLE: | case TCP_KEEPIDLE: | ||||
tp->t_keepidle = ui; | tp->t_keepidle = ui; | ||||
/* | /* | ||||
* XXX: better check current remaining | * XXX: better check current remaining | ||||
* timeout and "merge" it with new value. | * timeout and "merge" it with new value. | ||||
*/ | */ | ||||
if ((tp->t_state > TCPS_LISTEN) && | if ((tp->t_state > TCPS_LISTEN) && | ||||
(tp->t_state <= TCPS_CLOSING)) | (tp->t_state <= TCPS_CLOSING)) | ||||
▲ Show 20 Lines • Show All 250 Lines • ▼ Show 20 Lines | |||||
#endif /* !STATS */ | #endif /* !STATS */ | ||||
break; | break; | ||||
} | } | ||||
case TCP_CONGESTION: | case TCP_CONGESTION: | ||||
len = strlcpy(buf, CC_ALGO(tp)->name, TCP_CA_NAME_MAX); | len = strlcpy(buf, CC_ALGO(tp)->name, TCP_CA_NAME_MAX); | ||||
INP_WUNLOCK(inp); | INP_WUNLOCK(inp); | ||||
error = sooptcopyout(sopt, buf, len + 1); | error = sooptcopyout(sopt, buf, len + 1); | ||||
break; | break; | ||||
case TCP_MAXUNACKTIME: | |||||
case TCP_KEEPIDLE: | case TCP_KEEPIDLE: | ||||
case TCP_KEEPINTVL: | case TCP_KEEPINTVL: | ||||
case TCP_KEEPINIT: | case TCP_KEEPINIT: | ||||
case TCP_KEEPCNT: | case TCP_KEEPCNT: | ||||
switch (sopt->sopt_name) { | switch (sopt->sopt_name) { | ||||
case TCP_MAXUNACKTIME: | |||||
ui = TP_MAXUNACKTIME(tp) / hz; | |||||
break; | |||||
case TCP_KEEPIDLE: | case TCP_KEEPIDLE: | ||||
ui = TP_KEEPIDLE(tp) / hz; | ui = TP_KEEPIDLE(tp) / hz; | ||||
break; | break; | ||||
case TCP_KEEPINTVL: | case TCP_KEEPINTVL: | ||||
ui = TP_KEEPINTVL(tp) / hz; | ui = TP_KEEPINTVL(tp) / hz; | ||||
break; | break; | ||||
case TCP_KEEPINIT: | case TCP_KEEPINIT: | ||||
ui = TP_KEEPINIT(tp) / hz; | ui = TP_KEEPINIT(tp) / hz; | ||||
▲ Show 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | #endif | ||||
case TCPS_ESTABLISHED: | case TCPS_ESTABLISHED: | ||||
tcp_state_change(tp, TCPS_FIN_WAIT_1); | tcp_state_change(tp, TCPS_FIN_WAIT_1); | ||||
break; | break; | ||||
case TCPS_CLOSE_WAIT: | case TCPS_CLOSE_WAIT: | ||||
tcp_state_change(tp, TCPS_LAST_ACK); | tcp_state_change(tp, TCPS_LAST_ACK); | ||||
break; | break; | ||||
} | } | ||||
if (tp->t_acktime == 0) | |||||
tp->t_acktime = ticks; | |||||
if (tp->t_state >= TCPS_FIN_WAIT_2) { | if (tp->t_state >= TCPS_FIN_WAIT_2) { | ||||
soisdisconnected(tp->t_inpcb->inp_socket); | soisdisconnected(tp->t_inpcb->inp_socket); | ||||
/* Prevent the connection hanging in FIN_WAIT_2 forever. */ | /* Prevent the connection hanging in FIN_WAIT_2 forever. */ | ||||
if (tp->t_state == TCPS_FIN_WAIT_2) { | if (tp->t_state == TCPS_FIN_WAIT_2) { | ||||
int timeout; | int timeout; | ||||
timeout = (tcp_fast_finwait2_recycle) ? | timeout = (tcp_fast_finwait2_recycle) ? | ||||
tcp_finwait2_timeout : TP_MAXIDLE(tp); | tcp_finwait2_timeout : TP_MAXIDLE(tp); | ||||
▲ Show 20 Lines • Show All 377 Lines • Show Last 20 Lines |