/contrib/ntp/include/recvbuff.h

https://bitbucket.org/freebsd/freebsd-head/ · C++ Header · 123 lines · 68 code · 23 blank · 32 comment · 0 complexity · dd66e3b50778a9dd51e41dbb5aec1fc8 MD5 · raw file

  1. #if !defined __recvbuff_h
  2. #define __recvbuff_h
  3. #ifdef HAVE_CONFIG_H
  4. # include <config.h>
  5. #endif
  6. #include "ntp.h"
  7. #include "ntp_fp.h"
  8. #include "ntp_types.h"
  9. #include <isc/list.h>
  10. #include <isc/result.h>
  11. /*
  12. * recvbuf memory management
  13. */
  14. #define RECV_INIT 10 /* 10 buffers initially */
  15. #define RECV_LOWAT 3 /* when we're down to three buffers get more */
  16. #define RECV_INC 5 /* get 5 more at a time */
  17. #define RECV_TOOMANY 40 /* this is way too many buffers */
  18. #if defined HAVE_IO_COMPLETION_PORT
  19. # include "ntp_iocompletionport.h"
  20. #include "ntp_timer.h"
  21. # define RECV_BLOCK_IO() EnterCriticalSection(&RecvCritSection)
  22. # define RECV_UNBLOCK_IO() LeaveCriticalSection(&RecvCritSection)
  23. /* Return the event which is set when items are added to the full list
  24. */
  25. extern HANDLE get_recv_buff_event P((void));
  26. #else
  27. # define RECV_BLOCK_IO()
  28. # define RECV_UNBLOCK_IO()
  29. #endif
  30. /*
  31. * Format of a recvbuf. These are used by the asynchronous receive
  32. * routine to store incoming packets and related information.
  33. */
  34. /*
  35. * the maximum length NTP packet contains the NTP header, one Autokey
  36. * request, one Autokey response and the MAC. Assuming certificates don't
  37. * get too big, the maximum packet length is set arbitrarily at 1000.
  38. */
  39. #define RX_BUFF_SIZE 1000 /* hail Mary */
  40. typedef struct recvbuf recvbuf_t;
  41. struct recvbuf {
  42. ISC_LINK(recvbuf_t) link;
  43. union {
  44. struct sockaddr_storage X_recv_srcadr;
  45. caddr_t X_recv_srcclock;
  46. struct peer *X_recv_peer;
  47. } X_from_where;
  48. #define recv_srcadr X_from_where.X_recv_srcadr
  49. #define recv_srcclock X_from_where.X_recv_srcclock
  50. #define recv_peer X_from_where.X_recv_peer
  51. #if defined HAVE_IO_COMPLETION_PORT
  52. WSABUF wsabuff;
  53. #else
  54. struct sockaddr_storage srcadr; /* where packet came from */
  55. #endif
  56. int src_addr_len; /* source address length */
  57. struct interface *dstadr; /* interface datagram arrived thru */
  58. SOCKET fd; /* fd on which it was received */
  59. int msg_flags; /* Flags received about the packet */
  60. l_fp recv_time; /* time of arrival */
  61. void (*receiver) P((struct recvbuf *)); /* routine to receive buffer */
  62. int recv_length; /* number of octets received */
  63. union {
  64. struct pkt X_recv_pkt;
  65. u_char X_recv_buffer[RX_BUFF_SIZE];
  66. } recv_space;
  67. int used;
  68. #define recv_pkt recv_space.X_recv_pkt
  69. #define recv_buffer recv_space.X_recv_buffer
  70. };
  71. extern void init_recvbuff P((int));
  72. /* freerecvbuf - make a single recvbuf available for reuse
  73. */
  74. extern void freerecvbuf P((struct recvbuf *));
  75. /* Get a free buffer (typically used so an async
  76. * read can directly place data into the buffer
  77. *
  78. * The buffer is removed from the free list. Make sure
  79. * you put it back with freerecvbuf() or
  80. */
  81. extern struct recvbuf *get_free_recv_buffer P((void)); /* signal safe - no malloc */
  82. extern struct recvbuf *get_free_recv_buffer_alloc P((void)); /* signal unsafe - may malloc */
  83. /* Add a buffer to the full list
  84. */
  85. extern void add_full_recv_buffer P((struct recvbuf *));
  86. /*extern void process_recv_buffers P((void)); */
  87. /* number of recvbufs on freelist */
  88. extern u_long free_recvbuffs P((void));
  89. extern u_long full_recvbuffs P((void));
  90. extern u_long total_recvbuffs P((void));
  91. extern u_long lowater_additions P((void));
  92. /* Returns the next buffer in the full list.
  93. *
  94. */
  95. extern struct recvbuf *get_full_recv_buffer P((void));
  96. /*
  97. * Checks to see if there are buffers to process
  98. */
  99. extern isc_boolean_t has_full_recv_buffer P((void));
  100. #endif /* defined __recvbuff_h */