Protocol Framework basic code in place now. Cleanup pending.
- New Classes: o ProtocolManager - singleton with which all protocols register o ProtocolCollection - Aggregates all registered protocols; exports methods to work on all protocols o StreamBase - aggregates ProtocolCollection with Stream Core and Control; the client/server side stream classes now derive from StreamBase leading to major reduction in their code (more cleanup pending) - AbstractProtocol now supports the additional methods o createInstance() o protocolFrameSize() o protocolFrameOffset(), protocolFramePayloadSize() o protocolId(), payloadProtocolId() o protocolFrameCksum(), protocolFramePayloadCksum() 0 constructor takes an extra param - frameProtoList - Specific protocols - eth2, llc, snap, ip4, udp, tcp now return length, protocol id and cksums correctly (tcp/udp cksum pending) - StreamConfigDialog - protocol controls for length, cksum and protocolid are automatically updated (not fully working yet)
This commit is contained in:
parent
2d856012cb
commit
2ec7fb30c2
6
Makefile
6
Makefile
@ -10,6 +10,12 @@ clean:
|
||||
$(MAKE) -C server $@
|
||||
$(MAKE) -C client $@
|
||||
|
||||
distclean:
|
||||
$(MAKE) -C rpc $@
|
||||
$(MAKE) -C common $@
|
||||
$(MAKE) -C server $@
|
||||
$(MAKE) -C client $@
|
||||
|
||||
qmake:
|
||||
cd rpc && qmake && cd ..
|
||||
cd common && qmake && cd ..
|
||||
|
@ -98,7 +98,7 @@ bool Port::updateStream(uint streamId, OstProto::Stream *stream)
|
||||
_found:
|
||||
streamIndex = i;
|
||||
|
||||
mStreams[streamIndex]->update(stream);
|
||||
mStreams[streamIndex]->protoDataCopyFrom(*stream);
|
||||
reorderStreamsByOrdinals();
|
||||
|
||||
return true;
|
||||
@ -167,7 +167,7 @@ void Port::getModifiedStreamsSinceLastSync(
|
||||
OstProto::Stream *s;
|
||||
|
||||
s = streamConfigList.add_stream();
|
||||
mStreams[i]->getConfig(mPortId, *s);
|
||||
mStreams[i]->protoDataCopyInto(*s);
|
||||
}
|
||||
qDebug("Done %s", __FUNCTION__);
|
||||
}
|
||||
|
@ -3,173 +3,27 @@
|
||||
|
||||
#include "stream.h"
|
||||
|
||||
#include "../common/mac.h"
|
||||
#include "../common/payload.h"
|
||||
|
||||
#include "../common/eth2.h" // FIXME: proto DB
|
||||
#include "../common/dot3.h" // FIXME: proto DB
|
||||
#include "../common/llc.h" // FIXME: proto DB
|
||||
#include "../common/snap.h" // FIXME: proto DB
|
||||
#include "../common/ip4.h" // FIXME: proto DB
|
||||
#include "../common/tcp.h" // FIXME: proto DB
|
||||
#include "../common/udp.h" // FIXME: proto DB
|
||||
|
||||
|
||||
//-----------------------------------------------------
|
||||
// Stream Class Methods
|
||||
//-----------------------------------------------------
|
||||
Stream::Stream()
|
||||
{
|
||||
mId = 0xFFFFFFFF;
|
||||
|
||||
mCore = new OstProto::StreamCore;
|
||||
mControl = new OstProto::StreamControl;
|
||||
|
||||
// mCore->set_port_id(0xFFFFFFFF);
|
||||
// mCore->set_stream_id(mId);
|
||||
|
||||
mProtocolList.append(new MacProtocol);
|
||||
mProtocolList.append(new PayloadProtocol(this));
|
||||
|
||||
// FIXME: proto DB
|
||||
mProtocolList.append(new Eth2Protocol);
|
||||
mProtocolList.append(new Dot3Protocol);
|
||||
mProtocolList.append(new LlcProtocol);
|
||||
mProtocolList.append(new SnapProtocol);
|
||||
mProtocolList.append(new Ip4Protocol);
|
||||
mProtocolList.append(new TcpProtocol);
|
||||
mProtocolList.append(new UdpProtocol);
|
||||
|
||||
//mId = 0xFFFFFFFF;
|
||||
mCore->set_is_enabled(true);
|
||||
mCore->add_frame_proto(51); // MAC (FIXME: hardcoding)
|
||||
mCore->add_frame_proto(52); // Payload (FIXME: hardcoding)
|
||||
|
||||
QList<int> protoList;
|
||||
protoList.append(51);
|
||||
protoList.append(52);
|
||||
setFrameProtocol(protoList);
|
||||
}
|
||||
|
||||
Stream::~Stream()
|
||||
{
|
||||
for (int i = 0; i < mProtocolList.size(); i++)
|
||||
delete mProtocolList.at(i);
|
||||
|
||||
delete mControl;
|
||||
delete mCore;
|
||||
}
|
||||
|
||||
void Stream::protoDataCopyFrom(Stream& stream)
|
||||
{
|
||||
OstProto::Stream data;
|
||||
|
||||
stream.getConfig(0, data);
|
||||
update(&data);
|
||||
}
|
||||
|
||||
void Stream::loadProtocolWidgets()
|
||||
{
|
||||
for (int i=0; i < mProtocolList.size(); i++)
|
||||
mProtocolList[i]->loadConfigWidget();
|
||||
protocols.loadConfigWidgets();
|
||||
}
|
||||
|
||||
void Stream::storeProtocolWidgets()
|
||||
{
|
||||
for (int i=0; i < mProtocolList.size(); i++)
|
||||
mProtocolList[i]->storeConfigWidget();
|
||||
}
|
||||
|
||||
/*! Copy current client side config into the OstProto::Stream */
|
||||
// FIXME - remove portId unused param!
|
||||
void Stream::getConfig(uint portId, OstProto::Stream &s)
|
||||
{
|
||||
s.mutable_stream_id()->set_id(mId);
|
||||
|
||||
s.mutable_core()->CopyFrom(*mCore);
|
||||
s.mutable_control()->CopyFrom(*mControl);
|
||||
|
||||
// FIXME - this doesn't take care of multiple headers of same proto
|
||||
// e.g. IPinIP or double VLAN Tagged
|
||||
// FIXME: change s from pointer to reference?
|
||||
for (int i = 0; i < mProtocolList.size(); i++)
|
||||
{
|
||||
qDebug("%s: protocol %d", __FUNCTION__, i);
|
||||
mProtocolList[i]->protoDataCopyInto(s);
|
||||
}
|
||||
|
||||
qDebug("%s: Done", __FUNCTION__);
|
||||
}
|
||||
|
||||
bool Stream::update(OstProto::Stream *stream)
|
||||
{
|
||||
mCore->clear_frame_proto();
|
||||
mCore->MergeFrom(stream->core());
|
||||
mControl->MergeFrom(stream->control());
|
||||
|
||||
// FIXME - this doesn't take care of multiple headers of same proto
|
||||
// e.g. IPinIP or double VLAN Tagged
|
||||
// FIXME: change s from pointer to reference?
|
||||
for (int i = 0; i < mProtocolList.size(); i++)
|
||||
{
|
||||
mProtocolList[i]->protoDataCopyFrom(*stream);
|
||||
}
|
||||
|
||||
// FIXME(MED): Re-eval why not store complete OstProto::Stream
|
||||
// instead of components
|
||||
return true;
|
||||
}
|
||||
|
||||
QList<int> Stream::frameProtocol()
|
||||
{
|
||||
QList<int> protocolList;
|
||||
|
||||
for (int i = 0; i < mCore->frame_proto_size(); i++)
|
||||
protocolList.append(mCore->frame_proto(i));
|
||||
|
||||
return protocolList;
|
||||
}
|
||||
|
||||
void Stream::setFrameProtocol(QList<int> protocolList)
|
||||
{
|
||||
mCore->clear_frame_proto();
|
||||
for (int i = 0; i < protocolList.size(); i++)
|
||||
mCore->add_frame_proto(protocolList.at(i));
|
||||
}
|
||||
|
||||
int Stream::protocolHeaderSize()
|
||||
{
|
||||
int size = 0;
|
||||
|
||||
for (int i = 0; i < mCore->frame_proto_size(); i++)
|
||||
size += protocolById(mCore->frame_proto(i))->
|
||||
protocolFrameValue().size();
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
AbstractProtocol* Stream::protocolById(int id)
|
||||
{
|
||||
// FIXME BAD BAD VERY BAD!
|
||||
switch(id) {
|
||||
case 51:
|
||||
return mProtocolList.at(0);
|
||||
case 52:
|
||||
return mProtocolList.at(1);
|
||||
case 121:
|
||||
return mProtocolList.at(2);
|
||||
case 122:
|
||||
return mProtocolList.at(3);
|
||||
case 123:
|
||||
return mProtocolList.at(4);
|
||||
case 124:
|
||||
return mProtocolList.at(5);
|
||||
// case 125 (unused)
|
||||
#if 0 // todo VLAN
|
||||
case 126:
|
||||
return mProtocolList.at(x);
|
||||
#endif
|
||||
case 130:
|
||||
return mProtocolList.at(6);
|
||||
case 140:
|
||||
return mProtocolList.at(7);
|
||||
case 141:
|
||||
return mProtocolList.at(8);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
protocols.storeConfigWidgets();
|
||||
}
|
||||
|
@ -2,48 +2,21 @@
|
||||
#define _STREAM_H
|
||||
|
||||
#include <QtGlobal>
|
||||
|
||||
#include <QString>
|
||||
#include <QList>
|
||||
|
||||
#include "../common/protocol.pb.h"
|
||||
#include "../common/abstractprotocol.h"
|
||||
#include "../common/streambase.h"
|
||||
|
||||
// Convenience Defines FIXME
|
||||
#define IP_PROTO_ICMP 0x01
|
||||
#define IP_PROTO_IGMP 0x02
|
||||
#define IP_PROTO_TCP 0x06
|
||||
#define IP_PROTO_UDP 0x11
|
||||
class Stream : public StreamBase {
|
||||
|
||||
class Stream {
|
||||
|
||||
quint32 mId;
|
||||
OstProto::StreamCore *mCore;
|
||||
OstProto::StreamControl *mControl;
|
||||
|
||||
QList<AbstractProtocol*> mProtocolList;
|
||||
//quint32 mId;
|
||||
|
||||
public:
|
||||
|
||||
void* core() { return mCore; } // FIXME(HI): Debug ONLY
|
||||
void loadProtocolWidgets();
|
||||
void storeProtocolWidgets();
|
||||
|
||||
public:
|
||||
enum FrameType {
|
||||
e_ft_none,
|
||||
e_ft_eth_2,
|
||||
e_ft_802_3_raw,
|
||||
e_ft_802_3_llc,
|
||||
e_ft_snap
|
||||
};
|
||||
|
||||
enum DataPatternMode {
|
||||
e_dp_fixed_word,
|
||||
e_dp_inc_byte,
|
||||
e_dp_dec_byte,
|
||||
e_dp_random
|
||||
};
|
||||
|
||||
enum FrameLengthMode {
|
||||
e_fl_fixed,
|
||||
e_fl_inc,
|
||||
@ -51,20 +24,6 @@ public:
|
||||
e_fl_random
|
||||
};
|
||||
|
||||
enum L3Proto {
|
||||
e_l3_none,
|
||||
e_l3_ip,
|
||||
e_l3_arp,
|
||||
};
|
||||
|
||||
enum L4Proto {
|
||||
e_l4_none,
|
||||
e_l4_tcp,
|
||||
e_l4_udp,
|
||||
e_l4_icmp,
|
||||
e_l4_igmp,
|
||||
};
|
||||
|
||||
enum SendUnit {
|
||||
e_su_packets,
|
||||
e_su_bursts
|
||||
@ -87,19 +46,15 @@ public:
|
||||
Stream();
|
||||
~Stream();
|
||||
|
||||
void protoDataCopyFrom(Stream& stream);
|
||||
// TODO: Below methods move to StreamBase???
|
||||
|
||||
bool operator < (const Stream &s) const
|
||||
{ return(mCore->ordinal() < s.mCore->ordinal()); }
|
||||
|
||||
|
||||
void getConfig(uint portId, OstProto::Stream &s);
|
||||
bool update(OstProto::Stream *stream);
|
||||
|
||||
quint32 id()
|
||||
{ return mId;}
|
||||
{ return mStreamId->id();}
|
||||
bool setId(quint32 id)
|
||||
{ mId = id; return true;}
|
||||
{ mStreamId->set_id(id); return true;}
|
||||
|
||||
#if 0 // FIXME(HI): needed?
|
||||
quint32 portId()
|
||||
@ -123,12 +78,7 @@ public:
|
||||
bool setName(QString name)
|
||||
{ mCore->set_name(name.toStdString()); return true; }
|
||||
|
||||
// TODO(HI) : ?????
|
||||
#if 0
|
||||
quint16 dataStartOfs;
|
||||
#endif
|
||||
|
||||
// Frame Length (includes CRC)
|
||||
// Frame Length (includes FCS)
|
||||
FrameLengthMode lenMode()
|
||||
{ return (FrameLengthMode) mCore->len_mode(); }
|
||||
bool setLenMode(FrameLengthMode lenMode)
|
||||
@ -192,16 +142,6 @@ public:
|
||||
{ return (quint32) mControl->bursts_per_sec(); }
|
||||
bool setBurstRate(quint32 burstsPerSec)
|
||||
{ mControl->set_bursts_per_sec(burstsPerSec); return true; }
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Methods for use by Packet Model
|
||||
//---------------------------------------------------------------
|
||||
QList<int> frameProtocol();
|
||||
void setFrameProtocol(QList<int> protocolList);
|
||||
|
||||
//! Includes ALL protocol headers excluding payload data
|
||||
int protocolHeaderSize();
|
||||
AbstractProtocol* protocolById(int id);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -7,71 +7,38 @@
|
||||
int StreamConfigDialog::lastTopLevelTabIndex = 0;
|
||||
int StreamConfigDialog::lastProtoTabIndex = 0;
|
||||
|
||||
// TODO(HI): Write HexLineEdit::setNum() and num() and use it in
|
||||
// Load/Store stream methods
|
||||
|
||||
StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex,
|
||||
QWidget *parent) : QDialog (parent), mPort(port)
|
||||
{
|
||||
OstProto::Stream s;
|
||||
mCurrentStreamIndex = streamIndex;
|
||||
|
||||
mpStream = new Stream;
|
||||
mpStream->protoDataCopyFrom(*(mPort.streamByIndex(mCurrentStreamIndex)));
|
||||
mPort.streamByIndex(mCurrentStreamIndex)->protoDataCopyInto(s);
|
||||
mpStream->protoDataCopyFrom(s);
|
||||
|
||||
setupUi(this);
|
||||
setupUiExtra();
|
||||
|
||||
// setupUi
|
||||
connect(bgFrameType, SIGNAL(buttonClicked(int)),
|
||||
this, SLOT(updateSelectedProtocols()));
|
||||
connect(bgL3Proto, SIGNAL(buttonClicked(int)),
|
||||
this, SLOT(updateSelectedProtocols()));
|
||||
connect(bgL4Proto, SIGNAL(buttonClicked(int)),
|
||||
this, SLOT(updateSelectedProtocols()));
|
||||
|
||||
// Time to play match the signals and slots!
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), rbL3None, SLOT(setChecked(bool)));
|
||||
|
||||
// Show/Hide FrameType related inputs for FT None
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), lblDsap, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), leDsap, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), lblSsap, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), leSsap, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), lblControl, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), leControl, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), lblOui, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), leOui, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), lblType, SLOT(setHidden(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), leType, SLOT(setHidden(bool)));
|
||||
|
||||
// Enable/Disable L3 Protocol Choices for FT None
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), rbL3None, SLOT(setEnabled(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), rbL3Ipv4, SLOT(setDisabled(bool)));
|
||||
connect(rbFtNone, SIGNAL(toggled(bool)), rbL3Arp, SLOT(setDisabled(bool)));
|
||||
|
||||
// Show/Hide FrameType related inputs for FT Ethernet2
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), lblDsap, SLOT(setHidden(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), leDsap, SLOT(setHidden(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), lblSsap, SLOT(setHidden(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), leSsap, SLOT(setHidden(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), lblControl, SLOT(setHidden(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), leControl, SLOT(setHidden(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), lblOui, SLOT(setHidden(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), leOui, SLOT(setHidden(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), lblType, SLOT(setVisible(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), leType, SLOT(setVisible(bool)));
|
||||
|
||||
// Enable/Disable L3 Protocol Choices for FT Ethernet2
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), rbL3None, SLOT(setEnabled(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), rbL3Ipv4, SLOT(setEnabled(bool)));
|
||||
connect(rbFtEthernet2, SIGNAL(toggled(bool)), rbL3Arp, SLOT(setEnabled(bool)));
|
||||
|
||||
// Show/Hide FrameType related inputs for FT 802.3 Raw
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), lblDsap, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), leDsap, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), lblSsap, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), leSsap, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), lblControl, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), leControl, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), lblOui, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), leOui, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), lblType, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), leType, SLOT(setHidden(bool)));
|
||||
|
||||
// Force L3 = None if FT = 802.3 Raw
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), rbL3None, SLOT(setChecked(bool)));
|
||||
|
||||
@ -80,18 +47,6 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex,
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), rbL3Ipv4, SLOT(setDisabled(bool)));
|
||||
connect(rbFt802Dot3Raw, SIGNAL(toggled(bool)), rbL3Arp, SLOT(setDisabled(bool)));
|
||||
|
||||
// Show/Hide FrameType related inputs for FT 802.3 LLC
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), lblDsap, SLOT(setVisible(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), leDsap, SLOT(setVisible(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), lblSsap, SLOT(setVisible(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), leSsap, SLOT(setVisible(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), lblControl, SLOT(setVisible(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), leControl, SLOT(setVisible(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), lblOui, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), leOui, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), lblType, SLOT(setHidden(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), leType, SLOT(setHidden(bool)));
|
||||
|
||||
// Force L3 = None if FT = 802.3 LLC (to ensure a valid L3 is selected)
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), rbL3None, SLOT(setChecked(bool)));
|
||||
|
||||
@ -100,31 +55,11 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex,
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), rbL3Ipv4, SLOT(setEnabled(bool)));
|
||||
connect(rbFt802Dot3Llc, SIGNAL(toggled(bool)), rbL3Arp, SLOT(setDisabled(bool)));
|
||||
|
||||
// Show/Hide FrameType related inputs for FT 802.3 LLC SNAP
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), lblDsap, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), leDsap, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), lblSsap, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), leSsap, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), lblControl, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), leControl, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), lblOui, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), leOui, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), lblType, SLOT(setVisible(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), leType, SLOT(setVisible(bool)));
|
||||
|
||||
// Enable/Disable L3 Protocol Choices for FT 802.3 LLC SNAP
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), rbL3None, SLOT(setEnabled(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), rbL3Ipv4, SLOT(setEnabled(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), rbL3Arp, SLOT(setEnabled(bool)));
|
||||
|
||||
// Enable/Disable FrameType related inputs for FT 802.3 LLC SNAP
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), lblDsap, SLOT(setDisabled(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), leDsap, SLOT(setDisabled(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), lblSsap, SLOT(setDisabled(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), leSsap, SLOT(setDisabled(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), lblControl, SLOT(setDisabled(bool)));
|
||||
connect(rbFtLlcSnap, SIGNAL(toggled(bool)), leControl, SLOT(setDisabled(bool)));
|
||||
|
||||
// Enable/Disable L4 Protocol Choices for L3 Protocol None
|
||||
connect(rbL3None, SIGNAL(toggled(bool)), rbL4None, SLOT(setEnabled(bool)));
|
||||
connect(rbL3None, SIGNAL(toggled(bool)), rbL4Icmp, SLOT(setDisabled(bool)));
|
||||
@ -152,18 +87,6 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex,
|
||||
// Force L4 Protocol = None if L3 Protocol is set to ARP
|
||||
connect(rbL3Arp, SIGNAL(toggled(bool)), rbL4None, SLOT(setChecked(bool)));
|
||||
|
||||
//TODO: remove if not needed
|
||||
#if 0
|
||||
// This set of 'clicks' is a hack to trigger signals at dialog creation
|
||||
// time so that a coherent 'set' is initialized
|
||||
// Actual stream values will be initialized by LoadCurrentStream()
|
||||
rbL3Ipv4->click();
|
||||
rbL3None->click();
|
||||
rbFtEthernet2->click();
|
||||
rbFtNone->click();
|
||||
#endif
|
||||
|
||||
//mmpStreamList = streamList;
|
||||
LoadCurrentStream();
|
||||
mpPacketModel = new PacketModel(QList<AbstractProtocol*>(), this);
|
||||
tvPacketTree->setModel(mpPacketModel);
|
||||
@ -173,6 +96,10 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex,
|
||||
vwPacketDump->setSelectionModel(tvPacketTree->selectionModel());
|
||||
|
||||
// TODO(MED):
|
||||
//! \todo Implement then enable these protocols
|
||||
rbL3Arp->setHidden(true);
|
||||
rbL4Icmp->setHidden(true);
|
||||
rbL4Igmp->setHidden(true);
|
||||
//! \todo Enable navigation of streams
|
||||
pbPrev->setDisabled(true);
|
||||
pbNext->setDisabled(true);
|
||||
@ -181,6 +108,7 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex,
|
||||
disconnect(rbActionGotoStream, SIGNAL(toggled(bool)), leStreamId, SLOT(setEnabled(bool)));
|
||||
//! \todo Support Continuous Mode
|
||||
rbModeContinuous->setDisabled(true);
|
||||
|
||||
// Finally, restore the saved last selected tab for the various tab widgets
|
||||
twTopLevel->setCurrentIndex(lastTopLevelTabIndex);
|
||||
if (twProto->isTabEnabled(lastProtoTabIndex))
|
||||
@ -199,27 +127,25 @@ void StreamConfigDialog::setupUiExtra()
|
||||
|
||||
layout = static_cast<QGridLayout*>(twTopLevel->widget(0)->layout());
|
||||
|
||||
layout->addWidget(mpStream->protocolById(52)->configWidget(), 0, 1);
|
||||
qDebug("setupUi wgt = %p", mpStream->protocolById(52)->configWidget());
|
||||
layout->addWidget(mpStream->protocol(52)->configWidget(), 0, 1);
|
||||
qDebug("setupUi wgt = %p", mpStream->protocol(52)->configWidget());
|
||||
}
|
||||
|
||||
// ---- Setup default stuff that cannot be done in designer ----
|
||||
bgFrameType = new QButtonGroup();
|
||||
foreach(QRadioButton *btn, gbFrameType->findChildren<QRadioButton*>())
|
||||
bgFrameType->addButton(btn);
|
||||
|
||||
// Since the dialog defaults are FT = None, L3 = None, L4 = None;
|
||||
// hide associated input fields since it can't be done in Designer
|
||||
lblDsap->setHidden(true);
|
||||
leDsap->setHidden(true);
|
||||
lblSsap->setHidden(true);
|
||||
leSsap->setHidden(true);
|
||||
lblControl->setHidden(true);
|
||||
leControl->setHidden(true);
|
||||
lblOui->setHidden(true);
|
||||
leOui->setHidden(true);
|
||||
lblType->setHidden(true);
|
||||
leType->setHidden(true);
|
||||
bgL3Proto = new QButtonGroup();
|
||||
foreach(QRadioButton *btn, gbL3Proto->findChildren<QRadioButton*>())
|
||||
bgL3Proto->addButton(btn);
|
||||
|
||||
twProto->setTabEnabled(2, FALSE);
|
||||
twProto->setTabEnabled(3, FALSE);
|
||||
bgL4Proto = new QButtonGroup();
|
||||
foreach(QRadioButton *btn, gbL4Proto->findChildren<QRadioButton*>())
|
||||
bgL4Proto->addButton(btn);
|
||||
|
||||
//twProto->setTabEnabled(2, FALSE);
|
||||
//twProto->setTabEnabled(3, FALSE);
|
||||
|
||||
/*
|
||||
** Setup Validators
|
||||
@ -263,18 +189,8 @@ StreamConfigDialog::~StreamConfigDialog()
|
||||
QLayout *layout = twTopLevel->widget(0)->layout();
|
||||
if (layout)
|
||||
{
|
||||
qDebug("dstrct wgt = %p", mpStream->protocolById(52)->configWidget());
|
||||
#if 0
|
||||
int i = layout->indexOf(mpStream->protocolById(52)->configWidget());
|
||||
if (i >= 0)
|
||||
{
|
||||
layout->takeAt(i);
|
||||
mpStream->protocolById(52)->configWidget()->setParent(0);
|
||||
}
|
||||
#endif
|
||||
layout->removeWidget(mpStream->protocolById(52)->configWidget());
|
||||
mpStream->protocolById(52)->configWidget()->setParent(0);
|
||||
|
||||
layout->removeWidget(mpStream->protocol(52)->configWidget());
|
||||
mpStream->protocol(52)->configWidget()->setParent(0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -296,6 +212,10 @@ StreamConfigDialog::~StreamConfigDialog()
|
||||
}
|
||||
}
|
||||
|
||||
delete bgFrameType;
|
||||
delete bgL3Proto;
|
||||
delete bgL4Proto;
|
||||
|
||||
delete mpStream;
|
||||
}
|
||||
|
||||
@ -340,6 +260,10 @@ void StreamConfigDialog::updateSelectedProtocols()
|
||||
|
||||
// Payload
|
||||
mSelectedProtocols.append(52);
|
||||
|
||||
mpStream->setFrameProtocol(mSelectedProtocols);
|
||||
mpStream->storeProtocolWidgets();
|
||||
mpStream->loadProtocolWidgets();
|
||||
}
|
||||
|
||||
|
||||
@ -399,146 +323,6 @@ void StreamConfigDialog::on_pbNext_clicked()
|
||||
#endif
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbFtNone_toggled(bool checked)
|
||||
{
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbFtEthernet2_toggled(bool checked)
|
||||
{
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbFt802Dot3Raw_toggled(bool checked)
|
||||
{
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbFt802Dot3Llc_toggled(bool checked)
|
||||
{
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbFtLlcSnap_toggled(bool checked)
|
||||
{
|
||||
if (checked)
|
||||
{
|
||||
leDsap->setText("AA");
|
||||
leSsap->setText("AA");
|
||||
leControl->setText("03");
|
||||
}
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbL3Ipv4_toggled(bool checked)
|
||||
{
|
||||
if (checked)
|
||||
{
|
||||
twProto->setTabEnabled(2, TRUE);
|
||||
twProto->setTabText(2, "L3 (IPv4)");
|
||||
leType->setText("08 00");
|
||||
|
||||
// FIXME: Hardcoding
|
||||
mpStream->protocolById(121)->setFieldData(0 /* type */, 0x800);
|
||||
mpStream->loadProtocolWidgets(); // FIXME: pass protocol as param
|
||||
}
|
||||
else
|
||||
{
|
||||
twProto->setTabEnabled(2, FALSE);
|
||||
twProto->setTabText(2, "L3");
|
||||
}
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbL3Arp_toggled(bool checked)
|
||||
{
|
||||
if (checked)
|
||||
{
|
||||
twProto->setTabEnabled(2, TRUE);
|
||||
twProto->setTabText(2, "L3 (ARP)");
|
||||
leType->setText("08 06");
|
||||
|
||||
// FIXME: Hardcoding
|
||||
mpStream->protocolById(121)->setFieldData(0 /* type */, 0x806);
|
||||
mpStream->loadProtocolWidgets(); // FIXME: pass protocol as param
|
||||
}
|
||||
else
|
||||
{
|
||||
twProto->setTabEnabled(2, FALSE);
|
||||
twProto->setTabText(2, "L3");
|
||||
}
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbL4Icmp_toggled(bool checked)
|
||||
{
|
||||
QString str;
|
||||
|
||||
if (checked)
|
||||
{
|
||||
twProto->setTabEnabled(3, TRUE);
|
||||
twProto->setTabText(3, "L4 (ICMP)");
|
||||
// FIXME: Hardcoding
|
||||
mpStream->protocolById(130)->setFieldData(8 /* proto */, IP_PROTO_ICMP);
|
||||
mpStream->loadProtocolWidgets(); // FIXME: pass protocol as param
|
||||
}
|
||||
else
|
||||
{
|
||||
twProto->setTabEnabled(3, FALSE);
|
||||
twProto->setTabText(3, "L4");
|
||||
}
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbL4Igmp_toggled(bool checked)
|
||||
{
|
||||
QString str;
|
||||
|
||||
if (checked)
|
||||
{
|
||||
twProto->setTabEnabled(3, TRUE);
|
||||
twProto->setTabText(3, "L4 (IGMP)");
|
||||
// FIXME: Hardcoding
|
||||
mpStream->protocolById(130)->setFieldData(8 /* proto */, IP_PROTO_IGMP);
|
||||
mpStream->loadProtocolWidgets(); // FIXME: pass protocol as param
|
||||
}
|
||||
else
|
||||
{
|
||||
twProto->setTabEnabled(3, FALSE);
|
||||
twProto->setTabText(3, "L4");
|
||||
}
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbL4Tcp_toggled(bool checked)
|
||||
{
|
||||
QString str;
|
||||
|
||||
if (checked)
|
||||
{
|
||||
twProto->setTabEnabled(3, TRUE);
|
||||
twProto->setTabText(3, "L4 (TCP)");
|
||||
// FIXME: Hardcoding
|
||||
mpStream->protocolById(130)->setFieldData(8 /* proto */, IP_PROTO_TCP);
|
||||
mpStream->loadProtocolWidgets(); // FIXME: pass protocol as param
|
||||
}
|
||||
else
|
||||
{
|
||||
twProto->setTabEnabled(3, FALSE);
|
||||
twProto->setTabText(3, "L4");
|
||||
}
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_rbL4Udp_toggled(bool checked)
|
||||
{
|
||||
QString str;
|
||||
|
||||
if (checked)
|
||||
{
|
||||
twProto->setTabEnabled(3, TRUE);
|
||||
twProto->setTabText(3, "L4 (UDP)");
|
||||
// FIXME: Hardcoding
|
||||
mpStream->protocolById(130)->setFieldData(8 /* proto */, IP_PROTO_UDP);
|
||||
mpStream->loadProtocolWidgets(); // FIXME: pass protocol as param
|
||||
}
|
||||
else
|
||||
{
|
||||
twProto->setTabEnabled(3, FALSE);
|
||||
twProto->setTabText(3, "L4");
|
||||
}
|
||||
}
|
||||
|
||||
void StreamConfigDialog::on_twTopLevel_currentChanged(int index)
|
||||
{
|
||||
QList<AbstractProtocol*> protoList;
|
||||
@ -549,8 +333,8 @@ void StreamConfigDialog::on_twTopLevel_currentChanged(int index)
|
||||
|
||||
updateSelectedProtocols();
|
||||
foreach(int i, mSelectedProtocols)
|
||||
if (mpStream->protocolById(i))
|
||||
protoList.append(mpStream->protocolById(i));
|
||||
if (mpStream->protocol(i))
|
||||
protoList.append(mpStream->protocol(i));
|
||||
|
||||
mpPacketModel->setSelectedProtocols(protoList);
|
||||
StoreCurrentStream(mpStream);
|
||||
@ -583,42 +367,44 @@ void StreamConfigDialog::on_twProto_currentChanged(int index)
|
||||
switch(index)
|
||||
{
|
||||
case 1: // L2
|
||||
wl.append(mpStream->protocolById(51)->configWidget());
|
||||
wl.append(mpStream->protocol("mac")->configWidget());
|
||||
if (rbFtEthernet2->isChecked())
|
||||
wl.append(mpStream->protocolById(121)->configWidget());
|
||||
wl.append(mpStream->protocol("eth2")->configWidget());
|
||||
else if (rbFt802Dot3Raw->isChecked())
|
||||
wl.append(mpStream->protocolById(122)->configWidget());
|
||||
wl.append(mpStream->protocol("dot3")->configWidget());
|
||||
else if (rbFt802Dot3Llc->isChecked())
|
||||
{
|
||||
wl.append(mpStream->protocolById(122)->configWidget());
|
||||
wl.append(mpStream->protocolById(123)->configWidget());
|
||||
wl.append(mpStream->protocol("dot3")->configWidget());
|
||||
wl.append(mpStream->protocol("llc")->configWidget());
|
||||
}
|
||||
else if (rbFtLlcSnap->isChecked())
|
||||
{
|
||||
wl.append(mpStream->protocolById(122)->configWidget());
|
||||
wl.append(mpStream->protocolById(123)->configWidget());
|
||||
wl.append(mpStream->protocolById(124)->configWidget());
|
||||
wl.append(mpStream->protocol("dot3")->configWidget());
|
||||
wl.append(mpStream->protocol("llc")->configWidget());
|
||||
wl.append(mpStream->protocol("snap")->configWidget());
|
||||
}
|
||||
break;
|
||||
case 2: // L3
|
||||
if (rbL3Ipv4->isChecked())
|
||||
wl.append(mpStream->protocolById(130)->configWidget());
|
||||
wl.append(mpStream->protocol("ip4")->configWidget());
|
||||
break;
|
||||
case 3: // L4
|
||||
if (rbL4Tcp->isChecked())
|
||||
wl.append(mpStream->protocolById(140)->configWidget());
|
||||
wl.append(mpStream->protocol("tcp")->configWidget());
|
||||
else if (rbL4Udp->isChecked())
|
||||
wl.append(mpStream->protocolById(141)->configWidget());
|
||||
wl.append(mpStream->protocol("udp")->configWidget());
|
||||
break;
|
||||
}
|
||||
|
||||
if (wl.size())
|
||||
{
|
||||
layout = new QVBoxLayout;
|
||||
|
||||
for (int i=0; i < wl.size(); i++)
|
||||
layout->addWidget(wl.at(i));
|
||||
for (int i=0; i < wl.size(); i++)
|
||||
layout->addWidget(wl.at(i));
|
||||
|
||||
twProto->widget(index)->setLayout(layout);
|
||||
twProto->widget(index)->setLayout(layout);
|
||||
}
|
||||
}
|
||||
|
||||
void StreamConfigDialog::update_NumPacketsAndNumBursts()
|
||||
|
@ -29,6 +29,10 @@ public:
|
||||
private:
|
||||
//QList<Stream> *mpStreamList;
|
||||
|
||||
QButtonGroup *bgFrameType;
|
||||
QButtonGroup *bgL3Proto;
|
||||
QButtonGroup *bgL4Proto;
|
||||
|
||||
Port& mPort;
|
||||
uint mCurrentStreamIndex;
|
||||
Stream *mpStream;
|
||||
@ -45,7 +49,6 @@ private:
|
||||
static int lastProtoTabIndex;
|
||||
|
||||
void setupUiExtra();
|
||||
void updateSelectedProtocols();
|
||||
void LoadCurrentStream();
|
||||
void StoreCurrentStream(Stream *pStream);
|
||||
|
||||
@ -54,18 +57,7 @@ private slots:
|
||||
void on_pbPrev_clicked();
|
||||
void on_pbNext_clicked();
|
||||
|
||||
void on_rbFtNone_toggled(bool checked);
|
||||
void on_rbFtEthernet2_toggled(bool checked);
|
||||
void on_rbFt802Dot3Raw_toggled(bool checked);
|
||||
void on_rbFt802Dot3Llc_toggled(bool checked);
|
||||
void on_rbFtLlcSnap_toggled(bool checked);
|
||||
void on_rbL3Ipv4_toggled(bool checked);
|
||||
void on_rbL3Arp_toggled(bool checked);
|
||||
void on_rbL4Icmp_toggled(bool checked);
|
||||
void on_rbL4Igmp_toggled(bool checked);
|
||||
void on_rbL4Tcp_toggled(bool checked);
|
||||
void on_rbL4Udp_toggled(bool checked);
|
||||
|
||||
void updateSelectedProtocols();
|
||||
void on_twTopLevel_currentChanged(int index);
|
||||
void on_twProto_currentChanged(int index);
|
||||
|
||||
|
@ -59,7 +59,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
|
||||
<item row="0" column="2" >
|
||||
<widget class="QGroupBox" name="gbFrameLength" >
|
||||
<property name="title" >
|
||||
<string>Frame Length (including CRC)</string>
|
||||
<string>Frame Length (including FCS)</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" >
|
||||
@ -159,164 +159,60 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
|
||||
</attribute>
|
||||
<layout class="QGridLayout" >
|
||||
<item rowspan="2" row="0" column="0" >
|
||||
<widget class="QGroupBox" name="groupBox_4" >
|
||||
<widget class="QGroupBox" name="gbFrameType" >
|
||||
<property name="title" >
|
||||
<string>Frame Type</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" >
|
||||
<layout class="QVBoxLayout" >
|
||||
<item>
|
||||
<layout class="QHBoxLayout" >
|
||||
<item>
|
||||
<layout class="QVBoxLayout" >
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFtNone" >
|
||||
<property name="text" >
|
||||
<string>None</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFtEthernet2" >
|
||||
<property name="text" >
|
||||
<string>Ethernet II</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFt802Dot3Raw" >
|
||||
<property name="text" >
|
||||
<string>802.3 Raw</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFt802Dot3Llc" >
|
||||
<property name="text" >
|
||||
<string>802.3 LLC</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFtLlcSnap" >
|
||||
<property name="text" >
|
||||
<string>LLC SNAP</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line" >
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="lblDsap" >
|
||||
<property name="text" >
|
||||
<string>DSAP</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QLineEdit" name="leDsap" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="lblSsap" >
|
||||
<property name="text" >
|
||||
<string>SSAP</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QLineEdit" name="leSsap" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" >
|
||||
<widget class="QLabel" name="lblControl" >
|
||||
<property name="text" >
|
||||
<string>Control</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" >
|
||||
<widget class="QLineEdit" name="leControl" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" >
|
||||
<widget class="QLabel" name="lblOui" >
|
||||
<property name="text" >
|
||||
<string>OUI</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" >
|
||||
<widget class="QLineEdit" name="leOui" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" >
|
||||
<widget class="QLabel" name="lblType" >
|
||||
<property name="text" >
|
||||
<string>Type</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" >
|
||||
<widget class="QLineEdit" name="leType" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QRadioButton" name="rbFtNone" >
|
||||
<property name="text" >
|
||||
<string>None</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFtEthernet2" >
|
||||
<property name="text" >
|
||||
<string>Ethernet II</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFt802Dot3Raw" >
|
||||
<property name="text" >
|
||||
<string>802.3 Raw</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFt802Dot3Llc" >
|
||||
<property name="text" >
|
||||
<string>802.3 LLC</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rbFtLlcSnap" >
|
||||
<property name="text" >
|
||||
<string>LLC SNAP</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" >
|
||||
<widget class="QGroupBox" name="groupBox_8" >
|
||||
<widget class="QGroupBox" name="gbL3Proto" >
|
||||
<property name="title" >
|
||||
<string>L3</string>
|
||||
</property>
|
||||
@ -358,7 +254,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" >
|
||||
<widget class="QGroupBox" name="groupBox_9" >
|
||||
<widget class="QGroupBox" name="gbL4Proto" >
|
||||
<property name="title" >
|
||||
<string>L4</string>
|
||||
</property>
|
||||
@ -416,7 +312,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" >
|
||||
<item row="2" column="1" >
|
||||
<spacer>
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include <qendian.h>
|
||||
#include "abstractprotocol.h"
|
||||
|
||||
/*!
|
||||
@ -18,19 +19,30 @@
|
||||
- metaFieldCount()
|
||||
- isMetaField()
|
||||
*/
|
||||
AbstractProtocol::AbstractProtocol(Stream *parent)
|
||||
AbstractProtocol::AbstractProtocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: frameProtocols(frameProtoList)
|
||||
{
|
||||
qDebug("%s: &frameproto = %p/%p (sz:%d)", __FUNCTION__, &frameProtocols, &frameProtoList, frameProtocols.size());
|
||||
stream = parent;
|
||||
metaCount = -1;
|
||||
protoSize = -1;
|
||||
}
|
||||
|
||||
AbstractProtocol::~AbstractProtocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* AbstractProtocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*!
|
||||
\fn virtual void protoDataCopyInto(OstProto::Stream &stream) = 0;
|
||||
\fn virtual void protoDataCopyInto(OstProto::OstProto::StreamCore &stream) = 0;
|
||||
|
||||
Copy the protocol's protobuf into the passed in stream \n
|
||||
In the base class this is a pure virtual function. Subclasses should
|
||||
@ -38,7 +50,7 @@ AbstractProtocol::~AbstractProtocol()
|
||||
stream.AddExtension(<ExtId>)->CopyFrom(<protobuf_data>) */
|
||||
|
||||
/*
|
||||
\fn virtual void protoDataCopyFrom(const OstProto::Stream &stream) = 0;
|
||||
\fn virtual void protoDataCopyFrom(const OstProto::OstProto::StreamCore &stream) = 0;
|
||||
FIXME */
|
||||
|
||||
/*! Returns the full name of the protocol \n
|
||||
@ -114,6 +126,11 @@ int AbstractProtocol::frameFieldCount() const
|
||||
the field's value e.g. a checksum field may include "(correct)" or
|
||||
"(incorrect)" alongwith the actual checksum value. \n
|
||||
The default implementation returns FIXME
|
||||
|
||||
\note If a subclass uses any of the below functions to derive
|
||||
FieldFrameValue, the subclass should handle and return a value for
|
||||
FieldBitSize to prevent endless recrusion -
|
||||
- protocolFrameCksum()
|
||||
*/
|
||||
QVariant AbstractProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
int streamIndex) const
|
||||
@ -151,6 +168,81 @@ bool AbstractProtocol::setFieldData(int index, const QVariant &value,
|
||||
return false;
|
||||
}
|
||||
|
||||
quint32 AbstractProtocol::protocolId(ProtocolIdType type) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
quint32 AbstractProtocol::payloadProtocolId(ProtocolIdType type) const
|
||||
{
|
||||
quint32 id = 0xFFFFFFFF;
|
||||
QLinkedListIterator<const AbstractProtocol*> iter(frameProtocols);
|
||||
|
||||
if (iter.findNext(this))
|
||||
{
|
||||
if (iter.hasNext())
|
||||
id = iter.next()->protocolId(type);
|
||||
}
|
||||
|
||||
qDebug("%s: payloadProtocolId = %u", __FUNCTION__, id);
|
||||
return id;
|
||||
}
|
||||
|
||||
int AbstractProtocol::protocolFrameSize() const
|
||||
{
|
||||
if (protoSize < 0)
|
||||
{
|
||||
int bitsize = 0;
|
||||
|
||||
for (int i = 0; i < fieldCount(); i++)
|
||||
{
|
||||
if (!fieldData(i, FieldIsMeta).toBool())
|
||||
bitsize += fieldData(i, FieldBitSize).toUInt();
|
||||
}
|
||||
protoSize = (bitsize+7)/8;
|
||||
}
|
||||
|
||||
qDebug("%s: protoSize = %d", __FUNCTION__, protoSize);
|
||||
return protoSize;
|
||||
}
|
||||
|
||||
int AbstractProtocol::protocolFrameOffset() const
|
||||
{
|
||||
int size = 0;
|
||||
QLinkedListIterator<const AbstractProtocol*> iter(frameProtocols);
|
||||
|
||||
if (iter.findNext(this))
|
||||
{
|
||||
iter.previous();
|
||||
while (iter.hasPrevious())
|
||||
size += iter.previous()->protocolFrameSize();
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
|
||||
qDebug("%s: ofs = %d", __FUNCTION__, size);
|
||||
return size;
|
||||
}
|
||||
|
||||
int AbstractProtocol::protocolFramePayloadSize() const
|
||||
{
|
||||
int size = 0;
|
||||
|
||||
QLinkedListIterator<const AbstractProtocol*> iter(frameProtocols);
|
||||
|
||||
if (iter.findNext(this))
|
||||
{
|
||||
while (iter.hasNext())
|
||||
size += iter.next()->protocolFrameSize();
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
|
||||
qDebug("%s: payloadSize = %d", __FUNCTION__, size);
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
/*! Returns a byte array encoding the protocol (and its fields) which can be
|
||||
inserted into the stream's frame
|
||||
The default implementation forms and returns an ordered concatenation of
|
||||
@ -223,3 +315,53 @@ QByteArray AbstractProtocol::protocolFrameValue(int streamIndex) const
|
||||
return proto;
|
||||
}
|
||||
|
||||
QVariant AbstractProtocol::protocolFrameCksum() const
|
||||
{
|
||||
QByteArray fv;
|
||||
quint16 *ip;
|
||||
quint32 len, sum = 0;
|
||||
|
||||
fv = protocolFrameValue(-1);
|
||||
ip = (quint16*) fv.constData();
|
||||
len = fv.size();
|
||||
|
||||
while(len > 1)
|
||||
{
|
||||
sum += *ip;
|
||||
if(sum & 0x80000000)
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
ip++;
|
||||
len -= 2;
|
||||
}
|
||||
|
||||
if (len)
|
||||
sum += (unsigned short) *(unsigned char *)ip;
|
||||
|
||||
while(sum>>16)
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
|
||||
return qFromBigEndian((quint16) ~sum);
|
||||
}
|
||||
|
||||
QVariant AbstractProtocol::protocolFramePayloadCksum() const
|
||||
{
|
||||
int cksum = 0;
|
||||
QLinkedListIterator<const AbstractProtocol*> iter(frameProtocols);
|
||||
|
||||
if (iter.findNext(this))
|
||||
{
|
||||
while (iter.hasNext())
|
||||
cksum += iter.next()->protocolFrameCksum().toUInt(); // TODO: chg to partial
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
#if 0
|
||||
while(cksum>>16)
|
||||
cksum = (cksum & 0xFFFF) + (cksum >> 16);
|
||||
|
||||
return (quint16) ~cksum;
|
||||
#endif
|
||||
|
||||
return cksum;
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,9 @@
|
||||
#include <QVariant>
|
||||
#include <QByteArray>
|
||||
#include <QWidget>
|
||||
#include <QLinkedList>
|
||||
|
||||
//#include "../rpc/pbhelper.h"
|
||||
#include "../common/protocol.pb.h"
|
||||
|
||||
#define BASE_BIN (2)
|
||||
@ -13,16 +15,24 @@
|
||||
#define BASE_DEC (10)
|
||||
#define BASE_HEX (16)
|
||||
|
||||
class Stream;
|
||||
#define uintToHexStr(num, bytes) \
|
||||
QString("%1").arg(num, bytes*2, BASE_HEX, QChar('0'))
|
||||
|
||||
class OstProto::StreamCore;
|
||||
class AbstractProtocol;
|
||||
|
||||
typedef QLinkedList<const AbstractProtocol*> ProtocolList;
|
||||
|
||||
class AbstractProtocol
|
||||
{
|
||||
private:
|
||||
mutable int metaCount;
|
||||
mutable int protoSize;
|
||||
mutable QString protoAbbr;
|
||||
|
||||
protected:
|
||||
Stream *stream;
|
||||
OstProto::StreamCore *stream;
|
||||
ProtocolList &frameProtocols;
|
||||
|
||||
public:
|
||||
enum FieldAttrib {
|
||||
@ -34,15 +44,29 @@ public:
|
||||
FieldIsMeta //! bool indicating if field is meta
|
||||
};
|
||||
|
||||
AbstractProtocol(Stream *parent = 0);
|
||||
enum ProtocolIdType {
|
||||
ProtocolIdLlc,
|
||||
ProtocolIdEth,
|
||||
ProtocolIdIp,
|
||||
};
|
||||
|
||||
AbstractProtocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~AbstractProtocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream) = 0;
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream) = 0;
|
||||
|
||||
virtual QString name() const;
|
||||
virtual QString shortName() const;
|
||||
|
||||
virtual quint32 protocolId(ProtocolIdType type) const;
|
||||
quint32 payloadProtocolId(ProtocolIdType type) const;
|
||||
|
||||
virtual int fieldCount() const;
|
||||
virtual int metaFieldCount() const;
|
||||
int frameFieldCount() const;
|
||||
@ -53,6 +77,12 @@ public:
|
||||
FieldAttrib attrib = FieldValue);
|
||||
|
||||
QByteArray protocolFrameValue(int streamIndex = 0) const;
|
||||
int protocolFrameSize() const;
|
||||
int protocolFrameOffset() const;
|
||||
int protocolFramePayloadSize() const;
|
||||
|
||||
virtual QVariant protocolFrameCksum() const;
|
||||
QVariant protocolFramePayloadCksum() const;
|
||||
|
||||
virtual QWidget* configWidget() = 0;
|
||||
virtual void loadConfigWidget() = 0;
|
||||
|
@ -3,6 +3,8 @@
|
||||
|
||||
#include "Dot3.h"
|
||||
|
||||
#define SZ_FCS 4
|
||||
|
||||
Dot3ConfigForm *Dot3Protocol::configForm = NULL;
|
||||
|
||||
Dot3ConfigForm::Dot3ConfigForm(QWidget *parent)
|
||||
@ -11,8 +13,10 @@ Dot3ConfigForm::Dot3ConfigForm(QWidget *parent)
|
||||
setupUi(this);
|
||||
}
|
||||
|
||||
Dot3Protocol::Dot3Protocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
Dot3Protocol::Dot3Protocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
if (configForm == NULL)
|
||||
configForm = new Dot3ConfigForm;
|
||||
@ -22,6 +26,13 @@ Dot3Protocol::~Dot3Protocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* Dot3Protocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new Dot3Protocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void Dot3Protocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -61,14 +72,27 @@ QVariant Dot3Protocol::fieldData(int index, FieldAttrib attrib,
|
||||
case FieldName:
|
||||
return QString("Length");
|
||||
case FieldValue:
|
||||
return data.length();
|
||||
{
|
||||
quint16 len;
|
||||
|
||||
len = stream->frame_len() - SZ_FCS;
|
||||
return len;
|
||||
}
|
||||
case FieldTextValue:
|
||||
return QString("%1").arg(data.length());
|
||||
{
|
||||
quint16 len;
|
||||
|
||||
len = stream->frame_len() - SZ_FCS;
|
||||
return QString("%1").arg(len);
|
||||
}
|
||||
case FieldFrameValue:
|
||||
{
|
||||
quint16 len;
|
||||
QByteArray fv;
|
||||
|
||||
len = stream->frame_len() - SZ_FCS;
|
||||
fv.resize(2);
|
||||
qToBigEndian((quint16) data.length(), (uchar*) fv.data());
|
||||
qToBigEndian(len, (uchar*) fv.data());
|
||||
return fv;
|
||||
}
|
||||
default:
|
||||
@ -98,7 +122,8 @@ QWidget* Dot3Protocol::configWidget()
|
||||
|
||||
void Dot3Protocol::loadConfigWidget()
|
||||
{
|
||||
configForm->leLength->setText(QString().setNum(data.length()));
|
||||
configForm->leLength->setText(
|
||||
fieldData(dot3_length, FieldValue).toString());
|
||||
}
|
||||
|
||||
void Dot3Protocol::storeConfigWidget()
|
||||
|
@ -26,9 +26,14 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
Dot3Protocol(Stream *parent = 0);
|
||||
Dot3Protocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~Dot3Protocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
|
@ -11,8 +11,10 @@ Eth2ConfigForm::Eth2ConfigForm(QWidget *parent)
|
||||
setupUi(this);
|
||||
}
|
||||
|
||||
Eth2Protocol::Eth2Protocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
Eth2Protocol::Eth2Protocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
if (configForm == NULL)
|
||||
configForm = new Eth2ConfigForm;
|
||||
@ -22,6 +24,13 @@ Eth2Protocol::~Eth2Protocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* Eth2Protocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new Eth2Protocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void Eth2Protocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -56,26 +65,31 @@ QVariant Eth2Protocol::fieldData(int index, FieldAttrib attrib,
|
||||
switch (index)
|
||||
{
|
||||
case eth2_type:
|
||||
{
|
||||
quint16 type;
|
||||
switch(attrib)
|
||||
{
|
||||
case FieldName:
|
||||
return QString("Type");
|
||||
case FieldValue:
|
||||
return data.type();
|
||||
type = payloadProtocolId(ProtocolIdEth);
|
||||
return type;
|
||||
case FieldTextValue:
|
||||
return QString("%1").arg(data.type(), 16);
|
||||
type = payloadProtocolId(ProtocolIdEth);
|
||||
return QString("0x%1").arg(type, 4, BASE_HEX, QChar('0'));
|
||||
case FieldFrameValue:
|
||||
{
|
||||
QByteArray fv;
|
||||
type = payloadProtocolId(ProtocolIdEth);
|
||||
fv.resize(2);
|
||||
qToBigEndian((quint16) data.type(), (uchar*) fv.data());
|
||||
qToBigEndian((quint16) type, (uchar*) fv.data());
|
||||
return fv;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -112,12 +126,8 @@ QWidget* Eth2Protocol::configWidget()
|
||||
|
||||
void Eth2Protocol::loadConfigWidget()
|
||||
{
|
||||
#define uintToHexStr(num, bytesize) \
|
||||
QString("%1").arg((num), (bytesize)*2 , 16, QChar('0'))
|
||||
|
||||
configForm->leType->setText(uintToHexStr(data.type(), 2));
|
||||
|
||||
#undef uintToHexStr
|
||||
configForm->leType->setText(uintToHexStr(
|
||||
fieldData(eth2_type, FieldValue).toUInt(), 2));
|
||||
}
|
||||
|
||||
void Eth2Protocol::storeConfigWidget()
|
||||
|
@ -26,9 +26,14 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
Eth2Protocol(Stream *parent = 0);
|
||||
Eth2Protocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~Eth2Protocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
|
@ -32,10 +32,10 @@
|
||||
<item>
|
||||
<widget class="QLineEdit" name="leType" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH; </string>
|
||||
<string>>HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
124
common/ip4.cpp
124
common/ip4.cpp
@ -44,9 +44,16 @@ void Ip4ConfigForm::on_cmbIpDstAddrMode_currentIndexChanged(int index)
|
||||
}
|
||||
}
|
||||
|
||||
Ip4Protocol::Ip4Protocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
Ip4Protocol::Ip4Protocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
#if 0
|
||||
PbHelper pbh;
|
||||
|
||||
pbh.ForceSetSingularDefault(&data);
|
||||
#endif
|
||||
if (configForm == NULL)
|
||||
configForm = new Ip4ConfigForm;
|
||||
}
|
||||
@ -55,6 +62,13 @@ Ip4Protocol::~Ip4Protocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* Ip4Protocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new Ip4Protocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void Ip4Protocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -78,6 +92,19 @@ QString Ip4Protocol::shortName() const
|
||||
return QString("IPv4");
|
||||
}
|
||||
|
||||
quint32 Ip4Protocol::protocolId(ProtocolIdType type) const
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case ProtocolIdLlc: return 0x060603;
|
||||
case ProtocolIdEth: return 0x0800;
|
||||
case ProtocolIdIp: return 0x04;
|
||||
default:break;
|
||||
}
|
||||
|
||||
return AbstractProtocol::protocolId(type);
|
||||
}
|
||||
|
||||
int Ip4Protocol::fieldCount() const
|
||||
{
|
||||
return ip4_fieldCount;
|
||||
@ -139,25 +166,42 @@ QVariant Ip4Protocol::fieldData(int index, FieldAttrib attrib,
|
||||
}
|
||||
break;
|
||||
case ip4_totLen:
|
||||
{
|
||||
switch(attrib)
|
||||
{
|
||||
case FieldName:
|
||||
return QString("Total Length");
|
||||
case FieldValue:
|
||||
return data.totlen();
|
||||
{
|
||||
int totlen;
|
||||
totlen = data.is_override_totlen() ? data.totlen() :
|
||||
(protocolFramePayloadSize() + 20);
|
||||
return totlen;
|
||||
}
|
||||
case FieldFrameValue:
|
||||
{
|
||||
QByteArray fv;
|
||||
int totlen;
|
||||
totlen = data.is_override_totlen() ? data.totlen() :
|
||||
(protocolFramePayloadSize() + 20);
|
||||
fv.resize(2);
|
||||
qToBigEndian((quint16) data.totlen(), (uchar*) fv.data());
|
||||
qToBigEndian((quint16) totlen, (uchar*) fv.data());
|
||||
return fv;
|
||||
}
|
||||
case FieldTextValue:
|
||||
return QString("%1").arg(data.totlen());
|
||||
{
|
||||
int totlen;
|
||||
totlen = data.is_override_totlen() ? data.totlen() :
|
||||
(protocolFramePayloadSize() + 20);
|
||||
return QString("%1").arg(totlen);
|
||||
}
|
||||
case FieldBitSize:
|
||||
return 16;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ip4_id:
|
||||
switch(attrib)
|
||||
{
|
||||
@ -244,42 +288,86 @@ QVariant Ip4Protocol::fieldData(int index, FieldAttrib attrib,
|
||||
}
|
||||
break;
|
||||
case ip4_proto:
|
||||
{
|
||||
switch(attrib)
|
||||
{
|
||||
case FieldName:
|
||||
return QString("Protocol");
|
||||
case FieldValue:
|
||||
return data.proto();
|
||||
{
|
||||
unsigned char id = payloadProtocolId(ProtocolIdIp);
|
||||
return id;
|
||||
}
|
||||
case FieldFrameValue:
|
||||
return QByteArray(1, (char)data.proto());
|
||||
{
|
||||
unsigned char id = payloadProtocolId(ProtocolIdIp);
|
||||
return QByteArray(1, (char) id);
|
||||
}
|
||||
case FieldTextValue:
|
||||
{
|
||||
unsigned char id = payloadProtocolId(ProtocolIdIp);
|
||||
return QString("0x%1").
|
||||
arg(data.proto(), 2, BASE_HEX, QChar('0'));
|
||||
arg(id, 2, BASE_HEX, QChar('0'));
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ip4_cksum:
|
||||
{
|
||||
|
||||
switch(attrib)
|
||||
{
|
||||
case FieldName:
|
||||
return QString("Header Checksum");
|
||||
case FieldValue:
|
||||
return data.cksum();
|
||||
{
|
||||
quint16 cksum;
|
||||
|
||||
if (streamIndex < 0)
|
||||
cksum = 0;
|
||||
else if (data.is_override_cksum())
|
||||
cksum = data.cksum();
|
||||
else
|
||||
cksum = protocolFrameCksum().toUInt();
|
||||
return cksum;
|
||||
}
|
||||
case FieldFrameValue:
|
||||
{
|
||||
QByteArray fv;
|
||||
quint16 cksum;
|
||||
|
||||
if (streamIndex < 0)
|
||||
cksum = 0;
|
||||
else if (data.is_override_cksum())
|
||||
cksum = data.cksum();
|
||||
else
|
||||
cksum = protocolFrameCksum().toUInt();
|
||||
fv.resize(2);
|
||||
qToBigEndian((quint16) data.cksum(), (uchar*) fv.data());
|
||||
qToBigEndian((quint16) cksum, (uchar*) fv.data());
|
||||
return fv;
|
||||
}
|
||||
case FieldTextValue:
|
||||
{
|
||||
quint16 cksum;
|
||||
|
||||
if (streamIndex < 0)
|
||||
cksum = 0;
|
||||
else if (data.is_override_cksum())
|
||||
cksum = data.cksum();
|
||||
else
|
||||
cksum = protocolFrameCksum().toUInt();
|
||||
return QString("0x%1").
|
||||
arg(data.cksum(), 4, BASE_HEX, QChar('0'));;
|
||||
arg(cksum, 4, BASE_HEX, QChar('0'));;
|
||||
}
|
||||
case FieldBitSize:
|
||||
return 16;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ip4_srcAddr:
|
||||
switch(attrib)
|
||||
{
|
||||
@ -381,27 +469,27 @@ QWidget* Ip4Protocol::configWidget()
|
||||
|
||||
void Ip4Protocol::loadConfigWidget()
|
||||
{
|
||||
#define uintToHexStr(num, str, size) QString().setNum(num, 16)
|
||||
configForm->leIpVersion->setText(QString().setNum(data.ver_hdrlen() >> 4));
|
||||
configForm->cbIpVersionOverride->setChecked(data.is_override_ver());
|
||||
|
||||
configForm->leIpHdrLen->setText(QString().setNum(data.ver_hdrlen() & 0x0F));
|
||||
configForm->cbIpHdrLenOverride->setChecked(data.is_override_hdrlen());
|
||||
|
||||
configForm->leIpTos->setText(uintToHexStr(data.tos(), QString(), 1));
|
||||
|
||||
configForm->leIpLength->setText(QString().setNum(data.totlen()));
|
||||
configForm->leIpTos->setText(uintToHexStr(data.tos(), 1));
|
||||
configForm->leIpLength->setText(fieldData(ip4_totLen, FieldValue).toString());
|
||||
configForm->cbIpLengthOverride->setChecked(data.is_override_totlen());
|
||||
|
||||
configForm->leIpId->setText(uintToHexStr(data.id(), QString(), 2));
|
||||
configForm->leIpId->setText(uintToHexStr(data.id(), 2));
|
||||
configForm->leIpFragOfs->setText(QString().setNum(data.frag_ofs()));
|
||||
configForm->cbIpFlagsDf->setChecked((data.flags() & IP_FLAG_DF) > 0);
|
||||
configForm->cbIpFlagsMf->setChecked((data.flags() & IP_FLAG_MF) > 0);
|
||||
|
||||
configForm->leIpTtl->setText(QString().setNum(data.ttl()));
|
||||
configForm->leIpProto->setText(uintToHexStr(data.proto(), QString(), 1));
|
||||
configForm->leIpProto->setText(uintToHexStr(
|
||||
fieldData(ip4_proto, FieldValue).toUInt(), 1));
|
||||
|
||||
configForm->leIpCksum->setText(uintToHexStr(data.cksum(), QString(), 2));
|
||||
configForm->leIpCksum->setText(uintToHexStr(
|
||||
fieldData(ip4_cksum, FieldValue).toUInt(), 2));
|
||||
configForm->cbIpCksumOverride->setChecked(data.is_override_cksum());
|
||||
|
||||
configForm->leIpSrcAddr->setText(QHostAddress(data.src_ip()).toString());
|
||||
|
@ -58,15 +58,20 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
Ip4Protocol(Stream *parent = 0);
|
||||
Ip4Protocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~Ip4Protocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
virtual QString name() const;
|
||||
virtual QString shortName() const;
|
||||
|
||||
virtual quint32 protocolId(ProtocolIdType type) const;
|
||||
virtual int fieldCount() const;
|
||||
|
||||
virtual QVariant fieldData(int index, FieldAttrib attrib,
|
||||
|
@ -28,7 +28,7 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>4</string>
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -45,7 +45,7 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>5</string>
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -59,7 +59,7 @@
|
||||
<item row="2" column="1" >
|
||||
<widget class="QLineEdit" name="leIpTos" >
|
||||
<property name="inputMask" >
|
||||
<string>HH; </string>
|
||||
<string>>HH; </string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string/>
|
||||
@ -100,7 +100,7 @@
|
||||
<item row="4" column="1" >
|
||||
<widget class="QLineEdit" name="leIpId" >
|
||||
<property name="inputMask" >
|
||||
<string>HH HH; </string>
|
||||
<string>>HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -149,7 +149,7 @@
|
||||
<item row="2" column="1" >
|
||||
<widget class="QLineEdit" name="leIpTtl" >
|
||||
<property name="text" >
|
||||
<string>64</string>
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -183,7 +183,7 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH; </string>
|
||||
<string>>HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -291,8 +291,11 @@
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>009.009.009.009; </string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>255.255.255.255</string>
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -355,8 +358,11 @@
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>009.009.009.009; </string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>255.255.255.255</string>
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -11,8 +11,10 @@ LlcConfigForm::LlcConfigForm(QWidget *parent)
|
||||
setupUi(this);
|
||||
}
|
||||
|
||||
LlcProtocol::LlcProtocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
LlcProtocol::LlcProtocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
if (configForm == NULL)
|
||||
configForm = new LlcConfigForm;
|
||||
@ -22,6 +24,13 @@ LlcProtocol::~LlcProtocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* LlcProtocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new LlcProtocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void LlcProtocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -53,6 +62,14 @@ int LlcProtocol::fieldCount() const
|
||||
QVariant LlcProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
int streamIndex) const
|
||||
{
|
||||
quint32 id;
|
||||
quint8 dsap, ssap, ctl;
|
||||
|
||||
id = payloadProtocolId(ProtocolIdLlc);
|
||||
dsap = (id >> 16) & 0xFF;
|
||||
ssap = (id >> 8) & 0xFF;
|
||||
ctl = (id >> 0) & 0xFF;
|
||||
|
||||
switch (index)
|
||||
{
|
||||
case llc_dsap:
|
||||
@ -61,11 +78,11 @@ QVariant LlcProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
case FieldName:
|
||||
return QString("DSAP");
|
||||
case FieldValue:
|
||||
return data.dsap();
|
||||
return dsap;
|
||||
case FieldTextValue:
|
||||
return QString("%1").arg(data.dsap(), BASE_HEX);
|
||||
return QString("%1").arg(dsap, 2, BASE_HEX, QChar('0'));
|
||||
case FieldFrameValue:
|
||||
return QByteArray(1, (char)(data.dsap()));
|
||||
return QByteArray(1, (char)(dsap));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -74,13 +91,13 @@ QVariant LlcProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
switch(attrib)
|
||||
{
|
||||
case FieldName:
|
||||
return QString("DSAP");
|
||||
return QString("SSAP");
|
||||
case FieldValue:
|
||||
return data.ssap();
|
||||
return ssap;
|
||||
case FieldTextValue:
|
||||
return QString("%1").arg(data.ssap(), BASE_HEX);
|
||||
return QString("%1").arg(ssap, 2, BASE_HEX, QChar('0'));
|
||||
case FieldFrameValue:
|
||||
return QByteArray(1, (char)(data.ssap()));
|
||||
return QByteArray(1, (char)(ssap));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -89,13 +106,13 @@ QVariant LlcProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
switch(attrib)
|
||||
{
|
||||
case FieldName:
|
||||
return QString("DSAP");
|
||||
return QString("Control");
|
||||
case FieldValue:
|
||||
return data.ctl();
|
||||
return ctl;
|
||||
case FieldTextValue:
|
||||
return QString("%1").arg(data.ctl(), BASE_HEX);
|
||||
return QString("%1").arg(ctl, 2, BASE_HEX, QChar('0'));
|
||||
case FieldFrameValue:
|
||||
return QByteArray(1, (char)(data.ctl()));
|
||||
return QByteArray(1, (char)(ctl));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -123,9 +140,16 @@ QWidget* LlcProtocol::configWidget()
|
||||
|
||||
void LlcProtocol::loadConfigWidget()
|
||||
{
|
||||
configForm->leDsap->setText(QString("%1").arg(data.dsap(), 2, BASE_HEX, QChar('0')));
|
||||
configForm->leSsap->setText(QString("%1").arg(data.ssap(), 2, BASE_HEX, QChar('0')));
|
||||
configForm->leControl->setText(QString("%1").arg(data.ctl(), 2, BASE_HEX, QChar('0')));
|
||||
#define uintToHexStr(num, bytes) \
|
||||
QString("%1").arg(num, bytes*2, BASE_HEX, QChar('0'))
|
||||
|
||||
configForm->leDsap->setText(uintToHexStr(
|
||||
fieldData(llc_dsap, FieldValue).toUInt(), 1));
|
||||
configForm->leSsap->setText(uintToHexStr(
|
||||
fieldData(llc_ssap, FieldValue).toUInt(), 1));
|
||||
configForm->leControl->setText(uintToHexStr(
|
||||
fieldData(llc_ctl, FieldValue).toUInt(), 1));
|
||||
#undef uintToHexStr
|
||||
}
|
||||
|
||||
void LlcProtocol::storeConfigWidget()
|
||||
|
@ -31,9 +31,14 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
LlcProtocol(Stream *parent = 0);
|
||||
LlcProtocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~LlcProtocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
|
@ -38,10 +38,10 @@
|
||||
<item>
|
||||
<widget class="QLineEdit" name="leDsap" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH; </string>
|
||||
<string>>HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -58,10 +58,10 @@
|
||||
<item>
|
||||
<widget class="QLineEdit" name="leSsap" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH; </string>
|
||||
<string>>HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -78,10 +78,10 @@
|
||||
<item>
|
||||
<widget class="QLineEdit" name="leControl" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH; </string>
|
||||
<string>>HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -46,8 +46,10 @@ void MacConfigForm::on_cmbSrcMacMode_currentIndexChanged(int index)
|
||||
}
|
||||
|
||||
|
||||
MacProtocol::MacProtocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
MacProtocol::MacProtocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
if (configForm == NULL)
|
||||
configForm = new MacConfigForm;
|
||||
@ -57,6 +59,13 @@ MacProtocol::~MacProtocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* MacProtocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new MacProtocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void MacProtocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -174,13 +183,12 @@ QWidget* MacProtocol::configWidget()
|
||||
|
||||
void MacProtocol::loadConfigWidget()
|
||||
{
|
||||
#define uintToHexStr(num, str, size) QString().setNum(num, 16)
|
||||
configForm->leDstMac->setText(uintToHexStr(data.dst_mac(), str, 6));
|
||||
configForm->leDstMac->setText(uintToHexStr(data.dst_mac(), 6));
|
||||
configForm->cmbDstMacMode->setCurrentIndex(data.dst_mac_mode());
|
||||
configForm->leDstMacCount->setText(QString().setNum(data.dst_mac_count()));
|
||||
configForm->leDstMacStep->setText(QString().setNum(data.dst_mac_step()));
|
||||
|
||||
configForm->leSrcMac->setText(uintToHexStr(data.src_mac(), QString(), 6));
|
||||
configForm->leSrcMac->setText(uintToHexStr(data.src_mac(), 6));
|
||||
configForm->cmbSrcMacMode->setCurrentIndex(data.src_mac_mode());
|
||||
configForm->leSrcMacCount->setText(QString().setNum(data.src_mac_count()));
|
||||
configForm->leSrcMacStep->setText(QString().setNum(data.src_mac_step()));
|
||||
|
@ -39,9 +39,14 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
MacProtocol(Stream *parent = 0);
|
||||
MacProtocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~MacProtocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
|
@ -49,7 +49,7 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH HH HH HH HH; </string>
|
||||
<string>>HH HH HH HH HH HH; </string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string> </string>
|
||||
@ -111,7 +111,7 @@
|
||||
<item row="2" column="1" >
|
||||
<widget class="QLineEdit" name="leSrcMac" >
|
||||
<property name="inputMask" >
|
||||
<string>HH HH HH HH HH HH; </string>
|
||||
<string>>HH HH HH HH HH HH; </string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string> </string>
|
||||
|
@ -26,6 +26,9 @@ PROTOS += \
|
||||
udp.proto
|
||||
HEADERS += \
|
||||
abstractprotocol.h \
|
||||
protocolmanager.h \
|
||||
protocolcollection.h \
|
||||
streambase.h \
|
||||
mac.h \
|
||||
payload.h \
|
||||
eth2.h \
|
||||
@ -37,6 +40,9 @@ HEADERS += \
|
||||
udp.h
|
||||
SOURCES += \
|
||||
abstractprotocol.cpp \
|
||||
protocolmanager.cpp \
|
||||
protocolcollection.cpp \
|
||||
streambase.cpp \
|
||||
mac.cpp \
|
||||
payload.cpp \
|
||||
eth2.cpp \
|
||||
|
@ -1,9 +1,11 @@
|
||||
#include <qendian.h>
|
||||
#include <QHostAddress>
|
||||
|
||||
#include "../client/stream.h"
|
||||
//#include "../client/stream.h"
|
||||
#include "payload.h"
|
||||
|
||||
#define SZ_FCS 4
|
||||
|
||||
PayloadConfigForm *PayloadProtocol::configForm = NULL;
|
||||
|
||||
PayloadConfigForm::PayloadConfigForm(QWidget *parent)
|
||||
@ -29,8 +31,10 @@ void PayloadConfigForm::on_cmbPatternMode_currentIndexChanged(int index)
|
||||
}
|
||||
}
|
||||
|
||||
PayloadProtocol::PayloadProtocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
PayloadProtocol::PayloadProtocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
if (configForm == NULL)
|
||||
configForm = new PayloadConfigForm;
|
||||
@ -40,6 +44,13 @@ PayloadProtocol::~PayloadProtocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* PayloadProtocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new PayloadProtocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void PayloadProtocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -88,10 +99,8 @@ QVariant PayloadProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
QByteArray fv;
|
||||
int dataLen;
|
||||
|
||||
// FIXME: cannot use stream since it is only on client not
|
||||
// on server
|
||||
//dataLen = stream->frameLen() - stream->protocolHeaderSize();
|
||||
dataLen = 64;
|
||||
dataLen = stream->frame_len() - protocolFrameOffset();
|
||||
dataLen -= SZ_FCS;
|
||||
fv.resize(dataLen+4);
|
||||
switch(data.pattern_mode())
|
||||
{
|
||||
@ -159,10 +168,8 @@ QWidget* PayloadProtocol::configWidget()
|
||||
|
||||
void PayloadProtocol::loadConfigWidget()
|
||||
{
|
||||
#define uintToHexStr(num, str, size) QString().setNum(num, 16)
|
||||
|
||||
configForm->cmbPatternMode->setCurrentIndex(data.pattern_mode());
|
||||
configForm->lePattern->setText(uintToHexStr(data.pattern(), QString(), 4));
|
||||
configForm->lePattern->setText(uintToHexStr(data.pattern(), 4));
|
||||
}
|
||||
|
||||
void PayloadProtocol::storeConfigWidget()
|
||||
|
@ -31,9 +31,14 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
PayloadProtocol(Stream *parent = 0);
|
||||
PayloadProtocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~PayloadProtocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
|
@ -46,7 +46,7 @@
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lePattern" >
|
||||
<property name="inputMask" >
|
||||
<string>HH HH HH HH; </string>
|
||||
<string>>HH HH HH HH; </string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string> </string>
|
||||
|
106
common/protocolcollection.cpp
Normal file
106
common/protocolcollection.cpp
Normal file
@ -0,0 +1,106 @@
|
||||
#include "protocolcollection.h"
|
||||
|
||||
extern ProtocolManager OstProtocolManager;
|
||||
|
||||
ProtocolCollection::ProtocolCollection(ProtocolList &streamProtocols,
|
||||
OstProto::StreamCore *streamCore)
|
||||
: protoManager(OstProtocolManager)
|
||||
{
|
||||
// Create an instance of each registered protocol
|
||||
|
||||
QMapIterator<int, void*> iter(protoManager.factory);
|
||||
|
||||
while (iter.hasNext())
|
||||
{
|
||||
AbstractProtocol* (*p)(ProtocolList&, OstProto::StreamCore*);
|
||||
AbstractProtocol* q;
|
||||
|
||||
iter.next();
|
||||
p = (AbstractProtocol* (*)(ProtocolList&, OstProto::StreamCore*))
|
||||
iter.value();
|
||||
q = (*p)(streamProtocols, streamCore);
|
||||
|
||||
protocols.insert(iter.key(), q);
|
||||
}
|
||||
}
|
||||
|
||||
ProtocolCollection::~ProtocolCollection()
|
||||
{
|
||||
QMutableMapIterator<int,AbstractProtocol*> iter(protocols);
|
||||
|
||||
while (iter.hasNext())
|
||||
{
|
||||
iter.next();
|
||||
if (iter.value())
|
||||
{
|
||||
delete iter.value();
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProtocolCollection::protoDataCopyFrom(const OstProto::Stream &stream) const
|
||||
{
|
||||
QMapIterator<int,AbstractProtocol*> iter(protocols);
|
||||
|
||||
while (iter.hasNext())
|
||||
{
|
||||
iter.next();
|
||||
if (iter.value())
|
||||
{
|
||||
iter.value()->protoDataCopyFrom(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProtocolCollection::protoDataCopyInto(OstProto::Stream &stream) const
|
||||
{
|
||||
QMapIterator<int,AbstractProtocol*> iter(protocols);
|
||||
|
||||
while (iter.hasNext())
|
||||
{
|
||||
iter.next();
|
||||
if (iter.value())
|
||||
{
|
||||
iter.value()->protoDataCopyInto(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProtocolCollection::loadConfigWidgets() const
|
||||
{
|
||||
QMapIterator<int,AbstractProtocol*> iter(protocols);
|
||||
|
||||
while (iter.hasNext())
|
||||
{
|
||||
iter.next();
|
||||
if (iter.value())
|
||||
{
|
||||
iter.value()->loadConfigWidget();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProtocolCollection::storeConfigWidgets() const
|
||||
{
|
||||
QMapIterator<int,AbstractProtocol*> iter(protocols);
|
||||
|
||||
while (iter.hasNext())
|
||||
{
|
||||
iter.next();
|
||||
if (iter.value())
|
||||
{
|
||||
iter.value()->storeConfigWidget();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AbstractProtocol* ProtocolCollection::protocol(int protoNum)
|
||||
{
|
||||
return protocols.value(protoNum);
|
||||
}
|
||||
|
||||
AbstractProtocol* ProtocolCollection::protocol(QString protoName)
|
||||
{
|
||||
return protocols.value(protoManager.nameToNumberMap.value(protoName));
|
||||
}
|
30
common/protocolcollection.h
Normal file
30
common/protocolcollection.h
Normal file
@ -0,0 +1,30 @@
|
||||
#ifndef _PROTOCOL_COLLECTION_H
|
||||
#define _PROTOCOL_COLLECTION_H
|
||||
|
||||
#include <QMap>
|
||||
#include <QLinkedList>
|
||||
|
||||
#include "abstractprotocol.h"
|
||||
#include "protocolmanager.h"
|
||||
|
||||
class ProtocolCollection {
|
||||
|
||||
ProtocolManager &protoManager;
|
||||
QMap<int, AbstractProtocol*> protocols;
|
||||
|
||||
public:
|
||||
ProtocolCollection(ProtocolList &streamProtocols,
|
||||
OstProto::StreamCore *streamCore);
|
||||
ProtocolCollection::~ProtocolCollection();
|
||||
|
||||
void protoDataCopyFrom(const OstProto::Stream &stream) const;
|
||||
void protoDataCopyInto(OstProto::Stream &stream) const;
|
||||
|
||||
void loadConfigWidgets() const;
|
||||
void storeConfigWidgets() const;
|
||||
|
||||
AbstractProtocol* protocol(int protoNum);
|
||||
AbstractProtocol* protocol(QString protoName);
|
||||
};
|
||||
|
||||
#endif
|
38
common/protocolmanager.cpp
Normal file
38
common/protocolmanager.cpp
Normal file
@ -0,0 +1,38 @@
|
||||
#include "protocolmanager.h"
|
||||
|
||||
#include "mac.h"
|
||||
#include "payload.h"
|
||||
|
||||
#include "eth2.h"
|
||||
#include "dot3.h"
|
||||
#include "llc.h"
|
||||
#include "snap.h"
|
||||
#include "ip4.h"
|
||||
#include "tcp.h"
|
||||
#include "udp.h"
|
||||
|
||||
QMap<int, void*> ProtocolManager::factory;
|
||||
QMap<QString, int> ProtocolManager::nameToNumberMap;
|
||||
|
||||
ProtocolManager OstProtocolManager;
|
||||
|
||||
ProtocolManager::ProtocolManager()
|
||||
{
|
||||
registerProtocol(51, QString("mac"), (void*) MacProtocol::createInstance);
|
||||
registerProtocol(52, QString("payload"), (void*) PayloadProtocol::createInstance);
|
||||
registerProtocol(121, QString("eth2"), (void*) Eth2Protocol::createInstance);
|
||||
registerProtocol(122, QString("dot3"), (void*) Dot3Protocol::createInstance);
|
||||
registerProtocol(123, QString("llc"), (void*) LlcProtocol::createInstance);
|
||||
registerProtocol(124, QString("snap"), (void*) SnapProtocol::createInstance);
|
||||
registerProtocol(130, QString("ip4"), (void*) Ip4Protocol::createInstance);
|
||||
registerProtocol(140, QString("tcp"), (void*) TcpProtocol::createInstance);
|
||||
registerProtocol(141, QString("udp"), (void*) UdpProtocol::createInstance);
|
||||
}
|
||||
|
||||
void ProtocolManager::registerProtocol(int protoNumber, QString protoName,
|
||||
void *protoInstanceCreator)
|
||||
{
|
||||
// TODO: validate incoming params for duplicates with existing
|
||||
nameToNumberMap.insert(protoName, protoNumber);
|
||||
factory.insert(protoNumber, protoInstanceCreator);
|
||||
}
|
18
common/protocolmanager.h
Normal file
18
common/protocolmanager.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef _PROTOCOL_MANAGER_H
|
||||
#define _PROTOCOL_MANAGER_H
|
||||
|
||||
#include <QMap>
|
||||
|
||||
class ProtocolManager
|
||||
{
|
||||
public:
|
||||
static QMap<QString, int> nameToNumberMap;
|
||||
static QMap<int, void*> factory;
|
||||
|
||||
public:
|
||||
ProtocolManager();
|
||||
void registerProtocol(int protoNumber, QString protoName,
|
||||
void *protoCreator);
|
||||
};
|
||||
|
||||
#endif
|
@ -11,8 +11,10 @@ SnapConfigForm::SnapConfigForm(QWidget *parent)
|
||||
setupUi(this);
|
||||
}
|
||||
|
||||
SnapProtocol::SnapProtocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
SnapProtocol::SnapProtocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
if (configForm == NULL)
|
||||
configForm = new SnapConfigForm;
|
||||
@ -22,6 +24,13 @@ SnapProtocol::~SnapProtocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* SnapProtocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new SnapProtocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void SnapProtocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -45,6 +54,17 @@ QString SnapProtocol::shortName() const
|
||||
return QString("SNAP");
|
||||
}
|
||||
|
||||
quint32 SnapProtocol::protocolId(ProtocolIdType type) const
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case ProtocolIdLlc: return 0xAAAA03;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return AbstractProtocol::protocolId(type);
|
||||
}
|
||||
|
||||
int SnapProtocol::fieldCount() const
|
||||
{
|
||||
return snap_fieldCount;
|
||||
@ -76,7 +96,33 @@ QVariant SnapProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case snap_type:
|
||||
{
|
||||
quint16 type;
|
||||
|
||||
switch(attrib)
|
||||
{
|
||||
case FieldName:
|
||||
return QString("Type");
|
||||
case FieldValue:
|
||||
type = payloadProtocolId(ProtocolIdEth);
|
||||
return type;
|
||||
case FieldTextValue:
|
||||
type = payloadProtocolId(ProtocolIdEth);
|
||||
return QString("%1").arg(type, 4, BASE_HEX, QChar('0'));
|
||||
case FieldFrameValue:
|
||||
{
|
||||
QByteArray fv;
|
||||
fv.resize(2);
|
||||
type = payloadProtocolId(ProtocolIdEth);
|
||||
qToBigEndian(type, (uchar*) fv.data());
|
||||
return fv;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -99,14 +145,17 @@ QWidget* SnapProtocol::configWidget()
|
||||
|
||||
void SnapProtocol::loadConfigWidget()
|
||||
{
|
||||
#define uintToHexStr(num, str, size) QString().setNum(num, 16)
|
||||
configForm->leOui->setText(uintToHexStr(data.oui(), str, 3));
|
||||
configForm->leOui->setText(uintToHexStr(
|
||||
fieldData(snap_oui, FieldValue).toUInt(), 3));
|
||||
configForm->leType->setText(uintToHexStr(
|
||||
fieldData(snap_type, FieldValue).toUInt(), 2));
|
||||
}
|
||||
|
||||
void SnapProtocol::storeConfigWidget()
|
||||
{
|
||||
bool isOk;
|
||||
|
||||
data.set_oui(configForm->leOui->text().remove(QChar(' ')).toULong(&isOk, 16));
|
||||
data.set_oui(configForm->leOui->text().toULong(&isOk, BASE_HEX));
|
||||
data.set_type(configForm->leType->text().toULong(&isOk, BASE_HEX));
|
||||
}
|
||||
|
||||
|
@ -21,19 +21,26 @@ private:
|
||||
enum snapfield
|
||||
{
|
||||
snap_oui = 0,
|
||||
snap_type,
|
||||
|
||||
snap_fieldCount
|
||||
};
|
||||
|
||||
public:
|
||||
SnapProtocol(Stream *parent = 0);
|
||||
SnapProtocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~SnapProtocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
virtual QString name() const;
|
||||
virtual QString shortName() const;
|
||||
virtual quint32 protocolId(ProtocolIdType type) const;
|
||||
|
||||
virtual int fieldCount() const;
|
||||
|
||||
|
@ -4,7 +4,7 @@ package OstProto;
|
||||
|
||||
message Snap {
|
||||
optional uint32 oui = 1;
|
||||
//optional uint32 type = 2;
|
||||
optional uint32 type = 2;
|
||||
}
|
||||
|
||||
extend Stream {
|
||||
|
@ -29,10 +29,10 @@
|
||||
<item>
|
||||
<widget class="QLineEdit" name="leOui" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH HH; </string>
|
||||
<string>>HH HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -46,10 +46,10 @@
|
||||
<item>
|
||||
<widget class="QLineEdit" name="leType" >
|
||||
<property name="enabled" >
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH; </string>
|
||||
<string>>HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
69
common/streambase.cpp
Normal file
69
common/streambase.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
#include "streambase.h"
|
||||
|
||||
StreamBase::StreamBase() :
|
||||
mStreamId(new OstProto::StreamId),
|
||||
mCore(new OstProto::StreamCore),
|
||||
mControl(new OstProto::StreamControl),
|
||||
protocols(currentFrameProtocols, mCore)
|
||||
{
|
||||
mStreamId->set_id(0xFFFFFFFF);
|
||||
}
|
||||
|
||||
StreamBase::~StreamBase()
|
||||
{
|
||||
delete mStreamId;
|
||||
delete mCore;
|
||||
delete mControl;
|
||||
}
|
||||
|
||||
void StreamBase::protoDataCopyFrom(const OstProto::Stream &stream)
|
||||
{
|
||||
mStreamId->CopyFrom(stream.stream_id());
|
||||
mCore->CopyFrom(stream.core());
|
||||
mControl->CopyFrom(stream.control());
|
||||
|
||||
protocols.protoDataCopyFrom(stream);
|
||||
setFrameProtocol(frameProtocol());
|
||||
}
|
||||
|
||||
void StreamBase::protoDataCopyInto(OstProto::Stream &stream) const
|
||||
{
|
||||
stream.mutable_stream_id()->CopyFrom(*mStreamId);
|
||||
stream.mutable_core()->CopyFrom(*mCore);
|
||||
stream.mutable_control()->CopyFrom(*mControl);
|
||||
|
||||
protocols.protoDataCopyInto(stream);
|
||||
}
|
||||
|
||||
QList<int> StreamBase::frameProtocol()
|
||||
{
|
||||
QList<int> protocolList;
|
||||
|
||||
for (int i = 0; i < mCore->frame_proto_size(); i++)
|
||||
protocolList.append(mCore->frame_proto(i));
|
||||
|
||||
return protocolList;
|
||||
}
|
||||
|
||||
void StreamBase::setFrameProtocol(QList<int> protocolList)
|
||||
{
|
||||
mCore->clear_frame_proto();
|
||||
currentFrameProtocols.clear();
|
||||
|
||||
for (int i = 0; i < protocolList.size(); i++)
|
||||
{
|
||||
mCore->add_frame_proto(protocolList.at(i));
|
||||
currentFrameProtocols.append(protocols.protocol(protocolList.at(i)));
|
||||
}
|
||||
}
|
||||
|
||||
AbstractProtocol* StreamBase::protocol(int protoNum)
|
||||
{
|
||||
return protocols.protocol(protoNum);
|
||||
}
|
||||
|
||||
AbstractProtocol* StreamBase::protocol(QString protoName)
|
||||
{
|
||||
return protocols.protocol(protoName);
|
||||
}
|
||||
|
36
common/streambase.h
Normal file
36
common/streambase.h
Normal file
@ -0,0 +1,36 @@
|
||||
#ifndef _STREAM_BASE_H
|
||||
#define _STREAM_BASE_H
|
||||
|
||||
#include <QList>
|
||||
|
||||
#include "protocolcollection.h"
|
||||
|
||||
class StreamBase
|
||||
{
|
||||
protected: // TODO: temp - make private
|
||||
OstProto::StreamId *mStreamId;
|
||||
OstProto::StreamCore *mCore;
|
||||
OstProto::StreamControl *mControl;
|
||||
|
||||
private:
|
||||
ProtocolList currentFrameProtocols;
|
||||
protected:
|
||||
ProtocolCollection protocols;
|
||||
|
||||
public:
|
||||
StreamBase();
|
||||
~StreamBase();
|
||||
|
||||
void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
void protoDataCopyInto(OstProto::Stream &stream) const;
|
||||
|
||||
QList<int> frameProtocol();
|
||||
void setFrameProtocol(QList<int> protocolList);
|
||||
|
||||
AbstractProtocol* protocol(int protoNum);
|
||||
AbstractProtocol* protocol(QString protoName);
|
||||
|
||||
// TODO: make a copy constructor
|
||||
};
|
||||
|
||||
#endif
|
@ -11,8 +11,10 @@ TcpConfigForm::TcpConfigForm(QWidget *parent)
|
||||
setupUi(this);
|
||||
}
|
||||
|
||||
TcpProtocol::TcpProtocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
TcpProtocol::TcpProtocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
if (configForm == NULL)
|
||||
configForm = new TcpConfigForm;
|
||||
@ -22,6 +24,13 @@ TcpProtocol::~TcpProtocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* TcpProtocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new TcpProtocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void TcpProtocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -45,6 +54,17 @@ QString TcpProtocol::shortName() const
|
||||
return QString("TCP");
|
||||
}
|
||||
|
||||
quint32 TcpProtocol::protocolId(ProtocolIdType type) const
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case ProtocolIdIp: return 0x06;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return AbstractProtocol::protocolId(type);
|
||||
}
|
||||
|
||||
int TcpProtocol::fieldCount() const
|
||||
{
|
||||
return tcp_fieldCount;
|
||||
@ -149,7 +169,7 @@ QVariant TcpProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
case FieldTextValue:
|
||||
return QString("%1").arg((data.hdrlen_rsvd() >> 4) & 0x0F);
|
||||
case FieldFrameValue:
|
||||
return QByteArray(1, (char)((data.hdrlen_rsvd() >> 4) & 0x0F));
|
||||
return QByteArray(1, (char)(data.hdrlen_rsvd() & 0xF0));
|
||||
case FieldBitSize:
|
||||
return 4;
|
||||
default:
|
||||
@ -303,7 +323,6 @@ QWidget* TcpProtocol::configWidget()
|
||||
|
||||
void TcpProtocol::loadConfigWidget()
|
||||
{
|
||||
#define uintToHexStr(num, str, size) QString().setNum(num, 16)
|
||||
configForm->leTcpSrcPort->setText(QString().setNum(data.src_port()));
|
||||
configForm->leTcpDstPort->setText(QString().setNum(data.dst_port()));
|
||||
|
||||
|
@ -45,14 +45,20 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
TcpProtocol(Stream *parent = 0);
|
||||
TcpProtocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~TcpProtocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
virtual QString name() const;
|
||||
virtual QString shortName() const;
|
||||
virtual quint32 protocolId(ProtocolIdType type) const;
|
||||
|
||||
virtual int fieldCount() const;
|
||||
|
||||
|
@ -43,7 +43,7 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH; </string>
|
||||
<string>>HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -11,8 +11,10 @@ UdpConfigForm::UdpConfigForm(QWidget *parent)
|
||||
setupUi(this);
|
||||
}
|
||||
|
||||
UdpProtocol::UdpProtocol(Stream *parent)
|
||||
: AbstractProtocol(parent)
|
||||
UdpProtocol::UdpProtocol(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent)
|
||||
: AbstractProtocol(frameProtoList, parent)
|
||||
{
|
||||
if (configForm == NULL)
|
||||
configForm = new UdpConfigForm;
|
||||
@ -22,6 +24,13 @@ UdpProtocol::~UdpProtocol()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractProtocol* UdpProtocol::createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore)
|
||||
{
|
||||
return new UdpProtocol(frameProtoList, streamCore);
|
||||
}
|
||||
|
||||
void UdpProtocol::protoDataCopyInto(OstProto::Stream &stream)
|
||||
{
|
||||
// FIXME: multiple headers
|
||||
@ -45,6 +54,17 @@ QString UdpProtocol::shortName() const
|
||||
return QString("UDP");
|
||||
}
|
||||
|
||||
quint32 UdpProtocol::protocolId(ProtocolIdType type) const
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case ProtocolIdIp: return 0x11;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return AbstractProtocol::protocolId(type);
|
||||
}
|
||||
|
||||
int UdpProtocol::fieldCount() const
|
||||
{
|
||||
return udp_fieldCount;
|
||||
@ -98,26 +118,47 @@ QVariant UdpProtocol::fieldData(int index, FieldAttrib attrib,
|
||||
break;
|
||||
|
||||
case udp_totLen:
|
||||
{
|
||||
|
||||
switch(attrib)
|
||||
{
|
||||
case FieldName:
|
||||
return QString("Datagram Length");
|
||||
case FieldValue:
|
||||
return data.totlen();
|
||||
case FieldTextValue:
|
||||
return QString("%1").arg(data.totlen());
|
||||
{
|
||||
int totlen;
|
||||
|
||||
totlen = data.is_override_totlen() ?
|
||||
data.totlen() :
|
||||
(protocolFramePayloadSize() + 8);
|
||||
return totlen;
|
||||
}
|
||||
case FieldFrameValue:
|
||||
{
|
||||
QByteArray fv;
|
||||
int totlen;
|
||||
totlen = data.is_override_totlen() ?
|
||||
data.totlen() :
|
||||
(protocolFramePayloadSize() + 8);
|
||||
fv.resize(2);
|
||||
qToBigEndian((quint16) data.totlen(), (uchar*) fv.data());
|
||||
qToBigEndian((quint16) totlen, (uchar*) fv.data());
|
||||
return fv;
|
||||
}
|
||||
case FieldTextValue:
|
||||
{
|
||||
int totlen;
|
||||
totlen = data.is_override_totlen() ?
|
||||
data.totlen() :
|
||||
(protocolFramePayloadSize() + 8);
|
||||
return QString("%1").arg(totlen);
|
||||
}
|
||||
case FieldBitSize:
|
||||
return 16;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
case udp_cksum:
|
||||
switch(attrib)
|
||||
{
|
||||
@ -173,7 +214,6 @@ QWidget* UdpProtocol::configWidget()
|
||||
|
||||
void UdpProtocol::loadConfigWidget()
|
||||
{
|
||||
#define uintToHexStr(num, str, size) QString().setNum(num, 16)
|
||||
configForm->leUdpSrcPort->setText(QString().setNum(data.src_port()));
|
||||
configForm->leUdpDstPort->setText(QString().setNum(data.dst_port()));
|
||||
|
||||
|
@ -32,14 +32,20 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
UdpProtocol(Stream *parent = 0);
|
||||
UdpProtocol(ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *parent = 0);
|
||||
virtual ~UdpProtocol();
|
||||
|
||||
static AbstractProtocol* createInstance(
|
||||
ProtocolList &frameProtoList,
|
||||
OstProto::StreamCore *streamCore = 0);
|
||||
|
||||
virtual void protoDataCopyInto(OstProto::Stream &stream);
|
||||
virtual void protoDataCopyFrom(const OstProto::Stream &stream);
|
||||
|
||||
virtual QString name() const;
|
||||
virtual QString shortName() const;
|
||||
virtual quint32 protocolId(ProtocolIdType type) const;
|
||||
|
||||
virtual int fieldCount() const;
|
||||
|
||||
|
@ -62,7 +62,7 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH; </string>
|
||||
<string>>HH HH; </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -97,5 +97,38 @@
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>cbUdpLengthOverride</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>leUdpLength</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<x>59</x>
|
||||
<y>63</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<x>149</x>
|
||||
<y>63</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>cbUdpCksumOverride</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>leUdpCksum</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<x>55</x>
|
||||
<y>106</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<x>158</x>
|
||||
<y>106</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
|
@ -126,7 +126,7 @@
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="inputMask" >
|
||||
<string>HH HH; </string>
|
||||
<string>>HH HH; </string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string> </string>
|
||||
|
@ -4,17 +4,6 @@
|
||||
#include <qglobal.h>
|
||||
#include <qendian.h>
|
||||
|
||||
#include "../common/mac.h"
|
||||
#include "../common/payload.h"
|
||||
|
||||
#include "../common/eth2.h" // FIXME: proto DB
|
||||
#include "../common/dot3.h" // FIXME: proto DB
|
||||
#include "../common/llc.h" // FIXME: proto DB
|
||||
#include "../common/snap.h" // FIXME: proto DB
|
||||
#include "../common/ip4.h" // FIXME: proto DB
|
||||
#include "../common/tcp.h" // FIXME: proto DB
|
||||
#include "../common/udp.h" // FIXME: proto DB
|
||||
|
||||
#if 0
|
||||
#include <pcap-int.h>
|
||||
#include <Ntddndis.h>
|
||||
@ -25,62 +14,19 @@
|
||||
|
||||
StreamInfo::StreamInfo()
|
||||
{
|
||||
#if 0
|
||||
PbHelper pbh;
|
||||
|
||||
pbh.ForceSetSingularDefault(&mCore);
|
||||
pbh.ForceSetSingularDefault(&mControl);
|
||||
|
||||
mProtocolList.append(new MacProtocol);
|
||||
mProtocolList.append(new PayloadProtocol());
|
||||
|
||||
// FIXME: proto DB
|
||||
mProtocolList.append(new Eth2Protocol);
|
||||
mProtocolList.append(new Dot3Protocol);
|
||||
mProtocolList.append(new LlcProtocol);
|
||||
mProtocolList.append(new SnapProtocol);
|
||||
mProtocolList.append(new Ip4Protocol);
|
||||
mProtocolList.append(new TcpProtocol);
|
||||
mProtocolList.append(new UdpProtocol);
|
||||
pbh.ForceSetSingularDefault(mCore);
|
||||
pbh.ForceSetSingularDefault(mControl);
|
||||
#endif
|
||||
}
|
||||
|
||||
StreamInfo::~StreamInfo()
|
||||
{
|
||||
for (int i = 0; i < mProtocolList.size(); i++)
|
||||
delete mProtocolList.at(i);
|
||||
}
|
||||
|
||||
AbstractProtocol* StreamInfo::protocolById(int id)
|
||||
{
|
||||
// FIXME BAD BAD VERY BAD!
|
||||
switch(id) {
|
||||
case 51:
|
||||
return mProtocolList.at(0);
|
||||
case 52:
|
||||
return mProtocolList.at(1);
|
||||
case 121:
|
||||
return mProtocolList.at(2);
|
||||
case 122:
|
||||
return mProtocolList.at(3);
|
||||
case 123:
|
||||
return mProtocolList.at(4);
|
||||
case 124:
|
||||
return mProtocolList.at(5);
|
||||
// case 125 (unused)
|
||||
#if 0 // todo VLAN
|
||||
case 126:
|
||||
return mProtocolList.at(x);
|
||||
#endif
|
||||
case 130:
|
||||
return mProtocolList.at(6);
|
||||
case 140:
|
||||
return mProtocolList.at(7);
|
||||
case 141:
|
||||
return mProtocolList.at(8);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
quint32 StreamInfo::pseudoHdrCksumPartial(quint32 srcIp, quint32 dstIp,
|
||||
quint8 protocol, quint16 len)
|
||||
{
|
||||
@ -96,78 +42,34 @@ quint32 StreamInfo::pseudoHdrCksumPartial(quint32 srcIp, quint32 dstIp,
|
||||
// Above calculation done assuming 'big endian' - so convert to host order
|
||||
return qFromBigEndian(sum);
|
||||
}
|
||||
#endif
|
||||
|
||||
quint32 StreamInfo::ipv4CksumPartial(uchar *buf, int len)
|
||||
{
|
||||
quint32 sum = 0;
|
||||
quint16 *ip = (quint16*) buf;
|
||||
|
||||
if (len & 0x0001)
|
||||
{
|
||||
qFatal("Cannot calculate partial checksum on non multiple of 2 length");
|
||||
return 0;
|
||||
}
|
||||
|
||||
while(len)
|
||||
{
|
||||
sum += *ip;
|
||||
if(sum & 0x80000000)
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
ip++;
|
||||
len -= 2;
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
quint16 StreamInfo::ipv4Cksum(uchar *buf, int len, quint32 partialSum)
|
||||
{
|
||||
quint32 sum = partialSum;
|
||||
quint16 *ip = (quint16*) buf;
|
||||
|
||||
while(len > 1)
|
||||
{
|
||||
sum += *ip;
|
||||
if(sum & 0x80000000)
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
ip++;
|
||||
len -= 2;
|
||||
}
|
||||
|
||||
if (len)
|
||||
sum += (unsigned short) *(unsigned char *)ip;
|
||||
|
||||
while(sum>>16)
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
|
||||
return (quint16) ~sum;
|
||||
}
|
||||
|
||||
int StreamInfo::makePacket(uchar *buf, int bufMaxSize, int n)
|
||||
{
|
||||
int pktLen, len = 0;
|
||||
|
||||
// Decide a frame length based on length mode
|
||||
switch(mCore.len_mode())
|
||||
switch(mCore->len_mode())
|
||||
{
|
||||
case OstProto::StreamCore::e_fl_fixed:
|
||||
pktLen = mCore.frame_len();
|
||||
pktLen = mCore->frame_len();
|
||||
break;
|
||||
case OstProto::StreamCore::e_fl_inc:
|
||||
pktLen = mCore.frame_len_min() + (n %
|
||||
(mCore.frame_len_max() - mCore.frame_len_min() + 1));
|
||||
pktLen = mCore->frame_len_min() + (n %
|
||||
(mCore->frame_len_max() - mCore->frame_len_min() + 1));
|
||||
break;
|
||||
case OstProto::StreamCore::e_fl_dec:
|
||||
pktLen = mCore.frame_len_max() - (n %
|
||||
(mCore.frame_len_max() - mCore.frame_len_min() + 1));
|
||||
pktLen = mCore->frame_len_max() - (n %
|
||||
(mCore->frame_len_max() - mCore->frame_len_min() + 1));
|
||||
break;
|
||||
case OstProto::StreamCore::e_fl_random:
|
||||
pktLen = mCore.frame_len_min() + (qrand() %
|
||||
(mCore.frame_len_max() - mCore.frame_len_min() + 1));
|
||||
pktLen = mCore->frame_len_min() + (qrand() %
|
||||
(mCore->frame_len_max() - mCore->frame_len_min() + 1));
|
||||
break;
|
||||
default:
|
||||
qWarning("Unhandled len mode %d. Using default 64",
|
||||
mCore.len_mode());
|
||||
mCore->len_mode());
|
||||
pktLen = 64;
|
||||
break;
|
||||
}
|
||||
@ -179,14 +81,11 @@ int StreamInfo::makePacket(uchar *buf, int bufMaxSize, int n)
|
||||
return 0;
|
||||
|
||||
// FIXME: Calculated pktLen is an input to Payload Protocol
|
||||
|
||||
// FIXME: checksums!!!
|
||||
|
||||
for (int i = 0; i < mCore.frame_proto_size(); i++)
|
||||
for (int i = 0; i < mCore->frame_proto_size(); i++)
|
||||
{
|
||||
QByteArray ba;
|
||||
|
||||
ba = protocolById(mCore.frame_proto(i))->protocolFrameValue(n);
|
||||
ba = protocol(mCore->frame_proto(i))->protocolFrameValue(n);
|
||||
if (len + ba.size() < bufMaxSize)
|
||||
{
|
||||
memcpy(buf+len, ba.constData(), ba.size());
|
||||
@ -690,28 +589,28 @@ void PortInfo::update()
|
||||
for (int i = 0; i < streamList.size(); i++)
|
||||
{
|
||||
//_restart:
|
||||
if (streamList[i]->mCore.is_enabled())
|
||||
if (streamList[i]->mCore->is_enabled())
|
||||
{
|
||||
long numPackets, numBursts;
|
||||
long ibg, ipg;
|
||||
|
||||
switch (streamList[i]->mControl.unit())
|
||||
switch (streamList[i]->mControl->unit())
|
||||
{
|
||||
case OstProto::StreamControl::e_su_bursts:
|
||||
numBursts = streamList[i]->mControl.num_bursts();
|
||||
numPackets = streamList[i]->mControl.packets_per_burst();
|
||||
ibg = 1000000/streamList[i]->mControl.bursts_per_sec();
|
||||
numBursts = streamList[i]->mControl->num_bursts();
|
||||
numPackets = streamList[i]->mControl->packets_per_burst();
|
||||
ibg = 1000000/streamList[i]->mControl->bursts_per_sec();
|
||||
ipg = 0;
|
||||
break;
|
||||
case OstProto::StreamControl::e_su_packets:
|
||||
numBursts = 1;
|
||||
numPackets = streamList[i]->mControl.num_packets();
|
||||
numPackets = streamList[i]->mControl->num_packets();
|
||||
ibg = 0;
|
||||
ipg = 1000000/streamList[i]->mControl.packets_per_sec();
|
||||
ipg = 1000000/streamList[i]->mControl->packets_per_sec();
|
||||
break;
|
||||
default:
|
||||
qWarning("Unhandled stream control unit %d",
|
||||
streamList[i]->mControl.unit());
|
||||
streamList[i]->mControl->unit());
|
||||
continue;
|
||||
}
|
||||
qDebug("numBursts = %ld, numPackets = %ld\n",
|
||||
@ -773,7 +672,7 @@ void PortInfo::update()
|
||||
}
|
||||
} // for (numBursts)
|
||||
|
||||
switch(streamList[i]->mControl.next())
|
||||
switch(streamList[i]->mControl->next())
|
||||
{
|
||||
case ::OstProto::StreamControl::e_nw_stop:
|
||||
goto _stop_no_more_pkts;
|
||||
@ -798,7 +697,7 @@ void PortInfo::update()
|
||||
|
||||
default:
|
||||
qFatal("---------- %s: Unhandled case (%d) -----------",
|
||||
__FUNCTION__, streamList[i]->mControl.next() );
|
||||
__FUNCTION__, streamList[i]->mControl->next() );
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1378,18 +1277,7 @@ const ::OstProto::StreamIdList* request,
|
||||
|
||||
s = response->add_stream();
|
||||
|
||||
s->mutable_stream_id()->CopyFrom(
|
||||
portInfo[portIdx]->streamList[streamIndex]->mStreamId);
|
||||
s->mutable_core()->CopyFrom(
|
||||
portInfo[portIdx]->streamList[streamIndex]->mCore);
|
||||
s->mutable_control()->CopyFrom(
|
||||
portInfo[portIdx]->streamList[streamIndex]->mControl);
|
||||
for (int j=0; j < portInfo[portIdx]->streamList[streamIndex]->
|
||||
mProtocolList.size(); j++)
|
||||
{
|
||||
portInfo[portIdx]->streamList[streamIndex]->
|
||||
mProtocolList[j]->protoDataCopyInto(*s);
|
||||
}
|
||||
portInfo[portIdx]->streamList[streamIndex]->protoDataCopyInto(*s);
|
||||
}
|
||||
|
||||
_exit:
|
||||
@ -1494,17 +1382,8 @@ const ::OstProto::StreamConfigList* request,
|
||||
if (streamIndex < 0)
|
||||
continue; // TODO(LOW): Partial status of RPC
|
||||
|
||||
portInfo[portIdx]->streamList[streamIndex]->mCore.clear_frame_proto();
|
||||
portInfo[portIdx]->streamList[streamIndex]->mCore.MergeFrom(
|
||||
request->stream(i).core());
|
||||
portInfo[portIdx]->streamList[streamIndex]->mControl.MergeFrom(
|
||||
request->stream(i).control());
|
||||
for (int j=0; j < portInfo[portIdx]->streamList[streamIndex]->
|
||||
mProtocolList.size(); j++)
|
||||
{
|
||||
portInfo[portIdx]->streamList[streamIndex]->
|
||||
mProtocolList[j]->protoDataCopyFrom(request->stream(i));
|
||||
}
|
||||
portInfo[portIdx]->streamList[streamIndex]->protoDataCopyFrom(
|
||||
request->stream(i));
|
||||
|
||||
// TODO(LOW): fill-in response "Ack"????
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
#endif
|
||||
|
||||
#include "../common/protocol.pb.h"
|
||||
#include "../common/abstractprotocol.h"
|
||||
#include "../common/streambase.h"
|
||||
#include "abstracthost.h"
|
||||
#include <pcap.h>
|
||||
#include <QtGlobal>
|
||||
@ -30,31 +30,19 @@
|
||||
|
||||
class MyService;
|
||||
|
||||
class StreamInfo
|
||||
class StreamInfo : public StreamBase
|
||||
{
|
||||
friend class MyService;
|
||||
friend class PortInfo;
|
||||
|
||||
OstProto::StreamId mStreamId;
|
||||
OstProto::StreamCore mCore;
|
||||
OstProto::StreamControl mControl;
|
||||
QList<AbstractProtocol*> mProtocolList;
|
||||
|
||||
public:
|
||||
StreamInfo();
|
||||
~StreamInfo();
|
||||
|
||||
private:
|
||||
AbstractProtocol* protocolById(int id);
|
||||
|
||||
quint32 pseudoHdrCksumPartial(quint32 srcIp, quint32 dstIp,
|
||||
quint8 protocol, quint16 len);
|
||||
quint32 ipv4CksumPartial(uchar *buf, int len);
|
||||
quint16 ipv4Cksum(uchar *buf, int len, quint32 partialSum = 0);
|
||||
int makePacket(uchar *buf, int bufMaxSize, int n);
|
||||
public:
|
||||
bool operator < (const StreamInfo &s) const
|
||||
{ return(mCore.ordinal() < s.mCore.ordinal()); }
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user