Change GRE optional fields implementation

* frameFieldCount() always includes all frame fields whether or not
included in packet
* if an optional field is not included in packet
    - FieldName is still returned
    - FieldTextValue is returned as "<not-included>"
    - FieldBitWidth is 0
    - all remaining attributes are QVariant()
This commit is contained in:
Srivats P 2022-05-23 13:18:18 +05:30
parent c8cc7a021f
commit 25a91e52f6
2 changed files with 47 additions and 53 deletions

View File

@ -83,29 +83,6 @@ int GreProtocol::fieldCount() const
return gre_fieldCount;
}
/*!
TODO Return the number of frame fields for your protocol. A frame field
is a field which has the FrameField flag set \n
If your protocol has different sets of fields based on a OpCode/Type field
(e.g. icmp), you MUST re-implement this function; however, if your protocol
has a fixed set of frame fields always, you don't need to reimplement this
method - the base class implementation will do the right thing
*/
int GreProtocol::frameFieldCount() const
{
int count = 4; // mandatory fields - flags, rsvd0, version, protocol
if (data.flags() & GRE_FLAG_CKSUM)
count += 2; // checksum, rsvd1
if (data.flags() & GRE_FLAG_KEY)
count++;
if (data.flags() & GRE_FLAG_SEQ)
count++;
return count;
}
AbstractProtocol::FieldFlags GreProtocol::fieldFlags(int index) const
{
AbstractProtocol::FieldFlags flags;
@ -227,33 +204,32 @@ QVariant GreProtocol::fieldData(int index, FieldAttrib attrib,
}
case gre_checksum:
{
if (attrib == FieldName)
return QString("Checksum");
if ((data.flags() & GRE_FLAG_CKSUM) == 0)
return QVariant();
switch(attrib)
{
case FieldName:
return QString("Checksum");
case FieldBitSize:
return 16;
default:
break;
if (attrib == FieldTextValue)
return QObject::tr("<not-included>");
else
return QVariant();
}
quint16 cksum = 0;
if (data.flags() & GRE_FLAG_CKSUM) {
quint32 sum = 0;
if (attrib == FieldBitSize)
return 16;
cksum = protocolFrameCksum(streamIndex, CksumIp);
sum += (quint16) ~cksum;
cksum = protocolFramePayloadCksum(streamIndex, CksumIp);
sum += (quint16) ~cksum;
quint32 sum = 0;
quint16 cksum;
while (sum >> 16)
sum = (sum & 0xFFFF) + (sum >> 16);
cksum = protocolFrameCksum(streamIndex, CksumIp);
sum += (quint16) ~cksum;
cksum = protocolFramePayloadCksum(streamIndex, CksumIp);
sum += (quint16) ~cksum;
cksum = (~sum) & 0xFFFF;
}
while (sum >> 16)
sum = (sum & 0xFFFF) + (sum >> 16);
cksum = (~sum) & 0xFFFF;
switch(attrib)
{
@ -277,13 +253,19 @@ QVariant GreProtocol::fieldData(int index, FieldAttrib attrib,
case gre_rsvd1:
{
if (attrib == FieldName)
return QString("Reserved1");
if ((data.flags() & GRE_FLAG_CKSUM) == 0)
return QVariant();
{
if (attrib == FieldTextValue)
return QObject::tr("<not-included>");
else
return QVariant();
}
switch(attrib)
{
case FieldName:
return QString("Reserved1");
case FieldValue:
return data.rsvd1();
case FieldTextValue:
@ -303,13 +285,19 @@ QVariant GreProtocol::fieldData(int index, FieldAttrib attrib,
case gre_key:
{
if (attrib == FieldName)
return QString("Key");
if ((data.flags() & GRE_FLAG_KEY) == 0)
return QVariant();
{
if (attrib == FieldTextValue)
return QObject::tr("<not-included>");
else
return QVariant();
}
switch(attrib)
{
case FieldName:
return QString("Key");
case FieldValue:
return data.key();
case FieldTextValue:
@ -326,15 +314,22 @@ QVariant GreProtocol::fieldData(int index, FieldAttrib attrib,
}
break;
}
case gre_sequence:
{
if (attrib == FieldName)
return QString("Sequence Number");
if ((data.flags() & GRE_FLAG_SEQ) == 0)
return QVariant();
{
if (attrib == FieldTextValue)
return QObject::tr("<not-included>");
else
return QVariant();
}
switch(attrib)
{
case FieldName:
return QString("Sequence Number");
case FieldValue:
return data.sequence_num();
case FieldTextValue:

View File

@ -78,7 +78,6 @@ public:
virtual QString shortName() const;
virtual int fieldCount() const;
virtual int frameFieldCount() const;
virtual AbstractProtocol::FieldFlags fieldFlags(int index) const;
virtual QVariant fieldData(int index, FieldAttrib attrib,