1#ifndef RECVBUFF_H 2#define RECVBUFF_H 3 4#ifdef HAVE_CONFIG_H 5# include <config.h> 6#endif 7 8#include "ntp.h" 9#include "ntp_fp.h" 10#include "ntp_lists.h" 11 12#include <isc/result.h> 13 14/* 15 * recvbuf memory management 16 */ 17#define RECV_INIT 10 /* 10 buffers initially */ 18#define RECV_LOWAT 3 /* when we're down to three buffers get more */ 19#define RECV_INC 5 /* get 5 more at a time */ 20#define RECV_TOOMANY 40 /* this is way too many buffers */ 21 22#if defined HAVE_IO_COMPLETION_PORT 23# include "ntp_iocompletionport.h" 24#include "ntp_timer.h" 25 26# define RECV_BLOCK_IO() EnterCriticalSection(&RecvCritSection) 27# define RECV_UNBLOCK_IO() LeaveCriticalSection(&RecvCritSection) 28 29/* Return the event which is set when items are added to the full list 30 */ 31extern HANDLE get_recv_buff_event (void); 32#else 33# define RECV_BLOCK_IO() 34# define RECV_UNBLOCK_IO() 35#endif 36 37 38/* 39 * Format of a recvbuf. These are used by the asynchronous receive 40 * routine to store incoming packets and related information. 41 */ 42 43/* 44 * the maximum length NTP packet contains the NTP header, one Autokey 45 * request, one Autokey response and the MAC. Assuming certificates don't 46 * get too big, the maximum packet length is set arbitrarily at 1000. 47 */ 48#define RX_BUFF_SIZE 1000 /* hail Mary */ 49 50 51typedef struct recvbuf recvbuf_t; 52 53struct recvbuf { 54 ISC_LINK(recvbuf_t) link; /* next in list */ 55 union { 56 sockaddr_u X_recv_srcadr; 57 caddr_t X_recv_srcclock; 58 struct peer *X_recv_peer; 59 } X_from_where; 60#define recv_srcadr X_from_where.X_recv_srcadr 61#define recv_srcclock X_from_where.X_recv_srcclock 62#define recv_peer X_from_where.X_recv_peer 63#ifndef HAVE_IO_COMPLETION_PORT 64 sockaddr_u srcadr; /* where packet came from */ 65#else 66 int recv_srcadr_len; /* filled in on completion */ 67#endif 68 struct interface *dstadr; /* interface datagram arrived thru */ 69 SOCKET fd; /* fd on which it was received */ 70 int msg_flags; /* Flags received about the packet */ 71 l_fp recv_time; /* time of arrival */ 72 void (*receiver) (struct recvbuf *); /* routine to receive buffer */ 73 int recv_length; /* number of octets received */ 74 union { 75 struct pkt X_recv_pkt; 76 u_char X_recv_buffer[RX_BUFF_SIZE]; 77 } recv_space; 78#define recv_pkt recv_space.X_recv_pkt 79#define recv_buffer recv_space.X_recv_buffer 80 int used; /* reference count */ 81}; 82 83extern void init_recvbuff (int); 84 85/* freerecvbuf - make a single recvbuf available for reuse 86 */ 87extern void freerecvbuf (struct recvbuf *); 88 89/* Get a free buffer (typically used so an async 90 * read can directly place data into the buffer 91 * 92 * The buffer is removed from the free list. Make sure 93 * you put it back with freerecvbuf() or 94 */ 95extern struct recvbuf *get_free_recv_buffer (void); /* signal safe - no malloc */ 96extern struct recvbuf *get_free_recv_buffer_alloc (void); /* signal unsafe - may malloc */ 97 98/* Add a buffer to the full list 99 */ 100extern void add_full_recv_buffer (struct recvbuf *); 101 102/*extern void process_recv_buffers (void); */ 103 104/* number of recvbufs on freelist */ 105extern u_long free_recvbuffs (void); 106extern u_long full_recvbuffs (void); 107extern u_long total_recvbuffs (void); 108extern u_long lowater_additions (void); 109 110/* Returns the next buffer in the full list. 111 * 112 */ 113extern struct recvbuf *get_full_recv_buffer (void); 114 115/* 116 * Checks to see if there are buffers to process 117 */ 118extern isc_boolean_t has_full_recv_buffer (void); 119 120#endif /* RECVBUFF_H */ 121