8 #include <isc/result.h>
11 * recvbuf memory management
13 #define RECV_INIT 10 /* 10 buffers initially */
14 #define RECV_LOWAT 3 /* when we're down to three buffers get more */
15 #define RECV_INC 5 /* get 5 more at a time */
16 #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"
22 # define RECV_BLOCK_IO() EnterCriticalSection(&RecvCritSection)
23 # define RECV_UNBLOCK_IO() LeaveCriticalSection(&RecvCritSection)
25 /* Return the event which is set when items are added to the full list
27 extern HANDLE get_recv_buff_event(void);
29 # define RECV_BLOCK_IO()
30 # define RECV_UNBLOCK_IO()
35 * Format of a recvbuf. These are used by the asynchronous receive
36 * routine to store incoming packets and related information.
40 * the maximum length NTP packet contains the NTP header, one Autokey
41 * request, one Autokey response and the MAC. Assuming certificates don't
42 * get too big, the maximum packet length is set arbitrarily at 1000.
44 #define RX_BUFF_SIZE 1000 /* hail Mary */
47 typedef struct recvbuf recvbuf_t;
50 recvbuf_t * link; /* next in list */
52 sockaddr_u X_recv_srcadr;
53 caddr_t X_recv_srcclock;
54 struct peer * X_recv_peer;
56 #define recv_srcadr X_from_where.X_recv_srcadr
57 #define recv_srcclock X_from_where.X_recv_srcclock
58 #define recv_peer X_from_where.X_recv_peer
59 #ifndef HAVE_IO_COMPLETION_PORT
60 sockaddr_u srcadr; /* where packet came from */
62 int recv_srcadr_len;/* filled in on completion */
64 endpt * dstadr; /* address pkt arrived on */
65 SOCKET fd; /* fd on which it was received */
66 int msg_flags; /* Flags received about the packet */
67 l_fp recv_time; /* time of arrival */
68 void (*receiver)(struct recvbuf *); /* callback */
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
76 int used; /* reference count */
79 extern void init_recvbuff(int);
81 /* freerecvbuf - make a single recvbuf available for reuse
83 extern void freerecvbuf(struct recvbuf *);
85 /* Get a free buffer (typically used so an async
86 * read can directly place data into the buffer
88 * The buffer is removed from the free list. Make sure
89 * you put it back with freerecvbuf() or
92 /* signal safe - no malloc */
93 extern struct recvbuf *get_free_recv_buffer(void);
94 /* signal unsafe - may malloc */
95 extern struct recvbuf *get_free_recv_buffer_alloc(void);
97 /* Add a buffer to the full list
99 extern void add_full_recv_buffer(struct recvbuf *);
101 /* number of recvbufs on freelist */
102 extern u_long free_recvbuffs(void);
103 extern u_long full_recvbuffs(void);
104 extern u_long total_recvbuffs(void);
105 extern u_long lowater_additions(void);
107 /* Returns the next buffer in the full list.
110 extern struct recvbuf *get_full_recv_buffer(void);
113 * purge_recv_buffers_for_fd() - purges any previously-received input
114 * from a given file descriptor.
116 extern void purge_recv_buffers_for_fd(SOCKET);
119 * Checks to see if there are buffers to process
121 extern isc_boolean_t has_full_recv_buffer(void);
123 #endif /* RECVBUFF_H */