diff options
author | Martin Mathieson <martin.r.mathieson@googlemail.com> | 2017-12-03 13:49:36 +0000 |
---|---|---|
committer | Martin Mathieson <martin.r.mathieson@googlemail.com> | 2017-12-09 13:58:19 +0000 |
commit | d96ef7ed05a9f3219742699988faae3889334c85 (patch) | |
tree | 8c5117e6c7e78276c91a9bfe12d797c986a768fd | |
parent | f8203771ec1580013e8de21e6286a33c330f08e3 (diff) |
Allow switching direction in LTE RLC graph
Change-Id: I1681089aebe7f00b2b84ece00c53a3bf8769d50b
Reviewed-on: https://code.wireshark.org/review/24682
Petri-Dish: Martin Mathieson <martin.r.mathieson@googlemail.com>
Reviewed-by: Martin Mathieson <martin.r.mathieson@googlemail.com>
-rw-r--r-- | ui/qt/lte_rlc_graph_dialog.cpp | 44 | ||||
-rw-r--r-- | ui/qt/lte_rlc_graph_dialog.h | 9 | ||||
-rw-r--r-- | ui/qt/lte_rlc_graph_dialog.ui | 21 | ||||
-rw-r--r-- | ui/qt/lte_rlc_statistics_dialog.cpp | 2 | ||||
-rw-r--r-- | ui/tap-rlc-graph.c | 15 | ||||
-rw-r--r-- | ui/tap-rlc-graph.h | 8 |
6 files changed, 74 insertions, 25 deletions
diff --git a/ui/qt/lte_rlc_graph_dialog.cpp b/ui/qt/lte_rlc_graph_dialog.cpp index 922a9bcb37..ed86aabc22 100644 --- a/ui/qt/lte_rlc_graph_dialog.cpp +++ b/ui/qt/lte_rlc_graph_dialog.cpp @@ -102,6 +102,8 @@ LteRlcGraphDialog::LteRlcGraphDialog(QWidget &parent, CaptureFile &cf, bool chan ctx_menu_->addAction(ui->actionDragZoom); // ctx_menu_->addAction(ui->actionToggleTimeOrigin); ctx_menu_->addAction(ui->actionCrosshairs); + ctx_menu_->addSeparator(); + ctx_menu_->addAction(ui->actionSwitchDirection); // Zero out this struct. memset(&graph_, 0, sizeof(graph_)); @@ -121,7 +123,8 @@ LteRlcGraphDialog::~LteRlcGraphDialog() // Set the channel information that this graph should show. void LteRlcGraphDialog::setChannelInfo(guint16 ueid, guint8 rlcMode, - guint16 channelType, guint16 channelId, guint8 direction) + guint16 channelType, guint16 channelId, guint8 direction, + bool maybe_empty) { graph_.ueid = ueid; graph_.rlcMode = rlcMode; @@ -130,16 +133,16 @@ void LteRlcGraphDialog::setChannelInfo(guint16 ueid, guint8 rlcMode, graph_.channelSet = TRUE; graph_.direction = direction; - completeGraph(); + completeGraph(maybe_empty); } // Once channel details are known, complete the graph with details that depend upon the channel. -void LteRlcGraphDialog::completeGraph() +void LteRlcGraphDialog::completeGraph(bool may_be_empty) { QCustomPlot *rp = ui->rlcPlot; // If no channel chosen already, try to use currently selected frame. - findChannel(); + findChannel(may_be_empty); // Set window title here. if (graph_.channelSet) { @@ -194,7 +197,7 @@ bool LteRlcGraphDialog::compareHeaders(rlc_segment *seg) } // Look for channel to plot based upon currently selected frame. -void LteRlcGraphDialog::findChannel() +void LteRlcGraphDialog::findChannel(bool may_fail) { // Temporarily disconnect mouse move signals. QCustomPlot *rp = ui->rlcPlot; @@ -205,7 +208,9 @@ void LteRlcGraphDialog::findChannel() // Rescan for channel data. rlc_graph_segment_list_free(&graph_); if (!rlc_graph_segment_list_get(cap_file_.capFile(), &graph_, graph_.channelSet, - &err_string)) { + &err_string) && + !may_fail) { + // Pop up an error box to report error. simple_error_message_box("%s", err_string); g_free(err_string); @@ -392,6 +397,11 @@ void LteRlcGraphDialog::keyPressEvent(QKeyEvent *event) case Qt::Key_Z: on_actionDragZoom_triggered(); break; + + case Qt::Key_D: + on_actionSwitchDirection_triggered(); + break; + } WiresharkDialog::keyPressEvent(event); @@ -495,6 +505,7 @@ void LteRlcGraphDialog::panAxes(int x_pixels, int y_pixels) } } +// Given a selected rect in pixels, work out what this should be in graph units. // Don't accidentally zoom into a 1x1 rect if you happen to click on the graph // in zoom mode. const int min_zoom_pixels_ = 20; @@ -614,6 +625,7 @@ void LteRlcGraphDialog::mouseMoved(QMouseEvent *event) } else { if (event && rubber_band_ && rubber_band_->isVisible()) { + // Work out zoom based upon selected region (in pixels). rubber_band_->setGeometry(QRect(rb_origin_, event->pos()).normalized()); QRectF zoom_ranges = getZoomRanges(QRect(rb_origin_, event->pos())); if (zoom_ranges.width() > 0.0 && zoom_ranges.height() > 0.0) { @@ -640,6 +652,7 @@ void LteRlcGraphDialog::mouseReleased(QMouseEvent *event) if (rubber_band_) { rubber_band_->hide(); if (!mouse_drags_) { + resetAxes(); QRectF zoom_ranges = getZoomRanges(QRect(rb_origin_, event->pos())); if (zoom_ranges.width() > 0.0 && zoom_ranges.height() > 0.0) { rp->xAxis->setRangeLower(zoom_ranges.x()); @@ -779,6 +792,20 @@ void LteRlcGraphDialog::on_actionMoveDown1_triggered() panAxes(0, -1); } +void LteRlcGraphDialog::on_actionSwitchDirection_triggered() +{ + // Channel settings exactly the same, except change direction. + // N.B. do not fail and close if there are no packets in opposite direction. + setChannelInfo(graph_.ueid, + graph_.rlcMode, + graph_.channelType, + graph_.channelId, + !graph_.direction, + true /* maybe_empty */); +} + + + // Switch between zoom/drag. void LteRlcGraphDialog::on_actionDragZoom_triggered() { @@ -808,6 +835,11 @@ void LteRlcGraphDialog::on_resetButton_clicked() resetAxes(); } +void LteRlcGraphDialog::on_otherDirectionButton_clicked() +{ + on_actionSwitchDirection_triggered(); +} + // No need to register tap listeners here. This is done // in calls to the common functions in ui/tap-rlc-graph.c diff --git a/ui/qt/lte_rlc_graph_dialog.h b/ui/qt/lte_rlc_graph_dialog.h index 51a004a3b3..2929312a09 100644 --- a/ui/qt/lte_rlc_graph_dialog.h +++ b/ui/qt/lte_rlc_graph_dialog.h @@ -46,7 +46,8 @@ public: ~LteRlcGraphDialog(); void setChannelInfo(guint16 ueid, guint8 rlcMode, - guint16 channelType, guint16 channelId, guint8 direction); + guint16 channelType, guint16 channelId, guint8 direction, + bool maybe_empty=false); signals: void goToPacket(int packet_num); @@ -76,11 +77,11 @@ private: QCPItemTracer *tracer_; guint32 packet_num_; - void completeGraph(); + void completeGraph(bool may_be_empty=false); bool compareHeaders(rlc_segment *seg); - void findChannel(); + void findChannel(bool may_fail=false); void fillGraph(); void zoomAxes(bool in); @@ -101,6 +102,7 @@ private slots: void on_dragRadioButton_toggled(bool checked); void on_zoomRadioButton_toggled(bool checked); void on_resetButton_clicked(); + void on_otherDirectionButton_clicked(); void on_actionReset_triggered(); void on_actionZoomIn_triggered(); @@ -118,6 +120,7 @@ private slots: void on_actionMoveDown100_triggered(); void on_actionGoToPacket_triggered(); void on_actionCrosshairs_triggered(); + void on_actionSwitchDirection_triggered(); }; #endif // LTE_RLC_GRAPH_DIALOG_H diff --git a/ui/qt/lte_rlc_graph_dialog.ui b/ui/qt/lte_rlc_graph_dialog.ui index eba63ae848..1d6927f6c6 100644 --- a/ui/qt/lte_rlc_graph_dialog.ui +++ b/ui/qt/lte_rlc_graph_dialog.ui @@ -113,6 +113,16 @@ </property> </widget> </item> + <item> + <widget class="QPushButton" name="otherDirectionButton"> + <property name="toolTip"> + <string><html><head/><body><p>Switch the direction of the connection (view the opposite flow).</p></body></html></string> + </property> + <property name="text"> + <string>Switch Direction</string> + </property> + </widget> + </item> </layout> </item> <item> @@ -346,6 +356,17 @@ <string>Shift+X</string> </property> </action> + <action name="actionSwitchDirection"> + <property name="text"> + <string>Switch Direction</string> + </property> + <property name="toolTip"> + <string>Switch direction (swap between UL and DL)</string> + </property> + <property name="shortcut"> + <string>D</string> + </property> + </action> </widget> <customwidgets> <customwidget> diff --git a/ui/qt/lte_rlc_statistics_dialog.cpp b/ui/qt/lte_rlc_statistics_dialog.cpp index f289eaf3ef..f66a51e43a 100644 --- a/ui/qt/lte_rlc_statistics_dialog.cpp +++ b/ui/qt/lte_rlc_statistics_dialog.cpp @@ -32,7 +32,6 @@ #include <QTreeWidgetItem> #include <QPushButton> -#include "lte_rlc_graph_dialog.h" #include <ui/qt/utils/qt_ui_utils.h> #include "wireshark_application.h" @@ -936,6 +935,7 @@ void LteRlcStatisticsDialog::launchDLGraphButtonClicked() } } + // Store filter from signal. void LteRlcStatisticsDialog::filterUpdated(QString filter) { diff --git a/ui/tap-rlc-graph.c b/ui/tap-rlc-graph.c index 817b4c08e9..0184191688 100644 --- a/ui/tap-rlc-graph.c +++ b/ui/tap-rlc-graph.c @@ -1,8 +1,7 @@ -/* tap-rlc-stream.c - * LTE RLC stream statistics +/* tap-rlc-graph.c + * LTE RLC channel graph info * * Originally from tcp_graph.c by Pavel Mores <pvl@uh.cz> - * Win32 port: rwh@unifiedtech.com * * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> @@ -172,8 +171,6 @@ rlc_lte_tap_info *select_rlc_lte_session(capture_file *cf, hdrs->num = fdata->num; hdrs->rel_secs = (guint32) rel_ts.secs; hdrs->rel_usecs = rel_ts.nsecs/1000; - hdrs->abs_secs = (guint32) fdata->abs_ts.secs; - hdrs->abs_usecs = fdata->abs_ts.nsecs/1000; hdrs->ueid = th.rlchdrs[0]->ueid; hdrs->channelType = th.rlchdrs[0]->channelType; @@ -203,8 +200,6 @@ int rlc_lte_tap_for_graph_data(void *pct, packet_info *pinfo, epan_dissect_t *ed segment->num = pinfo->num; segment->rel_secs = (guint32) pinfo->rel_ts.secs; segment->rel_usecs = pinfo->rel_ts.nsecs/1000; - segment->abs_secs = (guint32) pinfo->abs_ts.secs; - segment->abs_usecs = pinfo->abs_ts.nsecs/1000; segment->ueid = rlchdr->ueid; segment->channelType = rlchdr->channelType; @@ -254,7 +249,7 @@ gboolean rlc_graph_segment_list_get(capture_file *cf, struct rlc_graph *g, gbool struct rlc_segment current; GString *error_string; - g_log(NULL, G_LOG_LEVEL_DEBUG, "graph_segment_list_get()"); + g_log(NULL, G_LOG_LEVEL_DEBUG, "rlc_graph_segment_list_get()"); if (!cf || !g) { /* Really shouldn't happen */ @@ -276,8 +271,8 @@ gboolean rlc_graph_segment_list_get(capture_file *cf, struct rlc_graph *g, gbool } - /* rescan all the packets and pick up all interesting RLC headers. - * we only filter for rlc-lte here for speed and do the actual compare + /* Rescan all the packets and pick up all interesting RLC headers. + * We only filter for rlc-lte here for speed and do the actual compare * in the tap listener */ diff --git a/ui/tap-rlc-graph.h b/ui/tap-rlc-graph.h index 679b89717e..fdd8660fe9 100644 --- a/ui/tap-rlc-graph.h +++ b/ui/tap-rlc-graph.h @@ -35,11 +35,9 @@ extern "C" { struct rlc_segment { struct rlc_segment *next; - guint32 num; /* framenum */ - guint32 rel_secs; - guint32 rel_usecs; - guint32 abs_secs; - guint32 abs_usecs; + guint32 num; /* framenum */ + guint32 rel_secs; + guint32 rel_usecs; gboolean isControlPDU; guint16 SN; |