aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Thacker <johnthacker@gmail.com>2023-07-16 08:04:26 -0400
committerGuy Harris <gharris@sonic.net>2023-07-16 19:42:19 +0000
commitdcc9cbffefe0598eadec11cbc1869943a26219c5 (patch)
tree740c21de0e32944ea2459885e3063a11ed47e099
parent39a0efc3ad5f1c09dad7670b34b89818e7bfdaf8 (diff)
Qt: Include a checkbox to export without depended upon packets
Add a checkbox to allow users to Export Specified Packets without including frames which the displayed frames depend upon. Note that exporting Marked Range and User Range include frames within the range that any displayed frame depends upon. What we almost surely want instead is to include any frame that a displayed frame within the range depends upon. These are often similar, but not the same, especially at the beginning and end. Fix #7667
-rw-r--r--ui/packet_range.c26
-rw-r--r--ui/packet_range.h2
-rw-r--r--ui/qt/packet_range_group_box.cpp49
-rw-r--r--ui/qt/packet_range_group_box.h1
-rw-r--r--ui/qt/packet_range_group_box.ui20
5 files changed, 96 insertions, 2 deletions
diff --git a/ui/packet_range.c b/ui/packet_range.c
index 7696e87f23..a24e7e6bad 100644
--- a/ui/packet_range.c
+++ b/ui/packet_range.c
@@ -50,6 +50,7 @@ static void packet_range_calc(packet_range_t *range) {
range->displayed_marked_cnt = 0;
range->displayed_mark_range_cnt = 0;
range->displayed_plus_dependents_cnt = 0;
+ range->displayed_plus_dependents_mark_range_cnt = 0;
range->displayed_ignored_cnt = 0;
range->displayed_ignored_selection_range_cnt = 0;
range->displayed_ignored_marked_cnt = 0;
@@ -145,6 +146,10 @@ static void packet_range_calc(packet_range_t *range) {
range->displayed_ignored_mark_range_cnt++;
}
}
+ if (packet->passed_dfilter ||
+ packet->dependent_of_displayed) {
+ range->displayed_plus_dependents_mark_range_cnt++;
+ }
}
}
@@ -160,6 +165,7 @@ static void packet_range_calc_user(packet_range_t *range) {
range->user_range_cnt = 0;
range->ignored_user_range_cnt = 0;
range->displayed_user_range_cnt = 0;
+ range->displayed_plus_dependents_user_range_cnt = 0;
range->displayed_ignored_user_range_cnt = 0;
ws_assert(range->cf != NULL);
@@ -198,6 +204,10 @@ static void packet_range_calc_user(packet_range_t *range) {
range->displayed_ignored_user_range_cnt++;
}
}
+ if (packet->passed_dfilter ||
+ packet->dependent_of_displayed) {
+ range->displayed_plus_dependents_user_range_cnt++;
+ }
}
}
}
@@ -338,6 +348,22 @@ range_process_e packet_range_process_packet(packet_range_t *range, frame_data *f
* Try next, but only if we're not including dependent packets and this
* packet happens to be a dependency on something that is displayed.
*/
+ /* XXX: We only track if a frame is depended upon by some displayed frame,
+ * not which of the other frames depend on it.
+ * For Selected and Marked frames, we never include depended upon packets,
+ * because we already returned above if the frame wasn't selected or
+ * marked.
+ * For Marked Range and User Range, we include packets in the range that
+ * any frame displayed, not just ones in the range, depend upon.
+ * We also don't include any frames outside the range that frames in the
+ * range depend upon. So we don't include some depended on frames we
+ * should, but include some unnecessary ones, with the problems mostly
+ * occuring at the beginning and end of the ranges.
+ * For ignored packets, since we don't dissect them, we don't know
+ * anything about packets they depend upon, which is helpful as we
+ * don't have to calculate more counts based on interaction terms. If
+ * someone wants to include those, then don't ignore the packet.
+ */
if ((range->process_filtered && fdata->passed_dfilter == FALSE) &&
!(range->include_dependents && fdata->dependent_of_displayed)) {
return range_process_next;
diff --git a/ui/packet_range.h b/ui/packet_range.h
index 6716aca8b0..8839b03ad9 100644
--- a/ui/packet_range.h
+++ b/ui/packet_range.h
@@ -68,6 +68,8 @@ typedef struct packet_range_tag {
guint32 displayed_marked_cnt;
guint32 displayed_mark_range_cnt;
guint32 displayed_user_range_cnt;
+ guint32 displayed_plus_dependents_mark_range_cnt;
+ guint32 displayed_plus_dependents_user_range_cnt;
guint32 displayed_selection_range_cnt;
guint32 displayed_ignored_cnt;
guint32 displayed_ignored_marked_cnt;
diff --git a/ui/qt/packet_range_group_box.cpp b/ui/qt/packet_range_group_box.cpp
index 9821723c2e..c561d59b68 100644
--- a/ui/qt/packet_range_group_box.cpp
+++ b/ui/qt/packet_range_group_box.cpp
@@ -32,6 +32,14 @@ PacketRangeGroupBox::~PacketRangeGroupBox()
void PacketRangeGroupBox::initRange(packet_range_t *range, QString selRange) {
if (!range) return;
+ range_ = nullptr;
+ // Set this before setting range_ so that on_dependedCheckBox_toggled
+ // doesn't trigger an extra updateCounts().
+ // (We could instead manually connect and disconnect signals and slots
+ // after getting a range, instead of checking for range_ in all the
+ // slots.)
+ pr_ui_->dependedCheckBox->setChecked(range->include_dependents);
+
range_ = range;
if (range_->process_filtered) {
@@ -64,6 +72,7 @@ void PacketRangeGroupBox::updateCounts() {
bool can_select;
bool selected_packets;
int ignored_cnt = 0, displayed_ignored_cnt = 0;
+ int depended_cnt = 0;
int label_count;
if (!range_ || !range_->cf) return;
@@ -169,7 +178,11 @@ void PacketRangeGroupBox::updateCounts() {
label_count -= range_->ignored_mark_range_cnt;
}
pr_ui_->ftlCapturedLabel->setText(QString("%1").arg(label_count));
- label_count = range_->displayed_mark_range_cnt;
+ if (range_->include_dependents) {
+ label_count = range_->displayed_plus_dependents_mark_range_cnt;
+ } else {
+ label_count = range_->displayed_mark_range_cnt;
+ }
if (range_->remove_ignored) {
label_count -= range_->displayed_ignored_mark_range_cnt;
}
@@ -191,7 +204,11 @@ void PacketRangeGroupBox::updateCounts() {
label_count -= range_->ignored_user_range_cnt;
}
pr_ui_->rangeCapturedLabel->setText(QString("%1").arg(label_count));
- label_count = range_->displayed_user_range_cnt;
+ if (range_->include_dependents) {
+ label_count = range_->displayed_plus_dependents_user_range_cnt;
+ } else {
+ label_count = range_->displayed_user_range_cnt;
+ }
if (range_->remove_ignored) {
label_count -= range_->displayed_ignored_user_range_cnt;
}
@@ -259,6 +276,26 @@ void PacketRangeGroupBox::updateCounts() {
pr_ui_->ignoredCapturedLabel->setText(QString("%1").arg(ignored_cnt));
pr_ui_->ignoredDisplayedLabel->setText(QString("%1").arg(displayed_ignored_cnt));
+ // Depended upon Displayed (no effect for Captured)
+ switch(range_->process) {
+ case(range_process_all):
+ depended_cnt = range_->displayed_plus_dependents_cnt - range_->displayed_cnt;
+ break;
+ case(range_process_marked_range):
+ depended_cnt = range_->displayed_plus_dependents_mark_range_cnt - range_->displayed_mark_range_cnt;
+ break;
+ case(range_process_user_range):
+ depended_cnt = range_->displayed_plus_dependents_user_range_cnt - range_->displayed_user_range_cnt;
+ break;
+ default:
+ depended_cnt = 0;
+ break;
+ }
+
+ pr_ui_->dependedCheckBox->setEnabled(depended_cnt > 0);
+ pr_ui_->dependedDisplayedLabel->setEnabled(depended_cnt > 0);
+ pr_ui_->dependedDisplayedLabel->setText(QString("%1").arg(depended_cnt));
+
if (orig_ss != syntax_state_) {
pr_ui_->rangeLineEdit->setSyntaxState(syntax_state_);
emit validityChanged(isValid());
@@ -330,3 +367,11 @@ void PacketRangeGroupBox::on_ignoredCheckBox_toggled(bool checked)
if (range_) range_->remove_ignored = checked ? TRUE : FALSE;
updateCounts();
}
+
+void PacketRangeGroupBox::on_dependedCheckBox_toggled(bool checked)
+{
+ if (range_) {
+ range_->include_dependents = checked ? TRUE : FALSE;
+ updateCounts();
+ }
+}
diff --git a/ui/qt/packet_range_group_box.h b/ui/qt/packet_range_group_box.h
index 9a7ba0ccb2..1912d71d5f 100644
--- a/ui/qt/packet_range_group_box.h
+++ b/ui/qt/packet_range_group_box.h
@@ -65,6 +65,7 @@ private slots:
void on_capturedButton_toggled(bool checked);
void on_displayedButton_toggled(bool checked);
void on_ignoredCheckBox_toggled(bool checked);
+ void on_dependedCheckBox_toggled(bool checked);
};
#endif // PACKET_RANGE_GROUP_BOX_H
diff --git a/ui/qt/packet_range_group_box.ui b/ui/qt/packet_range_group_box.ui
index 2371175c72..59847939fc 100644
--- a/ui/qt/packet_range_group_box.ui
+++ b/ui/qt/packet_range_group_box.ui
@@ -87,6 +87,16 @@
</property>
</widget>
</item>
+ <item row="8" column="0" colspan="2">
+ <widget class="QCheckBox" name="dependedCheckBox">
+ <property name="text">
+ <string>Include &amp;depended upon packets</string>
+ </property>
+ <property name="toolTip">
+ <string>Also include packets depended upon, such as those used to reassemble displayed packets</string>
+ </property>
+ </widget>
+ </item>
<item row="3" column="3">
<widget class="QLabel" name="markedDisplayedLabel">
<property name="text">
@@ -243,6 +253,16 @@
</property>
</widget>
</item>
+ <item row="8" column="3">
+ <widget class="QLabel" name="dependedDisplayedLabel">
+ <property name="text">
+ <string>-</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<customwidgets>