INET Framework for OMNeT++/OMNEST
TCPSegment Class Reference

#include <TCPSegment.h>

List of all members.

Public Member Functions

 TCPSegment (const char *name=NULL, int kind=0)
 TCPSegment (const TCPSegment &other)
virtual ~TCPSegment ()
TCPSegmentoperator= (const TCPSegment &other)
virtual TCPSegmentdup () const
virtual void parsimPack (cCommBuffer *b)
virtual void parsimUnpack (cCommBuffer *b)
virtual void setPayloadArraySize (unsigned int size)
virtual void setPayload (unsigned int k, const TCPPayloadMessage &payload_var)
virtual unsigned int getPayloadArraySize () const
virtual TCPPayloadMessage & getPayload (unsigned int k)
virtual void addPayloadMessage (cPacket *msg, uint32 endSequenceNo)
virtual cPacket * removeFirstPayloadMessage (uint32 &outEndSequenceNo)
virtual void truncateSegment (uint32 firstSeqNo, uint32 endSeqNo)

Protected Attributes

std::list< TCPPayloadMessage > payloadList

Detailed Description

Represents a TCP segment. More info in the TCPSegment.msg file (and the documentation generated from it).


Constructor & Destructor Documentation

TCPSegment::TCPSegment ( const char *  name = NULL,
int  kind = 0 
) [inline]
: TCPSegment_Base(name,kind) {}
TCPSegment::TCPSegment ( const TCPSegment other) [inline]
: TCPSegment_Base(other.getName()) {operator=(other);}
TCPSegment::~TCPSegment ( ) [virtual]
{
    while (!payloadList.empty())
    {
        cPacket *msg = payloadList.front().msg;
        payloadList.pop_front();
        dropAndDelete(msg);
    }
}

Member Function Documentation

void TCPSegment::addPayloadMessage ( cPacket *  msg,
uint32  endSequenceNo 
) [virtual]

Adds a message object to the TCP segment. The sequence number+1 of the last byte of the message should be passed as 2nd argument

Referenced by tcp_old::TCPMsgBasedSendQueue::createSegmentWithBytes(), TCPMsgBasedSendQueue::createSegmentWithBytes(), and operator=().

{
    take(msg);

    TCPPayloadMessage payload;
    payload.endSequenceNo = endSequenceNo;
    payload.msg = msg;
    payloadList.push_back(payload);
}
virtual TCPSegment* TCPSegment::dup ( ) const [inline, virtual]
{return new TCPSegment(*this);}
TCPPayloadMessage & TCPSegment::getPayload ( unsigned int  k) [virtual]

Returns the kth payload message in this TCP segment

{
    std::list<TCPPayloadMessage>::iterator i = payloadList.begin();
    while (k>0 && i!=payloadList.end())
        (++i, --k);
    return *i;
}
unsigned int TCPSegment::getPayloadArraySize ( ) const [virtual]

Returns the number of payload messages in this TCP segment

Referenced by tcp_old::TCPMsgBasedSendQueue::createSegmentWithBytes(), and TCPMsgBasedSendQueue::createSegmentWithBytes().

{
    return payloadList.size();
}
TCPSegment & TCPSegment::operator= ( const TCPSegment other)
{
    TCPSegment_Base::operator=(other);

    for (std::list<TCPPayloadMessage>::const_iterator i=other.payloadList.begin(); i!=other.payloadList.end(); ++i)
        addPayloadMessage(i->msg->dup(), i->endSequenceNo);

    return *this;
}
void TCPSegment::parsimPack ( cCommBuffer *  b) [virtual]
void TCPSegment::parsimUnpack ( cCommBuffer *  b) [virtual]
cPacket * TCPSegment::removeFirstPayloadMessage ( uint32 &  outEndSequenceNo) [virtual]

Removes and returns the first message object in this TCP segment. It also returns the sequence number+1 of its last octet in outEndSequenceNo.

Referenced by tcp_old::TCPMsgBasedRcvQueue::insertBytesFromSegment(), and TCPMsgBasedRcvQueue::insertBytesFromSegment().

{
    if (payloadList.empty())
        return NULL;

    cPacket *msg = payloadList.front().msg;
    endSequenceNo = payloadList.front().endSequenceNo;
    payloadList.pop_front();
    drop(msg);
    return msg;
}
void TCPSegment::setPayload ( unsigned int  k,
const TCPPayloadMessage &  payload_var 
) [virtual]

Generated but unused method, should not be called.

{
    throw cRuntimeError(this, "setPayload() not supported, use addPayloadMessage()");
}
void TCPSegment::setPayloadArraySize ( unsigned int  size) [virtual]

Generated but unused method, should not be called.

{
    throw cRuntimeError(this, "setPayloadArraySize() not supported, use addPayloadMessage()");
}
void TCPSegment::truncateSegment ( uint32  firstSeqNo,
uint32  endSeqNo 
) [virtual]

Truncate segment.

Parameters:
firstSeqNo,:sequence no of new first byte
endSeqNo,:sequence no of new last byte+1

Referenced by TCPConnection::processSegment1stThru8th().

{
    if(seqLess(sequenceNo_var, firstSeqNo))
    {
        unsigned int truncleft = firstSeqNo - sequenceNo_var;

        while (!payloadList.empty())
        {
            if (seqGE(payloadList.front().endSequenceNo, firstSeqNo))
                break;

            cPacket *msg = payloadList.front().msg;
            payloadList.pop_front();
            dropAndDelete(msg);
        }

        payloadLength_var -= truncleft;
        sequenceNo_var = firstSeqNo;
        //TODO truncate data correctly if need
    }

    if(seqGreater(sequenceNo_var+payloadLength_var, endSeqNo))
    {
        unsigned int truncright = sequenceNo_var + payloadLength_var - endSeqNo;

        while (!payloadList.empty())
        {
            if (seqLE(payloadList.back().endSequenceNo, endSeqNo))
                break;

            cPacket *msg = payloadList.back().msg;
            payloadList.pop_back();
            dropAndDelete(msg);
        }
        payloadLength_var -= truncright;
        //TODO truncate data correctly if need
    }
}

Member Data Documentation


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