| 166 | } |
| 167 | |
| 168 | void IP_Packet::WriteBytes(u8* buffer, int* offset) |
| 169 | { |
| 170 | const int startOff = *offset; |
| 171 | CalculateChecksum(); //ReComputeHeaderLen called in CalculateChecksum |
| 172 | payload->CalculateChecksum(sourceIP, destinationIP); |
| 173 | |
| 174 | NetLib::WriteByte08(buffer, offset, (_verHi + (headerLength >> 2))); |
| 175 | NetLib::WriteByte08(buffer, offset, dscp); //DSCP/ECN |
| 176 | NetLib::WriteUInt16(buffer, offset, GetLength()); |
| 177 | |
| 178 | NetLib::WriteUInt16(buffer, offset, id); |
| 179 | NetLib::WriteByte08(buffer, offset, fragmentFlags1); |
| 180 | NetLib::WriteByte08(buffer, offset, fragmentFlags2); |
| 181 | |
| 182 | NetLib::WriteByte08(buffer, offset, timeToLive); |
| 183 | NetLib::WriteByte08(buffer, offset, protocol); |
| 184 | NetLib::WriteUInt16(buffer, offset, checksum); //header csum |
| 185 | |
| 186 | NetLib::WriteIPAddress(buffer, offset, sourceIP); |
| 187 | NetLib::WriteIPAddress(buffer, offset, destinationIP); |
| 188 | |
| 189 | //options |
| 190 | for (size_t i = 0; i < options.size(); i++) |
| 191 | options[i]->WriteBytes(buffer, offset); |
| 192 | |
| 193 | //Zero alignment bytes |
| 194 | if (*offset != startOff + headerLength) |
| 195 | memset(&buffer[*offset], 0, startOff + headerLength - *offset); |
| 196 | |
| 197 | *offset = startOff + headerLength; |
| 198 | |
| 199 | payload->WriteBytes(buffer, offset); |
| 200 | } |
| 201 | |
| 202 | IP_Packet* IP_Packet::Clone() const |
| 203 | { |
no test coverage detected