diff --git a/client/packetmodel.cpp b/client/packetmodel.cpp index 4fabe9b..ecb4196 100644 --- a/client/packetmodel.cpp +++ b/client/packetmodel.cpp @@ -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++; } diff --git a/common/abstractprotocol.cpp b/common/abstractprotocol.cpp index 0dc3178..522605b 100644 --- a/common/abstractprotocol.cpp +++ b/common/abstractprotocol.cpp @@ -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'); diff --git a/common/abstractprotocol.h b/common/abstractprotocol.h index ac3c863..053e303 100644 --- a/common/abstractprotocol.h +++ b/common/abstractprotocol.h @@ -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 diff --git a/common/arp.cpp b/common/arp.cpp index 84a6094..844a2d7 100644 --- a/common/arp.cpp +++ b/common/arp.cpp @@ -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: diff --git a/common/icmp.cpp b/common/icmp.cpp index 0529438..4bdc73d 100644 --- a/common/icmp.cpp +++ b/common/icmp.cpp @@ -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: diff --git a/common/ip4.cpp b/common/ip4.cpp index 54d069f..776752f 100644 --- a/common/ip4.cpp +++ b/common/ip4.cpp @@ -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: diff --git a/common/ip6.cpp b/common/ip6.cpp index 8ac6fca..f8b7555 100644 --- a/common/ip6.cpp +++ b/common/ip6.cpp @@ -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: diff --git a/common/mac.cpp b/common/mac.cpp index 706931a..040f870 100644 --- a/common/mac.cpp +++ b/common/mac.cpp @@ -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; } diff --git a/common/payload.cpp b/common/payload.cpp index 4536a82..d5fb2e5 100644 --- a/common/payload.cpp +++ b/common/payload.cpp @@ -126,7 +126,8 @@ AbstractProtocol::FieldFlags PayloadProtocol::fieldFlags(int index) const // Meta fields case payload_dataPatternMode: - flags |= FieldIsMeta; + flags &= ~FrameField; + flags |= MetaField; break; } diff --git a/common/sample.cpp b/common/sample.cpp index d83ab54..2a79660 100644 --- a/common/sample.cpp +++ b/common/sample.cpp @@ -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: diff --git a/common/sample.h b/common/sample.h index b92152b..91e6573 100644 --- a/common/sample.h +++ b/common/sample.h @@ -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, diff --git a/common/tcp.cpp b/common/tcp.cpp index f29b1a1..02faa6a 100644 --- a/common/tcp.cpp +++ b/common/tcp.cpp @@ -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: diff --git a/common/textproto.cpp b/common/textproto.cpp index 90327ea..c86f7ff 100644 --- a/common/textproto.cpp +++ b/common/textproto.cpp @@ -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: diff --git a/common/udp.cpp b/common/udp.cpp index 4097ff8..8f3c35b 100644 --- a/common/udp.cpp +++ b/common/udp.cpp @@ -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: diff --git a/common/vlan.cpp b/common/vlan.cpp index 2946068..95b2304 100644 --- a/common/vlan.cpp +++ b/common/vlan.cpp @@ -93,7 +93,8 @@ AbstractProtocol::FieldFlags VlanProtocol::fieldFlags(int index) const // meta-fields case vlan_isOverrideTpid: - flags |= FieldIsMeta; + flags &= ~FrameField; + flags |= MetaField; break; }