summaryrefslogtreecommitdiffstats
path: root/ui/qt/widgets/traffic_tree.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-09-19 04:14:26 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-09-19 04:14:26 +0000
commitc4e8a3222648fcf22ca207f1815ebbf7cd144eeb (patch)
tree93d5c6aa93d9987680dd1adad5685e2ad698f223 /ui/qt/widgets/traffic_tree.cpp
parentAdding upstream version 4.2.6. (diff)
downloadwireshark-c4e8a3222648fcf22ca207f1815ebbf7cd144eeb.tar.xz
wireshark-c4e8a3222648fcf22ca207f1815ebbf7cd144eeb.zip
Adding upstream version 4.4.0.upstream/4.4.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ui/qt/widgets/traffic_tree.cpp')
-rw-r--r--ui/qt/widgets/traffic_tree.cpp56
1 files changed, 52 insertions, 4 deletions
diff --git a/ui/qt/widgets/traffic_tree.cpp b/ui/qt/widgets/traffic_tree.cpp
index be154d7d..4325e556 100644
--- a/ui/qt/widgets/traffic_tree.cpp
+++ b/ui/qt/widgets/traffic_tree.cpp
@@ -204,7 +204,7 @@ void TrafficTreeHeaderView::columnTriggered(bool checked)
for (int col = 0; col < tree->dataModel()->columnCount(); col++) {
if (proxy->columnVisible(col)) {
visible << col;
- gchar *nr = qstring_strdup(QString::number(col));
+ char *nr = qstring_strdup(QString::number(col));
*_recentColumnList = g_list_append(*_recentColumnList, nr);
}
}
@@ -473,7 +473,35 @@ bool TrafficDataFilterProxy::lessThan(const QModelIndex &source_left, const QMod
int addressTypeA = model->data(source_left, ATapDataModel::DATA_ADDRESS_TYPE).toInt();
int addressTypeB = model->data(source_right, ATapDataModel::DATA_ADDRESS_TYPE).toInt();
if (addressTypeA != 0 && addressTypeB != 0 && addressTypeA != addressTypeB) {
- result = addressTypeA < addressTypeB;
+
+ /* Handle subnets when they are compared to IP addresses */
+ if ( (addressTypeA == AT_STRINGZ) && (addressTypeB == AT_IPv4) ) {
+ QString subnet = datA.toString();
+ qint64 lpart = subnet.indexOf("/");
+ ws_in4_addr ip4addr;
+
+ if(ws_inet_pton4(subnet.left(lpart).toUtf8().data(), &ip4addr)) {
+ quint32 valA = g_ntohl(ip4addr);
+ quint32 valB = model->data(source_right, ATapDataModel::DATA_IPV4_INTEGER).value<quint32>();
+ result = valA < valB;
+ identical = valA == valB;
+ }
+ // else: never supposed to happen
+ } else if ( (addressTypeA == AT_IPv4) && (addressTypeB == AT_STRINGZ) ) {
+ QString subnet = datB.toString();
+ qint64 lpart = subnet.indexOf("/");
+ ws_in4_addr ip4addr;
+ if(ws_inet_pton4(subnet.left(lpart).toUtf8().data(), &ip4addr)) {
+ quint32 valA = model->data(source_left, ATapDataModel::DATA_IPV4_INTEGER).value<quint32>();
+ quint32 valB = g_ntohl(ip4addr);
+ result = valA < valB;
+ identical = valA == valB;
+ }
+ // else: never supposed to happen
+ } else {
+ result = addressTypeA < addressTypeB;
+ }
+
} else if (addressTypeA != 0 && addressTypeA == addressTypeB) {
if (addressTypeA == AT_IPv4) {
@@ -693,8 +721,28 @@ QMenu * TrafficTree::createActionSubMenu(FilterAction::Action cur_action, QModel
foreach (FilterAction::ActionType at, FilterAction::actionTypes()) {
if (isConversation && conv_item) {
QMenu *subsubmenu = subMenu->addMenu(FilterAction::actionTypeName(at));
- if (hasConvId && (cur_action == FilterAction::ActionApply || cur_action == FilterAction::ActionPrepare)) {
- QString filter = QString("%1.stream eq %2").arg(conv_item->ctype == CONVERSATION_TCP ? "tcp" : "udp").arg(conv_item->conv_id);
+
+ /* For IP, ensure subnets-like conversations won't enable Stream ID filters (!CONV_ID_UNSET) */
+ if (hasConvId && (conv_item->conv_id!=CONV_ID_UNSET) && (cur_action == FilterAction::ActionApply || cur_action == FilterAction::ActionPrepare)) {
+ QString filter;
+ switch (conv_item->ctype) {
+ case CONVERSATION_TCP:
+ filter = QString("%1.stream eq %2").arg("tcp").arg(conv_item->conv_id);
+ break;
+ case CONVERSATION_UDP:
+ filter = QString("%1.stream eq %2").arg("udp").arg(conv_item->conv_id);
+ break;
+ case CONVERSATION_IP:
+ filter = QString("%1.stream eq %2").arg("ip").arg(conv_item->conv_id);
+ break;
+ case CONVERSATION_IPV6:
+ filter = QString("%1.stream eq %2").arg("ipv6").arg(conv_item->conv_id);
+ break;
+ case CONVERSATION_ETH:
+ default:
+ filter = QString("%1.stream eq %2").arg("eth").arg(conv_item->conv_id);
+ break;
+ }
FilterAction * act = new FilterAction(subsubmenu, cur_action, at, tr("Filter on stream id"));
act->setProperty("filter", filter);
subsubmenu->addAction(act);