Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Jan 2006 23:46:08 +0900
From:      Hajimu UMEMOTO <ume@FreeBSD.org>
To:        FreeBSD-gnats-submit@FreeBSD.org
Cc:        phantom@FreeBSD.org, Hajimu UMEMOTO <ume@FreeBSD.org>
Subject:   ports/92620: jdk14 under the environment where net.inet6.ip6.v6only=1
Message-ID:  <yge4q3kzc9b.wl%ume@mahoroba.org>
Resent-Message-ID: <200601311450.k0VEo2QU059797@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         92620
>Category:       ports
>Synopsis:       jdk14 under the environment where net.inet6.ip6.v6only=1
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jan 31 14:50:02 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Hajimu UMEMOTO
>Release:        FreeBSD 6.0-STABLE i386
>Organization:
Internet Mutual Aid Society, YOKOHAMA
>Environment:
System: FreeBSD kasuga.mahoroba.org 6.0-STABLE FreeBSD 6.0-STABLE #1: Fri Dec 9 11:48:53 JST 2005 root@kasuga.mahoroba.org:/usr/obj/usr/src/sys/KASUGA i386
>Description:
When we use an IPv4 with ports/java/jdk14 built with WITH_IPV6=YES, we
need to set net.inet6.ip6.v6only to 0.  It is too restrictive.
>How-To-Repeat:
Run jdk14 built with WITH_IPV6=YES
>Fix:
We have an IPV6_V6ONLY socket option to allow an IPv4-mapped IPv6
address per socket basis.  Here is a patch to use an IPV6_V6ONLY
socket option.  Please put it into jdk14/files as something like
patch-v6only.

Index: ../../j2se/src/solaris/native/java/net/PlainDatagramSocketImpl.c
diff -u -p ../../j2se/src/solaris/native/java/net/PlainDatagramSocketImpl.c.orig ../../j2se/src/solaris/native/java/net/PlainDatagramSocketImpl.c
--- ../../j2se/src/solaris/native/java/net/PlainDatagramSocketImpl.c.orig	Mon Oct 31 21:54:39 2005
+++ ../../j2se/src/solaris/native/java/net/PlainDatagramSocketImpl.c	Tue Nov  1 13:13:05 2005
@@ -226,8 +226,15 @@ Java_java_net_PlainDatagramSocketImpl_bi
 
     NET_InetAddressToSockaddr(env, iaObj, localport, (struct sockaddr *)&him, &len);
 #if defined(_ALLBSD_SOURCE)
-            if (cannotMap4to6(env, iaObj))
-                return;
+#if defined(IPV6_V6ONLY)
+    if (((struct sockaddr *)&him)->sa_family == AF_INET6) {
+	int t = 0;
+	JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&t, sizeof(t));
+    }
+#else
+    if (cannotMap4to6(env, iaObj))
+	return;
+#endif /* IPV6_V6ONLY */
 #endif /* _ALLBSD_SOURCE */
 
 
@@ -292,8 +299,15 @@ Java_java_net_PlainDatagramSocketImpl_co
 
     NET_InetAddressToSockaddr(env, address, port, (struct sockaddr *)&rmtaddr, &len);
 #if defined(_ALLBSD_SOURCE)
-            if (cannotMap4to6(env, address))
-                return;
+#if defined(IPV6_V6ONLY)
+    if (((struct sockaddr *)&rmtaddr)->sa_family == AF_INET6) {
+	int t = 0;
+	JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&t, sizeof(t));
+    }
+#else
+    if (cannotMap4to6(env, address))
+	return;
+#endif /* IPV6_V6ONLY */
 #endif /* _ALLBSD_SOURCE */
 
 
@@ -2191,11 +2205,18 @@ static void mcast_join_leave(JNIEnv *env
 	jbyte caddr[16];
 	jint family;
 	jint address;
+#if defined(_ALLBSD_SOURCE) && defined(IPV6_V6ONLY)
+	int t = 0;
+#endif
 	family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4? AF_INET : AF_INET6;
 
 #if defined(_ALLBSD_SOURCE)
-	    if (cannotMap4to6(env, iaObj))
-		return;
+#if defined(IPV6_V6ONLY)
+	JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&t, sizeof(t));
+#else
+	if (cannotMap4to6(env, iaObj))
+	    return;
+#endif /* IPV6_V6ONLY */
 #endif /* _ALLBSD_SOURCE */
 
 	if (family == AF_INET) { /* will convert to IPv4-mapped address */
Index: ../../j2se/src/solaris/native/java/net/PlainSocketImpl.c
diff -u -p ../../j2se/src/solaris/native/java/net/PlainSocketImpl.c.orig ../../j2se/src/solaris/native/java/net/PlainSocketImpl.c
--- ../../j2se/src/solaris/native/java/net/PlainSocketImpl.c.orig	Mon Oct 31 21:54:39 2005
+++ ../../j2se/src/solaris/native/java/net/PlainSocketImpl.c	Tue Nov  1 13:11:57 2005
@@ -323,8 +323,15 @@ Java_java_net_PlainSocketImpl_socketConn
     /* connect */
     NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&him, &len);
 #if defined(_ALLBSD_SOURCE)
-            if (cannotMap4to6(env, iaObj))
-                return;
+#if defined(IPV6_V6ONLY)
+    if (((struct sockaddr *)&him)->sa_family == AF_INET6) {
+	int t = 0;
+	JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&t, sizeof(t));
+    }
+#else
+    if (cannotMap4to6(env, iaObj))
+	return;
+#endif /* IPV6_V6ONLY */
 #endif /* _ALLBSD_SOURCE */
 
 #ifdef AF_INET6
@@ -579,8 +586,15 @@ Java_java_net_PlainSocketImpl_socketBind
     /* bind */
     NET_InetAddressToSockaddr(env, iaObj, localport, (struct sockaddr *)&him, &len);
 #if defined(_ALLBSD_SOURCE)
-            if (cannotMap4to6(env, iaObj))
-                return;
+#if defined(IPV6_V6ONLY)
+    if (((struct sockaddr *)&him)->sa_family == AF_INET6) {
+	int t = 0;
+	JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&t, sizeof(t));
+    }
+#else
+    if (cannotMap4to6(env, iaObj))
+	return;
+#endif /* IPV6_V6ONLY */
 #endif /* _ALLBSD_SOURCE */
 
     if (NET_Bind(fd, (struct sockaddr *)&him, len) < 0) {
Index: ../../j2se/src/solaris/native/java/net/net_util_md.c
diff -u -p ../../j2se/src/solaris/native/java/net/net_util_md.c.orig ../../j2se/src/solaris/native/java/net/net_util_md.c
--- ../../j2se/src/solaris/native/java/net/net_util_md.c.orig	Mon Oct 31 21:54:39 2005
+++ ../../j2se/src/solaris/native/java/net/net_util_md.c	Tue Nov  1 13:14:35 2005
@@ -1129,7 +1129,7 @@ NET_Bind(int fd, struct sockaddr *him, i
     return rv;
 }
 
-#if defined(_ALLBSD_SOURCE)
+#if defined(_ALLBSD_SOURCE) && !defined(IPV6_V6ONLY)
 
 /*
  * If net.inet6.ip6.v6only is set to 1, then IPv4 mapped addresses usage
Index: ../../j2se/src/solaris/native/java/net/net_util_md.h
diff -u ../../j2se/src/solaris/native/java/net/net_util_md.h.orig ../../j2se/src/solaris/native/java/net/net_util_md.h
--- ../../j2se/src/solaris/native/java/net/net_util_md.h.orig	Mon Oct 31 21:54:39 2005
+++ ../../j2se/src/solaris/native/java/net/net_util_md.h	Tue Nov  1 13:15:39 2005
@@ -24,6 +24,9 @@
 #endif
 #endif /* !_ALLBSD_SOURCE */
 
+#if defined(IPV6_V6ONLY) && defined(__OpenBSD__)
+#undef IPV6_V6ONLY
+#endif
 /*
  * Linux header files define sockaddr_in6 incorrectly (missing the
  * sin6_scope_id field) so we use our own definition.
@@ -144,7 +147,7 @@
 /*
  * Check for disabled IPv4 mapped addresses.
  */
-#if defined(_ALLBSD_SOURCE)
+#if defined(_ALLBSD_SOURCE) && !defined(IPV6_V6ONLY)
 int cannotMap4to6(JNIEnv *env, jobject iaObj);
 #endif
 


--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
ume@mahoroba.org  ume@{,jp.}FreeBSD.org
http://www.imasy.org/~ume/
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?yge4q3kzc9b.wl%ume>