diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollSocketChannelConfig.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollSocketChannelConfig.java index eaf2523b98..98e5000ef0 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollSocketChannelConfig.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollSocketChannelConfig.java @@ -60,7 +60,7 @@ public final class EpollSocketChannelConfig extends EpollChannelConfig implement SO_RCVBUF, SO_SNDBUF, TCP_NODELAY, SO_KEEPALIVE, SO_REUSEADDR, SO_LINGER, IP_TOS, ALLOW_HALF_CLOSURE, EpollChannelOption.TCP_CORK, EpollChannelOption.TCP_NOTSENT_LOWAT, EpollChannelOption.TCP_KEEPCNT, EpollChannelOption.TCP_KEEPIDLE, EpollChannelOption.TCP_KEEPINTVL, - EpollChannelOption.TCP_MD5SIG, EpollChannelOption.TCP_QUICKACK); + EpollChannelOption.TCP_MD5SIG, EpollChannelOption.TCP_QUICKACK, EpollChannelOption.IP_TRANSPARENT); } @SuppressWarnings("unchecked") @@ -111,6 +111,9 @@ public final class EpollSocketChannelConfig extends EpollChannelConfig implement if (option == EpollChannelOption.TCP_QUICKACK) { return (T) Boolean.valueOf(isTcpQuickAck()); } + if (option == EpollChannelOption.IP_TRANSPARENT) { + return (T) Boolean.valueOf(isIpTransparent()); + } return super.getOption(option); } @@ -146,6 +149,8 @@ public final class EpollSocketChannelConfig extends EpollChannelConfig implement setTcpKeepIntvl((Integer) value); } else if (option == EpollChannelOption.TCP_USER_TIMEOUT) { setTcpUserTimeout((Integer) value); + } else if (option == EpollChannelOption.IP_TRANSPARENT) { + setIpTransparent((Boolean) value); } else if (option == EpollChannelOption.TCP_MD5SIG) { @SuppressWarnings("unchecked") final Map m = (Map) value; @@ -446,6 +451,31 @@ public final class EpollSocketChannelConfig extends EpollChannelConfig implement } } + /** + * Returns {@code true} if IP_TRANSPARENT is enabled, + * {@code false} otherwise. + */ + public boolean isIpTransparent() { + try { + return channel.socket.isIpTransparent(); + } catch (IOException e) { + throw new ChannelException(e); + } + } + + /** + * If {@code true} is used IP_TRANSPARENT is enabled, + * {@code false} for disable it. Default is disabled. + */ + public EpollSocketChannelConfig setIpTransparent(boolean transparent) { + try { + channel.socket.setIpTransparent(transparent); + return this; + } catch (IOException e) { + throw new ChannelException(e); + } + } + /** * Set the {@code TCP_MD5SIG} option on the socket. See {@code linux/tcp.h} for more details. * Keys can only be set on, not read to prevent a potential leak, as they are confidential.