1 /* $NetBSD: recvbuff.h,v 1.7 2020/05/25 20:47:20 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 1200. 45 * (was 1000, but that bumps on 2048 RSA keys) 46 */ 47 #define RX_BUFF_SIZE 1200 /* hail Mary */ 48 49 50 typedef struct recvbuf recvbuf_t; 51 52 struct recvbuf { 53 recvbuf_t * link; /* next in list */ 54 union { 55 sockaddr_u X_recv_srcadr; 56 caddr_t X_recv_srcclock; 57 struct peer * X_recv_peer; 58 } X_from_where; 59 #define recv_srcadr X_from_where.X_recv_srcadr 60 #define recv_srcclock X_from_where.X_recv_srcclock 61 #define recv_peer X_from_where.X_recv_peer 62 #ifndef HAVE_IO_COMPLETION_PORT 63 sockaddr_u srcadr; /* where packet came from */ 64 #else 65 int recv_srcadr_len;/* filled in on completion */ 66 #endif 67 endpt * dstadr; /* address pkt arrived on */ 68 SOCKET fd; /* fd on which it was received */ 69 int msg_flags; /* Flags received about the packet */ 70 l_fp recv_time; /* time of arrival */ 71 void (*receiver)(struct recvbuf *); /* callback */ 72 int recv_length; /* number of octets received */ 73 union { 74 struct pkt X_recv_pkt; 75 u_char X_recv_buffer[RX_BUFF_SIZE]; 76 } recv_space; 77 #define recv_pkt recv_space.X_recv_pkt 78 #define recv_buffer recv_space.X_recv_buffer 79 int used; /* reference count */ 80 }; 81 82 extern void init_recvbuff(int); 83 84 /* freerecvbuf - make a single recvbuf available for reuse 85 */ 86 extern void freerecvbuf(struct recvbuf *); 87 88 /* Get a free buffer (typically used so an async 89 * read can directly place data into the buffer 90 * 91 * The buffer is removed from the free list. Make sure 92 * you put it back with freerecvbuf() or 93 */ 94 95 /* signal safe - no malloc */ 96 extern struct recvbuf *get_free_recv_buffer(void); 97 /* signal unsafe - may malloc, never returs NULL */ 98 extern struct recvbuf *get_free_recv_buffer_alloc(void); 99 100 /* Add a buffer to the full list 101 */ 102 extern void add_full_recv_buffer(struct recvbuf *); 103 104 /* number of recvbufs on freelist */ 105 extern u_long free_recvbuffs(void); 106 extern u_long full_recvbuffs(void); 107 extern u_long total_recvbuffs(void); 108 extern u_long lowater_additions(void); 109 110 /* Returns the next buffer in the full list. 111 * 112 */ 113 extern struct recvbuf *get_full_recv_buffer(void); 114 115 /* 116 * purge_recv_buffers_for_fd() - purges any previously-received input 117 * from a given file descriptor. 118 */ 119 extern void purge_recv_buffers_for_fd(int); 120 121 /* 122 * Checks to see if there are buffers to process 123 */ 124 extern isc_boolean_t has_full_recv_buffer(void); 125 126 #endif /* RECVBUFF_H */ 127