diff options
author | ume <ume@FreeBSD.org> | 2003-10-20 15:27:48 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2003-10-20 15:27:48 +0000 |
commit | 1bfb4986099befab26dc0c1e40e47e89f92f62fb (patch) | |
tree | 9f0a5ced322cdbe6ab2dbce0993f3b61ac529326 /sys/netinet6/nd6_rtr.c | |
parent | 1ebf2012445124bd775073056a9019ead10872fa (diff) | |
download | FreeBSD-src-1bfb4986099befab26dc0c1e40e47e89f92f62fb.zip FreeBSD-src-1bfb4986099befab26dc0c1e40e47e89f92f62fb.tar.gz |
correct linkmtu handling.
Obtained from: KAME
Diffstat (limited to 'sys/netinet6/nd6_rtr.c')
-rw-r--r-- | sys/netinet6/nd6_rtr.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index ec65cb7..e5e61dd 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -364,38 +364,33 @@ nd6_ra_input(m, off, icmp6len) * MTU */ if (ndopts.nd_opts_mtu && ndopts.nd_opts_mtu->nd_opt_mtu_len == 1) { - u_int32_t mtu; + u_long mtu; + u_long maxmtu; - mtu = ntohl(ndopts.nd_opts_mtu->nd_opt_mtu_mtu); + mtu = (u_long)ntohl(ndopts.nd_opts_mtu->nd_opt_mtu_mtu); /* lower bound */ if (mtu < IPV6_MMTU) { nd6log((LOG_INFO, "nd6_ra_input: bogus mtu option " - "mtu=%d sent from %s, ignoring\n", + "mtu=%lu sent from %s, ignoring\n", mtu, ip6_sprintf(&ip6->ip6_src))); goto skip; } /* upper bound */ - if (ndi->maxmtu) { - if (mtu <= ndi->maxmtu) { - int change = (ndi->linkmtu != mtu); - - ndi->linkmtu = mtu; - if (change) /* in6_maxmtu may change */ - in6_setmaxmtu(); - } else { - nd6log((LOG_INFO, "nd6_ra_input: bogus mtu " - "mtu=%d sent from %s; " - "exceeds maxmtu %d, ignoring\n", - mtu, ip6_sprintf(&ip6->ip6_src), - ndi->maxmtu)); - } + maxmtu = (ndi->maxmtu && ndi->maxmtu < ifp->if_mtu) + ? ndi->maxmtu : ifp->if_mtu; + if (mtu <= maxmtu) { + int change = (ndi->linkmtu != mtu); + + ndi->linkmtu = mtu; + if (change) /* in6_maxmtu may change */ + in6_setmaxmtu(); } else { - nd6log((LOG_INFO, "nd6_ra_input: mtu option " - "mtu=%d sent from %s; maxmtu unknown, " - "ignoring\n", - mtu, ip6_sprintf(&ip6->ip6_src))); + nd6log((LOG_INFO, "nd6_ra_input: bogus mtu " + "mtu=%lu sent from %s; " + "exceeds maxmtu %lu, ignoring\n", + mtu, ip6_sprintf(&ip6->ip6_src), maxmtu)); } } |