summaryrefslogtreecommitdiffstats
path: root/src/knx/netip/qknxnetipendpointconnection_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/knx/netip/qknxnetipendpointconnection_p.h')
-rw-r--r--src/knx/netip/qknxnetipendpointconnection_p.h71
1 files changed, 60 insertions, 11 deletions
diff --git a/src/knx/netip/qknxnetipendpointconnection_p.h b/src/knx/netip/qknxnetipendpointconnection_p.h
index 71f4279..81c9bb6 100644
--- a/src/knx/netip/qknxnetipendpointconnection_p.h
+++ b/src/knx/netip/qknxnetipendpointconnection_p.h
@@ -42,12 +42,15 @@
//
#include <QtCore/qtimer.h>
-#include <QtKnx/qknxaddress.h>
+
#include <QtKnx/qtknxglobal.h>
-#include <QtKnx/qknxnetipendpointconnection.h>
-#include <QtNetwork/qhostaddress.h>
+#include <QtKnx/qknxaddress.h>
#include <QtKnx/qknxdevicemanagementframe.h>
#include <QtKnx/qknxlinklayerframe.h>
+#include <QtKnx/qknxnetipendpointconnection.h>
+#include <QtKnx/qknxnetipsecureconfiguration.h>
+
+#include <QtNetwork/qhostaddress.h>
#include <private/qobject_p.h>
@@ -79,6 +82,11 @@ struct Endpoint final
: address(addr)
, port(p)
{}
+ Endpoint(const QHostAddress &addr, quint16 p, QKnxNetIp::HostProtocol c)
+ : address(addr)
+ , port(p)
+ , hostProtocol(c)
+ {}
explicit Endpoint(const QKnxNetIpHpaiProxy &hpai)
: address(hpai.hostAddress())
, port(hpai.port())
@@ -90,7 +98,7 @@ struct Endpoint final
Endpoint &operator=(const QKnxNetIpHpai &s)
{
const QKnxNetIpHpaiProxy hpai(s);
- address = hpai.hostAddress(); port = hpai.port();
+ hostProtocol = hpai.hostProtocol(); address = hpai.hostAddress(); port = hpai.port();
return *this;
}
operator QKnxNetIpHpai() const
@@ -98,13 +106,17 @@ struct Endpoint final
return QKnxNetIpHpaiProxy::builder()
.setHostAddress(address)
.setPort(port)
- .setHostProtocol(code)
+ .setHostProtocol(hostProtocol)
.create();
}
+ bool isNullOrLocal() const
+ {
+ return address.isNull() || address == QHostAddress::Any || address.isLoopback() || port == 0;
+ }
- QHostAddress address { QHostAddress::LocalHost };
+ QHostAddress address { QHostAddress::Null };
quint16 port { 0 };
- QKnxNetIp::HostProtocol code { QKnxNetIp::HostProtocol::UDP_IPv4 };
+ QKnxNetIp::HostProtocol hostProtocol { QKnxNetIp::HostProtocol::UDP_IPv4 };
};
class Q_KNX_EXPORT QKnxNetIpEndpointConnectionPrivate : public QObjectPrivate
@@ -121,14 +133,14 @@ public:
{}
~QKnxNetIpEndpointConnectionPrivate() override = default;
- void setup();
void setupTimer();
+ bool initConnection(const QHostAddress &address, quint16 port, QKnxNetIp::HostProtocol hp);
void cleanup();
bool sendCemiRequest();
void sendStateRequest();
- void processReceivedFrame(const QHostAddress &address, int port);
+ QKnxNetIp::ServiceType processReceivedFrame(const QKnxNetIpFrame &frame);
virtual void process(const QKnxLinkLayerFrame &frame);
virtual void process(const QKnxDeviceManagementFrame &frame);
@@ -155,14 +167,40 @@ public:
void setAndEmitStateChanged(QKnxNetIpEndpointConnection::State newState);
void setAndEmitErrorOccurred(QKnxNetIpEndpointConnection::Error newError, const QString &message);
- void setCri(const QKnxNetIpCri &cri) { m_cri = cri; }
+ QKnxNetIpCri cri() const { return m_cri; }
+ void updateCri(QKnxNetIp::TunnelLayer layer)
+ {
+ QKnxNetIpCriProxy proxy(m_cri);
+ m_cri = proxy.builder()
+ .setTunnelLayer(layer)
+ .setIndividualAddress(proxy.individualAddress())
+ .create();
+ }
+
+ void updateCri(const QKnxAddress &ia)
+ {
+ QKnxNetIpCriProxy proxy(m_cri);
+ if (proxy.connectionType() == QKnxNetIp::ConnectionType::DeviceManagement)
+ return;
+
+ if (ia.isValid()) {
+ m_cri = QKnxNetIpCriProxy::builder()
+ .setTunnelLayer(proxy.tunnelLayer())
+ .setIndividualAddress(ia)
+ .create();
+ } else {
+ m_cri = proxy.builder()
+ .setTunnelLayer(proxy.tunnelLayer())
+ .create();
+ }
+ }
private:
QKnxNetIpCri m_cri;
Endpoint m_remoteDataEndpoint;
Endpoint m_remoteControlEndpoint;
- Endpoint m_natEndpoint { QHostAddress::AnyIPv4 };
+ Endpoint m_routeBack { QHostAddress::AnyIPv4 };
Endpoint m_localEndpoint { QHostAddress::LocalHost };
int m_channelId { -1 };
@@ -203,6 +241,17 @@ private:
QKnxByteArray m_rxBuffer;
UserProperties m_user;
+
+ quint16 m_sessionId { 0 };
+ quint48 m_sequenceNumber { 0 };
+ bool m_waitForAuthentication { false };
+
+ QKnxByteArray m_sessionKey;
+ QTimer *m_secureTimer { nullptr };
+ QKnxNetIpSecureConfiguration m_secureConfig;
+
+ // TODO: We need some kind of device configuration class as well.
+ QKnxByteArray m_serialNumber { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
};
QT_END_NAMESPACE