From a0a553caa3d17608dcda994338aa3f8ca81cb674 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Tue, 8 May 2007 15:38:33 +0000 Subject: [PATCH] tcp: allow TCP_NODELAY to be set git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21069 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../network/protocols/tcp/TCPEndpoint.cpp | 21 +++++++++++++++++++ .../network/protocols/tcp/TCPEndpoint.h | 2 ++ .../kernel/network/protocols/tcp/tcp.cpp | 3 ++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index 5da10c6070..8f6b90925b 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -724,6 +724,27 @@ TCPEndpoint::SetReceiveBufferSize(size_t length) } +status_t +TCPEndpoint::SetOption(int option, const void *_value, int length) +{ + if (option != TCP_NODELAY) + return B_BAD_VALUE; + + if (length != sizeof(int)) + return B_BAD_VALUE; + + const int *value = (const int *)_value; + + RecursiveLocker _(fLock); + if (*value) + fOptions |= TCP_NODELAY; + else + fOptions &= ~TCP_NODELAY; + + return B_OK; +} + + // #pragma mark - misc diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h index a50fb68bf2..a10409195a 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h @@ -67,6 +67,8 @@ class TCPEndpoint : public net_protocol, public ProtocolSocket { status_t SetSendBufferSize(size_t length); status_t SetReceiveBufferSize(size_t length); + status_t SetOption(int option, const void *value, int length); + tcp_state State() const { return fState; } bool IsBound() const; diff --git a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp index f827850039..15fb7e3e74 100644 --- a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp @@ -489,7 +489,8 @@ tcp_setsockopt(net_protocol *_protocol, int level, int option, if (status < B_OK) return status; } - } + } else if (level == IPPROTO_TCP) + return protocol->SetOption(option, _value, length); return protocol->next->module->setsockopt(protocol->next, level, option, _value, length);