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 }
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 }
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 }
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 }
00107
00108
00112 TpPacket::~TpPacket()
00113 {
00114 if (m_rawData != NULL) {
00115 delete [] m_rawData;
00116 m_rawData = NULL;
00117 }
00118 }
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 }
00140
00141
00145 unsigned short
00146 TpPacket::getTpLength()
00147 {
00148 return m_length + TP_HEADER_LENGTH;
00149 }
00150
00151
00155 u_char*
00156 TpPacket::getData()
00157 {
00158 return m_data;
00159 }
00160
00161
00165 unsigned short
00166 TpPacket::getDataLength()
00167 {
00168 return m_length;
00169 }
00170
00171
00175 unsigned short
00176 TpPacket::getSeqNum()
00177 {
00178 return m_seqNum;
00179 }
00180
00181
00185 bool
00186 TpPacket::isEnd()
00187 {
00188 return m_endBit;
00189 }
00190
00191
00195 bool
00196 TpPacket::isRetrans()
00197 {
00198 return m_retransBit;
00199 }
00200
00201
00205 void
00206 TpPacket::makeRetrans()
00207 {
00208 m_retransBit = true;
00209 }
00210
00211
00215 bool
00216 TpPacket::isAck()
00217 {
00218 return m_ackBit;
00219 }
00220
00221
00225 unsigned short
00226 TpPacket::getAckNum()
00227 {
00228 return m_ack;
00229 }
00230
00231
00235 unsigned short
00236 TpPacket::getCredits()
00237 {
00238 return m_credits;
00239 }
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 }
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 }
00277
00278