summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-06-11 03:02:37 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-06-11 03:02:37 +0200
commitf97a6347dd9274caf41679fe0a1708aa95b384d0 (patch)
tree98c30a01814d36bd6cf3786271c1e50fbc40fa65
parentbd9d614fd3569637ba08a5fe7ab3e343b0825484 (diff)
parent9344fe69d862881f8969640fc1a4af428e0d89f5 (diff)
Merge "Merge remote-tracking branch 'origin/5.13' into dev"
-rw-r--r--examples/knx/device/mainwindow.cpp22
-rw-r--r--examples/knx/discoverer/main.cpp4
-rw-r--r--examples/knx/feature/mainwindow.cpp23
-rw-r--r--examples/knx/group/mainwindow.cpp22
-rw-r--r--examples/knx/knxeditor/mainwindow.cpp6
-rw-r--r--src/knx/netip/qknxnetipendpointconnection.cpp28
-rw-r--r--tests/auto/qknxnetipdescriptionresponse/tst_qknxnetipdescriptionresponse.cpp12
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()