On Thu, Jul 29, 2021 at 10:57:35AM +0800, Tom Yan wrote: > On Wed, 28 Jul 2021 at 05:05, Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx> wrote: [...] > > A quick summary: > > > > - If you want an exact match: > > > > tcp flags == fin,syn,ack > > > > - If you want to check that those three bits are set on (regardless > > the remaining bits): > > > > tcp flags fin,syn,ack / fin,syn,ack > > > > - If you want to check that any of these three bits is set on: > > > > tcp flags fin,syn,ack > > This is exactly what I find absurd btw. IMHO it's much better if the > latter just means `tcp flags == (fin | syn | ack)`. Look at this from a different angle, ie. ct state ct state new,established ct state also has a bitmask datatype, and people are not expecting here to match to new AND established. > I'd rather we keep `tcp flags & (fin | syn | ack) != 0` and so > "unsimplified" or accept something like `tcp flags { fin / fin, syn > / syn, ack / ack }` The curly brace notation implies the use of sets. Sets only allow for exact matches, therefore tcp flags { fin, syn, ack} is actually making exact matches on the tcp flags.