svn commit: r256685 - user/ae/inet6/sys/netinet
Andrey V. Elsukov
ae at FreeBSD.org
Thu Oct 17 13:28:58 UTC 2013
Author: ae
Date: Thu Oct 17 13:28:57 2013
New Revision: 256685
URL: http://svnweb.freebsd.org/changeset/base/256685
Log:
When connection has non zero scope zone id, use its link ifnet
to determine maximum mtu.
Modified:
user/ae/inet6/sys/netinet/tcp_subr.c
Modified: user/ae/inet6/sys/netinet/tcp_subr.c
==============================================================================
--- user/ae/inet6/sys/netinet/tcp_subr.c Thu Oct 17 12:58:40 2013 (r256684)
+++ user/ae/inet6/sys/netinet/tcp_subr.c Thu Oct 17 13:28:57 2013 (r256685)
@@ -1828,21 +1828,26 @@ tcp_maxmtu6(struct in_conninfo *inc, str
KASSERT(inc != NULL, ("tcp_maxmtu6 with NULL in_conninfo pointer"));
- bzero(&sro6, sizeof(sro6));
- if (!IN6_IS_ADDR_UNSPECIFIED(&inc->inc6_faddr)) {
+ ifp = NULL;
+ if (inc->inc6_zoneid != 0) {
+ ifp = in6_getlinkifnet(inc->inc6_zoneid);
+ } else if (!IN6_IS_ADDR_UNSPECIFIED(&inc->inc6_faddr)) {
+ bzero(&sro6, sizeof(sro6));
sro6.ro_dst.sin6_family = AF_INET6;
sro6.ro_dst.sin6_len = sizeof(struct sockaddr_in6);
sro6.ro_dst.sin6_addr = inc->inc6_faddr;
in6_rtalloc_ign(&sro6, 0, inc->inc_fibnum);
+ if (sro6.ro_rt != NULL) {
+ ifp = sro6.ro_rt->rt_ifp;
+ maxmtu = sro6.ro_rt->rt_rmx.rmx_mtu;
+ RTFREE(sro6.ro_rt);
+ }
}
- if (sro6.ro_rt != NULL) {
- ifp = sro6.ro_rt->rt_ifp;
- if (sro6.ro_rt->rt_rmx.rmx_mtu == 0)
- maxmtu = IN6_LINKMTU(sro6.ro_rt->rt_ifp);
+ if (ifp != NULL) {
+ if (maxmtu != 0)
+ maxmtu = min(maxmtu, IN6_LINKMTU(ifp));
else
- maxmtu = min(sro6.ro_rt->rt_rmx.rmx_mtu,
- IN6_LINKMTU(sro6.ro_rt->rt_ifp));
-
+ maxmtu = IN6_LINKMTU(ifp);
/* Report additional interface capabilities. */
if (cap != NULL) {
if (ifp->if_capenable & IFCAP_TSO6 &&
@@ -1850,7 +1855,6 @@ tcp_maxmtu6(struct in_conninfo *inc, str
cap->ifcap |= CSUM_TSO;
cap->tsomax = ifp->if_hw_tsomax;
}
- RTFREE(sro6.ro_rt);
}
return (maxmtu);
More information about the svn-src-user
mailing list