NOX: VLAN - Separated protocol and widget as per new framework + cosmetic layout change in the widget

This commit is contained in:
Srivats P. 2014-03-20 06:03:55 +05:30
parent 4fa4046e9e
commit a97a7d9511
9 changed files with 353 additions and 213 deletions

View File

@ -48,6 +48,7 @@ HEADERS += \
mac.h \ mac.h \
payload.h \ payload.h \
dot3.h \ dot3.h \
vlan.h \
eth2.h \ eth2.h \
ip6.h ip6.h
@ -56,7 +57,6 @@ HEADERS1 += \
snap.h \ snap.h \
dot2llc.h \ dot2llc.h \
dot2snap.h \ dot2snap.h \
vlan.h \
svlan.h \ svlan.h \
vlanstack.h \ vlanstack.h \
arp.h \ arp.h \
@ -89,6 +89,7 @@ SOURCES = \
SOURCES += \ SOURCES += \
mac.cpp \ mac.cpp \
payload.cpp \ payload.cpp \
vlan.cpp \
dot3.cpp \ dot3.cpp \
eth2.cpp \ eth2.cpp \
ip6.cpp ip6.cpp
@ -96,7 +97,6 @@ SOURCES += \
SOURCES1 += \ SOURCES1 += \
llc.cpp \ llc.cpp \
snap.cpp \ snap.cpp \
vlan.cpp \
svlan.cpp \ svlan.cpp \
arp.cpp \ arp.cpp \
ip4.cpp \ ip4.cpp \

View File

@ -10,6 +10,7 @@ FORMS = \
FORMS += \ FORMS += \
mac.ui \ mac.ui \
payload.ui \ payload.ui \
vlan.ui \
dot3.ui \ dot3.ui \
eth2.ui \ eth2.ui \
ip6.ui \ ip6.ui \
@ -17,7 +18,6 @@ FORMS += \
FORMS1 += \ FORMS1 += \
llc.ui \ llc.ui \
snap.ui \ snap.ui \
vlan.ui \
arp.ui \ arp.ui \
ip4.ui \ ip4.ui \
icmp.ui \ icmp.ui \
@ -48,6 +48,7 @@ HEADERS += \
protocolwidgetfactory.h \ protocolwidgetfactory.h \
macconfig.h \ macconfig.h \
payloadconfig.h \ payloadconfig.h \
vlanconfig.h \
dot3config.h \ dot3config.h \
eth2config.h \ eth2config.h \
ip6config.h ip6config.h
@ -66,6 +67,7 @@ SOURCES += \
protocolwidgetfactory.cpp \ protocolwidgetfactory.cpp \
macconfig.cpp \ macconfig.cpp \
payloadconfig.cpp \ payloadconfig.cpp \
vlanconfig.cpp \
dot3config.cpp \ dot3config.cpp \
eth2config.cpp \ eth2config.cpp \
ip6config.cpp ip6config.cpp

View File

@ -26,7 +26,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "snap.h" #include "snap.h"
#include "dot2llc.h" #include "dot2llc.h"
#include "dot2snap.h" #include "dot2snap.h"
#include "vlan.h"
#include "vlanstack.h" #include "vlanstack.h"
#include "arp.h" #include "arp.h"
#include "ip4.h" #include "ip4.h"
@ -47,6 +46,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "mac.h" #include "mac.h"
#include "payload.h" #include "payload.h"
#include "dot3.h" #include "dot3.h"
#include "vlan.h"
#include "eth2.h" #include "eth2.h"
#include "ip6.h" #include "ip6.h"
#endif #endif
@ -70,8 +70,6 @@ ProtocolManager::ProtocolManager()
registerProtocol(OstProto::Protocol::kSvlanFieldNumber, registerProtocol(OstProto::Protocol::kSvlanFieldNumber,
(void*) SVlanProtocol::createInstance); (void*) SVlanProtocol::createInstance);
registerProtocol(OstProto::Protocol::kVlanFieldNumber,
(void*) VlanProtocol::createInstance);
registerProtocol(OstProto::Protocol::kVlanStackFieldNumber, registerProtocol(OstProto::Protocol::kVlanStackFieldNumber,
(void*) VlanStackProtocol::createInstance); (void*) VlanStackProtocol::createInstance);
@ -116,8 +114,13 @@ ProtocolManager::ProtocolManager()
registerProtocol(OstProto::Protocol::kDot3FieldNumber, registerProtocol(OstProto::Protocol::kDot3FieldNumber,
(void*) Dot3Protocol::createInstance); (void*) Dot3Protocol::createInstance);
registerProtocol(OstProto::Protocol::kVlanFieldNumber,
(void*) VlanProtocol::createInstance);
registerProtocol(OstProto::Protocol::kEth2FieldNumber, registerProtocol(OstProto::Protocol::kEth2FieldNumber,
(void*) Eth2Protocol::createInstance); (void*) Eth2Protocol::createInstance);
registerProtocol(OstProto::Protocol::kIp6FieldNumber, registerProtocol(OstProto::Protocol::kIp6FieldNumber,
(void*) Ip6Protocol::createInstance); (void*) Ip6Protocol::createInstance);
#endif #endif

View File

@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "macconfig.h" #include "macconfig.h"
#include "payloadconfig.h" #include "payloadconfig.h"
#include "dot3config.h" #include "dot3config.h"
#include "vlanconfig.h"
#include "eth2config.h" #include "eth2config.h"
#include "ip6config.h" #include "ip6config.h"
@ -44,9 +45,15 @@ ProtocolWidgetFactory::ProtocolWidgetFactory()
OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProtocolWidgetFactory->registerProtocolConfigWidget(
OstProto::Protocol::kDot3FieldNumber, OstProto::Protocol::kDot3FieldNumber,
(void*) Dot3ConfigForm::createInstance); (void*) Dot3ConfigForm::createInstance);
OstProtocolWidgetFactory->registerProtocolConfigWidget(
OstProto::Protocol::kVlanFieldNumber,
(void*) VlanConfigForm::createInstance);
OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProtocolWidgetFactory->registerProtocolConfigWidget(
OstProto::Protocol::kEth2FieldNumber, OstProto::Protocol::kEth2FieldNumber,
(void*) Eth2ConfigForm::createInstance); (void*) Eth2ConfigForm::createInstance);
OstProtocolWidgetFactory->registerProtocolConfigWidget( OstProtocolWidgetFactory->registerProtocolConfigWidget(
OstProto::Protocol::kIp6FieldNumber, OstProto::Protocol::kIp6FieldNumber,
(void*) Ip6ConfigForm::createInstance); (void*) Ip6ConfigForm::createInstance);

View File

@ -17,25 +17,15 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/> along with this program. If not, see <http://www.gnu.org/licenses/>
*/ */
#include <qendian.h>
#include "vlan.h" #include "vlan.h"
VlanConfigForm::VlanConfigForm(QWidget *parent)
: QWidget(parent)
{
setupUi(this);
}
VlanProtocol::VlanProtocol(StreamBase *stream, AbstractProtocol *parent) VlanProtocol::VlanProtocol(StreamBase *stream, AbstractProtocol *parent)
: AbstractProtocol(stream, parent) : AbstractProtocol(stream, parent)
{ {
configForm = NULL;
} }
VlanProtocol::~VlanProtocol() VlanProtocol::~VlanProtocol()
{ {
delete configForm;
} }
AbstractProtocol* VlanProtocol::createInstance(StreamBase *stream, AbstractProtocol* VlanProtocol::createInstance(StreamBase *stream,
@ -206,6 +196,12 @@ QVariant VlanProtocol::fieldData(int index, FieldAttrib attrib,
// Meta fields // Meta fields
case vlan_isOverrideTpid: case vlan_isOverrideTpid:
switch(attrib)
{
case FieldValue: return data.is_override_tpid();
default: break;
}
break;
default: default:
break; break;
} }
@ -213,45 +209,62 @@ QVariant VlanProtocol::fieldData(int index, FieldAttrib attrib,
return AbstractProtocol::fieldData(index, attrib, streamIndex); return AbstractProtocol::fieldData(index, attrib, streamIndex);
} }
bool VlanProtocol::setFieldData(int /*index*/, const QVariant &/*value*/, bool VlanProtocol::setFieldData(int index, const QVariant &value,
FieldAttrib /*attrib*/) FieldAttrib attrib)
{ {
return false; bool isOk = false;
if (attrib != FieldValue)
goto _exit;
switch (index)
{
case vlan_tpid:
{
uint tpid = value.toUInt(&isOk);
if (isOk)
data.set_tpid(tpid);
break;
} }
case vlan_prio:
QWidget* VlanProtocol::configWidget()
{ {
if (configForm == NULL) uint prio = value.toUInt(&isOk);
{ if (isOk)
configForm = new VlanConfigForm;
loadConfigWidget();
}
return configForm;
}
void VlanProtocol::loadConfigWidget()
{
configWidget();
configForm->cbTpidOverride->setChecked(data.is_override_tpid());
configForm->leTpid->setText(uintToHexStr(fieldData(vlan_tpid, FieldValue).toUInt(), 2));
configForm->cmbPrio->setCurrentIndex(fieldData(vlan_prio, FieldValue).toUInt());
configForm->cmbCfiDei->setCurrentIndex(fieldData(vlan_cfiDei, FieldValue).toUInt());
configForm->leVlanId->setText(fieldData(vlan_vlanId, FieldValue).toString());
}
void VlanProtocol::storeConfigWidget()
{
bool isOk;
configWidget();
data.set_is_override_tpid(configForm->cbTpidOverride->isChecked());
data.set_tpid(configForm->leTpid->text().remove(QChar(' ')).toULong(&isOk, BASE_HEX));
data.set_vlan_tag( data.set_vlan_tag(
((configForm->cmbPrio->currentIndex() & 0x07) << 13) | ((prio & 0x07) << 13) | (data.vlan_tag() & 0x1FFF));
((configForm->cmbCfiDei->currentIndex() & 0x01) << 12) | break;
(configForm->leVlanId->text().toULong(&isOk) & 0x0FFF)); }
case vlan_cfiDei:
{
uint cfiDei = value.toUInt(&isOk);
if (isOk)
data.set_vlan_tag(
((cfiDei & 0x01) << 12) | (data.vlan_tag() & 0xEFFF));
break;
}
case vlan_vlanId:
{
uint vlanId = value.toUInt(&isOk);
if (isOk)
data.set_vlan_tag(
(vlanId & 0x0FFF) | (data.vlan_tag() & 0xF000));
break;
} }
// Meta-Fields
case vlan_isOverrideTpid:
{
bool override = value.toUInt(&isOk);
if (isOk)
data.set_is_override_tpid(override);
break;
}
default:
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
index);
break;
}
_exit:
return isOk;
}

View File

@ -17,25 +17,15 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/> along with this program. If not, see <http://www.gnu.org/licenses/>
*/ */
#ifndef _Vlan_H #ifndef _VLAN_H
#define _Vlan_H #define _VLAN_H
#include "abstractprotocol.h" #include "abstractprotocol.h"
#include "vlan.pb.h" #include "vlan.pb.h"
#include "ui_vlan.h"
class VlanConfigForm : public QWidget, public Ui::Vlan
{
Q_OBJECT
public:
VlanConfigForm(QWidget *parent = 0);
};
class VlanProtocol : public AbstractProtocol class VlanProtocol : public AbstractProtocol
{ {
private: public:
VlanConfigForm *configForm;
enum Vlanfield enum Vlanfield
{ {
vlan_tpid, vlan_tpid,
@ -49,10 +39,6 @@ private:
vlan_fieldCount vlan_fieldCount
}; };
protected:
OstProto::Vlan data;
public:
VlanProtocol(StreamBase *stream, AbstractProtocol *parent = 0); VlanProtocol(StreamBase *stream, AbstractProtocol *parent = 0);
virtual ~VlanProtocol(); virtual ~VlanProtocol();
@ -74,9 +60,8 @@ public:
virtual bool setFieldData(int index, const QVariant &value, virtual bool setFieldData(int index, const QVariant &value,
FieldAttrib attrib = FieldValue); FieldAttrib attrib = FieldValue);
virtual QWidget* configWidget(); protected:
virtual void loadConfigWidget(); OstProto::Vlan data;
virtual void storeConfigWidget();
}; };
#endif #endif

View File

@ -5,34 +5,13 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>268</width> <width>274</width>
<height>96</height> <height>106</height>
</rect> </rect>
</property> </property>
<property name="windowTitle" > <property name="windowTitle" >
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QHBoxLayout" >
<property name="spacing" >
<number>6</number>
</property>
<property name="leftMargin" >
<number>9</number>
</property>
<property name="topMargin" >
<number>9</number>
</property>
<property name="rightMargin" >
<number>9</number>
</property>
<property name="bottomMargin" >
<number>9</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox" >
<property name="title" >
<string>VLAN</string>
</property>
<layout class="QGridLayout" > <layout class="QGridLayout" >
<item row="0" column="0" > <item row="0" column="0" >
<widget class="QCheckBox" name="cbTpidOverride" > <widget class="QCheckBox" name="cbTpidOverride" >
@ -152,8 +131,31 @@
</property> </property>
</widget> </widget>
</item> </item>
</layout> <item row="1" column="4" >
</widget> <spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" >
<size>
<width>111</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" >
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" >
<size>
<width>20</width>
<height>51</height>
</size>
</property>
</spacer>
</item> </item>
</layout> </layout>
</widget> </widget>

87
common/vlanconfig.cpp Normal file
View File

@ -0,0 +1,87 @@
/*
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 "vlanconfig.h"
#include "vlan.h"
VlanConfigForm::VlanConfigForm(QWidget *parent)
: AbstractProtocolConfigForm(parent)
{
setupUi(this);
}
VlanConfigForm::~VlanConfigForm()
{
}
VlanConfigForm* VlanConfigForm::createInstance()
{
return new VlanConfigForm;
}
void VlanConfigForm::loadWidget(AbstractProtocol *proto)
{
cbTpidOverride->setChecked(
proto->fieldData(
VlanProtocol::vlan_isOverrideTpid,
AbstractProtocol::FieldValue
).toBool());
leTpid->setText(uintToHexStr(
proto->fieldData(
VlanProtocol::vlan_tpid,
AbstractProtocol::FieldValue)
.toUInt(), 2));
cmbPrio->setCurrentIndex(
proto->fieldData(
VlanProtocol::vlan_prio,
AbstractProtocol::FieldValue)
.toUInt());
cmbCfiDei->setCurrentIndex(
proto->fieldData(
VlanProtocol::vlan_cfiDei,
AbstractProtocol::FieldValue)
.toUInt());
leVlanId->setText(
proto->fieldData(
VlanProtocol::vlan_vlanId,
AbstractProtocol::FieldValue)
.toString());
}
void VlanConfigForm::storeWidget(AbstractProtocol *proto)
{
bool isOk;
proto->setFieldData(
VlanProtocol::vlan_isOverrideTpid,
cbTpidOverride->isChecked());
proto->setFieldData(
VlanProtocol::vlan_tpid,
leTpid->text().remove(QChar(' ')).toUInt(&isOk, BASE_HEX));
proto->setFieldData(
VlanProtocol::vlan_prio,
cmbPrio->currentIndex());
proto->setFieldData(
VlanProtocol::vlan_cfiDei,
cmbCfiDei->currentIndex());
proto->setFieldData(
VlanProtocol::vlan_vlanId,
leVlanId->text());
}

41
common/vlanconfig.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 _VLAN_CONFIG_H
#define _VLAN_CONFIG_H
#include "abstractprotocolconfig.h"
#include "ui_vlan.h"
class VlanConfigForm :
public AbstractProtocolConfigForm,
private Ui::Vlan
{
Q_OBJECT
public:
VlanConfigForm(QWidget *parent = 0);
virtual ~VlanConfigForm();
static VlanConfigForm* createInstance();
virtual void loadWidget(AbstractProtocol *proto);
virtual void storeWidget(AbstractProtocol *proto);
};
#endif