NetBSD/dist/ntp/include/recvbuff.h

116 lines
3.2 KiB
C
Raw Normal View History

2000-03-29 16:38:44 +04:00
/* $NetBSD: recvbuff.h,v 1.1.1.1 2000/03/29 12:38:48 simonb Exp $ */
#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"
/*
* recvbuf memory management
*/
#define RECV_INIT 10 /* 10 buffers initially */
#define RECV_LOWAT 3 /* when we're down to three buffers get more */
#define RECV_INC 5 /* get 5 more at a time */
#define RECV_TOOMANY 40 /* this is way too many buffers */
#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)
/* Return the event which is set when items are added to the full list
*/
extern HANDLE get_recv_buff_event P((void));
#else
# define RECV_BLOCK_IO()
# define RECV_UNBLOCK_IO()
#endif
/*
* Format of a recvbuf. These are used by the asynchronous receive
* routine to store incoming packets and related information.
*/
/*
* the maximum length NTP packet is a full length NTP control message with
* the maximum length message authenticator. I hate to hard-code 468 and 12,
* but only a few modules include ntp_control.h...
*/
#define RX_BUFF_SIZE (468+12+MAX_MAC_LEN)
struct recvbuf {
struct recvbuf *next; /* next buffer in chain */
union {
struct sockaddr_in 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
IoCompletionInfo iocompletioninfo;
WSABUF wsabuff;
DWORD AddressLength;
#else
struct sockaddr_in srcadr; /* where packet came from */
#endif
struct interface *dstadr; /* interface datagram arrived thru */
int fd; /* fd on which it was received */
l_fp recv_time; /* time of arrival */
void (*receiver) P((struct recvbuf *)); /* routine to receive buffer */
int recv_length; /* number of octets received */
union {
struct pkt X_recv_pkt;
u_char X_recv_buffer[RX_BUFF_SIZE];
} recv_space;
#define recv_pkt recv_space.X_recv_pkt
#define recv_buffer recv_space.X_recv_buffer
};
extern void init_recvbuff P((int));
/* freerecvbuf - make a single recvbuf available for reuse
*/
extern void freerecvbuf P((struct recvbuf *));
extern struct recvbuf * getrecvbufs P((void));
/* Get a free buffer (typically used so an async
* read can directly place data into the buffer
*
* The buffer is removed from the free list. Make sure
* you put it back with freerecvbuf() or
*/
extern struct recvbuf *get_free_recv_buffer P((void));
/* Add a buffer to the full list
*/
extern void add_full_recv_buffer P((struct recvbuf *));
/*extern void process_recv_buffers P((void)); */
/* number of recvbufs on freelist */
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));
/* Returns the next buffer in the full list.
*
*/
extern struct recvbuf *get_full_recv_buffer P((void));
#endif /* defined __recvbuff_h */