Qt: Don't check capture filter for user DLTs

This makes it possible to use a capture filter on an interface
with user DLTs (147-162).

Bug: 11656
Ping-Bug: 11668
Change-Id: Ie9931b27e8dc8ea239e7e04e26d0ae1cacba50c9
Reviewed-on: https://code.wireshark.org/review/12996
Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
This commit is contained in:
Stig Bjørlykke 2016-01-01 18:00:19 +01:00
parent 85fd9df235
commit dfbea5d47c
4 changed files with 24 additions and 17 deletions

View File

@ -205,8 +205,8 @@ CaptureFilterEdit::CaptureFilterEdit(QWidget *parent, bool plain) :
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(initCaptureFilter()));
connect(syntax_thread, SIGNAL(started()), syntax_worker_, SLOT(start()));
connect(syntax_thread, SIGNAL(started()), this, SLOT(checkFilter()));
connect(syntax_worker_, SIGNAL(syntaxResult(QString,bool,QString)),
this, SLOT(setFilterSyntaxState(QString,bool,QString)));
connect(syntax_worker_, SIGNAL(syntaxResult(QString,int,QString)),
this, SLOT(setFilterSyntaxState(QString,int,QString)));
connect(syntax_thread, SIGNAL(finished()), syntax_worker_, SLOT(deleteLater()));
syntax_thread->start();
@ -286,7 +286,7 @@ void CaptureFilterEdit::checkFilter(const QString& text)
}
if (empty) {
setFilterSyntaxState(text, true, QString());
setFilterSyntaxState(text, Empty, QString());
} else {
syntax_worker_->checkFilter(text);
}
@ -304,13 +304,13 @@ void CaptureFilterEdit::initCaptureFilter()
#endif // HAVE_LIBPCAP
}
void CaptureFilterEdit::setFilterSyntaxState(QString filter, bool valid, QString err_msg)
void CaptureFilterEdit::setFilterSyntaxState(QString filter, int state, QString err_msg)
{
bool valid = (state != Invalid);
if (filter.compare(text()) == 0) { // The user hasn't changed the filter
if (valid) {
setSyntaxState(text().isEmpty() ? Empty : Valid);
} else {
setSyntaxState(Invalid);
setSyntaxState((SyntaxState)state);
if (!valid) {
emit pushFilterSyntaxStatus(err_msg);
}
}

View File

@ -50,7 +50,7 @@ private slots:
void initCaptureFilter();
void applyCaptureFilter();
void checkFilter(const QString &text);
void setFilterSyntaxState(QString filter, bool valid, QString err_msg);
void setFilterSyntaxState(QString filter, int state, QString err_msg);
void bookmarkClicked();
private:

View File

@ -29,6 +29,7 @@
#endif
#include "capture_filter_syntax_worker.h"
#include "syntax_line_edit.h"
#include <QMutexLocker>
#include <QSet>
@ -58,7 +59,7 @@ void CaptureFilterSyntaxWorker::start() {
struct bpf_program fcode;
pcap_t *pd;
int pc_err;
bool ok = true;
enum SyntaxLineEdit::SyntaxState state = SyntaxLineEdit::Valid;
QString err_str;
data_mtx_.lock();
@ -72,7 +73,7 @@ void CaptureFilterSyntaxWorker::start() {
data_mtx_.unlock();
if (global_capture_opts.num_selected < 1) {
emit syntaxResult(filter, false, QString("No interfaces selected"));
emit syntaxResult(filter, SyntaxLineEdit::Invalid, QString("No interfaces selected"));
DEBUG_SYNTAX_CHECK("unknown", "no interfaces");
continue;
}
@ -82,7 +83,13 @@ void CaptureFilterSyntaxWorker::start() {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, if_idx);
if (!device.locked && device.selected) {
active_dlts.insert(device.active_dlt);
if (device.active_dlt >= DLT_USER0 && device.active_dlt <= DLT_USER15) {
// Capture filter for DLT_USER is unknown
state = SyntaxLineEdit::Deprecated;
err_str = "Unable to check capture filter";
} else {
active_dlts.insert(device.active_dlt);
}
}
}
@ -97,7 +104,7 @@ void CaptureFilterSyntaxWorker::start() {
if (pc_err) {
DEBUG_SYNTAX_CHECK("unknown", "known bad");
ok = false;
state = SyntaxLineEdit::Invalid;
err_str = pcap_geterr(pd);
} else {
DEBUG_SYNTAX_CHECK("unknown", "known good");
@ -106,9 +113,9 @@ void CaptureFilterSyntaxWorker::start() {
pcap_compile_mtx_.unlock();
if (!ok) break;
if (state == SyntaxLineEdit::Invalid) break;
}
emit syntaxResult(filter, ok, err_str);
emit syntaxResult(filter, state, err_str);
DEBUG_SYNTAX_CHECK("known", "idle");
}
@ -124,7 +131,7 @@ void CaptureFilterSyntaxWorker::checkFilter(const QString &filter)
DEBUG_SYNTAX_CHECK("received", "?");
data_cond_.wakeOne();
#else
emit syntaxResult(filter, true, QString("Syntax checking unavailable"));
emit syntaxResult(filter, SyntaxLineEdit::Deprecated, QString("Syntax checking unavailable"));
#endif // HAVE_LIBPCAP
}

View File

@ -43,7 +43,7 @@ private:
QString filter_text_;
signals:
void syntaxResult(QString filter, bool valid, QString err_msg);
void syntaxResult(QString filter, int state, QString err_msg);
};
#endif // CAPTURE_FILTER_SYNTAX_WORKER_H