From owner-freebsd-net@FreeBSD.ORG Sat Dec 1 23:32:28 2012 Return-Path: Delivered-To: freebsd-net@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 7618F90; Sat, 1 Dec 2012 23:32:28 +0000 (UTC) (envelope-from hrs@FreeBSD.org) Received: from mail.allbsd.org (gatekeeper.allbsd.org [IPv6:2001:2f0:104:e001::32]) by mx1.freebsd.org (Postfix) with ESMTP id D306D8FC0C; Sat, 1 Dec 2012 23:32:26 +0000 (UTC) Received: from alph.allbsd.org (p1137-ipbf1505funabasi.chiba.ocn.ne.jp [118.7.212.137]) (authenticated bits=128) by mail.allbsd.org (8.14.5/8.14.5) with ESMTP id qB1NWAd8098679 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 2 Dec 2012 08:32:20 +0900 (JST) (envelope-from hrs@FreeBSD.org) Received: from localhost (localhost [127.0.0.1]) (authenticated bits=0) by alph.allbsd.org (8.14.5/8.14.5) with ESMTP id qB1NW8Vo050788; Sun, 2 Dec 2012 08:32:10 +0900 (JST) (envelope-from hrs@FreeBSD.org) Date: Sun, 02 Dec 2012 08:30:35 +0900 (JST) Message-Id: <20121202.083035.823064739980116980.hrs@allbsd.org> To: mjguzik@gmail.com Subject: Re: LOR in rtsock/ifnet From: Hiroki Sato In-Reply-To: <20121201223049.GA12120@dft-labs.eu> References: <20121201.225004.2232262673795057435.hrs@allbsd.org> <20121202.065436.1086216324076847740.hrs@allbsd.org> <20121201223049.GA12120@dft-labs.eu> X-PGPkey-fingerprint: BDB3 443F A5DD B3D0 A530 FFD7 4F2C D3D8 2793 CF2D X-Mailer: Mew version 6.5 on Emacs 23.4 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Multipart/Signed; protocol="application/pgp-signature"; micalg=pgp-sha1; boundary="--Security_Multipart0(Sun_Dec__2_08_30_35_2012_445)--" Content-Transfer-Encoding: 7bit X-Virus-Scanned: clamav-milter 0.97.4 at gatekeeper.allbsd.org X-Virus-Status: Clean X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7 (mail.allbsd.org [133.31.130.32]); Sun, 02 Dec 2012 08:32:20 +0900 (JST) X-Spam-Status: No, score=-98.1 required=13.0 tests=CONTENT_TYPE_PRESENT, ONLY1HOPDIRECT,SAMEHELOBY2HOP,USER_IN_WHITELIST autolearn=no version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on gatekeeper.allbsd.org Cc: ae@FreeBSD.org, adrian@FreeBSD.org, rpaulo@FreeBSD.org, freebsd-net@FreeBSD.org X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 01 Dec 2012 23:32:28 -0000 ----Security_Multipart0(Sun_Dec__2_08_30_35_2012_445)-- Content-Type: Multipart/Mixed; boundary="--Next_Part(Sun_Dec__2_08_30_35_2012_623)--" Content-Transfer-Encoding: 7bit ----Next_Part(Sun_Dec__2_08_30_35_2012_623)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mateusz Guzik wrote in <20121201223049.GA12120@dft-labs.eu>: mj> On Sun, Dec 02, 2012 at 06:54:36AM +0900, Hiroki Sato wrote: mj> > Hiroki Sato wrote mj> > in <20121201.225004.2232262673795057435.hrs@allbsd.org>: mj> > mj> > hr> Mateusz Guzik wrote mj> > hr> in <20121201133609.GA5450@dft-labs.eu>: mj> > hr> mj> > hr> mj> On Fri, Nov 30, 2012 at 11:16:25PM -0800, Adrian Chadd wrote: mj> > hr> mj> > Mateusz: are you sure it's that commit? mj> > hr> mj> > mj> > hr> mj> mj> > hr> mj> Yes, I double-checked right now. mj> > hr> mj> mj> > hr> mj> > I still get this in -HEAD: mj> > hr> mj> > mj> > hr> mj> mj> > hr> mj> Maybe I expressed myself incorrectly, I meant to say that LOR started mj> > hr> mj> showing up since r243187. mj> > hr> mj> mj> > hr> mj> The code is still in head and no fixes were comitted (that I know of at mj> > hr> mj> least), so I guess that you seeing this LOR on head is expected. :) mj> > hr> mj> > hr> Thanks for the info. I am investigating this now. mj> > mj> > Can anyone test the attached patch and let me know if the LOR mj> > persists or not? mj> > mj> mj> I got the following build failure: mj> /srv/repos/freebsd/sys/netinet6/in6_cksum.c:69:22: error: sys/vnet.h: No mj> such file or directory mj> In file included from /srv/repos/freebsd/sys/netinet6/in6_cksum.c:72: mj> /srv/repos/freebsd/sys/netinet6/scope6_var.h:45: error: expected mj> declaration specifiers or '...' before 'deembed_scopeid' mj> cc1: warnings being treated as errors mj> /srv/repos/freebsd/sys/netinet6/scope6_var.h:45: warning: data mj> definition has no type or storage class mj> /srv/repos/freebsd/sys/netinet6/scope6_var.h:45: warning: type defaults mj> to 'int' in declaration of 'VNET_DECLARE' Oops, sorry. The attached one should work. The difference is only s|sys/vnet.h|net/vnet| as you also pointed out. mj> However after changing sys/vnet.h to net/vnet.h the kernel compiled fine mj> and LOR is gone. Thank you! I am double-checking if there is some negative impact by this change. -- Hiroki ----Next_Part(Sun_Dec__2_08_30_35_2012_623)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="scope6_lorfix_20121201-2.diff" Index: sys/net/rtsock.c =================================================================== --- sys/net/rtsock.c (revision 243465) +++ sys/net/rtsock.c (working copy) @@ -175,14 +175,6 @@ #define RTSOCK_LOCK_ASSERT() mtx_assert(&rtsock_mtx, MA_OWNED) static SYSCTL_NODE(_net, OID_AUTO, route, CTLFLAG_RD, 0, ""); -#ifdef INET6 -static VNET_DEFINE(int, deembed_scopeid) = 1; -#define V_deembed_scopeid VNET(deembed_scopeid) -SYSCTL_DECL(_net_inet6_ip6); -SYSCTL_VNET_INT(_net_inet6_ip6, OID_AUTO, deembed_scopeid, CTLFLAG_RW, - &VNET_NAME(deembed_scopeid), 0, - "Extract embedded zone ID and set it to sin6_scope_id in sockaddr_in6."); -#endif struct walkarg { int w_tmemsize; @@ -804,28 +796,31 @@ } info.rti_info[RTAX_DST] = rt_key(rt); #ifdef INET6 - switch (rt_key(rt)->sa_family) { - case AF_INET6: - if (V_deembed_scopeid == 0) + if (V_deembed_scopeid) { + switch (rt_key(rt)->sa_family) { + case AF_INET6: + sin6 = (struct sockaddr_in6 *)&ss_dst; + bcopy(rt_key(rt), sin6, sizeof(*sin6)); + if (sa6_recoverscope(sin6) == 0) + info.rti_info[RTAX_DST] = + (struct sockaddr *)sin6; break; - sin6 = (struct sockaddr_in6 *)&ss_dst; - bcopy(rt_key(rt), sin6, sizeof(*sin6)); - if (sa6_recoverscope(sin6) == 0) - info.rti_info[RTAX_DST] = - (struct sockaddr *)sin6; - break; + } } #endif info.rti_info[RTAX_GATEWAY] = rt->rt_gateway; #ifdef INET6 - switch (rt->rt_gateway->sa_family) { - case AF_INET6: - sin6 = (struct sockaddr_in6 *)&ss_gw; - bcopy(rt->rt_gateway, sin6, sizeof(*sin6)); - if (sa6_recoverscope(sin6) == 0) - info.rti_info[RTAX_GATEWAY] = - (struct sockaddr *)sin6; - break; + if (V_deembed_scopeid) { + switch (rt->rt_gateway->sa_family) { + case AF_INET6: + sin6 = (struct sockaddr_in6 *)&ss_gw; + bcopy(rt->rt_gateway, sin6, + sizeof(*sin6)); + if (sa6_recoverscope(sin6) == 0) + info.rti_info[RTAX_GATEWAY] = + (struct sockaddr *)sin6; + break; + } } #endif info.rti_info[RTAX_NETMASK] = rt_mask(rt); @@ -1130,15 +1125,15 @@ rtinfo->rti_addrs |= (1 << i); dlen = SA_SIZE(sa); #ifdef INET6 - switch (sa->sa_family) { - case AF_INET6: - if (V_deembed_scopeid == 0) + if (V_deembed_scopeid) { + switch (sa->sa_family) { + case AF_INET6: + sin6 = (struct sockaddr_in6 *)&ss; + bcopy(sa, sin6, sizeof(*sin6)); + if (sa6_recoverscope(sin6) == 0) + sa = (struct sockaddr *)sin6; break; - sin6 = (struct sockaddr_in6 *)&ss; - bcopy(sa, sin6, sizeof(*sin6)); - if (sa6_recoverscope(sin6) == 0) - sa = (struct sockaddr *)sin6; - break; + } } #endif m_copyback(m, len, dlen, (caddr_t)sa); @@ -1219,15 +1214,15 @@ rtinfo->rti_addrs |= (1 << i); dlen = SA_SIZE(sa); #ifdef INET6 - switch (sa->sa_family) { - case AF_INET6: - if (V_deembed_scopeid == 0) + if (V_deembed_scopeid) { + switch (sa->sa_family) { + case AF_INET6: + sin6 = (struct sockaddr_in6 *)&ss; + bcopy(sa, sin6, sizeof(*sin6)); + if (sa6_recoverscope(sin6) == 0) + sa = (struct sockaddr *)sin6; break; - sin6 = (struct sockaddr_in6 *)&ss; - bcopy(sa, sin6, sizeof(*sin6)); - if (sa6_recoverscope(sin6) == 0) - sa = (struct sockaddr *)sin6; - break; + } } #endif if (cp) { @@ -1594,18 +1589,19 @@ info.rti_info[RTAX_BRD] = rt->rt_ifa->ifa_dstaddr; } #ifdef INET6 - for (i = 0; i < RTAX_MAX; i++) { - if (info.rti_info[i] == NULL) - continue; - switch (info.rti_info[i]->sa_family) { - case AF_INET6: - if (V_deembed_scopeid == 0) + if (V_deembed_scopeid) { + for (i = 0; i < RTAX_MAX; i++) { + if (info.rti_info[i] == NULL) + continue; + switch (info.rti_info[i]->sa_family) { + case AF_INET6: + sin6 = (struct sockaddr_in6 *)&ss[i]; + bcopy(info.rti_info[i], sin6, sizeof(*sin6)); + if (sa6_recoverscope(sin6) == 0) + info.rti_info[i] = + (struct sockaddr *)sin6; break; - sin6 = (struct sockaddr_in6 *)&ss[i]; - bcopy(info.rti_info[i], sin6, sizeof(*sin6)); - if (sa6_recoverscope(sin6) == 0) - info.rti_info[i] = (struct sockaddr *)sin6; - break; + } } } #endif @@ -1811,7 +1807,7 @@ int len, error = 0; bzero((caddr_t)&info, sizeof(info)); - IFNET_RLOCK(); + IFNET_RLOCK_NOSLEEP(); TAILQ_FOREACH(ifp, &V_ifnet, if_link) { if (w->w_arg && w->w_arg != ifp->if_index) continue; @@ -1856,7 +1852,7 @@ done: if (ifp != NULL) IF_ADDR_RUNLOCK(ifp); - IFNET_RUNLOCK(); + IFNET_RUNLOCK_NOSLEEP(); return (error); } @@ -1870,7 +1866,7 @@ struct ifaddr *ifa; bzero((caddr_t)&info, sizeof(info)); - IFNET_RLOCK(); + IFNET_RLOCK_NOSLEEP(); TAILQ_FOREACH(ifp, &V_ifnet, if_link) { if (w->w_arg && w->w_arg != ifp->if_index) continue; @@ -1905,7 +1901,7 @@ IF_ADDR_RUNLOCK(ifp); } done: - IFNET_RUNLOCK(); + IFNET_RUNLOCK_NOSLEEP(); return (error); } Index: sys/netinet6/in6_cksum.c =================================================================== --- sys/netinet6/in6_cksum.c (revision 243465) +++ sys/netinet6/in6_cksum.c (working copy) @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include Index: sys/netinet6/scope6.c =================================================================== --- sys/netinet6/scope6.c (revision 243465) +++ sys/netinet6/scope6.c (working copy) @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -55,7 +56,11 @@ #else VNET_DEFINE(int, ip6_use_defzone) = 0; #endif - +VNET_DEFINE(int, deembed_scopeid) = 1; +SYSCTL_DECL(_net_inet6_ip6); +SYSCTL_VNET_INT(_net_inet6_ip6, OID_AUTO, deembed_scopeid, CTLFLAG_RW, + &VNET_NAME(deembed_scopeid), 0, + "Extract embedded zone ID and set it to sin6_scope_id in sockaddr_in6."); /* * The scope6_lock protects the global sid default stored in * sid_default below. Index: sys/netinet6/scope6_var.h =================================================================== --- sys/netinet6/scope6_var.h (revision 243465) +++ sys/netinet6/scope6_var.h (working copy) @@ -42,6 +42,9 @@ u_int32_t s6id_list[16]; }; +VNET_DECLARE(int, deembed_scopeid); +#define V_deembed_scopeid VNET(deembed_scopeid) + void scope6_init(void); struct scope6_id *scope6_ifattach(struct ifnet *); void scope6_ifdetach(struct scope6_id *); ----Next_Part(Sun_Dec__2_08_30_35_2012_623)---- ----Security_Multipart0(Sun_Dec__2_08_30_35_2012_445)-- Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (FreeBSD) iEYEABECAAYFAlC6kxsACgkQTyzT2CeTzy3JewCfQgh8v51YZRgBh4Q7DtQZuFLT hpAAoJpTSDVzII46FnJX1eW0zSg1IBS1 =ALoj -----END PGP SIGNATURE----- ----Security_Multipart0(Sun_Dec__2_08_30_35_2012_445)----