Add option to recalculate cksums during pcap import

Recalculate cksum is now the default.

This behaviour change has been done to facilitate rewriting packet
fields post PCAP import using the new Find & Replace feature. Without
this any change in fields may cause incorrect checksums.

The earlier rationale for retaining the checksums in the PCAP file
during import was to ensure replayed packet was same as the one in the
PCAP file.

User now has a choice with this option.
This commit is contained in:
Srivats P 2021-12-11 19:27:44 +05:30
parent 366022552f
commit dbdeee2a6f
13 changed files with 109 additions and 47 deletions

View File

@ -56,7 +56,7 @@ void PdmlIcmpProtocol::preProtocolHandler(QString name,
else if (name == "icmpv6")
icmp->set_icmp_version(OstProto::Icmp::kIcmp6);
icmp->set_is_override_checksum(true);
icmp->set_is_override_checksum(overrideCksum_);
icmp->set_type(kIcmpInvalidType);
}

View File

@ -49,7 +49,7 @@ void PdmlIgmpProtocol::preProtocolHandler(QString /*name*/,
OstProto::Gmp *igmp = pbProto->MutableExtension(OstProto::igmp);
igmp->set_is_override_rsvd_code(true);
igmp->set_is_override_checksum(true);
igmp->set_is_override_checksum(overrideCksum_);
igmp->set_is_override_source_count(true);
igmp->set_is_override_group_record_count(true);

View File

@ -88,6 +88,6 @@ void PdmlIp4Protocol::postProtocolHandler(OstProto::Protocol *pbProto,
ip4->set_is_override_hdrlen(true);
ip4->set_is_override_totlen(true);
ip4->set_is_override_proto(true);
ip4->set_is_override_cksum(true);
ip4->set_is_override_cksum(overrideCksum_);
}

View File

@ -53,7 +53,7 @@ void PdmlMldProtocol::preProtocolHandler(QString /*name*/,
OstProto::Gmp *mld = pbProto->MutableExtension(OstProto::mld);
mld->set_is_override_rsvd_code(true);
mld->set_is_override_checksum(true);
mld->set_is_override_checksum(overrideCksum_);
mld->set_is_override_source_count(true);
mld->set_is_override_group_record_count(true);

View File

@ -47,6 +47,8 @@ PcapImportOptionsDialog::PcapImportOptionsDialog(QVariantMap *options)
options_ = options;
viaPdml->setChecked(options_->value("ViaPdml").toBool());
recalculateCksums->setChecked(
options_->value("RecalculateCksums").toBool());
doDiff->setChecked(options_->value("DoDiff").toBool());
connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
@ -59,6 +61,7 @@ PcapImportOptionsDialog::~PcapImportOptionsDialog()
void PcapImportOptionsDialog::accept()
{
options_->insert("ViaPdml", viaPdml->isChecked());
options_->insert("RecalculateCksums", recalculateCksums->isChecked());
options_->insert("DoDiff", doDiff->isChecked());
QDialog::accept();
@ -67,6 +70,7 @@ void PcapImportOptionsDialog::accept()
PcapFileFormat::PcapFileFormat()
{
importOptions_.insert("ViaPdml", true);
importOptions_.insert("RecalculateCksums", true);
importOptions_.insert("DoDiff", true);
importDialog_ = NULL;
@ -224,7 +228,7 @@ _retry:
{
QProcess tshark;
QTemporaryFile pdmlFile;
PdmlReader reader(&streams);
PdmlReader reader(&streams, importOptions_);
if (!pdmlFile.open())
{

View File

@ -7,51 +7,57 @@
<x>0</x>
<y>0</y>
<width>326</width>
<height>93</height>
<height>112</height>
</rect>
</property>
<property name="windowTitle">
<string>PCAP import options</string>
</property>
<layout class="QVBoxLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="viaPdml">
<property name="text">
<string>Intelligent Import (via PDML)</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout">
<item>
<widget class="QWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>16</width>
<height>16</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="doDiff">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Do a diff after import</string>
</property>
</widget>
</item>
</layout>
<item row="1" column="0" rowspan="2">
<widget class="QWidget" name="indentSpacing" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>16</width>
<height>16</height>
</size>
</property>
</widget>
</item>
<item>
<item row="1" column="1">
<widget class="QCheckBox" name="recalculateCksums">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Recalculate Checksums</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="doDiff">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Do a diff after import</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -108,8 +114,8 @@
<y>16</y>
</hint>
<hint type="destinationlabel">
<x>37</x>
<y>42</y>
<x>68</x>
<y>71</y>
</hint>
</hints>
</connection>
@ -124,8 +130,40 @@
<y>14</y>
</hint>
<hint type="destinationlabel">
<x>150</x>
<y>34</y>
<x>181</x>
<y>71</y>
</hint>
</hints>
</connection>
<connection>
<sender>viaPdml</sender>
<signal>toggled(bool)</signal>
<receiver>recalculateCksums</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>29</x>
<y>17</y>
</hint>
<hint type="destinationlabel">
<x>38</x>
<y>39</y>
</hint>
</hints>
</connection>
<connection>
<sender>viaPdml</sender>
<signal>toggled(bool)</signal>
<receiver>recalculateCksums</receiver>
<slot>setChecked(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>67</x>
<y>18</y>
</hint>
<hint type="destinationlabel">
<x>66</x>
<y>33</y>
</hint>
</hints>
</connection>

View File

@ -102,6 +102,11 @@ int PdmlProtocol::fieldId(QString name) const
return fieldMap_.value(name);
}
void PdmlProtocol::setRecalculateCksum(bool recalculate)
{
overrideCksum_ = !recalculate;
}
/*!
This method is called by PdmlReader before any fields within the protocol
are processed. All attributes associated with the 'proto' tag in the PDML

View File

@ -40,6 +40,8 @@ public:
bool hasField(QString name) const;
int fieldId(QString name) const;
void setRecalculateCksum(bool recalculate);
virtual void preProtocolHandler(QString name,
const QXmlStreamAttributes &attributes, int expectedPos,
OstProto::Protocol *pbProto, OstProto::Stream *stream);
@ -63,6 +65,8 @@ protected:
int ostProtoId_;
//!< Map of PDML field names to protobuf field numbers for 'known' fields
QMap<QString, int> fieldMap_;
bool overrideCksum_{true};
};
#endif

View File

@ -42,12 +42,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "udppdml.h"
#include "vlanpdml.h"
PdmlReader::PdmlReader(OstProto::StreamConfigList *streams)
PdmlReader::PdmlReader(OstProto::StreamConfigList *streams,
const QVariantMap &options)
{
//gPdmlReader = this;
pcap_ = NULL;
streams_ = streams;
recalculateCksums_ = options.value("RecalculateCksums").toBool();
currentStream_ = NULL;
prevStream_ = NULL;
@ -353,6 +356,8 @@ void PdmlReader::readProto()
pdmlProto = appendPdmlProto(protoName, &pbProto);
pdmlProto->setRecalculateCksum(recalculateCksums_);
qDebug("%s: preProtocolHandler(expPos = %d)",
qPrintable(protoName), expPos_);
pdmlProto->preProtocolHandler(protoName, attributes(), expPos_, pbProto,

View File

@ -24,13 +24,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include <QByteArray>
#include <QXmlStreamReader>
#include <QVariantMap>
class PcapFileFormat;
class PdmlReader : public QObject, public QXmlStreamReader
{
Q_OBJECT
public:
PdmlReader(OstProto::StreamConfigList *streams);
PdmlReader(OstProto::StreamConfigList *streams,
const QVariantMap &options = QVariantMap());
~PdmlReader();
bool read(QIODevice *device, PcapFileFormat *pcap = NULL,
@ -64,6 +66,8 @@ private:
PcapFileFormat *pcap_;
QByteArray pktBuf_;
bool recalculateCksums_{false};
bool isMldSupport_;
int packetCount_;
int expPos_;

View File

@ -87,7 +87,9 @@ void PdmlSampleProtocol::prematureEndHandler(int /*pos*/,
fields such as length, checksum etc. may be correct or incorrect in the
PCAP/PDML - to retain the same value as in the PCAP/PDML and not let
Ostinato recalculate these, you can set the is_override_length,
is_override_cksum meta-fields to true here
is_override_cksum meta-fields to true here; for cksum, use the base
class attribute overrideCksum_ to decide - this is set based on user
input
*/
void PdmlSampleProtocol::postProtocolHandler(OstProto::Protocol* /*pbProto*/,
OstProto::Stream* /*stream*/)

View File

@ -78,7 +78,7 @@ void PdmlTcpProtocol::postProtocolHandler(OstProto::Protocol *pbProto,
tcp->set_is_override_src_port(true);
tcp->set_is_override_dst_port(true);
tcp->set_is_override_hdrlen(true);
tcp->set_is_override_cksum(true);
tcp->set_is_override_cksum(overrideCksum_);
if (options_.size())
{

View File

@ -48,6 +48,6 @@ void PdmlUdpProtocol::postProtocolHandler(OstProto::Protocol *pbProto,
udp->set_is_override_src_port(true);
udp->set_is_override_dst_port(true);
udp->set_is_override_totlen(true);
udp->set_is_override_cksum(true);
udp->set_is_override_cksum(overrideCksum_);
}