diff --git a/headers/private/net/net_stack.h b/headers/private/net/net_stack.h index 97662eb4b7..b73767aed4 100644 --- a/headers/private/net/net_stack.h +++ b/headers/private/net/net_stack.h @@ -90,6 +90,8 @@ struct net_stack_module_info { ssize_t (*fifo_dequeue_buffer)(struct net_fifo *fifo, uint32 flags, bigtime_t timeout, struct net_buffer **_buffer); status_t (*clear_fifo)(struct net_fifo *fifo); + status_t (*fifo_socket_enqueue_buffer)(struct net_fifo *, struct net_socket *, + uint8 event, struct net_buffer *); // timer void (*init_timer)(struct net_timer *timer, net_timer_func hook, void *data); diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp index 5321b2ea7b..cfd229a575 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp +++ b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp @@ -202,19 +202,8 @@ RawSocket::BytesAvailable() status_t RawSocket::Write(net_buffer *source) { - // we need to make a clone for that buffer and pass it to the socket - net_buffer *buffer = gBufferModule->clone(source, false); - TRACE(("ipv4::RawSocket::Write(): cloned buffer %p\n", buffer)); - if (buffer == NULL) - return B_NO_MEMORY; - - status_t status = sStackModule->fifo_enqueue_buffer(&fFifo, buffer); - if (status >= B_OK) - sStackModule->notify_socket(fSocket, B_SELECT_READ, BytesAvailable()); - else - gBufferModule->free(buffer); - - return status; + return sStackModule->fifo_socket_enqueue_buffer(&fFifo, fSocket, + B_SELECT_READ, source); } diff --git a/src/add-ons/kernel/network/protocols/udp/udp.cpp b/src/add-ons/kernel/network/protocols/udp/udp.cpp index be6d6d372c..a45f6a5745 100644 --- a/src/add-ons/kernel/network/protocols/udp/udp.cpp +++ b/src/add-ons/kernel/network/protocols/udp/udp.cpp @@ -860,17 +860,9 @@ UdpEndpoint::StoreData(net_buffer *_buffer) { TRACE(("buffer %p passed to endpoint with (%s)\n", _buffer, AddressString(sDomain, (sockaddr *)&socket->address, true).Data())); - net_buffer *buffer = gBufferModule->clone(_buffer, false); - if (buffer == NULL) - return B_NO_MEMORY; - status_t status = sStackModule->fifo_enqueue_buffer(&fFifo, buffer); - if (status >= B_OK) - sStackModule->notify_socket(socket, B_SELECT_READ, BytesAvailable()); - else - gBufferModule->free(buffer); - - return status; + return sStackModule->fifo_socket_enqueue_buffer(&fFifo, socket, + B_SELECT_READ, _buffer); } diff --git a/src/add-ons/kernel/network/stack/link.cpp b/src/add-ons/kernel/network/stack/link.cpp index 55788fa070..7d2c49bed2 100644 --- a/src/add-ons/kernel/network/stack/link.cpp +++ b/src/add-ons/kernel/network/stack/link.cpp @@ -40,19 +40,8 @@ link_monitor_data(void *cookie, net_buffer *packet) { link_protocol *protocol = (link_protocol *)cookie; - // we need to make a clone for that buffer and pass it to the socket - net_buffer *buffer = gNetBufferModule.clone(packet, false); - if (buffer == NULL) - return B_NO_MEMORY; - - status_t status = fifo_enqueue_buffer(&protocol->fifo, buffer); - if (status >= B_OK) - notify_socket(protocol->socket, B_SELECT_READ, - protocol->fifo.current_bytes); - else - gNetBufferModule.free(buffer); - - return status; + return fifo_socket_enqueue_buffer(&protocol->fifo, protocol->socket, + B_SELECT_READ, packet); } diff --git a/src/add-ons/kernel/network/stack/stack.cpp b/src/add-ons/kernel/network/stack/stack.cpp index 063f383a22..1b8d087364 100644 --- a/src/add-ons/kernel/network/stack/stack.cpp +++ b/src/add-ons/kernel/network/stack/stack.cpp @@ -923,6 +923,7 @@ static net_stack_module_info sNetStackModule = { fifo_enqueue_buffer, fifo_dequeue_buffer, clear_fifo, + fifo_socket_enqueue_buffer, init_timer, set_timer, diff --git a/src/add-ons/kernel/network/stack/utility.cpp b/src/add-ons/kernel/network/stack/utility.cpp index 62df18adf4..361579e316 100644 --- a/src/add-ons/kernel/network/stack/utility.cpp +++ b/src/add-ons/kernel/network/stack/utility.cpp @@ -134,11 +134,9 @@ uninit_fifo(net_fifo *fifo) } -status_t -fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer) +static status_t +_fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer) { - BenaphoreLocker locker(fifo->lock); - if (fifo->max_bytes > 0 && fifo->current_bytes + buffer->size > fifo->max_bytes) return ENOBUFS; @@ -155,6 +153,13 @@ fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer) return B_OK; } +status_t +fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer) +{ + BenaphoreLocker locker(fifo->lock); + return _fifo_enqueue_buffer(fifo, buffer); +} + /*! Gets the first buffer from the FIFO. If there is no buffer, it @@ -243,6 +248,26 @@ clear_fifo(net_fifo *fifo) } +status_t +fifo_socket_enqueue_buffer(net_fifo *fifo, net_socket *socket, uint8 event, + net_buffer *_buffer) +{ + net_buffer *buffer = gNetBufferModule.clone(_buffer, false); + if (buffer == NULL) + return B_NO_MEMORY; + + BenaphoreLocker locker(fifo->lock); + + status_t status = _fifo_enqueue_buffer(fifo, buffer); + if (status < B_OK) + gNetBufferModule.free(buffer); + else + notify_socket(socket, event, fifo->current_bytes); + + return status; +} + + // #pragma mark - Timer diff --git a/src/add-ons/kernel/network/stack/utility.h b/src/add-ons/kernel/network/stack/utility.h index 97c782c3a2..99b8612fb4 100644 --- a/src/add-ons/kernel/network/stack/utility.h +++ b/src/add-ons/kernel/network/stack/utility.h @@ -62,6 +62,8 @@ status_t fifo_enqueue_buffer(net_fifo *fifo, struct net_buffer *buffer); ssize_t fifo_dequeue_buffer(net_fifo *fifo, uint32 flags, bigtime_t timeout, struct net_buffer **_buffer); status_t clear_fifo(net_fifo *fifo); +status_t fifo_socket_enqueue_buffer(net_fifo *, net_socket *, uint8 event, + net_buffer *); // timer void init_timer(net_timer *timer, net_timer_func hook, void *data);