From 21b606e9ea81d5e6d475b7d027083c851422f021 Mon Sep 17 00:00:00 2001 From: "Srivats P." Date: Tue, 8 Apr 2014 05:52:27 +0530 Subject: [PATCH] NOX: TCP - Separated protocol and widget as per new framework --- common/ostproto.pro | 8 +- common/ostprotogui.pro | 10 +- common/protocolmanager.cpp | 11 +- common/protocolwidgetfactory.cpp | 7 ++ common/tcp.cpp | 103 ------------------ common/tcp.h | 18 +--- common/tcpconfig.cpp | 175 +++++++++++++++++++++++++++++++ common/tcpconfig.h | 41 ++++++++ 8 files changed, 244 insertions(+), 129 deletions(-) create mode 100644 common/tcpconfig.cpp create mode 100644 common/tcpconfig.h diff --git a/common/ostproto.pro b/common/ostproto.pro index 2d7265f..853fe15 100644 --- a/common/ostproto.pro +++ b/common/ostproto.pro @@ -62,7 +62,8 @@ HEADERS += \ ip4over4.h \ ip4over6.h \ ip6over4.h \ - ip6over6.h + ip6over6.h \ + tcp.h HEADERS1 += \ ipv4addressdelegate.h \ @@ -71,7 +72,6 @@ HEADERS1 += \ gmp.h \ igmp.h \ mld.h \ - tcp.h \ udp.h \ textproto.h \ userscript.h \ @@ -97,14 +97,14 @@ SOURCES += \ snap.cpp \ arp.cpp \ ip4.cpp \ - ip6.cpp + ip6.cpp \ + tcp.cpp SOURCES1 += \ icmp.cpp \ gmp.cpp \ igmp.cpp \ mld.cpp \ - tcp.cpp \ udp.cpp \ textproto.cpp \ userscript.cpp \ diff --git a/common/ostprotogui.pro b/common/ostprotogui.pro index 80fbab7..a848356 100644 --- a/common/ostprotogui.pro +++ b/common/ostprotogui.pro @@ -17,12 +17,12 @@ FORMS += \ snap.ui \ arp.ui \ ip4.ui \ - ip6.ui + ip6.ui \ + tcp.ui FORMS1 += \ icmp.ui \ gmp.ui \ - tcp.ui \ udp.ui \ textproto.ui \ userscript.ui \ @@ -61,7 +61,8 @@ HEADERS += \ arpconfig.h \ ip4config.h \ ip6config.h \ - ip4over4config.h + ip4over4config.h \ + tcpconfig.h SOURCES += \ ostprotolib.cpp \ @@ -84,7 +85,8 @@ SOURCES += \ snapconfig.cpp \ arpconfig.cpp \ ip4config.cpp \ - ip6config.cpp + ip6config.cpp \ + tcpconfig.cpp QMAKE_DISTCLEAN += object_script.* diff --git a/common/protocolmanager.cpp b/common/protocolmanager.cpp index 175864e..826eea3 100644 --- a/common/protocolmanager.cpp +++ b/common/protocolmanager.cpp @@ -25,7 +25,6 @@ along with this program. If not, see #include "icmp.h" #include "igmp.h" #include "mld.h" -#include "tcp.h" #include "udp.h" #include "textproto.h" #include "userscript.h" @@ -43,6 +42,7 @@ along with this program. If not, see #include "snap.h" #include "dot2snap.h" #include "eth2.h" +// L3 Protos #include "arp.h" #include "ip4.h" #include "ip6.h" @@ -50,6 +50,8 @@ along with this program. If not, see #include "ip4over6.h" #include "ip6over4.h" #include "ip6over6.h" +// L4 Protos +#include "tcp.h" #endif ProtocolManager *OstProtocolManager; @@ -66,8 +68,6 @@ ProtocolManager::ProtocolManager() (void*) IgmpProtocol::createInstance); registerProtocol(OstProto::Protocol::kMldFieldNumber, (void*) MldProtocol::createInstance); - registerProtocol(OstProto::Protocol::kTcpFieldNumber, - (void*) TcpProtocol::createInstance); registerProtocol(OstProto::Protocol::kUdpFieldNumber, (void*) UdpProtocol::createInstance); registerProtocol(OstProto::Protocol::kTextProtocolFieldNumber, @@ -106,6 +106,7 @@ ProtocolManager::ProtocolManager() registerProtocol(OstProto::Protocol::kDot2SnapFieldNumber, (void*) Dot2SnapProtocol::createInstance); + // Layer 3 Protocols registerProtocol(OstProto::Protocol::kArpFieldNumber, (void*) ArpProtocol::createInstance); registerProtocol(OstProto::Protocol::kIp4FieldNumber, @@ -121,6 +122,10 @@ ProtocolManager::ProtocolManager() (void*) Ip6over4Protocol::createInstance); registerProtocol(OstProto::Protocol::kIp6over6FieldNumber, (void*) Ip6over6Protocol::createInstance); + + // Layer 4 Protocols + registerProtocol(OstProto::Protocol::kTcpFieldNumber, + (void*) TcpProtocol::createInstance); #endif populateNeighbourProtocols(); } diff --git a/common/protocolwidgetfactory.cpp b/common/protocolwidgetfactory.cpp index 1d7f5bb..aa878c0 100644 --- a/common/protocolwidgetfactory.cpp +++ b/common/protocolwidgetfactory.cpp @@ -37,6 +37,7 @@ along with this program. If not, see #include "ip4over6config.h" #include "ip6over4config.h" #include "ip6over6config.h" +#include "tcpconfig.h" ProtocolWidgetFactory *OstProtocolWidgetFactory; QMap ProtocolWidgetFactory::configWidgetFactory; @@ -83,6 +84,7 @@ ProtocolWidgetFactory::ProtocolWidgetFactory() OstProto::Protocol::kDot2SnapFieldNumber, (void*) Dot2SnapConfigForm::createInstance); + // Layer 3 Protocols OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProto::Protocol::kArpFieldNumber, (void*) ArpConfigForm::createInstance); @@ -105,6 +107,11 @@ ProtocolWidgetFactory::ProtocolWidgetFactory() OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProto::Protocol::kIp6over6FieldNumber, (void*) Ip6over6ConfigForm::createInstance); + + // Layer 4 Protocols + OstProtocolWidgetFactory->registerProtocolConfigWidget( + OstProto::Protocol::kTcpFieldNumber, + (void*) TcpConfigForm::createInstance); } ProtocolWidgetFactory::~ProtocolWidgetFactory() diff --git a/common/tcp.cpp b/common/tcp.cpp index 39c71bf..2f9a5b4 100644 --- a/common/tcp.cpp +++ b/common/tcp.cpp @@ -17,26 +17,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -#include -#include - #include "tcp.h" -TcpConfigForm::TcpConfigForm(QWidget *parent) - : QWidget(parent) -{ - setupUi(this); -} TcpProtocol::TcpProtocol(StreamBase *stream, AbstractProtocol *parent) : AbstractProtocol(stream, parent) { - configForm = NULL; } TcpProtocol::~TcpProtocol() { - delete configForm; } AbstractProtocol* TcpProtocol::createInstance(StreamBase *stream, @@ -614,96 +604,3 @@ int TcpProtocol::protocolFrameVariableCount() const return protocolFramePayloadVariableCount(); } -QWidget* TcpProtocol::configWidget() -{ - if (configForm == NULL) - { - configForm = new TcpConfigForm; - loadConfigWidget(); - } - return configForm; -} - -void TcpProtocol::loadConfigWidget() -{ - configWidget(); - - configForm->leTcpSrcPort->setText( - fieldData(tcp_src_port, FieldValue).toString()); - configForm->cbTcpSrcPortOverride->setChecked( - fieldData(tcp_is_override_src_port, FieldValue).toBool()); - - configForm->leTcpDstPort->setText( - fieldData(tcp_dst_port, FieldValue).toString()); - configForm->cbTcpDstPortOverride->setChecked( - fieldData(tcp_is_override_dst_port, FieldValue).toBool()); - - configForm->leTcpSeqNum->setText( - fieldData(tcp_seq_num, FieldValue).toString()); - configForm->leTcpAckNum->setText( - fieldData(tcp_ack_num, FieldValue).toString()); - - configForm->leTcpHdrLen->setText( - fieldData(tcp_hdrlen, FieldValue).toString()); - configForm->cbTcpHdrLenOverride->setChecked( - fieldData(tcp_is_override_hdrlen, FieldValue).toBool()); - - configForm->leTcpWindow->setText( - fieldData(tcp_window, FieldValue).toString()); - - configForm->leTcpCksum->setText(QString("%1").arg( - fieldData(tcp_cksum, FieldValue).toUInt(), 4, BASE_HEX, QChar('0'))); - configForm->cbTcpCksumOverride->setChecked( - fieldData(tcp_is_override_cksum, FieldValue).toBool()); - - configForm->leTcpUrgentPointer->setText( - fieldData(tcp_urg_ptr, FieldValue).toString()); - - uint flags = fieldData(tcp_flags, FieldValue).toUInt(); - configForm->cbTcpFlagsUrg->setChecked((flags & TCP_FLAG_URG) > 0); - configForm->cbTcpFlagsAck->setChecked((flags & TCP_FLAG_ACK) > 0); - configForm->cbTcpFlagsPsh->setChecked((flags & TCP_FLAG_PSH) > 0); - configForm->cbTcpFlagsRst->setChecked((flags & TCP_FLAG_RST) > 0); - configForm->cbTcpFlagsSyn->setChecked((flags & TCP_FLAG_SYN) > 0); - configForm->cbTcpFlagsFin->setChecked((flags & TCP_FLAG_FIN) > 0); -} - -void TcpProtocol::storeConfigWidget() -{ - bool isOk; - int ff = 0; - - configWidget(); - - setFieldData(tcp_src_port, configForm->leTcpSrcPort->text()); - setFieldData(tcp_is_override_src_port, - configForm->cbTcpSrcPortOverride->isChecked()); - setFieldData(tcp_dst_port, configForm->leTcpDstPort->text()); - setFieldData(tcp_is_override_dst_port, - configForm->cbTcpDstPortOverride->isChecked()); - - setFieldData(tcp_seq_num, configForm->leTcpSeqNum->text()); - setFieldData(tcp_ack_num, configForm->leTcpAckNum->text()); - - setFieldData(tcp_hdrlen, configForm->leTcpHdrLen->text()); - setFieldData(tcp_is_override_hdrlen, - configForm->cbTcpHdrLenOverride->isChecked()); - - setFieldData(tcp_window, configForm->leTcpWindow->text()); - - setFieldData(tcp_cksum, configForm->leTcpCksum->text().remove(QChar(' ')) - .toUInt(&isOk, BASE_HEX)); - setFieldData(tcp_is_override_cksum, - configForm->cbTcpCksumOverride->isChecked()); - - setFieldData(tcp_urg_ptr, configForm->leTcpUrgentPointer->text()); - - if (configForm->cbTcpFlagsUrg->isChecked()) ff |= TCP_FLAG_URG; - if (configForm->cbTcpFlagsAck->isChecked()) ff |= TCP_FLAG_ACK; - if (configForm->cbTcpFlagsPsh->isChecked()) ff |= TCP_FLAG_PSH; - if (configForm->cbTcpFlagsRst->isChecked()) ff |= TCP_FLAG_RST; - if (configForm->cbTcpFlagsSyn->isChecked()) ff |= TCP_FLAG_SYN; - if (configForm->cbTcpFlagsFin->isChecked()) ff |= TCP_FLAG_FIN; - setFieldData(tcp_flags, ff); -} - diff --git a/common/tcp.h b/common/tcp.h index 9addef0..276ba65 100644 --- a/common/tcp.h +++ b/common/tcp.h @@ -23,7 +23,6 @@ along with this program. If not, see #include "abstractprotocol.h" #include "tcp.pb.h" -#include "ui_tcp.h" #define TCP_FLAG_URG 0x20 #define TCP_FLAG_ACK 0x10 @@ -32,18 +31,9 @@ along with this program. If not, see #define TCP_FLAG_SYN 0x02 #define TCP_FLAG_FIN 0x01 -class TcpConfigForm : public QWidget, public Ui::tcp -{ - Q_OBJECT -public: - TcpConfigForm(QWidget *parent = 0); -}; - class TcpProtocol : public AbstractProtocol { -private: - OstProto::Tcp data; - TcpConfigForm *configForm; +public: enum tcpfield { tcp_src_port = 0, @@ -65,7 +55,6 @@ private: tcp_fieldCount }; -public: TcpProtocol(StreamBase *stream, AbstractProtocol *parent = 0); virtual ~TcpProtocol(); @@ -93,9 +82,8 @@ public: virtual bool isProtocolFrameValueVariable() const; virtual int protocolFrameVariableCount() const; - virtual QWidget* configWidget(); - virtual void loadConfigWidget(); - virtual void storeConfigWidget(); +private: + OstProto::Tcp data; }; #endif diff --git a/common/tcpconfig.cpp b/common/tcpconfig.cpp new file mode 100644 index 0000000..ff08f7d --- /dev/null +++ b/common/tcpconfig.cpp @@ -0,0 +1,175 @@ +/* +Copyright (C) 2010 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 "tcpconfig.h" +#include "tcp.h" + +TcpConfigForm::TcpConfigForm(QWidget *parent) + : AbstractProtocolConfigForm(parent) +{ + setupUi(this); +} + +TcpConfigForm::~TcpConfigForm() +{ +} + +TcpConfigForm* TcpConfigForm::createInstance() +{ + return new TcpConfigForm; +} + +void TcpConfigForm::loadWidget(AbstractProtocol *proto) +{ + leTcpSrcPort->setText( + proto->fieldData( + TcpProtocol::tcp_src_port, + AbstractProtocol::FieldValue + ).toString()); + cbTcpSrcPortOverride->setChecked( + proto->fieldData( + TcpProtocol::tcp_is_override_src_port, + AbstractProtocol::FieldValue + ).toBool()); + + leTcpDstPort->setText( + proto->fieldData( + TcpProtocol::tcp_dst_port, + AbstractProtocol::FieldValue + ).toString()); + cbTcpDstPortOverride->setChecked( + proto->fieldData( + TcpProtocol::tcp_is_override_dst_port, + AbstractProtocol::FieldValue + ).toBool()); + + leTcpSeqNum->setText( + proto->fieldData( + TcpProtocol::tcp_seq_num, + AbstractProtocol::FieldValue + ).toString()); + leTcpAckNum->setText( + proto->fieldData( + TcpProtocol::tcp_ack_num, + AbstractProtocol::FieldValue + ).toString()); + + leTcpHdrLen->setText( + proto->fieldData( + TcpProtocol::tcp_hdrlen, + AbstractProtocol::FieldValue + ).toString()); + cbTcpHdrLenOverride->setChecked( + proto->fieldData( + TcpProtocol::tcp_is_override_hdrlen, + AbstractProtocol::FieldValue + ).toBool()); + + leTcpWindow->setText( + proto->fieldData( + TcpProtocol::tcp_window, + AbstractProtocol::FieldValue + ).toString()); + + leTcpCksum->setText(uintToHexStr( + proto->fieldData( + TcpProtocol::tcp_cksum, + AbstractProtocol::FieldValue + ).toUInt(), 2)); + cbTcpCksumOverride->setChecked( + proto->fieldData( + TcpProtocol::tcp_is_override_cksum, + AbstractProtocol::FieldValue + ).toBool()); + + leTcpUrgentPointer->setText( + proto->fieldData( + TcpProtocol::tcp_urg_ptr, + AbstractProtocol::FieldValue + ).toString()); + + uint flags = proto->fieldData( + TcpProtocol::tcp_flags, + AbstractProtocol::FieldValue + ).toUInt(); + + cbTcpFlagsUrg->setChecked((flags & TCP_FLAG_URG) > 0); + cbTcpFlagsAck->setChecked((flags & TCP_FLAG_ACK) > 0); + cbTcpFlagsPsh->setChecked((flags & TCP_FLAG_PSH) > 0); + cbTcpFlagsRst->setChecked((flags & TCP_FLAG_RST) > 0); + cbTcpFlagsSyn->setChecked((flags & TCP_FLAG_SYN) > 0); + cbTcpFlagsFin->setChecked((flags & TCP_FLAG_FIN) > 0); +} + +void TcpConfigForm::storeWidget(AbstractProtocol *proto) +{ + int ff = 0; + + proto->setFieldData( + TcpProtocol::tcp_src_port, + leTcpSrcPort->text()); + proto->setFieldData( + TcpProtocol::tcp_is_override_src_port, + cbTcpSrcPortOverride->isChecked()); + proto->setFieldData( + TcpProtocol::tcp_dst_port, + leTcpDstPort->text()); + proto->setFieldData( + TcpProtocol::tcp_is_override_dst_port, + cbTcpDstPortOverride->isChecked()); + + proto->setFieldData( + TcpProtocol::tcp_seq_num, + leTcpSeqNum->text()); + proto->setFieldData( + TcpProtocol::tcp_ack_num, + leTcpAckNum->text()); + + proto->setFieldData( + TcpProtocol::tcp_hdrlen, + leTcpHdrLen->text()); + proto->setFieldData( + TcpProtocol::tcp_is_override_hdrlen, + cbTcpHdrLenOverride->isChecked()); + + proto->setFieldData( + TcpProtocol::tcp_window, + leTcpWindow->text()); + + proto->setFieldData( + TcpProtocol::tcp_cksum, + hexStrToUInt(leTcpCksum->text())); + proto->setFieldData( + TcpProtocol::tcp_is_override_cksum, + cbTcpCksumOverride->isChecked()); + + proto->setFieldData( + TcpProtocol::tcp_urg_ptr, + leTcpUrgentPointer->text()); + + if (cbTcpFlagsUrg->isChecked()) ff |= TCP_FLAG_URG; + if (cbTcpFlagsAck->isChecked()) ff |= TCP_FLAG_ACK; + if (cbTcpFlagsPsh->isChecked()) ff |= TCP_FLAG_PSH; + if (cbTcpFlagsRst->isChecked()) ff |= TCP_FLAG_RST; + if (cbTcpFlagsSyn->isChecked()) ff |= TCP_FLAG_SYN; + if (cbTcpFlagsFin->isChecked()) ff |= TCP_FLAG_FIN; + + proto->setFieldData(TcpProtocol::tcp_flags, ff); +} + diff --git a/common/tcpconfig.h b/common/tcpconfig.h new file mode 100644 index 0000000..859238a --- /dev/null +++ b/common/tcpconfig.h @@ -0,0 +1,41 @@ +/* +Copyright (C) 2010 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 _TCP_CONFIG_H +#define _TCP_CONFIG_H + +#include "abstractprotocolconfig.h" +#include "ui_tcp.h" + +class TcpConfigForm : + public AbstractProtocolConfigForm, + private Ui::tcp +{ + Q_OBJECT +public: + TcpConfigForm(QWidget *parent = 0); + virtual ~TcpConfigForm(); + + static TcpConfigForm* createInstance(); + + virtual void loadWidget(AbstractProtocol *proto); + virtual void storeWidget(AbstractProtocol *proto); +}; + +#endif