diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2014-01-19 21:43:08 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-19 22:53:18 -0500 |
commit | 4b261c75a99f29c93a0b6babfc180cdf566bd654 (patch) | |
tree | 2c1fcebd79d2fcb1625f89ef5067605151953010 /include/net | |
parent | a6e2fe17eba47681e82cdb9cfed5a67b57802a78 (diff) |
ipv6: make IPV6_RECVPKTINFO work for ipv4 datagrams
We currently don't report IPV6_RECVPKTINFO in cmsg access ancillary data
for IPv4 datagrams on IPv6 sockets.
This patch splits the ip6_datagram_recv_ctl into two functions, one
which handles both protocol families, AF_INET and AF_INET6, while the
ip6_datagram_recv_specific_ctl only handles IPv6 cmsg data.
ip6_datagram_recv_*_ctl never reported back any errors, so we can make
them return void. Also provide a helper for protocols which don't offer dual
personality to further use ip6_datagram_recv_ctl, which is exported to
modules.
I needed to shuffle the code for ping around a bit to make it easier to
implement dual personality for ping ipv6 sockets in future.
Reported-by: Gert Doering <gert@space.net>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/ip.h | 1 | ||||
-rw-r--r-- | include/net/ping.h | 8 | ||||
-rw-r--r-- | include/net/transp_v6.h | 9 |
3 files changed, 14 insertions, 4 deletions
diff --git a/include/net/ip.h b/include/net/ip.h index 7876e3b96ce3..23be0fd37937 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -63,6 +63,7 @@ struct ipcm_cookie { | |||
63 | }; | 63 | }; |
64 | 64 | ||
65 | #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) | 65 | #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) |
66 | #define PKTINFO_SKB_CB(skb) ((struct in_pktinfo *)((skb)->cb)) | ||
66 | 67 | ||
67 | struct ip_ra_chain { | 68 | struct ip_ra_chain { |
68 | struct ip_ra_chain __rcu *next; | 69 | struct ip_ra_chain __rcu *next; |
diff --git a/include/net/ping.h b/include/net/ping.h index 76013653e08c..026479b61a2d 100644 --- a/include/net/ping.h +++ b/include/net/ping.h | |||
@@ -33,8 +33,12 @@ | |||
33 | struct pingv6_ops { | 33 | struct pingv6_ops { |
34 | int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len, | 34 | int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len, |
35 | int *addr_len); | 35 | int *addr_len); |
36 | int (*ip6_datagram_recv_ctl)(struct sock *sk, struct msghdr *msg, | 36 | void (*ip6_datagram_recv_common_ctl)(struct sock *sk, |
37 | struct sk_buff *skb); | 37 | struct msghdr *msg, |
38 | struct sk_buff *skb); | ||
39 | void (*ip6_datagram_recv_specific_ctl)(struct sock *sk, | ||
40 | struct msghdr *msg, | ||
41 | struct sk_buff *skb); | ||
38 | int (*icmpv6_err_convert)(u8 type, u8 code, int *err); | 42 | int (*icmpv6_err_convert)(u8 type, u8 code, int *err); |
39 | void (*ipv6_icmp_error)(struct sock *sk, struct sk_buff *skb, int err, | 43 | void (*ipv6_icmp_error)(struct sock *sk, struct sk_buff *skb, int err, |
40 | __be16 port, u32 info, u8 *payload); | 44 | __be16 port, u32 info, u8 *payload); |
diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h index 48660e50ae90..b927413dde86 100644 --- a/include/net/transp_v6.h +++ b/include/net/transp_v6.h | |||
@@ -32,8 +32,13 @@ void tcpv6_exit(void); | |||
32 | 32 | ||
33 | int udpv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | 33 | int udpv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); |
34 | 34 | ||
35 | int ip6_datagram_recv_ctl(struct sock *sk, struct msghdr *msg, | 35 | /* this does all the common and the specific ctl work */ |
36 | struct sk_buff *skb); | 36 | void ip6_datagram_recv_ctl(struct sock *sk, struct msghdr *msg, |
37 | struct sk_buff *skb); | ||
38 | void ip6_datagram_recv_common_ctl(struct sock *sk, struct msghdr *msg, | ||
39 | struct sk_buff *skb); | ||
40 | void ip6_datagram_recv_specific_ctl(struct sock *sk, struct msghdr *msg, | ||
41 | struct sk_buff *skb); | ||
37 | 42 | ||
38 | int ip6_datagram_send_ctl(struct net *net, struct sock *sk, struct msghdr *msg, | 43 | int ip6_datagram_send_ctl(struct net *net, struct sock *sk, struct msghdr *msg, |
39 | struct flowi6 *fl6, struct ipv6_txoptions *opt, | 44 | struct flowi6 *fl6, struct ipv6_txoptions *opt, |