Skip to content

Commit

Permalink
Minor fixes in TCP Disconnect to simplify the logic. (project-chip#34142
Browse files Browse the repository at this point in the history
)

Use the available IPAddress and port info in the member PeerAddress in
the ActiveConnection object to compare with the passed PeerAddress
instead of calling GetPeerInfo() from within TCPEndPoint to fetch
those.

Log the connection closure in the CloseConnectionInternal function
which is also called by CloseActiveConnections() from the TCPBase
destructor.
  • Loading branch information
pidarped authored Jul 3, 2024
1 parent ee0d96e commit fa25673
Showing 1 changed file with 12 additions and 24 deletions.
36 changes: 12 additions & 24 deletions src/transport/raw/TCP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,10 @@ void TCPBase::CloseConnectionInternal(ActiveTCPConnectionState * connection, CHI

if (connection->mConnectionState != TCPState::kClosed && connection->mEndPoint)
{
char addrStr[Transport::PeerAddress::kMaxToStringSize];
connection->mPeerAddr.ToString(addrStr);
ChipLogProgress(Inet, "Closing connection with peer %s.", addrStr);

if (err == CHIP_NO_ERROR)
{
connection->mEndPoint->Close();
Expand Down Expand Up @@ -616,36 +620,20 @@ CHIP_ERROR TCPBase::TCPConnect(const PeerAddress & address, Transport::AppTCPCon

void TCPBase::TCPDisconnect(const PeerAddress & address)
{
CHIP_ERROR err = CHIP_NO_ERROR;
// Closes an existing connection
for (size_t i = 0; i < mActiveConnectionsSize; i++)
{
if (mActiveConnections[i].IsConnected())
{
Inet::IPAddress ipAddress;
uint16_t port;
Inet::InterfaceId interfaceId;

err = mActiveConnections[i].mEndPoint->GetPeerInfo(&ipAddress, &port);
if (err != CHIP_NO_ERROR)
{
ChipLogError(Inet, "TCPDisconnect: GetPeerInfo error: %" CHIP_ERROR_FORMAT, err.Format());
return;
}

err = mActiveConnections[i].mEndPoint->GetInterfaceId(&interfaceId);
if (err != CHIP_NO_ERROR)
const Inet::IPAddress & ipAddress = mActiveConnections[i].mPeerAddr.GetIPAddress();
uint16_t port = mActiveConnections[i].mPeerAddr.GetPort();

// Ignoring the InterfaceID in the check as it may not have been provided in
// the PeerAddress during connection establishment. The IPAddress and Port
// are the necessary and sufficient set of parameters for searching
// through the connections.
if (ipAddress == address.GetIPAddress() && port == address.GetPort() && address.GetTransportType() == Type::kTcp)
{
ChipLogError(Inet, "TCPDisconnect: GetInterfaceId error: %" CHIP_ERROR_FORMAT, err.Format());
return;
}
// if (address == PeerAddress::TCP(ipAddress, port, interfaceId))
if (ipAddress == address.GetIPAddress() && port == address.GetPort())
{
char addrStr[Transport::PeerAddress::kMaxToStringSize];
address.ToString(addrStr);
ChipLogProgress(Inet, "Disconnecting with peer %s.", addrStr);

// NOTE: this leaves the socket in TIME_WAIT.
// Calling Abort() would clean it since SO_LINGER would be set to 0,
// however this seems not to be useful.
Expand Down

0 comments on commit fa25673

Please sign in to comment.