| 215 | } |
| 216 | |
| 217 | void IP_Packet::CalculateChecksum() |
| 218 | { |
| 219 | //if (!(i == 5)) //checksum field is 10-11th byte (5th short), which is skipped |
| 220 | ReComputeHeaderLen(); |
| 221 | u8* headerSegment = new u8[headerLength]; |
| 222 | int counter = 0; |
| 223 | NetLib::WriteByte08(headerSegment, &counter, (_verHi + (headerLength >> 2))); |
| 224 | NetLib::WriteByte08(headerSegment, &counter, dscp); //DSCP/ECN |
| 225 | NetLib::WriteUInt16(headerSegment, &counter, GetLength()); |
| 226 | |
| 227 | NetLib::WriteUInt16(headerSegment, &counter, id); |
| 228 | NetLib::WriteByte08(headerSegment, &counter, fragmentFlags1); |
| 229 | NetLib::WriteByte08(headerSegment, &counter, fragmentFlags2); |
| 230 | |
| 231 | NetLib::WriteByte08(headerSegment, &counter, timeToLive); |
| 232 | NetLib::WriteByte08(headerSegment, &counter, protocol); |
| 233 | NetLib::WriteUInt16(headerSegment, &counter, 0); //header csum |
| 234 | |
| 235 | NetLib::WriteIPAddress(headerSegment, &counter, sourceIP); |
| 236 | NetLib::WriteIPAddress(headerSegment, &counter, destinationIP); |
| 237 | |
| 238 | //options |
| 239 | for (size_t i = 0; i < options.size(); i++) |
| 240 | options[i]->WriteBytes(headerSegment, &counter); |
| 241 | |
| 242 | //Zero alignment bytes |
| 243 | if (counter != headerLength) |
| 244 | memset(&headerSegment[counter], 0, headerLength - counter); |
| 245 | |
| 246 | counter = headerLength; |
| 247 | |
| 248 | checksum = InternetChecksum(headerSegment, headerLength); |
| 249 | delete[] headerSegment; |
| 250 | } |
| 251 | bool IP_Packet::VerifyChecksum() |
| 252 | { |
| 253 | ReComputeHeaderLen(); |
no test coverage detected