diff options
Diffstat (limited to 'src/knx/netip/qknxnetipendpointconnection_p.h')
-rw-r--r-- | src/knx/netip/qknxnetipendpointconnection_p.h | 71 |
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 |