diff --git a/californium-core/src/main/java/org/eclipse/californium/core/network/stack/ReliabilityLayer.java b/californium-core/src/main/java/org/eclipse/californium/core/network/stack/ReliabilityLayer.java index fc6c4fa93b..fd557f6de7 100644 --- a/californium-core/src/main/java/org/eclipse/californium/core/network/stack/ReliabilityLayer.java +++ b/californium-core/src/main/java/org/eclipse/californium/core/network/stack/ReliabilityLayer.java @@ -232,20 +232,31 @@ private void prepareRetransmission(final Exchange exchange, final Retransmission public void receiveRequest(Exchange exchange, Request request) { if (request.isDuplicate()) { - long send = exchange.getSendNanoTimestamp(); - if (send == 0 || (send - request.getNanoTimestamp()) > 0) { - // received before response was sent - int count = counter.incrementAndGet(); - LOGGER.debug("{}: {} duplicate request {}, server sent response delayed, ignore request", count, - exchange, request); - return; + Response previousResponse = exchange.getCurrentResponse(); + Request previousRequest = exchange.getCurrentRequest(); + if (previousResponse != null) { + if (previousResponse.getSendError() == null) { + long send = exchange.getSendNanoTimestamp(); + if (send == 0 || (send - request.getNanoTimestamp()) > 0) { + // received before response was sent + int count = counter.incrementAndGet(); + LOGGER.debug("{}: {} duplicate request {}, server sent response delayed, ignore request", count, + exchange, request); + return; + } + } else { + previousResponse.setSendError(null); + } } // Request is a duplicate, so resend ACK, RST or response exchange.retransmitResponse(); - Request previousRequest = exchange.getCurrentRequest(); - Response previousResponse = exchange.getCurrentResponse(); if (previousResponse != null) { + EndpointContext sourceContext = request.getSourceContext(); + if (!previousResponse.getEffectiveDestinationContext().getPeerAddress() + .equals(sourceContext.getPeerAddress())) { + previousResponse.setEffectiveDestinationContext(sourceContext); + } Type type = previousResponse.getType(); if (type == Type.NON || type == Type.CON) { if (request.acknowledge()) {