aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/ping.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net/ping.h')
-rw-r--r--include/net/ping.h65
1 files changed, 62 insertions, 3 deletions
diff --git a/include/net/ping.h b/include/net/ping.h
index 682b5ae9af51..5db0224b73ac 100644
--- a/include/net/ping.h
+++ b/include/net/ping.h
@@ -13,6 +13,7 @@
13#ifndef _PING_H 13#ifndef _PING_H
14#define _PING_H 14#define _PING_H
15 15
16#include <net/icmp.h>
16#include <net/netns/hash.h> 17#include <net/netns/hash.h>
17 18
18/* PING_HTABLE_SIZE must be power of 2 */ 19/* PING_HTABLE_SIZE must be power of 2 */
@@ -28,6 +29,18 @@
28 */ 29 */
29#define GID_T_MAX (((gid_t)~0U) >> 1) 30#define GID_T_MAX (((gid_t)~0U) >> 1)
30 31
32/* Compatibility glue so we can support IPv6 when it's compiled as a module */
33struct pingv6_ops {
34 int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len);
35 int (*ip6_datagram_recv_ctl)(struct sock *sk, struct msghdr *msg,
36 struct sk_buff *skb);
37 int (*icmpv6_err_convert)(u8 type, u8 code, int *err);
38 void (*ipv6_icmp_error)(struct sock *sk, struct sk_buff *skb, int err,
39 __be16 port, u32 info, u8 *payload);
40 int (*ipv6_chk_addr)(struct net *net, const struct in6_addr *addr,
41 const struct net_device *dev, int strict);
42};
43
31struct ping_table { 44struct ping_table {
32 struct hlist_nulls_head hash[PING_HTABLE_SIZE]; 45 struct hlist_nulls_head hash[PING_HTABLE_SIZE];
33 rwlock_t lock; 46 rwlock_t lock;
@@ -36,20 +49,66 @@ struct ping_table {
36struct ping_iter_state { 49struct ping_iter_state {
37 struct seq_net_private p; 50 struct seq_net_private p;
38 int bucket; 51 int bucket;
52 sa_family_t family;
39}; 53};
40 54
41extern struct proto ping_prot; 55extern struct proto ping_prot;
56extern struct ping_table ping_table;
57#if IS_ENABLED(CONFIG_IPV6)
58extern struct pingv6_ops pingv6_ops;
59#endif
60
61struct pingfakehdr {
62 struct icmphdr icmph;
63 struct iovec *iov;
64 sa_family_t family;
65 __wsum wcheck;
66};
67
68int ping_get_port(struct sock *sk, unsigned short ident);
69void ping_hash(struct sock *sk);
70void ping_unhash(struct sock *sk);
42 71
72int ping_init_sock(struct sock *sk);
73void ping_close(struct sock *sk, long timeout);
74int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len);
75void ping_err(struct sk_buff *skb, int offset, u32 info);
76int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd,
77 struct sk_buff *);
43 78
44extern void ping_rcv(struct sk_buff *); 79int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
45extern void ping_err(struct sk_buff *, u32 info); 80 size_t len, int noblock, int flags, int *addr_len);
81int ping_common_sendmsg(int family, struct msghdr *msg, size_t len,
82 void *user_icmph, size_t icmph_len);
83int ping_v4_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
84 size_t len);
85int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
86 size_t len);
87int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
88void ping_rcv(struct sk_buff *skb);
46 89
47#ifdef CONFIG_PROC_FS 90#ifdef CONFIG_PROC_FS
91struct ping_seq_afinfo {
92 char *name;
93 sa_family_t family;
94 const struct file_operations *seq_fops;
95 const struct seq_operations seq_ops;
96};
97
98extern const struct file_operations ping_seq_fops;
99
100void *ping_seq_start(struct seq_file *seq, loff_t *pos, sa_family_t family);
101void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos);
102void ping_seq_stop(struct seq_file *seq, void *v);
103int ping_proc_register(struct net *net, struct ping_seq_afinfo *afinfo);
104void ping_proc_unregister(struct net *net, struct ping_seq_afinfo *afinfo);
105
48extern int __init ping_proc_init(void); 106extern int __init ping_proc_init(void);
49extern void ping_proc_exit(void); 107extern void ping_proc_exit(void);
50#endif 108#endif
51 109
52void __init ping_init(void); 110void __init ping_init(void);
53 111int __init pingv6_init(void);
112void pingv6_exit(void);
54 113
55#endif /* _PING_H */ 114#endif /* _PING_H */