public void sendRttMeasurement( final ImageConnection[] controlAddresses, final int sessionId, final int streamId, final long echoTimestampNs, final long receptionDelta, final boolean isReply) { if (!isClosed) { rttMeasurementFlyweight .sessionId(sessionId) .streamId(streamId) .receiverId(receiverId) .echoTimestampNs(echoTimestampNs) .receptionDelta(receptionDelta) .flags(isReply ? RttMeasurementFlyweight.REPLY_FLAG : 0); send(rttMeasurementBuffer, RttMeasurementFlyweight.HEADER_LENGTH, controlAddresses); } }
public String toString() { final StringBuilder sb = new StringBuilder(); final String formattedFlags = String.format("%1$8s", Integer.toBinaryString(flags())).replace(' ', '0'); sb.append("RTT Measure Message{") .append("frame_length=").append(frameLength()) .append(" version=").append(version()) .append(" flags=").append(formattedFlags) .append(" type=").append(headerType()) .append(" session_id=").append(sessionId()) .append(" stream_id=").append(streamId()) .append(" echo_timestamp=").append(echoTimestampNs()) .append(" reception_delta=").append(receptionDelta()) .append(" receiver_id=").append(receiverId()) .append("}"); return sb.toString(); } }
byteBuffer.limit(rttMeasurementOffset + RttMeasurementFlyweight.HEADER_LENGTH).position(rttMeasurementOffset); rttMeasurementBuffer = byteBuffer.slice(); rttMeasurementFlyweight = new RttMeasurementFlyweight(rttMeasurementBuffer); .receiverId(receiverId) .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH);
public void onRttMeasurement( final RttMeasurementFlyweight msg, final UnsafeBuffer buffer, final int length, final InetSocketAddress srcAddress) { final NetworkPublication publication = publicationBySessionAndStreamId.get(msg.sessionId(), msg.streamId()); if (null != publication) { publication.onRttMeasurement(msg, srcAddress); } }
public void onRttMeasurement( final ReceiveChannelEndpoint channelEndpoint, final RttMeasurementFlyweight header, final InetSocketAddress srcAddress, final int transportIndex) { final int streamId = header.streamId(); final StreamInterest streamInterest = streamInterestByIdMap.get(streamId); if (null != streamInterest) { final int sessionId = header.sessionId(); final SessionInterest sessionInterest = streamInterest.sessionInterestByIdMap.get(sessionId); if (null != sessionInterest && null != sessionInterest.image) { if (RttMeasurementFlyweight.REPLY_FLAG == (header.flags() & RttMeasurementFlyweight.REPLY_FLAG)) { // TODO: check rate limit final InetSocketAddress controlAddress = channelEndpoint.isMulticast(transportIndex) ? channelEndpoint.udpChannel(transportIndex).remoteControl() : srcAddress; channelEndpoint.sendRttMeasurement( transportIndex, controlAddress, sessionId, streamId, header.echoTimestampNs(), 0, false); } else { sessionInterest.image.onRttMeasurement(header, transportIndex, srcAddress); } } } }
/** * Called from the {@link Receiver} upon receiving an RTT Measurement that is a reply. * * @param header of the measurement message. * @param transportIndex that the RTT Measurement came in on. * @param srcAddress from the sender requesting the measurement */ void onRttMeasurement( final RttMeasurementFlyweight header, @SuppressWarnings("unused") final int transportIndex, final InetSocketAddress srcAddress) { final long nowNs = nanoClock.nanoTime(); final long rttInNs = nowNs - header.echoTimestampNs() - header.receptionDelta(); congestionControl.onRttMeasurement(nowNs, rttInNs, srcAddress); }
public void onRttMeasurement( final RttMeasurementFlyweight header, final UnsafeBuffer buffer, final int length, final InetSocketAddress srcAddress, final int transportIndex) { if (!dataLossGenerator.shouldDropFrame(srcAddress, buffer, header.frameLength())) { super.onRttMeasurement(header, buffer, length, srcAddress, transportIndex); } } }
public NetworkPublicationThreadLocals() { final ByteBuffer byteBuffer = BufferUtil.allocateDirectAligned(192, BitUtil.CACHE_LINE_LENGTH); byteBuffer.limit(DataHeaderFlyweight.HEADER_LENGTH); heartbeatBuffer = byteBuffer.slice(); dataHeader = new DataHeaderFlyweight(heartbeatBuffer); byteBuffer.limit(64 + SetupFlyweight.HEADER_LENGTH).position(64); setupBuffer = byteBuffer.slice(); setupHeader = new SetupFlyweight(setupBuffer); byteBuffer.limit(128 + RttMeasurementFlyweight.HEADER_LENGTH).position(128); rttMeasurementBuffer = byteBuffer.slice(); rttMeasurementHeader = new RttMeasurementFlyweight(rttMeasurementBuffer); dataHeader .version(HeaderFlyweight.CURRENT_VERSION) .flags((byte)DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .headerType(HeaderFlyweight.HDR_TYPE_DATA) .frameLength(0); setupHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SETUP) .frameLength(SetupFlyweight.HEADER_LENGTH); rttMeasurementHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH); }
public void onRttMeasurement( final RttMeasurementFlyweight header, final UnsafeBuffer buffer, final int length, final InetSocketAddress srcAddress, final int transportIndex) { final long requestedReceiverId = header.receiverId(); if (requestedReceiverId == receiverId || requestedReceiverId == 0) { dispatcher.onRttMeasurement(this, header, srcAddress, transportIndex); } }
/** * return session id field * * @return session id field */ public int sessionId() { return getInt(SESSION_ID_FIELD_OFFSET, LITTLE_ENDIAN); }
public DataTransportPoller() { byteBuffer = NetworkUtil.allocateDirectAlignedAndPadded( Configuration.MAX_UDP_PAYLOAD_LENGTH, CACHE_LINE_LENGTH * 2); unsafeBuffer = new UnsafeBuffer(byteBuffer); dataMessage = new DataHeaderFlyweight(unsafeBuffer); setupMessage = new SetupFlyweight(unsafeBuffer); rttMeasurement = new RttMeasurementFlyweight(unsafeBuffer); }
public void onRttMeasurement( final ReceiveChannelEndpoint channelEndpoint, final RttMeasurementFlyweight header, final InetSocketAddress srcAddress, final int transportIndex) { final int streamId = header.streamId(); final StreamInterest streamInterest = streamInterestByIdMap.get(streamId); if (null != streamInterest) { final int sessionId = header.sessionId(); final SessionInterest sessionInterest = streamInterest.sessionInterestByIdMap.get(sessionId); if (null != sessionInterest && null != sessionInterest.image) { if (RttMeasurementFlyweight.REPLY_FLAG == (header.flags() & RttMeasurementFlyweight.REPLY_FLAG)) { // TODO: check rate limit final InetSocketAddress controlAddress = channelEndpoint.isMulticast(transportIndex) ? channelEndpoint.udpChannel(transportIndex).remoteControl() : srcAddress; channelEndpoint.sendRttMeasurement( transportIndex, controlAddress, sessionId, streamId, header.echoTimestampNs(), 0, false); } else { sessionInterest.image.onRttMeasurement(header, transportIndex, srcAddress); } } } }
public void onRttMeasurement( final RttMeasurementFlyweight msg, final UnsafeBuffer buffer, final int length, final InetSocketAddress srcAddress) { final NetworkPublication publication = publicationBySessionAndStreamId.get(msg.sessionId(), msg.streamId()); if (null != publication) { publication.onRttMeasurement(msg, srcAddress); } }
/** * Called from the {@link Receiver} upon receiving an RTT Measurement that is a reply. * * @param header of the measurement message. * @param transportIndex that the RTT Measurement came in on. * @param srcAddress from the sender requesting the measurement */ void onRttMeasurement( final RttMeasurementFlyweight header, @SuppressWarnings("unused") final int transportIndex, final InetSocketAddress srcAddress) { final long nowNs = nanoClock.nanoTime(); final long rttInNs = nowNs - header.echoTimestampNs() - header.receptionDelta(); congestionControl.onRttMeasurement(nowNs, rttInNs, srcAddress); }
public void onRttMeasurement( final RttMeasurementFlyweight msg, final UnsafeBuffer buffer, final int length, final InetSocketAddress srcAddress) { if (!controlLossGenerator.shouldDropFrame(srcAddress, msg, msg.frameLength())) { super.onRttMeasurement(msg, buffer, length, srcAddress); } } }
public NetworkPublicationThreadLocals() { final ByteBuffer byteBuffer = BufferUtil.allocateDirectAligned(192, BitUtil.CACHE_LINE_LENGTH); byteBuffer.limit(DataHeaderFlyweight.HEADER_LENGTH); heartbeatBuffer = byteBuffer.slice(); dataHeader = new DataHeaderFlyweight(heartbeatBuffer); byteBuffer.limit(64 + SetupFlyweight.HEADER_LENGTH).position(64); setupBuffer = byteBuffer.slice(); setupHeader = new SetupFlyweight(setupBuffer); byteBuffer.limit(128 + RttMeasurementFlyweight.HEADER_LENGTH).position(128); rttMeasurementBuffer = byteBuffer.slice(); rttMeasurementHeader = new RttMeasurementFlyweight(rttMeasurementBuffer); dataHeader .version(HeaderFlyweight.CURRENT_VERSION) .flags((byte)DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .headerType(HeaderFlyweight.HDR_TYPE_DATA) .frameLength(0); setupHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SETUP) .frameLength(SetupFlyweight.HEADER_LENGTH); rttMeasurementHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH); }
public void onRttMeasurement( final RttMeasurementFlyweight header, final UnsafeBuffer buffer, final int length, final InetSocketAddress srcAddress, final int transportIndex) { final long requestedReceiverId = header.receiverId(); if (requestedReceiverId == receiverId || requestedReceiverId == 0) { dispatcher.onRttMeasurement(this, header, srcAddress, transportIndex); } }
/** * return stream id field * * @return stream id field */ public int streamId() { return getInt(STREAM_ID_FIELD_OFFSET, LITTLE_ENDIAN); }
public ControlTransportPoller() { byteBuffer = NetworkUtil.allocateDirectAlignedAndPadded( Configuration.MAX_UDP_PAYLOAD_LENGTH, CACHE_LINE_LENGTH * 2); unsafeBuffer = new UnsafeBuffer(byteBuffer); nakMessage = new NakFlyweight(unsafeBuffer); statusMessage = new StatusMessageFlyweight(unsafeBuffer); rttMeasurement = new RttMeasurementFlyweight(unsafeBuffer); }
public void onRttMeasurement( final RttMeasurementFlyweight msg, @SuppressWarnings("unused") final InetSocketAddress srcAddress) { if (RttMeasurementFlyweight.REPLY_FLAG == (msg.flags() & RttMeasurementFlyweight.REPLY_FLAG)) { // TODO: rate limit rttMeasurementHeader .receiverId(msg.receiverId()) .echoTimestampNs(msg.echoTimestampNs()) .receptionDelta(0) .sessionId(sessionId) .streamId(streamId) .flags((short)0x0); final int bytesSent = channelEndpoint.send(rttMeasurementBuffer); if (RttMeasurementFlyweight.HEADER_LENGTH != bytesSent) { shortSends.increment(); } } // handling of RTT measurements would be done in an else clause here. }