Network API now allows for multiple network devices (although the
[people/oremanj/gpxe.git] / src / include / gpxe / pkbuff.h
1 #ifndef _GPXE_PKBUFF_H
2 #define _GPXE_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 #include <gpxe/list.h>
16
17 struct net_protocol;
18 struct ll_protocol;
19
20 /** A packet buffer
21  *
22  * This structure is used to represent a network packet within gPXE.
23  */
24 struct pk_buff {
25         /** Head of the buffer */
26         void *head;
27         /** Start of data */
28         void *data;
29         /** End of data */
30         void *tail;
31         /** End of the buffer */
32         void *end;
33
34         /** List of which this buffer is a member */
35         struct list_head list;
36
37         /** The network-layer protocol */
38         struct net_protocol *net_protocol;
39         /** The link-layer protocol */
40         struct ll_protocol *ll_protocol;
41 };
42
43 /**
44  * Add data to start of packet buffer
45  *
46  * @v pkb       Packet buffer
47  * @v len       Length to add
48  * @ret data    Pointer to new start of buffer
49  */
50 static inline void * pkb_push ( struct pk_buff *pkb, size_t len ) {
51         pkb->data -= len;
52         assert ( pkb->data >= pkb->head );
53         return pkb->data;
54 }
55
56 /**
57  * Remove data from start of packet buffer
58  *
59  * @v pkb       Packet buffer
60  * @v len       Length to remove
61  * @ret data    Pointer to new start of buffer
62  */
63 static inline void * pkb_pull ( struct pk_buff *pkb, size_t len ) {
64         pkb->data += len;
65         assert ( pkb->data >= pkb->tail );
66         return pkb->data;
67 }
68
69 /**
70  * Add data to end of packet buffer
71  *
72  * @v pkb       Packet buffer
73  * @v len       Length to add
74  * @ret data    Pointer to newly added space
75  */
76 static inline void * pkb_put ( struct pk_buff *pkb, size_t len ) {
77         void *old_tail = pkb->tail;
78         pkb->tail += len;
79         assert ( pkb->tail <= pkb->end );
80         return old_tail;
81 }
82
83 /**
84  * Remove data from end of packet buffer
85  *
86  * @v pkb       Packet buffer
87  * @v len       Length to remove
88  */
89 static inline void pkb_unput ( struct pk_buff *pkb, size_t len ) {
90         pkb->tail -= len;
91         assert ( pkb->tail >= pkb->data );
92 }
93
94 /**
95  * Empty a packet buffer
96  *
97  * @v pkb       Packet buffer
98  */
99 static inline void pkb_empty ( struct pk_buff *pkb ) {
100         pkb->tail = pkb->data;
101 }
102
103 /**
104  * Calculate length of data in a packet buffer
105  *
106  * @v pkb       Packet buffer
107  * @ret len     Length of data in buffer
108  */
109 static inline size_t pkb_len ( struct pk_buff *pkb ) {
110         return ( pkb->tail - pkb->data );
111 }
112
113 extern struct pk_buff * alloc_pkb ( size_t len );
114 extern void free_pkb ( struct pk_buff *pkb );
115
116 #endif /* _GPXE_PKBUFF_H */