forked from osmocom/wireshark
![]() The syntax for protocols and some literals like numbers and bytes/addresses can be ambiguous. Some protocols can be parsed as a literal, for example the protocol "fc" (Fibre Channel) can be parsed as 0xFC. If a numeric protocol is registered that will also take precedence over any literal, according to the current rules, thereby breaking numerical comparisons to that number. The same for an hypothetical protocol named "true", etc. To allow the user to disambiguate this meaning introduce new syntax. Any value prefixed with ':' or enclosed in <,> will be treated as a literal value only. The value :fc or <fc> will always mean 0xFC, under any context. Never a protocol whose filter name is "fc". Likewise any value prefixed with a dot will always be parsed as an identifier (protocol or protocol field) in the language. Never any literal value parsed from the token "fc". This allows the user to be explicit about the meaning, and between the two explicit methods plus the ambiguous one it doesn't completely break any one meaning. The difference can be seen in the following two programs: Filter: frame == fc Constants: Instructions: 00000 READ_TREE frame -> reg#0 00001 IF-FALSE-GOTO 5 00002 READ_TREE fc -> reg#1 00003 IF-FALSE-GOTO 5 00004 ANY_EQ reg#0 == reg#1 00005 RETURN -------- Filter: frame == :fc Constants: 00000 PUT_FVALUE fc <FT_PROTOCOL> -> reg#1 Instructions: 00000 READ_TREE frame -> reg#0 00001 IF-FALSE-GOTO 3 00002 ANY_EQ reg#0 == reg#1 00003 RETURN The filter "frame == fc" is the same as "filter == .fc", according to the current heuristic, except the first form will try to parse it as a literal if the name does not correspond to any registered protocol. By treating a leading dot as a name in the language we necessarily disallow writing floats with a leading dot. We will also disallow writing with an ending dot when using unparsed values. This is a backward incompatibility but has the happy side effect of making the expression {1...2} unambiguous. This could either mean "1 .. .2" or "1. .. 2". If we require a leading and ending digit then the meaning is clear: 1.0..0.2 -> 1.0 .. 0.2 Fixes #17731. |
||
---|---|---|
.. | ||
.editorconfig | ||
CMakeLists.txt | ||
dfilter-int.h | ||
dfilter-macro.c | ||
dfilter-macro.h | ||
dfilter.c | ||
dfilter.h | ||
dfunctions.c | ||
dfunctions.h | ||
dfvm.c | ||
dfvm.h | ||
drange.c | ||
drange.h | ||
gencode.c | ||
gencode.h | ||
grammar.lemon | ||
scanner.l | ||
semcheck.c | ||
semcheck.h | ||
sttype-function.c | ||
sttype-function.h | ||
sttype-pointer.c | ||
sttype-range.c | ||
sttype-range.h | ||
sttype-set.c | ||
sttype-set.h | ||
sttype-string.c | ||
sttype-test.c | ||
sttype-test.h | ||
syntax-tree.c | ||
syntax-tree.h |