aboutsummaryrefslogtreecommitdiffstats
path: root/mtu.c
diff options
context:
space:
mode:
authorTimo Teras <timo.teras@iki.fi>2008-12-29 13:02:29 +0200
committerTimo Teras <timo.teras@iki.fi>2008-12-29 13:02:29 +0200
commitcab8b9de73a8471ae69485dddebfa1e91c0a28eb (patch)
treeed84ad7261e2012123321744af1cdc887d1fa3ce /mtu.c
parent7051fc6ba4f18ca4ab5e32a51b6cf899fda6d9d1 (diff)
downloadpingu-cab8b9de73a8471ae69485dddebfa1e91c0a28eb.tar.bz2
pingu-cab8b9de73a8471ae69485dddebfa1e91c0a28eb.tar.xz
mtu: -I switch
Diffstat (limited to 'mtu.c')
-rw-r--r--mtu.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/mtu.c b/mtu.c
index 01af3ed..e2fb7c3 100644
--- a/mtu.c
+++ b/mtu.c
@@ -16,6 +16,7 @@ static void usage(void)
{
fprintf(stderr,
"usage: mtu -i <mtu-size> <host>\n"
+ " mtu -I <host>\n"
" mtu -d <host>\n");
exit(3);
}
@@ -91,11 +92,11 @@ static void do_inject(void)
{
__u8 buf[1500];
struct sockaddr_in from;
- int len, seq = 0;
+ int len, i, seq = 0;
icmp_send_ping(fd, (struct sockaddr *) &to, sizeof(to),
++seq, mtu_size);
- for (;;) {
+ for (i = 0; i < 5; i++) {
if ((len = icmp_read_reply(fd, (struct sockaddr *) &from,
sizeof(from),
buf, sizeof(buf))) <= 0)
@@ -116,6 +117,21 @@ static void do_inject(void)
}
}
+static void do_inject_pmtu(void)
+{
+ u_int16_t mtu;
+
+ if (netlink_route_get(&to, &mtu) < 0) {
+ fprintf(stderr, "Failed to determine Path MTU\n");
+ return;
+ }
+ if (mtu == 1500)
+ return;
+
+ mtu_size = mtu;
+ do_inject();
+}
+
int main(int argc, char **argv)
{
struct hostent *hp;
@@ -123,7 +139,7 @@ int main(int argc, char **argv)
char *target;
int opt;
- while ((opt = getopt(argc, argv, "di:")) != -1) {
+ while ((opt = getopt(argc, argv, "dIi:")) != -1) {
switch (opt) {
case 'd':
action = do_discover;
@@ -132,6 +148,9 @@ int main(int argc, char **argv)
action = do_inject;
mtu_size = atoi(optarg);
break;
+ case 'I':
+ action = do_inject_pmtu;
+ break;
default:
usage();
}