diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-06-11 03:02:37 +0200 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-06-11 03:02:37 +0200 |
commit | f97a6347dd9274caf41679fe0a1708aa95b384d0 (patch) | |
tree | 98c30a01814d36bd6cf3786271c1e50fbc40fa65 | |
parent | bd9d614fd3569637ba08a5fe7ab3e343b0825484 (diff) | |
parent | 9344fe69d862881f8969640fc1a4af428e0d89f5 (diff) |
Merge "Merge remote-tracking branch 'origin/5.13' into dev"
-rw-r--r-- | examples/knx/device/mainwindow.cpp | 22 | ||||
-rw-r--r-- | examples/knx/discoverer/main.cpp | 4 | ||||
-rw-r--r-- | examples/knx/feature/mainwindow.cpp | 23 | ||||
-rw-r--r-- | examples/knx/group/mainwindow.cpp | 22 | ||||
-rw-r--r-- | examples/knx/knxeditor/mainwindow.cpp | 6 | ||||
-rw-r--r-- | src/knx/netip/qknxnetipendpointconnection.cpp | 28 | ||||
-rw-r--r-- | tests/auto/qknxnetipdescriptionresponse/tst_qknxnetipdescriptionresponse.cpp | 12 |
7 files changed, 89 insertions, 28 deletions
diff --git a/examples/knx/device/mainwindow.cpp b/examples/knx/device/mainwindow.cpp index 429b578..f7f9ba4 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)") @@ -275,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(), @@ -293,16 +295,26 @@ 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())); + + connect(ui->interfaces, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [&](int i) { + if (i < 0) + return; + m_discoveryAgent.stop(); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData() + .toStringList().first())); + m_discoveryAgent.start(); + }); } void MainWindow::toggleUi(bool value) 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 <QtNetwork/QNetworkInterface> -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/feature/mainwindow.cpp b/examples/knx/feature/mainwindow.cpp index 094baab..42ed7bf 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)") @@ -244,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(), @@ -262,16 +264,26 @@ 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())); + + connect(ui->interfaces, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [&](int i) { + if (i < 0) + return; + m_discoveryAgent.stop(); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData() + .toStringList().first())); + m_discoveryAgent.start(); + }); } void MainWindow::toggleUi(bool value) @@ -356,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 40b899a..2dff126 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)") @@ -252,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(), @@ -270,16 +272,26 @@ 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())); + + connect(ui->interfaces, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [&](int i) { + if (i < 0) + return; + m_discoveryAgent.stop(); + m_discoveryAgent.setLocalAddress(QHostAddress(ui->interfaces->currentData() + .toStringList().first())); + m_discoveryAgent.start(); + }); } void MainWindow::toggleUi(bool value) 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("<tr><td class=\"padding\">%1</td></th>") - .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/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); 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() |