Added new param 'cksumScope' in AbstractProtocol's header and payload cksum methods; this ensures that TCP/UDP checksum is now correct if preceded by a IP 4over4.
This commit is contained in:
parent
ae05037265
commit
e681e1e226
@ -672,15 +672,19 @@ quint32 AbstractProtocol::protocolFrameCksum(int streamIndex,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the checksum of the requested type for the protocol's header
|
Returns the checksum of the requested type for the protocol's header
|
||||||
|
|
||||||
This is useful for subclasses which needs the header's checksum e.g. TCP/UDP
|
This is useful for subclasses which needs the header's checksum e.g. TCP/UDP
|
||||||
require a "Pseudo-IP" checksum
|
require a "Pseudo-IP" checksum. The checksum is limited to the specified
|
||||||
|
scope.
|
||||||
|
|
||||||
Currently the default implementation supports only type CksumIpPseudo
|
Currently the default implementation supports only type CksumIpPseudo
|
||||||
|
|
||||||
|
\note The default value for cksumScope is different for
|
||||||
|
protocolFrameHeaderCksum() and protocolFramePayloadCksum()
|
||||||
*/
|
*/
|
||||||
quint32 AbstractProtocol::protocolFrameHeaderCksum(int streamIndex,
|
quint32 AbstractProtocol::protocolFrameHeaderCksum(int streamIndex,
|
||||||
CksumType cksumType) const
|
CksumType cksumType, CksumScope cksumScope) const
|
||||||
{
|
{
|
||||||
quint32 sum = 0;
|
quint32 sum = 0;
|
||||||
quint16 cksum;
|
quint16 cksum;
|
||||||
@ -692,15 +696,19 @@ quint32 AbstractProtocol::protocolFrameHeaderCksum(int streamIndex,
|
|||||||
{
|
{
|
||||||
cksum = p->protocolFrameCksum(streamIndex, cksumType);
|
cksum = p->protocolFrameCksum(streamIndex, cksumType);
|
||||||
sum += (quint16) ~cksum;
|
sum += (quint16) ~cksum;
|
||||||
p = p->prev;
|
|
||||||
qDebug("%s: sum = %u, cksum = %u", __FUNCTION__, sum, cksum);
|
qDebug("%s: sum = %u, cksum = %u", __FUNCTION__, sum, cksum);
|
||||||
|
if (cksumScope == CksumScopeAdjacentProtocol)
|
||||||
|
goto out;
|
||||||
|
p = p->prev;
|
||||||
}
|
}
|
||||||
if (parent)
|
if (parent)
|
||||||
{
|
{
|
||||||
cksum = parent->protocolFrameHeaderCksum(streamIndex, cksumType);
|
cksum = parent->protocolFrameHeaderCksum(streamIndex, cksumType,
|
||||||
|
cksumScope);
|
||||||
sum += (quint16) ~cksum;
|
sum += (quint16) ~cksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
while(sum>>16)
|
while(sum>>16)
|
||||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||||
|
|
||||||
@ -712,12 +720,16 @@ quint32 AbstractProtocol::protocolFrameHeaderCksum(int streamIndex,
|
|||||||
|
|
||||||
This is useful for subclasses which needs the payload's checksum e.g. TCP/UDP
|
This is useful for subclasses which needs the payload's checksum e.g. TCP/UDP
|
||||||
require a IP checksum of the payload (to be combined with other checksums to
|
require a IP checksum of the payload (to be combined with other checksums to
|
||||||
derive the final checksum)
|
derive the final checksum). The checksum is limited to the specified
|
||||||
|
scope.
|
||||||
|
|
||||||
Currently the default implementation supports only type CksumIp
|
Currently the default implementation supports only type CksumIp
|
||||||
|
|
||||||
|
\note The default value for cksumScope is different for
|
||||||
|
protocolFrameHeaderCksum() and protocolFramePayloadCksum()
|
||||||
*/
|
*/
|
||||||
quint32 AbstractProtocol::protocolFramePayloadCksum(int streamIndex,
|
quint32 AbstractProtocol::protocolFramePayloadCksum(int streamIndex,
|
||||||
CksumType cksumType) const
|
CksumType cksumType, CksumScope cksumScope) const
|
||||||
{
|
{
|
||||||
quint32 sum = 0;
|
quint32 sum = 0;
|
||||||
quint16 cksum;
|
quint16 cksum;
|
||||||
@ -729,15 +741,19 @@ quint32 AbstractProtocol::protocolFramePayloadCksum(int streamIndex,
|
|||||||
{
|
{
|
||||||
cksum = p->protocolFrameCksum(streamIndex, cksumType);
|
cksum = p->protocolFrameCksum(streamIndex, cksumType);
|
||||||
sum += (quint16) ~cksum;
|
sum += (quint16) ~cksum;
|
||||||
|
if (cksumScope == CksumScopeAdjacentProtocol)
|
||||||
|
goto out;
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parent)
|
if (parent)
|
||||||
{
|
{
|
||||||
cksum = parent->protocolFramePayloadCksum(streamIndex, cksumType);
|
cksum = parent->protocolFramePayloadCksum(streamIndex, cksumType,
|
||||||
|
cksumScope);
|
||||||
sum += (quint16) ~cksum;
|
sum += (quint16) ~cksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
while(sum>>16)
|
while(sum>>16)
|
||||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||||
|
|
||||||
|
@ -93,6 +93,12 @@ public:
|
|||||||
CksumMax //!< Marker for number of cksum types
|
CksumMax //!< Marker for number of cksum types
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//! Supported checksum scopes
|
||||||
|
enum CksumScope {
|
||||||
|
CksumScopeAdjacentProtocol, //!< Cksum only the adjacent protocol
|
||||||
|
CksumScopeAllProtocols, //!< Cksum over all the protocols
|
||||||
|
};
|
||||||
|
|
||||||
AbstractProtocol(StreamBase *stream, AbstractProtocol *parent = 0);
|
AbstractProtocol(StreamBase *stream, AbstractProtocol *parent = 0);
|
||||||
virtual ~AbstractProtocol();
|
virtual ~AbstractProtocol();
|
||||||
|
|
||||||
@ -134,9 +140,11 @@ public:
|
|||||||
virtual quint32 protocolFrameCksum(int streamIndex = 0,
|
virtual quint32 protocolFrameCksum(int streamIndex = 0,
|
||||||
CksumType cksumType = CksumIp) const;
|
CksumType cksumType = CksumIp) const;
|
||||||
quint32 protocolFrameHeaderCksum(int streamIndex = 0,
|
quint32 protocolFrameHeaderCksum(int streamIndex = 0,
|
||||||
CksumType cksumType = CksumIp) const;
|
CksumType cksumType = CksumIp,
|
||||||
|
CksumScope cksumScope = CksumScopeAdjacentProtocol) const;
|
||||||
quint32 protocolFramePayloadCksum(int streamIndex = 0,
|
quint32 protocolFramePayloadCksum(int streamIndex = 0,
|
||||||
CksumType cksumType = CksumIp) const;
|
CksumType cksumType = CksumIp,
|
||||||
|
CksumScope cksumScope = CksumScopeAllProtocols) const;
|
||||||
|
|
||||||
virtual QWidget* configWidget() = 0;
|
virtual QWidget* configWidget() = 0;
|
||||||
virtual void loadConfigWidget() = 0;
|
virtual void loadConfigWidget() = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user