summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2019-05-07 13:09:46 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2019-05-07 13:11:09 +0200
commit3cc7b8754ddf4e17eda9f829c1d6daaab62ec3f4 (patch)
tree300dca75e7b69087ac9bd816cb8d0cc474bd1d92
parentda8a658ae5d021ecd86ee895bd243b52d48d7b69 (diff)
Make sure we properly shutdown a secure session
Change-Id: I7525139c1a589cb1feed3102ef7ed2709da587ac Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/knx/netip/qknxnetipendpointconnection.cpp28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/knx/netip/qknxnetipendpointconnection.cpp b/src/knx/netip/qknxnetipendpointconnection.cpp
index 51786ee..dfc6501 100644
--- a/src/knx/netip/qknxnetipendpointconnection.cpp
+++ b/src/knx/netip/qknxnetipendpointconnection.cpp
@@ -633,6 +633,20 @@ void QKnxNetIpEndpointConnectionPrivate::cleanup()
m_udpSocket->close();
QKnxPrivate::clearSocket(&m_udpSocket);
} else if (m_tcpSocket) {
+ if (m_secureConfig.isValid()) {
+ auto secureStatusWrapper = QKnxNetIpSecureWrapperProxy::secureBuilder()
+ .setSecureSessionId(m_sessionId)
+ .setSequenceNumber(m_sequenceNumber)
+ .setSerialNumber(m_serialNumber)
+ // .setMessageTag(0x0000) TODO: Do we need an API for this?
+ .setEncapsulatedFrame(QKnxNetIpSessionStatusProxy::builder()
+ .setStatus(QKnxNetIp::SecureSessionStatus::Close)
+ .create())
+ .create(m_sessionKey);
+ ++m_sequenceNumber;
+ m_tcpSocket->write(secureStatusWrapper.bytes().toByteArray());
+ m_tcpSocket->waitForBytesWritten();
+ }
m_tcpSocket->close();
QKnxPrivate::clearSocket(&m_tcpSocket);
}
@@ -1419,7 +1433,19 @@ void QKnxNetIpEndpointConnection::disconnectFromHost()
qDebug() << "Sending disconnect request:" << frame;
if (d->m_tcpSocket) {
- d->m_tcpSocket->write(frame.bytes().toByteArray());
+ if (d->m_secureConfig.isValid()) {
+ auto secureFrame = QKnxNetIpSecureWrapperProxy::secureBuilder()
+ .setSecureSessionId(d->m_sessionId)
+ .setSequenceNumber(d->m_sequenceNumber)
+ .setSerialNumber(d->m_serialNumber)
+ // .setMessageTag(0x0000) TODO: Do we need an API for this?
+ .setEncapsulatedFrame(frame)
+ .create(d->m_sessionKey);
+ ++(d->m_sequenceNumber);
+ d->m_tcpSocket->write(secureFrame.bytes().toByteArray());
+ } else {
+ d->m_tcpSocket->write(frame.bytes().toByteArray());
+ }
} else {
d->m_udpSocket->writeDatagram(frame.bytes().toByteArray(),
d->m_remoteControlEndpoint.address, d->m_remoteControlEndpoint.port);