SctpAssociation

Package: inet.transportlayer.sctp

SctpAssociation

simple module

C++ definition

Represents a single SCTP association in the SCTP protocol implementation. Implements the SCTP state machine and handles association establishment, data transfer, flow control, congestion control, and association termination. Provides extensive statistics collection for various SCTP metrics.

Inheritance diagram

The following diagram shows inheritance relationships for this type. Unresolved types are missing from the diagram.

Extends

Name Type Description
SimpleModule simple module

Base module for all INET simple modules.

Parameters

Name Type Default value Description
displayStringTextFormat string ""

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

Properties

Name Value Description
class SctpAssociation
display i=block/socket

Signals

Name Type Unit Description
advMsgRwnd unsigned long
totalCwnd unsigned long
pathTsnFastRTX unsigned long
assocThroughput double
numDuplicatesSent unsigned long
advRwnd unsigned long

====== Association-level signals (no demux) ======

totalSsthresh unsigned long
pathGapNRAckedChunksInLastSACK unsigned long
pathPartialBytesAcked unsigned long
pathHeartbeatSent unsigned long
cumTsnAck unsigned long
nonRevokableGapBlocksInLastSACK unsigned long
numRevokableGapBlocksStored unsigned long
pathSenderBlockingFraction double
numTotalGapBlocksStored unsigned long
numDuplicatesStored unsigned long
peerRwnd unsigned long
pathPseudoCumAck unsigned long
pathSsthresh unsigned long
numNonRevokableGapBlocksSent unsigned long
pathFastRecoveryState unsigned long
pathBlockingTsnsMoved unsigned long
pathHeartbeatAckSent unsigned long
queuedReceivedBytes unsigned long
pathRTXPseudoCumAck unsigned long
sendQueue unsigned long
pathTsnAckedCumAck unsigned long
pathOutstandingBytes unsigned long
pathTsnReceived unsigned long
queuedSentBytes unsigned long
pathGapUnackedChunksInLastSACK unsigned long
outstandingBytes unsigned long
streamThroughput double

====== Stream-specific signal (demux by stream ID) ======

numNonRevokableGapBlocksStored unsigned long
pathGapAckedChunksInLastSACK unsigned long
pathRto simtime_t

====== Path-specific signals (demux by remote address) ======

pathReceiverBlockingFraction double
pathRtt simtime_t
pathHeartbeatReceived unsigned long
pathHeartbeatAckReceived unsigned long
sackLengthSent unsigned long
arwndInLastSACK unsigned long
pathCwnd unsigned long
revokableGapBlocksInLastSACK unsigned long
pathBandwidth double
endToEndDelay simtime_t
totalBandwidth double
pathQueuedSentBytes unsigned long
pathTsnTimerBasedRTX unsigned long
numGapBlocks unsigned long
numRevokableGapBlocksSent unsigned long
pathTsnSent unsigned long
pathTsnAckedGapAck unsigned long

Statistics

Name Title Source Record Unit Interpolation Mode Description
advMsgRwnd advMsgRwnd vector sample-hold
totalCwnd totalCwnd vector sample-hold
pathTsnFastRTX pathTsnFastRTX vector(demux)
assocThroughput assocThroughput vector sample-hold
numDuplicatesSent numDuplicatesSent vector
advRwnd advRwnd vector sample-hold
totalSsthresh totalSsthresh vector sample-hold
pathGapNRAckedChunksInLastSACK pathGapNRAckedChunksInLastSACK vector(demux)
pathPartialBytesAcked pathPartialBytesAcked vector(demux)
pathHeartbeatSent pathHeartbeatSent vector(demux)
cumTsnAck cumTsnAck vector
nonRevokableGapBlocksInLastSACK nonRevokableGapBlocksInLastSACK vector
numRevokableGapBlocksStored numRevokableGapBlocksStored vector
pathSenderBlockingFraction pathSenderBlockingFraction vector(demux) sample-hold
numTotalGapBlocksStored numTotalGapBlocksStored vector
numDuplicatesStored numDuplicatesStored vector
peerRwnd peerRwnd vector sample-hold
pathPseudoCumAck pathPseudoCumAck vector(demux)
pathSsthresh pathSsthresh vector(demux) sample-hold
numNonRevokableGapBlocksSent numNonRevokableGapBlocksSent vector
pathFastRecoveryState pathFastRecoveryState vector(demux) sample-hold
pathBlockingTsnsMoved pathBlockingTsnsMoved vector(demux)
pathHeartbeatAckSent pathHeartbeatAckSent vector(demux)
queuedReceivedBytes queuedReceivedBytes vector sample-hold
pathRTXPseudoCumAck pathRTXPseudoCumAck vector(demux)
sendQueue sendQueue vector sample-hold
pathTsnAckedCumAck pathTsnAckedCumAck vector(demux)
pathOutstandingBytes pathOutstandingBytes vector(demux) sample-hold
pathTsnReceived pathTsnReceived vector(demux)
queuedSentBytes queuedSentBytes vector sample-hold
pathGapUnackedChunksInLastSACK pathGapUnackedChunksInLastSACK vector(demux)
outstandingBytes outstandingBytes vector sample-hold
streamThroughput streamThroughput vector(demux)
numNonRevokableGapBlocksStored numNonRevokableGapBlocksStored vector
pathGapAckedChunksInLastSACK pathGapAckedChunksInLastSACK vector(demux)
pathRto pathRto vector(demux) sample-hold
pathReceiverBlockingFraction pathReceiverBlockingFraction vector(demux) sample-hold
pathRtt pathRtt vector(demux) sample-hold
pathHeartbeatReceived pathHeartbeatReceived vector(demux)
pathHeartbeatAckReceived pathHeartbeatAckReceived vector(demux)
sackLengthSent sackLengthSent vector
arwndInLastSACK arwndInLastSACK vector sample-hold
pathCwnd pathCwnd vector(demux) sample-hold
revokableGapBlocksInLastSACK revokableGapBlocksInLastSACK vector
pathBandwidth pathBandwidth vector(demux) sample-hold
endToEndDelay endToEndDelay vector
totalBandwidth totalBandwidth vector sample-hold
pathQueuedSentBytes pathQueuedSentBytes vector(demux) sample-hold
pathTsnTimerBasedRTX pathTsnTimerBasedRTX vector(demux)
numGapBlocks numGapBlocks vector
numRevokableGapBlocksSent numRevokableGapBlocksSent vector
pathTsnSent pathTsnSent vector(demux)
pathTsnAckedGapAck pathTsnAckedGapAck vector(demux)

Source code

//
// Represents a single SCTP association in the SCTP protocol implementation.
// Implements the SCTP state machine and handles association establishment,
// data transfer, flow control, congestion control, and association termination.
// Provides extensive statistics collection for various SCTP metrics.
//
simple SctpAssociation extends SimpleModule
{
    parameters:
        @class(SctpAssociation);
        @display("i=block/socket");

        // ====== Path-specific signals (demux by remote address) ======
        @signal[pathRto](type=simtime_t);
        @signal[pathRtt](type=simtime_t);
        @signal[pathSsthresh](type="unsigned long");
        @signal[pathCwnd](type="unsigned long");
        @signal[pathBandwidth](type=double);
        @signal[pathOutstandingBytes](type="unsigned long");
        @signal[pathQueuedSentBytes](type="unsigned long");
        @signal[pathSenderBlockingFraction](type=double);
        @signal[pathReceiverBlockingFraction](type=double);
        @signal[pathTsnSent](type="unsigned long");
        @signal[pathTsnReceived](type="unsigned long");
        @signal[pathHeartbeatSent](type="unsigned long");
        @signal[pathHeartbeatAckSent](type="unsigned long");
        @signal[pathHeartbeatReceived](type="unsigned long");
        @signal[pathHeartbeatAckReceived](type="unsigned long");
        @signal[pathGapAckedChunksInLastSACK](type="unsigned long");
        @signal[pathGapNRAckedChunksInLastSACK](type="unsigned long");
        @signal[pathGapUnackedChunksInLastSACK](type="unsigned long");
        @signal[pathPartialBytesAcked](type="unsigned long");
        @signal[pathFastRecoveryState](type="unsigned long");
        @signal[pathTsnFastRTX](type="unsigned long");
        @signal[pathTsnTimerBasedRTX](type="unsigned long");
        @signal[pathTsnAckedCumAck](type="unsigned long");
        @signal[pathTsnAckedGapAck](type="unsigned long");
        @signal[pathPseudoCumAck](type="unsigned long");
        @signal[pathRTXPseudoCumAck](type="unsigned long");
        @signal[pathBlockingTsnsMoved](type="unsigned long");

        @statistic[pathRto](source=pathRto; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathRtt](source=pathRtt; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathSsthresh](source=pathSsthresh; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathCwnd](source=pathCwnd; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathBandwidth](source=pathBandwidth; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathOutstandingBytes](source=pathOutstandingBytes; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathQueuedSentBytes](source=pathQueuedSentBytes; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathSenderBlockingFraction](source=pathSenderBlockingFraction; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathReceiverBlockingFraction](source=pathReceiverBlockingFraction; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathTsnSent](source=pathTsnSent; record=vector(demux));
        @statistic[pathTsnReceived](source=pathTsnReceived; record=vector(demux));
        @statistic[pathHeartbeatSent](source=pathHeartbeatSent; record=vector(demux));
        @statistic[pathHeartbeatAckSent](source=pathHeartbeatAckSent; record=vector(demux));
        @statistic[pathHeartbeatReceived](source=pathHeartbeatReceived; record=vector(demux));
        @statistic[pathHeartbeatAckReceived](source=pathHeartbeatAckReceived; record=vector(demux));
        @statistic[pathGapAckedChunksInLastSACK](source=pathGapAckedChunksInLastSACK; record=vector(demux));
        @statistic[pathGapNRAckedChunksInLastSACK](source=pathGapNRAckedChunksInLastSACK; record=vector(demux));
        @statistic[pathGapUnackedChunksInLastSACK](source=pathGapUnackedChunksInLastSACK; record=vector(demux));
        @statistic[pathPartialBytesAcked](source=pathPartialBytesAcked; record=vector(demux));
        @statistic[pathFastRecoveryState](source=pathFastRecoveryState; record=vector(demux); interpolationmode=sample-hold);
        @statistic[pathTsnFastRTX](source=pathTsnFastRTX; record=vector(demux));
        @statistic[pathTsnTimerBasedRTX](source=pathTsnTimerBasedRTX; record=vector(demux));
        @statistic[pathTsnAckedCumAck](source=pathTsnAckedCumAck; record=vector(demux));
        @statistic[pathTsnAckedGapAck](source=pathTsnAckedGapAck; record=vector(demux));
        @statistic[pathPseudoCumAck](source=pathPseudoCumAck; record=vector(demux));
        @statistic[pathRTXPseudoCumAck](source=pathRTXPseudoCumAck; record=vector(demux));
        @statistic[pathBlockingTsnsMoved](source=pathBlockingTsnsMoved; record=vector(demux));

        // ====== Stream-specific signal (demux by stream ID) ======
        @signal[streamThroughput](type=double);
        @statistic[streamThroughput](source=streamThroughput; record=vector(demux));

        // ====== Association-level signals (no demux) ======
        @signal[advRwnd](type="unsigned long");
        @signal[cumTsnAck](type="unsigned long");
        @signal[sendQueue](type="unsigned long");
        @signal[numGapBlocks](type="unsigned long");
        @signal[outstandingBytes](type="unsigned long");
        @signal[queuedReceivedBytes](type="unsigned long");
        @signal[queuedSentBytes](type="unsigned long");
        @signal[totalSsthresh](type="unsigned long");
        @signal[totalCwnd](type="unsigned long");
        @signal[totalBandwidth](type=double);
        @signal[revokableGapBlocksInLastSACK](type="unsigned long");
        @signal[nonRevokableGapBlocksInLastSACK](type="unsigned long");
        @signal[arwndInLastSACK](type="unsigned long");
        @signal[peerRwnd](type="unsigned long");
        @signal[numTotalGapBlocksStored](type="unsigned long");
        @signal[numRevokableGapBlocksStored](type="unsigned long");
        @signal[numNonRevokableGapBlocksStored](type="unsigned long");
        @signal[numDuplicatesStored](type="unsigned long");
        @signal[numRevokableGapBlocksSent](type="unsigned long");
        @signal[numNonRevokableGapBlocksSent](type="unsigned long");
        @signal[numDuplicatesSent](type="unsigned long");
        @signal[sackLengthSent](type="unsigned long");
        @signal[advMsgRwnd](type="unsigned long");
        @signal[endToEndDelay](type=simtime_t);
        @signal[assocThroughput](type=double);

        @statistic[advRwnd](source=advRwnd; record=vector; interpolationmode=sample-hold);
        @statistic[cumTsnAck](source=cumTsnAck; record=vector);
        @statistic[sendQueue](source=sendQueue; record=vector; interpolationmode=sample-hold);
        @statistic[numGapBlocks](source=numGapBlocks; record=vector);
        @statistic[outstandingBytes](source=outstandingBytes; record=vector; interpolationmode=sample-hold);
        @statistic[queuedReceivedBytes](source=queuedReceivedBytes; record=vector; interpolationmode=sample-hold);
        @statistic[queuedSentBytes](source=queuedSentBytes; record=vector; interpolationmode=sample-hold);
        @statistic[totalSsthresh](source=totalSsthresh; record=vector; interpolationmode=sample-hold);
        @statistic[totalCwnd](source=totalCwnd; record=vector; interpolationmode=sample-hold);
        @statistic[totalBandwidth](source=totalBandwidth; record=vector; interpolationmode=sample-hold);
        @statistic[revokableGapBlocksInLastSACK](source=revokableGapBlocksInLastSACK; record=vector);
        @statistic[nonRevokableGapBlocksInLastSACK](source=nonRevokableGapBlocksInLastSACK; record=vector);
        @statistic[arwndInLastSACK](source=arwndInLastSACK; record=vector; interpolationmode=sample-hold);
        @statistic[peerRwnd](source=peerRwnd; record=vector; interpolationmode=sample-hold);
        @statistic[numTotalGapBlocksStored](source=numTotalGapBlocksStored; record=vector);
        @statistic[numRevokableGapBlocksStored](source=numRevokableGapBlocksStored; record=vector);
        @statistic[numNonRevokableGapBlocksStored](source=numNonRevokableGapBlocksStored; record=vector);
        @statistic[numDuplicatesStored](source=numDuplicatesStored; record=vector);
        @statistic[numRevokableGapBlocksSent](source=numRevokableGapBlocksSent; record=vector);
        @statistic[numNonRevokableGapBlocksSent](source=numNonRevokableGapBlocksSent; record=vector);
        @statistic[numDuplicatesSent](source=numDuplicatesSent; record=vector);
        @statistic[sackLengthSent](source=sackLengthSent; record=vector);
        @statistic[advMsgRwnd](source=advMsgRwnd; record=vector; interpolationmode=sample-hold);
        @statistic[endToEndDelay](source=endToEndDelay; record=vector);
        @statistic[assocThroughput](source=assocThroughput; record=vector; interpolationmode=sample-hold);
}
File: src/inet/transportlayer/sctp/SctpAssociation.ned