diff --git a/headers/private/net/net_stat.h b/headers/private/net/net_stat.h index c3af64054f..bcbb75940b 100644 --- a/headers/private/net/net_stat.h +++ b/headers/private/net/net_stat.h @@ -21,8 +21,10 @@ typedef struct net_stat { int protocol; char state[B_OS_NAME_LENGTH]; team_id owner; - struct sockaddr_storage address; - struct sockaddr_storage peer; + struct sockaddr_storage address; + struct sockaddr_storage peer; + size_t receive_queue_size; + size_t send_queue_size; } net_stat; #endif // NET_STAT_H diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index 87a278b6a4..ad52100e1c 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -586,6 +587,19 @@ TCPEndpoint::SendAvailable() } +status_t +TCPEndpoint::FillStat(net_stat *stat) +{ + RecursiveLocker _(fLock); + + strlcpy(stat->state, name_for_state(fState), sizeof(stat->state)); + stat->receive_queue_size = fReceiveQueue.Available(); + stat->send_queue_size = fSendQueue.Used(); + + return B_OK; +} + + status_t TCPEndpoint::ReadData(size_t numBytes, uint32 flags, net_buffer** _buffer) { diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h index 14e4c6e96a..c6cd787f8d 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h @@ -60,6 +60,8 @@ class TCPEndpoint : public net_protocol { status_t ReadData(size_t numBytes, uint32 flags, net_buffer **_buffer); ssize_t ReadAvailable(); + status_t FillStat(struct net_stat *stat); + status_t SetSendBufferSize(size_t length); status_t SetReceiveBufferSize(size_t length); diff --git a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp index 71ee0d2159..d842ab33dc 100644 --- a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp @@ -457,12 +457,8 @@ tcp_control(net_protocol *_protocol, int level, int option, void *value, TCPEndpoint *protocol = (TCPEndpoint *)_protocol; if ((level & LEVEL_MASK) == IPPROTO_TCP) { - if (option == NET_STAT_SOCKET) { - net_stat *stat = (net_stat *)value; - strlcpy(stat->state, name_for_state(protocol->State()), - sizeof(stat->state)); - return B_OK; - } + if (option == NET_STAT_SOCKET) + return protocol->FillStat((net_stat *)value); } return protocol->next->module->control(protocol->next, level, option, diff --git a/src/add-ons/kernel/network/stack/net_socket.cpp b/src/add-ons/kernel/network/stack/net_socket.cpp index 0d98905f4d..bcad5ec1f1 100644 --- a/src/add-ons/kernel/network/stack/net_socket.cpp +++ b/src/add-ons/kernel/network/stack/net_socket.cpp @@ -274,6 +274,8 @@ socket_get_next_stat(uint32 *_cookie, int family, struct net_stat *stat) stat->state[0] = '\0'; memcpy(&stat->address, &socket->address, sizeof(struct sockaddr_storage)); memcpy(&stat->peer, &socket->peer, sizeof(struct sockaddr_storage)); + stat->receive_queue_size = 0; + stat->send_queue_size = 0; // fill in protocol specific data (if supported by the protocol) size_t length = sizeof(net_stat); diff --git a/src/bin/network/netstat/netstat.cpp b/src/bin/network/netstat/netstat.cpp index 526e0f3e52..f16bb940c5 100644 --- a/src/bin/network/netstat/netstat.cpp +++ b/src/bin/network/netstat/netstat.cpp @@ -55,7 +55,7 @@ inet_print_address(sockaddr* _address) sockaddr_in& address = *(sockaddr_in *)_address; if (address.sin_family != AF_INET || address.sin_len == 0) { - printf("%-30s", "-"); + printf("%-22s", "-"); return; } @@ -83,7 +83,7 @@ inet_print_address(sockaddr* _address) snprintf(buffer + length, sizeof(buffer) - length, ":%s", port); - printf("%-30s", buffer); + printf("%-22s", buffer); } @@ -153,7 +153,7 @@ main(int argc, char** argv) bool printProgram = true; // TODO: add some program options... :-) - printf("Proto Local Address Foreign Address State Program\n"); + printf("Proto Recv-Q Send-Q Local Address Foreign Address State Program\n"); uint32 cookie = 0; int family = -1; @@ -165,6 +165,9 @@ main(int argc, char** argv) else printf("%-6d ", stat.protocol); + printf("%6lu ", stat.receive_queue_size); + printf("%6lu ", stat.send_queue_size); + inet_print_address((sockaddr*)&stat.address); inet_print_address((sockaddr*)&stat.peer); printf("%-12s ", stat.state);