ea906c4152
will update usr.sbin/ntp to match this. MFC after: 2 weeks
124 lines
3.4 KiB
C
124 lines
3.4 KiB
C
#if !defined __recvbuff_h
|
|
#define __recvbuff_h
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
#include "ntp.h"
|
|
#include "ntp_fp.h"
|
|
#include "ntp_types.h"
|
|
|
|
#include <isc/list.h>
|
|
#include <isc/result.h>
|
|
|
|
/*
|
|
* recvbuf memory management
|
|
*/
|
|
#define RECV_INIT 10 /* 10 buffers initially */
|
|
#define RECV_LOWAT 3 /* when we're down to three buffers get more */
|
|
#define RECV_INC 5 /* get 5 more at a time */
|
|
#define RECV_TOOMANY 40 /* this is way too many buffers */
|
|
|
|
#if defined HAVE_IO_COMPLETION_PORT
|
|
# include "ntp_iocompletionport.h"
|
|
#include "ntp_timer.h"
|
|
|
|
# define RECV_BLOCK_IO() EnterCriticalSection(&RecvCritSection)
|
|
# define RECV_UNBLOCK_IO() LeaveCriticalSection(&RecvCritSection)
|
|
|
|
/* Return the event which is set when items are added to the full list
|
|
*/
|
|
extern HANDLE get_recv_buff_event P((void));
|
|
#else
|
|
# define RECV_BLOCK_IO()
|
|
# define RECV_UNBLOCK_IO()
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Format of a recvbuf. These are used by the asynchronous receive
|
|
* routine to store incoming packets and related information.
|
|
*/
|
|
|
|
/*
|
|
* the maximum length NTP packet contains the NTP header, one Autokey
|
|
* request, one Autokey response and the MAC. Assuming certificates don't
|
|
* get too big, the maximum packet length is set arbitrarily at 1000.
|
|
*/
|
|
#define RX_BUFF_SIZE 1000 /* hail Mary */
|
|
|
|
|
|
typedef struct recvbuf recvbuf_t;
|
|
|
|
struct recvbuf {
|
|
ISC_LINK(recvbuf_t) link;
|
|
union {
|
|
struct sockaddr_storage X_recv_srcadr;
|
|
caddr_t X_recv_srcclock;
|
|
struct peer *X_recv_peer;
|
|
} X_from_where;
|
|
#define recv_srcadr X_from_where.X_recv_srcadr
|
|
#define recv_srcclock X_from_where.X_recv_srcclock
|
|
#define recv_peer X_from_where.X_recv_peer
|
|
#if defined HAVE_IO_COMPLETION_PORT
|
|
WSABUF wsabuff;
|
|
#else
|
|
struct sockaddr_storage srcadr; /* where packet came from */
|
|
#endif
|
|
int src_addr_len; /* source address length */
|
|
struct interface *dstadr; /* interface datagram arrived thru */
|
|
SOCKET fd; /* fd on which it was received */
|
|
int msg_flags; /* Flags received about the packet */
|
|
l_fp recv_time; /* time of arrival */
|
|
void (*receiver) P((struct recvbuf *)); /* routine to receive buffer */
|
|
int recv_length; /* number of octets received */
|
|
union {
|
|
struct pkt X_recv_pkt;
|
|
u_char X_recv_buffer[RX_BUFF_SIZE];
|
|
} recv_space;
|
|
int used;
|
|
#define recv_pkt recv_space.X_recv_pkt
|
|
#define recv_buffer recv_space.X_recv_buffer
|
|
};
|
|
|
|
extern void init_recvbuff P((int));
|
|
|
|
/* freerecvbuf - make a single recvbuf available for reuse
|
|
*/
|
|
extern void freerecvbuf P((struct recvbuf *));
|
|
|
|
/* Get a free buffer (typically used so an async
|
|
* read can directly place data into the buffer
|
|
*
|
|
* The buffer is removed from the free list. Make sure
|
|
* you put it back with freerecvbuf() or
|
|
*/
|
|
extern struct recvbuf *get_free_recv_buffer P((void)); /* signal safe - no malloc */
|
|
extern struct recvbuf *get_free_recv_buffer_alloc P((void)); /* signal unsafe - may malloc */
|
|
|
|
/* Add a buffer to the full list
|
|
*/
|
|
extern void add_full_recv_buffer P((struct recvbuf *));
|
|
|
|
/*extern void process_recv_buffers P((void)); */
|
|
|
|
/* number of recvbufs on freelist */
|
|
extern u_long free_recvbuffs P((void));
|
|
extern u_long full_recvbuffs P((void));
|
|
extern u_long total_recvbuffs P((void));
|
|
extern u_long lowater_additions P((void));
|
|
|
|
/* Returns the next buffer in the full list.
|
|
*
|
|
*/
|
|
extern struct recvbuf *get_full_recv_buffer P((void));
|
|
|
|
/*
|
|
* Checks to see if there are buffers to process
|
|
*/
|
|
extern isc_boolean_t has_full_recv_buffer P((void));
|
|
|
|
#endif /* defined __recvbuff_h */
|
|
|