#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().