diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index 9614349033..afa8650911 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -906,7 +906,33 @@ TCPEndpoint::SetReceiveBufferSize(size_t length) status_t -TCPEndpoint::SetOption(int option, const void *_value, int length) +TCPEndpoint::GetOption(int option, void* _value, int* _length) +{ + if (*_length != sizeof(int)) + return B_BAD_VALUE; + + int* value = (int*)_value; + + switch (option) { + case TCP_NODELAY: + if ((fOptions & TCP_NODELAY) != 0) + *value = 1; + else + *value = 0; + return B_OK; + + case TCP_MAXSEG: + *value = fReceiveMaxSegmentSize; + return B_OK; + + default: + return B_BAD_VALUE; + } +} + + +status_t +TCPEndpoint::SetOption(int option, const void* _value, int length) { if (option != TCP_NODELAY) return B_BAD_VALUE; @@ -914,7 +940,7 @@ TCPEndpoint::SetOption(int option, const void *_value, int length) if (length != sizeof(int)) return B_BAD_VALUE; - const int *value = (const int *)_value; + const int* value = (const int*)_value; MutexLocker _(fLock); if (*value) diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h index 1a1ec7a2a8..2fb8bb67b1 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h @@ -68,6 +68,7 @@ public: status_t SetSendBufferSize(size_t length); status_t SetReceiveBufferSize(size_t length); + status_t GetOption(int option, void* value, int* _length); status_t SetOption(int option, const void* value, int length); tcp_state State() const { return fState; } diff --git a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp index d98e1097e1..69a472f0bf 100644 --- a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp @@ -334,7 +334,7 @@ name_for_state(tcp_state state) case TIME_WAIT: return "time-wait"; } - + return "-"; } @@ -507,7 +507,9 @@ tcp_getsockopt(net_protocol *_protocol, int level, int option, void *value, { TCPEndpoint *protocol = (TCPEndpoint *)_protocol; - /* TODO getting IPPROTO_TCP options is missing */ + if (level == IPPROTO_TCP) + return protocol->GetOption(option, value, _length); + return protocol->next->module->getsockopt(protocol->next, level, option, value, _length); }