| 249 | delete[] headerSegment; |
| 250 | } |
| 251 | bool IP_Packet::VerifyChecksum() |
| 252 | { |
| 253 | ReComputeHeaderLen(); |
| 254 | u8* headerSegment = new u8[headerLength]; |
| 255 | int counter = 0; |
| 256 | NetLib::WriteByte08(headerSegment, &counter, (_verHi + (headerLength >> 2))); |
| 257 | NetLib::WriteByte08(headerSegment, &counter, dscp); //DSCP/ECN |
| 258 | NetLib::WriteUInt16(headerSegment, &counter, GetLength()); |
| 259 | |
| 260 | NetLib::WriteUInt16(headerSegment, &counter, id); |
| 261 | NetLib::WriteByte08(headerSegment, &counter, fragmentFlags1); |
| 262 | NetLib::WriteByte08(headerSegment, &counter, fragmentFlags2); |
| 263 | |
| 264 | NetLib::WriteByte08(headerSegment, &counter, timeToLive); |
| 265 | NetLib::WriteByte08(headerSegment, &counter, protocol); |
| 266 | NetLib::WriteUInt16(headerSegment, &counter, checksum); //header csum |
| 267 | |
| 268 | NetLib::WriteIPAddress(headerSegment, &counter, sourceIP); |
| 269 | NetLib::WriteIPAddress(headerSegment, &counter, destinationIP); |
| 270 | |
| 271 | //options |
| 272 | for (size_t i = 0; i < options.size(); i++) |
| 273 | options[i]->WriteBytes(headerSegment, &counter); |
| 274 | |
| 275 | //Zero alignment bytes |
| 276 | if (counter != headerLength) |
| 277 | memset(&headerSegment[counter], 0, headerLength - counter); |
| 278 | |
| 279 | counter = headerLength; |
| 280 | |
| 281 | u16 csumCal = InternetChecksum(headerSegment, headerLength); |
| 282 | delete[] headerSegment; |
| 283 | |
| 284 | return (csumCal == 0); |
| 285 | } |
| 286 | |
| 287 | IP_Packet::~IP_Packet() |
| 288 | { |
no test coverage detected