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