diff options
author | ume <ume@FreeBSD.org> | 2001-03-28 19:47:52 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2001-03-28 19:47:52 +0000 |
commit | 83ec64633009aec722c89209200bd531e59e5107 (patch) | |
tree | fb747c890d237eab5c39c9019df24b3be462ae32 /sys/netinet6/ip6_input.c | |
parent | 675a95706dcc8ea66ec6fd280a58d7b00d90c984 (diff) | |
download | FreeBSD-src-83ec64633009aec722c89209200bd531e59e5107.zip FreeBSD-src-83ec64633009aec722c89209200bd531e59e5107.tar.gz |
Make per-address input packet counts for lo0 work.
Reported by: bmah
Submitted by: Noriyasu KATO <noriyasu.kato@toshiba.co.jp> (via itojun)
Diffstat (limited to 'sys/netinet6/ip6_input.c')
-rw-r--r-- | sys/netinet6/ip6_input.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index ea37440..20c84a3 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -391,9 +391,17 @@ ip6_input(m) if (IN6_IS_ADDR_LOOPBACK(&ip6->ip6_src) || IN6_IS_ADDR_LOOPBACK(&ip6->ip6_dst)) { if (m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) { - ours = 1; - deliverifp = m->m_pkthdr.rcvif; - goto hbhcheck; + if (ip6_forward_rt.ro_rt != NULL && + (ip6_forward_rt.ro_rt->rt_flags & RTF_UP) != 0 && + IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst, &ip6_forward_rt.ro_dst.sin6_addr)) { + struct in6_ifaddr *ia6 = + (struct in6_ifaddr *)ip6_forward_rt.ro_rt->rt_ifa; + ia6->ia_ifa.if_ipackets++; + ia6->ia_ifa.if_ibytes += m->m_pkthdr.len; + ours = 1; + deliverifp = m->m_pkthdr.rcvif; + goto hbhcheck; + } } else { ip6stat.ip6s_badscope++; in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr); @@ -423,9 +431,17 @@ ip6_input(m) */ if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) != 0) { if (IN6_IS_ADDR_LINKLOCAL(&ip6->ip6_dst)) { - ours = 1; - deliverifp = m->m_pkthdr.rcvif; - goto hbhcheck; + if (ip6_forward_rt.ro_rt != NULL && + (ip6_forward_rt.ro_rt->rt_flags & RTF_UP) != 0 && + IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst, &ip6_forward_rt.ro_dst.sin6_addr)) { + struct in6_ifaddr *ia6 = + (struct in6_ifaddr *)ip6_forward_rt.ro_rt->rt_ifa; + ia6->ia_ifa.if_ipackets++; + ia6->ia_ifa.if_ibytes += m->m_pkthdr.len; + ours = 1; + deliverifp = m->m_pkthdr.rcvif; + goto hbhcheck; + } } } |