Page MenuHomeFreeBSD

D24902.id76044.diff
No OneTemporary

D24902.id76044.diff

Index: head/sys/netinet/tcp_input.c
===================================================================
--- head/sys/netinet/tcp_input.c
+++ head/sys/netinet/tcp_input.c
@@ -1841,6 +1841,15 @@
tcp_clean_sackreport(tp);
TCPSTAT_INC(tcps_preddat);
tp->rcv_nxt += tlen;
+ if (tlen &&
+ ((tp->t_flags2 & TF2_FBYTES_COMPLETE) == 0) &&
+ (tp->t_fbyte_in == 0)) {
+ tp->t_fbyte_in = ticks;
+ if (tp->t_fbyte_in == 0)
+ tp->t_fbyte_in = 1;
+ if (tp->t_fbyte_out && tp->t_fbyte_in)
+ tp->t_flags2 |= TF2_FBYTES_COMPLETE;
+ }
/*
* Pull snd_wl1 up to prevent seq wrap relative to
* th_seq.
@@ -3016,6 +3025,15 @@
else
tp->t_flags |= TF_ACKNOW;
tp->rcv_nxt += tlen;
+ if (tlen &&
+ ((tp->t_flags2 & TF2_FBYTES_COMPLETE) == 0) &&
+ (tp->t_fbyte_in == 0)) {
+ tp->t_fbyte_in = ticks;
+ if (tp->t_fbyte_in == 0)
+ tp->t_fbyte_in = 1;
+ if (tp->t_fbyte_out && tp->t_fbyte_in)
+ tp->t_flags2 |= TF2_FBYTES_COMPLETE;
+ }
thflags = th->th_flags & TH_FIN;
TCPSTAT_INC(tcps_rcvpack);
TCPSTAT_ADD(tcps_rcvbyte, tlen);
Index: head/sys/netinet/tcp_log_buf.h
===================================================================
--- head/sys/netinet/tcp_log_buf.h
+++ head/sys/netinet/tcp_log_buf.h
@@ -32,7 +32,7 @@
#define TCP_LOG_REASON_LEN 32
#define TCP_LOG_TAG_LEN 32
-#define TCP_LOG_BUF_VER (8)
+#define TCP_LOG_BUF_VER (9)
/*
* Because the (struct tcp_log_buffer) includes 8-byte uint64_t's, it requires
@@ -143,6 +143,7 @@
uint32_t tlb_rttvar; /* TCPCB t_rttvar */
uint32_t tlb_rcv_up; /* TCPCB rcv_up */
uint32_t tlb_rcv_adv; /* TCPCB rcv_adv */
+ uint32_t tlb_flags2; /* TCPCB t_flags2 */
uint32_t tlb_rcv_nxt; /* TCPCB rcv_nxt */
uint32_t tlb_rcv_wnd; /* TCPCB rcv_wnd */
uint32_t tlb_dupacks; /* TCPCB t_dupacks */
@@ -150,6 +151,8 @@
int tlb_snd_numholes; /* TCPCB snd_numholes */
uint32_t tlb_flex1; /* Event specific information */
uint32_t tlb_flex2; /* Event specific information */
+ uint32_t tlb_fbyte_in; /* TCPCB first byte in time */
+ uint32_t tlb_fbyte_out; /* TCPCB first byte out time */
uint8_t tlb_snd_scale:4, /* TCPCB snd_scale */
tlb_rcv_scale:4; /* TCPCB rcv_scale */
uint8_t _pad[3]; /* Padding */
Index: head/sys/netinet/tcp_log_buf.c
===================================================================
--- head/sys/netinet/tcp_log_buf.c
+++ head/sys/netinet/tcp_log_buf.c
@@ -1693,6 +1693,9 @@
COPY_STAT(snd_numholes);
COPY_STAT(snd_scale);
COPY_STAT(rcv_scale);
+ COPY_STAT_T(flags2);
+ COPY_STAT_T(fbyte_in);
+ COPY_STAT_T(fbyte_out);
#undef COPY_STAT
#undef COPY_STAT_T
log_buf->tlb_flex1 = 0;
Index: head/sys/netinet/tcp_stacks/bbr.c
===================================================================
--- head/sys/netinet/tcp_stacks/bbr.c
+++ head/sys/netinet/tcp_stacks/bbr.c
@@ -8415,6 +8415,15 @@
tp->t_flags |= TF_ACKNOW;
}
tp->rcv_nxt += tlen;
+ if (tlen &&
+ ((tp->t_flags2 & TF2_FBYTES_COMPLETE) == 0) &&
+ (tp->t_fbyte_in == 0)) {
+ tp->t_fbyte_in = ticks;
+ if (tp->t_fbyte_in == 0)
+ tp->t_fbyte_in = 1;
+ if (tp->t_fbyte_out && tp->t_fbyte_in)
+ tp->t_flags2 |= TF2_FBYTES_COMPLETE;
+ }
thflags = th->th_flags & TH_FIN;
KMOD_TCPSTAT_ADD(tcps_rcvpack, (int)nsegs);
KMOD_TCPSTAT_ADD(tcps_rcvbyte, tlen);
@@ -8631,6 +8640,15 @@
tcp_clean_sackreport(tp);
KMOD_TCPSTAT_INC(tcps_preddat);
tp->rcv_nxt += tlen;
+ if (tlen &&
+ ((tp->t_flags2 & TF2_FBYTES_COMPLETE) == 0) &&
+ (tp->t_fbyte_in == 0)) {
+ tp->t_fbyte_in = ticks;
+ if (tp->t_fbyte_in == 0)
+ tp->t_fbyte_in = 1;
+ if (tp->t_fbyte_out && tp->t_fbyte_in)
+ tp->t_flags2 |= TF2_FBYTES_COMPLETE;
+ }
/*
* Pull snd_wl1 up to prevent seq wrap relative to th_seq.
*/
Index: head/sys/netinet/tcp_stacks/rack.c
===================================================================
--- head/sys/netinet/tcp_stacks/rack.c
+++ head/sys/netinet/tcp_stacks/rack.c
@@ -8763,6 +8763,15 @@
#endif
rack_handle_delayed_ack(tp, rack, tlen, tfo_syn);
tp->rcv_nxt += tlen;
+ if (tlen &&
+ ((tp->t_flags2 & TF2_FBYTES_COMPLETE) == 0) &&
+ (tp->t_fbyte_in == 0)) {
+ tp->t_fbyte_in = ticks;
+ if (tp->t_fbyte_in == 0)
+ tp->t_fbyte_in = 1;
+ if (tp->t_fbyte_out && tp->t_fbyte_in)
+ tp->t_flags2 |= TF2_FBYTES_COMPLETE;
+ }
thflags = th->th_flags & TH_FIN;
KMOD_TCPSTAT_ADD(tcps_rcvpack, nsegs);
KMOD_TCPSTAT_ADD(tcps_rcvbyte, tlen);
@@ -8986,6 +8995,15 @@
tcp_clean_sackreport(tp);
KMOD_TCPSTAT_INC(tcps_preddat);
tp->rcv_nxt += tlen;
+ if (tlen &&
+ ((tp->t_flags2 & TF2_FBYTES_COMPLETE) == 0) &&
+ (tp->t_fbyte_in == 0)) {
+ tp->t_fbyte_in = ticks;
+ if (tp->t_fbyte_in == 0)
+ tp->t_fbyte_in = 1;
+ if (tp->t_fbyte_out && tp->t_fbyte_in)
+ tp->t_flags2 |= TF2_FBYTES_COMPLETE;
+ }
/*
* Pull snd_wl1 up to prevent seq wrap relative to th_seq.
*/
Index: head/sys/netinet/tcp_usrreq.c
===================================================================
--- head/sys/netinet/tcp_usrreq.c
+++ head/sys/netinet/tcp_usrreq.c
@@ -1196,6 +1196,16 @@
socantsendmore(so);
tcp_usrclosed(tp);
}
+ if (TCPS_HAVEESTABLISHED(tp->t_state) &&
+ ((tp->t_flags2 & TF2_FBYTES_COMPLETE) == 0) &&
+ (tp->t_fbyte_out == 0) &&
+ (so->so_snd.sb_ccc > 0)) {
+ tp->t_fbyte_out = ticks;
+ if (tp->t_fbyte_out == 0)
+ tp->t_fbyte_out = 1;
+ if (tp->t_fbyte_out && tp->t_fbyte_in)
+ tp->t_flags2 |= TF2_FBYTES_COMPLETE;
+ }
if (!(inp->inp_flags & INP_DROPPED) &&
!(flags & PRUS_NOTREADY)) {
if (flags & PRUS_MORETOCOME)
Index: head/sys/netinet/tcp_var.h
===================================================================
--- head/sys/netinet/tcp_var.h
+++ head/sys/netinet/tcp_var.h
@@ -202,6 +202,8 @@
tcp_seq t_rtseq; /* sequence number being timed */
u_int t_starttime; /* time connection was established */
+ u_int t_fbyte_in; /* ticks time when first byte queued in */
+ u_int t_fbyte_out; /* ticks time when first byte queued out */
u_int t_pmtud_saved_maxseg; /* pre-blackhole MSS */
int t_blackhole_enter; /* when to enter blackhole detection */
@@ -434,7 +436,7 @@
#define TF2_ECN_SND_CWR 0x00000040 /* ECN CWR in queue */
#define TF2_ECN_SND_ECE 0x00000080 /* ECN ECE in queue */
#define TF2_ACE_PERMIT 0x00000100 /* Accurate ECN mode */
-
+#define TF2_FBYTES_COMPLETE 0x00000400 /* We have first bytes in and out */
/*
* Structure to hold TCP options that are only used during segment
* processing (in tcp_input), but not held in the tcpcb.

File Metadata

Mime Type
text/plain
Expires
Mon, May 18, 12:13 AM (5 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33221320
Default Alt Text
D24902.id76044.diff (6 KB)

Event Timeline