1 #if !defined __recvbuff_h
10 #include "ntp_types.h"
13 * recvbuf memory management
15 #define RECV_INIT 10 /* 10 buffers initially */
16 #define RECV_LOWAT 3 /* when we're down to three buffers get more */
17 #define RECV_INC 5 /* get 5 more at a time */
18 #define RECV_TOOMANY 40 /* this is way too many buffers */
20 #if defined HAVE_IO_COMPLETION_PORT
21 # include "ntp_iocompletionport.h"
22 #include "ntp_timer.h"
24 # define RECV_BLOCK_IO() EnterCriticalSection(&RecvCritSection)
25 # define RECV_UNBLOCK_IO() LeaveCriticalSection(&RecvCritSection)
27 /* Return the event which is set when items are added to the full list
29 extern HANDLE get_recv_buff_event P((void));
31 # define RECV_BLOCK_IO()
32 # define RECV_UNBLOCK_IO()
37 * Format of a recvbuf. These are used by the asynchronous receive
38 * routine to store incoming packets and related information.
42 * the maximum length NTP packet contains the NTP header, one Autokey
43 * request, one Autokey response and the MAC. Assuming certificates don't
44 * get too big, the maximum packet length is set arbitrarily at 1000.
46 #define RX_BUFF_SIZE 1000 /* hail Mary */
49 struct recvbuf *next; /* next buffer in chain */
51 struct sockaddr_storage X_recv_srcadr;
52 caddr_t X_recv_srcclock;
53 struct peer *X_recv_peer;
55 #define recv_srcadr X_from_where.X_recv_srcadr
56 #define recv_srcclock X_from_where.X_recv_srcclock
57 #define recv_peer X_from_where.X_recv_peer
58 #if defined HAVE_IO_COMPLETION_PORT
59 IoCompletionInfo iocompletioninfo;
63 struct sockaddr_storage srcadr; /* where packet came from */
65 struct interface *dstadr; /* interface datagram arrived thru */
66 SOCKET fd; /* fd on which it was received */
67 l_fp recv_time; /* time of arrival */
68 void (*receiver) P((struct recvbuf *)); /* routine to receive buffer */
69 int recv_length; /* number of octets received */
71 struct pkt X_recv_pkt;
72 u_char X_recv_buffer[RX_BUFF_SIZE];
74 #define recv_pkt recv_space.X_recv_pkt
75 #define recv_buffer recv_space.X_recv_buffer
78 extern void init_recvbuff P((int));
80 /* freerecvbuf - make a single recvbuf available for reuse
82 extern void freerecvbuf P((struct recvbuf *));
85 extern struct recvbuf * getrecvbufs P((void));
87 /* Get a free buffer (typically used so an async
88 * read can directly place data into the buffer
90 * The buffer is removed from the free list. Make sure
91 * you put it back with freerecvbuf() or
93 extern struct recvbuf *get_free_recv_buffer P((void));
95 /* Add a buffer to the full list
97 extern void add_full_recv_buffer P((struct recvbuf *));
99 /*extern void process_recv_buffers P((void)); */
101 /* number of recvbufs on freelist */
102 extern u_long free_recvbuffs P((void));
103 extern u_long full_recvbuffs P((void));
104 extern u_long total_recvbuffs P((void));
105 extern u_long lowater_additions P((void));
107 /* Returns the next buffer in the full list.
110 extern struct recvbuf *get_full_recv_buffer P((void));
112 #endif /* defined __recvbuff_h */