recvbuff.h revision 132451
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 1254359Sroberto/* 1354359Sroberto * recvbuf memory management 1454359Sroberto */ 1554359Sroberto#define RECV_INIT 10 /* 10 buffers initially */ 1654359Sroberto#define RECV_LOWAT 3 /* when we're down to three buffers get more */ 1754359Sroberto#define RECV_INC 5 /* get 5 more at a time */ 1854359Sroberto#define RECV_TOOMANY 40 /* this is way too many buffers */ 1954359Sroberto 2054359Sroberto#if defined HAVE_IO_COMPLETION_PORT 2154359Sroberto# include "ntp_iocompletionport.h" 2254359Sroberto#include "ntp_timer.h" 2354359Sroberto 2454359Sroberto# define RECV_BLOCK_IO() EnterCriticalSection(&RecvCritSection) 2554359Sroberto# define RECV_UNBLOCK_IO() LeaveCriticalSection(&RecvCritSection) 2654359Sroberto 2754359Sroberto/* Return the event which is set when items are added to the full list 2854359Sroberto */ 2954359Srobertoextern HANDLE get_recv_buff_event P((void)); 3054359Sroberto#else 3154359Sroberto# define RECV_BLOCK_IO() 3254359Sroberto# define RECV_UNBLOCK_IO() 3354359Sroberto#endif 3454359Sroberto 3554359Sroberto 3654359Sroberto/* 3754359Sroberto * Format of a recvbuf. These are used by the asynchronous receive 3854359Sroberto * routine to store incoming packets and related information. 3954359Sroberto */ 4054359Sroberto 4154359Sroberto/* 42132451Sroberto * the maximum length NTP packet contains the NTP header, one Autokey 43132451Sroberto * request, one Autokey response and the MAC. Assuming certificates don't 44132451Sroberto * get too big, the maximum packet length is set arbitrarily at 1000. 4554359Sroberto */ 46132451Sroberto#define RX_BUFF_SIZE 1000 /* hail Mary */ 4754359Sroberto 4854359Srobertostruct recvbuf { 4954359Sroberto struct recvbuf *next; /* next buffer in chain */ 5054359Sroberto union { 51132451Sroberto struct sockaddr_storage X_recv_srcadr; 5254359Sroberto caddr_t X_recv_srcclock; 5354359Sroberto struct peer *X_recv_peer; 5454359Sroberto } X_from_where; 5554359Sroberto#define recv_srcadr X_from_where.X_recv_srcadr 5654359Sroberto#define recv_srcclock X_from_where.X_recv_srcclock 5754359Sroberto#define recv_peer X_from_where.X_recv_peer 5854359Sroberto#if defined HAVE_IO_COMPLETION_PORT 5954359Sroberto IoCompletionInfo iocompletioninfo; 6054359Sroberto WSABUF wsabuff; 6154359Sroberto DWORD AddressLength; 6254359Sroberto#else 63132451Sroberto struct sockaddr_storage srcadr; /* where packet came from */ 6454359Sroberto#endif 6554359Sroberto struct interface *dstadr; /* interface datagram arrived thru */ 66132451Sroberto SOCKET fd; /* fd on which it was received */ 6754359Sroberto l_fp recv_time; /* time of arrival */ 6854359Sroberto void (*receiver) P((struct recvbuf *)); /* routine to receive buffer */ 6954359Sroberto int recv_length; /* number of octets received */ 7054359Sroberto union { 7154359Sroberto struct pkt X_recv_pkt; 7254359Sroberto u_char X_recv_buffer[RX_BUFF_SIZE]; 7354359Sroberto } recv_space; 7454359Sroberto#define recv_pkt recv_space.X_recv_pkt 7554359Sroberto#define recv_buffer recv_space.X_recv_buffer 7654359Sroberto}; 7754359Sroberto 7854359Srobertoextern void init_recvbuff P((int)); 7954359Sroberto 8054359Sroberto/* freerecvbuf - make a single recvbuf available for reuse 8154359Sroberto */ 8254359Srobertoextern void freerecvbuf P((struct recvbuf *)); 8354359Sroberto 8454359Sroberto 8554359Srobertoextern struct recvbuf * getrecvbufs P((void)); 8654359Sroberto 8754359Sroberto/* Get a free buffer (typically used so an async 8854359Sroberto * read can directly place data into the buffer 8954359Sroberto * 9054359Sroberto * The buffer is removed from the free list. Make sure 9154359Sroberto * you put it back with freerecvbuf() or 9254359Sroberto */ 9354359Srobertoextern struct recvbuf *get_free_recv_buffer P((void)); 9454359Sroberto 9554359Sroberto/* Add a buffer to the full list 9654359Sroberto */ 9754359Srobertoextern void add_full_recv_buffer P((struct recvbuf *)); 9854359Sroberto 9954359Sroberto/*extern void process_recv_buffers P((void)); */ 10054359Sroberto 10154359Sroberto/* number of recvbufs on freelist */ 10254359Srobertoextern u_long free_recvbuffs P((void)); 10354359Srobertoextern u_long full_recvbuffs P((void)); 10454359Srobertoextern u_long total_recvbuffs P((void)); 10554359Srobertoextern u_long lowater_additions P((void)); 10654359Sroberto 10754359Sroberto/* Returns the next buffer in the full list. 10854359Sroberto * 10954359Sroberto */ 11054359Srobertoextern struct recvbuf *get_full_recv_buffer P((void)); 11154359Sroberto 11254359Sroberto#endif /* defined __recvbuff_h */ 11354359Sroberto 114