StreamConfigDialog "Protocol Selection" framework has been enhanced to include a L5 group. TextProtocol has been added to this L5 group. TCP/UDP protocols have been modified to get port numbers from a L5 protocol; TCP/UDP protocols have also been updated as per the "Sample" protocol recommendation

This commit is contained in:
Srivats P. 2010-05-08 20:12:38 +05:30
parent 3defe905e5
commit 6ca88eb661
14 changed files with 709 additions and 165 deletions

View File

@ -66,6 +66,7 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex,
connect(rbL1None, SIGNAL(toggled(bool)), SLOT(forceProtocolNone(bool)));
connect(rbFtNone, SIGNAL(toggled(bool)), SLOT(forceProtocolNone(bool)));
connect(rbL3None, SIGNAL(toggled(bool)), SLOT(forceProtocolNone(bool)));
connect(rbL4None, SIGNAL(toggled(bool)), SLOT(forceProtocolNone(bool)));
// If L1/L2(FT)/L3/L4 = Other, force subsequent protocol to Other and
// disable the subsequent protocol group as well
@ -78,8 +79,8 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex,
connect(rbL4Other, SIGNAL(toggled(bool)), rbPayloadOther, SLOT(setChecked(bool)));
connect(rbL4Other, SIGNAL(toggled(bool)), gbPayloadProto, SLOT(setDisabled(bool)));
// Setup valid subsequent protocols for L2 and L3 protocols
for (int i = ProtoL2; i <= ProtoL3; i++)
// Setup valid subsequent protocols for L2 to L4 protocols
for (int i = ProtoL2; i <= ProtoL4; i++)
{
foreach(QAbstractButton *btn1, bgProto[i]->buttons())
{
@ -207,7 +208,7 @@ void StreamConfigDialog::setupUiExtra()
foreach(QRadioButton *btn, gbL4Proto->findChildren<QRadioButton*>())
bgProto[ProtoL4]->addButton(btn);
#else
bgProto[ProtoL4]->addButton(rbL4None, 0);
bgProto[ProtoL4]->addButton(rbL4None, ButtonIdNone);
bgProto[ProtoL4]->addButton(rbL4Tcp, OstProto::Protocol::kTcpFieldNumber);
bgProto[ProtoL4]->addButton(rbL4Udp, OstProto::Protocol::kUdpFieldNumber);
bgProto[ProtoL4]->addButton(rbL4Icmp, OstProto::Protocol::kIcmpFieldNumber);
@ -215,6 +216,17 @@ void StreamConfigDialog::setupUiExtra()
bgProto[ProtoL4]->addButton(rbL4Other, ButtonIdOther);
#endif
bgProto[ProtoL5] = new QButtonGroup();
#if 0
foreach(QRadioButton *btn, gbL5Proto->findChildren<QRadioButton*>())
bgProto[ProtoL5]->addButton(btn);
#else
bgProto[ProtoL5]->addButton(rbL5None, ButtonIdNone);
bgProto[ProtoL5]->addButton(rbL5Text,
OstProto::Protocol::kTextProtocolFieldNumber);
bgProto[ProtoL5]->addButton(rbL5Other, ButtonIdOther);
#endif
bgProto[ProtoPayload] = new QButtonGroup();
#if 0
foreach(QRadioButton *btn, gbPayloadProto->findChildren<QRadioButton*>())
@ -639,13 +651,19 @@ void StreamConfigDialog::forceProtocolNone(bool checked)
bgProto[ProtoL3]->button(ButtonIdNone)->click();
disableProtocols(bgProto[ProtoL3], checked);
}
else if (btn == rbL3None)
else if (btn == rbL3None)
{
if (checked)
bgProto[ProtoL4]->button(ButtonIdNone)->click();
disableProtocols(bgProto[ProtoL4], checked);
}
else
else if (btn == rbL4None)
{
if (checked)
bgProto[ProtoL5]->button(ButtonIdNone)->click();
disableProtocols(bgProto[ProtoL5], checked);
}
else
{
Q_ASSERT(1 == 0); // Unreachable code!
}
@ -929,6 +947,15 @@ void StreamConfigDialog::StoreCurrentStream()
}
}
void StreamConfigDialog::on_tbProtocolData_currentChanged(int /*index*/)
{
// Refresh protocol widgets in case there is any dependent data between
// protocols e.g. TCP/UDP port numbers are dependent on Port/Protocol
// selection in TextProtocol
mpStream->storeProtocolWidgets();
mpStream->loadProtocolWidgets();
}
void StreamConfigDialog::on_pbOk_clicked()
{
QString log;

View File

@ -61,7 +61,8 @@ private:
ProtoL2 = 2,
ProtoL3 = 3,
ProtoL4 = 4,
ProtoPayload = 5,
ProtoL5 = 5,
ProtoPayload = 6,
ProtoMax
};
@ -87,7 +88,6 @@ private:
static int lastTopLevelTabIndex;
void setupUiExtra();
void updateSelectedProtocols();
void LoadCurrentStream();
void StoreCurrentStream();
@ -122,6 +122,9 @@ private slots:
void updateSelectProtocolsAdvancedWidget();
// "Protocol Data" related
void on_tbProtocolData_currentChanged(int index);
void on_pbPrev_clicked();
void on_pbNext_clicked();

View File

@ -9,7 +9,7 @@
<x>0</x>
<y>0</y>
<width>569</width>
<height>464</height>
<height>481</height>
</rect>
</property>
<property name="sizePolicy" >
@ -174,14 +174,14 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<x>0</x>
<y>0</y>
<width>527</width>
<height>226</height>
<height>243</height>
</rect>
</property>
<attribute name="label" >
<string>Simple</string>
</attribute>
<layout class="QGridLayout" >
<item row="0" column="0" >
<item rowspan="2" row="0" column="0" >
<widget class="QGroupBox" name="gbL1Proto" >
<property name="title" >
<string>L1</string>
@ -220,7 +220,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
</layout>
</widget>
</item>
<item rowspan="3" row="0" column="1" >
<item rowspan="4" row="0" column="1" >
<widget class="QGroupBox" name="gbFrameType" >
<property name="enabled" >
<bool>true</bool>
@ -351,7 +351,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
</layout>
</widget>
</item>
<item row="0" column="3" >
<item rowspan="2" row="0" column="3" >
<widget class="QGroupBox" name="gbPayloadProto" >
<property name="enabled" >
<bool>true</bool>
@ -393,49 +393,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
</layout>
</widget>
</item>
<item rowspan="2" row="1" column="0" >
<widget class="QGroupBox" name="gbVlan" >
<property name="enabled" >
<bool>true</bool>
</property>
<property name="title" >
<string>VLAN</string>
</property>
<property name="checkable" >
<bool>false</bool>
</property>
<property name="checked" >
<bool>false</bool>
</property>
<layout class="QVBoxLayout" >
<item>
<widget class="QRadioButton" name="rbVlanNone" >
<property name="text" >
<string>Untagged</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbVlanSingle" >
<property name="text" >
<string>Tagged</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbVlanDouble" >
<property name="text" >
<string>Stacked</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="2" >
<item rowspan="2" row="1" column="2" >
<widget class="QGroupBox" name="gbL4Proto" >
<property name="enabled" >
<bool>true</bool>
@ -507,7 +465,49 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
</layout>
</widget>
</item>
<item row="2" column="2" >
<item rowspan="2" row="2" column="0" >
<widget class="QGroupBox" name="gbVlan" >
<property name="enabled" >
<bool>true</bool>
</property>
<property name="title" >
<string>VLAN</string>
</property>
<property name="checkable" >
<bool>false</bool>
</property>
<property name="checked" >
<bool>false</bool>
</property>
<layout class="QVBoxLayout" >
<item>
<widget class="QRadioButton" name="rbVlanNone" >
<property name="text" >
<string>Untagged</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbVlanSingle" >
<property name="text" >
<string>Tagged</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbVlanDouble" >
<property name="text" >
<string>Stacked</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item rowspan="2" row="2" column="3" >
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
@ -515,11 +515,53 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<property name="sizeHint" >
<size>
<width>20</width>
<height>21</height>
<height>71</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="2" >
<widget class="QGroupBox" name="gbL5Proto" >
<property name="enabled" >
<bool>true</bool>
</property>
<property name="title" >
<string>L5</string>
</property>
<layout class="QHBoxLayout" >
<item>
<widget class="QRadioButton" name="rbL5None" >
<property name="text" >
<string>None</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbL5Text" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="text" >
<string>Text</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbL5Other" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="text" >
<string>Other</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2" >

View File

@ -82,6 +82,7 @@ public:
ProtocolIdLlc, //!< LLC (802.2)
ProtocolIdEth, //!< Ethernet II
ProtocolIdIp, //!< IP
ProtocolIdTcpUdp, //!< TCP/UDP Port Number
};
//! Supported checksum types

View File

@ -73,6 +73,11 @@ QString TcpProtocol::shortName() const
return QString("TCP");
}
AbstractProtocol::ProtocolIdType TcpProtocol::protocolIdType() const
{
return ProtocolIdTcpUdp;
}
quint32 TcpProtocol::protocolId(ProtocolIdType type) const
{
switch(type)
@ -84,7 +89,7 @@ quint32 TcpProtocol::protocolId(ProtocolIdType type) const
return AbstractProtocol::protocolId(type);
}
int TcpProtocol::fieldCount() const
int TcpProtocol::fieldCount() const
{
return tcp_fieldCount;
}
@ -114,12 +119,16 @@ AbstractProtocol::FieldFlags TcpProtocol::fieldFlags(int index) const
case tcp_urg_ptr:
break;
case tcp_is_override_src_port:
case tcp_is_override_dst_port:
case tcp_is_override_hdrlen:
case tcp_is_override_cksum:
flags |= FieldIsMeta;
break;
default:
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
index);
break;
}
@ -132,47 +141,81 @@ QVariant TcpProtocol::fieldData(int index, FieldAttrib attrib,
switch (index)
{
case tcp_src_port:
{
quint16 srcPort;
switch(attrib)
{
case FieldValue:
case FieldFrameValue:
case FieldTextValue:
if (data.is_override_src_port())
srcPort = data.src_port();
else
srcPort = payloadProtocolId(ProtocolIdTcpUdp);
break;
default:
srcPort = 0; // avoid the 'maybe used unitialized' warning
break;
}
switch(attrib)
{
case FieldName:
return QString("Source Port");
case FieldValue:
return data.src_port();
return srcPort;
case FieldTextValue:
return QString("%1").arg(data.src_port());
return QString("%1").arg(srcPort);
case FieldFrameValue:
{
QByteArray fv;
fv.resize(2);
qToBigEndian((quint16) data.src_port(), (uchar*) fv.data());
qToBigEndian(srcPort, (uchar*) fv.data());
return fv;
}
default:
break;
}
break;
}
case tcp_dst_port:
{
quint16 dstPort;
switch(attrib)
{
case FieldValue:
case FieldFrameValue:
case FieldTextValue:
if (data.is_override_dst_port())
dstPort = data.dst_port();
else
dstPort = payloadProtocolId(ProtocolIdTcpUdp);
break;
default:
dstPort = 0; // avoid the 'maybe used unitialized' warning
break;
}
switch(attrib)
{
case FieldName:
return QString("Destination Port");
case FieldValue:
return data.dst_port();
return dstPort;
case FieldTextValue:
return QString("%1").arg(data.dst_port());
return QString("%1").arg(dstPort);
case FieldFrameValue:
{
QByteArray fv;
fv.resize(2);
qToBigEndian((quint16) data.dst_port(), (uchar*) fv.data());
qToBigEndian(dstPort, (uchar*) fv.data());
return fv;
}
default:
break;
}
break;
}
case tcp_seq_num:
switch(attrib)
{
@ -384,19 +427,174 @@ QVariant TcpProtocol::fieldData(int index, FieldAttrib attrib,
break;
// Meta fields
case tcp_is_override_src_port:
{
switch(attrib)
{
case FieldValue:
return data.is_override_src_port();
default:
break;
}
break;
}
case tcp_is_override_dst_port:
{
switch(attrib)
{
case FieldValue:
return data.is_override_dst_port();
default:
break;
}
break;
}
case tcp_is_override_hdrlen:
{
switch(attrib)
{
case FieldValue:
return data.is_override_hdrlen();
default:
break;
}
break;
}
case tcp_is_override_cksum:
{
switch(attrib)
{
case FieldValue:
return data.is_override_cksum();
default:
break;
}
break;
}
default:
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
index);
break;
}
return AbstractProtocol::fieldData(index, attrib, streamIndex);
}
bool TcpProtocol::setFieldData(int /*index*/, const QVariant &/*value*/,
FieldAttrib /*attrib*/)
bool TcpProtocol::setFieldData(int index, const QVariant &value,
FieldAttrib attrib)
{
return false;
bool isOk = false;
if (attrib != FieldValue)
goto _exit;
switch (index)
{
case tcp_src_port:
{
uint srcPort = value.toUInt(&isOk);
if (isOk)
data.set_src_port(srcPort);
break;
}
case tcp_dst_port:
{
uint dstPort = value.toUInt(&isOk);
if (isOk)
data.set_dst_port(dstPort);
break;
}
case tcp_seq_num:
{
uint seqNum = value.toUInt(&isOk);
if (isOk)
data.set_seq_num(seqNum);
break;
}
case tcp_ack_num:
{
uint ackNum = value.toUInt(&isOk);
if (isOk)
data.set_ack_num(ackNum);
break;
}
case tcp_hdrlen:
{
uint hdrLen = value.toUInt(&isOk);
if (isOk)
data.set_hdrlen_rsvd(
(data.hdrlen_rsvd() & 0x0F) | (hdrLen << 4));
break;
}
case tcp_rsvd:
{
uint rsvd = value.toUInt(&isOk);
if (isOk)
data.set_hdrlen_rsvd(
(data.hdrlen_rsvd() & 0xF0) | (rsvd & 0x0F));
break;
}
case tcp_flags:
{
uint flags = value.toUInt(&isOk);
if (isOk)
data.set_flags(flags);
break;
}
case tcp_window:
{
uint window = value.toUInt(&isOk);
if (isOk)
data.set_window(window);
break;
}
case tcp_cksum:
{
uint cksum = value.toUInt(&isOk);
if (isOk)
data.set_cksum(cksum);
break;
}
case tcp_urg_ptr:
{
uint urgPtr = value.toUInt(&isOk);
if (isOk)
data.set_urg_ptr(urgPtr);
break;
}
case tcp_is_override_src_port:
{
data.set_is_override_src_port(value.toBool());
isOk = true;
break;
}
case tcp_is_override_dst_port:
{
data.set_is_override_dst_port(value.toBool());
isOk = true;
break;
}
case tcp_is_override_hdrlen:
{
data.set_is_override_hdrlen(value.toBool());
isOk = true;
break;
}
case tcp_is_override_cksum:
{
data.set_is_override_cksum(value.toBool());
isOk = true;
break;
}
default:
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
index);
break;
}
_exit:
return isOk;
}
bool TcpProtocol::isProtocolFrameValueVariable() const
@ -421,53 +619,73 @@ void TcpProtocol::loadConfigWidget()
{
configWidget();
configForm->leTcpSrcPort->setText(QString().setNum(data.src_port()));
configForm->leTcpDstPort->setText(QString().setNum(data.dst_port()));
configForm->leTcpSrcPort->setText(
fieldData(tcp_src_port, FieldValue).toString());
configForm->cbTcpSrcPortOverride->setChecked(
fieldData(tcp_is_override_src_port, FieldValue).toBool());
configForm->leTcpSeqNum->setText(QString().setNum(data.seq_num()));
configForm->leTcpAckNum->setText(QString().setNum(data.ack_num()));
configForm->leTcpDstPort->setText(
fieldData(tcp_dst_port, FieldValue).toString());
configForm->cbTcpDstPortOverride->setChecked(
fieldData(tcp_is_override_dst_port, FieldValue).toBool());
configForm->leTcpHdrLen->setText(fieldData(tcp_hdrlen, FieldValue).toString());
configForm->cbTcpHdrLenOverride->setChecked(data.is_override_hdrlen());
configForm->leTcpSeqNum->setText(
fieldData(tcp_seq_num, FieldValue).toString());
configForm->leTcpAckNum->setText(
fieldData(tcp_ack_num, FieldValue).toString());
configForm->leTcpWindow->setText(QString().setNum(data.window()));
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(data.is_override_cksum());
configForm->cbTcpCksumOverride->setChecked(
fieldData(tcp_is_override_cksum, FieldValue).toBool());
configForm->leTcpUrgentPointer->setText(QString().setNum(data.urg_ptr()));
configForm->cbTcpFlagsUrg->setChecked((data.flags() & TCP_FLAG_URG) > 0);
configForm->cbTcpFlagsAck->setChecked((data.flags() & TCP_FLAG_ACK) > 0);
configForm->cbTcpFlagsPsh->setChecked((data.flags() & TCP_FLAG_PSH) > 0);
configForm->cbTcpFlagsRst->setChecked((data.flags() & TCP_FLAG_RST) > 0);
configForm->cbTcpFlagsSyn->setChecked((data.flags() & TCP_FLAG_SYN) > 0);
configForm->cbTcpFlagsFin->setChecked((data.flags() & TCP_FLAG_FIN) > 0);
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();
data.set_src_port(configForm->leTcpSrcPort->text().toULong(&isOk));
data.set_dst_port(configForm->leTcpDstPort->text().toULong(&isOk));
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());
data.set_seq_num(configForm->leTcpSeqNum->text().toULong(&isOk));
data.set_ack_num(configForm->leTcpAckNum->text().toULong(&isOk));
setFieldData(tcp_seq_num, configForm->leTcpSeqNum->text());
setFieldData(tcp_ack_num, configForm->leTcpAckNum->text());
data.set_hdrlen_rsvd((configForm->leTcpHdrLen->text().toULong(&isOk) << 4) & 0xF0);
data.set_is_override_hdrlen(configForm->cbTcpHdrLenOverride->isChecked());
setFieldData(tcp_hdrlen, configForm->leTcpHdrLen->text());
setFieldData(tcp_is_override_hdrlen,
configForm->cbTcpHdrLenOverride->isChecked());
data.set_window(configForm->leTcpWindow->text().toULong(&isOk));
setFieldData(tcp_window, configForm->leTcpWindow->text());
data.set_cksum(configForm->leTcpCksum->text().remove(QChar(' ')).toULong(&isOk, BASE_HEX));
data.set_is_override_cksum(configForm->cbTcpCksumOverride->isChecked());
setFieldData(tcp_cksum, configForm->leTcpCksum->text());
setFieldData(tcp_is_override_cksum,
configForm->cbTcpCksumOverride->isChecked());
data.set_urg_ptr(configForm->leTcpUrgentPointer->text().toULong(&isOk));
setFieldData(tcp_urg_ptr, configForm->leTcpUrgentPointer->text());
if (configForm->cbTcpFlagsUrg->isChecked()) ff |= TCP_FLAG_URG;
if (configForm->cbTcpFlagsAck->isChecked()) ff |= TCP_FLAG_ACK;
@ -475,6 +693,6 @@ void TcpProtocol::storeConfigWidget()
if (configForm->cbTcpFlagsRst->isChecked()) ff |= TCP_FLAG_RST;
if (configForm->cbTcpFlagsSyn->isChecked()) ff |= TCP_FLAG_SYN;
if (configForm->cbTcpFlagsFin->isChecked()) ff |= TCP_FLAG_FIN;
data.set_flags(ff);
setFieldData(tcp_flags, ff);
}

View File

@ -57,6 +57,8 @@ private:
tcp_cksum,
tcp_urg_ptr,
tcp_is_override_src_port,
tcp_is_override_dst_port,
tcp_is_override_hdrlen,
tcp_is_override_cksum,
@ -76,9 +78,11 @@ public:
virtual QString name() const;
virtual QString shortName() const;
virtual ProtocolIdType protocolIdType() const;
virtual quint32 protocolId(ProtocolIdType type) const;
virtual int fieldCount() const;
virtual int fieldCount() const;
virtual AbstractProtocol::FieldFlags fieldFlags(int index) const;
virtual QVariant fieldData(int index, FieldAttrib attrib,

View File

@ -22,22 +22,23 @@ import "protocol.proto";
package OstProto;
// Tcp
message Tcp {
optional bool is_override_src_port = 1;
optional bool is_override_dst_port = 2;
optional bool is_override_hdrlen = 3;
optional bool is_override_cksum = 4;
optional bool is_override_hdrlen = 1;
optional bool is_override_cksum = 2;
optional uint32 src_port = 5 [default = 49152];
optional uint32 dst_port = 6 [default = 49153];
optional uint32 src_port = 3 [default = 8902];
optional uint32 dst_port = 4 [default = 80];
optional uint32 seq_num = 7 [default = 129018];
optional uint32 ack_num = 8;
optional uint32 seq_num = 5 [default = 129018];
optional uint32 ack_num = 6;
optional uint32 hdrlen_rsvd = 9 [default = 0x50];
optional uint32 flags = 10;
optional uint32 hdrlen_rsvd = 7 [default = 0x50];
optional uint32 flags = 8;
optional uint32 window = 9 [default = 1024];
optional uint32 cksum = 10;
optional uint32 urg_ptr = 11;
optional uint32 window = 11 [default = 1024];
optional uint32 cksum = 12;
optional uint32 urg_ptr = 13;
}
extend Protocol {

View File

@ -14,14 +14,18 @@
</property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QLabel" name="label_28" >
<widget class="QCheckBox" name="cbTcpSrcPortOverride" >
<property name="text" >
<string>Source Port</string>
<string>Override Source Port</string>
</property>
</widget>
</item>
<item row="0" column="1" >
<widget class="QLineEdit" name="leTcpSrcPort" />
<widget class="QLineEdit" name="leTcpSrcPort" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item rowspan="6" row="0" column="2" >
<widget class="Line" name="line_3" >
@ -48,14 +52,18 @@
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="label_32" >
<widget class="QCheckBox" name="cbTcpDstPortOverride" >
<property name="text" >
<string>Destination Port</string>
<string>Override Destination Port</string>
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QLineEdit" name="leTcpDstPort" />
<widget class="QLineEdit" name="leTcpDstPort" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="3" >
<widget class="QLabel" name="label_37" >
@ -224,5 +232,37 @@
</hint>
</hints>
</connection>
<connection>
<sender>cbTcpSrcPortOverride</sender>
<signal>toggled(bool)</signal>
<receiver>leTcpSrcPort</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>159</x>
<y>16</y>
</hint>
<hint type="destinationlabel" >
<x>178</x>
<y>18</y>
</hint>
</hints>
</connection>
<connection>
<sender>cbTcpDstPortOverride</sender>
<signal>toggled(bool)</signal>
<receiver>leTcpDstPort</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>147</x>
<y>45</y>
</hint>
<hint type="destinationlabel" >
<x>180</x>
<y>44</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -83,7 +83,7 @@ quint32 TextProtocol::protocolId(ProtocolIdType type) const
{
switch(type)
{
//case ProtocolIdTcpUdp: return data.port_num();
case ProtocolIdTcpUdp: return data.port_num();
default:break;
}
@ -220,7 +220,8 @@ _exit:
int TextProtocol::protocolFrameSize(int streamIndex) const
{
return fieldData(textProto_text, FieldFrameValue).toByteArray().size() ;
return fieldData(textProto_text, FieldFrameValue, streamIndex)
.toByteArray().size() ;
}
QWidget* TextProtocol::configWidget()

View File

@ -27,7 +27,7 @@ message TextProtocol {
kUtf8 = 0;
}
optional uint32 port_num = 1 [default = 0];
optional uint32 port_num = 1 [default = 80];
optional TextEncoding encoding = 2 [default = kUtf8];
optional string text = 3;
}

View File

@ -73,6 +73,11 @@ QString UdpProtocol::shortName() const
return QString("UDP");
}
AbstractProtocol::ProtocolIdType UdpProtocol::protocolIdType() const
{
return ProtocolIdTcpUdp;
}
quint32 UdpProtocol::protocolId(ProtocolIdType type) const
{
switch(type)
@ -84,7 +89,7 @@ quint32 UdpProtocol::protocolId(ProtocolIdType type) const
return AbstractProtocol::protocolId(type);
}
int UdpProtocol::fieldCount() const
int UdpProtocol::fieldCount() const
{
return udp_fieldCount;
}
@ -106,12 +111,16 @@ AbstractProtocol::FieldFlags UdpProtocol::fieldFlags(int index) const
flags |= FieldIsCksum;
break;
case udp_isOverrideSrcPort:
case udp_isOverrideDstPort:
case udp_isOverrideTotLen:
case udp_isOverrideCksum:
flags |= FieldIsMeta;
break;
default:
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
index);
break;
}
@ -124,47 +133,81 @@ QVariant UdpProtocol::fieldData(int index, FieldAttrib attrib,
switch (index)
{
case udp_srcPort:
{
quint16 srcPort;
switch(attrib)
{
case FieldValue:
case FieldFrameValue:
case FieldTextValue:
if (data.is_override_src_port())
srcPort = data.src_port();
else
srcPort = payloadProtocolId(ProtocolIdTcpUdp);
break;
default:
srcPort = 0; // avoid the 'maybe used unitialized' warning
break;
}
switch(attrib)
{
case FieldName:
return QString("Source Port");
case FieldValue:
return data.src_port();
return srcPort;
case FieldTextValue:
return QString("%1").arg(data.src_port());
return QString("%1").arg(srcPort);
case FieldFrameValue:
{
QByteArray fv;
fv.resize(2);
qToBigEndian((quint16) data.src_port(), (uchar*) fv.data());
qToBigEndian(srcPort, (uchar*) fv.data());
return fv;
}
default:
break;
}
break;
}
case udp_dstPort:
{
quint16 dstPort;
switch(attrib)
{
case FieldValue:
case FieldFrameValue:
case FieldTextValue:
if (data.is_override_dst_port())
dstPort = data.dst_port();
else
dstPort = payloadProtocolId(ProtocolIdTcpUdp);
break;
default:
dstPort = 0; // avoid the 'maybe used unitialized' warning
break;
}
switch(attrib)
{
case FieldName:
return QString("Destination Port");
case FieldValue:
return data.dst_port();
return dstPort;
case FieldTextValue:
return QString("%1").arg(data.dst_port());
return QString("%1").arg(dstPort);
case FieldFrameValue:
{
QByteArray fv;
fv.resize(2);
qToBigEndian((quint16) data.dst_port(), (uchar*) fv.data());
qToBigEndian(dstPort, (uchar*) fv.data());
return fv;
}
default:
break;
}
break;
}
case udp_totLen:
{
@ -253,30 +296,132 @@ QVariant UdpProtocol::fieldData(int index, FieldAttrib attrib,
}
break;
}
// Meta fields
case udp_isOverrideTotLen:
case udp_isOverrideCksum:
case udp_isOverrideSrcPort:
{
switch(attrib)
{
case FieldIsMeta:
return true;
case FieldValue:
return data.is_override_src_port();
default:
break;
}
break;
}
case udp_isOverrideDstPort:
{
switch(attrib)
{
case FieldValue:
return data.is_override_dst_port();
default:
break;
}
break;
}
case udp_isOverrideTotLen:
{
switch(attrib)
{
case FieldValue:
return data.is_override_totlen();
default:
break;
}
break;
}
case udp_isOverrideCksum:
{
switch(attrib)
{
case FieldValue:
return data.is_override_cksum();
default:
break;
}
break;
}
default:
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
index);
break;
}
return AbstractProtocol::fieldData(index, attrib, streamIndex);
}
bool UdpProtocol::setFieldData(int /*index*/, const QVariant &/*value*/,
FieldAttrib /*attrib*/)
bool UdpProtocol::setFieldData(int index, const QVariant& value,
FieldAttrib attrib)
{
//! implement UdpProtocol::setFieldData()
return false;
bool isOk = false;
if (attrib != FieldValue)
goto _exit;
switch (index)
{
case udp_isOverrideSrcPort:
{
data.set_is_override_src_port(value.toBool());
isOk = true;
break;
}
case udp_isOverrideDstPort:
{
data.set_is_override_dst_port(value.toBool());
isOk = true;
break;
}
case udp_isOverrideTotLen:
{
data.set_is_override_totlen(value.toBool());
isOk = true;
break;
}
case udp_isOverrideCksum:
{
data.set_is_override_cksum(value.toBool());
isOk = true;
break;
}
case udp_srcPort:
{
uint srcPort = value.toUInt(&isOk);
if (isOk)
data.set_src_port(srcPort);
break;
}
case udp_dstPort:
{
uint dstPort = value.toUInt(&isOk);
if (isOk)
data.set_dst_port(dstPort);
break;
}
case udp_totLen:
{
uint totLen = value.toUInt(&isOk);
if (isOk)
data.set_totlen(totLen);
break;
}
case udp_cksum:
{
uint cksum = value.toUInt(&isOk);
if (isOk)
data.set_cksum(cksum);
break;
}
default:
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
index);
break;
}
_exit:
return isOk;
}
bool UdpProtocol::isProtocolFrameValueVariable() const
@ -301,15 +446,24 @@ void UdpProtocol::loadConfigWidget()
{
configWidget();
configForm->leUdpSrcPort->setText(fieldData(udp_srcPort, FieldValue).toString());
configForm->leUdpDstPort->setText(fieldData(udp_dstPort, FieldValue).toString());
configForm->leUdpSrcPort->setText(
fieldData(udp_srcPort, FieldValue).toString());
configForm->cbUdpSrcPortOverride->setChecked(
fieldData(udp_isOverrideSrcPort, FieldValue).toBool());
configForm->leUdpDstPort->setText(
fieldData(udp_dstPort, FieldValue).toString());
configForm->cbUdpDstPortOverride->setChecked(
fieldData(udp_isOverrideDstPort, FieldValue).toBool());
configForm->leUdpLength->setText(fieldData(udp_totLen, FieldValue).toString());
configForm->cbUdpLengthOverride->setChecked(data.is_override_totlen());
configForm->leUdpLength->setText(
fieldData(udp_totLen, FieldValue).toString());
configForm->cbUdpLengthOverride->setChecked(
fieldData(udp_isOverrideTotLen, FieldValue).toBool());
configForm->leUdpCksum->setText(QString("%1").arg(
fieldData(udp_cksum, FieldValue).toUInt(), 4, BASE_HEX, QChar('0')));
configForm->cbUdpCksumOverride->setChecked(data.is_override_cksum());
configForm->cbUdpCksumOverride->setChecked(
fieldData(udp_isOverrideCksum, FieldValue).toBool());
}
void UdpProtocol::storeConfigWidget()
@ -318,13 +472,20 @@ void UdpProtocol::storeConfigWidget()
configWidget();
data.set_src_port(configForm->leUdpSrcPort->text().toULong(&isOk));
data.set_dst_port(configForm->leUdpDstPort->text().toULong(&isOk));
setFieldData(udp_srcPort, configForm->leUdpSrcPort->text());
setFieldData(udp_isOverrideSrcPort,
configForm->cbUdpSrcPortOverride->isChecked());
setFieldData(udp_dstPort, configForm->leUdpDstPort->text());
setFieldData(udp_isOverrideDstPort,
configForm->cbUdpDstPortOverride->isChecked());
data.set_totlen(configForm->leUdpLength->text().toULong(&isOk));
data.set_is_override_totlen(configForm->cbUdpLengthOverride->isChecked());
setFieldData(udp_totLen, configForm->leUdpLength->text());
setFieldData(udp_isOverrideTotLen,
configForm->cbUdpLengthOverride->isChecked());
data.set_cksum(configForm->leUdpCksum->text().remove(QChar(' ')).toULong(&isOk, BASE_HEX));
data.set_is_override_cksum(configForm->cbUdpCksumOverride->isChecked());
setFieldData(udp_cksum, configForm->leUdpCksum->text().toUInt(
&isOk, BASE_HEX));
setFieldData(udp_isOverrideCksum,
configForm->cbUdpCksumOverride->isChecked());
}

View File

@ -44,6 +44,8 @@ private:
udp_totLen,
udp_cksum,
udp_isOverrideSrcPort,
udp_isOverrideDstPort,
udp_isOverrideTotLen,
udp_isOverrideCksum,
@ -63,9 +65,11 @@ public:
virtual QString name() const;
virtual QString shortName() const;
virtual ProtocolIdType protocolIdType() const;
virtual quint32 protocolId(ProtocolIdType type) const;
virtual int fieldCount() const;
virtual int fieldCount() const;
virtual AbstractProtocol::FieldFlags fieldFlags(int index) const;
virtual QVariant fieldData(int index, FieldAttrib attrib,

View File

@ -23,13 +23,15 @@ package OstProto;
// UDP
message Udp {
optional bool is_override_totlen = 1;
optional bool is_override_cksum = 2;
optional bool is_override_src_port = 1;
optional bool is_override_dst_port = 2;
optional bool is_override_totlen = 3;
optional bool is_override_cksum = 4;
optional uint32 src_port = 3 [default = 8902];
optional uint32 dst_port = 4 [default = 80];
optional uint32 totlen = 5;
optional uint32 cksum = 6;
optional uint32 src_port = 5 [default = 49152];
optional uint32 dst_port = 6 [default = 49153];
optional uint32 totlen = 7;
optional uint32 cksum = 8;
}
extend Protocol {

View File

@ -5,7 +5,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>217</width>
<width>246</width>
<height>144</height>
</rect>
</property>
@ -16,24 +16,32 @@
<item row="0" column="0" >
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QLabel" name="label_35" >
<widget class="QCheckBox" name="cbUdpSrcPortOverride" >
<property name="text" >
<string>Source Port</string>
<string>Override Source Port</string>
</property>
</widget>
</item>
<item row="0" column="1" >
<widget class="QLineEdit" name="leUdpSrcPort" />
<widget class="QLineEdit" name="leUdpSrcPort" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="label_38" >
<widget class="QCheckBox" name="cbUdpDstPortOverride" >
<property name="text" >
<string>Destination Port</string>
<string>Override Destination Port</string>
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QLineEdit" name="leUdpDstPort" />
<widget class="QLineEdit" name="leUdpDstPort" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0" >
<widget class="QCheckBox" name="cbUdpLengthOverride" >
@ -109,8 +117,8 @@
<y>63</y>
</hint>
<hint type="destinationlabel" >
<x>149</x>
<y>63</y>
<x>209</x>
<y>81</y>
</hint>
</hints>
</connection>
@ -125,8 +133,40 @@
<y>106</y>
</hint>
<hint type="destinationlabel" >
<x>158</x>
<y>106</y>
<x>209</x>
<y>107</y>
</hint>
</hints>
</connection>
<connection>
<sender>cbUdpDstPortOverride</sender>
<signal>toggled(bool)</signal>
<receiver>leUdpDstPort</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>131</x>
<y>43</y>
</hint>
<hint type="destinationlabel" >
<x>166</x>
<y>46</y>
</hint>
</hints>
</connection>
<connection>
<sender>cbUdpSrcPortOverride</sender>
<signal>toggled(bool)</signal>
<receiver>leUdpSrcPort</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>125</x>
<y>21</y>
</hint>
<hint type="destinationlabel" >
<x>167</x>
<y>20</y>
</hint>
</hints>
</connection>