rfc1323.patch by Ted - grendel@heorot.stanford.edu Changes OpenBSD TCP/IP stack so that the RFC 1323 timestamp is set at zero at the start of each connection. Makes it impossible to determine uptime, except as concerns that one connection. cd /sys/netinet patch < /.../rfc1323.patch and rebuild kernel --- tcp_var.h.orig Thu Mar 15 18:26:39 2001 +++ tcp_var.h Thu Mar 15 18:27:11 2001 @@ -161,6 +161,8 @@ u_char rcv_scale; /* window scaling for recv window */ u_char request_r_scale; /* pending window scaling */ u_char requested_s_scale; + u_int32_t mytcp_now; + u_int32_t oldtcp_now; u_int32_t ts_recent; /* timestamp echo data */ u_int32_t ts_recent_age; /* when last updated */ tcp_seq last_ack_sent; --- tcp_input.c.orig Thu Mar 15 18:26:24 2001 +++ tcp_input.c Thu Mar 15 18:26:55 2001 @@ -104,6 +104,7 @@ int tcprexmtthresh = 3; struct tcpiphdr tcp_saveti; int tcptv_keep_init = TCPTV_KEEP_INIT; +u_int32_t ts_temp; extern u_long sb_max; @@ -883,7 +884,10 @@ * Fix from Braden, see Stevens p. 870 */ if (ts_present && SEQ_LEQ(th->th_seq, tp->last_ack_sent)) { - tp->ts_recent_age = tcp_now; + ts_temp = tcp_now - tp->oldtcp_now; + tp->oldtcp_now = tcp_now; + tp->mytcp_now = ts_temp + tp->mytcp_now; + tp->ts_recent_age = tp->mytcp_now; tp->ts_recent = ts_val; } @@ -897,7 +901,7 @@ */ ++tcpstat.tcps_predack; if (ts_present) - tcp_xmit_timer(tp, tcp_now-ts_ecr+1); + tcp_xmit_timer(tp, tp->mytcp_now-ts_ecr+1); else if (tp->t_rtt && SEQ_GT(th->th_ack, tp->t_rtseq)) tcp_xmit_timer(tp, tp->t_rtt); @@ -1015,7 +1019,6 @@ #ifdef INET6 register struct sockaddr_in6 *sin6; #endif /* INET6 */ - if (tiflags & TH_RST) goto drop; if (tiflags & TH_ACK) @@ -1291,7 +1294,7 @@ TSTMP_LT(ts_val, tp->ts_recent)) { /* Check to see if ts_recent is over 24 days old. */ - if ((int)(tcp_now - tp->ts_recent_age) > TCP_PAWS_IDLE) { + if ((int)(tp->mytcp_now - 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 @@ -1412,7 +1415,10 @@ */ if (ts_present && TSTMP_GEQ(ts_val, tp->ts_recent) && SEQ_LEQ(th->th_seq, tp->last_ack_sent)) { - tp->ts_recent_age = tcp_now; + ts_temp = tcp_now - tp->oldtcp_now; + tp->oldtcp_now = tcp_now; + tp->mytcp_now = ts_temp + tp->mytcp_now; + tp->ts_recent_age = tp->mytcp_now; tp->ts_recent = ts_val; } @@ -1733,7 +1739,7 @@ * Recompute the initial retransmit timer. */ if (ts_present) - tcp_xmit_timer(tp, tcp_now-ts_ecr+1); + tcp_xmit_timer(tp, tp->mytcp_now-ts_ecr+1); else if (tp->t_rtt && SEQ_GT(th->th_ack, tp->t_rtseq)) tcp_xmit_timer(tp,tp->t_rtt); @@ -2214,7 +2220,9 @@ if (th->th_flags & TH_SYN) { tp->t_flags |= TF_RCVD_TSTMP; tp->ts_recent = *ts_val; - tp->ts_recent_age = tcp_now; + tp->mytcp_now = 0; + tp->oldtcp_now = tcp_now; + tp->ts_recent_age = tp->mytcp_now; } break; --- tcp_output.c.orig Thu Mar 15 18:26:32 2001 +++ tcp_output.c Thu Mar 15 18:27:03 2001 @@ -559,7 +559,7 @@ /* Form timestamp option as shown in appendix A of RFC 1323. */ *lp++ = htonl(TCPOPT_TSTAMP_HDR); - *lp++ = htonl(tcp_now); + *lp++ = htonl(tp->mytcp_now); *lp = htonl(tp->ts_recent); optlen += TCPOLEN_TSTAMP_APPA; }