f82f508aca92b98a4f87cd7f8abc7fc8fe2de0e0
[people/oremanj/gpxe.git] / src / include / gpxe / pkbuff.h
1 #ifndef _PKBUFF_H
2 #define _PKBUFF_H
3
4 /** @file
5  *
6  * Packet buffers
7  *
8  * Packet buffers are used to contain network packets.  Methods are
9  * provided for appending, prepending, etc. data.
10  *
11  */
12
13 #include <stdint.h>
14 #include <assert.h>
15
16 /** A packet buffer
17  *
18  * This structure is used to represent a network packet within gPXE.
19  */
20 struct pk_buff {
21         /** Head of the buffer */
22         void *head;
23         /** Start of data */
24         void *data;
25         /** End of data */
26         void *tail;
27         /** End of the buffer */
28         void *end;
29
30         /** The network-layer protocol
31          *
32          * This is the network-layer protocol expressed as an
33          * ETH_P_XXX constant, in network-byte order.
34          */
35         uint16_t net_proto;
36         /** Flags
37          *
38          * Filled in only on outgoing packets.  Value is the
39          * bitwise-OR of zero or more PKB_FL_XXX constants.
40          */
41         uint8_t flags;
42         /** Network-layer address length 
43          *
44          * Filled in only on outgoing packets.
45          */
46         uint8_t net_addr_len;
47         /** Network-layer address
48          *
49          * Filled in only on outgoing packets.
50          */
51         void *net_addr;
52 };
53
54 /** Packet is a broadcast packet */
55 #define PKB_FL_BROADCAST 0x01
56
57 /** Packet is a multicast packet */
58 #define PKB_FL_MULTICAST 0x02
59
60 /** Network-layer address is a raw hardware address */
61 #define PKB_FL_RAW_NET_ADDR 0x04
62
63 /**
64  * Add data to start of packet buffer
65  *
66  * @v pkb       Packet buffer
67  * @v len       Length to add
68  * @ret data    Pointer to new start of buffer
69  */
70 static inline void * pkb_push ( struct pk_buff *pkb, size_t len ) {
71         pkb->data -= len;
72         assert ( pkb->data >= pkb->head );
73         return pkb->data;
74 }
75
76 /**
77  * Remove data from start of packet buffer
78  *
79  * @v pkb       Packet buffer
80  * @v len       Length to remove
81  * @ret data    Pointer to new start of buffer
82  */
83 static inline void * pkb_pull ( struct pk_buff *pkb, size_t len ) {
84         pkb->data += len;
85         assert ( pkb->data >= pkb->tail );
86         return pkb->data;
87 }
88
89 /**
90  * Add data to end of packet buffer
91  *
92  * @v pkb       Packet buffer
93  * @v len       Length to add
94  * @ret data    Pointer to newly added space
95  */
96 static inline void * pkb_put ( struct pk_buff *pkb, size_t len ) {
97         void *old_tail = pkb->tail;
98         pkb->tail += len;
99         assert ( pkb->tail <= pkb->end );
100         return old_tail;
101 }
102
103 /**
104  * Remove data from end of packet buffer
105  *
106  * @v pkb       Packet buffer
107  * @v len       Length to remove
108  */
109 static inline void pkb_unput ( struct pk_buff *pkb, size_t len ) {
110         pkb->tail -= len;
111         assert ( pkb->tail >= pkb->data );
112 }
113
114 /**
115  * Empty a packet buffer
116  *
117  * @v pkb       Packet buffer
118  */
119 static inline void pkb_empty ( struct pk_buff *pkb ) {
120         pkb->tail = pkb->data;
121 }
122
123 /**
124  * Calculate length of data in a packet buffer
125  *
126  * @v pkb       Packet buffer
127  * @ret len     Length of data in buffer
128  */
129 static inline size_t pkb_len ( struct pk_buff *pkb ) {
130         return ( pkb->tail - pkb->data );
131 }
132
133 #endif /* _PKBUFF_H */