/* * Copyright 2016 The Netty Project * * The Netty Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package io.netty.channel.epoll; import io.netty.channel.unix.NativeInetAddress; import io.netty.channel.unix.PeerCredentials; import io.netty.channel.unix.Socket; import java.io.IOException; import java.net.InetAddress; /** * A socket which provides access Linux native methods. */ final class LinuxSocket extends Socket { private static final long MAX_UINT32_T = 0xFFFFFFFFL; public LinuxSocket(int fd) { super(fd); } void setTcpDeferAccept(int deferAccept) throws IOException { setTcpDeferAccept(intValue(), deferAccept); } void setTcpQuickAck(boolean quickAck) throws IOException { setTcpQuickAck(intValue(), quickAck ? 1 : 0); } void setTcpCork(boolean tcpCork) throws IOException { setTcpCork(intValue(), tcpCork ? 1 : 0); } void setTcpNotSentLowAt(long tcpNotSentLowAt) throws IOException { if (tcpNotSentLowAt < 0 || tcpNotSentLowAt > MAX_UINT32_T) { throw new IllegalArgumentException("tcpNotSentLowAt must be a uint32_t"); } setTcpNotSentLowAt(intValue(), (int) tcpNotSentLowAt); } void setTcpFastOpen(int tcpFastopenBacklog) throws IOException { setTcpFastOpen(intValue(), tcpFastopenBacklog); } void setTcpKeepIdle(int seconds) throws IOException { setTcpKeepIdle(intValue(), seconds); } void setTcpKeepIntvl(int seconds) throws IOException { setTcpKeepIntvl(intValue(), seconds); } void setTcpKeepCnt(int probes) throws IOException { setTcpKeepCnt(intValue(), probes); } void setTcpUserTimeout(int milliseconds) throws IOException { setTcpUserTimeout(intValue(), milliseconds); } void setIpFreeBind(boolean enabled) throws IOException { setIpFreeBind(intValue(), enabled ? 1 : 0); } void getTcpInfo(EpollTcpInfo info) throws IOException { getTcpInfo(intValue(), info.info); } void setTcpMd5Sig(InetAddress address, byte[] key) throws IOException { final NativeInetAddress a = NativeInetAddress.newInstance(address); setTcpMd5Sig(intValue(), a.address(), a.scopeId(), key); } boolean isTcpCork() throws IOException { return isTcpCork(intValue()) != 0; } int getTcpDeferAccept() throws IOException { return getTcpDeferAccept(intValue()); } boolean isTcpQuickAck() throws IOException { return isTcpQuickAck(intValue()) != 0; } long getTcpNotSentLowAt() throws IOException { return getTcpNotSentLowAt(intValue()) & MAX_UINT32_T; } int getTcpKeepIdle() throws IOException { return getTcpKeepIdle(intValue()); } int getTcpKeepIntvl() throws IOException { return getTcpKeepIntvl(intValue()); } int getTcpKeepCnt() throws IOException { return getTcpKeepCnt(intValue()); } int getTcpUserTimeout() throws IOException { return getTcpUserTimeout(intValue()); } boolean isIpFreeBind() throws IOException { return isIpFreeBind(intValue()) != 0; } PeerCredentials getPeerCredentials() throws IOException { return getPeerCredentials(intValue()); } public static LinuxSocket newSocketStream() { return new LinuxSocket(newSocketStream0()); } public static LinuxSocket newSocketDgram() { return new LinuxSocket(newSocketDgram0()); } public static LinuxSocket newSocketDomain() { return new LinuxSocket(newSocketDomain0()); } private static native int getTcpDeferAccept(int fd) throws IOException; private static native int isTcpQuickAck(int fd) throws IOException; private static native int isTcpCork(int fd) throws IOException; private static native int getTcpNotSentLowAt(int fd) throws IOException; private static native int getTcpKeepIdle(int fd) throws IOException; private static native int getTcpKeepIntvl(int fd) throws IOException; private static native int getTcpKeepCnt(int fd) throws IOException; private static native int getTcpUserTimeout(int fd) throws IOException; private static native int isIpFreeBind(int fd) throws IOException; private static native void getTcpInfo(int fd, int[] array) throws IOException; private static native PeerCredentials getPeerCredentials(int fd) throws IOException; private static native void setTcpDeferAccept(int fd, int deferAccept) throws IOException; private static native void setTcpQuickAck(int fd, int quickAck) throws IOException; private static native void setTcpCork(int fd, int tcpCork) throws IOException; private static native void setTcpNotSentLowAt(int fd, int tcpNotSentLowAt) throws IOException; private static native void setTcpFastOpen(int fd, int tcpFastopenBacklog) throws IOException; private static native void setTcpKeepIdle(int fd, int seconds) throws IOException; private static native void setTcpKeepIntvl(int fd, int seconds) throws IOException; private static native void setTcpKeepCnt(int fd, int probes) throws IOException; private static native void setTcpUserTimeout(int fd, int milliseconds)throws IOException; private static native void setIpFreeBind(int fd, int freeBind) throws IOException; private static native void setTcpMd5Sig(int fd, byte[] address, int scopeId, byte[] key) throws IOException; }