From 2914fea53080aa38c678edaef9edf3c9cf6b525c Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Fri, 15 Mar 2019 14:35:54 +0100 Subject: Fix propagating the KNXnet/IP TCP control and data endpoint * In case we are using a TCP connection, we always need to send the route back endpoint (that basically signals the server to use the established TCP connection to send the packages). Change-Id: If7c42e482e043d0f57ee6fabacd08d7159e5b2c4 Reviewed-by: Sona Kurazyan Reviewed-by: Karsten Heimrich --- src/knx/netip/qknxnetipendpointconnection.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/knx/netip/qknxnetipendpointconnection.cpp b/src/knx/netip/qknxnetipendpointconnection.cpp index 679f457..e4c7c00 100644 --- a/src/knx/netip/qknxnetipendpointconnection.cpp +++ b/src/knx/netip/qknxnetipendpointconnection.cpp @@ -419,14 +419,15 @@ QKnxNetIp::ServiceType m_secureTimer->stop(); m_secureTimer->disconnect(); m_waitForAuthentication = false; + auto ep = (m_tcpSocket ? m_routeBack : (m_nat ? m_routeBack : m_localEndpoint)); auto secureWrapper = QKnxNetIpSecureWrapperProxy::secureBuilder() .setSecureSessionId(m_sessionId) .setSequenceNumber(m_sequenceNumber) .setSerialNumber(m_serialNumber) // .setMessageTag(0x0000) TODO: Do we need an API for this? .setEncapsulatedFrame(QKnxNetIpConnectRequestProxy::builder() - .setControlEndpoint(m_nat ? m_routeBack : m_localEndpoint) - .setDataEndpoint(m_nat ? m_routeBack : m_localEndpoint) + .setControlEndpoint(ep) + .setDataEndpoint(ep) .setRequestInformation(m_cri) .create()) .create(QKnxCryptographicEngine::sessionKey(m_secureConfig.d->privateKey, @@ -927,7 +928,9 @@ void QKnxNetIpEndpointConnectionPrivate::processConnectResponse(const QKnxNetIpF m_remoteDataEndpoint = response.dataEndpoint(); m_lastStateRequest = QKnxNetIpConnectionStateRequestProxy::builder() .setChannelId(m_channelId) - .setControlEndpoint(m_nat ? m_routeBack : m_localEndpoint) + .setControlEndpoint( + m_tcpSocket ? m_routeBack : (m_nat ? m_routeBack : m_localEndpoint) + ) .create(); QTimer::singleShot(0, [&]() { sendStateRequest(); }); -- cgit v1.2.3