From cf5d9f4b8d5ecfccb07ded3eee4c3af0e11c53b6 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Sun, 29 Apr 2007 19:03:06 +0000 Subject: [PATCH] added 'udp_endpoints' debugger command. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20908 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/net/AddressUtilities.h | 12 ++++++ headers/private/net/net_datalink.h | 2 + .../network/protocols/ipv4/ipv4_address.cpp | 33 +++++++++----- .../kernel/network/protocols/udp/udp.cpp | 43 ++++++++++++++++++- 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/headers/private/net/AddressUtilities.h b/headers/private/net/AddressUtilities.h index d65f3b721a..294702ad7a 100644 --- a/headers/private/net/AddressUtilities.h +++ b/headers/private/net/AddressUtilities.h @@ -109,6 +109,12 @@ public: return AddressString(fModule, fAddress, printPort); } + const char *AsString(char *buffer, size_t bufferSize, + bool printPort = false) const { + fModule->print_address_buffer(fAddress, buffer, bufferSize, printPort); + return buffer; + } + const sockaddr *operator *() const { return fAddress; } sockaddr *operator *() { return fAddress; } @@ -188,6 +194,12 @@ public: return AddressString(fModule, fAddress, printPort); } + const char *AsString(char *buffer, size_t bufferSize, + bool printPort = false) const { + fModule->print_address_buffer(fAddress, buffer, bufferSize, printPort); + return buffer; + } + const sockaddr *operator *() const { return fAddress; } private: diff --git a/headers/private/net/net_datalink.h b/headers/private/net/net_datalink.h index 868575a2cb..12dfef514b 100644 --- a/headers/private/net/net_datalink.h +++ b/headers/private/net/net_datalink.h @@ -118,6 +118,8 @@ struct net_address_module_info { status_t (*print_address)(const sockaddr *address, char **buffer, bool printPort); + status_t (*print_address_buffer)(const sockaddr *address, char *buffer, + size_t bufferSize, bool printPort); uint16 (*get_port)(const sockaddr *address); status_t (*set_port)(sockaddr *address, uint16 port); diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp index e9cc2b297b..ca07a517b8 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp +++ b/src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp @@ -251,35 +251,45 @@ ipv4_check_mask(const sockaddr *_mask) \return B_NO_MEMORY if the buffer could not be allocated */ static status_t -ipv4_print_address(const sockaddr *_address, char **_buffer, bool printPort) +ipv4_print_address_buffer(const sockaddr *_address, char *buffer, + size_t bufferSize, bool printPort) { const sockaddr_in *address = (const sockaddr_in *)_address; - if (_buffer == NULL) + if (buffer == NULL) return B_BAD_VALUE; - char tmp[64]; - if (address == NULL) - strcpy(tmp, ""); + strlcpy(buffer, "", bufferSize); else { unsigned int addr = ntohl(address->sin_addr.s_addr); if (printPort) - sprintf(tmp, "%u.%u.%u.%u:%u", (addr >> 24) & 0xff, - (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff, - ntohs(address->sin_port)); + snprintf(buffer, bufferSize, "%u.%u.%u.%u:%u", + (addr >> 24) & 0xff, (addr >> 16) & 0xff, (addr >> 8) & 0xff, + addr & 0xff, ntohs(address->sin_port)); else - sprintf(tmp, "%u.%u.%u.%u", (addr >> 24) & 0xff, + snprintf(buffer, bufferSize, "%u.%u.%u.%u", (addr >> 24) & 0xff, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); } + return B_OK; +} + + +static status_t +ipv4_print_address(const sockaddr *_address, char **_buffer, bool printPort) +{ + if (_buffer == NULL) + return B_BAD_VALUE; + + char tmp[64]; + ipv4_print_address_buffer(_address, tmp, sizeof(tmp), printPort); + *_buffer = strdup(tmp); if (*_buffer == NULL) return B_NO_MEMORY; - - return B_OK; } @@ -426,6 +436,7 @@ net_address_module_info gIPv4AddressModule = { ipv4_first_mask_bit, ipv4_check_mask, ipv4_print_address, + ipv4_print_address_buffer, ipv4_get_port, ipv4_set_port, ipv4_set_to, diff --git a/src/add-ons/kernel/network/protocols/udp/udp.cpp b/src/add-ons/kernel/network/protocols/udp/udp.cpp index a1d2fedcf6..25dddea380 100644 --- a/src/add-ons/kernel/network/protocols/udp/udp.cpp +++ b/src/add-ons/kernel/network/protocols/udp/udp.cpp @@ -168,8 +168,7 @@ public: status_t ConnectEndpoint(UdpEndpoint *endpoint, const sockaddr *address); status_t UnbindEndpoint(UdpEndpoint *endpoint); - status_t ActivateEndpoint(UdpEndpoint *endpoint); - status_t DeactivateEndpoint(UdpEndpoint *endpoint); + void DumpEndpoints() const; private: status_t _BindEndpoint(UdpEndpoint *endpoint, const sockaddr *address); @@ -220,6 +219,8 @@ public: status_t InitCheck() const; + static int DumpEndpoints(int argc, char *argv[]); + private: UdpDomainSupport *_GetDomain(net_domain *domain, bool create); @@ -337,6 +338,27 @@ UdpDomainSupport::UnbindEndpoint(UdpEndpoint *endpoint) } +void +UdpDomainSupport::DumpEndpoints() const +{ + kprintf("-------- UDP Domain %p ---------\n", this); + kprintf("%10s %20s %20s %8s\n", "address", "local", "peer", "recv-q"); + + EndpointTable::Iterator it = fActiveEndpoints.GetIterator(); + + while (it.HasNext()) { + UdpEndpoint *endpoint = it.Next(); + + char localBuf[64], peerBuf[64]; + endpoint->LocalAddress().AsString(localBuf, sizeof(localBuf), true); + endpoint->PeerAddress().AsString(peerBuf, sizeof(peerBuf), true); + + kprintf("%p %20s %20s %8lu\n", endpoint, localBuf, peerBuf, + endpoint->AvailableData()); + } +} + + status_t UdpDomainSupport::_BindEndpoint(UdpEndpoint *endpoint, const sockaddr *address) @@ -580,6 +602,18 @@ UdpEndpointManager::InitCheck() const } +int +UdpEndpointManager::DumpEndpoints(int argc, char *argv[]) +{ + UdpDomainList::Iterator it = sUdpEndpointManager->fDomains.GetIterator(); + + while (it.HasNext()) + it.Next()->DumpEndpoints(); + + return 0; +} + + // #pragma mark - inbound @@ -1127,6 +1161,9 @@ init_udp() if (status < B_OK) goto err1; + add_debugger_command("udp_endpoints", UdpEndpointManager::DumpEndpoints, + "lists all open UDP endpoints"); + return B_OK; err1: @@ -1141,6 +1178,8 @@ static status_t uninit_udp() { TRACE_EPM("uninit_udp()"); + remove_debugger_command("udp_endpoints", + UdpEndpointManager::DumpEndpoints); delete sUdpEndpointManager; return B_OK; }