0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _PING_H
0010 #define _PING_H
0011
0012 #include <net/icmp.h>
0013 #include <net/netns/hash.h>
0014
0015
0016 #define PING_HTABLE_SIZE 64
0017 #define PING_HTABLE_MASK (PING_HTABLE_SIZE-1)
0018
0019 #define ping_portaddr_for_each_entry(__sk, node, list) \
0020 hlist_nulls_for_each_entry(__sk, node, list, sk_nulls_node)
0021
0022
0023
0024
0025
0026 #define GID_T_MAX (((gid_t)~0U) >> 1)
0027
0028
0029 struct pingv6_ops {
0030 int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len,
0031 int *addr_len);
0032 void (*ip6_datagram_recv_common_ctl)(struct sock *sk,
0033 struct msghdr *msg,
0034 struct sk_buff *skb);
0035 void (*ip6_datagram_recv_specific_ctl)(struct sock *sk,
0036 struct msghdr *msg,
0037 struct sk_buff *skb);
0038 int (*icmpv6_err_convert)(u8 type, u8 code, int *err);
0039 void (*ipv6_icmp_error)(struct sock *sk, struct sk_buff *skb, int err,
0040 __be16 port, u32 info, u8 *payload);
0041 int (*ipv6_chk_addr)(struct net *net, const struct in6_addr *addr,
0042 const struct net_device *dev, int strict);
0043 };
0044
0045 struct ping_iter_state {
0046 struct seq_net_private p;
0047 int bucket;
0048 sa_family_t family;
0049 };
0050
0051 extern struct proto ping_prot;
0052 #if IS_ENABLED(CONFIG_IPV6)
0053 extern struct pingv6_ops pingv6_ops;
0054 #endif
0055
0056 struct pingfakehdr {
0057 struct icmphdr icmph;
0058 struct msghdr *msg;
0059 sa_family_t family;
0060 __wsum wcheck;
0061 };
0062
0063 int ping_get_port(struct sock *sk, unsigned short ident);
0064 int ping_hash(struct sock *sk);
0065 void ping_unhash(struct sock *sk);
0066
0067 int ping_init_sock(struct sock *sk);
0068 void ping_close(struct sock *sk, long timeout);
0069 int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len);
0070 void ping_err(struct sk_buff *skb, int offset, u32 info);
0071 int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd,
0072 struct sk_buff *);
0073
0074 int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
0075 int flags, int *addr_len);
0076 int ping_common_sendmsg(int family, struct msghdr *msg, size_t len,
0077 void *user_icmph, size_t icmph_len);
0078 int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
0079 enum skb_drop_reason ping_rcv(struct sk_buff *skb);
0080
0081 #ifdef CONFIG_PROC_FS
0082 void *ping_seq_start(struct seq_file *seq, loff_t *pos, sa_family_t family);
0083 void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos);
0084 void ping_seq_stop(struct seq_file *seq, void *v);
0085
0086 int __init ping_proc_init(void);
0087 void ping_proc_exit(void);
0088 #endif
0089
0090 void __init ping_init(void);
0091 int __init pingv6_init(void);
0092 void pingv6_exit(void);
0093
0094 #endif