< prev index next >
src/java.base/unix/native/libnio/ch/Net.c
Print this page
rev 57536 : [mq]: Cleanup
*** 1,7 ****
/*
! * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 39,126 ****
#include "net_util.h"
#include "net_util_md.h"
#include "nio_util.h"
#include "nio.h"
! #ifdef _AIX
! #include <stdlib.h>
! #include <sys/utsname.h>
#endif
/**
! * IP_MULTICAST_ALL supported since 2.6.31 but may not be available at
! * build time.
*/
#ifdef __linux__
#ifndef IP_MULTICAST_ALL
#define IP_MULTICAST_ALL 49
#endif
#endif
- /**
- * IPV6_ADD_MEMBERSHIP/IPV6_DROP_MEMBERSHIP may not be defined on OSX and AIX
- */
- #if defined(__APPLE__) || defined(_AIX)
- #ifndef IPV6_ADD_MEMBERSHIP
- #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
- #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
- #endif
- #endif
-
- #define COPY_INET6_ADDRESS(env, source, target) \
- (*env)->GetByteArrayRegion(env, source, 0, 16, target)
-
- /*
- * Copy IPv6 group, interface index, and IPv6 source address
- * into group_source_req structure.
- */
- static void initGroupSourceReq(JNIEnv* env, jbyteArray group, jint index,
- jbyteArray source, struct group_source_req *req)
- {
- struct sockaddr_in6* sin6;
-
- req->gsr_interface = (uint32_t)index;
-
- sin6 = (struct sockaddr_in6 *)&(req->gsr_group);
- sin6->sin6_family = AF_INET6;
- COPY_INET6_ADDRESS(env, group, (jbyte *)&(sin6->sin6_addr));
-
- sin6 = (struct sockaddr_in6 *)&(req->gsr_source);
- sin6->sin6_family = AF_INET6;
- COPY_INET6_ADDRESS(env, source, (jbyte *)&(sin6->sin6_addr));
- }
-
- #ifdef _AIX
-
- /*
- * Checks whether or not "socket extensions for multicast source filters" is supported.
- * Returns JNI_TRUE if it is supported, JNI_FALSE otherwise
- */
- static jboolean isSourceFilterSupported(){
- static jboolean alreadyChecked = JNI_FALSE;
- static jboolean result = JNI_TRUE;
- if (alreadyChecked != JNI_TRUE){
- struct utsname uts;
- memset(&uts, 0, sizeof(uts));
- strcpy(uts.sysname, "?");
- const int utsRes = uname(&uts);
- int major = -1;
- int minor = -1;
- major = atoi(uts.version);
- minor = atoi(uts.release);
- if (strcmp(uts.sysname, "AIX") == 0) {
- if (major < 6 || (major == 6 && minor < 1)) {// unsupported on aix < 6.1
- result = JNI_FALSE;
- }
- }
- alreadyChecked = JNI_TRUE;
- }
- return result;
- }
-
- #endif /* _AIX */
-
static jclass isa_class; /* java.net.InetSocketAddress */
static jmethodID isa_ctorID; /* InetSocketAddress(InetAddress, int) */
JNIEXPORT void JNICALL
Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz)
--- 39,66 ----
#include "net_util.h"
#include "net_util_md.h"
#include "nio_util.h"
#include "nio.h"
! /**
! * Use MCAST_JOIN_GROUP/MCAST_BLOCK_SOURCE on platforms that support it.
! */
! #if defined(__linux__) || defined(__solaris__)
! #include "nio_multicast.h"
! #define USE_MCAST_XXX 1
#endif
/**
! * IP_MULTICAST_ALL supported since 2.6.31 (and glibc 2.15) but may not be
! * available at build time.
*/
#ifdef __linux__
#ifndef IP_MULTICAST_ALL
#define IP_MULTICAST_ALL 49
#endif
#endif
static jclass isa_class; /* java.net.InetSocketAddress */
static jmethodID isa_ctorID; /* InetSocketAddress(InetAddress, int) */
JNIEXPORT void JNICALL
Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz)
*** 181,194 ****
JNIEXPORT jboolean JNICALL
Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl)
{
#if defined(__APPLE__) || defined(__solaris__)
! /* IPV6_ADD_MEMBERSHIP can be used to join IPv4 multicast groups */
return JNI_TRUE;
#else
! /* IPV6_ADD_MEMBERSHIP cannot be used to join IPv4 multicast groups */
return JNI_FALSE;
#endif
}
JNIEXPORT jboolean JNICALL
--- 121,134 ----
JNIEXPORT jboolean JNICALL
Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl)
{
#if defined(__APPLE__) || defined(__solaris__)
! /* IPv6 sockets use IPPROTO_IPV6 level options to join IPv4 multicast groups */
return JNI_TRUE;
#else
! /* IPv6 sockets use IPPROTO_IP level options to join IPv4 multicast groups */
return JNI_FALSE;
#endif
}
JNIEXPORT jboolean JNICALL
*** 554,706 ****
}
}
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_joinOrDrop4(JNIEnv *env, jobject this, jboolean join, jobject fdo,
! jint group, jint interf, jint source)
{
! struct ip_mreq mreq;
! struct ip_mreq_source mreq_source;
! int opt, n, optlen;
! void* optval;
!
if (source == 0) {
! mreq.imr_multiaddr.s_addr = htonl(group);
! mreq.imr_interface.s_addr = htonl(interf);
! opt = (join) ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP;
! optval = (void*)&mreq;
! optlen = sizeof(mreq);
} else {
!
! #ifdef _AIX
! /* check AIX for support of source filtering */
! if (isSourceFilterSupported() != JNI_TRUE){
! return IOS_UNAVAILABLE;
}
! #endif
!
mreq_source.imr_multiaddr.s_addr = htonl(group);
mreq_source.imr_sourceaddr.s_addr = htonl(source);
! mreq_source.imr_interface.s_addr = htonl(interf);
! opt = (join) ? IP_ADD_SOURCE_MEMBERSHIP : IP_DROP_SOURCE_MEMBERSHIP;
! optval = (void*)&mreq_source;
! optlen = sizeof(mreq_source);
}
!
! n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, optval, optlen);
! if (n < 0) {
! if (join && (errno == ENOPROTOOPT || errno == EOPNOTSUPP))
! return IOS_UNAVAILABLE;
handleSocketError(env, errno);
}
return 0;
}
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_blockOrUnblock4(JNIEnv *env, jobject this, jboolean block, jobject fdo,
! jint group, jint interf, jint source)
{
! #ifdef __APPLE__
! /* no IPv4 exclude-mode filtering for now */
return IOS_UNAVAILABLE;
! #else
! struct ip_mreq_source mreq_source;
int n;
int opt = (block) ? IP_BLOCK_SOURCE : IP_UNBLOCK_SOURCE;
!
! #ifdef _AIX
! /* check AIX for support of source filtering */
! if (isSourceFilterSupported() != JNI_TRUE){
! return IOS_UNAVAILABLE;
! }
! #endif
!
mreq_source.imr_multiaddr.s_addr = htonl(group);
mreq_source.imr_sourceaddr.s_addr = htonl(source);
! mreq_source.imr_interface.s_addr = htonl(interf);
!
! n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt,
! (void*)&mreq_source, sizeof(mreq_source));
! if (n < 0) {
! if (block && (errno == ENOPROTOOPT || errno == EOPNOTSUPP))
! return IOS_UNAVAILABLE;
handleSocketError(env, errno);
}
return 0;
! #endif
}
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_joinOrDrop6(JNIEnv *env, jobject this, jboolean join, jobject fdo,
jbyteArray group, jint index, jbyteArray source)
{
! struct ipv6_mreq mreq6;
struct group_source_req req;
! int opt, n, optlen;
! void* optval;
!
if (source == NULL) {
! COPY_INET6_ADDRESS(env, group, (jbyte*)&(mreq6.ipv6mr_multiaddr));
mreq6.ipv6mr_interface = (int)index;
! opt = (join) ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP;
! optval = (void*)&mreq6;
! optlen = sizeof(mreq6);
} else {
! #ifdef __APPLE__
! /* no IPv6 include-mode filtering for now */
return IOS_UNAVAILABLE;
- #else
- initGroupSourceReq(env, group, index, source, &req);
- opt = (join) ? MCAST_JOIN_SOURCE_GROUP : MCAST_LEAVE_SOURCE_GROUP;
- optval = (void*)&req;
- optlen = sizeof(req);
- #endif
}
!
! n = setsockopt(fdval(env,fdo), IPPROTO_IPV6, opt, optval, optlen);
! if (n < 0) {
! if (join && (errno == ENOPROTOOPT || errno == EOPNOTSUPP))
! return IOS_UNAVAILABLE;
handleSocketError(env, errno);
}
return 0;
}
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_blockOrUnblock6(JNIEnv *env, jobject this, jboolean block, jobject fdo,
jbyteArray group, jint index, jbyteArray source)
{
! #ifdef __APPLE__
! /* no IPv6 exclude-mode filtering for now */
! return IOS_UNAVAILABLE;
! #else
! struct group_source_req req;
int n;
int opt = (block) ? MCAST_BLOCK_SOURCE : MCAST_UNBLOCK_SOURCE;
!
! initGroupSourceReq(env, group, index, source, &req);
!
! n = setsockopt(fdval(env,fdo), IPPROTO_IPV6, opt,
! (void*)&req, sizeof(req));
! if (n < 0) {
! if (block && (errno == ENOPROTOOPT || errno == EOPNOTSUPP))
! return IOS_UNAVAILABLE;
handleSocketError(env, errno);
}
return 0;
! #endif
}
JNIEXPORT void JNICALL
! Java_sun_nio_ch_Net_setInterface4(JNIEnv* env, jobject this, jobject fdo, jint interf)
{
struct in_addr in;
socklen_t arglen = sizeof(struct in_addr);
int n;
! in.s_addr = htonl(interf);
!
n = setsockopt(fdval(env, fdo), IPPROTO_IP, IP_MULTICAST_IF,
(void*)&(in.s_addr), arglen);
if (n < 0) {
handleSocketError(env, errno);
}
--- 494,639 ----
}
}
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_joinOrDrop4(JNIEnv *env, jobject this, jboolean join, jobject fdo,
! jint group, jint index, jint infAddress, jint source)
{
! int n;
! int fd = fdval(env, fdo);
! #ifdef USE_MCAST_XXX
if (source == 0) {
! int opt = (join) ? MCAST_JOIN_GROUP : MCAST_LEAVE_GROUP;
! struct group_req req;
! initGroupReq4(env, &req, index, group);
! n = setsockopt(fd, IPPROTO_IP, opt, (const void*)&req, sizeof(req));
} else {
! int opt = (join) ? MCAST_JOIN_SOURCE_GROUP : MCAST_LEAVE_SOURCE_GROUP;
! struct group_source_req req;
! initGroupSourceReq4(env, &req, index, group, source);
! n = setsockopt(fd, IPPROTO_IP, opt, (const void*)&req, sizeof(req));
}
! #else
! if (source == 0) {
! int opt = (join) ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP;
! struct ip_mreq mreq;
! mreq.imr_multiaddr.s_addr = htonl(group);
! mreq.imr_interface.s_addr = htonl(infAddress);
! n = setsockopt(fd, IPPROTO_IP, opt, (const void*)&mreq, sizeof(mreq));
! } else {
! int opt = (join) ? IP_ADD_SOURCE_MEMBERSHIP : IP_DROP_SOURCE_MEMBERSHIP;
! struct ip_mreq_source mreq_source;
mreq_source.imr_multiaddr.s_addr = htonl(group);
+ mreq_source.imr_interface.s_addr = htonl(infAddress);
mreq_source.imr_sourceaddr.s_addr = htonl(source);
! n = setsockopt(fd, IPPROTO_IP, opt, (const void*)&mreq_source, sizeof(mreq_source));
}
! #endif
! if (n == -1) {
handleSocketError(env, errno);
}
return 0;
}
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_blockOrUnblock4(JNIEnv *env, jobject this, jboolean block, jobject fdo,
! jint group, jint index, jint infAddress, jint source)
{
! #if defined(__APPLE__)
! /* no IPv4 exclude-mode filtering on this platform */
return IOS_UNAVAILABLE;
! #else
int n;
+ int fd = fdval(env, fdo);
+ #if USE_MCAST_XXX
+ int opt = (block) ? MCAST_BLOCK_SOURCE : MCAST_UNBLOCK_SOURCE;
+ struct group_source_req req;
+ initGroupSourceReq4(env, &req, index, group, source);
+ n = setsockopt(fd, IPPROTO_IP, opt, (const char*)&req, sizeof(req));
+ #else
int opt = (block) ? IP_BLOCK_SOURCE : IP_UNBLOCK_SOURCE;
! struct ip_mreq_source mreq_source;
mreq_source.imr_multiaddr.s_addr = htonl(group);
+ mreq_source.imr_interface.s_addr = htonl(infAddress);
mreq_source.imr_sourceaddr.s_addr = htonl(source);
! n = setsockopt(fd, IPPROTO_IP, opt, (void*)&mreq_source, sizeof(mreq_source));
! #endif
! if (n == -1) {
handleSocketError(env, errno);
}
return 0;
! #endif
}
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_joinOrDrop6(JNIEnv *env, jobject this, jboolean join, jobject fdo,
jbyteArray group, jint index, jbyteArray source)
{
! int n;
! int fd = fdval(env, fdo);
! #ifdef USE_MCAST_XXX
! if (source == NULL) {
! int opt = (join) ? MCAST_JOIN_GROUP : MCAST_LEAVE_GROUP;
! struct group_req req;
! initGroupReq6(env, &req, index, group);
! n = setsockopt(fd, IPPROTO_IPV6, opt, (const void*)&req, sizeof(req));
! } else {
! int opt = (join) ? MCAST_JOIN_SOURCE_GROUP : MCAST_LEAVE_SOURCE_GROUP;
struct group_source_req req;
! initGroupSourceReq6(env, &req, index, group, source);
! n = setsockopt(fd, IPPROTO_IPV6, opt, (const void*)&req, sizeof(req));
! }
! #else
! #ifndef IPV6_ADD_MEMBERSHIP
! #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
! #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
! #endif
if (source == NULL) {
! int opt = (join) ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP;
! struct ipv6_mreq mreq6;
mreq6.ipv6mr_interface = (int)index;
! (*env)->GetByteArrayRegion(env, group, 0, 16, (jbyte*)&(mreq6.ipv6mr_multiaddr));
! n = setsockopt(fd, IPPROTO_IPV6, opt, (const void*)&mreq6, sizeof(mreq6));
} else {
! /* no IPv6 include-mode filtering */
return IOS_UNAVAILABLE;
}
! #endif
! if (n == -1) {
handleSocketError(env, errno);
}
return 0;
}
JNIEXPORT jint JNICALL
Java_sun_nio_ch_Net_blockOrUnblock6(JNIEnv *env, jobject this, jboolean block, jobject fdo,
jbyteArray group, jint index, jbyteArray source)
{
! #ifdef USE_MCAST_XXX
int n;
int opt = (block) ? MCAST_BLOCK_SOURCE : MCAST_UNBLOCK_SOURCE;
! struct group_source_req req;
! initGroupSourceReq6(env, &req, index, group, source);
! n = setsockopt(fdval(env,fdo), IPPROTO_IPV6, opt, (void*)&req, sizeof(req));
! if (n == -1) {
handleSocketError(env, errno);
}
return 0;
! #else
! /* no IPv6 exclude-mode filtering */
! return IOS_UNAVAILABLE;
! #endif
}
JNIEXPORT void JNICALL
! Java_sun_nio_ch_Net_setInterface4(JNIEnv* env, jobject this, jobject fdo, jint infAddress)
{
struct in_addr in;
socklen_t arglen = sizeof(struct in_addr);
int n;
! in.s_addr = htonl(infAddress);
n = setsockopt(fdval(env, fdo), IPPROTO_IP, IP_MULTICAST_IF,
(void*)&(in.s_addr), arglen);
if (n < 0) {
handleSocketError(env, errno);
}
< prev index next >