diff options
-rw-r--r-- | ui/qt/tcp_stream_dialog.cpp | 47 | ||||
-rw-r--r-- | ui/tap-tcp-stream.h | 15 |
2 files changed, 52 insertions, 10 deletions
diff --git a/ui/qt/tcp_stream_dialog.cpp b/ui/qt/tcp_stream_dialog.cpp index 800b02adcb..4230b3820f 100644 --- a/ui/qt/tcp_stream_dialog.cpp +++ b/ui/qt/tcp_stream_dialog.cpp @@ -931,23 +931,50 @@ void TCPStreamDialog::fillWindowScale() title_->setText(dlg_title); QCustomPlot *sp = ui->streamPlot; - base_graph_->setLineStyle(QCPGraph::lsLine); + // use base_graph_ to represent unacked window size + // (estimate of congestion window) + base_graph_->setLineStyle(QCPGraph::lsStepLeft); + // use rwin_graph_ here to show rwin window scale + // (derived from ACK packets) + rwin_graph_->setVisible(true); QVector<double> rel_time, win_size; + QVector<double> cwnd_time, cwnd_size; + guint32 last_ack = 0; + bool found_first_ack = false; for (struct segment *seg = graph_.segments; seg != NULL; seg = seg->next) { - if (!compareHeaders(seg)) { - continue; - } - double ts = seg->rel_secs + seg->rel_usecs / 1000000.0; - guint16 flags = seg->th_flags; - if ((flags & (TH_SYN|TH_RST)) == 0) { - rel_time.append(ts - ts_offset_); - win_size.append(seg->th_win); + // The receive window that applies to this flow comes + // from packets in the opposite direction + if (compareHeaders(seg)) { + // compute bytes_in_flight for cwnd graph + guint32 end_seq = seg->th_seq + seg->th_seglen; + if (found_first_ack && + tcp_seq_eq_or_after(end_seq, last_ack)) { + cwnd_time.append(ts - ts_offset_); + cwnd_size.append((double)(end_seq - last_ack)); + } + } else { + // packet in opposite direction - has advertised rwin + guint16 flags = seg->th_flags; + + if ((flags & (TH_SYN|TH_RST)) == 0) { + rel_time.append(ts - ts_offset_); + win_size.append(seg->th_win); + } + if ((flags & (TH_ACK)) != 0) { + // use this to update last_ack + if (!found_first_ack || + tcp_seq_eq_or_after(seg->th_ack, last_ack)) { + last_ack = seg->th_ack; + found_first_ack = true; + } + } } } - base_graph_->setData(rel_time, win_size); + base_graph_->setData(cwnd_time, cwnd_size); + rwin_graph_->setData(rel_time, win_size); sp->yAxis->setLabel(window_size_label_); } diff --git a/ui/tap-tcp-stream.h b/ui/tap-tcp-stream.h index f430fa5fa5..360f4af016 100644 --- a/ui/tap-tcp-stream.h +++ b/ui/tap-tcp-stream.h @@ -114,6 +114,21 @@ struct unack *rtt_get_new_unack(double , unsigned int ); void rtt_put_unack_on_list(struct unack ** , struct unack * ); void rtt_delete_unack_from_list(struct unack ** , struct unack * ); +static inline int +tcp_seq_before(guint32 s1, guint32 s2) { + return (gint32)(s1 - s2) < 0; +} + +static inline int +tcp_seq_eq_or_after(guint32 s1, guint32 s2) { + return !tcp_seq_before(s1, s2); +} + +static inline int +tcp_seq_after(guint32 s1, guint32 s2) { + return (s1 != s2) && !tcp_seq_before(s1, s2); +} + #ifdef __cplusplus } |