diff options
Diffstat (limited to 'src/network/kernel/qhostaddress_p.h')
-rw-r--r-- | src/network/kernel/qhostaddress_p.h | 72 |
1 files changed, 66 insertions, 6 deletions
diff --git a/src/network/kernel/qhostaddress_p.h b/src/network/kernel/qhostaddress_p.h index 55c3e5afde..4dc2989011 100644 --- a/src/network/kernel/qhostaddress_p.h +++ b/src/network/kernel/qhostaddress_p.h @@ -57,17 +57,77 @@ QT_BEGIN_NAMESPACE -class QNetmaskAddress: public QHostAddress +enum AddressClassification { + LoopbackAddress = 1, + LocalNetAddress, // RFC 1122 + LinkLocalAddress, // RFC 4291 (v6), RFC 3927 (v4) + MulticastAddress, // RFC 4291 (v6), RFC 3171 (v4) + BroadcastAddress, // RFC 919, 922 + + GlobalAddress = 16, + TestNetworkAddress, // RFC 3849 (v6), RFC 5737 (v4), + PrivateNetworkAddress, // RFC 1918 + UniqueLocalAddress, // RFC 4193 + SiteLocalAddress, // RFC 4291 (deprecated by RFC 3879, should be treated as global) + + UnknownAddress = 0 // unclassified or reserved +}; + +class QNetmask { - int length; + // stores 0-32 for IPv4, 0-128 for IPv6, or 255 for invalid + quint8 length; public: - QNetmaskAddress() : QHostAddress(), length(-1) { } + Q_DECL_CONSTEXPR QNetmask() : length(255) {} - bool setAddress(const QString &address); bool setAddress(const QHostAddress &address); + QHostAddress address(QAbstractSocket::NetworkLayerProtocol protocol) const; + + int prefixLength() const { return length == 255 ? -1 : length; } + void setPrefixLength(QAbstractSocket::NetworkLayerProtocol proto, int len) + { + int maxlen = -1; + if (proto == QAbstractSocket::IPv4Protocol) + maxlen = 32; + else if (proto == QAbstractSocket::IPv6Protocol) + maxlen = 128; + if (len > maxlen || len < 0) + length = 255U; + else + length = unsigned(len); + } + + friend bool operator==(QNetmask n1, QNetmask n2) + { return n1.length == n2.length; } +}; + +class QHostAddressPrivate : public QSharedData +{ +public: + QHostAddressPrivate(); + + void setAddress(quint32 a_ = 0); + void setAddress(const quint8 *a_); + void setAddress(const Q_IPV6ADDR &a_); + + bool parse(const QString &ipString); + void clear(); + + QString scopeId; + + union { + Q_IPV6ADDR a6; // IPv6 address + struct { quint64 c[2]; } a6_64; + struct { quint32 c[4]; } a6_32; + }; + quint32 a; // IPv4 address + qint8 protocol; + + AddressClassification classify() const; + static AddressClassification classify(const QHostAddress &address) + { return address.d->classify(); } - int prefixLength() const; - void setPrefixLength(QAbstractSocket::NetworkLayerProtocol proto, int len); + friend class QHostAddress; }; QT_END_NAMESPACE |