introduced fifo_socket_enqueue_buffer which clones the buffer, enqueues it to the fifo and notifies the socket.
- changed the link, ipv4 and udp modules to use fifo_socket_enqueue_buffer git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20587 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user