111bool rpr::Header::verify() {
114 if (frame_->isEmpty())
return (
false);
117 uint8_t* data = buff->begin();
119 if (buff->getPayload() < HeaderSize)
return (
false);
121 syn = data[0] & 0x80;
122 ack = data[0] & 0x40;
123 rst = data[0] & 0x10;
124 nul = data[0] & 0x08;
125 busy = data[0] & 0x01;
127 size = (syn) ? SynSize : HeaderSize;
129 if ((data[1] != size) || (buff->getPayload() < size) || (getUInt16(data, size - 2) != compSum(data, size)))
133 acknowledge = data[3];
135 if (!syn)
return true;
137 version = data[4] >> 4;
138 chk = data[4] & 0x04;
140 maxOutstandingSegments = data[5];
141 maxSegmentSize = getUInt16(data, 6);
142 retransmissionTimeout = getUInt16(data, 8);
143 cumulativeAckTimeout = getUInt16(data, 10);
144 nullTimeout = getUInt16(data, 12);
145 maxRetransmissions = data[14];
146 maxCumulativeAck = data[15];
147 timeoutUnit = data[17];
148 connectionId = data[18];
154void rpr::Header::update() {
160 uint8_t* data = buff->begin();
162 size = (syn) ? SynSize : HeaderSize;
164 if (buff->getSize() < size)
166 "Buffer size %" PRIu32
" is less size indicated in header %" PRIu8,
170 buff->minPayload(size);
172 memset(data, 0, size);
175 if (ack) data[0] |= 0x40;
176 if (rst) data[0] |= 0x10;
177 if (nul) data[0] |= 0x08;
178 if (busy) data[0] |= 0x01;
181 data[3] = acknowledge;
186 data[4] |= (version << 4);
187 if (chk) data[4] |= 0x04;
189 data[5] = maxOutstandingSegments;
191 setUInt16(data, 6, maxSegmentSize);
192 setUInt16(data, 8, retransmissionTimeout);
193 setUInt16(data, 10, cumulativeAckTimeout);
194 setUInt16(data, 12, nullTimeout);
196 data[14] = maxRetransmissions;
197 data[15] = maxCumulativeAck;
198 data[17] = timeoutUnit;
199 data[18] = connectionId;
202 setUInt16(data, size - 2, compSum(data, size));
203 gettimeofday(&time_, NULL);
223std::string rpr::Header::dump() {
227 uint8_t* data = buff->begin();
229 std::stringstream ret(
"");
231 ret <<
" Total Size : " << std::dec << (*(frame_->beginBuffer()))->getPayload() << std::endl;
232 ret <<
" Raw Size : " << std::dec << (*(frame_->beginBuffer()))->getSize() << std::endl;
233 ret <<
" Raw Header : ";
235 for (x = 0; x < data[1]; x++) {
236 ret <<
"0x" << std::hex << std::setw(2) << std::setfill('0') << static_cast<uint32_t>(data[x]) <<
" ";
237 if ((x % 8) == 7 && (x + 1) != data[1]) ret << std::endl <<
" ";
241 ret <<
" Syn : " << std::dec << syn << std::endl;
242 ret <<
" Ack : " << std::dec << ack << std::endl;
243 ret <<
" Rst : " << std::dec << rst << std::endl;
244 ret <<
" Nul : " << std::dec << nul << std::endl;
245 ret <<
" Busy : " << std::dec << busy << std::endl;
246 ret <<
" Sequence : " << std::dec << static_cast<uint32_t>(sequence) << std::endl;
247 ret <<
" Acknowledge : " << std::dec << static_cast<uint32_t>(acknowledge) << std::endl;
249 if (!syn)
return (ret.str());
251 ret <<
" Version : " << std::dec << static_cast<uint32_t>(version) << std::endl;
252 ret <<
" Chk : " << std::dec << chk << std::endl;
253 ret <<
" Max Out Seg : " << std::dec << static_cast<uint32_t>(maxOutstandingSegments) << std::endl;
254 ret <<
" Max Seg Size : " << std::dec << static_cast<uint32_t>(maxSegmentSize) << std::endl;
255 ret <<
" Retran Tout : " << std::dec << static_cast<uint32_t>(retransmissionTimeout) << std::endl;
256 ret <<
" Cum Ack Tout : " << std::dec << static_cast<uint32_t>(cumulativeAckTimeout) << std::endl;
257 ret <<
" Null Tout : " << std::dec << static_cast<uint32_t>(nullTimeout) << std::endl;
258 ret <<
" Max Retrans : " << std::dec << static_cast<uint32_t>(maxRetransmissions) << std::endl;
259 ret <<
" Max Cum Ack : " << std::dec << static_cast<uint32_t>(maxCumulativeAck) << std::endl;
260 ret <<
" Timeout Unit : " << std::dec << static_cast<uint32_t>(timeoutUnit) << std::endl;
261 ret <<
" Conn Id : " << std::dec << static_cast<uint32_t>(connectionId) << std::endl;