]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[iobuf] Add iob_split() to split an I/O buffer into portions
authorMichael Brown <mcb30@ipxe.org>
Thu, 11 Dec 2014 17:10:01 +0000 (17:10 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 18 Dec 2014 14:46:38 +0000 (14:46 +0000)
RNDIS devices may provide multiple packets encapsulated into a single
message.  Provide an API to allow the RNDIS driver to split an I/O
buffer into smaller portions.

The current implementation will always copy the underlying data,
rather than splitting the buffer in situ.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/iobuf.c
src/include/ipxe/iobuf.h

index afc91d150873d59edde42233a9fa0e0b9efb840c..6dae0c1dd39a453c19db848299cd2ba0390f8025 100644 (file)
@@ -200,3 +200,33 @@ struct io_buffer * iob_concatenate ( struct list_head *list ) {
 
        return concatenated;
 }
+
+/**
+ * Split I/O buffer
+ *
+ * @v iobuf            I/O buffer
+ * @v len              Length to split into a new I/O buffer
+ * @ret split          New I/O buffer, or NULL on allocation failure
+ *
+ * Split the first @c len bytes of the existing I/O buffer into a
+ * separate I/O buffer.  The resulting buffers are likely to have no
+ * headroom or tailroom.
+ *
+ * If this call fails, then the original buffer will be unmodified.
+ */
+struct io_buffer * iob_split ( struct io_buffer *iobuf, size_t len ) {
+       struct io_buffer *split;
+
+       /* Sanity checks */
+       assert ( len <= iob_len ( iobuf ) );
+
+       /* Allocate new I/O buffer */
+       split = alloc_iob ( len );
+       if ( ! split )
+               return NULL;
+
+       /* Copy in data */
+       memcpy ( iob_put ( split, len ), iobuf->data, len );
+       iob_pull ( iobuf, len );
+       return split;
+}
index b2b0cb4401d7d8e71099ea5007ea71247fbd9f75..d7c10ab4454ab3eeea08db5f51712df3e371e863 100644 (file)
@@ -217,5 +217,6 @@ extern void free_iob ( struct io_buffer *iobuf );
 extern void iob_pad ( struct io_buffer *iobuf, size_t min_len );
 extern int iob_ensure_headroom ( struct io_buffer *iobuf, size_t len );
 extern struct io_buffer * iob_concatenate ( struct list_head *list );
+extern struct io_buffer * iob_split ( struct io_buffer *iobuf, size_t len );
 
 #endif /* _IPXE_IOBUF_H */