Public Member Functions | Protected Member Functions | Protected Attributes

SCTPReceiveStream Class Reference

#include <SCTPReceiveStream.h>

List of all members.

Public Member Functions

uint32 enqueueNewDataChunk (SCTPDataVariables *dchunk)
 SCTPReceiveStream ()
 ~SCTPReceiveStream ()
SCTPQueuegetDeliveryQ () const
SCTPQueuegetOrderedQ () const
SCTPQueuegetUnorderedQ () const
int32 getExpectedStreamSeqNum () const
int32 getStreamId () const
void setExpectedStreamSeqNum (const int32 num)
void setStreamId (const uint16 id)

Protected Member Functions

uint32 reassemble (SCTPQueue *queue, uint32 tsn)

Protected Attributes

uint16 streamId
int32 expectedStreamSeqNum
SCTPQueuedeliveryQ
SCTPQueueorderedQ
SCTPQueueunorderedQ

Detailed Description

Definition at line 26 of file SCTPReceiveStream.h.


Constructor & Destructor Documentation

SCTPReceiveStream::SCTPReceiveStream (  ) 

Ctor.

Definition at line 23 of file SCTPReceiveStream.cc.

SCTPReceiveStream::~SCTPReceiveStream (  ) 

Virtual dtor.

Definition at line 32 of file SCTPReceiveStream.cc.

{
    delete deliveryQ;
    delete orderedQ;
    delete unorderedQ;
}


Member Function Documentation

uint32 SCTPReceiveStream::enqueueNewDataChunk ( SCTPDataVariables dchunk  ) 

Definition at line 96 of file SCTPReceiveStream.cc.

{
    uint32 delivery = 0;      //0:orderedQ=false && deliveryQ=false; 1:orderedQ=true && deliveryQ=false; 2:oderedQ=true && deliveryQ=true; 3:fragment

    SCTPDataVariables* chunk;
    //sctpEV3 << "Enqueueing NEW data chunk (TSN="<<dchunk->tsn<<") for Stream ID "<<dchunk->sid<<"\n";
    /* append to the respective queue */
    if (!dchunk->ordered)
    {
        if (dchunk->bbit && dchunk->ebit)
        {
            /* put message into deliveryQ */
            if (deliveryQ->checkAndInsertChunk(dchunk->tsn, dchunk))
            {
                delivery = 2;
            }
        } else {
            unorderedQ->checkAndInsertChunk(dchunk->tsn, dchunk);
            delivery = 3;

            /* try to reassemble here */
            uint32 reassembled = reassemble(unorderedQ, dchunk->tsn);

            if ((unorderedQ->getChunk(reassembled))->bbit && (unorderedQ->getChunk(reassembled))->bbit)
            {
                /* put message into deliveryQ */
                if (deliveryQ->checkAndInsertChunk(reassembled, unorderedQ->getAndExtractChunk(reassembled)))
                {
                    delivery = 2;
                }
            }
        }
    }
    else if (dchunk->ordered)
    {
        /* put message into streams ->reassembyQ */
        if (orderedQ->checkAndInsertChunk(dchunk->tsn, dchunk))
            delivery = 1;

        if (!dchunk->bbit || !dchunk->ebit)
        {
            delivery = 3;
            /* try to reassemble */
            reassemble(orderedQ, dchunk->tsn);
        }

        if (orderedQ->getQueueSize()>0)
        {
            /* dequeue first from orderedQ */
            chunk = orderedQ->dequeueChunkBySSN(expectedStreamSeqNum);
            if (chunk)
            {
                if (deliveryQ->checkAndInsertChunk(chunk->tsn, chunk))
                {
                    ++expectedStreamSeqNum;
                    if (expectedStreamSeqNum > 65535)
                        expectedStreamSeqNum = 0;
                    delivery = 2;
                }
            }
        }
    }

    return delivery;
}

SCTPQueue* SCTPReceiveStream::getDeliveryQ (  )  const [inline]

Definition at line 46 of file SCTPReceiveStream.h.

Referenced by SCTPAssociation::pushUlp(), and SCTPAssociation::putInDeliveryQ().

{ return deliveryQ; };

int32 SCTPReceiveStream::getExpectedStreamSeqNum (  )  const [inline]

Definition at line 49 of file SCTPReceiveStream.h.

Referenced by SCTPAssociation::putInDeliveryQ().

{ return expectedStreamSeqNum; };

SCTPQueue* SCTPReceiveStream::getOrderedQ (  )  const [inline]

Definition at line 47 of file SCTPReceiveStream.h.

Referenced by SCTPAssociation::putInDeliveryQ().

{ return orderedQ; };

int32 SCTPReceiveStream::getStreamId (  )  const [inline]

Definition at line 50 of file SCTPReceiveStream.h.

{ return streamId; };

SCTPQueue* SCTPReceiveStream::getUnorderedQ (  )  const [inline]

Definition at line 48 of file SCTPReceiveStream.h.

{ return unorderedQ; };

uint32 SCTPReceiveStream::reassemble ( SCTPQueue queue,
uint32  tsn 
) [protected]

Definition at line 39 of file SCTPReceiveStream.cc.

Referenced by enqueueNewDataChunk().

{
    uint32 begintsn = tsn, endtsn = 0;

    sctpEV3 << "Trying to reassemble message..." << endl;

    /* test if we have all fragments down to the first */
    while (orderedQ->getChunk(begintsn) && !(orderedQ->getChunk(begintsn))->bbit)
        begintsn--;

    if (orderedQ->getChunk(begintsn))
    {
        endtsn = begintsn;

        /* test if we have all fragments up to the end */
        while (orderedQ->getChunk(endtsn) && !(orderedQ->getChunk(endtsn))->ebit)
            endtsn++;

        if (orderedQ->getChunk(endtsn))
        {
            sctpEV3 << "All fragments found, now reassembling..." << endl;

            SCTPDataVariables *firstVar = orderedQ->getChunk(begintsn), *processVar;
            SCTPSimpleMessage* firstSimple=check_and_cast<SCTPSimpleMessage*>(firstVar->userData);

            sctpEV3 << "First fragment has " << firstVar->len / 8 << " bytes." << endl;

            while (++begintsn <= endtsn)
            {
                processVar = orderedQ->getAndExtractChunk(begintsn);
                SCTPSimpleMessage* processSimple=check_and_cast<SCTPSimpleMessage*>(processVar->userData);

                sctpEV3 << "Adding fragment with " << processVar->len / 8 << " bytes." << endl;

                firstSimple->setDataArraySize(firstSimple->getDataArraySize() + processSimple->getDataArraySize());
                firstSimple->setDataLen(firstSimple->getDataLen() + processSimple->getDataLen());
                firstSimple->setByteLength(firstSimple->getByteLength() + processSimple->getByteLength());
                /* copy data */
                for (uint32 i = 0; i < (processVar->len / 8); i++)
                    firstSimple->setData(i + (firstVar->len / 8), processSimple->getData(i));

                firstVar->len += processVar->len;

                delete processVar->userData;
                delete processVar;
            }

            firstVar->ebit = 1;

            sctpEV3 << "Reassembly done. Length=" << firstVar->len<<"\n";
            return firstVar->tsn;
        }
    }
    return tsn;
}

void SCTPReceiveStream::setExpectedStreamSeqNum ( const int32  num  )  [inline]

Definition at line 51 of file SCTPReceiveStream.h.

Referenced by SCTPAssociation::putInDeliveryQ().

void SCTPReceiveStream::setStreamId ( const uint16  id  )  [inline]

Definition at line 52 of file SCTPReceiveStream.h.

Referenced by SCTPAssociation::initStreams().

{ streamId = id; };


Member Data Documentation

Definition at line 31 of file SCTPReceiveStream.h.

Referenced by enqueueNewDataChunk(), SCTPReceiveStream(), and ~SCTPReceiveStream().

Definition at line 30 of file SCTPReceiveStream.h.

Referenced by enqueueNewDataChunk(), and SCTPReceiveStream().

uint16 SCTPReceiveStream::streamId [protected]

Definition at line 29 of file SCTPReceiveStream.h.

Referenced by SCTPReceiveStream().

Definition at line 33 of file SCTPReceiveStream.h.

Referenced by enqueueNewDataChunk(), SCTPReceiveStream(), and ~SCTPReceiveStream().


The documentation for this class was generated from the following files: