wireshark/epan/dfilter
Guy Harris 659cf0527a UATs could be put into "categories". The categories were defined only
implicitly by the #define name and string they were defined to; not all
UATs neatly fit into any of the categories, so some of them were put
into categories that weren't obviously correct for them, and one - the
display filter macro UAT - wasn't put into any category at all (which
caused crashes when editing them, as the GUI code that handled UAT
changes from a dialog assumed the category field was non-null).

The category was, in practice, used only to decide, in the
aforementioned GUI code, whether the packet summary pane needed to be
updated or not.  It also offered no option of "don't update the packet
summary pane *and* don't redissect anything", which is what would be
appropriate for the display filter macro UAT.

Replace the category with a set of fields indicating what the UAT
affects; we currently offer "dissection", which applies to most UATs
(any UAT in libwireshark presumably affects dissection at a minimum) and
"the set of named fields that exist".  Changing any UAT that affects
dissection requires a redissection; changing any UAT that affects the
set of named fields that exist requires a redissection *and* rebuilding
the packet summary pane.

Perhaps we also need "filtering", so that if you change a display filter
macro, we re-filter, in case the display is currently filtered with a
display filter that uses a macro that changed.

svn path=/trunk/; revision=43603
2012-07-08 01:00:46 +00:00
..
Makefile.am Add a "-build" argument to checkAPIs.pl. Use that argument when building 2012-04-04 20:46:49 +00:00
Makefile.common Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
Makefile.nmake Add a "-build" argument to checkAPIs.pl. Use that argument when building 2012-04-04 20:46:49 +00:00
README.dfilter ethereal to wireshark changes 2006-06-17 12:04:30 +00:00
dfilter-int.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
dfilter-macro.c UATs could be put into "categories". The categories were defined only 2012-07-08 01:00:46 +00:00
dfilter-macro.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
dfilter.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
dfilter.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
dfunctions.c Add len() function to dfilter. For now only support FT_STRING* 2012-06-29 11:11:24 +00:00
dfunctions.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
dfvm.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
dfvm.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
drange.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
drange.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
gencode.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
gencode.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
grammar.lemon Support multiple relation test without logic and (python-like) 2012-06-19 12:12:41 +00:00
scanner.l From Jakub Zawadzki : 2011-09-07 11:03:47 +00:00
semcheck.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
semcheck.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-function.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-function.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-integer.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-pointer.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-range.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-range.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-string.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-test.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
sttype-test.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
syntax-tree.c Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00
syntax-tree.h Update Free Software Foundation address. 2012-06-28 22:56:06 +00:00

README.dfilter

$Id$

How does the display filter logic work?
=======================================

scanner.l looks at the display filter string and finds reserved words,
punctuation, etc. This information gets passed to the parser produced by
grammar.lemon. The grammar's job is to create a syntax-tree out of the
information provided by the scanner. The syntax tree organizes the
information from the scanner into something that is grammatical in the
dfilter language.

The routines in semcheck.c then check the semantics of the syntax tree, and do
any modifications necessary to the syntax tree to make the dfilter work....
things like converting val_strings to integers, etc.

Then gencode.c converts the syntax tree into a list of "dfvm" (display filter
virtual machine) instructions. These dfvm instructions are what runs the
display filter engine.

Example: add an 'in' display filter operation
=============================================

This example has been discussed on wireshark-dev in April 2004. It illustrates
how a more complex operation can be added to the display filter language.

Question:

	If I want to add an 'in' display filter operation, I need to define
	several things. This can happen in different ways. For instance,
	every value from the "in" value collection will result in a test.
	There are 2 options here, either a test for a single value:

		(x in {a b c})

	or a test for a value in a given range:

		(x in {a ... z})

	or even a combination of both. The former example can be reduced to:

		((x == a) or (x == b) or (x == c))

	while the latter can be reduced to

		((x >= MIN(a, z)) and (x <= MAX(a, z)))

	I understand that I can replace "x in {" with the following steps:
	first store x in the "in" test buffer, then add "(" to the display
	filter expression internally.

	Similarly I can replace the closing brace "}" with the following steps:
	release x from the "in" test buffer and then add ")" to the display
	filter expression internally.

	How could I do this?

Answer:

	This could be done in grammar.lemon. The grammar would produce syntax
	tree nodes, combining them with "or", when it is given tokens that
	represent the "in" syntax.

	It could also be done later in the process, maybe in semcheck.c. But
	if you can do it earlier, in grammar.lemon, then you shouldn't have to
	worry about modifying anything in semcheck.c, as the syntax tree that
	is passed to semcheck.c won't contain any new type of operators... just
	lots of nodes combined with "or".

How to add an operator FOO to the display filter language?
==========================================================

Go to wireshark/epan/dfilter/

Edit grammar.lemon and add the operator. Add the operator FOO and the test logic (defining TEST_OP_FOO).

Edit scanner.l and add the operator name(s) hence defining TOKEN_TEST_FOO. Also update the simple() or add the new operand's code.

Edit sttype-test.h and add the TEST_OP_FOO to the list of test operations.

Edit sttype-test.c and add TEST_OP_FOO to the num_operands() method.

Edit gencode.c, add TEST_OP_FOO in the gen_test() method by defining ANY_FOO.

Edit dfvm.h and add ANY_FOO to the enum dfvm_opcode_t structure.

Edit dfvm.c and add ANY_FOO to dfvm_dump() (for the dftest display filter test binary), to dfvm_apply() hence defining the methods fvalue_foo().

Edit semcheck.c and look at the check_relation_XXX() methods if they still apply to the foo operator; if not, amend the code. Start from the check_test() method to discover the logic.

Go to wireshark/epan/ftypes/

Edit ftypes.h and declare the fvalue_foo(), ftype_can_foo() and fvalue_foo() methods. Add the cmp_foo() method to the struct _ftype_t.

This is the first time that a make in wireshark/epan/dfilter/ can succeed. If it fails, then some code in the previously edited files must be corrected.

Edit ftypes.c and define the fvalue_foo() method with its associated logic. Define also the ftype_can_foo() and fvalue_foo() methods.

Edit all ftype-*.c files and add the required fvalue_foo() methods.

This is the point where you should be able to compile without errors in wireshark/epan/ftypes/. If not, first fix the errors.

Go to wireshark/epan/ and run make. If this one succeeds, then we're almost done as no errors should occur here.

Go to wireshark/ and run make. One thing to do is make dftest and see if you can construct valid display filters with your new operator. Or you may want to move directly to the generation of wireshark.

Look also at wireshark/gtk/dfilter_expr_dlg.c and edit the display filter expression generator.