Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * INET     An implementation of the TCP/IP protocol suite for the LINUX
0004  *      operating system.  INET is implemented using the  BSD Socket
0005  *      interface as the means of communication with the user level.
0006  *
0007  *      Definitions for the "ping" module.
0008  */
0009 #ifndef _PING_H
0010 #define _PING_H
0011 
0012 #include <net/icmp.h>
0013 #include <net/netns/hash.h>
0014 
0015 /* PING_HTABLE_SIZE must be power of 2 */
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  * gid_t is either uint or ushort.  We want to pass it to
0024  * proc_dointvec_minmax(), so it must not be larger than MAX_INT
0025  */
0026 #define GID_T_MAX (((gid_t)~0U) >> 1)
0027 
0028 /* Compatibility glue so we can support IPv6 when it's compiled as a module */
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 /* _PING_H */