#include <SCTPReceiveStream.h>
Public Member Functions | |
| uint32 | enqueueNewDataChunk (SCTPDataVariables *dchunk) |
| SCTPReceiveStream () | |
| ~SCTPReceiveStream () | |
| SCTPQueue * | getDeliveryQ () const |
| SCTPQueue * | getOrderedQ () const |
| SCTPQueue * | getUnorderedQ () 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 |
| SCTPQueue * | deliveryQ |
| SCTPQueue * | orderedQ |
| SCTPQueue * | unorderedQ |
Definition at line 26 of file SCTPReceiveStream.h.
| SCTPReceiveStream::SCTPReceiveStream | ( | ) |
Ctor.
Definition at line 23 of file SCTPReceiveStream.cc.
{
streamId = 0;
expectedStreamSeqNum = 0;
deliveryQ = new SCTPQueue();
orderedQ = new SCTPQueue();
unorderedQ = new SCTPQueue();
}
| SCTPReceiveStream::~SCTPReceiveStream | ( | ) |
Virtual dtor.
Definition at line 32 of file SCTPReceiveStream.cc.
{
delete deliveryQ;
delete orderedQ;
delete unorderedQ;
}
| 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().
{ expectedStreamSeqNum = num; };
| void SCTPReceiveStream::setStreamId | ( | const uint16 | id | ) | [inline] |
Definition at line 52 of file SCTPReceiveStream.h.
Referenced by SCTPAssociation::initStreams().
{ streamId = id; };
SCTPQueue* SCTPReceiveStream::deliveryQ [protected] |
Definition at line 31 of file SCTPReceiveStream.h.
Referenced by enqueueNewDataChunk(), SCTPReceiveStream(), and ~SCTPReceiveStream().
int32 SCTPReceiveStream::expectedStreamSeqNum [protected] |
Definition at line 30 of file SCTPReceiveStream.h.
Referenced by enqueueNewDataChunk(), and SCTPReceiveStream().
SCTPQueue* SCTPReceiveStream::orderedQ [protected] |
Definition at line 32 of file SCTPReceiveStream.h.
Referenced by enqueueNewDataChunk(), reassemble(), SCTPReceiveStream(), and ~SCTPReceiveStream().
uint16 SCTPReceiveStream::streamId [protected] |
Definition at line 29 of file SCTPReceiveStream.h.
Referenced by SCTPReceiveStream().
SCTPQueue* SCTPReceiveStream::unorderedQ [protected] |
Definition at line 33 of file SCTPReceiveStream.h.
Referenced by enqueueNewDataChunk(), SCTPReceiveStream(), and ~SCTPReceiveStream().
1.7.1