some internal reorganization of getsockopt()/setsockopt() handling. TCP is now able to fully use the application requested sender/receiver buffer sizes for improved performance.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20764 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -639,15 +639,9 @@ socket_getsockname(net_socket *socket, struct sockaddr *address, socklen_t *_add
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
socket_getsockopt(net_socket *socket, int level, int option, void *value,
|
||||
int *_length)
|
||||
status_t
|
||||
socket_get_option(net_socket *socket, int option, void *value, int *_length)
|
||||
{
|
||||
if (level != SOL_SOCKET) {
|
||||
return socket->first_info->control(socket->first_protocol,
|
||||
level | LEVEL_GET_OPTION, option, value, (size_t *)_length);
|
||||
}
|
||||
|
||||
switch (option) {
|
||||
case SO_SNDBUF:
|
||||
{
|
||||
@@ -747,6 +741,23 @@ socket_getsockopt(net_socket *socket, int level, int option, void *value,
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
socket_getsockopt(net_socket *socket, int level, int option, void *value,
|
||||
int *_length)
|
||||
{
|
||||
status_t status = (level == SOL_SOCKET) ? B_OK : B_BAD_VALUE;
|
||||
|
||||
if (socket->first_info->getsockopt)
|
||||
status = socket->first_info->getsockopt(socket->first_protocol, level,
|
||||
option, value, _length);
|
||||
|
||||
if (status < B_OK)
|
||||
return status;
|
||||
|
||||
return socket_get_option(socket, option, value, _length);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
socket_listen(net_socket *socket, int backlog)
|
||||
{
|
||||
@@ -940,15 +951,10 @@ socket_send(net_socket *socket, msghdr *header, const void *data,
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
socket_setsockopt(net_socket *socket, int level, int option, const void *value,
|
||||
status_t
|
||||
socket_set_option(net_socket *socket, int option, const void *value,
|
||||
int length)
|
||||
{
|
||||
if (level != SOL_SOCKET) {
|
||||
return socket->first_info->control(socket->first_protocol,
|
||||
level | LEVEL_SET_OPTION, option, (void *)value, (size_t *)&length);
|
||||
}
|
||||
|
||||
switch (option) {
|
||||
// TODO: implement other options!
|
||||
case SO_LINGER:
|
||||
@@ -968,8 +974,6 @@ socket_setsockopt(net_socket *socket, int level, int option, const void *value,
|
||||
}
|
||||
|
||||
case SO_SNDBUF:
|
||||
// TODO: should be handled in the protocol modules - they can actually
|
||||
// check if setting the value is allowed and within valid bounds.
|
||||
if (length != sizeof(uint32))
|
||||
return B_BAD_VALUE;
|
||||
|
||||
@@ -977,7 +981,6 @@ socket_setsockopt(net_socket *socket, int level, int option, const void *value,
|
||||
return B_OK;
|
||||
|
||||
case SO_RCVBUF:
|
||||
// TODO: see above (SO_SNDBUF)
|
||||
if (length != sizeof(uint32))
|
||||
return B_BAD_VALUE;
|
||||
|
||||
@@ -985,7 +988,6 @@ socket_setsockopt(net_socket *socket, int level, int option, const void *value,
|
||||
return B_OK;
|
||||
|
||||
case SO_SNDLOWAT:
|
||||
// TODO: see above (SO_SNDBUF)
|
||||
if (length != sizeof(uint32))
|
||||
return B_BAD_VALUE;
|
||||
|
||||
@@ -993,7 +995,6 @@ socket_setsockopt(net_socket *socket, int level, int option, const void *value,
|
||||
return B_OK;
|
||||
|
||||
case SO_RCVLOWAT:
|
||||
// TODO: see above (SO_SNDBUF)
|
||||
if (length != sizeof(uint32))
|
||||
return B_BAD_VALUE;
|
||||
|
||||
@@ -1057,6 +1058,23 @@ socket_setsockopt(net_socket *socket, int level, int option, const void *value,
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
socket_setsockopt(net_socket *socket, int level, int option, const void *value,
|
||||
int length)
|
||||
{
|
||||
status_t status = (level == SOL_SOCKET) ? B_OK : B_BAD_VALUE;
|
||||
|
||||
if (socket->first_info->setsockopt)
|
||||
status = socket->first_info->setsockopt(socket->first_protocol, level,
|
||||
option, value, length);
|
||||
|
||||
if (status < B_OK)
|
||||
return status;
|
||||
|
||||
return socket_set_option(socket, option, value, length);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
socket_shutdown(net_socket *socket, int direction)
|
||||
{
|
||||
@@ -1111,6 +1129,9 @@ net_socket_module_info gNetSocketModule = {
|
||||
socket_send_data,
|
||||
socket_receive_data,
|
||||
|
||||
socket_get_option,
|
||||
socket_set_option,
|
||||
|
||||
socket_get_next_stat,
|
||||
|
||||
// connections
|
||||
|
||||
Reference in New Issue
Block a user