parent
acb8222beb
commit
8f510635a9
@ -18,6 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ip6.h"
|
#include "ip6.h"
|
||||||
|
|
||||||
|
#include "uint128.h"
|
||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
|
|
||||||
|
|
||||||
@ -313,49 +315,34 @@ QVariant Ip6Protocol::fieldData(int index, FieldAttrib attrib,
|
|||||||
|
|
||||||
case ip6_srcAddress:
|
case ip6_srcAddress:
|
||||||
{
|
{
|
||||||
int u, p, q;
|
int u;
|
||||||
quint64 maskHi = 0, maskLo = 0;
|
UInt128 mask = 0;
|
||||||
quint64 prefixHi, prefixLo;
|
UInt128 prefix = 0;
|
||||||
quint64 hostHi = 0, hostLo = 0;
|
UInt128 host = 0;
|
||||||
quint64 srcHi = 0, srcLo = 0;
|
UInt128 src(data.src_addr_hi(), data.src_addr_lo());
|
||||||
|
|
||||||
switch(data.src_addr_mode())
|
switch(data.src_addr_mode())
|
||||||
{
|
{
|
||||||
case OstProto::Ip6::kFixed:
|
case OstProto::Ip6::kFixed:
|
||||||
srcHi = data.src_addr_hi();
|
|
||||||
srcLo = data.src_addr_lo();
|
|
||||||
break;
|
break;
|
||||||
case OstProto::Ip6::kIncHost:
|
case OstProto::Ip6::kIncHost:
|
||||||
case OstProto::Ip6::kDecHost:
|
case OstProto::Ip6::kDecHost:
|
||||||
case OstProto::Ip6::kRandomHost:
|
case OstProto::Ip6::kRandomHost:
|
||||||
u = streamIndex % data.src_addr_count();
|
u = streamIndex % data.src_addr_count();
|
||||||
if (data.src_addr_prefix() > 64) {
|
mask = ~UInt128(0, 0) << (128 - data.src_addr_prefix());
|
||||||
p = 64;
|
prefix = src & mask;
|
||||||
q = data.src_addr_prefix() - 64;
|
|
||||||
} else {
|
|
||||||
p = data.src_addr_prefix();
|
|
||||||
q = 0;
|
|
||||||
}
|
|
||||||
if (p > 0)
|
|
||||||
maskHi = ~((quint64(1) << p) - 1);
|
|
||||||
if (q > 0)
|
|
||||||
maskLo = ~((quint64(1) << q) - 1);
|
|
||||||
prefixHi = data.src_addr_hi() & maskHi;
|
|
||||||
prefixLo = data.src_addr_lo() & maskLo;
|
|
||||||
if (data.src_addr_mode() == OstProto::Ip6::kIncHost) {
|
if (data.src_addr_mode() == OstProto::Ip6::kIncHost) {
|
||||||
hostHi = ((data.src_addr_hi() & ~maskHi) + u) & ~maskHi;
|
host = ((src & ~mask) + u) & ~mask;
|
||||||
hostLo = ((data.src_addr_lo() & ~maskLo) + u) & ~maskLo;
|
|
||||||
}
|
}
|
||||||
else if (data.src_addr_mode() == OstProto::Ip6::kDecHost) {
|
else if (data.src_addr_mode() == OstProto::Ip6::kDecHost) {
|
||||||
hostHi = ((data.src_addr_hi() & ~maskHi) - u) & ~maskHi;
|
host = ((src & ~mask) - u) & ~mask;
|
||||||
hostLo = ((data.src_addr_lo() & ~maskLo) - u) & ~maskLo;
|
|
||||||
}
|
}
|
||||||
else if (data.src_addr_mode()==OstProto::Ip6::kRandomHost) {
|
else if (data.src_addr_mode()==OstProto::Ip6::kRandomHost) {
|
||||||
hostHi = qrand() & ~maskHi;
|
// XXX: qrand is int (32bit) not 64bit, some stdlib
|
||||||
hostLo = qrand() & ~maskLo;
|
// implementations have RAND_MAX as low as 0x7FFF
|
||||||
|
host = UInt128(qrand(), qrand()) & ~mask;
|
||||||
}
|
}
|
||||||
srcHi = prefixHi | hostHi;
|
src = prefix | host;
|
||||||
srcLo = prefixLo | hostLo;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
qWarning("Unhandled src_addr_mode = %d",
|
qWarning("Unhandled src_addr_mode = %d",
|
||||||
@ -372,10 +359,9 @@ QVariant Ip6Protocol::fieldData(int index, FieldAttrib attrib,
|
|||||||
{
|
{
|
||||||
QByteArray fv;
|
QByteArray fv;
|
||||||
fv.resize(16);
|
fv.resize(16);
|
||||||
qToBigEndian(srcHi, (uchar*) fv.data());
|
qToBigEndian(src, (uchar*) fv.data());
|
||||||
qToBigEndian(srcLo, (uchar*) (fv.data() + 8));
|
|
||||||
if (attrib == FieldTextValue)
|
if (attrib == FieldTextValue)
|
||||||
return QHostAddress((quint8*)fv.constData()).toString();
|
return QHostAddress(src.toArray()).toString();
|
||||||
else
|
else
|
||||||
return fv;
|
return fv;
|
||||||
}
|
}
|
||||||
@ -387,49 +373,34 @@ QVariant Ip6Protocol::fieldData(int index, FieldAttrib attrib,
|
|||||||
|
|
||||||
case ip6_dstAddress:
|
case ip6_dstAddress:
|
||||||
{
|
{
|
||||||
int u, p, q;
|
int u;
|
||||||
quint64 maskHi = 0, maskLo = 0;
|
UInt128 mask = 0;
|
||||||
quint64 prefixHi, prefixLo;
|
UInt128 prefix = 0;
|
||||||
quint64 hostHi = 0, hostLo = 0;
|
UInt128 host = 0;
|
||||||
quint64 dstHi = 0, dstLo = 0;
|
UInt128 dst(data.dst_addr_hi(), data.dst_addr_lo());
|
||||||
|
|
||||||
switch(data.dst_addr_mode())
|
switch(data.dst_addr_mode())
|
||||||
{
|
{
|
||||||
case OstProto::Ip6::kFixed:
|
case OstProto::Ip6::kFixed:
|
||||||
dstHi = data.dst_addr_hi();
|
|
||||||
dstLo = data.dst_addr_lo();
|
|
||||||
break;
|
break;
|
||||||
case OstProto::Ip6::kIncHost:
|
case OstProto::Ip6::kIncHost:
|
||||||
case OstProto::Ip6::kDecHost:
|
case OstProto::Ip6::kDecHost:
|
||||||
case OstProto::Ip6::kRandomHost:
|
case OstProto::Ip6::kRandomHost:
|
||||||
u = streamIndex % data.dst_addr_count();
|
u = streamIndex % data.dst_addr_count();
|
||||||
if (data.dst_addr_prefix() > 64) {
|
mask = ~UInt128(0, 0) << (128 - data.dst_addr_prefix());
|
||||||
p = 64;
|
prefix = dst & mask;
|
||||||
q = data.dst_addr_prefix() - 64;
|
|
||||||
} else {
|
|
||||||
p = data.dst_addr_prefix();
|
|
||||||
q = 0;
|
|
||||||
}
|
|
||||||
if (p > 0)
|
|
||||||
maskHi = ~((quint64(1) << p) - 1);
|
|
||||||
if (q > 0)
|
|
||||||
maskLo = ~((quint64(1) << q) - 1);
|
|
||||||
prefixHi = data.dst_addr_hi() & maskHi;
|
|
||||||
prefixLo = data.dst_addr_lo() & maskLo;
|
|
||||||
if (data.dst_addr_mode() == OstProto::Ip6::kIncHost) {
|
if (data.dst_addr_mode() == OstProto::Ip6::kIncHost) {
|
||||||
hostHi = ((data.dst_addr_hi() & ~maskHi) + u) & ~maskHi;
|
host = ((dst & ~mask) + u) & ~mask;
|
||||||
hostLo = ((data.dst_addr_lo() & ~maskLo) + u) & ~maskLo;
|
|
||||||
}
|
}
|
||||||
else if (data.dst_addr_mode() == OstProto::Ip6::kDecHost) {
|
else if (data.dst_addr_mode() == OstProto::Ip6::kDecHost) {
|
||||||
hostHi = ((data.dst_addr_hi() & ~maskHi) - u) & ~maskHi;
|
host = ((dst & ~mask) - u) & ~mask;
|
||||||
hostLo = ((data.dst_addr_lo() & ~maskLo) - u) & ~maskLo;
|
|
||||||
}
|
}
|
||||||
else if (data.dst_addr_mode()==OstProto::Ip6::kRandomHost) {
|
else if (data.dst_addr_mode()==OstProto::Ip6::kRandomHost) {
|
||||||
hostHi = qrand() & ~maskHi;
|
// XXX: qrand is int (32bit) not 64bit, some stdlib
|
||||||
hostLo = qrand() & ~maskLo;
|
// implementations have RAND_MAX as low as 0x7FFF
|
||||||
|
host = UInt128(qrand(), qrand()) & ~mask;
|
||||||
}
|
}
|
||||||
dstHi = prefixHi | hostHi;
|
dst = prefix | host;
|
||||||
dstLo = prefixLo | hostLo;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
qWarning("Unhandled dst_addr_mode = %d",
|
qWarning("Unhandled dst_addr_mode = %d",
|
||||||
@ -446,10 +417,9 @@ QVariant Ip6Protocol::fieldData(int index, FieldAttrib attrib,
|
|||||||
{
|
{
|
||||||
QByteArray fv;
|
QByteArray fv;
|
||||||
fv.resize(16);
|
fv.resize(16);
|
||||||
qToBigEndian(dstHi, (uchar*) fv.data());
|
qToBigEndian(dst, (uchar*) fv.data());
|
||||||
qToBigEndian(dstLo, (uchar*) (fv.data() + 8));
|
|
||||||
if (attrib == FieldTextValue)
|
if (attrib == FieldTextValue)
|
||||||
return QHostAddress((quint8*)fv.constData()).toString();
|
return QHostAddress(dst.toArray()).toString();
|
||||||
else
|
else
|
||||||
return fv;
|
return fv;
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
#include <qendian.h>
|
#include <qendian.h>
|
||||||
|
|
||||||
@ -41,6 +42,7 @@ public:
|
|||||||
bool operator==(const UInt128 &other) const;
|
bool operator==(const UInt128 &other) const;
|
||||||
bool operator!=(const UInt128 &other) const;
|
bool operator!=(const UInt128 &other) const;
|
||||||
UInt128 operator+(const UInt128 &other) const;
|
UInt128 operator+(const UInt128 &other) const;
|
||||||
|
UInt128 operator-(const UInt128 &other) const;
|
||||||
UInt128 operator*(const uint &other) const;
|
UInt128 operator*(const uint &other) const;
|
||||||
UInt128 operator<<(const int &shift) const;
|
UInt128 operator<<(const int &shift) const;
|
||||||
UInt128 operator~() const;
|
UInt128 operator~() const;
|
||||||
@ -134,6 +136,16 @@ inline UInt128 UInt128::operator+(const UInt128 &other) const
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline UInt128 UInt128::operator-(const UInt128 &other) const
|
||||||
|
{
|
||||||
|
UInt128 diff;
|
||||||
|
|
||||||
|
diff.lo_ = lo_ - other.lo_;
|
||||||
|
diff.hi_ = hi_ - other.hi_ - (diff.lo_ > lo_);
|
||||||
|
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
inline UInt128 UInt128::operator*(const uint &other) const
|
inline UInt128 UInt128::operator*(const uint &other) const
|
||||||
{
|
{
|
||||||
UInt128 product;
|
UInt128 product;
|
||||||
@ -184,6 +196,15 @@ template <> inline UInt128 qFromBigEndian<UInt128>(const uchar *src)
|
|||||||
return UInt128(hi, lo);
|
return UInt128(hi, lo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if QT_VERSION >= 0x050700
|
||||||
|
template <> inline void qToBigEndian<UInt128>(UInt128 src, void *dest)
|
||||||
|
#else
|
||||||
|
template <> inline void qToBigEndian<UInt128>(UInt128 src, uchar *dest)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
memcpy(dest, src.toArray(), 16);
|
||||||
|
}
|
||||||
|
|
||||||
template <> inline UInt128 qToBigEndian<UInt128>(const UInt128 src)
|
template <> inline UInt128 qToBigEndian<UInt128>(const UInt128 src)
|
||||||
{
|
{
|
||||||
quint64 hi, lo;
|
quint64 hi, lo;
|
||||||
@ -194,6 +215,14 @@ template <> inline UInt128 qToBigEndian<UInt128>(const UInt128 src)
|
|||||||
return UInt128(hi, lo);
|
return UInt128(hi, lo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline QDebug operator<<(QDebug debug, const UInt128 &value)
|
||||||
|
{
|
||||||
|
QDebugStateSaver saver(debug);
|
||||||
|
debug.maybeSpace() << hex << value.hi64() << " " << value.lo64();
|
||||||
|
|
||||||
|
return debug;
|
||||||
|
}
|
||||||
|
|
||||||
inline uint qHash(const UInt128 &key)
|
inline uint qHash(const UInt128 &key)
|
||||||
{
|
{
|
||||||
return qHash(key.hi64()) ^ qHash(key.lo64());
|
return qHash(key.hi64()) ^ qHash(key.lo64());
|
||||||
|
Loading…
Reference in New Issue
Block a user