From 4462d8b41b261d75142fb024e58a7afe565b82b2 Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Thu, 14 Sep 2006 23:04:54 +0000 Subject: [PATCH] implemented split_buffer() git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18850 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/stack/net_buffer.cpp | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/network/stack/net_buffer.cpp b/src/add-ons/kernel/network/stack/net_buffer.cpp index 71de2e0b1b..0b59204159 100644 --- a/src/add-ons/kernel/network/stack/net_buffer.cpp +++ b/src/add-ons/kernel/network/stack/net_buffer.cpp @@ -55,7 +55,8 @@ struct net_buffer_private : net_buffer { static status_t append_data(net_buffer *buffer, const void *data, size_t size); - +static status_t trim_data(net_buffer *_buffer, size_t newSize); +static status_t remove_header(net_buffer *_buffer, size_t bytes); static data_header * create_data_header(size_t size, size_t headerSpace) @@ -343,6 +344,29 @@ clone_buffer(net_buffer *_buffer, bool shareFreeSpace) } +/*! + Split the buffer at offset, the trailer data + is returned as new buffer. + TODO: optimize and avoid making a copy. +*/ +static net_buffer * +split_buffer(net_buffer *from, uint32 offset) +{ + status_t err; + net_buffer *buf = duplicate_buffer(from); + if (buf == NULL) + return NULL; + if ((err = remove_header(buf, offset)) < B_OK) + goto fail; + if ((err = trim_data(from, from->size - offset)) < B_OK) + goto fail; + return buf; +fail: + free_buffer(buf); + return NULL; +} + + /*! Merges the second buffer with the first. If \a after is \c true, the second buffer's contents will be appended to the first ones, else they @@ -872,7 +896,7 @@ net_buffer_module_info gNetBufferModule = { duplicate_buffer, clone_buffer, - NULL, // split + split_buffer, merge_buffer, prepend_size,