#if !defined __recvbuff_h
#define __recvbuff_h
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "ntp.h"
#include "ntp_fp.h"
#include "ntp_types.h"
#include <isc/list.h>
#include <isc/result.h>
#define RECV_INIT 10
#define RECV_LOWAT 3
#define RECV_INC 5
#define RECV_TOOMANY 40
#if defined HAVE_IO_COMPLETION_PORT
# include "ntp_iocompletionport.h"
#include "ntp_timer.h"
# define RECV_BLOCK_IO() EnterCriticalSection(&RecvCritSection)
# define RECV_UNBLOCK_IO() LeaveCriticalSection(&RecvCritSection)
extern HANDLE get_recv_buff_event P((void));
#else
# define RECV_BLOCK_IO()
# define RECV_UNBLOCK_IO()
#endif
#define RX_BUFF_SIZE 1000
typedef struct recvbuf recvbuf_t;
struct recvbuf {
ISC_LINK(recvbuf_t) link;
union {
struct sockaddr_storage X_recv_srcadr;
caddr_t X_recv_srcclock;
struct peer *X_recv_peer;
} X_from_where;
#define recv_srcadr X_from_where.X_recv_srcadr
#define recv_srcclock X_from_where.X_recv_srcclock
#define recv_peer X_from_where.X_recv_peer
#if defined HAVE_IO_COMPLETION_PORT
WSABUF wsabuff;
#else
struct sockaddr_storage srcadr;
#endif
int src_addr_len;
struct interface *dstadr;
SOCKET fd;
int msg_flags;
l_fp recv_time;
void (*receiver) P((struct recvbuf *));
int recv_length;
union {
struct pkt X_recv_pkt;
u_char X_recv_buffer[RX_BUFF_SIZE];
} recv_space;
int used;
#define recv_pkt recv_space.X_recv_pkt
#define recv_buffer recv_space.X_recv_buffer
};
extern void init_recvbuff P((int));
extern void freerecvbuf P((struct recvbuf *));
extern struct recvbuf *get_free_recv_buffer P((void));
extern void add_full_recv_buffer P((struct recvbuf *));
extern u_long free_recvbuffs P((void));
extern u_long full_recvbuffs P((void));
extern u_long total_recvbuffs P((void));
extern u_long lowater_additions P((void));
extern struct recvbuf *get_full_recv_buffer P((void));
extern isc_boolean_t has_full_recv_buffer P((void));
#endif