From 4b17189cc86b7a2012181eaf9f04941d2300d0a1 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Wed, 5 Jun 2019 14:00:24 +0200 Subject: Fix typo Change-Id: I06afbe1ba090becfad7620e5bd8deaac35c9f030 Reviewed-by: Maurice Kalinowski --- examples/knx/discoverer/main.cpp | 4 ++-- examples/knx/knxeditor/mainwindow.cpp | 6 +++--- .../tst_qknxnetipdescriptionresponse.cpp | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/knx/discoverer/main.cpp b/examples/knx/discoverer/main.cpp index cce5a52..3cf564b 100644 --- a/examples/knx/discoverer/main.cpp +++ b/examples/knx/discoverer/main.cpp @@ -58,7 +58,7 @@ #include -static QString familieToString(QKnxNetIp::ServiceFamily id) +static QString familyToString(QKnxNetIp::ServiceFamily id) { switch (id) { case QKnxNetIp::ServiceFamily::Core: @@ -214,7 +214,7 @@ int main(int argc, char *argv[]) qInfo().noquote() << QString::fromLatin1(" Supported services:"); for (const auto service : services) { qInfo().noquote() << QString::fromLatin1(" KNXnet/IP %1, Version: %2") - .arg(familieToString(service.ServiceFamily)).arg(service.ServiceFamilyVersion); + .arg(familyToString(service.ServiceFamily)).arg(service.ServiceFamilyVersion); } const auto dib = server.extendedHardware(); diff --git a/examples/knx/knxeditor/mainwindow.cpp b/examples/knx/knxeditor/mainwindow.cpp index a06abd5..c967ca2 100644 --- a/examples/knx/knxeditor/mainwindow.cpp +++ b/examples/knx/knxeditor/mainwindow.cpp @@ -60,7 +60,7 @@ Ui::MainWindow *MainWindow::s_ui { nullptr }; -static QString familieToString(QKnxNetIp::ServiceFamily id) +static QString familyToString(QKnxNetIp::ServiceFamily id) { switch (id) { case QKnxNetIp::ServiceFamily::Core: @@ -201,7 +201,7 @@ void MainWindow::newServerSelected(int serverBoxIndex) const auto services = info.supportedServices(); for (const auto &service : services) { value.append(tr("%1") - .arg(tr("KNXnet/IP %1, Version: %2").arg(familieToString(service.ServiceFamily)) + .arg(tr("KNXnet/IP %1, Version: %2").arg(familyToString(service.ServiceFamily)) .arg(service.ServiceFamilyVersion))); if (service.ServiceFamilyVersion >= 2) version2Supported = true; @@ -263,7 +263,7 @@ void MainWindow::showServerAndServices(const QKnxNetIpServerInfo &info) const auto services = info.supportedServices(); for (const auto service : services) { ui->outputEdit->append(tr(" KNXnet/IP %1, Version: %2") - .arg(familieToString(service.ServiceFamily)).arg(service.ServiceFamilyVersion)); + .arg(familyToString(service.ServiceFamily)).arg(service.ServiceFamilyVersion)); } ui->serverBox->addItem(tr("%1 (%2:%3)").arg(info.deviceName(), info.controlEndpointAddress() diff --git a/tests/auto/qknxnetipdescriptionresponse/tst_qknxnetipdescriptionresponse.cpp b/tests/auto/qknxnetipdescriptionresponse/tst_qknxnetipdescriptionresponse.cpp index bfa5a85..e1a863a 100644 --- a/tests/auto/qknxnetipdescriptionresponse/tst_qknxnetipdescriptionresponse.cpp +++ b/tests/auto/qknxnetipdescriptionresponse/tst_qknxnetipdescriptionresponse.cpp @@ -156,15 +156,15 @@ void tst_QKnxNetIpDescriptionResponse::testSupportedFamiliesAccessor() .create(); QKnxNetIpDescriptionResponseProxy descriptionResponse(frame); - auto familie = descriptionResponse.supportedFamilies(); - const QKnxNetIpServiceFamiliesDibProxy view(familie); + auto family = descriptionResponse.supportedFamilies(); + const QKnxNetIpServiceFamiliesDibProxy view(family); QCOMPARE(view.isValid(), m_sf.isValid()); QCOMPARE(view.descriptionType(), QKnxNetIpServiceFamiliesDibProxy(m_sf).descriptionType()); - QCOMPARE(familie.size(), m_sf.size()); - QCOMPARE(familie.bytes(), m_sf.bytes()); - QCOMPARE(familie.data().size(), m_sf.data().size()); - QCOMPARE(familie.data(), m_sf.data()); + QCOMPARE(family.size(), m_sf.size()); + QCOMPARE(family.bytes(), m_sf.bytes()); + QCOMPARE(family.data().size(), m_sf.data().size()); + QCOMPARE(family.data(), m_sf.data()); } void tst_QKnxNetIpDescriptionResponse::testSupportedFamiliesVersions() -- cgit v1.2.3 From b155be29dd6370ec1abb88bdcb67524a4ba5a116 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Thu, 9 May 2019 12:37:47 +0200 Subject: Fix missing discoverer update on network interface change Change-Id: I13c4033468dd2947111f150775f5208e1c0e53e7 Reviewed-by: Maurice Kalinowski --- examples/knx/device/mainwindow.cpp | 8 ++++++++ examples/knx/feature/mainwindow.cpp | 8 ++++++++ examples/knx/group/mainwindow.cpp | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/examples/knx/device/mainwindow.cpp b/examples/knx/device/mainwindow.cpp index 429b578..7c00e04 100644 --- a/examples/knx/device/mainwindow.cpp +++ b/examples/knx/device/mainwindow.cpp @@ -303,6 +303,14 @@ void MainWindow::setupInterfaces() } } ui->interfaces->setCurrentIndex(bool(ui->interfaces->count())); + + connect(ui->interfaces, QOverload::of(&QComboBox::currentIndexChanged), this, [&](int i) { + if (i < 0) + return; + m_discoveryAgent.stop(); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + m_discoveryAgent.start(); + }); } void MainWindow::toggleUi(bool value) diff --git a/examples/knx/feature/mainwindow.cpp b/examples/knx/feature/mainwindow.cpp index 094baab..6e62614 100644 --- a/examples/knx/feature/mainwindow.cpp +++ b/examples/knx/feature/mainwindow.cpp @@ -272,6 +272,14 @@ void MainWindow::setupInterfaces() } } ui->interfaces->setCurrentIndex(bool(ui->interfaces->count())); + + connect(ui->interfaces, QOverload::of(&QComboBox::currentIndexChanged), this, [&](int i) { + if (i < 0) + return; + m_discoveryAgent.stop(); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + m_discoveryAgent.start(); + }); } void MainWindow::toggleUi(bool value) diff --git a/examples/knx/group/mainwindow.cpp b/examples/knx/group/mainwindow.cpp index 40b899a..6cef3ef 100644 --- a/examples/knx/group/mainwindow.cpp +++ b/examples/knx/group/mainwindow.cpp @@ -280,6 +280,14 @@ void MainWindow::setupInterfaces() } } ui->interfaces->setCurrentIndex(bool(ui->interfaces->count())); + + connect(ui->interfaces, QOverload::of(&QComboBox::currentIndexChanged), this, [&](int i) { + if (i < 0) + return; + m_discoveryAgent.stop(); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + m_discoveryAgent.start(); + }); } void MainWindow::toggleUi(bool value) -- cgit v1.2.3 From a73868f60813ead430b4ded01bb1f998240a3111 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Thu, 9 May 2019 13:08:18 +0200 Subject: Set the serial number (MAC address) for the interface in use Change-Id: I653db24390cc6278c8d09570eb1c729d54d23afa Reviewed-by: Maurice Kalinowski Reviewed-by: Karsten Heimrich --- examples/knx/device/mainwindow.cpp | 14 +++++++++----- examples/knx/feature/mainwindow.cpp | 14 +++++++++----- examples/knx/group/mainwindow.cpp | 14 +++++++++----- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/examples/knx/device/mainwindow.cpp b/examples/knx/device/mainwindow.cpp index 7c00e04..62e2c25 100644 --- a/examples/knx/device/mainwindow.cpp +++ b/examples/knx/device/mainwindow.cpp @@ -265,7 +265,9 @@ void MainWindow::on_connection_clicked() if (m_management.state() == QKnxNetIpTunnel::State::Connected) return m_management.disconnectFromHost(); - m_management.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + const auto list = ui->interfaces->currentData().toStringList(); + m_management.setLocalAddress(QHostAddress(list.first())); + m_management.setSerialNumber(QKnxByteArray::fromHex(list.last().toLatin1())); m_last = new QTreeWidgetItem(ui->communication, m_last); m_last->setText(0, tr("Establish connection to: %1 (%2 : %3)") @@ -293,13 +295,14 @@ void MainWindow::setupInterfaces() firstItem->setSelectable(false); const auto interfaces = QNetworkInterface::allInterfaces(); - for (int i = 0; i < interfaces.size(); i++) { - const auto addressEntries = interfaces[i].addressEntries(); + for (const auto &iface : interfaces) { + const auto addressEntries = iface.addressEntries(); for (int j = 0; j < addressEntries.size(); j++) { const auto ip = addressEntries[j].ip(); if (ip.isLoopback() || ip.toIPv4Address() == 0) continue; - ui->interfaces->addItem(interfaces[i].name() + ": " + ip.toString(), ip.toString()); + ui->interfaces->addItem(iface.name() + ": " + ip.toString(), + QStringList { ip.toString(), iface.hardwareAddress().remove(QLatin1Literal(":")) }); } } ui->interfaces->setCurrentIndex(bool(ui->interfaces->count())); @@ -308,7 +311,8 @@ void MainWindow::setupInterfaces() if (i < 0) return; m_discoveryAgent.stop(); - m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData() + .toStringList().first())); m_discoveryAgent.start(); }); } diff --git a/examples/knx/feature/mainwindow.cpp b/examples/knx/feature/mainwindow.cpp index 6e62614..fd36832 100644 --- a/examples/knx/feature/mainwindow.cpp +++ b/examples/knx/feature/mainwindow.cpp @@ -234,7 +234,9 @@ void MainWindow::on_connection_clicked() if (m_tunnel.state() == QKnxNetIpTunnel::State::Connected) return m_tunnel.disconnectFromHost(); - m_tunnel.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + const auto list = ui->interfaces->currentData().toStringList(); + m_tunnel.setLocalAddress(QHostAddress(list.first())); + m_tunnel.setSerialNumber(QKnxByteArray::fromHex(list.last().toLatin1())); m_last = new QTreeWidgetItem(ui->communication, m_last); m_last->setText(0, tr("Establish connection to: %1 (%2 : %3)") @@ -262,13 +264,14 @@ void MainWindow::setupInterfaces() firstItem->setSelectable(false); const auto interfaces = QNetworkInterface::allInterfaces(); - for (int i = 0; i < interfaces.size(); i++) { - const auto addressEntries = interfaces[i].addressEntries(); + for (const auto &iface : interfaces) { + const auto addressEntries = iface.addressEntries(); for (int j = 0; j < addressEntries.size(); j++) { const auto ip = addressEntries[j].ip(); if (ip.isLoopback() || ip.toIPv4Address() == 0) continue; - ui->interfaces->addItem(interfaces[i].name() + ": " + ip.toString(), ip.toString()); + ui->interfaces->addItem(iface.name() + ": " + ip.toString(), + QStringList { ip.toString(), iface.hardwareAddress().remove(QLatin1Literal(":")) }); } } ui->interfaces->setCurrentIndex(bool(ui->interfaces->count())); @@ -277,7 +280,8 @@ void MainWindow::setupInterfaces() if (i < 0) return; m_discoveryAgent.stop(); - m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData() + .toStringList().first())); m_discoveryAgent.start(); }); } diff --git a/examples/knx/group/mainwindow.cpp b/examples/knx/group/mainwindow.cpp index 6cef3ef..e7182f7 100644 --- a/examples/knx/group/mainwindow.cpp +++ b/examples/knx/group/mainwindow.cpp @@ -242,7 +242,9 @@ void MainWindow::on_connection_clicked() if (m_tunnel.state() == QKnxNetIpTunnel::State::Connected) return m_tunnel.disconnectFromHost(); - m_tunnel.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + const auto list = ui->interfaces->currentData().toStringList(); + m_tunnel.setLocalAddress(QHostAddress(list.first())); + m_tunnel.setSerialNumber(QKnxByteArray::fromHex(list.last().toLatin1())); m_last = new QTreeWidgetItem(ui->communication, m_last); m_last->setText(0, tr("Establish connection to: %1 (%2 : %3)") @@ -270,13 +272,14 @@ void MainWindow::setupInterfaces() firstItem->setSelectable(false); const auto interfaces = QNetworkInterface::allInterfaces(); - for (int i = 0; i < interfaces.size(); i++) { - const auto addressEntries = interfaces[i].addressEntries(); + for (const auto &iface : interfaces) { + const auto addressEntries = iface.addressEntries(); for (int j = 0; j < addressEntries.size(); j++) { const auto ip = addressEntries[j].ip(); if (ip.isLoopback() || ip.toIPv4Address() == 0) continue; - ui->interfaces->addItem(interfaces[i].name() + ": " + ip.toString(), ip.toString()); + ui->interfaces->addItem(iface.name() + ": " + ip.toString(), + QStringList { ip.toString(), iface.hardwareAddress().remove(QLatin1Literal(":")) }); } } ui->interfaces->setCurrentIndex(bool(ui->interfaces->count())); @@ -285,7 +288,8 @@ void MainWindow::setupInterfaces() if (i < 0) return; m_discoveryAgent.stop(); - m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData().toString())); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData() + .toStringList().first())); m_discoveryAgent.start(); }); } -- cgit v1.2.3 From da8a658ae5d021ecd86ee895bd243b52d48d7b69 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Mon, 6 May 2019 16:11:05 +0200 Subject: Fix using wrong index into secure configuration list Change-Id: Ifa36b43d62272faa83286d4de11f231536a109d8 Reviewed-by: Maurice Kalinowski Reviewed-by: Karsten Heimrich --- examples/knx/device/mainwindow.cpp | 2 +- examples/knx/feature/mainwindow.cpp | 3 +-- examples/knx/group/mainwindow.cpp | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/knx/device/mainwindow.cpp b/examples/knx/device/mainwindow.cpp index 62e2c25..f7f9ba4 100644 --- a/examples/knx/device/mainwindow.cpp +++ b/examples/knx/device/mainwindow.cpp @@ -277,7 +277,7 @@ void MainWindow::on_connection_clicked() m_last->setFirstColumnSpanned(true); if (ui->secureSession->isChecked()) { - auto secureConfiguration = m_secureConfigs.value(ui->secureConfigs->currentIndex()); + auto secureConfiguration = m_secureConfigs.value(ui->secureConfigs->currentData().toInt()); secureConfiguration.setKeepSecureSessionAlive(true); m_management.setSecureConfiguration(secureConfiguration); m_management.connectToHostEncrypted(m_device->info().controlEndpointAddress(), diff --git a/examples/knx/feature/mainwindow.cpp b/examples/knx/feature/mainwindow.cpp index fd36832..42ed7bf 100644 --- a/examples/knx/feature/mainwindow.cpp +++ b/examples/knx/feature/mainwindow.cpp @@ -246,7 +246,7 @@ void MainWindow::on_connection_clicked() m_last->setFirstColumnSpanned(true); if (ui->secureSession->isChecked()) { - auto secureConfiguration = m_secureConfigs.value(ui->secureConfigs->currentIndex()); + auto secureConfiguration = m_secureConfigs.value(ui->secureConfigs->currentData().toInt()); secureConfiguration.setKeepSecureSessionAlive(true); m_tunnel.setSecureConfiguration(secureConfiguration); m_tunnel.connectToHostEncrypted(m_device->info().controlEndpointAddress(), @@ -368,7 +368,6 @@ void MainWindow::setText(QKnx::InterfaceFeature feature, const QKnxByteArray &da break; } m_last->setText(3, value); - } void MainWindow::populateFrame(QKnxNetIp::ServiceType type, QKnx::InterfaceFeature feature, diff --git a/examples/knx/group/mainwindow.cpp b/examples/knx/group/mainwindow.cpp index e7182f7..2dff126 100644 --- a/examples/knx/group/mainwindow.cpp +++ b/examples/knx/group/mainwindow.cpp @@ -254,7 +254,7 @@ void MainWindow::on_connection_clicked() m_last->setFirstColumnSpanned(true); if (ui->secureSession->isChecked()) { - auto secureConfiguration = m_secureConfigs.value(ui->secureConfigs->currentIndex()); + auto secureConfiguration = m_secureConfigs.value(ui->secureConfigs->currentData().toInt()); secureConfiguration.setKeepSecureSessionAlive(true); m_tunnel.setSecureConfiguration(secureConfiguration); m_tunnel.connectToHostEncrypted(m_device->info().controlEndpointAddress(), -- cgit v1.2.3 From 3cc7b8754ddf4e17eda9f829c1d6daaab62ec3f4 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Tue, 7 May 2019 13:09:46 +0200 Subject: Make sure we properly shutdown a secure session Change-Id: I7525139c1a589cb1feed3102ef7ed2709da587ac Reviewed-by: Maurice Kalinowski --- src/knx/netip/qknxnetipendpointconnection.cpp | 28 ++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) 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); -- cgit v1.2.3