< prev index next >
src/jdk.net/share/classes/jdk/net/ExtendedSocketOptions.java
Print this page
*** 66,89 ****
*/
public static final SocketOption<SocketFlow> SO_FLOW_SLA = new
ExtSocketOption<SocketFlow>("SO_FLOW_SLA", SocketFlow.class);
private static final PlatformSocketOptions platformSocketOptions =
PlatformSocketOptions.get();
private static final boolean flowSupported =
platformSocketOptions.flowSupported();
private static final Set<SocketOption<?>> extendedOptions = options();
static Set<SocketOption<?>> options() {
! if (flowSupported)
return Set.of(SO_FLOW_SLA);
! else
return Collections.<SocketOption<?>>emptySet();
}
static {
// Registers the extended socket options with the base module.
sun.net.ext.ExtendedSocketOptions.register(
new sun.net.ext.ExtendedSocketOptions(extendedOptions) {
--- 66,124 ----
*/
public static final SocketOption<SocketFlow> SO_FLOW_SLA = new
ExtSocketOption<SocketFlow>("SO_FLOW_SLA", SocketFlow.class);
+ /**
+ * TCP_QUICKACK.
+ *
+ * This socket option usually enable TCP_QUICKACK mode if set or disable
+ * TCP_QUICKACK mode if cleared.
+ *
+ * The value of this socket option is a {@code Boolean} that represents
+ * whether the option is enabled or disabled. The socket option is specific
+ * to stream-oriented sockets using the TCP/IP protocol.
+ *
+ * The exact semantics of this socket option are socket type and system
+ * dependent.
+ *
+ * When TCP_QUICKACK is enabled, acks are sent immediately, rather than
+ * delayed if needed in accordance to normal TCP operation.This flag is not
+ * permanent, it only enables a switch to or from TCP_QUICKACK mode.
+ *
+ * Subsequent operation of the TCP protocol will once again enter/leave
+ * TCP_QUICKACK mode depending on internal protocol processing and factors
+ * such as delayed ack timeouts occurring and data transfer.
+ *
+ * @since 18.3
+ */
+ public static final SocketOption<Boolean> TCP_QUICKACK
+ = new ExtSocketOption<Boolean>("TCP_QUICKACK", Boolean.class);
+
private static final PlatformSocketOptions platformSocketOptions =
PlatformSocketOptions.get();
private static final boolean flowSupported =
platformSocketOptions.flowSupported();
+ private static final boolean quickAckSupported =
+ platformSocketOptions.quickAckSupported();
private static final Set<SocketOption<?>> extendedOptions = options();
static Set<SocketOption<?>> options() {
! if (flowSupported) {
! if (quickAckSupported) {
! return Set.of(SO_FLOW_SLA, TCP_QUICKACK);
! } else {
return Set.of(SO_FLOW_SLA);
! }
! } else if (quickAckSupported) {
! return Set.of(TCP_QUICKACK);
! } else {
return Collections.<SocketOption<?>>emptySet();
}
+ }
static {
// Registers the extended socket options with the base module.
sun.net.ext.ExtendedSocketOptions.register(
new sun.net.ext.ExtendedSocketOptions(extendedOptions) {
*** 103,112 ****
--- 138,149 ----
if (option == SO_FLOW_SLA) {
assert flowSupported;
SocketFlow flow = checkValueType(value, option.type());
setFlowOption(fd, flow);
+ } else if (option == TCP_QUICKACK) {
+ setQuickAckOption(fd, (boolean) value);
} else {
throw new InternalError("Unexpected option " + option);
}
}
*** 125,134 ****
--- 162,173 ----
if (option == SO_FLOW_SLA) {
assert flowSupported;
SocketFlow flow = SocketFlow.create();
getFlowOption(fd, flow);
return flow;
+ } else if (option == TCP_QUICKACK) {
+ return getQuickAckOption(fd);
} else {
throw new InternalError("Unexpected option " + option);
}
}
});
*** 154,169 ****
f.bandwidth());
f.status(status); // augment the given flow with the status
}
private static void getFlowOption(FileDescriptor fd, SocketFlow f)
! throws SocketException
! {
int status = platformSocketOptions.getFlowOption(fdAccess.get(fd), f);
f.status(status); // augment the given flow with the status
}
static class PlatformSocketOptions {
protected PlatformSocketOptions() {}
@SuppressWarnings("unchecked")
--- 193,217 ----
f.bandwidth());
f.status(status); // augment the given flow with the status
}
private static void getFlowOption(FileDescriptor fd, SocketFlow f)
! throws SocketException {
int status = platformSocketOptions.getFlowOption(fdAccess.get(fd), f);
f.status(status); // augment the given flow with the status
}
+ private static void setQuickAckOption(FileDescriptor fd, boolean enable)
+ throws SocketException {
+ platformSocketOptions.setQuickAck(fdAccess.get(fd), enable == true ? 1 : 0);
+ }
+
+ private static Object getQuickAckOption(FileDescriptor fd)
+ throws SocketException {
+ return platformSocketOptions.getQuickAck(fdAccess.get(fd));
+ }
+
static class PlatformSocketOptions {
protected PlatformSocketOptions() {}
@SuppressWarnings("unchecked")
*** 182,195 ****
new PrivilegedAction<String>() {
public String run() {
return System.getProperty("os.name");
}
});
! if ("SunOS".equals(osname))
return newInstance("jdk.net.SolarisSocketOptions");
return new PlatformSocketOptions();
}
private static final PlatformSocketOptions instance = create();
static PlatformSocketOptions get() {
return instance;
--- 230,247 ----
new PrivilegedAction<String>() {
public String run() {
return System.getProperty("os.name");
}
});
! if ("SunOS".equals(osname)) {
return newInstance("jdk.net.SolarisSocketOptions");
+ } else if ("Linux".equals(osname)) {
+ return newInstance("jdk.net.LinuxSocketOptions");
+ } else {
return new PlatformSocketOptions();
}
+ }
private static final PlatformSocketOptions instance = create();
static PlatformSocketOptions get() {
return instance;
*** 206,212 ****
--- 258,276 ----
}
boolean flowSupported() {
return false;
}
+
+ void setQuickAck(int fd, int on) throws SocketException {
+ throw new UnsupportedOperationException("unsupported TCP_QUICKACK option");
+ }
+
+ boolean getQuickAck(int fd) throws SocketException {
+ throw new UnsupportedOperationException("unsupported TCP_QUICKACK option");
+ }
+
+ boolean quickAckSupported() {
+ return false;
+ }
}
}
< prev index next >