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