diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpNotificationHandler.java b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpNotificationHandler.java index 83f5e53910..345041149e 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpNotificationHandler.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpNotificationHandler.java @@ -59,7 +59,7 @@ class SctpNotificationHandler extends AbstractNotificationHandler { @Override public HandlerResult handleNotification(ShutdownNotification notification, Object o) { - Channels.fireChannelDisconnected(sctpChannel); + sctpChannel.worker.close(sctpChannel, Channels.succeededFuture(sctpChannel)); return HandlerResult.RETURN; } diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java index a7878d77ba..5dc6f5820a 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java @@ -307,26 +307,12 @@ class SctpWorker implements Runnable { final int predictedRecvBufSize = predictor.nextReceiveBufferSize(); boolean messageReceived = false; - boolean failure = true; MessageInfo messageInfo = null; ByteBuffer bb = recvBufferPool.acquire(predictedRecvBufSize); try { messageInfo = channel.channel.receive(bb, null, notificationHandler); - if (messageInfo != null) { - messageReceived = true; - if (!messageInfo.isUnordered()) { - failure = false; - } else { - if (logger.isErrorEnabled()) { - logger.error("Received unordered SCTP Packet"); - } - failure = true; - } - } else { - messageReceived = false; - failure = false; - } + messageReceived = messageInfo != null; } catch (ClosedChannelException e) { // Can happen, and does not need a user attention. } catch (Throwable t) { @@ -356,7 +342,7 @@ class SctpWorker implements Runnable { recvBufferPool.release(bb); } - if (channel.channel.isBlocking() && !messageReceived || failure) { + if (channel.channel.isBlocking() && !messageReceived) { k.cancel(); // Some JDK implementations run into an infinite loop without this. close(channel, succeededFuture(channel)); return false;