/
/
/
1#include "qt_icmp/icmp_packet.hpp"
2
3#include <cstring>
4
5ICMPPacket::ICMPPacket(quint16 id, quint16 sequence) {
6 memset(&icmp_hdr_, 0, sizeof(icmp_hdr_));
7 icmp_hdr_.type = ICMP_ECHO;
8 icmp_hdr_.un.echo.id = id;
9 icmp_hdr_.un.echo.sequence = sequence;
10 icmp_hdr_.checksum = calculateChecksum();
11}
12
13const struct icmphdr* ICMPPacket::header() const {
14 return &icmp_hdr_;
15}
16
17size_t ICMPPacket::size() const {
18 return sizeof(icmp_hdr_);
19}
20
21unsigned short ICMPPacket::calculateChecksum() {
22 unsigned short *buf = reinterpret_cast<unsigned short*>(&icmp_hdr_);
23 unsigned int sum = 0;
24 for (int len = sizeof(icmp_hdr_); len > 1; len -= 2) {
25 sum += *buf++;
26 }
27 if (sizeof(icmp_hdr_) % 2 == 1) {
28 sum += *(reinterpret_cast<unsigned char*>(buf));
29 }
30 sum = (sum >> 16) + (sum & 0xFFFF);
31 sum += (sum >> 16);
32 return static_cast<unsigned short>(~sum);
33}
34