Protocol Framework Change: FieldFlags - FrameField and MetaField are no longer exclusive. A field can be neither. Also frameFieldCount() now actually counts the number of frameFields instead of deriving it from metaFieldCount() - these changes allow protocols to export different sets of fields based on a opcode/type field.
This commit is contained in:
parent
710eb7f836
commit
069cc16279
@ -172,8 +172,7 @@ QVariant PacketModel::data(const QModelIndex &index, int role) const
|
||||
|
||||
while (n)
|
||||
{
|
||||
if (!(p->fieldFlags(fieldIdx).testFlag(
|
||||
AbstractProtocol::FieldIsMeta)))
|
||||
if (p->fieldFlags(fieldIdx).testFlag(AbstractProtocol::FrameField))
|
||||
n--;
|
||||
fieldIdx++;
|
||||
}
|
||||
|
@ -76,7 +76,8 @@ AbstractProtocol::AbstractProtocol(StreamBase *stream, AbstractProtocol *parent)
|
||||
mpStream = stream;
|
||||
this->parent = parent;
|
||||
prev = next = NULL;
|
||||
metaCount = -1;
|
||||
_metaFieldCount = -1;
|
||||
_frameFieldCount = -1;
|
||||
protoSize = -1;
|
||||
}
|
||||
|
||||
@ -184,45 +185,59 @@ int AbstractProtocol::fieldCount() const
|
||||
Returns the number of meta fields
|
||||
|
||||
The default implementation counts and returns the number of fields for which
|
||||
the FieldIsMeta flag is set\n
|
||||
the MetaField flag is set\n
|
||||
The default implementation caches the count on its first invocation
|
||||
and subsequently returns the cached count
|
||||
*/
|
||||
int AbstractProtocol::metaFieldCount() const
|
||||
{
|
||||
if (metaCount < 0)
|
||||
if (_metaFieldCount < 0)
|
||||
{
|
||||
int c = 0;
|
||||
for (int i = 0; i < fieldCount() ; i++)
|
||||
if (fieldFlags(i).testFlag(FieldIsMeta))
|
||||
if (fieldFlags(i).testFlag(MetaField))
|
||||
c++;
|
||||
metaCount = c;
|
||||
_metaFieldCount = c;
|
||||
}
|
||||
|
||||
return metaCount;
|
||||
return _metaFieldCount;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the number of frame fields
|
||||
|
||||
Convenience method - same as fieldCount() minus metaFieldCount()
|
||||
The default implementation counts and returns the number of fields for which
|
||||
the FrameField flag is set\n
|
||||
The default implementation caches the count on its first invocation
|
||||
and subsequently returns the cached count
|
||||
|
||||
Subclasses which export different sets of fields based on a opcode/type
|
||||
(e.g. icmp) should re-implement this function
|
||||
*/
|
||||
int AbstractProtocol::frameFieldCount() const
|
||||
{
|
||||
//qDebug("%s:%d, %d", __FUNCTION__, fieldCount(), metaFieldCount());
|
||||
return (fieldCount() - metaFieldCount());
|
||||
if (_frameFieldCount < 0)
|
||||
{
|
||||
int c = 0;
|
||||
for (int i = 0; i < fieldCount() ; i++)
|
||||
if (fieldFlags(i).testFlag(FrameField))
|
||||
c++;
|
||||
_frameFieldCount = c;
|
||||
}
|
||||
|
||||
return _frameFieldCount;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the field flags for the passed in field index
|
||||
|
||||
The default implementation assumes all fields to be frame fields and returns
|
||||
'FieldIsNormal'. Subclasses must reimplement this method if they have any
|
||||
'FrameField'. Subclasses must reimplement this method if they have any
|
||||
meta fields or checksum fields. See the SampleProtocol for an example.
|
||||
*/
|
||||
AbstractProtocol::FieldFlags AbstractProtocol::fieldFlags(int /*index*/) const
|
||||
{
|
||||
return FieldIsNormal;
|
||||
return FrameField;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -261,7 +276,7 @@ QVariant AbstractProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
case FieldName:
|
||||
return QString();
|
||||
case FieldBitSize:
|
||||
Q_ASSERT_X(!fieldFlags(index).testFlag(FieldIsCksum),
|
||||
Q_ASSERT_X(!fieldFlags(index).testFlag(CksumField),
|
||||
"AbstractProtocol::fieldData()",
|
||||
"FieldBitSize for checksum fields need to be handled by the subclass");
|
||||
return fieldData(index, FieldFrameValue, streamIndex).
|
||||
@ -366,7 +381,7 @@ int AbstractProtocol::protocolFrameSize(int streamIndex) const
|
||||
|
||||
for (int i = 0; i < fieldCount(); i++)
|
||||
{
|
||||
if (!fieldFlags(i).testFlag(FieldIsMeta))
|
||||
if (fieldFlags(i).testFlag(FrameField))
|
||||
bitsize += fieldData(i, FieldBitSize, streamIndex).toUInt();
|
||||
}
|
||||
protoSize = (bitsize+7)/8;
|
||||
@ -440,14 +455,14 @@ QByteArray AbstractProtocol::protocolFrameValue(int streamIndex, bool forCksum)
|
||||
for (int i=0; i < fieldCount() ; i++)
|
||||
{
|
||||
flags = fieldFlags(i);
|
||||
if (!flags.testFlag(FieldIsMeta))
|
||||
if (flags.testFlag(FrameField))
|
||||
{
|
||||
bits = fieldData(i, FieldBitSize, streamIndex).toUInt();
|
||||
if (bits == 0)
|
||||
continue;
|
||||
Q_ASSERT(bits > 0);
|
||||
|
||||
if (forCksum && flags.testFlag(FieldIsCksum))
|
||||
if (forCksum && flags.testFlag(CksumField))
|
||||
{
|
||||
field.resize((bits+7)/8);
|
||||
field.fill('\0');
|
||||
|
@ -48,7 +48,8 @@ class AbstractProtocol
|
||||
friend class ProtocolListIterator;
|
||||
|
||||
private:
|
||||
mutable int metaCount;
|
||||
mutable int _metaFieldCount;
|
||||
mutable int _frameFieldCount;
|
||||
mutable int protoSize;
|
||||
mutable QString protoAbbr;
|
||||
|
||||
@ -61,9 +62,9 @@ protected:
|
||||
public:
|
||||
//! Properties of a field, can be OR'd
|
||||
enum FieldFlag {
|
||||
FieldIsNormal = 0x0, //!< field appears in frame content
|
||||
FieldIsMeta = 0x1, //!< field does not appear in frame, is meta data
|
||||
FieldIsCksum = 0x2 //!< field is a checksum, appears in frame content
|
||||
FrameField = 0x1, //!< field appears in frame content
|
||||
MetaField = 0x2, //!< field does not appear in frame, is meta data
|
||||
CksumField = 0x4 //!< field is a checksum and appears in frame content
|
||||
};
|
||||
Q_DECLARE_FLAGS(FieldFlags, FieldFlag); //!< \private abcd
|
||||
|
||||
|
@ -203,7 +203,8 @@ AbstractProtocol::FieldFlags ArpProtocol::fieldFlags(int index) const
|
||||
case arp_targetProtoAddrMode:
|
||||
case arp_targetProtoAddrCount:
|
||||
case arp_targetProtoAddrMask:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -159,17 +159,18 @@ AbstractProtocol::FieldFlags IcmpProtocol::fieldFlags(int index) const
|
||||
break;
|
||||
|
||||
case icmp_checksum:
|
||||
flags |= FieldIsCksum;
|
||||
flags |= CksumField;
|
||||
break;
|
||||
|
||||
case icmp_identifier:
|
||||
case icmp_sequence:
|
||||
if (!idSeqSet.contains(fieldData(icmp_type, FieldValue).toUInt()))
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
break;
|
||||
|
||||
case icmp_is_override_checksum:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -156,7 +156,7 @@ AbstractProtocol::FieldFlags Ip4Protocol::fieldFlags(int index) const
|
||||
break;
|
||||
|
||||
case ip4_cksum:
|
||||
flags |= FieldIsCksum;
|
||||
flags |= CksumField;
|
||||
break;
|
||||
|
||||
case ip4_srcAddr:
|
||||
@ -173,7 +173,8 @@ AbstractProtocol::FieldFlags Ip4Protocol::fieldFlags(int index) const
|
||||
case ip4_dstAddrMode:
|
||||
case ip4_dstAddrCount:
|
||||
case ip4_dstAddrMask:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -165,7 +165,8 @@ AbstractProtocol::FieldFlags Ip6Protocol::fieldFlags(int index) const
|
||||
case ip6_dstAddrMode:
|
||||
case ip6_dstAddrCount:
|
||||
case ip6_dstAddrPrefix:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -136,7 +136,8 @@ AbstractProtocol::FieldFlags MacProtocol::fieldFlags(int index) const
|
||||
case mac_srcMacMode:
|
||||
case mac_srcMacCount:
|
||||
case mac_srcMacStep:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -126,7 +126,8 @@ AbstractProtocol::FieldFlags PayloadProtocol::fieldFlags(int index) const
|
||||
|
||||
// Meta fields
|
||||
case payload_dataPatternMode:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -109,6 +109,20 @@ int SampleProtocol::fieldCount() const
|
||||
return sample_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 SampleProtocol::frameFieldCount() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
TODO Edit this function to return the appropriate flags for each field \n
|
||||
|
||||
@ -128,7 +142,7 @@ AbstractProtocol::FieldFlags SampleProtocol::fieldFlags(int index) const
|
||||
break;
|
||||
|
||||
case sample_checksum:
|
||||
flags |= FieldIsCksum;
|
||||
flags |= CksumField;
|
||||
break;
|
||||
|
||||
case sample_x:
|
||||
@ -136,7 +150,8 @@ AbstractProtocol::FieldFlags SampleProtocol::fieldFlags(int index) const
|
||||
break;
|
||||
|
||||
case sample_is_override_checksum:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -81,6 +81,7 @@ 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,
|
||||
|
@ -113,7 +113,7 @@ AbstractProtocol::FieldFlags TcpProtocol::fieldFlags(int index) const
|
||||
break;
|
||||
|
||||
case tcp_cksum:
|
||||
flags |= FieldIsCksum;
|
||||
flags |= CksumField;
|
||||
break;
|
||||
|
||||
case tcp_urg_ptr:
|
||||
@ -123,7 +123,8 @@ AbstractProtocol::FieldFlags TcpProtocol::fieldFlags(int index) const
|
||||
case tcp_is_override_dst_port:
|
||||
case tcp_is_override_hdrlen:
|
||||
case tcp_is_override_cksum:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -108,7 +108,8 @@ AbstractProtocol::FieldFlags TextProtocol::fieldFlags(int index) const
|
||||
|
||||
case textProto_portNum:
|
||||
case textProto_encoding:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -108,14 +108,15 @@ AbstractProtocol::FieldFlags UdpProtocol::fieldFlags(int index) const
|
||||
break;
|
||||
|
||||
case udp_cksum:
|
||||
flags |= FieldIsCksum;
|
||||
flags |= CksumField;
|
||||
break;
|
||||
|
||||
case udp_isOverrideSrcPort:
|
||||
case udp_isOverrideDstPort:
|
||||
case udp_isOverrideTotLen:
|
||||
case udp_isOverrideCksum:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -93,7 +93,8 @@ AbstractProtocol::FieldFlags VlanProtocol::fieldFlags(int index) const
|
||||
|
||||
// meta-fields
|
||||
case vlan_isOverrideTpid:
|
||||
flags |= FieldIsMeta;
|
||||
flags &= ~FrameField;
|
||||
flags |= MetaField;
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user