mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 23:34:52 +02:00
8193419: Better Internet address support
Reviewed-by: chegar, rriggs, igerasim, skoivu, rhalade
This commit is contained in:
parent
addc5a823f
commit
d5e9b33541
13 changed files with 102 additions and 16 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2018, 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
|
||||
|
@ -146,7 +146,11 @@ Java_java_net_Inet4AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
|||
}
|
||||
setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in *)
|
||||
(iterator->ai_addr))->sin_addr.s_addr));
|
||||
if ((*env)->ExceptionCheck(env))
|
||||
goto cleanupAndReturn;
|
||||
setInetAddress_hostName(env, iaObj, host);
|
||||
if ((*env)->ExceptionCheck(env))
|
||||
goto cleanupAndReturn;
|
||||
(*env)->SetObjectArrayElement(env, ret, i++, iaObj);
|
||||
iterator = iterator->ai_next;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2018, 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
|
||||
|
@ -187,7 +187,11 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
|||
goto cleanupAndReturn;
|
||||
}
|
||||
setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
|
||||
if ((*env)->ExceptionCheck(env))
|
||||
goto cleanupAndReturn;
|
||||
setInetAddress_hostName(env, iaObj, host);
|
||||
if ((*env)->ExceptionCheck(env))
|
||||
goto cleanupAndReturn;
|
||||
(*env)->SetObjectArrayElement(env, ret, (inetIndex | originalIndex), iaObj);
|
||||
inetIndex++;
|
||||
} else if (iterator->ai_family == AF_INET6) {
|
||||
|
@ -208,6 +212,8 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
|||
setInet6Address_scopeid(env, iaObj, scope);
|
||||
}
|
||||
setInetAddress_hostName(env, iaObj, host);
|
||||
if ((*env)->ExceptionCheck(env))
|
||||
goto cleanupAndReturn;
|
||||
(*env)->SetObjectArrayElement(env, ret, (inet6Index | originalIndex), iaObj);
|
||||
inet6Index++;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2018, 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
|
||||
|
@ -586,6 +586,7 @@ jobject createNetworkInterface
|
|||
/* default ctor will set family to AF_INET */
|
||||
|
||||
setInetAddress_addr(env, iaObj, ntohl(addrs->addr.sa4.sin_addr.s_addr));
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, NULL);
|
||||
if (addrs->mask != -1) {
|
||||
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
|
||||
if (ibObj == NULL) {
|
||||
|
@ -599,6 +600,7 @@ jobject createNetworkInterface
|
|||
return NULL;
|
||||
}
|
||||
setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.sa4.sin_addr.s_addr));
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, NULL);
|
||||
(*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
|
||||
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
|
||||
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
|
||||
|
@ -754,8 +756,9 @@ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0
|
|||
(JNIEnv *env, jclass cls, jobject iaObj)
|
||||
{
|
||||
netif *ifList, *curr;
|
||||
jint addr = getInetAddress_addr(env, iaObj);
|
||||
jobject netifObj = NULL;
|
||||
jint addr = getInetAddress_addr(env, iaObj);
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, NULL);
|
||||
|
||||
// Retained for now to support IPv4 only stack, java.net.preferIPv4Stack
|
||||
if (ipv6_available()) {
|
||||
|
|
|
@ -584,7 +584,7 @@ static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs)
|
|||
/* default ctor will set family to AF_INET */
|
||||
|
||||
setInetAddress_addr(env, iaObj, ntohl(addrs->addr.sa4.sin_addr.s_addr));
|
||||
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, NULL);
|
||||
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
|
||||
if (ibObj == NULL) {
|
||||
free_netaddr(netaddrP);
|
||||
|
@ -597,6 +597,7 @@ static jobject createNetworkInterfaceXP(JNIEnv *env, netif *ifs)
|
|||
return NULL;
|
||||
}
|
||||
setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.sa4.sin_addr.s_addr));
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, NULL);
|
||||
(*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
|
||||
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
|
||||
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
|
||||
|
|
|
@ -228,7 +228,7 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
|||
"Protocol family not supported");
|
||||
return;
|
||||
}
|
||||
|
||||
JNU_CHECK_EXCEPTION(env);
|
||||
if (IS_NULL(fdObj) || (ipv6_supported && IS_NULL(fd1Obj))) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "socket closed");
|
||||
return;
|
||||
|
@ -344,6 +344,7 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_connect0
|
|||
}
|
||||
|
||||
family = getInetAddress_family(env, address);
|
||||
JNU_CHECK_EXCEPTION(env);
|
||||
if (family == java_net_InetAddress_IPv6 && !ipv6_available()) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
"Protocol family not supported");
|
||||
|
@ -455,6 +456,7 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_send
|
|||
}
|
||||
|
||||
family = getInetAddress_family(env, iaObj);
|
||||
JNU_CHECK_EXCEPTION(env);
|
||||
if (family == java_net_InetAddress_IPv4) {
|
||||
fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
|
||||
} else {
|
||||
|
@ -584,6 +586,7 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_peek(JNIEnv *env, jobject this,
|
|||
return -1;
|
||||
} else {
|
||||
address = getInetAddress_addr(env, addressObj);
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, -1);
|
||||
/* We only handle IPv4 for now. Will support IPv6 once its in the os */
|
||||
family = AF_INET;
|
||||
}
|
||||
|
@ -657,7 +660,9 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_peek(JNIEnv *env, jobject this,
|
|||
return 0;
|
||||
}
|
||||
setInetAddress_addr(env, addressObj, ntohl(remote_addr.sa4.sin_addr.s_addr));
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, -1);
|
||||
setInetAddress_family(env, addressObj, java_net_InetAddress_IPv4);
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, -1);
|
||||
|
||||
/* return port */
|
||||
return ntohs(remote_addr.sa4.sin_port);
|
||||
|
@ -1349,6 +1354,7 @@ static int getInetAddrFromIf (JNIEnv *env, int family, jobject nif, jobject *iad
|
|||
int fam;
|
||||
addr = (*env)->GetObjectArrayElement(env, addrArray, i);
|
||||
fam = getInetAddress_family(env, addr);
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, -1);
|
||||
if (fam == family) {
|
||||
*iaddr = addr;
|
||||
return 0;
|
||||
|
@ -1367,6 +1373,7 @@ static int getInet4AddrFromIf (JNIEnv *env, jobject nif, struct in_addr *iaddr)
|
|||
}
|
||||
|
||||
iaddr->s_addr = htonl(getInetAddress_addr(env, addr));
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1471,6 +1478,7 @@ static void setMulticastInterface(JNIEnv *env, jobject this, int fd, int fd1,
|
|||
struct in_addr in;
|
||||
|
||||
in.s_addr = htonl(getInetAddress_addr(env, value));
|
||||
JNU_CHECK_EXCEPTION(env);
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
|
||||
(const char*)&in, sizeof(in)) < 0) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
|
@ -1712,7 +1720,7 @@ static jobject getIPv4NetworkInterface (JNIEnv *env, jobject this, int fd, jint
|
|||
CHECK_NULL_RETURN(addr, NULL);
|
||||
|
||||
setInetAddress_addr(env, addr, ntohl(in.s_addr));
|
||||
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, NULL);
|
||||
/*
|
||||
* For IP_MULTICAST_IF return InetAddress
|
||||
*/
|
||||
|
|
|
@ -794,6 +794,7 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port,
|
|||
jboolean v4MappedAddress)
|
||||
{
|
||||
jint family = getInetAddress_family(env, iaObj);
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, -1);
|
||||
memset((char *)sa, 0, sizeof(SOCKETADDRESS));
|
||||
|
||||
if (ipv6_available() &&
|
||||
|
@ -808,6 +809,7 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port,
|
|||
// convert to IPv4-mapped address
|
||||
memset((char *)caddr, 0, 16);
|
||||
address = getInetAddress_addr(env, iaObj);
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, -1);
|
||||
if (address == INADDR_ANY) {
|
||||
/* we would always prefer IPv6 wildcard address
|
||||
* caddr[10] = 0xff;
|
||||
|
@ -846,6 +848,7 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port,
|
|||
return -1;
|
||||
}
|
||||
address = getInetAddress_addr(env, iaObj);
|
||||
JNU_CHECK_EXCEPTION_RETURN(env, -1);
|
||||
sa->sa4.sin_port = htons((short)port);
|
||||
sa->sa4.sin_addr.s_addr = (u_long)htonl(address);
|
||||
sa->sa4.sin_family = AF_INET;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue