summaryrefslogtreecommitdiff
path: root/ui/qt/sctp_graph_arwnd_dialog.cpp
diff options
context:
space:
mode:
authorIrene RĂ¼ngeler <I.Ruengeler@fh-muenster.de>2013-12-13 07:25:30 +0000
committerIrene RĂ¼ngeler <I.Ruengeler@fh-muenster.de>2013-12-13 07:25:30 +0000
commit796bf409b0c286dd76e6ecd5c61d0d947d54b479 (patch)
tree42d21c7d8b1175adf0f155f5c0fb9f53feb795d5 /ui/qt/sctp_graph_arwnd_dialog.cpp
parent28e6aa4e8a06299895d7924508a32a895a5454ab (diff)
downloadwireshark-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.cpp141
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);
+}