tcpdump(1)
usa libpcap(3)
, que usa uma sintaxe de filtro documentada na página pcap-filter(7)
man.
Você pode querer pular para a seção expr relop expr
e a notação de colchetes:
expr relop expr
True if the relation holds, where relop is one of >, <, >=, <=, =, !=, and
expr is an arithmetic expression composed of integer constants (expressed in
standard C syntax), the normal binary operators [+, -, *, /, &, |, <<, >>], a
length operator, and special packet data accessors. Note that all compar-
isons are unsigned, so that, for example, 0x80000000 and 0xffffffff are > 0.
To access data inside the packet, use the following syntax:
proto [ expr : size ]
Proto is one of ether, fddi, tr, wlan, ppp, slip, link, ip, arp, rarp, tcp,
udp, icmp, ip6 or radio, and indicates the protocol layer for the index oper-
ation. (ether, fddi, wlan, tr, ppp, slip and link all refer to the link
layer. radio refers to the "radio header" added to some 802.11 captures.)
Note that tcp, udp and other upper-layer protocol types only apply to IPv4,
not IPv6 (this will be fixed in the future). The byte offset, relative to
the indicated protocol layer, is given by expr. Size is optional and indi-
cates the number of bytes in the field of interest; it can be either one,
two, or four, and defaults to one. The length operator, indicated by the
keyword len, gives the length of the packet.
Então, por exemplo, se você quiser filtrar os pacotes com 0x23 no local 42 da carga útil de um quadro Ethernet-II, isso seria no deslocamento 56 do quadro Ethernet geral (seu deslocamento de 42 mais um deslocamento de 14 bytes para passar os cabeçalhos Ethernet para o payload), então você poderia fazer algo assim:
ether[56] != 0x23
Eu não li totalmente no gsmtap, então não estou garantindo que o filtro acima seja exatamente o que você precisa, mas deve começar na direção certa.