ostinato/common/ip4config.cpp

313 lines
9.7 KiB
C++

/*
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 "ip4config.h"
#include "ip4.h"
#include "ipv4addressvalidator.h"
#include <QHostAddress>
Ip4ConfigForm::Ip4ConfigForm(QWidget *parent)
: AbstractProtocolConfigForm(parent)
{
setupUi(this);
leIpVersion->setValidator(new QIntValidator(0, 15, this));
leIpOptions->setValidator(new QRegExpValidator(QRegExp("[0-9a-fA-F]*"),
this));
leIpSrcAddr->setValidator(new IPv4AddressValidator(this));
leIpSrcAddrMask->setValidator(new IPv4AddressValidator(this));
leIpDstAddr->setValidator(new IPv4AddressValidator(this));
leIpDstAddrMask->setValidator(new IPv4AddressValidator(this));
connect(cmbIpSrcAddrMode, SIGNAL(currentIndexChanged(int)),
this, SLOT(on_cmbIpSrcAddrMode_currentIndexChanged(int)));
connect(cmbIpDstAddrMode, SIGNAL(currentIndexChanged(int)),
this, SLOT(on_cmbIpDstAddrMode_currentIndexChanged(int)));
}
Ip4ConfigForm::~Ip4ConfigForm()
{
}
Ip4ConfigForm* Ip4ConfigForm::createInstance()
{
return new Ip4ConfigForm;
}
void Ip4ConfigForm::loadWidget(AbstractProtocol *proto)
{
cbIpVersionOverride->setChecked(
proto->fieldData(
Ip4Protocol::ip4_isOverrideVer,
AbstractProtocol::FieldValue
).toBool());
leIpVersion->setText(
proto->fieldData(
Ip4Protocol::ip4_ver,
AbstractProtocol::FieldValue
).toString());
cbIpHdrLenOverride->setChecked(
proto->fieldData(
Ip4Protocol::ip4_isOverrideHdrLen,
AbstractProtocol::FieldValue
).toBool());
leIpHdrLen->setText(
proto->fieldData(
Ip4Protocol::ip4_hdrLen,
AbstractProtocol::FieldValue
).toString());
tosDscp->setValue(
proto->fieldData(
Ip4Protocol::ip4_tos,
AbstractProtocol::FieldValue
).toUInt());
cbIpLengthOverride->setChecked(
proto->fieldData(
Ip4Protocol::ip4_isOverrideTotLen,
AbstractProtocol::FieldValue
).toBool());
leIpLength->setText(
proto->fieldData(
Ip4Protocol::ip4_totLen,
AbstractProtocol::FieldValue
).toString());
leIpId->setText(uintToHexStr(
proto->fieldData(
Ip4Protocol::ip4_id,
AbstractProtocol::FieldValue
).toUInt(), 2));
leIpFragOfs->setText(
proto->fieldData(
Ip4Protocol::ip4_fragOfs,
AbstractProtocol::FieldValue
).toString());
cbIpFlagsDf->setChecked((
proto->fieldData(
Ip4Protocol::ip4_flags,
AbstractProtocol::FieldValue
).toUInt() & IP_FLAG_DF) > 0);
cbIpFlagsMf->setChecked((
proto->fieldData(
Ip4Protocol::ip4_flags,
AbstractProtocol::FieldValue
).toUInt() & IP_FLAG_MF) > 0);
leIpTtl->setText(
proto->fieldData(
Ip4Protocol::ip4_ttl,
AbstractProtocol::FieldValue
).toString());
cbIpProtocolOverride->setChecked(
proto->fieldData(
Ip4Protocol::ip4_isOverrideProto,
AbstractProtocol::FieldValue
).toBool());
leIpProto->setText(uintToHexStr(
proto->fieldData(
Ip4Protocol::ip4_proto,
AbstractProtocol::FieldValue
).toUInt(), 1));
cbIpCksumOverride->setChecked(
proto->fieldData(
Ip4Protocol::ip4_isOverrideCksum,
AbstractProtocol::FieldValue
).toBool());
leIpCksum->setText(uintToHexStr(
proto->fieldData(
Ip4Protocol::ip4_cksum,
AbstractProtocol::FieldValue
).toUInt(), 2));
leIpSrcAddr->setText(QHostAddress(
proto->fieldData(
Ip4Protocol::ip4_srcAddr,
AbstractProtocol::FieldValue
).toUInt()).toString());
cmbIpSrcAddrMode->setCurrentIndex(
proto->fieldData(
Ip4Protocol::ip4_srcAddrMode,
AbstractProtocol::FieldValue
).toUInt());
leIpSrcAddrCount->setText(
proto->fieldData(
Ip4Protocol::ip4_srcAddrCount,
AbstractProtocol::FieldValue
).toString());
leIpSrcAddrMask->setText(QHostAddress(
proto->fieldData(
Ip4Protocol::ip4_srcAddrMask,
AbstractProtocol::FieldValue
).toUInt()).toString());
leIpDstAddr->setText(QHostAddress(
proto->fieldData(
Ip4Protocol::ip4_dstAddr,
AbstractProtocol::FieldValue
).toUInt()).toString());
cmbIpDstAddrMode->setCurrentIndex(
proto->fieldData(
Ip4Protocol::ip4_dstAddrMode,
AbstractProtocol::FieldValue
).toUInt());
leIpDstAddrCount->setText(
proto->fieldData(
Ip4Protocol::ip4_dstAddrCount,
AbstractProtocol::FieldValue
).toString());
leIpDstAddrMask->setText(QHostAddress(
proto->fieldData(
Ip4Protocol::ip4_dstAddrMask,
AbstractProtocol::FieldValue
).toUInt()).toString());
leIpOptions->setText(
proto->fieldData(
Ip4Protocol::ip4_options,
AbstractProtocol::FieldValue
).toByteArray().toHex());
}
void Ip4ConfigForm::storeWidget(AbstractProtocol *proto)
{
uint ff = 0;
proto->setFieldData(
Ip4Protocol::ip4_isOverrideVer,
cbIpVersionOverride->isChecked());
proto->setFieldData(
Ip4Protocol::ip4_ver,
leIpVersion->text());
proto->setFieldData(
Ip4Protocol::ip4_isOverrideHdrLen,
cbIpHdrLenOverride->isChecked());
proto->setFieldData(
Ip4Protocol::ip4_hdrLen,
leIpHdrLen->text());
proto->setFieldData(
Ip4Protocol::ip4_tos,
tosDscp->value());
proto->setFieldData(
Ip4Protocol::ip4_totLen,
leIpLength->text());
proto->setFieldData(
Ip4Protocol::ip4_isOverrideTotLen,
cbIpLengthOverride->isChecked());
proto->setFieldData(
Ip4Protocol::ip4_id,
hexStrToUInt(leIpId->text()));
proto->setFieldData(
Ip4Protocol::ip4_fragOfs,
leIpFragOfs->text());
if (cbIpFlagsDf->isChecked()) ff |= IP_FLAG_DF;
if (cbIpFlagsMf->isChecked()) ff |= IP_FLAG_MF;
proto->setFieldData(
Ip4Protocol::ip4_flags,
ff);
proto->setFieldData(
Ip4Protocol::ip4_ttl,
leIpTtl->text());
proto->setFieldData(
Ip4Protocol::ip4_isOverrideProto,
cbIpProtocolOverride->isChecked());
proto->setFieldData(
Ip4Protocol::ip4_proto,
hexStrToUInt(leIpProto->text()));
proto->setFieldData(
Ip4Protocol::ip4_isOverrideCksum,
cbIpCksumOverride->isChecked());
proto->setFieldData(
Ip4Protocol::ip4_cksum,
hexStrToUInt(leIpCksum->text()));
proto->setFieldData(
Ip4Protocol::ip4_srcAddr,
QHostAddress(leIpSrcAddr->text()).toIPv4Address());
proto->setFieldData(
Ip4Protocol::ip4_srcAddrMode,
(OstProto::Ip4_IpAddrMode)cmbIpSrcAddrMode->currentIndex());
proto->setFieldData(
Ip4Protocol::ip4_srcAddrCount,
leIpSrcAddrCount->text());
proto->setFieldData(
Ip4Protocol::ip4_srcAddrMask,
QHostAddress(leIpSrcAddrMask->text()).toIPv4Address());
proto->setFieldData(
Ip4Protocol::ip4_dstAddr,
QHostAddress(leIpDstAddr->text()).toIPv4Address());
proto->setFieldData(
Ip4Protocol::ip4_dstAddrMode,
(OstProto::Ip4_IpAddrMode)cmbIpDstAddrMode->currentIndex());
proto->setFieldData(
Ip4Protocol::ip4_dstAddrCount,
leIpDstAddrCount->text());
proto->setFieldData(
Ip4Protocol::ip4_dstAddrMask,
QHostAddress(leIpDstAddrMask->text()).toIPv4Address());
proto->setFieldData(
Ip4Protocol::ip4_options,
QByteArray::fromHex(QByteArray().append(leIpOptions->text())));
}
/*
* Slots
*/
void Ip4ConfigForm::on_cmbIpSrcAddrMode_currentIndexChanged(int index)
{
if (index == OstProto::Ip4::e_im_fixed)
{
leIpSrcAddrCount->setDisabled(true);
leIpSrcAddrMask->setDisabled(true);
}
else
{
leIpSrcAddrCount->setEnabled(true);
leIpSrcAddrMask->setEnabled(true);
}
}
void Ip4ConfigForm::on_cmbIpDstAddrMode_currentIndexChanged(int index)
{
if (index == OstProto::Ip4::e_im_fixed)
{
leIpDstAddrCount->setDisabled(true);
leIpDstAddrMask->setDisabled(true);
}
else
{
leIpDstAddrCount->setEnabled(true);
leIpDstAddrMask->setEnabled(true);
}
}