memcpy(&packet[off], &udp_pkt, sizeof(udp_pkt));
off += sizeof(udp_pkt);
- /* set ICMP checksum */
- icmp_pkt.checksum = htons(calc_checksum((uint16_t*)&packet[sizeof(ip_pkt)],
- sizeof (icmp_pkt) + sizeof(ip_pkt) + sizeof(udp_pkt)));
- memcpy (&packet[sizeof(ip_pkt)], &icmp_pkt, sizeof (icmp_pkt));
-
+ /* no go back to calculate ICMP packet checksum */
+ off = sizeof (ip_pkt);
+ icmp_pkt.checksum = htons(calc_checksum((uint16_t*)&packet[off],
+ sizeof (icmp_pkt) + sizeof(ip_pkt) + sizeof(udp_pkt)));
+ memcpy (&packet[off], &icmp_pkt, sizeof (icmp_pkt));
+
memset (&dst, 0, sizeof (dst));
dst.sin_family = AF_INET;
dst.sin_addr = *other;
err = sendto(rawsock,
packet,
- off, 0,
+ sizeof (packet), 0,
(struct sockaddr*)&dst,
sizeof(dst));
fprintf(stderr,
"sendto failed: %s\n", strerror(errno));
}
- else if (err != off)
+ else if (err != sizeof (packet))
{
fprintf(stderr,
"Error: partial send of ICMP message\n");
int err;
/* ip header: send to (known) ip address */
+ off = 0;
ip_pkt.vers_ihl = 0x45;
ip_pkt.tos = 0;
ip_pkt.pkt_len = sizeof (packet); /* huh? */
ip_pkt.src_ip = my_ip->s_addr;
ip_pkt.dst_ip = other->s_addr;
ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt, sizeof (struct ip_packet)));
- memcpy (packet, &ip_pkt, sizeof (struct ip_packet));
+ memcpy (&packet[off], &ip_pkt, sizeof (struct ip_packet));
off = sizeof (ip_pkt);
/* icmp reply: time exceeded */
dst.sin_addr = *other;
err = sendto(rawsock,
packet,
- off, 0,
+ sizeof (packet), 0,
(struct sockaddr*)&dst,
sizeof(struct sockaddr_in));
if (err < 0)
fprintf(stderr,
"sendto failed: %s\n", strerror(errno));
}
- else if (err != off)
+ else if (err != sizeof (packet))
{
fprintf(stderr,
"Error: partial send of ICMP message\n");