aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Teras <timo.teras@iki.fi>2008-12-24 16:23:09 +0200
committerTimo Teras <timo.teras@iki.fi>2008-12-24 16:23:09 +0200
commit14201eaf926cea53725ee61378d586dc9c9c6810 (patch)
treef3bd9404f8e020ec9bd13c0491ac7aee3d9023ea
parent47c08fbfadf4812626690f00cac4a08d89660fb5 (diff)
downloadpingu-14201eaf926cea53725ee61378d586dc9c9c6810.tar.bz2
pingu-14201eaf926cea53725ee61378d586dc9c9c6810.tar.xz
mtu: minor fixups; try harder to traverse nat boxes in mtu inject
-rw-r--r--icmp.c6
-rw-r--r--mtu.c10
2 files changed, 10 insertions, 6 deletions
diff --git a/icmp.c b/icmp.c
index bb5db3f..8c27a8e 100644
--- a/icmp.c
+++ b/icmp.c
@@ -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;
diff --git a/mtu.c b/mtu.c
index 1a3c42c..01af3ed 100644
--- a/mtu.c
+++ b/mtu.c
@@ -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);
}
}