diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2013-05-22 16:17:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-26 00:07:49 -0400 |
commit | 6d0bfe22611602f36617bc7aa2ffa1bbb2f54c67 (patch) | |
tree | 140f06221a5da5c44526cb61f921d80fec2132c2 /net/ipv4/icmp.c | |
parent | 6e2842f4bbb5abcf57d3cb0f10870e0ce20c0ba2 (diff) |
net: ipv6: Add IPv6 support to the ping socket.
This adds the ability to send ICMPv6 echo requests without a
raw socket. The equivalent ability for ICMPv4 was added in
2011.
Instead of having separate code paths for IPv4 and IPv6, make
most of the code in net/ipv4/ping.c dual-stack and only add a
few IPv6-specific bits (like the protocol definition) to a new
net/ipv6/ping.c. Hopefully this will reduce divergence and/or
duplication of bugs in the future.
Caveats:
- Setting options via ancillary data (e.g., using IPV6_PKTINFO
to specify the outgoing interface) is not yet supported.
- There are no separate security settings for IPv4 and IPv6;
everything is controlled by /proc/net/ipv4/ping_group_range.
- The proc interface does not yet display IPv6 ping sockets
properly.
Tested with a patched copy of ping6 and using raw socket calls.
Compiles and works with all of CONFIG_IPV6={n,m,y}.
Signed-off-by: Lorenzo Colitti <lorenzo@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r-- | net/ipv4/icmp.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 76e10b47e053..562efd91f457 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -939,7 +939,8 @@ error: | |||
939 | void icmp_err(struct sk_buff *skb, u32 info) | 939 | void icmp_err(struct sk_buff *skb, u32 info) |
940 | { | 940 | { |
941 | struct iphdr *iph = (struct iphdr *)skb->data; | 941 | struct iphdr *iph = (struct iphdr *)skb->data; |
942 | struct icmphdr *icmph = (struct icmphdr *)(skb->data+(iph->ihl<<2)); | 942 | int offset = iph->ihl<<2; |
943 | struct icmphdr *icmph = (struct icmphdr *)(skb->data + offset); | ||
943 | int type = icmp_hdr(skb)->type; | 944 | int type = icmp_hdr(skb)->type; |
944 | int code = icmp_hdr(skb)->code; | 945 | int code = icmp_hdr(skb)->code; |
945 | struct net *net = dev_net(skb->dev); | 946 | struct net *net = dev_net(skb->dev); |
@@ -949,7 +950,7 @@ void icmp_err(struct sk_buff *skb, u32 info) | |||
949 | * triggered by ICMP_ECHOREPLY which sent from kernel. | 950 | * triggered by ICMP_ECHOREPLY which sent from kernel. |
950 | */ | 951 | */ |
951 | if (icmph->type != ICMP_ECHOREPLY) { | 952 | if (icmph->type != ICMP_ECHOREPLY) { |
952 | ping_err(skb, info); | 953 | ping_err(skb, offset, info); |
953 | return; | 954 | return; |
954 | } | 955 | } |
955 | 956 | ||