diff options
author | Timo Teras <timo.teras@iki.fi> | 2008-12-24 16:23:09 +0200 |
---|---|---|
committer | Timo Teras <timo.teras@iki.fi> | 2008-12-24 16:23:09 +0200 |
commit | 14201eaf926cea53725ee61378d586dc9c9c6810 (patch) | |
tree | f3bd9404f8e020ec9bd13c0491ac7aee3d9023ea | |
parent | 47c08fbfadf4812626690f00cac4a08d89660fb5 (diff) | |
download | pingu-14201eaf926cea53725ee61378d586dc9c9c6810.tar.bz2 pingu-14201eaf926cea53725ee61378d586dc9c9c6810.tar.xz |
mtu: minor fixups; try harder to traverse nat boxes in mtu inject
-rw-r--r-- | icmp.c | 6 | ||||
-rw-r--r-- | mtu.c | 10 |
2 files changed, 10 insertions, 6 deletions
@@ -260,8 +260,7 @@ int icmp_send_frag_needed(int fd, struct sockaddr *to, int tolen, icp->un.frag.mtu = htons(newmtu); /* copy ip header + 64-bits of original packet */ - memcpy(&packet[sizeof(struct icmphdr)], iph, - sizeof(struct iphdr) + 8); + memcpy(icp + 1, iph, sizeof(struct iphdr) + 8); icp->checksum = in_cksum((u_short *) icp, len, 0); @@ -275,7 +274,7 @@ int icmp_send_ping(int fd, struct sockaddr *to, int tolen, int seq, int total_size) { struct sockaddr_in *to_in = (struct sockaddr_in *) to; - char packet[1500]; + __u8 packet[1500]; struct icmphdr *icp; int len; @@ -285,6 +284,7 @@ int icmp_send_ping(int fd, struct sockaddr *to, int tolen, total_size = sizeof(struct iphdr) + sizeof(struct icmphdr); len = total_size - sizeof(struct iphdr); + memset(packet, 0, sizeof(packet)); icp = (struct icmphdr *) packet; icp->type = ICMP_ECHO; @@ -93,9 +93,9 @@ static void do_inject(void) struct sockaddr_in from; int len, seq = 0; + icmp_send_ping(fd, (struct sockaddr *) &to, sizeof(to), + ++seq, mtu_size); for (;;) { - icmp_send_ping(fd, (struct sockaddr *) &to, sizeof(to), - ++seq, mtu_size); if ((len = icmp_read_reply(fd, (struct sockaddr *) &from, sizeof(from), buf, sizeof(buf))) <= 0) @@ -106,9 +106,13 @@ static void do_inject(void) (struct sockaddr *) &to)) continue; + if (seq != 1) + sleep(1); + + icmp_send_ping(fd, (struct sockaddr *) &to, sizeof(to), + ++seq, mtu_size); icmp_send_frag_needed(fd, (struct sockaddr *) &to, sizeof(to), (struct iphdr *) buf, mtu_size - 2); - sleep(1); } } |