recvbuff.h revision 54359
118334Speter#if !defined __recvbuff_h
290277Sobrien#define __recvbuff_h
390277Sobrien
418334Speter#ifdef HAVE_CONFIG_H
590277Sobrien# include <config.h>
618334Speter#endif
790277Sobrien
890277Sobrien#include "ntp.h"
990277Sobrien#include "ntp_fp.h"
1090277Sobrien#include "ntp_types.h"
1118334Speter
1290277Sobrien/*
1390277Sobrien * recvbuf memory management
1490277Sobrien */
1590277Sobrien#define RECV_INIT	10	/* 10 buffers initially */
1618334Speter#define RECV_LOWAT	3	/* when we're down to three buffers get more */
1718334Speter#define RECV_INC	5	/* get 5 more at a time */
1890277Sobrien#define RECV_TOOMANY	40	/* this is way too many buffers */
1990277Sobrien
2090277Sobrien#if defined HAVE_IO_COMPLETION_PORT
2118334Speter# include "ntp_iocompletionport.h"
2218334Speter#include "ntp_timer.h"
2318334Speter
2418334Speter# define RECV_BLOCK_IO()	EnterCriticalSection(&RecvCritSection)
2551232Sbde# define RECV_UNBLOCK_IO()	LeaveCriticalSection(&RecvCritSection)
2651232Sbde
2718334Speter/*  Return the event which is set when items are added to the full list
2818334Speter */
2918334Speterextern HANDLE	get_recv_buff_event P((void));
3018334Speter#else
3118334Speter# define RECV_BLOCK_IO()
3218334Speter# define RECV_UNBLOCK_IO()
3318334Speter#endif
3418334Speter
3518334Speter
3690277Sobrien/*
3790277Sobrien * Format of a recvbuf.  These are used by the asynchronous receive
3890277Sobrien * routine to store incoming packets and related information.
3990277Sobrien */
4090277Sobrien
4190277Sobrien/*
4290277Sobrien *  the maximum length NTP packet is a full length NTP control message with
4390277Sobrien *  the maximum length message authenticator.  I hate to hard-code 468 and 12,
4490277Sobrien *  but only a few modules include ntp_control.h...
4590277Sobrien */
4690277Sobrien#define	RX_BUFF_SIZE	(468+12+MAX_MAC_LEN)
4790277Sobrien
4890277Sobrienstruct recvbuf {
4990277Sobrien	struct recvbuf *next;		/* next buffer in chain */
5090277Sobrien	union {
5190277Sobrien		struct sockaddr_in X_recv_srcadr;
5290277Sobrien		caddr_t X_recv_srcclock;
5390277Sobrien		struct peer *X_recv_peer;
5490277Sobrien	} X_from_where;
5590277Sobrien#define recv_srcadr	X_from_where.X_recv_srcadr
5690277Sobrien#define	recv_srcclock	X_from_where.X_recv_srcclock
5790277Sobrien#define recv_peer	X_from_where.X_recv_peer
5890277Sobrien#if defined HAVE_IO_COMPLETION_PORT
5990277Sobrien        IoCompletionInfo	iocompletioninfo;
6090277Sobrien	WSABUF		wsabuff;
6190277Sobrien	DWORD		AddressLength;
6290277Sobrien#else
6390277Sobrien	struct sockaddr_in srcadr;	/* where packet came from */
6490277Sobrien#endif
6590277Sobrien	struct interface *dstadr;	/* interface datagram arrived thru */
6690277Sobrien	int fd;				/* fd on which it was received */
6790277Sobrien	l_fp recv_time;			/* time of arrival */
6890277Sobrien	void (*receiver) P((struct recvbuf *)); /* routine to receive buffer */
6990277Sobrien	int recv_length;		/* number of octets received */
7090277Sobrien	union {
7190277Sobrien		struct pkt X_recv_pkt;
7290277Sobrien		u_char X_recv_buffer[RX_BUFF_SIZE];
7390277Sobrien	} recv_space;
7490277Sobrien#define	recv_pkt	recv_space.X_recv_pkt
7550599Sobrien#define	recv_buffer	recv_space.X_recv_buffer
7650599Sobrien};
7750599Sobrien
7890277Sobrienextern	void	init_recvbuff	P((int));
7990277Sobrien
8090277Sobrien/* freerecvbuf - make a single recvbuf available for reuse
8150599Sobrien */
8252520Sobrienextern	void	freerecvbuf P((struct recvbuf *));
8352520Sobrien
8490277Sobrien
8590277Sobrienextern	struct recvbuf * getrecvbufs P((void));
8618334Speter
8790277Sobrien/*  Get a free buffer (typically used so an async
8890277Sobrien *  read can directly place data into the buffer
8918334Speter *
9090277Sobrien *  The buffer is removed from the free list. Make sure
9190277Sobrien *  you put it back with freerecvbuf() or
9290277Sobrien */
9318334Speterextern	struct recvbuf *get_free_recv_buffer P((void));
9490277Sobrien
9590277Sobrien/*   Add a buffer to the full list
9690277Sobrien */
9790277Sobrienextern	void	add_full_recv_buffer	 P((struct recvbuf *));
9850599Sobrien
9990277Sobrien/*extern	void	process_recv_buffers	 P((void)); */
10090277Sobrien
10118334Speter/* number of recvbufs on freelist */
10218334Speterextern u_long free_recvbuffs P((void));
10390277Sobrienextern u_long full_recvbuffs P((void));
10490277Sobrienextern u_long total_recvbuffs P((void));
10590277Sobrienextern u_long lowater_additions P((void));
10618334Speter
10790277Sobrien/*  Returns the next buffer in the full list.
10818334Speter *
10918334Speter */
11090277Sobrienextern	struct recvbuf *get_full_recv_buffer P((void));
11190277Sobrien
11290277Sobrien#endif /* defined __recvbuff_h */
11390277Sobrien
11490277Sobrien