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);