diff options
author | Irene RĂ¼ngeler <I.Ruengeler@fh-muenster.de> | 2013-12-13 07:25:30 +0000 |
---|---|---|
committer | Irene RĂ¼ngeler <I.Ruengeler@fh-muenster.de> | 2013-12-13 07:25:30 +0000 |
commit | 796bf409b0c286dd76e6ecd5c61d0d947d54b479 (patch) | |
tree | 42d21c7d8b1175adf0f155f5c0fb9f53feb795d5 /ui/qt/sctp_graph_arwnd_dialog.cpp | |
parent | 28e6aa4e8a06299895d7924508a32a895a5454ab (diff) | |
download | wireshark-796bf409b0c286dd76e6ecd5c61d0d947d54b479.tar.gz |
Add dialogs and graphs to analyse SCTP behavior similar to the GTK version.
svn path=/trunk/; revision=54026
Diffstat (limited to 'ui/qt/sctp_graph_arwnd_dialog.cpp')
-rw-r--r-- | ui/qt/sctp_graph_arwnd_dialog.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/ui/qt/sctp_graph_arwnd_dialog.cpp b/ui/qt/sctp_graph_arwnd_dialog.cpp new file mode 100644 index 0000000000..238b58e2d6 --- /dev/null +++ b/ui/qt/sctp_graph_arwnd_dialog.cpp @@ -0,0 +1,141 @@ +#include "sctp_graph_arwnd_dialog.h" +#include "ui_sctp_graph_arwnd_dialog.h" + +#include "sctp_graph_dialog.h" + +SCTPGraphArwndDialog::SCTPGraphArwndDialog(QWidget *parent, sctp_assoc_info_t *assoc, capture_file *cf, int dir) : + QDialog(parent), + ui(new Ui::SCTPGraphArwndDialog), + selected_assoc(assoc), + cap_file_(cf), + direction(dir) +{ + ui->setupUi(this); + this->setWindowTitle(QString("SCTP Data and Adv. Rec. Window over Time: %1 Port1 %2 Port2 %3").arg(cf_get_display_name(cap_file_)).arg(selected_assoc->port1).arg(selected_assoc->port2)); + if ((direction == 1 && selected_assoc->n_array_tsn1 == 0) || (direction == 2 && selected_assoc->n_array_tsn2 == 0)) { + QMessageBox msgBox; + msgBox.setText("No Data Chunks sent"); + msgBox.exec(); + return; + } else { + drawGraph(); + } +} + +SCTPGraphArwndDialog::~SCTPGraphArwndDialog() +{ + delete ui; +} + +void SCTPGraphArwndDialog::drawArwndGraph() +{ + GList *listSACK = NULL, *tlist; + struct sack_chunk_header *sack_header; + struct nr_sack_chunk_header *nr_sack_header; + tsn_t *tsn; + guint8 type; + guint32 arwnd=0; + + if (direction == 1) { + listSACK = g_list_last(selected_assoc->sack1); + startArwnd = selected_assoc->arwnd1; + } else { + listSACK = g_list_last(selected_assoc->sack2); + startArwnd = selected_assoc->arwnd2; + } + while (listSACK) { + tsn = (tsn_t*) (listSACK->data); + tlist = g_list_first(tsn->tsns); + while (tlist) { + type = ((struct chunk_header *)tlist->data)->type; + if (type == SCTP_SACK_CHUNK_ID) { + sack_header =(struct sack_chunk_header *)tlist->data; + arwnd = g_ntohl(sack_header->a_rwnd); + } else if (type == SCTP_NR_SACK_CHUNK_ID) { + nr_sack_header =(struct nr_sack_chunk_header *)tlist->data; + arwnd = g_ntohl(nr_sack_header->a_rwnd); + } + // printf("frame %d arwnd=%d\n", tsn->frame_number, arwnd); + ya.append(arwnd); + xa.append(tsn->secs + tsn->usecs/1000000.0); + fa.append(tsn->frame_number); + tlist = g_list_next(tlist); + } + listSACK = g_list_previous(listSACK); + } + + QCPScatterStyle myScatter; + myScatter.setShape(QCPScatterStyle::ssCircle); + myScatter.setSize(3); + + // create graph and assign data to it: + + // Add Arwnd graph + if (xa.size() > 0) { + QCPGraph *gr = ui->sctpPlot->addGraph(ui->sctpPlot->xAxis, ui->sctpPlot->yAxis); + gr->setName(QString("Arwnd")); + myScatter.setPen(QPen(Qt::red)); + myScatter.setBrush(Qt::red); + ui->sctpPlot->graph(0)->setScatterStyle(myScatter); + ui->sctpPlot->graph(0)->setLineStyle(QCPGraph::lsNone); + ui->sctpPlot->graph(0)->setData(xa, ya); + } + + ui->sctpPlot->xAxis->setLabel("time [secs]"); + ui->sctpPlot->yAxis->setLabel("Advertised Receiver Window [Bytes]"); + + // set axes ranges, so we see all data: + QCPRange myXArwndRange(0, (selected_assoc->max_secs+1)); + // QCPRange myXArwndRange(0, 1); + QCPRange myYArwndRange(0, startArwnd); + ui->sctpPlot->xAxis->setRange(myXArwndRange); + ui->sctpPlot->yAxis->setRange(myYArwndRange); +} + + +void SCTPGraphArwndDialog::drawGraph() +{ + ui->sctpPlot->clearGraphs(); + drawArwndGraph(); + ui->sctpPlot->setInteractions(QCP::iRangeZoom | QCP::iRangeDrag | QCP::iSelectPlottables); + ui->sctpPlot->axisRect(0)->setRangeZoomAxes(ui->sctpPlot->xAxis, ui->sctpPlot->yAxis); + ui->sctpPlot->axisRect(0)->setRangeZoom(Qt::Horizontal); + connect(ui->sctpPlot, SIGNAL(plottableClick(QCPAbstractPlottable*,QMouseEvent*)), this, SLOT(graphClicked(QCPAbstractPlottable*, QMouseEvent*))); + ui->sctpPlot->replot(); +} + + +void SCTPGraphArwndDialog::on_pushButton_4_clicked() +{ + ui->sctpPlot->xAxis->setRange(selected_assoc->min_secs+selected_assoc->min_usecs/1000000.0, selected_assoc->max_secs+selected_assoc->max_usecs/1000000.0); + ui->sctpPlot->yAxis->setRange(0, startArwnd); + ui->sctpPlot->replot(); +} + +void SCTPGraphArwndDialog::graphClicked(QCPAbstractPlottable* plottable, QMouseEvent* event) +{ + if (plottable->name().contains("Arwnd", Qt::CaseInsensitive)) { + double times = ui->sctpPlot->xAxis->pixelToCoord(event->pos().x()); + int i=0; + for (i = 0; i < xa.size(); i++) { + if (times <= xa.value(i)) { + frame_num = fa.at(i); + break; + } + } + if (cap_file_ && frame_num > 0) { + cf_goto_frame(cap_file_, frame_num); + } + + ui->hintLabel->setText(QString("<small><i>Graph %1: arwnd=%2 Time=%3 secs </i></small>") + .arg(plottable->name()) + .arg(ya.value(i)) + .arg(xa.value(i))); + } +} + + +void SCTPGraphArwndDialog::on_saveButton_clicked() +{ + SCTPGraphDialog::save_graph(this, ui->sctpPlot); +} |