tcpdump mailing list archives

Re: [patch] IPv6 RA - RDNSS option


From: Guy Harris <guy () alum mit edu>
Date: Sun, 7 Feb 2010 14:57:56 -0800


On Feb 1, 2010, at 6:27 AM, David Horn wrote:

I have created a patch to support the RFC 5006 IPv6 RA option 25
(RDNSS) decoding in tcpdump.  The patch (against GIT) is available
here:

https://sourceforge.net/tracker/?func=detail&aid=2942379&group_id=53066&atid=469575

I would appreciate a review of the code, as this is my first change to
tcpdump.

There's no need for a "maximum DNS server addresses" value - the nd_opt_rdnss structure doesn't have to cover all 
possible addresses, it can just have one, and the printer can go past the nominal end of the structure.

Not all C compilers necessarily support declaration of variables in the middle of a block:

                        oprd = (struct nd_opt_rdnss *)op;
                        int rdnss_len = oprd->nd_opt_rdnss_len;

so I just used the "l" variable, used elsewhere for option lengths - and set it based on op->nd_opt_len, as is done 
with other options.

You just directly printed oprd->nd_opt_rdnss_lifetime, but it's a 4-byte value, and

        1) it's not guaranteed to be aligned on a 4-byte boundary, and not all machines can dereference unaligned 
pointers without trapping;

        2) it's not necessarily in the same byte order as the machine on which you're running (in fact, these days 
there's an extremely good chance that it's *not*, as most people running tcpdump are probably running it on a machine 
with an x86 or x86-64 processor, and those are little-endian);

so it should be fetched with EXTRACT_32BITS().

It's probably best to print the addresses in order, rather than in reverse order.

I've checked your patch in, with the changes in question.-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.


Current thread: