1 /* 2 * Copyright 2020 The Netty Project 3 * 4 * The Netty Project licenses this file to you under the Apache License, 5 * version 2.0 (the "License"); you may not use this file except in compliance 6 * with the License. You may obtain a copy of the License at: 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations 14 * under the License. 15 */ 16 package io.netty.handler.codec.quic; 17 18 import io.netty.buffer.ByteBuf; 19 import io.netty.channel.Channel; 20 import io.netty.channel.ChannelFuture; 21 import io.netty.channel.ChannelHandler; 22 import io.netty.channel.ChannelProgressivePromise; 23 import io.netty.channel.ChannelPromise; 24 import io.netty.util.concurrent.Future; 25 import io.netty.util.concurrent.Promise; 26 import org.jetbrains.annotations.Nullable; 27 28 import javax.net.ssl.SSLEngine; 29 import java.net.SocketAddress; 30 31 /** 32 * A QUIC {@link Channel}. 33 */ 34 public interface QuicChannel extends Channel { 35 36 @Override 37 default ChannelFuture bind(SocketAddress localAddress) { 38 return pipeline().bind(localAddress); 39 } 40 41 @Override 42 default ChannelFuture connect(SocketAddress remoteAddress) { 43 return pipeline().connect(remoteAddress); 44 } 45 46 @Override 47 default ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress) { 48 return pipeline().connect(remoteAddress, localAddress); 49 } 50 51 @Override 52 default ChannelFuture disconnect() { 53 return pipeline().disconnect(); 54 } 55 56 @Override 57 default ChannelFuture close() { 58 return pipeline().close(); 59 } 60 61 @Override 62 default ChannelFuture deregister() { 63 return pipeline().deregister(); 64 } 65 66 @Override 67 default ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise) { 68 return pipeline().bind(localAddress, promise); 69 } 70 71 @Override 72 default ChannelFuture connect(SocketAddress remoteAddress, ChannelPromise promise) { 73 return pipeline().connect(remoteAddress, promise); 74 } 75 76 @Override 77 default ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) { 78 return pipeline().connect(remoteAddress, localAddress, promise); 79 } 80 81 @Override 82 default ChannelFuture disconnect(ChannelPromise promise) { 83 return pipeline().disconnect(promise); 84 } 85 86 @Override 87 default ChannelFuture close(ChannelPromise promise) { 88 return pipeline().close(promise); 89 } 90 91 @Override 92 default ChannelFuture deregister(ChannelPromise promise) { 93 return pipeline().deregister(promise); 94 } 95 96 @Override 97 default ChannelFuture write(Object msg) { 98 return pipeline().write(msg); 99 } 100 101 @Override 102 default ChannelFuture write(Object msg, ChannelPromise promise) { 103 return pipeline().write(msg, promise); 104 } 105 106 @Override 107 default ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) { 108 return pipeline().writeAndFlush(msg, promise); 109 } 110 111 @Override 112 default ChannelFuture writeAndFlush(Object msg) { 113 return pipeline().writeAndFlush(msg); 114 } 115 116 @Override 117 default ChannelPromise newPromise() { 118 return pipeline().newPromise(); 119 } 120 121 @Override 122 default ChannelProgressivePromise newProgressivePromise() { 123 return pipeline().newProgressivePromise(); 124 } 125 126 @Override 127 default ChannelFuture newSucceededFuture() { 128 return pipeline().newSucceededFuture(); 129 } 130 131 @Override 132 default ChannelFuture newFailedFuture(Throwable cause) { 133 return pipeline().newFailedFuture(cause); 134 } 135 136 @Override 137 default ChannelPromise voidPromise() { 138 return pipeline().voidPromise(); 139 } 140 141 @Override 142 QuicChannel read(); 143 144 @Override 145 QuicChannel flush(); 146 147 /** 148 * Returns the configuration of this channel. 149 */ 150 @Override 151 QuicChannelConfig config(); 152 153 /** 154 * Returns the used {@link SSLEngine} or {@code null} if none is used (yet). 155 * 156 * @return the engine. 157 */ 158 @Nullable 159 SSLEngine sslEngine(); 160 161 /** 162 * Returns the number of streams that can be created before stream creation will fail 163 * with {@link QuicTransportError#STREAM_LIMIT_ERROR} error. 164 * 165 * @param type the stream type. 166 * @return the number of streams left. 167 */ 168 long peerAllowedStreams(QuicStreamType type); 169 170 /** 171 * Returns {@code true} if the connection was closed because of idle timeout. 172 * 173 * @return {@code true} if the connection was closed because of idle timeout, {@code false}. 174 */ 175 boolean isTimedOut(); 176 177 /** 178 * Returns the {@link QuicTransportParameters} of the peer once received, or {@code null} if not known yet. 179 * 180 * @return peerTransportParams. 181 */ 182 @Nullable 183 QuicTransportParameters peerTransportParameters(); 184 185 /** 186 * Returns the local {@link QuicConnectionAddress}. This address might change over the life-time of the 187 * channel. 188 * 189 * @return local the local {@link QuicConnectionAddress} or {@code null} if none is assigned yet, 190 * or assigned anymore. 191 */ 192 @Override 193 @Nullable 194 QuicConnectionAddress localAddress(); 195 196 /** 197 * Returns the remote {@link QuicConnectionAddress}. This address might change over the life-time of the 198 * channel. 199 * 200 * @return remote the remote {@link QuicConnectionAddress} or {@code null} if none is assigned yet, 201 * or assigned anymore. 202 */ 203 @Override 204 @Nullable 205 QuicConnectionAddress remoteAddress(); 206 207 /** 208 * Returns the local {@link SocketAddress} of the underlying transport that received the data. 209 * This address might change over the life-time of the channel. 210 * 211 * @return local the local {@link SocketAddress} of the underlying transport or {@code null} if none is assigned 212 * yet, or assigned anymore. 213 */ 214 @Nullable 215 SocketAddress localSocketAddress(); 216 217 /** 218 * Returns the remote {@link SocketAddress} of the underlying transport to which the data is sent. 219 * This address might change over the life-time of the channel. 220 * 221 * @return local the remote {@link SocketAddress} of the underlying transport or {@code null} if none is assigned 222 * yet, or assigned anymore. 223 */ 224 @Nullable 225 SocketAddress remoteSocketAddress(); 226 227 /** 228 * Creates a stream that is using this {@link QuicChannel} and notifies the {@link Future} once done. 229 * The {@link ChannelHandler} (if not {@code null}) is added to the {@link io.netty.channel.ChannelPipeline} of the 230 * {@link QuicStreamChannel} automatically. 231 * 232 * @param type the {@link QuicStreamType} of the {@link QuicStreamChannel}. 233 * @param handler the {@link ChannelHandler} that will be added to the {@link QuicStreamChannel}s 234 * {@link io.netty.channel.ChannelPipeline} during the stream creation. 235 * @return the {@link Future} that will be notified once the operation completes. 236 */ 237 default Future<QuicStreamChannel> createStream(QuicStreamType type, @Nullable ChannelHandler handler) { 238 return createStream(type, handler, eventLoop().newPromise()); 239 } 240 241 /** 242 * Creates a stream that is using this {@link QuicChannel} and notifies the {@link Promise} once done. 243 * The {@link ChannelHandler} (if not {@code null}) is added to the {@link io.netty.channel.ChannelPipeline} of the 244 * {@link QuicStreamChannel} automatically. 245 * 246 * @param type the {@link QuicStreamType} of the {@link QuicStreamChannel}. 247 * @param handler the {@link ChannelHandler} that will be added to the {@link QuicStreamChannel}s 248 * {@link io.netty.channel.ChannelPipeline} during the stream creation. 249 * @param promise the {@link ChannelPromise} that will be notified once the operation completes. 250 * @return the {@link Future} that will be notified once the operation completes. 251 */ 252 Future<QuicStreamChannel> createStream(QuicStreamType type, @Nullable ChannelHandler handler, 253 Promise<QuicStreamChannel> promise); 254 255 /** 256 * Returns a new {@link QuicStreamChannelBootstrap} which makes it easy to bootstrap new {@link QuicStreamChannel}s 257 * with custom options and attributes. For simpler use-cases you may want to consider using 258 * {@link #createStream(QuicStreamType, ChannelHandler)} or 259 * {@link #createStream(QuicStreamType, ChannelHandler, Promise)} directly. 260 * 261 * @return {@link QuicStreamChannelBootstrap} that can be used to bootstrap a {@link QuicStreamChannel}. 262 */ 263 default QuicStreamChannelBootstrap newStreamBootstrap() { 264 return new QuicStreamChannelBootstrap(this); 265 } 266 267 /** 268 * Close the {@link QuicChannel} 269 * 270 * @param applicationClose {@code true} if an application close should be used, 271 * {@code false} if a normal close should be used. 272 * @param error the application error number, or {@code 0} if no special error should be signaled. 273 * @param reason the reason for the closure (which may be an empty {@link ByteBuf}. 274 * @return the future that is notified. 275 */ 276 default ChannelFuture close(boolean applicationClose, int error, ByteBuf reason) { 277 return close(applicationClose, error, reason, newPromise()); 278 } 279 280 /** 281 * Close the {@link QuicChannel} 282 * 283 * @param applicationClose {@code true} if an application close should be used, 284 * {@code false} if a normal close should be used. 285 * @param error the application error number, or {@code 0} if no special error should be signaled. 286 * @param reason the reason for the closure (which may be an empty {@link ByteBuf}. 287 * @param promise the {@link ChannelPromise} that will be notified. 288 * @return the future that is notified. 289 */ 290 ChannelFuture close(boolean applicationClose, int error, ByteBuf reason, ChannelPromise promise); 291 292 /** 293 * Collects statistics about the connection and notifies the {@link Future} once done. 294 * 295 * @return the {@link Future} that is notified once the stats were collected. 296 */ 297 default Future<QuicConnectionStats> collectStats() { 298 return collectStats(eventLoop().newPromise()); 299 } 300 301 /** 302 * Collects statistics about the connection and notifies the {@link Promise} once done. 303 * 304 * @param promise the {@link ChannelPromise} that is notified once the stats were collected. 305 * @return the {@link Future} that is notified once the stats were collected. 306 */ 307 Future<QuicConnectionStats> collectStats(Promise<QuicConnectionStats> promise); 308 309 /** 310 * Collects statistics about the path of the connection and notifies the {@link Future} once done. 311 * 312 * @return the {@link Future} that is notified once the stats were collected. 313 */ 314 default Future<QuicConnectionPathStats> collectPathStats(int pathIdx) { 315 return collectPathStats(pathIdx, eventLoop().newPromise()); 316 } 317 318 /** 319 * Collects statistics about the path of the connection and notifies the {@link Promise} once done. 320 * 321 * @param promise the {@link ChannelPromise} that is notified once the stats were collected. 322 * @return the {@link Future} that is notified once the stats were collected. 323 */ 324 Future<QuicConnectionPathStats> collectPathStats(int pathIdx, Promise<QuicConnectionPathStats> promise); 325 326 /** 327 * Creates a new {@link QuicChannelBootstrap} that can be used to create and connect new {@link QuicChannel}s to 328 * endpoints using the given {@link Channel} as transport layer. 329 * 330 * @param channel the {@link Channel} that is used as transport layer. 331 * @return {@link QuicChannelBootstrap} that can be used to bootstrap a client side {@link QuicChannel}. 332 */ 333 static QuicChannelBootstrap newBootstrap(Channel channel) { 334 return new QuicChannelBootstrap(channel); 335 } 336 }