ping.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * INET An implementation of the TCP/IP protocol suite for the LINUX
  4. * operating system. INET is implemented using the BSD Socket
  5. * interface as the means of communication with the user level.
  6. *
  7. * Definitions for the "ping" module.
  8. */
  9. #ifndef _PING_H
  10. #define _PING_H
  11. #include <net/icmp.h>
  12. #include <net/netns/hash.h>
  13. /* PING_HTABLE_SIZE must be power of 2 */
  14. #define PING_HTABLE_SIZE 64
  15. #define PING_HTABLE_MASK (PING_HTABLE_SIZE-1)
  16. #define GID_T_MAX (((gid_t)~0U) - 1)
  17. /* Compatibility glue so we can support IPv6 when it's compiled as a module */
  18. struct pingv6_ops {
  19. int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len,
  20. int *addr_len);
  21. void (*ip6_datagram_recv_common_ctl)(struct sock *sk,
  22. struct msghdr *msg,
  23. struct sk_buff *skb);
  24. void (*ip6_datagram_recv_specific_ctl)(struct sock *sk,
  25. struct msghdr *msg,
  26. struct sk_buff *skb);
  27. int (*icmpv6_err_convert)(u8 type, u8 code, int *err);
  28. void (*ipv6_icmp_error)(struct sock *sk, struct sk_buff *skb, int err,
  29. __be16 port, u32 info, u8 *payload);
  30. int (*ipv6_chk_addr)(struct net *net, const struct in6_addr *addr,
  31. const struct net_device *dev, int strict);
  32. };
  33. struct ping_iter_state {
  34. struct seq_net_private p;
  35. int bucket;
  36. sa_family_t family;
  37. };
  38. extern struct proto ping_prot;
  39. #if IS_ENABLED(CONFIG_IPV6)
  40. extern struct pingv6_ops pingv6_ops;
  41. #endif
  42. struct pingfakehdr {
  43. struct icmphdr icmph;
  44. struct msghdr *msg;
  45. sa_family_t family;
  46. __wsum wcheck;
  47. };
  48. int ping_get_port(struct sock *sk, unsigned short ident);
  49. int ping_hash(struct sock *sk);
  50. void ping_unhash(struct sock *sk);
  51. int ping_init_sock(struct sock *sk);
  52. void ping_close(struct sock *sk, long timeout);
  53. int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len);
  54. void ping_err(struct sk_buff *skb, int offset, u32 info);
  55. int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd,
  56. struct sk_buff *);
  57. int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
  58. int flags, int *addr_len);
  59. int ping_common_sendmsg(int family, struct msghdr *msg, size_t len,
  60. void *user_icmph, size_t icmph_len);
  61. int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
  62. enum skb_drop_reason ping_rcv(struct sk_buff *skb);
  63. #ifdef CONFIG_PROC_FS
  64. void *ping_seq_start(struct seq_file *seq, loff_t *pos, sa_family_t family);
  65. void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos);
  66. void ping_seq_stop(struct seq_file *seq, void *v);
  67. int __init ping_proc_init(void);
  68. void ping_proc_exit(void);
  69. #endif
  70. void __init ping_init(void);
  71. int __init pingv6_init(void);
  72. void pingv6_exit(void);
  73. #endif /* _PING_H */