From 6193db495d7adb9b754b22fd1db327e1d9fb7149 Mon Sep 17 00:00:00 2001 From: "Srivats P." Date: Fri, 25 Apr 2014 07:52:55 +0530 Subject: [PATCH] NOX: SampleProtocol - separated protocol and widget as per new framework --- client/streamconfigdialog.cpp | 2 - common/ostproto.pro | 12 ++-- common/ostprotogui.pro | 14 ++-- common/protocolmanager.cpp | 29 ++++---- common/protocolwidgetfactory.cpp | 13 ++-- common/sample.cpp | 83 ++-------------------- common/sample.h | 24 ++----- common/sampleconfig.cpp | 117 +++++++++++++++++++++++++++++++ common/sampleconfig.h | 43 ++++++++++++ 9 files changed, 207 insertions(+), 130 deletions(-) create mode 100644 common/sampleconfig.cpp create mode 100644 common/sampleconfig.h diff --git a/client/streamconfigdialog.cpp b/client/streamconfigdialog.cpp index a9b94ea..8752f21 100644 --- a/client/streamconfigdialog.cpp +++ b/client/streamconfigdialog.cpp @@ -86,7 +86,6 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex, connect(rbL4Other, SIGNAL(toggled(bool)), rbPayloadOther, SLOT(setChecked(bool))); connect(rbL4Other, SIGNAL(toggled(bool)), gbPayloadProto, SLOT(setDisabled(bool))); -#if 0 // temp mask // Setup valid subsequent protocols for L2 to L4 protocols for (int i = ProtoL2; i <= ProtoL4; i++) { @@ -133,7 +132,6 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex, } } } -#endif mpAvailableProtocolsModel = new QStringListModel( OstProtocolManager->protocolDatabase(), this); diff --git a/common/ostproto.pro b/common/ostproto.pro index d72b21b..05024e4 100644 --- a/common/ostproto.pro +++ b/common/ostproto.pro @@ -46,7 +46,6 @@ HEADERS = \ HEADERS += \ mac.h \ - payload.h \ vlan.h \ svlan.h \ vlanstack.h \ @@ -71,11 +70,10 @@ HEADERS += \ udp.h \ textproto.h \ hexdump.h \ + payload.h \ + sample.h \ userscript.h -HEADERS1 += \ - sample.h - SOURCES = \ abstractprotocol.cpp \ crc32c.cpp \ @@ -86,7 +84,6 @@ SOURCES = \ SOURCES += \ mac.cpp \ - payload.cpp \ vlan.cpp \ svlan.cpp \ eth2.cpp \ @@ -104,11 +101,10 @@ SOURCES += \ udp.cpp \ textproto.cpp \ hexdump.cpp \ + payload.cpp \ + sample.cpp \ userscript.cpp -SOURCES1 += \ - sample.cpp - QMAKE_DISTCLEAN += object_script.* include(../protobuf.pri) diff --git a/common/ostprotogui.pro b/common/ostprotogui.pro index 8be6d19..9fedf5d 100644 --- a/common/ostprotogui.pro +++ b/common/ostprotogui.pro @@ -10,7 +10,6 @@ FORMS = \ FORMS += \ mac.ui \ - payload.ui \ vlan.ui \ eth2.ui \ dot3.ui \ @@ -25,15 +24,14 @@ FORMS += \ udp.ui \ textproto.ui \ hexdump.ui \ + payload.ui \ + sample.ui \ userscript.ui -FORMS1 += \ - sample.ui - PROTOS = \ fileformat.proto -# TODO: Move fileformat related stuff into a different library +# TODO: Move fileformat related stuff into a different library - why? HEADERS = \ ostprotolib.h \ abstractfileformat.h \ @@ -51,7 +49,6 @@ HEADERS += \ comboprotocolconfig.h \ protocolwidgetfactory.h \ macconfig.h \ - payloadconfig.h \ vlanconfig.h \ svlanconfig.h \ vlanstackconfig.h \ @@ -73,6 +70,8 @@ HEADERS += \ udpconfig.h \ textprotoconfig.h \ hexdumpconfig.h \ + payloadconfig.h \ + sampleconfig.h \ userscriptconfig.h SOURCES += \ @@ -88,7 +87,6 @@ SOURCES += \ SOURCES += \ protocolwidgetfactory.cpp \ macconfig.cpp \ - payloadconfig.cpp \ vlanconfig.cpp \ eth2config.cpp \ dot3config.cpp \ @@ -105,6 +103,8 @@ SOURCES += \ udpconfig.cpp \ textprotoconfig.cpp \ hexdumpconfig.cpp \ + payloadconfig.cpp \ + sampleconfig.cpp \ userscriptconfig.cpp QMAKE_DISTCLEAN += object_script.* diff --git a/common/protocolmanager.cpp b/common/protocolmanager.cpp index c35dc1c..84e1e2d 100644 --- a/common/protocolmanager.cpp +++ b/common/protocolmanager.cpp @@ -1,5 +1,5 @@ /* -Copyright (C) 2010 Srivats P. +Copyright (C) 2010, 2014 Srivats P. This file is part of "Ostinato" @@ -21,20 +21,20 @@ along with this program. If not, see #include "abstractprotocol.h" #include "protocol.pb.h" -#if 0 -#include "sample.h" -#else + #include "mac.h" -#include "payload.h" #include "vlan.h" #include "svlan.h" -#include "vlanstack.h" +#include "vlanstack.h" + +// L2 Protos #include "dot3.h" #include "llc.h" #include "dot2llc.h" #include "snap.h" #include "dot2snap.h" #include "eth2.h" + // L3 Protos #include "arp.h" #include "ip4.h" @@ -43,18 +43,22 @@ along with this program. If not, see #include "ip4over6.h" #include "ip6over4.h" #include "ip6over6.h" + // L4 Protos #include "icmp.h" #include "igmp.h" #include "mld.h" #include "tcp.h" #include "udp.h" + // L5 Protos #include "textproto.h" + // Special Protos #include "hexdump.h" +#include "payload.h" +#include "sample.h" #include "userscript.h" -#endif ProtocolManager *OstProtocolManager; @@ -63,14 +67,8 @@ ProtocolManager::ProtocolManager() /*! \todo (LOW) calls to registerProtocol() should be done by the protocols themselves (once this is done remove the #includes for all the protocols) */ -#if 0 - registerProtocol(OstProto::Protocol::kSampleFieldNumber, - (void*) SampleProtocol::createInstance); -#else registerProtocol(OstProto::Protocol::kMacFieldNumber, (void*) MacProtocol::createInstance); - registerProtocol(OstProto::Protocol::kPayloadFieldNumber, - (void*) PayloadProtocol::createInstance); registerProtocol(OstProto::Protocol::kVlanFieldNumber, (void*) VlanProtocol::createInstance); @@ -128,10 +126,13 @@ ProtocolManager::ProtocolManager() // Special Protocols registerProtocol(OstProto::Protocol::kHexDumpFieldNumber, (void*) HexDumpProtocol::createInstance); + registerProtocol(OstProto::Protocol::kPayloadFieldNumber, + (void*) PayloadProtocol::createInstance); + registerProtocol(OstProto::Protocol::kSampleFieldNumber, + (void*) SampleProtocol::createInstance); registerProtocol(OstProto::Protocol::kUserScriptFieldNumber, (void*) UserScriptProtocol::createInstance); -#endif populateNeighbourProtocols(); } diff --git a/common/protocolwidgetfactory.cpp b/common/protocolwidgetfactory.cpp index 78f47d1..8c8e30a 100644 --- a/common/protocolwidgetfactory.cpp +++ b/common/protocolwidgetfactory.cpp @@ -20,10 +20,10 @@ along with this program. If not, see #include "protocolwidgetfactory.h" #include "macconfig.h" -#include "payloadconfig.h" #include "vlanconfig.h" #include "svlanconfig.h" #include "vlanstackconfig.h" +// L2 Protocol Widgets #include "eth2config.h" #include "dot3config.h" #include "llcconfig.h" @@ -48,6 +48,8 @@ along with this program. If not, see #include "textprotoconfig.h" // Special Protocol Widgets #include "hexdumpconfig.h" +#include "payloadconfig.h" +#include "sampleconfig.h" #include "userscriptconfig.h" ProtocolWidgetFactory *OstProtocolWidgetFactory; @@ -62,9 +64,6 @@ ProtocolWidgetFactory::ProtocolWidgetFactory() OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProto::Protocol::kMacFieldNumber, (void*) MacConfigForm::createInstance); - OstProtocolWidgetFactory->registerProtocolConfigWidget( - OstProto::Protocol::kPayloadFieldNumber, - (void*) PayloadConfigForm::createInstance); OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProto::Protocol::kVlanFieldNumber, @@ -145,6 +144,12 @@ ProtocolWidgetFactory::ProtocolWidgetFactory() OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProto::Protocol::kHexDumpFieldNumber, (void*) HexDumpConfigForm::createInstance); + OstProtocolWidgetFactory->registerProtocolConfigWidget( + OstProto::Protocol::kPayloadFieldNumber, + (void*) PayloadConfigForm::createInstance); + OstProtocolWidgetFactory->registerProtocolConfigWidget( + OstProto::Protocol::kSampleFieldNumber, + (void*) SampleConfigForm::createInstance); OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProto::Protocol::kUserScriptFieldNumber, (void*) UserScriptConfigForm::createInstance); diff --git a/common/sample.cpp b/common/sample.cpp index 42f9f32..0432cf2 100644 --- a/common/sample.cpp +++ b/common/sample.cpp @@ -1,5 +1,5 @@ /* -Copyright (C) 2010 Srivats P. +Copyright (C) 2010, 2014 Srivats P. This file is part of "Ostinato" @@ -17,26 +17,15 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -#include - #include "sample.h" -SampleConfigForm::SampleConfigForm(QWidget *parent) - : QWidget(parent) -{ - setupUi(this); -} - SampleProtocol::SampleProtocol(StreamBase *stream, AbstractProtocol *parent) : AbstractProtocol(stream, parent) { - /* The configWidget is created lazily */ - configForm = NULL; } SampleProtocol::~SampleProtocol() { - delete configForm; } AbstractProtocol* SampleProtocol::createInstance(StreamBase *stream, @@ -97,7 +86,9 @@ quint32 SampleProtocol::protocolId(ProtocolIdType type) const { switch(type) { - case ProtocolIdIp: return 1234; + case ProtocolIdLlc: return 0xFFFFFF; + case ProtocolIdEth: return 0xFFFF; + case ProtocolIdIp: return 0xFF; default:break; } @@ -120,7 +111,7 @@ int SampleProtocol::fieldCount() const */ int SampleProtocol::frameFieldCount() const { - return 0; + return AbstractProtocol::frameFieldCount(); } /*! @@ -384,14 +375,14 @@ bool SampleProtocol::setFieldData(int index, const QVariant &value, { uint a = value.toUInt(&isOk); if (isOk) - data.set_ab((data.ab() & 0xe000) | (a << 13)); + data.set_ab((data.ab() & 0x1FFF) | ((a & 0x07) << 13)); break; } case sample_b: { uint b = value.toUInt(&isOk); if (isOk) - data.set_ab((data.ab() & 0x1FFF) | b); + data.set_ab((data.ab() & 0xe000) | (b & 0x1FFF)); break; } case sample_payloadLength: @@ -484,63 +475,3 @@ int SampleProtocol::protocolFrameVariableCount() const { return 1; } - -QWidget* SampleProtocol::configWidget() -{ - /* Lazy creation of the configWidget */ - if (configForm == NULL) - { - configForm = new SampleConfigForm; - loadConfigWidget(); - } - - return configForm; -} - -/*! -TODO: Edit this function to load each field's data into the config Widget - -See AbstractProtocol::loadConfigWidget() for more info -*/ -void SampleProtocol::loadConfigWidget() -{ - configWidget(); - - configForm->sampleA->setText(fieldData(sample_a, FieldValue).toString()); - configForm->sampleB->setText(fieldData(sample_b, FieldValue).toString()); - - configForm->samplePayloadLength->setText( - fieldData(sample_payloadLength, FieldValue).toString()); - - configForm->isChecksumOverride->setChecked( - fieldData(sample_is_override_checksum, FieldValue).toBool()); - configForm->sampleChecksum->setText(uintToHexStr( - fieldData(sample_checksum, FieldValue).toUInt(), 2)); - - configForm->sampleX->setText(fieldData(sample_x, FieldValue).toString()); - configForm->sampleY->setText(fieldData(sample_y, FieldValue).toString()); - -} - -/*! -TODO: Edit this function to store each field's data from the config Widget - -See AbstractProtocol::storeConfigWidget() for more info -*/ -void SampleProtocol::storeConfigWidget() -{ - bool isOk; - - configWidget(); - setFieldData(sample_a, configForm->sampleA->text()); - setFieldData(sample_b, configForm->sampleB->text()); - - setFieldData(sample_payloadLength, configForm->samplePayloadLength->text()); - setFieldData(sample_is_override_checksum, - configForm->isChecksumOverride->isChecked()); - setFieldData(sample_checksum, configForm->sampleChecksum->text().toUInt(&isOk, BASE_HEX)); - - setFieldData(sample_x, configForm->sampleX->text()); - setFieldData(sample_y, configForm->sampleY->text()); -} - diff --git a/common/sample.h b/common/sample.h index 90b9be8..475e72f 100644 --- a/common/sample.h +++ b/common/sample.h @@ -1,5 +1,5 @@ /* -Copyright (C) 2010 Srivats P. +Copyright (C) 2010, 2014 Srivats P. This file is part of "Ostinato" @@ -20,10 +20,8 @@ along with this program. If not, see #ifndef _SAMPLE_H #define _SAMPLE_H -#include "sample.pb.h" -#include "ui_sample.h" - #include "abstractprotocol.h" +#include "sample.pb.h" /* Sample Protocol Frame Format - @@ -34,19 +32,9 @@ Sample Protocol Frame Format - Figures in brackets represent field width in bits */ -class SampleConfigForm : public QWidget, public Ui::Sample -{ - Q_OBJECT -public: - SampleConfigForm(QWidget *parent = 0); -private slots: -}; - class SampleProtocol : public AbstractProtocol { -private: - OstProto::Sample data; - SampleConfigForm *configForm; +public: enum samplefield { // Frame Fields @@ -63,7 +51,6 @@ private: sample_fieldCount }; -public: SampleProtocol(StreamBase *stream, AbstractProtocol *parent = 0); virtual ~SampleProtocol(); @@ -95,9 +82,8 @@ public: virtual bool isProtocolFrameSizeVariable() const; virtual int protocolFrameVariableCount() const; - virtual QWidget* configWidget(); - virtual void loadConfigWidget(); - virtual void storeConfigWidget(); +private: + OstProto::Sample data; }; #endif diff --git a/common/sampleconfig.cpp b/common/sampleconfig.cpp new file mode 100644 index 0000000..caaf0d2 --- /dev/null +++ b/common/sampleconfig.cpp @@ -0,0 +1,117 @@ +/* +Copyright (C) 2010, 2014 Srivats P. + +This file is part of "Ostinato" + +This is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +#include "sampleconfig.h" +#include "sample.h" + +SampleConfigForm::SampleConfigForm(QWidget *parent) + : AbstractProtocolConfigForm(parent) +{ + setupUi(this); +} + +SampleConfigForm::~SampleConfigForm() +{ +} + +SampleConfigForm* SampleConfigForm::createInstance() +{ + return new SampleConfigForm; +} + +/*! +TODO: Edit this function to load each field's data into the config Widget + +See AbstractProtocolConfigForm::loadWidget() for more info +*/ +void SampleConfigForm::loadWidget(AbstractProtocol *proto) +{ + sampleA->setText( + proto->fieldData( + SampleProtocol::sample_a, + AbstractProtocol::FieldValue + ).toString()); + sampleB->setText( + proto->fieldData( + SampleProtocol::sample_b, + AbstractProtocol::FieldValue + ).toString()); + + samplePayloadLength->setText( + proto->fieldData( + SampleProtocol::sample_payloadLength, + AbstractProtocol::FieldValue + ).toString()); + + isChecksumOverride->setChecked( + proto->fieldData( + SampleProtocol::sample_is_override_checksum, + AbstractProtocol::FieldValue + ).toBool()); + sampleChecksum->setText(uintToHexStr( + proto->fieldData( + SampleProtocol::sample_checksum, + AbstractProtocol::FieldValue + ).toUInt(), 2)); + + sampleX->setText( + proto->fieldData( + SampleProtocol::sample_x, + AbstractProtocol::FieldValue + ).toString()); + sampleY->setText( + proto->fieldData( + SampleProtocol::sample_y, + AbstractProtocol::FieldValue + ).toString()); +} + +/*! +TODO: Edit this function to store each field's data from the config Widget + +See AbstractProtocolConfigForm::storeWidget() for more info +*/ +void SampleConfigForm::storeWidget(AbstractProtocol *proto) +{ + proto->setFieldData( + SampleProtocol::sample_a, + sampleA->text()); + proto->setFieldData( + SampleProtocol::sample_b, + sampleB->text()); + + proto->setFieldData( + SampleProtocol::sample_payloadLength, + samplePayloadLength->text()); + proto->setFieldData( + SampleProtocol::sample_is_override_checksum, + + isChecksumOverride->isChecked()); + proto->setFieldData( + SampleProtocol::sample_checksum, + hexStrToUInt(sampleChecksum->text())); + + proto->setFieldData( + SampleProtocol::sample_x, + sampleX->text()); + proto->setFieldData( + SampleProtocol::sample_y, + sampleY->text()); +} + diff --git a/common/sampleconfig.h b/common/sampleconfig.h new file mode 100644 index 0000000..8e85976 --- /dev/null +++ b/common/sampleconfig.h @@ -0,0 +1,43 @@ +/* +Copyright (C) 2010, 2014 Srivats P. + +This file is part of "Ostinato" + +This is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +#ifndef _SAMPLE_CONFIG_H +#define _SAMPLE_CONFIG_H + +#include "abstractprotocolconfig.h" +#include "ui_sample.h" + +class SampleConfigForm : + public AbstractProtocolConfigForm, + private Ui::Sample +{ + Q_OBJECT +public: + SampleConfigForm(QWidget *parent = 0); + virtual ~SampleConfigForm(); + + static SampleConfigForm* createInstance(); + + virtual void loadWidget(AbstractProtocol *proto); + virtual void storeWidget(AbstractProtocol *proto); + +private slots: +}; + +#endif