svn commit: r193941 - head/sys/netinet
Robert Watson
rwatson at FreeBSD.org
Wed Jun 10 19:52:32 UTC 2009
On Wed, 10 Jun 2009, John Baldwin wrote:
> Change a few members of tcpcb that store cached copies of ticks to be ints
> instead of unsigned longs. This fixes a few overflow edge cases on 64-bit
> platforms. Specifically, if an idle connection receives a packet shortly
> before 2^31 clock ticks of uptime (about 25 days with hz=1000) and the keep
> alive timer fires after 2^31 clock ticks, the keep alive timer will think
> that the connection has been idle for a very long time and will immediately
> drop the connection instead of sending a keep alive probe.
>
> Reviewed by: silby, gnn, lstewart
> MFC after: 1 week
That's pretty subtle even as TCP bugs go, nice work :-).
Robert N M Watson
Computer Laboratory
University of Cambridge
>
> Modified:
> head/sys/netinet/tcp_input.c
> head/sys/netinet/tcp_usrreq.c
> head/sys/netinet/tcp_var.h
>
> Modified: head/sys/netinet/tcp_input.c
> ==============================================================================
> --- head/sys/netinet/tcp_input.c Wed Jun 10 18:26:02 2009 (r193940)
> +++ head/sys/netinet/tcp_input.c Wed Jun 10 18:27:15 2009 (r193941)
> @@ -1778,7 +1778,7 @@ tcp_do_segment(struct mbuf *m, struct tc
> TSTMP_LT(to.to_tsval, tp->ts_recent)) {
>
> /* Check to see if ts_recent is over 24 days old. */
> - if ((int)(ticks - tp->ts_recent_age) > TCP_PAWS_IDLE) {
> + if ((ticks - tp->ts_recent_age) > TCP_PAWS_IDLE) {
> /*
> * Invalidate ts_recent. If this segment updates
> * ts_recent, the age will be reset later and ts_recent
>
> Modified: head/sys/netinet/tcp_usrreq.c
> ==============================================================================
> --- head/sys/netinet/tcp_usrreq.c Wed Jun 10 18:26:02 2009 (r193940)
> +++ head/sys/netinet/tcp_usrreq.c Wed Jun 10 18:27:15 2009 (r193941)
> @@ -1823,7 +1823,7 @@ db_print_tcpcb(struct tcpcb *tp, const c
> tp->snd_recover);
>
> db_print_indent(indent);
> - db_printf("t_maxopd: %u t_rcvtime: %lu t_startime: %lu\n",
> + db_printf("t_maxopd: %u t_rcvtime: %u t_startime: %u\n",
> tp->t_maxopd, tp->t_rcvtime, tp->t_starttime);
>
> db_print_indent(indent);
> @@ -1854,7 +1854,7 @@ db_print_tcpcb(struct tcpcb *tp, const c
> tp->snd_scale, tp->rcv_scale, tp->request_r_scale);
>
> db_print_indent(indent);
> - db_printf("ts_recent: %u ts_recent_age: %lu\n",
> + db_printf("ts_recent: %u ts_recent_age: %u\n",
> tp->ts_recent, tp->ts_recent_age);
>
> db_print_indent(indent);
> @@ -1863,7 +1863,7 @@ db_print_tcpcb(struct tcpcb *tp, const c
>
> db_print_indent(indent);
> db_printf("snd_ssthresh_prev: %lu snd_recover_prev: 0x%08x "
> - "t_badrxtwin: %lu\n", tp->snd_ssthresh_prev,
> + "t_badrxtwin: %u\n", tp->snd_ssthresh_prev,
> tp->snd_recover_prev, tp->t_badrxtwin);
>
> db_print_indent(indent);
>
> Modified: head/sys/netinet/tcp_var.h
> ==============================================================================
> --- head/sys/netinet/tcp_var.h Wed Jun 10 18:26:02 2009 (r193940)
> +++ head/sys/netinet/tcp_var.h Wed Jun 10 18:27:15 2009 (r193941)
> @@ -139,8 +139,8 @@ struct tcpcb {
>
> u_int t_maxopd; /* mss plus options */
>
> - u_long t_rcvtime; /* inactivity time */
> - u_long t_starttime; /* time connection was established */
> + int t_rcvtime; /* inactivity time */
> + int t_starttime; /* time connection was established */
> int t_rtttime; /* round trip time */
> tcp_seq t_rtseq; /* sequence number being timed */
>
> @@ -167,7 +167,7 @@ struct tcpcb {
> u_char rcv_scale; /* window scaling for recv window */
> u_char request_r_scale; /* pending window scaling */
> u_int32_t ts_recent; /* timestamp echo data */
> - u_long ts_recent_age; /* when last updated */
> + int ts_recent_age; /* when last updated */
> u_int32_t ts_offset; /* our timestamp offset */
>
> tcp_seq last_ack_sent;
> @@ -175,7 +175,7 @@ struct tcpcb {
> u_long snd_cwnd_prev; /* cwnd prior to retransmit */
> u_long snd_ssthresh_prev; /* ssthresh prior to retransmit */
> tcp_seq snd_recover_prev; /* snd_recover prior to retransmit */
> - u_long t_badrxtwin; /* window for retransmit recovery */
> + int t_badrxtwin; /* window for retransmit recovery */
> u_char snd_limited; /* segments limited transmitted */
> /* SACK related state */
> int snd_numholes; /* number of holes seen by sender */
>
More information about the svn-src-head
mailing list