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