Implemented IGMP PDML protocol
This commit is contained in:
parent
b230ff8082
commit
bda2d48adb
@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
#include "llc.pb.h"
|
#include "llc.pb.h"
|
||||||
#include "mac.pb.h"
|
#include "mac.pb.h"
|
||||||
#include "icmp.pb.h"
|
#include "icmp.pb.h"
|
||||||
|
#include "igmp.pb.h"
|
||||||
#include "ip4.pb.h"
|
#include "ip4.pb.h"
|
||||||
#include "ip6.pb.h"
|
#include "ip6.pb.h"
|
||||||
#include "snap.pb.h"
|
#include "snap.pb.h"
|
||||||
@ -157,6 +158,9 @@ void PdmlDefaultProtocol::knownFieldHandler(QString name, QString valueHexStr,
|
|||||||
Q_ASSERT(fieldDesc != NULL);
|
Q_ASSERT(fieldDesc != NULL);
|
||||||
switch(fieldDesc->cpp_type())
|
switch(fieldDesc->cpp_type())
|
||||||
{
|
{
|
||||||
|
case google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
|
||||||
|
msgRefl->SetBool(msg, fieldDesc, bool(valueHexStr.toUInt(&isOk)));
|
||||||
|
break;
|
||||||
case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: // TODO
|
case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: // TODO
|
||||||
case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
|
case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
|
||||||
msgRefl->SetUInt32(msg, fieldDesc,
|
msgRefl->SetUInt32(msg, fieldDesc,
|
||||||
@ -210,6 +214,7 @@ PdmlReader::PdmlReader(OstProto::StreamConfigList *streams)
|
|||||||
factory_.insert("http", PdmlTextProtocol::createInstance);
|
factory_.insert("http", PdmlTextProtocol::createInstance);
|
||||||
factory_.insert("icmp", PdmlIcmpProtocol::createInstance);
|
factory_.insert("icmp", PdmlIcmpProtocol::createInstance);
|
||||||
factory_.insert("icmpv6", PdmlIcmpProtocol::createInstance);
|
factory_.insert("icmpv6", PdmlIcmpProtocol::createInstance);
|
||||||
|
factory_.insert("igmp", PdmlIgmpProtocol::createInstance);
|
||||||
factory_.insert("ieee8021ad", PdmlSvlanProtocol::createInstance);
|
factory_.insert("ieee8021ad", PdmlSvlanProtocol::createInstance);
|
||||||
factory_.insert("imap", PdmlTextProtocol::createInstance);
|
factory_.insert("imap", PdmlTextProtocol::createInstance);
|
||||||
factory_.insert("ip", PdmlIp4Protocol::createInstance);
|
factory_.insert("ip", PdmlIp4Protocol::createInstance);
|
||||||
@ -1382,6 +1387,128 @@ void PdmlIcmpProtocol::postProtocolHandler(OstProto::Protocol *pbProto,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------- //
|
||||||
|
// PdmlIgmpProtocol //
|
||||||
|
// ---------------------------------------------------------- //
|
||||||
|
|
||||||
|
PdmlIgmpProtocol::PdmlIgmpProtocol()
|
||||||
|
{
|
||||||
|
pdmlProtoName_ = "igmp";
|
||||||
|
ostProtoId_ = OstProto::Protocol::kIgmpFieldNumber;
|
||||||
|
|
||||||
|
fieldMap_.insert("igmp.max_resp",
|
||||||
|
OstProto::Gmp::kMaxResponseTimeFieldNumber); // FIXME
|
||||||
|
fieldMap_.insert("igmp.checksum", OstProto::Gmp::kChecksumFieldNumber);
|
||||||
|
|
||||||
|
fieldMap_.insert("igmp.s", OstProto::Gmp::kSFlagFieldNumber);
|
||||||
|
fieldMap_.insert("igmp.qrv", OstProto::Gmp::kQrvFieldNumber);
|
||||||
|
fieldMap_.insert("igmp.qqic", OstProto::Gmp::kQqiFieldNumber); // FIXME
|
||||||
|
|
||||||
|
fieldMap_.insert("igmp.num_grp_recs",
|
||||||
|
OstProto::Gmp::kGroupRecordCountFieldNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
PdmlDefaultProtocol* PdmlIgmpProtocol::createInstance()
|
||||||
|
{
|
||||||
|
return new PdmlIgmpProtocol();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PdmlIgmpProtocol::preProtocolHandler(QString name,
|
||||||
|
const QXmlStreamAttributes &attributes, int expectedPos,
|
||||||
|
OstProto::Protocol *pbProto, OstProto::Stream *stream)
|
||||||
|
{
|
||||||
|
OstProto::Gmp *igmp = pbProto->MutableExtension(OstProto::igmp);
|
||||||
|
|
||||||
|
igmp->set_is_override_rsvd_code(true);
|
||||||
|
igmp->set_is_override_checksum(true);
|
||||||
|
igmp->set_is_override_source_count(true);
|
||||||
|
igmp->set_is_override_group_record_count(true);
|
||||||
|
|
||||||
|
version_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PdmlIgmpProtocol::unknownFieldHandler(QString name, int pos, int size,
|
||||||
|
const QXmlStreamAttributes &attributes, OstProto::Protocol *pbProto,
|
||||||
|
OstProto::Stream *stream)
|
||||||
|
{
|
||||||
|
bool isOk;
|
||||||
|
OstProto::Gmp *igmp = pbProto->MutableExtension(OstProto::igmp);
|
||||||
|
QString valueHexStr = attributes.value("value").toString();
|
||||||
|
|
||||||
|
if (name == "igmp.version")
|
||||||
|
{
|
||||||
|
version_ = attributes.value("show").toString().toUInt(&isOk);
|
||||||
|
}
|
||||||
|
if (name == "igmp.type")
|
||||||
|
{
|
||||||
|
uint type = valueHexStr.toUInt(&isOk, kBaseHex);
|
||||||
|
if (type == kIgmpQuery)
|
||||||
|
{
|
||||||
|
switch(version_)
|
||||||
|
{
|
||||||
|
case 1: type = kIgmpV1Query; break;
|
||||||
|
case 2: type = kIgmpV2Query; break;
|
||||||
|
case 3: type = kIgmpV3Query; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
igmp->set_type(type);
|
||||||
|
}
|
||||||
|
if (name == "igmp.record_type")
|
||||||
|
{
|
||||||
|
OstProto::Gmp::GroupRecord *rec = igmp->add_group_records();
|
||||||
|
rec->set_type(OstProto::Gmp::GroupRecord::RecordType(
|
||||||
|
valueHexStr.toUInt(&isOk, kBaseHex)));
|
||||||
|
rec->set_is_override_source_count(true);
|
||||||
|
rec->set_is_override_aux_data_length(true);
|
||||||
|
}
|
||||||
|
else if (name == "igmp.aux_data_len")
|
||||||
|
{
|
||||||
|
igmp->mutable_group_records(igmp->group_records_size() - 1)->
|
||||||
|
set_aux_data_length(valueHexStr.toUInt(&isOk, kBaseHex));
|
||||||
|
}
|
||||||
|
else if (name == "igmp.num_src")
|
||||||
|
{
|
||||||
|
if (igmp->group_record_count())
|
||||||
|
igmp->mutable_group_records(igmp->group_records_size() - 1)->
|
||||||
|
set_source_count(valueHexStr.toUInt(&isOk, kBaseHex));
|
||||||
|
else
|
||||||
|
igmp->set_source_count(valueHexStr.toUInt(&isOk, kBaseHex));
|
||||||
|
}
|
||||||
|
else if (name == "igmp.maddr")
|
||||||
|
{
|
||||||
|
if (igmp->group_record_count())
|
||||||
|
igmp->mutable_group_records(igmp->group_records_size() - 1)->
|
||||||
|
mutable_group_address()->set_v4(
|
||||||
|
valueHexStr.toUInt(&isOk, kBaseHex));
|
||||||
|
else
|
||||||
|
igmp->mutable_group_address()->set_v4(
|
||||||
|
valueHexStr.toUInt(&isOk, kBaseHex));
|
||||||
|
}
|
||||||
|
else if (name == "igmp.saddr")
|
||||||
|
{
|
||||||
|
if (igmp->group_record_count())
|
||||||
|
igmp->mutable_group_records(igmp->group_records_size() - 1)->
|
||||||
|
add_sources()->set_v4(valueHexStr.toUInt(&isOk, kBaseHex));
|
||||||
|
else
|
||||||
|
igmp->add_sources()->set_v4(valueHexStr.toUInt(&isOk, kBaseHex));
|
||||||
|
}
|
||||||
|
else if (name == "igmp.aux_data")
|
||||||
|
{
|
||||||
|
QByteArray ba = QByteArray::fromHex(
|
||||||
|
attributes.value("value").toString().toUtf8());
|
||||||
|
igmp->mutable_group_records(igmp->group_records_size() - 1)->
|
||||||
|
set_aux_data(ba.constData(), ba.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PdmlIgmpProtocol::postProtocolHandler(OstProto::Protocol *pbProto,
|
||||||
|
OstProto::Stream *stream)
|
||||||
|
{
|
||||||
|
if (version_ == 0)
|
||||||
|
stream->mutable_protocol()->RemoveLast();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------- //
|
// ---------------------------------------------------------- //
|
||||||
// PdmlTcpProtocol //
|
// PdmlTcpProtocol //
|
||||||
// ---------------------------------------------------------- //
|
// ---------------------------------------------------------- //
|
||||||
|
@ -270,6 +270,31 @@ private:
|
|||||||
static const uint kIcmp6EchoReply = 129;
|
static const uint kIcmp6EchoReply = 129;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class PdmlIgmpProtocol : public PdmlDefaultProtocol
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PdmlIgmpProtocol();
|
||||||
|
|
||||||
|
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);
|
||||||
|
virtual void postProtocolHandler(OstProto::Protocol *pbProto,
|
||||||
|
OstProto::Stream *stream);
|
||||||
|
private:
|
||||||
|
static const uint kIgmpQuery = 0x11;
|
||||||
|
static const uint kIgmpV1Query = 0x11;
|
||||||
|
static const uint kIgmpV2Query = 0xFF11;
|
||||||
|
static const uint kIgmpV3Query = 0xFE11;
|
||||||
|
|
||||||
|
uint version_;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
class PdmlTcpProtocol : public PdmlDefaultProtocol
|
class PdmlTcpProtocol : public PdmlDefaultProtocol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Loading…
Reference in New Issue
Block a user