Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

TpPacket.cpp

Go to the documentation of this file.
00001 #include "headers.h"
00002 
00016 
00020 TpPacket::TpPacket(unsigned char* message, unsigned int length, 
00021                    bool endBit, unsigned char sequenceNum)
00022 {
00023         m_seqNum = sequenceNum;
00024         m_credits = 0;
00025         m_ack = 0;
00026         m_ackBit = false;
00027         m_length = length;
00028         m_endBit = endBit;
00029         m_retransBit = false;
00030 
00031         m_rawData = new unsigned char[m_length + TP_HEADER_LENGTH + NP_HEADER_LENGTH];
00032         MEMCHECK(m_rawData);
00033         m_data = m_rawData + TP_HEADER_LENGTH + NP_HEADER_LENGTH;
00034 
00035         memcpy(m_data, message, m_length);
00036 } // constructor
00037 
00038                 
00045 TpPacket::TpPacket(unsigned short credits, unsigned short ack, bool isRetransmission)
00046 {
00047         m_seqNum = 0;
00048         m_credits = credits;
00049         m_ack = ack;
00050         m_ackBit = true;
00051         m_length = 0;
00052         m_endBit = false;
00053         m_data = NULL;
00054         m_retransBit = isRetransmission;
00055 
00056         m_rawData = new u_char[TP_HEADER_LENGTH + NP_HEADER_LENGTH];
00057         MEMCHECK(m_rawData);
00058 } // fn constuctor
00059 
00060 
00067 TpPacket::TpPacket(unsigned char* tpData, unsigned int length)
00068 {       
00069         m_seqNum = (tpData[SeqNumOffset]);
00070         m_ack = (tpData[AckOffset]);
00071         m_credits = (tpData[CreditsOffset] & 0xF8) >> 3;
00072         m_ackBit = (tpData[AckBitOffset] & 0x04) == 0x04;
00073         m_retransBit = (tpData[RetransBitOffset] & 0x02) == 0x02;
00074         m_endBit = (tpData[EndBitOffset] & 0x01);
00075         m_data = tpData + TP_HEADER_LENGTH;
00076         m_rawData = tpData - NP_HEADER_LENGTH;
00077     m_length = length - TP_HEADER_LENGTH;
00078 } // fn constructor
00079 
00080 
00084 TpPacket::TpPacket(const TpPacket& copyThis) {
00085         m_seqNum = copyThis.m_seqNum;
00086         m_ack = copyThis.m_ack;
00087         m_credits = copyThis.m_credits;
00088         m_ackBit = copyThis.m_ackBit;
00089         m_retransBit = copyThis.m_retransBit;
00090         m_endBit = copyThis.m_endBit;
00091     m_length = copyThis.m_length;
00092     if (copyThis.m_rawData != NULL) {
00093         m_rawData = new u_char[copyThis.m_length + NP_HEADER_LENGTH + TP_HEADER_LENGTH];
00094         MEMCHECK(m_rawData);
00095             memcpy(m_rawData, copyThis.m_rawData, copyThis.m_length + NP_HEADER_LENGTH + TP_HEADER_LENGTH);
00096     }
00097     else {
00098         m_rawData = NULL;
00099     }
00100     if (copyThis.m_data != NULL) {
00101             m_data = m_rawData + NP_HEADER_LENGTH + TP_HEADER_LENGTH;
00102     }
00103     else {
00104         m_data = NULL;
00105     }
00106 } // fn copy ctor
00107 
00108 
00112 TpPacket::~TpPacket()
00113 {
00114     if (m_rawData != NULL) {
00115             delete [] m_rawData;
00116                 m_rawData = NULL;
00117     }
00118 } // destructor
00119 
00120 
00128 u_char* 
00129 TpPacket::getTpData()
00130 {
00131         u_char* rawData = m_rawData + NP_HEADER_LENGTH;
00132         rawData[SeqNumOffset] = (unsigned char)(m_seqNum);
00133         rawData[AckOffset] = (unsigned char)(m_ack);
00134     rawData[CreditsOffset] = m_credits << 3;
00135         rawData[AckBitOffset] |= (m_ackBit ? 4 : 0);
00136     rawData[RetransBitOffset] |= (m_retransBit ? 2 : 0);
00137         rawData[EndBitOffset] |= (m_endBit ? 1 : 0);
00138         return rawData;
00139 } // fn getRawData
00140 
00141 
00145 unsigned short 
00146 TpPacket::getTpLength()
00147 {
00148         return m_length + TP_HEADER_LENGTH;
00149 } // fn getRawLength
00150 
00151 
00155 u_char* 
00156 TpPacket::getData()
00157 {
00158         return m_data;
00159 } // fn getData
00160 
00161 
00165 unsigned short 
00166 TpPacket::getDataLength()
00167 {
00168         return m_length;
00169 } // fn getLength
00170 
00171 
00175 unsigned short 
00176 TpPacket::getSeqNum()
00177 {
00178         return m_seqNum;
00179 } // fn getSeqNum
00180 
00181 
00185 bool 
00186 TpPacket::isEnd()
00187 {
00188         return m_endBit;
00189 } // fn isEnd
00190 
00191 
00195 bool 
00196 TpPacket::isRetrans()
00197 {
00198         return m_retransBit;
00199 } // fn isRetrans
00200 
00201 
00205 void 
00206 TpPacket::makeRetrans()
00207 {
00208         m_retransBit = true;
00209 } // fn makeRetrans
00210 
00211 
00215 bool 
00216 TpPacket::isAck()
00217 {
00218         return m_ackBit;
00219 } // fn isAck
00220 
00221 
00225 unsigned short 
00226 TpPacket::getAckNum()
00227 {
00228         return m_ack;
00229 } // fn getAckNum
00230 
00231 
00235 unsigned short 
00236 TpPacket::getCredits()
00237 {
00238         return m_credits;
00239 } // fn getCredits
00240 
00241 
00242 void
00243 TpPacket::toStream(std::ostream& out) {
00244     if (m_ackBit)
00245     {
00246         out << "Credits        = " << m_credits << "\n";
00247         out << "Acknowledgment = " << m_ack << "\n";
00248     }
00249     else
00250     {
00251         out << "Sequence num   = " << m_seqNum << "\n";
00252         out << "Length         = " << m_length << "\n";
00253     }
00254     out << "End bit        = " << (char*)(m_endBit?"yes":"no") << "\n";
00255     out << "ACK bit        = " << (m_ackBit?"yes":"no") << "\n";
00256     out << "Retrans bit    = " << (m_retransBit?"yes":"no") << "\n";
00257     out << "Body: ";
00258     out << hex;
00259     for (unsigned int i=0; i<m_length; i++)
00260     {
00261         out << "0x" << (int)m_data[i] << " ";
00262     }
00263     out << dec << "\n";
00264 } // fn toStream
00265 
00266 
00267 void 
00268 TpPacket::dumpHeader(std::ostream& out)
00269 {
00270         u_char* data = getTpData();
00271         out << "Dumping header...\n";
00272         for (int i = 0; i < TP_HEADER_LENGTH; i++) {
00273                 out << dec << i << ": 0x" << hex << (int)data[i] << "\n";
00274         }
00275     out << dec;
00276 } // fn dumpHeader
00277 
00278 

Generated at Thu Jul 11 13:31:52 2002 for Peekabooty by doxygen1.2.9 written by Dimitri van Heesch, © 1997-2001