On Thu, May 08, 2003 at 09:22:46PM +0800, darren wrote: > Hi all, > > Thanx for all your suggestions. > > I have tried Martin's solution of the 'frame ' option, and found 9it to > be very simple to use. However, it can be quite time consuming and may > drop packets during a live capture > 15Mbps.
Your original message spoke of "capture files", which implies that you're not doing this with a live capture. For filtering a live capture, libpcap supports a similar filtering mechanism, albeit not so convenient to use: % man tcpdump ... expression selects which packets will be dumped. If no expression is given, all packets on the net will be dumped. Otherwise, only packets for which expres- sion is `true' will be dumped. The expression consists of one or more primitives. Primitives usually consist of an id (name or num- ber) preceded by one or more qualifiers. There are three different kinds of qualifier: ... In addition to the above, there are some special `primitive' keywords that don't follow the pattern: gateway, broadcast, less, greater and arithmetic expressions. All of these are described below. More complex filter expressions are built up by using the words and, or and not to combine primi- tives. E.g., `host foo and not port ftp and not port ftp-data'. To save typing, identical quali- fier lists can be omitted. E.g., `tcp dst port ftp or ftp-data or domain' is exactly the same as `tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'. Allowable primitives are: ... 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. To access data inside the packet, use the following syntax: proto [ expr : size ] Proto is one of ether, fddi, ip, arp, rarp, tcp, udp, or icmp, and indicates the proto- col layer for the index operation. The byte offset, relative to the indicated protocol layer, is given by expr. Size is optional and indicates 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. For example, `ether[0] & 1 != 0' catches all multicast traffic. The expression `ip[0] & 0xf != 5' catches all IP packets with options. The expression `ip[6:2] & 0x1fff = 0' catches only unfragmented datagrams and frag zero of fragmented datagrams. This check is implicitly applied to the tcp and udp index operations. For instance, tcp[0] always means the first byte of the TCP header, and never means the first byte of an intervening fragment. Primitives may be combined using: A parenthesized group of primitives and operators (parentheses are special to the Shell and must be escaped). Negation (`!' or `not'). Concatenation (`&&' or `and'). Alternation (`||' or `or'). Negation has highest precedence. Alternation and concatenation have equal precedence and associate left to right. Note that explicit and tokens, not juxtaposition, are now required for concatenation. Note that "ether" and "fddi", in the "proto" field, will work for any link layer - they just mean "relative to the beginning of the frame. Note that those expressions can only compare 1, 2, or 4-byte quantities.