First version, based on the concepts in linux/skbuff.h
authorMichael Brown <mcb30@etherboot.org>
Tue, 18 Apr 2006 17:47:01 +0000 (17:47 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 18 Apr 2006 17:47:01 +0000 (17:47 +0000)
src/include/gpxe/pkbuff.h [new file with mode: 0644]

diff --git a/src/include/gpxe/pkbuff.h b/src/include/gpxe/pkbuff.h
new file mode 100644 (file)
index 0000000..54d8511
--- /dev/null
@@ -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 */