NOX: TCP - Separated protocol and widget as per new framework

This commit is contained in:
Srivats P. 2014-04-08 05:52:27 +05:30
parent 3ba67e9ee3
commit 21b606e9ea
8 changed files with 244 additions and 129 deletions

View File

@ -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 \

View File

@ -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.*

View File

@ -25,7 +25,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#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 <http://www.gnu.org/licenses/>
#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 <http://www.gnu.org/licenses/>
#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();
}

View File

@ -37,6 +37,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "ip4over6config.h"
#include "ip6over4config.h"
#include "ip6over6config.h"
#include "tcpconfig.h"
ProtocolWidgetFactory *OstProtocolWidgetFactory;
QMap<int, void*> 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()

View File

@ -17,26 +17,16 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
#include <qendian.h>
#include <QHostAddress>
#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);
}

View File

@ -23,7 +23,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#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 <http://www.gnu.org/licenses/>
#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

175
common/tcpconfig.cpp Normal file
View File

@ -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 <http://www.gnu.org/licenses/>
*/
#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);
}

41
common/tcpconfig.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>
*/
#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