diff options
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r-- | net/ipv4/icmp.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 3314394f0aab..3f47585aad68 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -83,6 +83,7 @@ | |||
83 | #include <net/tcp.h> | 83 | #include <net/tcp.h> |
84 | #include <net/udp.h> | 84 | #include <net/udp.h> |
85 | #include <net/raw.h> | 85 | #include <net/raw.h> |
86 | #include <net/ping.h> | ||
86 | #include <linux/skbuff.h> | 87 | #include <linux/skbuff.h> |
87 | #include <net/sock.h> | 88 | #include <net/sock.h> |
88 | #include <linux/errno.h> | 89 | #include <linux/errno.h> |
@@ -781,6 +782,15 @@ static void icmp_redirect(struct sk_buff *skb) | |||
781 | iph->saddr, skb->dev); | 782 | iph->saddr, skb->dev); |
782 | break; | 783 | break; |
783 | } | 784 | } |
785 | |||
786 | /* Ping wants to see redirects. | ||
787 | * Let's pretend they are errors of sorts... */ | ||
788 | if (iph->protocol == IPPROTO_ICMP && | ||
789 | iph->ihl >= 5 && | ||
790 | pskb_may_pull(skb, (iph->ihl<<2)+8)) { | ||
791 | ping_err(skb, icmp_hdr(skb)->un.gateway); | ||
792 | } | ||
793 | |||
784 | out: | 794 | out: |
785 | return; | 795 | return; |
786 | out_err: | 796 | out_err: |
@@ -1041,7 +1051,7 @@ error: | |||
1041 | */ | 1051 | */ |
1042 | static const struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = { | 1052 | static const struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = { |
1043 | [ICMP_ECHOREPLY] = { | 1053 | [ICMP_ECHOREPLY] = { |
1044 | .handler = icmp_discard, | 1054 | .handler = ping_rcv, |
1045 | }, | 1055 | }, |
1046 | [1] = { | 1056 | [1] = { |
1047 | .handler = icmp_discard, | 1057 | .handler = icmp_discard, |