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,
|
ssize_t (*fifo_dequeue_buffer)(struct net_fifo *fifo, uint32 flags,
|
||||||
bigtime_t timeout, struct net_buffer **_buffer);
|
bigtime_t timeout, struct net_buffer **_buffer);
|
||||||
status_t (*clear_fifo)(struct net_fifo *fifo);
|
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
|
// timer
|
||||||
void (*init_timer)(struct net_timer *timer, net_timer_func hook, void *data);
|
void (*init_timer)(struct net_timer *timer, net_timer_func hook, void *data);
|
||||||
|
|||||||
@@ -202,19 +202,8 @@ RawSocket::BytesAvailable()
|
|||||||
status_t
|
status_t
|
||||||
RawSocket::Write(net_buffer *source)
|
RawSocket::Write(net_buffer *source)
|
||||||
{
|
{
|
||||||
// we need to make a clone for that buffer and pass it to the socket
|
return sStackModule->fifo_socket_enqueue_buffer(&fFifo, fSocket,
|
||||||
net_buffer *buffer = gBufferModule->clone(source, false);
|
B_SELECT_READ, source);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -860,17 +860,9 @@ UdpEndpoint::StoreData(net_buffer *_buffer)
|
|||||||
{
|
{
|
||||||
TRACE(("buffer %p passed to endpoint with (%s)\n", _buffer,
|
TRACE(("buffer %p passed to endpoint with (%s)\n", _buffer,
|
||||||
AddressString(sDomain, (sockaddr *)&socket->address, true).Data()));
|
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);
|
return sStackModule->fifo_socket_enqueue_buffer(&fFifo, socket,
|
||||||
if (status >= B_OK)
|
B_SELECT_READ, _buffer);
|
||||||
sStackModule->notify_socket(socket, B_SELECT_READ, BytesAvailable());
|
|
||||||
else
|
|
||||||
gBufferModule->free(buffer);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -40,19 +40,8 @@ link_monitor_data(void *cookie, net_buffer *packet)
|
|||||||
{
|
{
|
||||||
link_protocol *protocol = (link_protocol *)cookie;
|
link_protocol *protocol = (link_protocol *)cookie;
|
||||||
|
|
||||||
// we need to make a clone for that buffer and pass it to the socket
|
return fifo_socket_enqueue_buffer(&protocol->fifo, protocol->socket,
|
||||||
net_buffer *buffer = gNetBufferModule.clone(packet, false);
|
B_SELECT_READ, packet);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -923,6 +923,7 @@ static net_stack_module_info sNetStackModule = {
|
|||||||
fifo_enqueue_buffer,
|
fifo_enqueue_buffer,
|
||||||
fifo_dequeue_buffer,
|
fifo_dequeue_buffer,
|
||||||
clear_fifo,
|
clear_fifo,
|
||||||
|
fifo_socket_enqueue_buffer,
|
||||||
|
|
||||||
init_timer,
|
init_timer,
|
||||||
set_timer,
|
set_timer,
|
||||||
|
|||||||
@@ -134,11 +134,9 @@ uninit_fifo(net_fifo *fifo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
static status_t
|
||||||
fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer)
|
_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)
|
if (fifo->max_bytes > 0 && fifo->current_bytes + buffer->size > fifo->max_bytes)
|
||||||
return ENOBUFS;
|
return ENOBUFS;
|
||||||
|
|
||||||
@@ -155,6 +153,13 @@ fifo_enqueue_buffer(net_fifo *fifo, net_buffer *buffer)
|
|||||||
return B_OK;
|
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
|
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
|
// #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,
|
ssize_t fifo_dequeue_buffer(net_fifo *fifo, uint32 flags, bigtime_t timeout,
|
||||||
struct net_buffer **_buffer);
|
struct net_buffer **_buffer);
|
||||||
status_t clear_fifo(net_fifo *fifo);
|
status_t clear_fifo(net_fifo *fifo);
|
||||||
|
status_t fifo_socket_enqueue_buffer(net_fifo *, net_socket *, uint8 event,
|
||||||
|
net_buffer *);
|
||||||
|
|
||||||
// timer
|
// timer
|
||||||
void init_timer(net_timer *timer, net_timer_func hook, void *data);
|
void init_timer(net_timer *timer, net_timer_func hook, void *data);
|
||||||
|
|||||||
Reference in New Issue
Block a user