154359Sroberto#if !defined __recvbuff_h
254359Sroberto#define __recvbuff_h
354359Sroberto
454359Sroberto#ifdef HAVE_CONFIG_H
554359Sroberto# include <config.h>
654359Sroberto#endif
754359Sroberto
854359Sroberto#include "ntp.h"
954359Sroberto#include "ntp_fp.h"
1054359Sroberto#include "ntp_types.h"
1154359Sroberto
12182007Sroberto#include <isc/list.h>
13182007Sroberto#include <isc/result.h>
14182007Sroberto
1554359Sroberto/*
1654359Sroberto * recvbuf memory management
1754359Sroberto */
1854359Sroberto#define RECV_INIT	10	/* 10 buffers initially */
1954359Sroberto#define RECV_LOWAT	3	/* when we're down to three buffers get more */
2054359Sroberto#define RECV_INC	5	/* get 5 more at a time */
2154359Sroberto#define RECV_TOOMANY	40	/* this is way too many buffers */
2254359Sroberto
2354359Sroberto#if defined HAVE_IO_COMPLETION_PORT
2454359Sroberto# include "ntp_iocompletionport.h"
2554359Sroberto#include "ntp_timer.h"
2654359Sroberto
2754359Sroberto# define RECV_BLOCK_IO()	EnterCriticalSection(&RecvCritSection)
2854359Sroberto# define RECV_UNBLOCK_IO()	LeaveCriticalSection(&RecvCritSection)
2954359Sroberto
3054359Sroberto/*  Return the event which is set when items are added to the full list
3154359Sroberto */
3254359Srobertoextern HANDLE	get_recv_buff_event P((void));
3354359Sroberto#else
3454359Sroberto# define RECV_BLOCK_IO()
3554359Sroberto# define RECV_UNBLOCK_IO()
3654359Sroberto#endif
3754359Sroberto
3854359Sroberto
3954359Sroberto/*
4054359Sroberto * Format of a recvbuf.  These are used by the asynchronous receive
4154359Sroberto * routine to store incoming packets and related information.
4254359Sroberto */
4354359Sroberto
4454359Sroberto/*
45132451Sroberto *  the maximum length NTP packet contains the NTP header, one Autokey
46132451Sroberto *  request, one Autokey response and the MAC. Assuming certificates don't
47132451Sroberto *  get too big, the maximum packet length is set arbitrarily at 1000.
4854359Sroberto */
49132451Sroberto#define	RX_BUFF_SIZE	1000		/* hail Mary */
5054359Sroberto
51182007Sroberto
52182007Srobertotypedef struct recvbuf recvbuf_t;
53182007Sroberto
5454359Srobertostruct recvbuf {
55182007Sroberto	ISC_LINK(recvbuf_t)	link;
5654359Sroberto	union {
57132451Sroberto		struct sockaddr_storage X_recv_srcadr;
5854359Sroberto		caddr_t X_recv_srcclock;
5954359Sroberto		struct peer *X_recv_peer;
6054359Sroberto	} X_from_where;
6154359Sroberto#define recv_srcadr	X_from_where.X_recv_srcadr
6254359Sroberto#define	recv_srcclock	X_from_where.X_recv_srcclock
6354359Sroberto#define recv_peer	X_from_where.X_recv_peer
6454359Sroberto#if defined HAVE_IO_COMPLETION_PORT
6554359Sroberto	WSABUF		wsabuff;
6654359Sroberto#else
67132451Sroberto	struct sockaddr_storage srcadr;	/* where packet came from */
6854359Sroberto#endif
69182007Sroberto	int src_addr_len;		/* source address length */
7054359Sroberto	struct interface *dstadr;	/* interface datagram arrived thru */
71132451Sroberto	SOCKET	fd;			/* fd on which it was received */
72182007Sroberto	int msg_flags;			/* Flags received about the packet */
7354359Sroberto	l_fp recv_time;			/* time of arrival */
7454359Sroberto	void (*receiver) P((struct recvbuf *)); /* routine to receive buffer */
7554359Sroberto	int recv_length;		/* number of octets received */
7654359Sroberto	union {
7754359Sroberto		struct pkt X_recv_pkt;
7854359Sroberto		u_char X_recv_buffer[RX_BUFF_SIZE];
7954359Sroberto	} recv_space;
80182007Sroberto	int used;
8154359Sroberto#define	recv_pkt	recv_space.X_recv_pkt
8254359Sroberto#define	recv_buffer	recv_space.X_recv_buffer
8354359Sroberto};
8454359Sroberto
8554359Srobertoextern	void	init_recvbuff	P((int));
8654359Sroberto
8754359Sroberto/* freerecvbuf - make a single recvbuf available for reuse
8854359Sroberto */
8954359Srobertoextern	void	freerecvbuf P((struct recvbuf *));
9054359Sroberto
9154359Sroberto/*  Get a free buffer (typically used so an async
9254359Sroberto *  read can directly place data into the buffer
9354359Sroberto *
9454359Sroberto *  The buffer is removed from the free list. Make sure
9554359Sroberto *  you put it back with freerecvbuf() or
9654359Sroberto */
97182007Srobertoextern	struct recvbuf *get_free_recv_buffer P((void)); /* signal safe - no malloc */
98182007Srobertoextern	struct recvbuf *get_free_recv_buffer_alloc P((void)); /* signal unsafe - may malloc */
9954359Sroberto
10054359Sroberto/*   Add a buffer to the full list
10154359Sroberto */
10254359Srobertoextern	void	add_full_recv_buffer	 P((struct recvbuf *));
10354359Sroberto
10454359Sroberto/*extern	void	process_recv_buffers	 P((void)); */
10554359Sroberto
10654359Sroberto/* number of recvbufs on freelist */
10754359Srobertoextern u_long free_recvbuffs P((void));
10854359Srobertoextern u_long full_recvbuffs P((void));
10954359Srobertoextern u_long total_recvbuffs P((void));
11054359Srobertoextern u_long lowater_additions P((void));
11154359Sroberto
11254359Sroberto/*  Returns the next buffer in the full list.
11354359Sroberto *
11454359Sroberto */
11554359Srobertoextern	struct recvbuf *get_full_recv_buffer P((void));
11654359Sroberto
117182007Sroberto/*
118182007Sroberto * Checks to see if there are buffers to process
119182007Sroberto */
120182007Srobertoextern isc_boolean_t has_full_recv_buffer P((void));
121182007Sroberto
12254359Sroberto#endif /* defined __recvbuff_h */
12354359Sroberto
124