]> mj.ucw.cz Git - netgrind.git/blob - netgrind/pkt.h
Initial revision
[netgrind.git] / netgrind / pkt.h
1 /*
2  *      Netgrind -- Packet Buffers
3  *
4  *      (c) 2003 Martin Mares <mj@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU General Public License.
8  */
9
10 #include "lib/lists.h"
11
12 struct pkt {
13   struct node n;
14   u64 timestamp;
15   byte *data, *stop, *ebuf;
16   byte buf[0];
17 };
18
19 static inline uns pkt_len(struct pkt *p)
20 {
21   return p->stop - p->data;
22 }
23
24 static inline void pkt_push(struct pkt *p, uns len)
25 {
26   p->data -= len;
27   ASSERT(p->data >= p->buf);
28 }
29
30 static inline void *pkt_pop(struct pkt *p, uns len)
31 {
32   byte *d = p->data;
33   if (d + len > p->stop)
34     return NULL;
35   p->data += len;
36   return d;
37 }
38
39 static inline void *pkt_peek(struct pkt *p, uns len)
40 {
41   byte *d = p->data;
42   if (d + len > p->stop)
43     return NULL;
44   return d;
45 }
46
47 static inline byte *pkt_append(struct pkt *p, uns len)
48 {
49   byte *d = p->stop;
50   p->stop = d + len;
51   ASSERT(p->stop <= p->ebuf);
52   return d;
53 }
54
55 static inline void pkt_unappend(struct pkt *p, uns len)
56 {
57   p->stop -= len;
58   ASSERT(p->stop >= p->data);
59 }
60
61 struct pkt *pkt_new(uns preroom, uns postroom);
62 void pkt_free(struct pkt *pkt);
63
64 struct pkt_stats {
65   u64 packets;
66   u64 bytes;
67 };
68
69 static inline void pkt_account(struct pkt_stats *stats, struct pkt *pkt)
70 {
71   stats->packets++;
72   stats->bytes += pkt_len(pkt);
73 }