xref: /freebsd/contrib/ntp/include/recvbuff.h (revision 7bd6fde3)
1 #if !defined __recvbuff_h
2 #define __recvbuff_h
3 
4 #ifdef HAVE_CONFIG_H
5 # include <config.h>
6 #endif
7 
8 #include "ntp.h"
9 #include "ntp_fp.h"
10 #include "ntp_types.h"
11 
12 /*
13  * recvbuf memory management
14  */
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 */
19 
20 #if defined HAVE_IO_COMPLETION_PORT
21 # include "ntp_iocompletionport.h"
22 #include "ntp_timer.h"
23 
24 # define RECV_BLOCK_IO()	EnterCriticalSection(&RecvCritSection)
25 # define RECV_UNBLOCK_IO()	LeaveCriticalSection(&RecvCritSection)
26 
27 /*  Return the event which is set when items are added to the full list
28  */
29 extern HANDLE	get_recv_buff_event P((void));
30 #else
31 # define RECV_BLOCK_IO()
32 # define RECV_UNBLOCK_IO()
33 #endif
34 
35 
36 /*
37  * Format of a recvbuf.  These are used by the asynchronous receive
38  * routine to store incoming packets and related information.
39  */
40 
41 /*
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.
45  */
46 #define	RX_BUFF_SIZE	1000		/* hail Mary */
47 
48 struct recvbuf {
49 	struct recvbuf *next;		/* next buffer in chain */
50 	union {
51 		struct sockaddr_storage X_recv_srcadr;
52 		caddr_t X_recv_srcclock;
53 		struct peer *X_recv_peer;
54 	} X_from_where;
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;
60 	WSABUF		wsabuff;
61 	DWORD		AddressLength;
62 #else
63 	struct sockaddr_storage srcadr;	/* where packet came from */
64 #endif
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 */
70 	union {
71 		struct pkt X_recv_pkt;
72 		u_char X_recv_buffer[RX_BUFF_SIZE];
73 	} recv_space;
74 #define	recv_pkt	recv_space.X_recv_pkt
75 #define	recv_buffer	recv_space.X_recv_buffer
76 };
77 
78 extern	void	init_recvbuff	P((int));
79 
80 /* freerecvbuf - make a single recvbuf available for reuse
81  */
82 extern	void	freerecvbuf P((struct recvbuf *));
83 
84 
85 extern	struct recvbuf * getrecvbufs P((void));
86 
87 /*  Get a free buffer (typically used so an async
88  *  read can directly place data into the buffer
89  *
90  *  The buffer is removed from the free list. Make sure
91  *  you put it back with freerecvbuf() or
92  */
93 extern	struct recvbuf *get_free_recv_buffer P((void));
94 
95 /*   Add a buffer to the full list
96  */
97 extern	void	add_full_recv_buffer	 P((struct recvbuf *));
98 
99 /*extern	void	process_recv_buffers	 P((void)); */
100 
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));
106 
107 /*  Returns the next buffer in the full list.
108  *
109  */
110 extern	struct recvbuf *get_full_recv_buffer P((void));
111 
112 #endif /* defined __recvbuff_h */
113 
114