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