summaryrefslogtreecommitdiffstats
path: root/sys/netinet6/ip6_input.c
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2001-04-05 19:45:02 +0000
committerume <ume@FreeBSD.org>2001-04-05 19:45:02 +0000
commit0a208899c9660838047d3576a416b4ce3a2297f1 (patch)
tree04bc78e3fadc5bc86be5ff85e5edc918fda59a0c /sys/netinet6/ip6_input.c
parent36a2fbc48193fa64c445e7426d818677a282063c (diff)
downloadFreeBSD-src-0a208899c9660838047d3576a416b4ce3a2297f1.zip
FreeBSD-src-0a208899c9660838047d3576a416b4ce3a2297f1.tar.gz
- correct logic of per-address input packet counts for lo0
- reject packets to fe80::xxxx%lo0 (xxxx != 1) Submitted by: JINMEI Tatuya <jinmei@isl.rdc.toshiba.co.jp>
Diffstat (limited to 'sys/netinet6/ip6_input.c')
-rw-r--r--sys/netinet6/ip6_input.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c
index 20c84a3..b1de716 100644
--- a/sys/netinet6/ip6_input.c
+++ b/sys/netinet6/ip6_input.c
@@ -391,17 +391,24 @@ 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) {
- 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;
+ struct in6_ifaddr *ia6;
+
+ if ((ia6 = in6ifa_ifpwithaddr(m->m_pkthdr.rcvif,
+ &ip6->ip6_dst)) != NULL) {
ia6->ia_ifa.if_ipackets++;
ia6->ia_ifa.if_ibytes += m->m_pkthdr.len;
- ours = 1;
- deliverifp = m->m_pkthdr.rcvif;
- goto hbhcheck;
+ } else {
+ /*
+ * The packet is looped back, but we do not
+ * have the destination address for some
+ * reason.
+ * XXX: should we return an icmp6 error?
+ */
+ goto bad;
}
+ ours = 1;
+ deliverifp = m->m_pkthdr.rcvif;
+ goto hbhcheck;
} else {
ip6stat.ip6s_badscope++;
in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
@@ -431,17 +438,23 @@ ip6_input(m)
*/
if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) != 0) {
if (IN6_IS_ADDR_LINKLOCAL(&ip6->ip6_dst)) {
- 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;
+ struct in6_ifaddr *ia6;
+
+ if ((ia6 = in6ifa_ifpwithaddr(m->m_pkthdr.rcvif,
+ &ip6->ip6_dst)) != NULL) {
ia6->ia_ifa.if_ipackets++;
ia6->ia_ifa.if_ibytes += m->m_pkthdr.len;
- ours = 1;
- deliverifp = m->m_pkthdr.rcvif;
- goto hbhcheck;
+ } else {
+ /*
+ * We do not have the link-local address
+ * specified as the destination.
+ * XXX: should we return an icmp6 error?
+ */
+ goto bad;
}
+ ours = 1;
+ deliverifp = m->m_pkthdr.rcvif;
+ goto hbhcheck;
}
}
OpenPOWER on IntegriCloud