I've been running iftop on my home gateway (NetBSD/i386) for a while, and recently realized that it completely ignores the IPv6 traffic going through.
The problem is that `handle_ip_packet` ends up throwing away the IPv6 packets when it can't figure out the direction of a packet.
Here's what's going on, we're in `handle_ip_packet` and have an IPv6 packet pointed to by `iptr`:
| if(hw_dir == 1) { Nope, hardware doesn't tell the direction | } else if(hw_dir == 0) { Nope, see above. | } else if((IP_V(iptr) == 4) && have_ip_addr && ip_addr_match(iptr->ip_src)) { Nope, this isn't IPv4 | } else if((IP_V(iptr) == 4) && have_ip_addr && ip_addr_match(iptr->ip_dst)) { Nope, see above. | } else if((IP_V(iptr) == 6) && have_ip6_addr && ip6_addr_match(&ip6tr->ip6_src)) { Nope, this is IPv6, but `have_ip6_addr` is zero -- we couldn't get an ipv6 interface address because get_addrs_ioctl() is IPv4-specific. getifaddrs() *is* available on NetBSD, so that could be used. But I believe this is unrelated to the problem I am reporting, because on a router, even if we knew our interface address, the traffic going through would usually not carry our interface address. | } else if((IP_V(iptr) == 6) && have_ip6_addr && ip6_addr_match(&ip6tr->ip6_dst)) { Nope, see above. | } else if (IP_V(iptr) == 4 && IN_MULTICAST(iptr->ip_dst.s_addr)) { Nope, this isn't IPv4 | } else if (IP_V(iptr) == 6 && IN6_IS_ADDR_MULTICAST(&ip6tr->ip6_dst)) { Nope, this isn't multicast either | } else if (options.promiscuous_but_choosy) { Nope, not set | } else if((IP_V(iptr) == 4) && (iptr->ip_src.s_addr < iptr->ip_dst.s_addr)) { Nope, this isn't IPv4 | } else if(IP_V(iptr) == 4) { Nope, this isn't IPv4 | } else | return; The IPv6 packet is thus discarded here and is never shown or accounted for.
Now, all the last `else if` branch in the above list does is: | assign_addr_pair(&ap, iptr, 0); | direction = 0; which on the first glance should work with IPv6 as well.
With the below patch, my IPv6 traffic is now showing.
Best regards, Timo Buhrmester
--- iftop.c.orig 2015-07-20 19:53:07.000000000 +0200 +++ iftop.c 2015-07-20 19:52:35.000000000 +0200 @@ -327,13 +327,10 @@ assign_addr_pair(&ap, iptr, 1); direction = 0; } - else if(IP_V(iptr) == 4) { + else { /* IPv4 or IPv6 */ assign_addr_pair(&ap, iptr, 0); direction = 0; } - /* Drop other uncertain packages. */ - else - return; }
if(IP_V(iptr) == 4 && options.netfilter != 0) {