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