diff options
Diffstat (limited to 'include/net/ping.h')
-rw-r--r-- | include/net/ping.h | 65 |
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 */ | ||
33 | struct 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 | |||
31 | struct ping_table { | 44 | struct 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 { | |||
36 | struct ping_iter_state { | 49 | struct 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 | ||
41 | extern struct proto ping_prot; | 55 | extern struct proto ping_prot; |
56 | extern struct ping_table ping_table; | ||
57 | #if IS_ENABLED(CONFIG_IPV6) | ||
58 | extern struct pingv6_ops pingv6_ops; | ||
59 | #endif | ||
60 | |||
61 | struct pingfakehdr { | ||
62 | struct icmphdr icmph; | ||
63 | struct iovec *iov; | ||
64 | sa_family_t family; | ||
65 | __wsum wcheck; | ||
66 | }; | ||
67 | |||
68 | int ping_get_port(struct sock *sk, unsigned short ident); | ||
69 | void ping_hash(struct sock *sk); | ||
70 | void ping_unhash(struct sock *sk); | ||
42 | 71 | ||
72 | int ping_init_sock(struct sock *sk); | ||
73 | void ping_close(struct sock *sk, long timeout); | ||
74 | int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len); | ||
75 | void ping_err(struct sk_buff *skb, int offset, u32 info); | ||
76 | int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd, | ||
77 | struct sk_buff *); | ||
43 | 78 | ||
44 | extern void ping_rcv(struct sk_buff *); | 79 | int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, |
45 | extern void ping_err(struct sk_buff *, u32 info); | 80 | size_t len, int noblock, int flags, int *addr_len); |
81 | int ping_common_sendmsg(int family, struct msghdr *msg, size_t len, | ||
82 | void *user_icmph, size_t icmph_len); | ||
83 | int ping_v4_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | ||
84 | size_t len); | ||
85 | int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | ||
86 | size_t len); | ||
87 | int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); | ||
88 | void ping_rcv(struct sk_buff *skb); | ||
46 | 89 | ||
47 | #ifdef CONFIG_PROC_FS | 90 | #ifdef CONFIG_PROC_FS |
91 | struct 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 | |||
98 | extern const struct file_operations ping_seq_fops; | ||
99 | |||
100 | void *ping_seq_start(struct seq_file *seq, loff_t *pos, sa_family_t family); | ||
101 | void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos); | ||
102 | void ping_seq_stop(struct seq_file *seq, void *v); | ||
103 | int ping_proc_register(struct net *net, struct ping_seq_afinfo *afinfo); | ||
104 | void ping_proc_unregister(struct net *net, struct ping_seq_afinfo *afinfo); | ||
105 | |||
48 | extern int __init ping_proc_init(void); | 106 | extern int __init ping_proc_init(void); |
49 | extern void ping_proc_exit(void); | 107 | extern void ping_proc_exit(void); |
50 | #endif | 108 | #endif |
51 | 109 | ||
52 | void __init ping_init(void); | 110 | void __init ping_init(void); |
53 | 111 | int __init pingv6_init(void); | |
112 | void pingv6_exit(void); | ||
54 | 113 | ||
55 | #endif /* _PING_H */ | 114 | #endif /* _PING_H */ |