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