Annotation of embedaddon/ntp/include/recvbuff.h, revision 1.1
1.1 ! misho 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>