< prev index next >
src/jdk.net/share/classes/jdk/net/Sockets.java
Print this page
*** 24,39 ****
--- 24,43 ----
*/
package jdk.net;
import java.net.*;
+ import java.nio.channels.*;
import java.io.IOException;
+ import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+ import rdma.ch.RdmaPollSelectorProvider;
+ import rdma.ch.RdmaSocketImpl;
import jdk.net.ExtendedSocketOptions.PlatformSocketOptions;
/**
* Defines static methods to set and get socket options defined by the
* {@link java.net.SocketOption} interface. All of the standard options defined
*** 43,56 ****
--- 47,71 ----
* <p>
* The {@link #supportedOptions(Class)} method can be called to determine
* the complete set of options available (per socket type) on the
* current system.
* <p>
+ * The {@link #openRdmaSelector() openRdmaSelector}, {@link
+ * #openRdmaSocketChannel() openRdmaSocketChannel}, and {@link
+ * #openRdmaServerSocketChannel() openRdmaServerSocketChannel} methods
+ * create selectors and selectable channels for use with RDMA sockets.
+ * These objects are created a {@link java.nio.channels.spi.SelectorProvider
+ * SelectorProvider} that is not the default {@code SelectorProvider}.
+ * Consequently, selectable channels to RDMA sockets may not be multiplexed
+ * with selectable channel created by the default selector provider. The
+ * selector provider does not support datagram channels, its {@code
+ * openDatagramChannel} methods throw {@link UnsupportedOperationException}.
* When a security manager is installed, some non-standard socket options
* may require a security permission before being set or get.
* The details are specified in {@link ExtendedSocketOptions}. No permission
* is required for {@link java.net.StandardSocketOptions}.
+ * <p>
*
* @see java.nio.channels.NetworkChannel
*/
public class Sockets {
*** 373,378 ****
--- 388,512 ----
AVAILABLE = s.containsAll(Set.of(ExtendedSocketOptions.TCP_KEEPCOUNT,
ExtendedSocketOptions.TCP_KEEPIDLE,
ExtendedSocketOptions.TCP_KEEPINTERVAL));
}
}
+
+
+ /**
+ * Creates an unconnected RDMA socket.
+ *
+ * <p> A RDMA socket supports the same socket options that that {@code
+ * java.net.Socket} defines. In addition, it also supports the socket options
+ * specified by {@link RdmaSocketOptions}.
+ *
+ * @apiNote The rsocket implementation on Linux only supports IPv4 addresses.
+ * Consequently, attempting to bind or connect to an IPv6 address will fail
+ * with {@code IllegalArgumentException}.
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ * @throws UnsupportedOperationException
+ * If RDMA sockets are not supported on this platform
+ *
+ * @since 12
+ */
+ public static Socket openRdmaSocket() throws IOException {
+ RdmaSocketImpl impl = new RdmaSocketImpl();
+ Socket s = new Socket(impl) {};
+ return s;
+ }
+
+ /**
+ * Creates an unbound RDMA server socket.
+ *
+ * <p> A RDMA socket supports the same socket options that that {@code
+ * java.net.ServerSocket} defines.
+ *
+ * @apiNote The rsocket implementation on Linux only supports IPv4 addresses.
+ * Consequently, attempting to bind to an IPv6 address will fail with
+ * {@code IllegalArgumentException}.
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ * @throws UnsupportedOperationException
+ * If RDMA sockets are not supported on this platform
+ *
+ * @since N
+ */
+ public static ServerSocket openRdmaServerSocket() throws IOException {
+ SocketImpl impl = new RdmaSocketImpl();
+ ServerSocket ss = new ServerSocket(impl) {
+ public Socket accept() throws IOException {
+ if (isClosed())
+ throw new SocketException("Socket is closed");
+ if (!isBound())
+ throw new SocketException("Socket is not bound yet");
+
+ Socket s = openRdmaSocket();
+ implAccept(s);
+ return s;
+ }
+ };
+ return ss;
+ }
+
+ /**
+ * Opens a socket channel to a RDMA socket. A newly-created socket channel
+ * is {@link SocketChannel#isOpen() open}, not yet bound to a {@link
+ * SocketChannel#getLocalAddress() local address}, and not yet
+ * {@link SocketChannel#isConnected() connected}.
+ *
+ * <p> A socket channel to a RDMA socket supports all of the socket options
+ * specified by {@code SocketChannel}. In addition, it also supports the
+ * socket options specified by {@link RdmaSocketOptions}.
+ *
+ * @apiNote The rsocket implementation on Linux only supports IPv4 addresses.
+ * Consequently, attempting to bind or connect to an IPv6 address will fail
+ * with {@code UnsupportedAddressTypeException}.
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ * @throws UnsupportedOperationException
+ * If RDMA sockets are not supported on this platform
+ *
+ * @since 12
+ */
+ public static SocketChannel openRdmaSocketChannel() throws IOException {
+ return RdmaPollSelectorProvider.provider().openSocketChannel();
+ }
+
+ /**
+ * Opens a server-socket channel to a RDMA socket. A newly-created socket
+ * channel is {@link SocketChannel#isOpen() open} but not yet bound to a
+ * {@link SocketChannel#getLocalAddress() local address}.
+ *
+ * @apiNote The rsocket implementation on Linux only supports IPv4 addresses.
+ * Consequently, attempting to bind to an IPv6 address will fail with
+ * {@code UnsupportedAddressTypeException}.
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ * @throws UnsupportedOperationException
+ * If RDMA sockets are not supported on this platform
+ *
+ * @since 12
+ */
+ public static ServerSocketChannel openRdmaServerSocketChannel()
+ throws IOException {
+ return RdmaPollSelectorProvider.provider().openServerSocketChannel();
+ }
+
+ /**
+ * Opens a selector to multiplex selectable channels to RDMA sockets.
+ *
+ * @throws IOException
+ * If an I/O error occurs
+ * @throws UnsupportedOperationException
+ * If RDMA sockets are not supported on this platform
+ *
+ * @since 12
+ */
+ public static Selector openRdmaSelector() throws IOException {
+ return RdmaPollSelectorProvider.provider().openSelector();
+ }
}
< prev index next >