diff --git a/src/add-ons/kernel/network/stack/utility.cpp b/src/add-ons/kernel/network/stack/utility.cpp index 8bd53ba030..62df18adf4 100644 --- a/src/add-ons/kernel/network/stack/utility.cpp +++ b/src/add-ons/kernel/network/stack/utility.cpp @@ -24,6 +24,30 @@ static thread_id sTimerThread; static bigtime_t sTimerTimeout; +void * +UserBuffer::Copy(void *source, size_t length) +{ + if (fStatus != B_OK) + return NULL; + + if (fAvailable < length) { + fStatus = ENOBUFS; + return NULL; + } + + fStatus = user_memcpy(fBuffer, source, length); + if (fStatus < B_OK) + return NULL; + + void *current = fBuffer; + + fAvailable -= length; + fBuffer += length; + + return current; +} + + uint16 compute_checksum(uint8 *_buffer, size_t length) { diff --git a/src/add-ons/kernel/network/stack/utility.h b/src/add-ons/kernel/network/stack/utility.h index 0f71c7a8e7..97c782c3a2 100644 --- a/src/add-ons/kernel/network/stack/utility.h +++ b/src/add-ons/kernel/network/stack/utility.h @@ -11,6 +11,42 @@ #include +class UserBuffer { +public: + UserBuffer(void *buffer, size_t size); + + void *Copy(void *source, size_t size); + status_t Status() const; + size_t ConsumedAmount() const; + +private: + uint8 *fBuffer; + size_t fBufferSize, fAvailable; + status_t fStatus; +}; + + +inline +UserBuffer::UserBuffer(void *buffer, size_t size) + : fBuffer((uint8 *)buffer), fBufferSize(size), + fAvailable(size), fStatus(B_OK) +{ +} + + +inline status_t +UserBuffer::Status() const +{ + return fStatus; +} + + +inline size_t +UserBuffer::ConsumedAmount() const +{ + return fBufferSize - fAvailable; +} + // checksums uint16 compute_checksum(uint8 *_buffer, size_t length);