Permalink
Fetching contributors…
Cannot retrieve contributors at this time
59 lines (42 sloc) 2.57 KB
This is a brainstorm about a libpcap-wrapper.
It should make it possible to add callbacks requesting specific packets, for example asking
for all TCP packets, whether they are sent over IPv4 or IPv6.
Return value of the callback specifies of the packet should 'fall through', i.e.,
if it should be sent to other callbacks, too.
give the programmer the opportunity to let packages re-enter the 'stream'.
Callbacks should be called from high to low level. When a callback returns 'true', no lower
callbacks should be called. The payload is available in a nice struct (union?), too.
= Examples - how it'd work =
== For the developers of the lib ==
When the sniffer is started, we learn what kind of packets are on the wire
(ethernet, ppp, etc) and start pcap. Whenever a packet arrives, it is parsed.
After parsing, if a callback is defined for this type of packet, the callback
is pushed onto a stack. After that the payload is parsed. This goes on until
the payload is, as far as we're concerned, raw data. Then the callbacks on
the stack are called, until one of them returns 'true' ('done parsing this
packet')
Undefined callbacks move the parser to the next level.
-- alternatively --
When the sniffer is started, we learn what kind of packets are on the wire
(ethernet, ppp, etc) and start pcap. Whenever a packet arrives, it is parsed.
After parsing, if a callback is defined for this type of packet, that
callback is called. If it returns 'true', the packet is 'done', and discarded.
If it returns 'false', it's passed on to the next level, leaving any changes
to the user data intact.
== For the users of the lib ==
If you want to sniff only tcp packets, add a callback for the 'packet_tcp'
packet type. If you also want to count the total amount of IP traffic, make
sure the 'packet_tcp' handler returns 'false' - that means after the tcp
callback the packet will go on and be presented to the IP callback also.
If you want to sniff specifically IPv4 TCP packets, you add a callback for
IPv4 that calls the function to parse the payload directly, and then returns
'false'.
If you modify the 'user' data in top-level callbacks which return 'false',
-- alternatively --
If you want to sniff only tcp packets, simply only add a callback for
'dp_packet_tcp'. If, on top of that, you also want to count the total amount
of IP traffic, make sure it returns 'false' and return.
If you want to sniff specifically IPv4 TCP packets, you can do 2 things:
add a 'true'-returning callback to everything else apart from IPv4 (which
is ugly), or only add a callback for IPv4 and call the TCP-parsing code
by hand.