Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Oct 2013 13:28:57 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r256685 - user/ae/inet6/sys/netinet
Message-ID:  <201310171328.r9HDSvlK098418@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310171328.r9HDSvlK098418>