Implemented PDML LLC Protocol (including SNAP). Also implemented PDML VLAN Protocol - but this is not working so is disabled for the moment

This commit is contained in:
Srivats P. 2011-03-27 22:45:04 +05:30
parent b8e451574a
commit 28cd717895
2 changed files with 164 additions and 3 deletions

View File

@ -24,17 +24,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "protocolmanager.h" #include "protocolmanager.h"
#include "streambase.h" #include "streambase.h"
#include "mac.pb.h"
#include "eth2.pb.h" #include "eth2.pb.h"
#include "dot3.pb.h" #include "dot3.pb.h"
#include "hexdump.pb.h" #include "hexdump.pb.h"
#include "llc.pb.h"
#include "mac.pb.h"
#include "ip4.pb.h" #include "ip4.pb.h"
#include "ip6.pb.h" #include "ip6.pb.h"
#include "snap.pb.h"
#include "svlan.pb.h"
#include "tcp.pb.h" #include "tcp.pb.h"
#include "vlan.pb.h"
#include <google/protobuf/descriptor.h> #include <google/protobuf/descriptor.h>
#include <QMessageBox> #include <QMessageBox>
#include <QRegExp>
#include <string> #include <string>
@ -195,10 +200,13 @@ PdmlReader::PdmlReader(OstProto::StreamConfigList *streams)
factory_.insert("hexdump", PdmlUnknownProtocol::createInstance); factory_.insert("hexdump", PdmlUnknownProtocol::createInstance);
factory_.insert("geninfo", PdmlGenInfoProtocol::createInstance); factory_.insert("geninfo", PdmlGenInfoProtocol::createInstance);
factory_.insert("frame", PdmlFrameProtocol::createInstance); factory_.insert("frame", PdmlFrameProtocol::createInstance);
factory_.insert("eth", PdmlEthProtocol::createInstance); factory_.insert("eth", PdmlEthProtocol::createInstance);
factory_.insert("ip", PdmlIp4Protocol::createInstance); factory_.insert("ip", PdmlIp4Protocol::createInstance);
factory_.insert("ipv6", PdmlIp6Protocol::createInstance); factory_.insert("ipv6", PdmlIp6Protocol::createInstance);
factory_.insert("llc", PdmlLlcProtocol::createInstance);
factory_.insert("tcp", PdmlTcpProtocol::createInstance); factory_.insert("tcp", PdmlTcpProtocol::createInstance);
//factory_.insert("vlan", PdmlVlanProtocol::createInstance);
} }
PdmlReader::~PdmlReader() PdmlReader::~PdmlReader()
@ -809,6 +817,63 @@ void PdmlFrameProtocol::unknownFieldHandler(QString name, int pos, int size,
} }
} }
// ---------------------------------------------------------- //
// PdmlVlanProtocol //
// ---------------------------------------------------------- //
PdmlVlanProtocol::PdmlVlanProtocol()
{
pdmlProtoName_ = "vlan";
ostProtoId_ = OstProto::Protocol::kVlanFieldNumber;
}
PdmlDefaultProtocol* PdmlVlanProtocol::createInstance()
{
return new PdmlVlanProtocol();
}
void PdmlVlanProtocol::preProtocolHandler(QString name,
const QXmlStreamAttributes &attributes, int expectedPos,
OstProto::Protocol *pbProto, OstProto::Stream *stream)
{
OstProto::Vlan *vlan = pbProto->MutableExtension(OstProto::vlan);
vlan->set_tpid(0x8100);
vlan->set_is_override_tpid(true);
}
void PdmlVlanProtocol::unknownFieldHandler(QString name, int pos, int size,
const QXmlStreamAttributes &attributes,
OstProto::Protocol *pbProto, OstProto::Stream *stream)
{
if (name == "vlan.id")
{
bool isOk;
OstProto::Vlan *vlan = pbProto->MutableExtension(OstProto::vlan);
uint tag = attributes.value("unmaskedvalue").isEmpty() ?
attributes.value("value").toString().toUInt(&isOk, kBaseHex) :
attributes.value("unmaskedvalue").toString().toUInt(&isOk,kBaseHex);
vlan->set_vlan_tag(tag);
}
else if (name == "vlan.etype")
{
OstProto::Protocol *proto = stream->add_protocol();
proto->mutable_protocol_id()->set_id(
OstProto::Protocol::kEth2FieldNumber);
bool isOk;
OstProto::Eth2 *eth2 = proto->MutableExtension(OstProto::eth2);
eth2->set_type(attributes.value("value")
.toString().toUInt(&isOk, kBaseHex));
eth2->set_is_override_type(true);
}
}
// ---------------------------------------------------------- // // ---------------------------------------------------------- //
// PdmlEthProtocol // // PdmlEthProtocol //
// ---------------------------------------------------------- // // ---------------------------------------------------------- //
@ -833,6 +898,14 @@ void PdmlEthProtocol::unknownFieldHandler(QString name, int pos, int size,
{ {
if (name == "eth.type") if (name == "eth.type")
{ {
bool isOk;
uint type = attributes.value("value").toString()
.toUInt(&isOk, kBaseHex);
if ((type == 0x88a8) || (type == 0x8100))
return;
OstProto::Protocol *proto = stream->add_protocol(); OstProto::Protocol *proto = stream->add_protocol();
proto->mutable_protocol_id()->set_id( proto->mutable_protocol_id()->set_id(
@ -840,8 +913,7 @@ void PdmlEthProtocol::unknownFieldHandler(QString name, int pos, int size,
OstProto::Eth2 *eth2 = proto->MutableExtension(OstProto::eth2); OstProto::Eth2 *eth2 = proto->MutableExtension(OstProto::eth2);
bool isOk; eth2->set_type(type);
eth2->set_type(attributes.value("value").toString().toUInt(&isOk, kBaseHex));
eth2->set_is_override_type(true); eth2->set_is_override_type(true);
} }
else if (name == "eth.len") else if (name == "eth.len")
@ -877,6 +949,66 @@ void PdmlEthProtocol::unknownFieldHandler(QString name, int pos, int size,
} }
// ---------------------------------------------------------- //
// PdmlLlcProtocol //
// ---------------------------------------------------------- //
PdmlLlcProtocol::PdmlLlcProtocol()
{
pdmlProtoName_ = "llc";
ostProtoId_ = OstProto::Protocol::kLlcFieldNumber;
fieldMap_.insert("llc.dsap", OstProto::Llc::kDsapFieldNumber);
fieldMap_.insert("llc.ssap", OstProto::Llc::kSsapFieldNumber);
fieldMap_.insert("llc.control", OstProto::Llc::kCtlFieldNumber);
}
PdmlDefaultProtocol* PdmlLlcProtocol::createInstance()
{
return new PdmlLlcProtocol();
}
void PdmlLlcProtocol::unknownFieldHandler(QString name, int pos, int size,
const QXmlStreamAttributes &attributes,
OstProto::Protocol *pbProto, OstProto::Stream *stream)
{
if (name == "llc.oui")
{
OstProto::Protocol *proto = stream->add_protocol();
proto->mutable_protocol_id()->set_id(
OstProto::Protocol::kSnapFieldNumber);
OstProto::Snap *snap = proto->MutableExtension(OstProto::snap);
bool isOk;
snap->set_oui(attributes.value("value").toString()
.toUInt(&isOk, kBaseHex));
snap->set_is_override_oui(true);
}
else if ((name == "llc.type") || (name.contains(QRegExp("llc\\..*pid"))))
{
OstProto::Snap *snap = stream->mutable_protocol(
stream->protocol_size()-1)->MutableExtension(OstProto::snap);
bool isOk;
snap->set_type(attributes.value("value").toString()
.toUInt(&isOk, kBaseHex));
snap->set_is_override_type(true);
}
}
void PdmlLlcProtocol::postProtocolHandler(OstProto::Protocol *pbProto,
OstProto::Stream *stream)
{
OstProto::Llc *llc = pbProto->MutableExtension(OstProto::llc);
llc->set_is_override_dsap(true);
llc->set_is_override_ssap(true);
llc->set_is_override_ctl(true);
}
// ---------------------------------------------------------- // // ---------------------------------------------------------- //
// PdmlIp4Protocol // // PdmlIp4Protocol //
// ---------------------------------------------------------- // // ---------------------------------------------------------- //

View File

@ -166,6 +166,35 @@ public:
OstProto::Protocol *pbProto, OstProto::Stream *stream); OstProto::Protocol *pbProto, OstProto::Stream *stream);
}; };
class PdmlVlanProtocol : public PdmlDefaultProtocol
{
public:
PdmlVlanProtocol();
static PdmlDefaultProtocol* createInstance();
virtual void preProtocolHandler(QString name,
const QXmlStreamAttributes &attributes, int expectedPos,
OstProto::Protocol *pbProto, OstProto::Stream *stream);
virtual void unknownFieldHandler(QString name, int pos, int size,
const QXmlStreamAttributes &attributes,
OstProto::Protocol *pbProto, OstProto::Stream *stream);
};
class PdmlLlcProtocol : public PdmlDefaultProtocol
{
public:
PdmlLlcProtocol();
static PdmlDefaultProtocol* createInstance();
virtual void unknownFieldHandler(QString name, int pos, int size,
const QXmlStreamAttributes &attributes,
OstProto::Protocol *pbProto, OstProto::Stream *stream);
virtual void postProtocolHandler(OstProto::Protocol *pbProto,
OstProto::Stream *stream);
};
class PdmlIp4Protocol : public PdmlDefaultProtocol class PdmlIp4Protocol : public PdmlDefaultProtocol
{ {
public: public: