xref: /netbsd-src/external/bsd/ntp/dist/include/recvbuff.h (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /*	$NetBSD: recvbuff.h,v 1.7 2020/05/25 20:47:20 christos Exp $	*/
2 
3 #ifndef RECVBUFF_H
4 #define RECVBUFF_H
5 
6 #include "ntp.h"
7 #include "ntp_net.h"
8 #include "ntp_lists.h"
9 
10 #include <isc/result.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(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 1200.
45  *  (was 1000, but that bumps on 2048 RSA keys)
46  */
47 #define	RX_BUFF_SIZE	1200		/* hail Mary */
48 
49 
50 typedef struct recvbuf recvbuf_t;
51 
52 struct recvbuf {
53 	recvbuf_t *	link;	/* next in list */
54 	union {
55 		sockaddr_u	X_recv_srcadr;
56 		caddr_t		X_recv_srcclock;
57 		struct peer *	X_recv_peer;
58 	} X_from_where;
59 #define recv_srcadr		X_from_where.X_recv_srcadr
60 #define	recv_srcclock		X_from_where.X_recv_srcclock
61 #define recv_peer		X_from_where.X_recv_peer
62 #ifndef HAVE_IO_COMPLETION_PORT
63 	sockaddr_u	srcadr;		/* where packet came from */
64 #else
65 	int		recv_srcadr_len;/* filled in on completion */
66 #endif
67 	endpt *		dstadr;		/* address pkt arrived on */
68 	SOCKET		fd;		/* fd on which it was received */
69 	int		msg_flags;	/* Flags received about the packet */
70 	l_fp		recv_time;	/* time of arrival */
71 	void		(*receiver)(struct recvbuf *); /* callback */
72 	int		recv_length;	/* number of octets received */
73 	union {
74 		struct pkt	X_recv_pkt;
75 		u_char		X_recv_buffer[RX_BUFF_SIZE];
76 	} recv_space;
77 #define	recv_pkt		recv_space.X_recv_pkt
78 #define	recv_buffer		recv_space.X_recv_buffer
79 	int used;		/* reference count */
80 };
81 
82 extern	void	init_recvbuff(int);
83 
84 /* freerecvbuf - make a single recvbuf available for reuse
85  */
86 extern	void	freerecvbuf(struct recvbuf *);
87 
88 /*  Get a free buffer (typically used so an async
89  *  read can directly place data into the buffer
90  *
91  *  The buffer is removed from the free list. Make sure
92  *  you put it back with freerecvbuf() or
93  */
94 
95 /* signal safe - no malloc */
96 extern	struct recvbuf *get_free_recv_buffer(void);
97 /* signal unsafe - may malloc, never returs NULL */
98 extern	struct recvbuf *get_free_recv_buffer_alloc(void);
99 
100 /*   Add a buffer to the full list
101  */
102 extern	void	add_full_recv_buffer(struct recvbuf *);
103 
104 /* number of recvbufs on freelist */
105 extern u_long free_recvbuffs(void);
106 extern u_long full_recvbuffs(void);
107 extern u_long total_recvbuffs(void);
108 extern u_long lowater_additions(void);
109 
110 /*  Returns the next buffer in the full list.
111  *
112  */
113 extern	struct recvbuf *get_full_recv_buffer(void);
114 
115 /*
116  * purge_recv_buffers_for_fd() - purges any previously-received input
117  *				 from a given file descriptor.
118  */
119 extern	void purge_recv_buffers_for_fd(int);
120 
121 /*
122  * Checks to see if there are buffers to process
123  */
124 extern isc_boolean_t has_full_recv_buffer(void);
125 
126 #endif	/* RECVBUFF_H */
127