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: */
31: extern 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:
51: typedef struct recvbuf recvbuf_t;
52:
53: struct 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: endpt * dstadr; /* address pkt arrived on */
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:
83: extern void init_recvbuff (int);
84:
85: /* freerecvbuf - make a single recvbuf available for reuse
86: */
87: extern 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: */
95: extern struct recvbuf *get_free_recv_buffer (void); /* signal safe - no malloc */
96: extern struct recvbuf *get_free_recv_buffer_alloc (void); /* signal unsafe - may malloc */
97:
98: /* Add a buffer to the full list
99: */
100: extern void add_full_recv_buffer (struct recvbuf *);
101:
102: /*extern void process_recv_buffers (void); */
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: * Checks to see if there are buffers to process
117: */
118: extern isc_boolean_t has_full_recv_buffer (void);
119:
120: #endif /* RECVBUFF_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>