This is nbq.h in view mode; [Download] [Up]
/* * All very trivial - the simpler the better I say. We try and keep * quqes of netbufs by squirreling a pointer away below the data area. * This is done by the ppp_nb_alloc function. As long as everyone * uses the ppp shrink and grow functions we should be o.k. This code * has now been modified to keep the mark_t stuff nhere as well since * we probably shafted that good and proper in the last version. oops ! * PCF */ #ifndef __NBQ_H__ #define __NBQ_H__ #define KERNEL 1 #include <sys/types.h> #include <kernserv/prototypes.h> #include "netbuf.h" typedef u_int mark_t; /* * Netbufs and Netbuf wrappers don't help us because we * have no way of keeping track of information on start * position once nb_grow* or nb_shrink* are called. */ #ifdef NETBUF_PROXY #warning ...you are compiling with NETBUF_PROXY typedef struct _bpf_encapsulater { /* * Depending on the direction of packet travel, these * values have different meanings. * * INCOMING: * first -- time first byte of packet received. * second -- time last byte of packet received. * third -- Decompression start time * fourth -- Packet Handoff time * (second-first) -- receive time * (third-second) -- queue time waiting for decompression * (fourth-third) -- decompression time * (fourth - first) -- total receive time. * (fourth - second) -- total system process time. * * async_esc -- The number of characters escaped in this packet. * size1 -- The size of the inital packet before decompression. * This value includes the expansion caused by AC and PC compression. * If flags set: * AC implies packet got increased by 2 during receive. * PC implies packet got increased by 1 during receive. * This + "async_esc" - (AC + PC expansion) describe actual bytes over link. * Includes PPP header and trailer. * Doesn't count framing PPP_FLAG character. * * size2 -- The size after BSD decompression. PPP trailer was removed * so packet should be at least 2 shorter than original. * size3 -- The size after VJ decompression. * * * OUTGOING: (very similar to incoming) * first -- time packet arrived to pppwrite() or pppoutput() * second -- time compression started * third -- time compression ended * fourth -- time first byte sent to interface * fifth -- time last byte sent to interface * * (second - first) Time waiting in system before compression * (third - second) Time for compression * (fourth - third) Time waiting in system out queue waiting to be * selected for sending to interface * (fourth - first) Total system processing time * (fifth-fourth) Total interface send time. * (fifth-first) Total send time. * * size1 -- The size of the intial packet as receved from the stack * size2 -- The size after VJ compression * size3 -- The size after BSD compression * */ struct timeval first, second, third, fourth, fifth; unsigned async_esc, size1, size2, size3; int flags; /* info about packet */ #define NBFLAG_INCOMING 0x01 /* else outgoing */ #define NBFLAG_AC 0x02 /* Address compressed */ #define NBFLAG_PC 0x04 /* Protocol Compressed */ #define NBFLAG_VJC 0x08 /* VJ compressed */ #define NBFLAG_CCP 0x10 /* BSD compressed */ #define NBFLAG_CCPINC 0x20 /* BSD incompressible */ #define NBFLAG_VJCINC 0x40 /* VJ incompressible */ } bpf_encapsulater; typedef struct _ppp_netbuf_t { netbuf_t buffer; netbuf_t orig_buffer; /* * Original outgoing datagram * received. We do compression and * statistics gathering on buffer, * we send buffer, but we return * orig_buffer to BPF so that it doesn't * have to understand all the compression. */ struct _ppp_netbuf_t *next; /* for linked list */ unsigned int size; /* original size requested for netbuf. * We leave it up to caller to * determine extra space they need. We * may also include extra space we need * for bounds checking. */ unsigned char *wrapper, /* unaligned address returned for this containing * structure. Used for freeing. */ *init_offset; /* Init_offset is nb_map of the netbuf_t before * user can change it around. Can check bounds * against this. */ mark_t mark; bpf_encapsulater pktinfo; /* The size and compression stats that * get passed to user level tcpdump */ } *ppp_netbuf_t; /* * These prototypes are identical to the corrisponding functions * found in netbuf.h except they use the ppp_netbuf_t type. */ extern ppp_netbuf_t cb_nb_alloc(unsigned size); extern void cb_nb_free(ppp_netbuf_t nb); extern void cb_nb_duplicate(ppp_netbuf_t from, ppp_netbuf_t to); extern char * cb_nb_map(ppp_netbuf_t nb); extern char * cb_nb_map_orig(ppp_netbuf_t nb); extern unsigned cb_nb_size(ppp_netbuf_t nb); extern unsigned cb_nb_size_orig(ppp_netbuf_t nb); extern int cb_nb_shrink_top(ppp_netbuf_t nb, unsigned size); extern int cb_nb_grow_top(ppp_netbuf_t nb, unsigned size); extern int cb_nb_shrink_bot(ppp_netbuf_t nb, unsigned size); extern int cb_nb_grow_bot(ppp_netbuf_t nb, unsigned size); extern int cb_nb_read(ppp_netbuf_t nb, unsigned offset, unsigned size, void *target); extern int cb_nb_write(ppp_netbuf_t nb, unsigned offset, unsigned size, void *source); extern void cb_nb_get_mark(ppp_netbuf_t nb, mark_t *ptr); extern void cb_nb_set_mark(ppp_netbuf_t nb, mark_t ptr); extern void cb_nb_get_next(ppp_netbuf_t nb, ppp_netbuf_t *ptr); extern void cb_nb_set_next(ppp_netbuf_t nb, ppp_netbuf_t ptr); extern ppp_netbuf_t cb_nb_to_NB(netbuf_t); extern netbuf_t cb_NB_to_nb(ppp_netbuf_t); #define NETBUF_T ppp_netbuf_t #define NB_ALLOC cb_nb_alloc #define NB_FREE cb_nb_free #define NB_DUPLICATE cb_nb_duplicate #define NB_MAP cb_nb_map #define NB_MAP_ORIG cb_nb_map_orig #define NB_SIZE cb_nb_size #define NB_SIZE_ORIG cb_nb_size_orig #define NB_SHRINK_TOP cb_nb_shrink_top #define NB_GROW_TOP cb_nb_grow_top #define NB_SHRINK_BOT cb_nb_shrink_bot #define NB_GROW_BOT cb_nb_grow_bot #define NB_READ cb_nb_read #define NB_WRITE cb_nb_write #define NB_GET_MARK cb_nb_get_mark #define NB_SET_MARK cb_nb_set_mark #define NB_GET_NEXT cb_nb_get_next #define NB_SET_NEXT cb_nb_set_next #define nb_TO_NB cb_nb_to_NB #define NB_TO_nb cb_NB_to_nb #else /* NETBUF_PROXY */ #define NETBUF_T netbuf_t #define NB_ALLOC ppp_nb_alloc #define NB_FREE nb_free #define NB_MAP nb_map #define NB_SIZE nb_size #define NB_SHRINK_TOP ppp_nb_shrink_top #define NB_GROW_TOP ppp_nb_grow_top #define NB_SHRINK_BOT nb_shrink_bot #define NB_GROW_BOT nb_grow_bot #define NB_READ nb_read #define NB_WRITE nb_write #define NB_GET_MARK nb_get_mark #define NB_SET_MARK nb_set_mark #define NB_GET_NEXT nb_get_next #define NB_SET_NEXT nb_set_next #define nb_TO_NB(nb) (nb) #define NB_TO_nb(NB) (NB) #endif /* NETBUF_PROXY */ struct qparms { u_char q_low, q_high, q_max; char *q_name; }; struct nb_queue { char *name; int low, high, max, len, dropped; NETBUF_T head, tail; }; #ifndef NETBUF_PROXY #define NB_EXTRA (sizeof(mark_t)+sizeof(netbuf_t)) static inline void nb_set_next(netbuf_t nb, netbuf_t ptr) { if(nb) bcopy(&ptr,NB_MAP(nb)-sizeof(netbuf_t),sizeof(netbuf_t)); } static inline void nb_get_next(netbuf_t nb, netbuf_t *ptr) { if(nb && ptr) bcopy(NB_MAP(nb)-sizeof(netbuf_t),ptr,sizeof(netbuf_t)); } static inline void nb_set_mark(netbuf_t nb, mark_t ptr) { if(nb) bcopy(&ptr,NB_MAP(nb)-NB_EXTRA,sizeof(mark_t)); } static inline void nb_get_mark(netbuf_t nb, mark_t *ptr) { if(nb && ptr) bcopy(NB_MAP(nb)-NB_EXTRA,ptr,sizeof(mark_t)); } static inline void ppp_nb_shrink_top(netbuf_t nb, unsigned int size) { netbuf_t ptr; mark_t mark; NB_GET_NEXT(nb,&ptr); NB_GET_MARK(nb,&mark); nb_shrink_top(nb,size); NB_SET_MARK(nb,mark); NB_SET_NEXT(nb,ptr); } static inline void ppp_nb_grow_top(netbuf_t nb, unsigned int size) { netbuf_t ptr; mark_t mark; NB_GET_NEXT(nb,&ptr); NB_GET_MARK(nb,&mark); nb_grow_top(nb,size); NB_SET_MARK(nb,mark); NB_SET_NEXT(nb,ptr); } static inline netbuf_t ppp_nb_alloc(unsigned int size) { netbuf_t nb; size+=NB_EXTRA; nb=nb_alloc(size); if(nb) { // NB_SHRINK_TOP(nb,NB_EXTRA); nb_shrink_top(nb,NB_EXTRA); NB_SET_NEXT(nb,NULL); NB_SET_MARK(nb,0); } return nb; } #endif /* NETBUF_PROXY */ #endif /* __NBQ_H__ */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.