From cab8b9de73a8471ae69485dddebfa1e91c0a28eb Mon Sep 17 00:00:00 2001 From: Timo Teras Date: Mon, 29 Dec 2008 13:02:29 +0200 Subject: mtu: -I switch --- mtu.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'mtu.c') 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 \n" + " mtu -I \n" " mtu -d \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(); } -- cgit v1.2.3