summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2006-04-18 19:47:01 +0200
committerMichael Brown2006-04-18 19:47:01 +0200
commit0864a733477dd56af2b9e3b6ef0581c7886309b6 (patch)
tree09952f990a36f98d72f4c9b8e6366bf5619ede9e
parentAdded netmask and gateway global options. (diff)
downloadipxe-0864a733477dd56af2b9e3b6ef0581c7886309b6.tar.gz
ipxe-0864a733477dd56af2b9e3b6ef0581c7886309b6.tar.xz
ipxe-0864a733477dd56af2b9e3b6ef0581c7886309b6.zip
First version, based on the concepts in linux/skbuff.h
-rw-r--r--src/include/gpxe/pkbuff.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/include/gpxe/pkbuff.h b/src/include/gpxe/pkbuff.h
new file mode 100644
index 000000000..54d8511c2
--- /dev/null
+++ b/src/include/gpxe/pkbuff.h
@@ -0,0 +1,80 @@
+#ifndef _PKBUFF_H
+#define _PKBUFF_H
+
+/** @file
+ *
+ * Packet buffers
+ *
+ * Packet buffers are used to contain network packets. Methods are
+ * provided for appending, prepending, etc. data.
+ *
+ */
+
+#include <stdint.h>
+#include <assert.h>
+
+/** A packet buffer
+ *
+ * This structure is used to represent a network packet within gPXE.
+ */
+struct pk_buff {
+ /** Head of the buffer */
+ void *head;
+ /** Start of data */
+ void *data;
+ /** End of data */
+ void *tail;
+ /** End of the buffer */
+ void *end;
+};
+
+/**
+ * Add data to start of packet buffer
+ *
+ * @v pkb Packet buffer
+ * @v len Length to add
+ * @ret data Pointer to new start of buffer
+ */
+static inline void * pkb_push ( struct pk_buff *pkb, size_t len ) {
+ pkb->data -= len;
+ assert ( pkb->data >= pkb->head );
+ return pkb->data;
+}
+
+/**
+ * Remove data from start of packet buffer
+ *
+ * @v pkb Packet buffer
+ * @v len Length to remove
+ * @ret data Pointer to new start of buffer
+ */
+static inline void * pkb_pull ( struct pk_buff *pkb, size_t len ) {
+ pkb->data += len;
+ assert ( pkb->data >= pkb->tail );
+ return pkb->data;
+}
+
+/**
+ * Add data to end of packet buffer
+ *
+ * @v pkb Packet buffer
+ * @v len Length to add
+ * @ret data Pointer to newly added space
+ */
+static inline void * pkb_put ( struct pk_buff *pkb, size_t len ) {
+ void *old_tail = pkb->tail;
+ pkb->tail += len;
+ assert ( pkb->tail <= pkb->end );
+ return old_tail;
+}
+
+/**
+ * Empty a packet buffer
+ *
+ * @v pkb Packet buffer
+ */
+static inline void pkb_empty ( struct pk_buff *pkb ) {
+ pkb->tail = pkb->data;
+}
+
+#endif /* _PKBUFF_H */