Hiroki Sato <h...@freebsd.org> wrote in <20121201.225004.2232262673795057435....@allbsd.org>:
hr> Mateusz Guzik <mjgu...@gmail.com> wrote hr> in <20121201133609.ga5...@dft-labs.eu>: hr> hr> mj> On Fri, Nov 30, 2012 at 11:16:25PM -0800, Adrian Chadd wrote: hr> mj> > Mateusz: are you sure it's that commit? hr> mj> > hr> mj> hr> mj> Yes, I double-checked right now. hr> mj> hr> mj> > I still get this in -HEAD: hr> mj> > hr> mj> hr> mj> Maybe I expressed myself incorrectly, I meant to say that LOR started hr> mj> showing up since r243187. hr> mj> hr> mj> The code is still in head and no fixes were comitted (that I know of at hr> mj> least), so I guess that you seeing this LOR on head is expected. :) hr> hr> Thanks for the info. I am investigating this now. Can anyone test the attached patch and let me know if the LOR persists or not? -- Hiroki
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 <sys/param.h> #include <sys/mbuf.h> #include <sys/systm.h> +#include <sys/vnet.h> #include <netinet/in.h> #include <netinet/ip6.h> #include <netinet6/scope6_var.h> Index: sys/netinet6/scope6.c =================================================================== --- sys/netinet6/scope6.c (revision 243465) +++ sys/netinet6/scope6.c (working copy) @@ -38,6 +38,7 @@ #include <sys/socket.h> #include <sys/systm.h> #include <sys/queue.h> +#include <sys/sysctl.h> #include <sys/syslog.h> #include <net/if.h> @@ -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 *);
pgpeS2q9x6Q7k.pgp
Description: PGP signature