1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.channel.uring;
17
18 import io.netty.channel.Channel;
19 import io.netty.channel.ChannelOption;
20 import io.netty.channel.socket.ServerSocketChannel;
21 import io.netty.channel.socket.ServerSocketChannelConfig;
22
23 import java.net.InetSocketAddress;
24 import java.net.SocketAddress;
25 import java.nio.ByteBuffer;
26
27 public final class IoUringServerSocketChannel extends AbstractIoUringServerChannel implements ServerSocketChannel {
28 private final IoUringServerSocketChannelConfig config;
29
30 public IoUringServerSocketChannel() {
31
32
33
34
35
36
37
38
39 super(LinuxSocket.newSocketStream(), false);
40 this.config = new IoUringServerSocketChannelConfig(this);
41 }
42
43 @Override
44 public ServerSocketChannelConfig config() {
45 return config;
46 }
47
48 @Override
49 Channel newChildChannel(int fd, ByteBuffer acceptedAddressMemory) {
50 IoUringIoHandler handler = registration().attachment();
51 LinuxSocket socket = new LinuxSocket(fd);
52 if (acceptedAddressMemory != null) {
53
54 final InetSocketAddress address;
55 if (socket.isIpv6()) {
56 byte[] ipv6Array = handler.inet6AddressArray();
57 byte[] ipv4Array = handler.inet4AddressArray();
58 address = SockaddrIn.getIPv6(acceptedAddressMemory, ipv6Array, ipv4Array);
59 } else {
60 byte[] addressArray = handler.inet4AddressArray();
61 address = SockaddrIn.getIPv4(acceptedAddressMemory, addressArray);
62 }
63 return new IoUringSocketChannel(this, new LinuxSocket(fd), address);
64 }
65 return new IoUringSocketChannel(this, new LinuxSocket(fd));
66 }
67
68 @Override
69 public InetSocketAddress remoteAddress() {
70 return (InetSocketAddress) super.remoteAddress();
71 }
72
73 @Override
74 public InetSocketAddress localAddress() {
75 return (InetSocketAddress) super.localAddress();
76 }
77
78 @Override
79 public void doBind(SocketAddress localAddress) throws Exception {
80 super.doBind(localAddress);
81 if (IoUring.isTcpFastOpenServerSideAvailable()) {
82 Integer fastOpen = config().getOption(ChannelOption.TCP_FASTOPEN);
83 if (fastOpen != null && fastOpen > 0) {
84 socket.setTcpFastOpen(fastOpen);
85 }
86 }
87 socket.listen(config.getBacklog());
88 active = true;
89 }
90 }