Added Google Protocol Buffers as the serialization format between client and server.

Initial Checkin. PB related code not yet complete
This commit is contained in:
Srivats P. 2008-08-09 03:22:13 +00:00
parent a009fcffdf
commit f220482876
34 changed files with 2598 additions and 495 deletions

5
Makefile Normal file
View File

@ -0,0 +1,5 @@
all:
$(MAKE) -C rpc install
$(MAKE) -C common
$(MAKE) -C server
$(MAKE) -C client

View File

@ -1,7 +1,8 @@
#include "hexlineedit.h" #include "hexlineedit.h"
#include "qdebug.h" #include "qdebug.h"
QString & uintToHexStr(quint32 num, QString &hexStr, quint8 octets); QString & uintToHexStr(quint64 num, QString &hexStr, quint8 octets);
HexLineEdit::HexLineEdit( QWidget * parent) HexLineEdit::HexLineEdit( QWidget * parent)
: QLineEdit(parent) : QLineEdit(parent)
{ {

View File

@ -1,6 +1,8 @@
TEMPLATE = app TEMPLATE = app
CONFIG += qt debug CONFIG += qt debug
QT += network QT += network
INCLUDEPATH += "c:\msys\1.0\local\include" "..\rpc\"
LIBS += -L"c:\msys\1.0\local\lib" -lprotobuf -L"..\rpc\debug" -lpbrpc
RESOURCES += ostinato.qrc RESOURCES += ostinato.qrc
HEADERS += \ HEADERS += \
dumpview.h \ dumpview.h \
@ -31,7 +33,6 @@ SOURCES += \
hexlineedit.cpp \ hexlineedit.cpp \
main.cpp \ main.cpp \
mainwindow.cpp \ mainwindow.cpp \
mythread.cpp \
packetmodel.cpp \ packetmodel.cpp \
port.cpp \ port.cpp \
portgroup.cpp \ portgroup.cpp \
@ -44,5 +45,10 @@ SOURCES += \
streamconfigdialog.cpp \ streamconfigdialog.cpp \
streammodel.cpp streammodel.cpp
# Protocol Buffer Sources
SOURCES += \
..\common\protocol.pb.cc
# TODO(LOW): Test only # TODO(LOW): Test only
include(modeltest.pri) include(modeltest.pri)

View File

@ -167,6 +167,7 @@ void PacketModel::populatePacketProtocols()
// Clear the protocols list // Clear the protocols list
mPacketProtocols.clear(); mPacketProtocols.clear();
#if 0 // FIXME: protobuf
// Check and populate L2 Protocol // Check and populate L2 Protocol
switch(mpStream->proto.ft) switch(mpStream->proto.ft)
{ {
@ -251,6 +252,7 @@ void PacketModel::populatePacketProtocols()
_data: _data:
mPacketProtocols.append(PTYP_DATA); mPacketProtocols.append(PTYP_DATA);
#endif
} }
int PacketModel::protoCount() const int PacketModel::protoCount() const
@ -373,7 +375,7 @@ QVariant PacketModel::ethField(int field, int role) const
FieldInfo info; FieldInfo info;
// FIXME(MED): Mac Addr formatting // FIXME(MED): Mac Addr formatting
#if 0 // FIXME protobuf
switch(field) switch(field)
{ {
case 0: case 0:
@ -409,6 +411,7 @@ QVariant PacketModel::ethField(int field, int role) const
} }
Q_ASSERT(1 == 1); // Unreachable code Q_ASSERT(1 == 1); // Unreachable code
#endif
return QVariant(); return QVariant();
} }
@ -416,6 +419,7 @@ QVariant PacketModel::llcField(int field, int role) const
{ {
FieldInfo info; FieldInfo info;
#if 0 // FIXME: protobuf
switch(field) switch(field)
{ {
case 0: case 0:
@ -449,6 +453,7 @@ QVariant PacketModel::llcField(int field, int role) const
} }
Q_ASSERT(1 == 1); // Unreachable code Q_ASSERT(1 == 1); // Unreachable code
#endif
return QVariant(); return QVariant();
} }
@ -456,6 +461,7 @@ QVariant PacketModel::snapField(int field, int role) const
{ {
FieldInfo info; FieldInfo info;
#if 0 // FIXME: protobuf
switch(field) switch(field)
{ {
case 0: case 0:
@ -485,6 +491,7 @@ QVariant PacketModel::snapField(int field, int role) const
} }
Q_ASSERT(1 == 1); // Unreachable code Q_ASSERT(1 == 1); // Unreachable code
#endif
return QVariant(); return QVariant();
} }
@ -492,6 +499,7 @@ QVariant PacketModel::svlanField(int field, int role) const
{ {
FieldInfo info; FieldInfo info;
#if 0 // FIXME: protobuf
switch(field) switch(field)
{ {
case 0: case 0:
@ -530,6 +538,7 @@ QVariant PacketModel::svlanField(int field, int role) const
} }
Q_ASSERT(1 == 1); // Unreachable code Q_ASSERT(1 == 1); // Unreachable code
#endif
return QVariant(); return QVariant();
} }
@ -538,6 +547,7 @@ QVariant PacketModel::ipField(int field, int role) const
{ {
FieldInfo info; FieldInfo info;
#if 0 // FIXME: protobuf
switch(field) switch(field)
{ {
case 0: case 0:
@ -614,6 +624,7 @@ QVariant PacketModel::ipField(int field, int role) const
} }
Q_ASSERT(1 == 1); // Unreachable code Q_ASSERT(1 == 1); // Unreachable code
#endif
return QVariant(); return QVariant();
} }
@ -622,6 +633,7 @@ QVariant PacketModel::tcpField(int field, int role) const
{ {
FieldInfo info; FieldInfo info;
#if 0 // FIXME: protobuf
switch(field) switch(field)
{ {
case 0: case 0:
@ -690,6 +702,7 @@ QVariant PacketModel::tcpField(int field, int role) const
} }
Q_ASSERT(1 == 1); // Unreachable code Q_ASSERT(1 == 1); // Unreachable code
#endif
return QVariant(); return QVariant();
} }
@ -698,6 +711,7 @@ QVariant PacketModel::udpField(int field, int role) const
{ {
FieldInfo info; FieldInfo info;
#if 0 // FIXME:protobuf
switch(field) switch(field)
{ {
case 0: case 0:
@ -736,6 +750,7 @@ QVariant PacketModel::udpField(int field, int role) const
} }
Q_ASSERT(1 == 1); // Unreachable code Q_ASSERT(1 == 1); // Unreachable code
#endif
return QVariant(); return QVariant();
} }

View File

@ -1,17 +1,82 @@
#include <vector>
#include <google/protobuf/descriptor.h>
#include "port.h" #include "port.h"
#include "pbhelper.h"
Port::Port(quint32 id, quint32 portGroupId) Port::Port(quint32 id, quint32 portGroupId)
{ {
mPortId = id; d.set_port_id(id);
mPortGroupId = portGroupId; mPortGroupId = portGroupId;
mAdminStatus = AdminDisable;
mOperStatus = OperDown;
mControlMode = ControlShared;
#if 0 // PB
// FIXME(HI): TEST only // FIXME(HI): TEST only
for(int i = 0; i < 10; i++) for(int i = 0; i < 10; i++)
mPortStats[i] = mPortGroupId*10000+mPortId*100+i; mPortStats[i] = mPortGroupId*10000+mPortId*100+i;
#endif
}
void Port::updatePortConfig(OstProto::PortConfig *portConfig)
{
PbHelper pbh;
pbh.update(&d, portConfig);
#if 0
const ::google::protobuf::Message::Reflection *ref1;
::google::protobuf::Message::Reflection *ref2;
std::vector<const ::google::protobuf::FieldDescriptor*> list;
qDebug("In %s", __FUNCTION__);
ref1 = portConfig.GetReflection();
ref1->ListFields(&list);
ref2 = d.GetReflection();
for (uint i=0; i < list.size(); i++)
{
const ::google::protobuf::FieldDescriptor *f1, *f2;
f1 = list[i];
f2 = d.GetDescriptor()->FindFieldByName(f1->name());
switch(f2->type())
{
case ::google::protobuf::FieldDescriptor::TYPE_UINT32:
ref2->SetUInt32(f2, ref1->GetUInt32(f1));
break;
case ::google::protobuf::FieldDescriptor::TYPE_BOOL:
ref2->SetBool(f2, ref1->GetBool(f1));
break;
case ::google::protobuf::FieldDescriptor::TYPE_STRING:
ref2->SetString(f2, ref1->GetString(f1));
break;
default:
qDebug("unhandled Field Type");
break;
}
}
if (msg->GetDescriptor() != OstProto::PortConfig::descriptor())
{
qDebug("%s: invalid Message Descriptor (%s)", __FUNCTION__,
msg->GetDescriptor()->name());
goto _error_exit;
}
portConfig = msg;
// check for "required" param
if (!portConfig.has_port_id())
{
qDebug("%s: invalid Message Descriptor (%s)", __FUNCTION__,
msg->GetDescriptor()->name());
goto _error_exit;
}
#endif
} }
void Port::insertDummyStreams() void Port::insertDummyStreams()
@ -24,3 +89,4 @@ void Port::insertDummyStreams()
#endif #endif
} }

View File

@ -6,48 +6,77 @@
#include <QList> #include <QList>
#include "stream.h" #include "stream.h"
class StreamModel;
class Port { class Port {
friend class StreamModel; #if 0 // PB
friend class PortStatsModel; friend class PortStatsModel;
#endif
friend class StreamModel;
//friend class PbHelper;
// FIXME: non-friend mechanism
//friend QList<Stream>* StreamModel::currentPortStreamList(void);
private:
OstProto::PortConfig d;
quint32 mPortId;
quint32 mPortGroupId;
QString mUserAlias; // user defined
QList<Stream> mStreams;
#if 0 // PB
quint32 mPortId;
QString mName;
QString mDescription;
AdminStatus mAdminStatus;
OperStatus mOperStatus;
ControlMode mControlMode;
quint32 mPortStats[10]; // FIXME(HI):Hardcoding
#endif
public: public:
enum AdminStatus { AdminDisable, AdminEnable }; enum AdminStatus { AdminDisable, AdminEnable };
enum OperStatus { OperDown, OperUp }; enum OperStatus { OperDown, OperUp };
enum ControlMode { ControlShared, ControlExclusive }; enum ControlMode { ControlShared, ControlExclusive };
private:
quint32 mPortId;
quint32 mPortGroupId;
QList<Stream> mStreams;
QString mName;
QString mDescription;
QString mUserAlias; // user defined
AdminStatus mAdminStatus;
OperStatus mOperStatus;
ControlMode mControlMode;
quint32 mPortStats[10]; // FIXME(HI):Hardcoding
public:
// FIXME(HIGH): default args is a hack for QList operations on Port // FIXME(HIGH): default args is a hack for QList operations on Port
Port(quint32 id = 0xFFFFFFFF, quint32 pgId = 0xFFFFFFFF); Port(quint32 id = 0xFFFFFFFF, quint32 pgId = 0xFFFFFFFF);
quint32 id() const { return mPortId; }
quint32 portGroupId() const { return mPortGroupId; } quint32 portGroupId() const { return mPortGroupId; }
const QString& name() const { return mName; }
const QString& description() const { return mDescription; }
const QString& userAlias() const { return mUserAlias; } const QString& userAlias() const { return mUserAlias; }
void setName(QString &name) { mName = name; } quint32 id() const
{ return d.port_id(); }
const QString name() const
{ return QString().fromStdString(d.name()); }
const QString description() const
{ return QString().fromStdString(d.description()); }
AdminStatus adminStatus()
{ return (d.is_enabled()?AdminEnable:AdminDisable); }
OperStatus operStatus()
{ return (d.is_oper_up()?OperUp:OperDown); }
ControlMode controlMode()
{ return (d.is_exclusive_control()?ControlExclusive:ControlShared); }
#if 0
void setName(QString &name) { d.name; }
void setName(const char* name) { mName = QString(name); } void setName(const char* name) { mName = QString(name); }
void setDescription(QString &description) { mDescription = description; } void setDescription(QString &description) { mDescription = description; }
void setDescription(const char *description) void setDescription(const char *description)
{ mDescription = QString(description); } { mDescription = QString(description); }
#endif
//void setAdminEnable(AdminStatus status) { mAdminStatus = status; } //void setAdminEnable(AdminStatus status) { mAdminStatus = status; }
void setAlias(QString &alias) { mUserAlias = alias; } void setAlias(QString &alias) { mUserAlias = alias; }
//void setExclusive(bool flag); //void setExclusive(bool flag);
void updatePortConfig(OstProto::PortConfig *portConfig);
// FIXME(HIGH): Only for testing // FIXME(HIGH): Only for testing
void insertDummyStreams(); void insertDummyStreams();
}; };

View File

@ -1,6 +1,8 @@
#include "portgroup.h" #include "portgroup.h"
#include "../common/protocol.h" #include "../common/protocol.h"
#include <vector>
quint32 PortGroup::mPortGroupAllocId = 0; quint32 PortGroup::mPortGroupAllocId = 0;
PortGroup::PortGroup(QHostAddress ip, quint16 port) PortGroup::PortGroup(QHostAddress ip, quint16 port)
@ -8,48 +10,67 @@ PortGroup::PortGroup(QHostAddress ip, quint16 port)
// Allocate an id for self // Allocate an id for self
mPortGroupId = PortGroup::mPortGroupAllocId++; mPortGroupId = PortGroup::mPortGroupAllocId++;
#if 0 // PB
// Init attributes for which we values were passed to us // Init attributes for which we values were passed to us
mServerAddress = ip; mServerAddress = ip;
mServerPort = port; mServerPort = port;
// Init remaining attributes with defaults // Init remaining attributes with defaults
mpSocket = new QTcpSocket(this); mpSocket = new QTcpSocket(this);
#endif
rpcChannel = new PbRpcChannel(ip, port);
rpcController = new PbRpcController();
serviceStub = new OstProto::OstService::Stub(rpcChannel,
OstProto::OstService::STUB_OWNS_CHANNEL);
#if 0 // PB
// TODO: consider using QT's signal-slot autoconnect // TODO: consider using QT's signal-slot autoconnect
connect(mpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(on_mpSocket_stateChanged())); connect(mpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(on_mpSocket_stateChanged()));
connect(mpSocket, SIGNAL(connected()), this, SLOT(when_connected())); connect(mpSocket, SIGNAL(connected()), this, SLOT(when_connected()));
connect(mpSocket, SIGNAL(disconnected()), this, SLOT(when_disconnected())); connect(mpSocket, SIGNAL(disconnected()), this, SLOT(when_disconnected()));
connect(mpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(when_error(QAbstractSocket::SocketError))); connect(mpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(when_error(QAbstractSocket::SocketError)));
connect(mpSocket, SIGNAL(readyRead()), this, SLOT(when_dataAvail())); connect(mpSocket, SIGNAL(readyRead()), this, SLOT(when_dataAvail()));
#endif
// FIXME:Can't for my life figure out why this ain't working!
//QMetaObject::connectSlotsByName(this);
connect(rpcChannel, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
this, SLOT(on_rpcChannel_stateChanged()));
connect(rpcChannel, SIGNAL(connected()),
this, SLOT(on_rpcChannel_connected()));
connect(rpcChannel, SIGNAL(disconnected()),
this, SLOT(on_rpcChannel_disconnected()));
connect(rpcChannel, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(on_rpcChannel_error(QAbstractSocket::SocketError)));
} }
PortGroup::~PortGroup() PortGroup::~PortGroup()
{ {
qDebug("PortGroup Destructor"); qDebug("PortGroup Destructor");
// Disconnect and free TCP mpSocketet etc. // Disconnect and free rpc channel etc.
PortGroup::disconnectFromHost(); PortGroup::disconnectFromHost();
delete mpSocket; delete serviceStub;
} }
#if 0 // PB
void PortGroup::connectToHost(QHostAddress ip, quint16 port) void PortGroup::connectToHost(QHostAddress ip, quint16 port)
{ {
mServerAddress = ip; rpcChannel->establish(ip, port)
mServerPort = port;
PortGroup::connectToHost();
} }
void PortGroup::connectToHost() void PortGroup::connectToHost()
{ {
qDebug("PortGroup::connectToHost()"); qDebug("PortGroup::connectToHost()");
mpSocket->connectToHost(mServerAddress, mServerPort); rpcChannel->establish()
} }
void PortGroup::disconnectFromHost() void PortGroup::disconnectFromHost()
{ {
mpSocket->disconnectFromHost(); mpSocket->disconnectFromHost();
} }
#endif
#if 0 // PB
// -------------------------------------------- // --------------------------------------------
// Private Methods // Private Methods
// -------------------------------------------- // --------------------------------------------
@ -116,22 +137,32 @@ _next:
return; return;
} }
#endif
// ------------------------------------------------ // ------------------------------------------------
// Slots // Slots
// ------------------------------------------------ // ------------------------------------------------
void PortGroup::on_mpSocket_stateChanged() void PortGroup::on_rpcChannel_stateChanged()
{ {
qDebug("state changed"); qDebug("state changed");
emit portGroupDataChanged(this); emit portGroupDataChanged(this);
} }
void PortGroup::when_connected() void PortGroup::on_rpcChannel_connected()
{ {
qDebug("connected\n"); OstProto::Void void_;
OstProto::PortIdList *portIdList;
qDebug("connected\n");
emit portGroupDataChanged(this); emit portGroupDataChanged(this);
qDebug("requesting portlist ...");
portIdList = new OstProto::PortIdList();
rpcController->Reset();
serviceStub->getPortIdList(rpcController, &void_, portIdList,
NewCallback(this, &PortGroup::processPortIdList, portIdList));
#if 0 // PB
// Ask for Port Capability // Ask for Port Capability
tCommHdr pkt; tCommHdr pkt;
pkt.ver = 1; pkt.ver = 1;
@ -141,9 +172,10 @@ void PortGroup::when_connected()
pkt.msgLen = HTONS(8); pkt.msgLen = HTONS(8);
mpSocket->write((char*) &pkt, sizeof(pkt)); mpSocket->write((char*) &pkt, sizeof(pkt));
#endif
} }
void PortGroup::when_disconnected() void PortGroup::on_rpcChannel_disconnected()
{ {
qDebug("disconnected\n"); qDebug("disconnected\n");
emit portListAboutToBeChanged(mPortGroupId); emit portListAboutToBeChanged(mPortGroupId);
@ -152,12 +184,13 @@ void PortGroup::when_disconnected()
emit portGroupDataChanged(this); emit portGroupDataChanged(this);
} }
void PortGroup::when_error(QAbstractSocket::SocketError socketError) void PortGroup::on_rpcChannel_error(QAbstractSocket::SocketError socketError)
{ {
qDebug("error\n"); qDebug("error\n");
emit portGroupDataChanged(this); emit portGroupDataChanged(this);
} }
#if 0 // PB
void PortGroup::when_dataAvail() void PortGroup::when_dataAvail()
{ {
qDebug("dataAvail\n"); qDebug("dataAvail\n");
@ -165,5 +198,91 @@ void PortGroup::when_dataAvail()
QByteArray msg = mpSocket->read(1024); // FIXME: hardcoding QByteArray msg = mpSocket->read(1024); // FIXME: hardcoding
ProcessMsg(msg.constData(), msg.size()); ProcessMsg(msg.constData(), msg.size());
} }
#endif
void PortGroup::processPortIdList(OstProto::PortIdList *portIdList)
{
int count;
qDebug("got a portlist ...");
if (rpcController->Failed())
{
qDebug("%s: rpc failed", __FUNCTION__);
goto _error_exit;
}
count = portIdList->port_id_size();
qDebug("%s: portid count = %d", __FUNCTION__, count);
qDebug("%s: %s", __FUNCTION__, portIdList->DebugString().c_str());
emit portListAboutToBeChanged(mPortGroupId);
for(int i = 0; i < count; i++)
{
Port *p;
p = new Port(portIdList->port_id(i), mPortGroupId);
//p->setName("name");
//p->setDescription("Desc");
p->insertDummyStreams(); // FIXME: only for testing
qDebug("before port append\n");
mPorts.append(*p);
}
emit portListChanged(mPortGroupId);
// Request PortConfigList
{
OstProto::PortConfigList *portConfigList;
qDebug("requesting port config list ...");
portConfigList = new OstProto::PortConfigList();
rpcController->Reset();
serviceStub->getPortConfig(rpcController,
portIdList, portConfigList, NewCallback(this,
&PortGroup::processPortConfigList, portConfigList));
}
goto _exit;
_error_exit:
_exit:
delete portIdList;
}
void PortGroup::processPortConfigList(OstProto::PortConfigList *portConfigList)
{
int count;
qDebug("In %s", __FUNCTION__);
if (rpcController->Failed())
{
qDebug("%s: rpc failed", __FUNCTION__);
goto _error_exit;
}
count = portConfigList->list_size();
qDebug("%s: count = %d", __FUNCTION__, count);
qDebug("%s: <%s>", __FUNCTION__, portConfigList->DebugString().c_str());
emit portListAboutToBeChanged(mPortGroupId);
for(int i = 0; i < count; i++)
{
uint id;
id = portConfigList->list(i).port_id();
// FIXME: don't mix port id & index into mPorts[]
mPorts[id].updatePortConfig(portConfigList->mutable_list(i));
}
emit portListChanged(mPortGroupId);
// FIXME: check if we need new signals since we are not changing the
// number of ports, just the port data
_error_exit:
delete portConfigList;
}

View File

@ -5,6 +5,9 @@
#include <QHostAddress> #include <QHostAddress>
#include <QTcpSocket> #include <QTcpSocket>
#include "../common/protocol.pb.h"
#include "pbrpcchannel.h"
/* TODO /* TODO
HIGH HIGH
MED MED
@ -21,10 +24,14 @@ private:
quint32 mPortGroupId; quint32 mPortGroupId;
static quint32 mPortGroupAllocId; static quint32 mPortGroupAllocId;
QString mUserAlias; // user defined QString mUserAlias; // user defined
#if 0 // PB
QTcpSocket *mpSocket; QTcpSocket *mpSocket;
QHostAddress mServerAddress; QHostAddress mServerAddress;
quint16 mServerPort; quint16 mServerPort;
#endif
PbRpcChannel *rpcChannel;
::google::protobuf::RpcController *rpcController;
OstProto::OstService::Stub *serviceStub;
public: // FIXME(HIGH): member access public: // FIXME(HIGH): member access
QList<Port> mPorts; QList<Port> mPorts;
@ -33,34 +40,46 @@ public:
quint16 port = DEFAULT_SERVER_PORT); quint16 port = DEFAULT_SERVER_PORT);
~PortGroup(); ~PortGroup();
void connectToHost(); void connectToHost() { rpcChannel->establish(); }
void connectToHost(QHostAddress ip, quint16 port); void connectToHost(QHostAddress ip, quint16 port)
void disconnectFromHost(); { rpcChannel->establish(ip, port); }
void disconnectFromHost() { rpcChannel->tearDown(); }
int numPorts() const { return mPorts.size(); } int numPorts() const { return mPorts.size(); }
quint32 id() const { return mPortGroupId; } quint32 id() const { return mPortGroupId; }
const QHostAddress& serverAddress() const { return mServerAddress; }
quint16 serverPort() const { return mServerPort; }
const QString& userAlias() const { return mUserAlias; }
QAbstractSocket::SocketState state() const { return mpSocket->state(); }
const QString& userAlias() const { return mUserAlias; }
void setUserAlias(QString alias) { mUserAlias = alias; }; void setUserAlias(QString alias) { mUserAlias = alias; };
const QHostAddress& serverAddress() const
{ return rpcChannel->serverAddress(); }
quint16 serverPort() const
{ return rpcChannel->serverPort(); }
QAbstractSocket::SocketState state() const
{ return rpcChannel->state(); }
void processPortIdList(OstProto::PortIdList *portIdList);
void processPortConfigList(OstProto::PortConfigList *portConfigList);
signals: signals:
void portGroupDataChanged(PortGroup* portGroup); void portGroupDataChanged(PortGroup* portGroup);
void portListAboutToBeChanged(quint32 portGroupId); void portListAboutToBeChanged(quint32 portGroupId);
void portListChanged(quint32 portGroupId); void portListChanged(quint32 portGroupId);
private slots: private slots:
void on_mpSocket_stateChanged(); void on_rpcChannel_stateChanged();
void when_connected(); void on_rpcChannel_connected();
void when_disconnected(); void on_rpcChannel_disconnected();
void when_error(QAbstractSocket::SocketError socketError); void on_rpcChannel_error(QAbstractSocket::SocketError socketError);
void when_dataAvail(); #if 0 // PB
void on_rpcChannel_when_dataAvail();
#endif
private: private:
#if 0 // PB
void ProcessCapabilityInfo(const char *msg, qint32 size); void ProcessCapabilityInfo(const char *msg, qint32 size);
void ProcessMsg(const char *msg, quint32 size); void ProcessMsg(const char *msg, quint32 size);
#endif
}; };
#endif #endif

View File

@ -70,7 +70,11 @@ QVariant PortStatsModel::data(const QModelIndex &index, int role) const
// Check role // Check role
if (role == Qt::DisplayRole) if (role == Qt::DisplayRole)
{
#if 0 // PB
return pgl->mPortGroups.at(pgidx)->mPorts.at(pidx).mPortStats[index.row()]; return pgl->mPortGroups.at(pgidx)->mPorts.at(pidx).mPortStats[index.row()];
#endif return 0; //FIXME: Get actual port stats
}
else else
return QVariant(); return QVariant();

View File

@ -1,5 +1,4 @@
#include "portswindow.h" #include "portswindow.h"
#include "streamlistmodel.h"
#include "streamconfigdialog.h" #include "streamconfigdialog.h"
#include <QInputDialog> #include <QInputDialog>
#include <QItemSelectionModel> #include <QItemSelectionModel>

View File

@ -1,15 +1,25 @@
#include <stream.h> #include <stream.h>
quint32 Stream::mAllocId = 0;
Stream::Stream() Stream::Stream()
{ {
mId = mAllocId++;
mCore = new OstProto::StreamCore;
mMac = new MacProtocol;
mIp = new IpProtocol;
#if 0
// Default constructor // Default constructor
InitDefaultMeta(); InitDefaultMeta();
InitDefaultProto(); InitDefaultProto();
InitDefaultL2(); InitDefaultL2();
InitDefaultL3(); InitDefaultL3();
InitDefaultL4(); InitDefaultL4();
#endif
} }
#if 0
void Stream::InitDefaultMeta() void Stream::InitDefaultMeta()
{ {
// TODO(LOW): Use #defines // TODO(LOW): Use #defines
@ -121,3 +131,4 @@ void Stream::InitDefaultL4Udp()
l4.udp.totLen = STREAM_DEF_L4_UDP_TOT_LEN; l4.udp.totLen = STREAM_DEF_L4_UDP_TOT_LEN;
l4.udp.cksum = STREAM_DEF_L4_UDP_CKSUM; l4.udp.cksum = STREAM_DEF_L4_UDP_CKSUM;
} }
#endif

View File

@ -3,17 +3,547 @@
#include <QtGlobal> #include <QtGlobal>
#include <QString> #include <QString>
#include "../common/protocol.pb.h"
class StreamConfigDialog; class StreamConfigDialog;
class StreamModel; class StreamModel;
class PacketModel; class PacketModel;
// Convenience Defines FIXME
#define IP_PROTO_ICMP 0x01
#define IP_PROTO_IGMP 0x02
#define IP_PROTO_TCP 0x06
#define IP_PROTO_UDP 0x11
#if 0
// Protocols
struct {
FrameType ft;
quint16 protoMask;
#define PM_L3_PROTO_NONE 0x0001
#define PM_L3_PROTO_OTHER 0x0002
#define PM_L4_PROTO_NONE 0x0004
#define PM_L4_PROTO_OTHER 0x0008
quint16 etherType;
#define ETH_TYP_IP 0x0800
#define ETH_TYP_ARP 0x0806
quint16 ipProto;
#define IP_PROTO_ICMP 0x01
#define IP_PROTO_IGMP 0x02
#define IP_PROTO_TCP 0x06
#define IP_PROTO_UDP 0x11
} proto;
// L2
struct {
// Ethernet
} eth;
} l2;
#endif
class AbstractProtocol
{
// TODO
};
class MacProtocol : public AbstractProtocol
{
private:
OstProto::Mac d;
public:
enum MacAddrMode {
MacAddrFixed,
MacAddrInc,
MacAddrDec
};
// Dst Mac
quint64 dstMac()
{ return d.dst_mac(); }
bool setDstMac(quint64 dstMac)
{ d.set_dst_mac(dstMac); return true; }
MacAddrMode dstMacMode()
{ return (MacAddrMode) d.dst_mac_mode(); }
bool setDstMacMode(MacAddrMode dstMacMode)
{ d.set_dst_mac_mode((OstProto::Mac::MacAddrMode)dstMacMode); return true; }
quint16 dstMacCount()
{ return d.dst_mac_count(); }
bool setDstMacCount(quint16 dstMacCount)
{ d.set_dst_mac_count(dstMacCount); return true; }
quint16 dstMacStep()
{ return d.dst_mac_step(); }
bool setDstMacStep(quint16 dstMacStep)
{ d.set_dst_mac_step(dstMacStep); return true; }
// Src Mac
quint64 srcMac()
{ return d.src_mac(); }
bool setSrcMac(quint64 srcMac)
{ d.set_src_mac(srcMac); return true; }
MacAddrMode srcMacMode()
{ return (MacAddrMode) d.src_mac_mode(); }
bool setSrcMacMode(MacAddrMode srcMacMode)
{ d.set_src_mac_mode((OstProto::Mac::MacAddrMode)srcMacMode); return true; }
quint16 srcMacCount()
{ return d.src_mac_count(); }
bool setSrcMacCount(quint16 srcMacCount)
{ d.set_src_mac_count(srcMacCount); return true; }
quint16 srcMacStep()
{ return d.src_mac_step(); }
bool setSrcMacStep(quint16 srcMacStep)
{ d.set_src_mac_step(srcMacStep); return true; }
};
class LlcProtocol : public AbstractProtocol
{
private:
OstProto::Llc d;
public:
quint8 dsap()
{ return d.dsap(); }
bool setDsap(quint8 dsap)
{ d.set_dsap(dsap); return true; }
quint8 ssap()
{ return d.ssap(); }
bool setSsap(quint8 ssap)
{ d.set_ssap(ssap); return true; }
quint8 ctl()
{ return d.ctl(); }
bool setCtl(quint8 ctl)
{ d.set_ctl(ctl); return true; }
};
class SnapProtocol : public AbstractProtocol
{
private:
OstProto::Snap d;
public:
quint32 oui()
{ return d.oui(); }
bool setOui(quint32 oui)
{ d.set_oui(oui); return true; }
quint16 type()
{ return d.type(); }
bool setType(quint16 type)
{ d.set_type(type); return true; }
};
class Eth2Protocol : public AbstractProtocol
{
private:
OstProto::Eth2 d;
public:
quint16 type()
{ return d.type(); }
bool setType(quint16 type)
{ d.set_type(type); return true; }
};
class VlanProtocol : public AbstractProtocol
{
// TODO
#if 0
quint16 vlanMask;
#define VM_UNTAGGED 0x0000
#define VM_CVLAN_TAGGED 0x0001
#define VM_CVLAN_TPID_OVERRIDE 0x0002
#define VM_SVLAN_TAGGED 0x0100
#define VM_SVLAN_TPID_OVERRIDE 0x0200
#define VM_SINGLE_TAGGED(mask) \
((mask & VM_CVLAN_TAGGED ) | (mask & VM_SVLAN_TAGGED))
#define VM_DOUBLE_TAGGED(mask) \
(mask & (VM_CVLAN_TAGGED | VM_SVLAN_TAGGED))
quint16 ctpid;
quint16 cvlanPrio : 3;
quint16 cvlanCfi : 1;
quint16 cvlanId : 13;
quint16 stpid;
quint16 svlanPrio : 3;
quint16 svlanCfi : 1;
quint16 svlanId : 13;
#endif
};
// IP
class IpProtocol : public AbstractProtocol
{
private:
OstProto::Ip d;
public:
enum IpAddrMode {
IpAddrFixed,
IpAddrIncHost,
IpAddrDecHost,
IpAddrRandomHost
};
enum IpFlag {
IpOverrideVersion = 0x01,
IpOverrideHdrLen = 0x02,
IpOverrideTotLen = 0x03,
IpOverrideCksum = 0x04
};
Q_DECLARE_FLAGS(IpFlags, IpFlag);
IpFlags ipFlags()
{
IpFlags f;
if (d.is_override_ver()) f|= IpOverrideVersion;
if (d.is_override_hdrlen()) f|= IpOverrideHdrLen;
if (d.is_override_totlen()) f|= IpOverrideTotLen;
if (d.is_override_cksum()) f|= IpOverrideCksum;
return f;
}
bool setIpFlags(IpFlags ipFlags)
{
if (ipFlags.testFlag(IpOverrideVersion))
d.set_is_override_ver(true);
else
d.set_is_override_ver(false);
if (ipFlags.testFlag(IpOverrideHdrLen))
d.set_is_override_hdrlen(true);
else
d.set_is_override_hdrlen(false);
if (ipFlags.testFlag(IpOverrideTotLen))
d.set_is_override_totlen(true);
else
d.set_is_override_totlen(false);
if (ipFlags.testFlag(IpOverrideCksum))
d.set_is_override_cksum(true);
else
d.set_is_override_cksum(false);
return true;
}
quint8 ver()
{ return (d.ver_hdrlen() >> 4); }
bool setVer(quint8 ver)
{ d.set_ver_hdrlen((d.ver_hdrlen() & 0x0F) | (ver << 4)); return true; }
quint8 hdrLen()
{ return (d.ver_hdrlen() & 0xF); }
bool setHdrLen(quint8 hdrLen)
{ d.set_ver_hdrlen((d.ver_hdrlen() & 0xF0) | hdrLen); return true; }
quint8 tos()
{ return d.tos(); }
bool setTos(quint8 tos)
{ d.set_tos(tos); return true; }
quint16 totLen()
{ return d.tot_len(); }
bool setTotLen(quint16 totLen)
{ d.set_tot_len(totLen); return true; }
quint16 id()
{ return d.id(); }
bool setId(quint16 id)
{ d.set_id(id); return true; }
quint16 flags()
{ return d.flags(); }
bool setFlags(quint16 flags)
{ d.set_flags(flags); return true; }
#define IP_FLAG_UNUSED 0x1
#define IP_FLAG_DF 0x2
#define IP_FLAG_MF 0x4
quint16 fragOfs()
{ return d.frag_ofs(); }
bool setFragOfs(quint16 fragOfs)
{ d.set_frag_ofs(fragOfs); return true; }
quint8 ttl()
{ return d.ttl(); }
bool setTtl(quint8 ttl)
{ d.set_ttl(ttl); return true; }
quint8 proto()
{ return d.proto(); }
bool setProto(quint8 proto)
{ d.set_proto(proto); return true; }
quint16 cksum()
{ return d.cksum(); }
bool setCksum(quint16 cksum)
{ d.set_cksum(cksum); return true; }
// Source IP
quint32 srcIp()
{ return d.src_ip(); }
bool setSrcIp(quint32 srcIp)
{ d.set_src_ip(srcIp); return true; }
IpAddrMode srcIpMode()
{ return (IpAddrMode) d.src_ip_mode(); }
bool setSrcIpMode(IpAddrMode srcIpMode)
{ d.set_src_ip_mode((OstProto::Ip::IpAddrMode)srcIpMode); return true; }
quint16 srcIpCount()
{ return d.src_ip_count(); }
bool setSrcIpCount(quint16 srcIpCount)
{ d.set_src_ip_count(srcIpCount); return true; }
quint32 srcIpMask()
{ return d.src_ip_mask(); }
bool setSrcIpMask(quint32 srcIpMask)
{ d.set_src_ip_mask(srcIpMask); return true; }
// Destination IP
quint32 dstIp()
{ return d.dst_ip(); }
bool setDstIp(quint32 dstIp)
{ d.set_dst_ip(dstIp); return true; }
IpAddrMode dstIpMode()
{ return (IpAddrMode) d.dst_ip_mode(); }
bool setDstIpMode(IpAddrMode dstIpMode)
{ d.set_dst_ip_mode((OstProto::Ip::IpAddrMode)dstIpMode); return true; }
quint16 dstIpCount()
{ return d.dst_ip_count(); }
bool setDstIpCount(quint16 dstIpCount)
{ d.set_dst_ip_count(dstIpCount); return true; }
quint32 dstIpMask()
{ return d.dst_ip_mask(); }
bool setDstIpMask(quint32 dstIpMask)
{ d.set_dst_ip_mask(dstIpMask); return true; }
// TODO: Options
};
Q_DECLARE_OPERATORS_FOR_FLAGS(IpProtocol::IpFlags)
class ArpProtocol: public AbstractProtocol
{
// TODO: ARP
};
// TCP
class TcpProtocol : public AbstractProtocol
{
private:
OstProto::Tcp d;
public:
enum TcpFlag
{
TcpOverrideHdrLen = 0x01,
TcpOverrideCksum = 0x02
};
Q_DECLARE_FLAGS(TcpFlags, TcpFlag);
TcpFlags tcpFlags()
{
TcpFlags f;
if (d.is_override_hdrlen()) f|= TcpOverrideHdrLen;
if (d.is_override_cksum()) f|= TcpOverrideCksum;
return f;
}
bool setTcpFlags(TcpFlags tcpFlags)
{
if (tcpFlags.testFlag(TcpOverrideHdrLen))
d.set_is_override_hdrlen(true);
else
d.set_is_override_hdrlen(false);
if (tcpFlags.testFlag(TcpOverrideCksum))
d.set_is_override_cksum(true);
else
d.set_is_override_cksum(false);
return true;
}
quint16 srcPort()
{ return d.src_port(); }
bool setSrcPort(quint16 srcPort)
{ d.set_src_port(srcPort); return true; }
quint16 dstPort()
{ return d.dst_port(); }
bool setdstPort(quint16 dstPort)
{ d.set_dst_port(dstPort); return true; }
quint32 seqNum()
{ return d.seq_num(); }
bool setSeqNum(quint32 seqNum)
{ d.set_seq_num(seqNum); return true;}
quint32 ackNum()
{ return d.ack_num(); }
bool setAckNum(quint32 ackNum)
{ d.set_ack_num(ackNum); return true;}
quint8 hdrLen()
{ return (d.hdrlen_rsvd() >> 4); }
bool setHdrLen(quint8 hdrLen)
{ d.set_hdrlen_rsvd((d.hdrlen_rsvd() & 0x0F) | (hdrLen << 4)); return true; }
quint8 rsvd()
{ return (d.hdrlen_rsvd() & 0xF); }
bool setRsvd(quint8 rsvd)
{ d.set_hdrlen_rsvd((d.hdrlen_rsvd() & 0xF0) | rsvd); return true; }
// TODO: convert to enum maybe?
quint8 flags()
{ return d.flags(); }
bool setFlags(quint8 flags)
{ d.set_flags(flags); return true; }
#define TCP_FLAG_URG 0x01
#define TCP_FLAG_ACK 0x02
#define TCP_FLAG_PSH 0x04
#define TCP_FLAG_RST 0x08
#define TCP_FLAG_SYN 0x10
#define TCP_FLAG_FIN 0x20
quint16 window()
{ return d.window(); }
bool setWindow(quint16 window)
{ d.set_window(window); return true; }
quint16 cksum()
{ return d.cksum(); }
bool setCksum(quint16 cksum)
{ d.set_cksum(cksum); return true; }
quint16 urg_ptr()
{ return d.urg_ptr(); }
bool seturg_ptr(quint16 urg_ptr)
{ d.set_urg_ptr(urg_ptr); return true; }
};
Q_DECLARE_OPERATORS_FOR_FLAGS(TcpProtocol::TcpFlags)
// UDP
class UdpProtocol : public AbstractProtocol
{
private:
OstProto::Udp d;
public:
enum UdpFlag
{
UdpOverrideTotLen = 0x01,
UdpOverrideCksum = 0x02
};
Q_DECLARE_FLAGS(UdpFlags, UdpFlag);
UdpFlags udpFlags()
{
UdpFlags f;
if (d.is_override_totlen()) f|= UdpOverrideTotLen;
if (d.is_override_cksum()) f|= UdpOverrideCksum;
return f;
}
bool setUdpFlags(UdpFlags udpFlags)
{
if (udpFlags.testFlag(UdpOverrideTotLen))
d.set_is_override_totlen(true);
else
d.set_is_override_totlen(false);
if (udpFlags.testFlag(UdpOverrideCksum))
d.set_is_override_cksum(true);
else
d.set_is_override_cksum(false);
return true;
}
quint16 srcPort()
{ return d.src_port(); }
bool setSrcPort(quint16 srcPort)
{ d.set_src_port(srcPort); return true; }
quint16 dstPort()
{ return d.dst_port(); }
bool setdstPort(quint16 dstPort)
{ d.set_dst_port(dstPort); return true; }
quint16 totLen()
{ return d.totlen(); }
bool setTotLen(quint16 totLen)
{ d.set_totlen(totLen); return true; }
quint16 cksum()
{ return d.cksum(); }
bool setCksum(quint16 cksum)
{ d.set_cksum(cksum); return true; }
};
class IcmpProtocol {
// TODO: ICMP
};
class IgmpProtocol {
// TODO: IGMP
};
class Stream { class Stream {
static quint32 mAllocId;
quint32 mId;
OstProto::StreamCore *mCore;
MacProtocol *mMac;
IpProtocol *mIp;
#if 0
friend class StreamConfigDialog; friend class StreamConfigDialog;
friend class StreamModel; friend class StreamModel;
friend class PacketModel; friend class PacketModel;
#endif
public:
enum FrameType { enum FrameType {
e_ft_none, e_ft_none,
e_ft_eth_2, e_ft_eth_2,
@ -36,273 +566,78 @@ class Stream {
e_fl_random e_fl_random
}; };
enum MacAddrMode { // -------------------------------------------------------
e_mm_fixed, // Methods
e_mm_inc, // -------------------------------------------------------
e_mm_dec, Stream();
};
enum IpAddrMode { quint32 id()
e_im_fixed, { return mId;}
e_im_inc_host,
e_im_dec_host, quint32 ordinal()
e_im_random_host { return mCore->ordinal();}
}; bool setOrderdinal(quint32 ordinal)
{ mCore->set_ordinal(ordinal); return true; }
bool isEnabled() const
{ return mCore->is_enabled(); }
bool setIsEnabled(bool flag)
{ mCore->set_is_enabled(flag); return true; }
const QString name() const
{ return QString().fromStdString(mCore->name()); }
bool setName(QString name)
{ mCore->set_name(name.toStdString()); return true; }
FrameType frameType()
{ return (FrameType) mCore->ft(); }
bool setFrameType(FrameType frameType)
{ mCore->set_ft((OstProto::StreamCore::FrameType) frameType); return true; }
// Meta Data
struct {
// Data Pattern // Data Pattern
DataPatternMode patternMode; DataPatternMode patternMode()
quint32 pattern; { return (DataPatternMode) mCore->pattern_mode(); }
quint16 dataStartOfs; bool setPatternMode(DataPatternMode patternMode)
{ mCore->set_pattern_mode(
(OstProto::StreamCore::DataPatternMode) patternMode); return true; }
quint32 pattern()
{ return mCore->pattern(); }
bool setPattern(quint32 pattern)
{ mCore->set_pattern(pattern); return true; }
// Frame Length (includes CRC) // Frame Length (includes CRC)
FrameLengthMode lenMode; FrameLengthMode lenMode()
quint16 frameLen; { return (FrameLengthMode) mCore->len_mode(); }
quint16 frameLenMin; bool setLenMode(FrameLengthMode lenMode)
quint16 frameLenMax; { mCore->set_len_mode(
} meta; (OstProto::StreamCore::FrameLengthMode) lenMode); return true; }
// Protocols quint16 frameLen()
struct { { return mCore->frame_len(); }
FrameType ft; bool setFrameLen(quint16 frameLen)
{ mCore->set_frame_len(frameLen); return true; }
quint8 dsap; quint16 frameLenMin()
quint8 ssap; { return mCore->frame_len_min(); }
quint8 ctl; bool setFrameLenMin(quint16 frameLenMin)
quint8 ouiMsb; { mCore->set_frame_len_min(frameLenMin); return true; }
quint16 ouiLshw;
quint16 protoMask; quint16 frameLenMax()
#define PM_L3_PROTO_NONE 0x0001 { return mCore->frame_len_max(); }
#define PM_L3_PROTO_OTHER 0x0002 bool setFrameLenMax(quint16 frameLenMax)
#define PM_L4_PROTO_NONE 0x0004 { mCore->set_frame_len_max(frameLenMax); return true; }
#define PM_L4_PROTO_OTHER 0x0008
quint16 etherType; // TODO
#define ETH_TYP_IP 0x0800 #if 0
#define ETH_TYP_ARP 0x0806 quint16 dataStartOfs;
#endif
quint16 ipProto; MacProtocol* mac() { return mMac; }
#define IP_PROTO_ICMP 0x01 IpProtocol* ip() { return mIp; }
#define IP_PROTO_IGMP 0x02
#define IP_PROTO_TCP 0x06
#define IP_PROTO_UDP 0x11
} proto;
// L2
struct {
// Ethernet
struct {
// Dst Mac
quint16 dstMacMshw;
quint32 dstMacLsw;
MacAddrMode dstMacMode;
quint16 dstMacCount;
quint16 dstMacStep;
// srcMac
quint16 srcMacMshw;
quint32 srcMacLsw;
MacAddrMode srcMacMode;
quint16 srcMacCount;
quint16 srcMacStep;
quint16 vlanMask;
#define VM_UNTAGGED 0x0000
#define VM_CVLAN_TAGGED 0x0001
#define VM_CVLAN_TPID_OVERRIDE 0x0002
#define VM_SVLAN_TAGGED 0x0100
#define VM_SVLAN_TPID_OVERRIDE 0x0200
#define VM_SINGLE_TAGGED(mask) \
((mask & VM_CVLAN_TAGGED ) | (mask & VM_SVLAN_TAGGED))
#define VM_DOUBLE_TAGGED(mask) \
(mask & (VM_CVLAN_TAGGED | VM_SVLAN_TAGGED))
quint16 ctpid;
quint16 cvlanPrio : 3;
quint16 cvlanCfi : 1;
quint16 cvlanId : 13;
quint16 stpid;
quint16 svlanPrio : 3;
quint16 svlanCfi : 1;
quint16 svlanId : 13;
} eth;
} l2;
struct {
// IP
struct {
quint8 ipMask;
#define IM_OVERRIDE_VERSION 0x01
#define IM_OVERRIDE_HDRLEN 0x02
#define IM_OVERRIDE_TOTLEN 0x04
#define IM_OVERRIDE_CKSUM 0x08
#define STREAM_DEF_IP_MASK 0x00
quint8 ver : 4;
#define STREAM_DEF_L3_IP_VER 0x4
quint8 hdrLen : 4;
#define STREAM_DEF_L3_IP_HDR_LEN 0x5
quint8 tos;
#define STREAM_DEF_L3_IP_TOS 0x00
quint16 totLen;
#define STREAM_DEF_L3_IP_TOT_LEN 0x00
quint16 id;
#define STREAM_DEF_L3_IP_ID 0x1234
quint16 flags : 3;
#define IP_FLAG_UNUSED 0x1
#define IP_FLAG_DF 0x2
#define IP_FLAG_MF 0x4
#define STREAM_DEF_L3_IP_FLAGS 0x00
quint16 fragOfs : 13;
#define STREAM_DEF_L3_IP_FRAG_OFS 0x0000
quint8 ttl;
#define STREAM_DEF_L3_IP_TTL 0x7F
quint8 proto;
#define STREAM_DEF_L3_IP_PROTO 0x00
quint16 cksum;
#define STREAM_DEF_L3_IP_CKSUM 0x0000
// Source IP
quint32 srcIp;
#define STREAM_DEF_L3_IP_SRC_IP 0x02020202
IpAddrMode srcIpMode;
#define STREAM_DEF_L3_IP_SRC_IP_MODE e_im_fixed
quint16 srcIpCount;
#define STREAM_DEF_L3_IP_SRC_IP_COUNT 16
quint32 srcIpMask;
#define STREAM_DEF_L3_IP_SRC_IP_MASK 0xFFFFFFFF
// Destination IP
quint32 dstIp;
#define STREAM_DEF_L3_IP_DST_IP 0x01010101
IpAddrMode dstIpMode;
#define STREAM_DEF_L3_IP_DST_IP_MODE e_im_fixed
quint16 dstIpCount;
#define STREAM_DEF_L3_IP_DST_IP_COUNT 16
quint32 dstIpMask;
#define STREAM_DEF_L3_IP_DST_IP_MASK 0xFFFFFFFF
// TODO: Options
} ip;
// TODO: ARP
struct {
} arp;
} l3;
// L4
struct {
// TCP
struct {
quint32 tcpMask;
#define TM_OVERRIDE_HDRLEN 0x1
#define TM_OVERRIDE_CKSUM 0x2
#define STREAM_DEF_L4_TCP_TCP_MASK 0x00;
quint16 srcPort;
#define STREAM_DEF_L4_TCP_SRC_PORT 8902;
quint16 dstPort;
#define STREAM_DEF_L4_TCP_DST_PORT 80
quint32 seqNum;
#define STREAM_DEF_L4_TCP_SEQ_NUM 129018
quint32 ackNum;
#define STREAM_DEF_L4_TCP_ACK_NUM 98223
quint8 hdrLen : 4;
#define STREAM_DEF_L4_TCP_HDR_LEN 0x5
quint8 rsvd : 4;
#define STREAM_DEF_L4_TCP_RSVD 0x0
quint8 flags;
#define TCP_FLAG_URG 0x01
#define TCP_FLAG_ACK 0x02
#define TCP_FLAG_PSH 0x04
#define TCP_FLAG_RST 0x08
#define TCP_FLAG_SYN 0x10
#define TCP_FLAG_FIN 0x20
#define STREAM_DEF_L4_TCP_FLAGS 0x00
quint16 window;
#define STREAM_DEF_L4_TCP_WINDOW 1024
quint16 cksum;
#define STREAM_DEF_L4_TCP_CKSUM 0x0000
quint16 urgPtr;
#define STREAM_DEF_L4_TCP_URG_PTR 0x0000
} tcp;
// UDP
struct {
quint32 udpMask;
#define UM_OVERRIDE_TOTLEN 0x01
#define UM_OVERRIDE_CKSUM 0x02
#define STREAM_DEF_L4_UDP_UDP_MASK 0x00
quint16 srcPort;
#define STREAM_DEF_L4_UDP_SRC_PORT 8902
quint16 dstPort;
#define STREAM_DEF_L4_UDP_DST_PORT 80
quint16 totLen;
#define STREAM_DEF_L4_UDP_TOT_LEN 0x0000
quint16 cksum;
#define STREAM_DEF_L4_UDP_CKSUM 0x0000
} udp;
// TODO: ICMP
struct {
} icmp;
// TODO: IGMP
struct {
} igmp;
} l4;
QString mName;
bool mIsEnabled;
// -------------------------------------------------------
// Methods
// -------------------------------------------------------
public:
Stream();
int enable(bool flag);
const QString& name() const { return mName; }
bool isEnabled() const { return mIsEnabled; }
void setName(QString name) { mName = name; }
void setEnabled(bool isEnabled) { mIsEnabled = isEnabled; }
private: private:
#if 0
void InitDefaultMeta(); void InitDefaultMeta();
void InitDefaultProto(); void InitDefaultProto();
void InitDefaultL2(); void InitDefaultL2();
@ -311,6 +646,7 @@ private:
void InitDefaultL4(); void InitDefaultL4();
void InitDefaultL4Tcp(); void InitDefaultL4Tcp();
void InitDefaultL4Udp(); void InitDefaultL4Udp();
#endif
}; };
#endif #endif

View File

@ -82,9 +82,29 @@ StreamConfigDialog::~StreamConfigDialog()
void StreamConfigDialog::on_cmbDstMacMode_currentIndexChanged(QString mode) void StreamConfigDialog::on_cmbDstMacMode_currentIndexChanged(QString mode)
{ {
if (mode == "Fixed") if (mode == "Fixed")
{
leDstMacCount->setEnabled(FALSE); leDstMacCount->setEnabled(FALSE);
leDstMacStep->setEnabled(FALSE);
}
else else
{
leDstMacCount->setEnabled(TRUE); leDstMacCount->setEnabled(TRUE);
leDstMacStep->setEnabled(TRUE);
}
}
void StreamConfigDialog::on_cmbSrcMacMode_currentIndexChanged(QString mode)
{
if (mode == "Fixed")
{
leSrcMacCount->setEnabled(FALSE);
leSrcMacStep->setEnabled(FALSE);
}
else
{
leSrcMacCount->setEnabled(TRUE);
leSrcMacStep->setEnabled(TRUE);
}
} }
void StreamConfigDialog::on_pbPrev_clicked() void StreamConfigDialog::on_pbPrev_clicked()
@ -246,7 +266,7 @@ void StreamConfigDialog::update_NumPacketsAndNumBursts()
leNumBursts->setEnabled(false); leNumBursts->setEnabled(false);
} }
QString & uintToHexStr(quint32 num, QString &hexStr, quint8 octets) QString & uintToHexStr(quint64 num, QString &hexStr, quint8 octets)
{ {
int i; int i;
QChar zero('0'); QChar zero('0');
@ -291,19 +311,19 @@ void StreamConfigDialog::LoadCurrentStream()
// Meta Data // Meta Data
{ {
cmbPatternMode->setCurrentIndex(pStream->meta.patternMode); cmbPatternMode->setCurrentIndex(pStream->patternMode());
lePattern->setText(uintToHexStr(pStream->meta.pattern, str, 4)); lePattern->setText(uintToHexStr(pStream->pattern(), str, 4));
cmbPktLenMode->setCurrentIndex(pStream->meta.lenMode); cmbPktLenMode->setCurrentIndex(pStream->lenMode());
lePktLen->setText(str.setNum(pStream->meta.frameLen)); lePktLen->setText(str.setNum(pStream->frameLen()));
lePktLenMin->setText(str.setNum(pStream->meta.frameLenMin)); lePktLenMin->setText(str.setNum(pStream->frameLenMin()));
lePktLenMax->setText(str.setNum(pStream->meta.frameLenMax)); lePktLenMax->setText(str.setNum(pStream->frameLenMax()));
} }
// Protocols // Protocols
{ {
qDebug("ft = %d\n", pStream->proto.ft); qDebug("ft = %d\n", pStream->frameType());
switch(pStream->proto.ft) switch(pStream->frameType())
{ {
case Stream::e_ft_none: case Stream::e_ft_none:
rbFtNone->setChecked(TRUE); rbFtNone->setChecked(TRUE);
@ -321,6 +341,9 @@ void StreamConfigDialog::LoadCurrentStream()
rbFtLlcSnap->setChecked(TRUE); rbFtLlcSnap->setChecked(TRUE);
break; break;
} }
// TODO
#if 0
leDsap->setText(uintToHexStr(pStream->proto.dsap, str, 1)); leDsap->setText(uintToHexStr(pStream->proto.dsap, str, 1));
leSsap->setText(uintToHexStr(pStream->proto.ssap, str, 1)); leSsap->setText(uintToHexStr(pStream->proto.ssap, str, 1));
leControl->setText(uintToHexStr(pStream->proto.ctl, str, 1)); leControl->setText(uintToHexStr(pStream->proto.ctl, str, 1));
@ -351,24 +374,23 @@ void StreamConfigDialog::LoadCurrentStream()
// ... then for None/Other // ... then for None/Other
rbL4None->setChecked((pStream->proto.protoMask & PM_L4_PROTO_NONE) > 0); rbL4None->setChecked((pStream->proto.protoMask & PM_L4_PROTO_NONE) > 0);
rbL4Other->setChecked((pStream->proto.protoMask & PM_L4_PROTO_OTHER) > 0); rbL4Other->setChecked((pStream->proto.protoMask & PM_L4_PROTO_OTHER) > 0);
#endif
} }
// L2 // L2
{ {
// L2 | Ethernet // L2 | Ethernet
{ {
leDstMac->setText(uintToHexStr(pStream->l2.eth.dstMacMshw, str, 2) + leDstMac->setText(uintToHexStr(pStream->mac()->dstMac(), str, 6));
uintToHexStr(pStream->l2.eth.dstMacLsw, str, 4)); cmbDstMacMode->setCurrentIndex(pStream->mac()->dstMacMode());
cmbDstMacMode->setCurrentIndex(pStream->l2.eth.dstMacMode); leDstMacCount->setText(str.setNum(pStream->mac()->dstMacCount()));
leDstMacCount->setText(str.setNum(pStream->l2.eth.dstMacCount)); leDstMacStep->setText(str.setNum(pStream->mac()->dstMacStep()));
leDstMacStep->setText(str.setNum(pStream->l2.eth.dstMacStep));
leSrcMac->setText(uintToHexStr(pStream->l2.eth.srcMacMshw, str, 2) +
uintToHexStr(pStream->l2.eth.srcMacLsw, str, 4));
cmbSrcMacMode->setCurrentIndex(pStream->l2.eth.srcMacMode);
leSrcMacCount->setText(str.setNum(pStream->l2.eth.srcMacCount));
leSrcMacStep->setText(str.setNum(pStream->l2.eth.srcMacStep));
leSrcMac->setText(uintToHexStr(pStream->mac()->srcMac(), str, 6));
cmbSrcMacMode->setCurrentIndex(pStream->mac()->srcMacMode());
leSrcMacCount->setText(str.setNum(pStream->mac()->srcMacCount()));
leSrcMacStep->setText(str.setNum(pStream->mac()->srcMacStep()));
#if 0
cmbCvlanPrio->setCurrentIndex(pStream->l2.eth.cvlanPrio); cmbCvlanPrio->setCurrentIndex(pStream->l2.eth.cvlanPrio);
cmbCvlanCfi->setCurrentIndex(pStream->l2.eth.cvlanCfi); cmbCvlanCfi->setCurrentIndex(pStream->l2.eth.cvlanCfi);
leCvlanId->setText(str.setNum(pStream->l2.eth.cvlanId)); leCvlanId->setText(str.setNum(pStream->l2.eth.cvlanId));
@ -382,6 +404,7 @@ void StreamConfigDialog::LoadCurrentStream()
leSvlanTpid->setText(str.setNum(pStream->l2.eth.stpid)); leSvlanTpid->setText(str.setNum(pStream->l2.eth.stpid));
cbSvlanTpidOverride->setChecked((pStream->l2.eth.vlanMask & VM_SVLAN_TPID_OVERRIDE) > 0); cbSvlanTpidOverride->setChecked((pStream->l2.eth.vlanMask & VM_SVLAN_TPID_OVERRIDE) > 0);
gbSvlan->setChecked((pStream->l2.eth.vlanMask & VM_SVLAN_TAGGED) > 0); gbSvlan->setChecked((pStream->l2.eth.vlanMask & VM_SVLAN_TAGGED) > 0);
#endif
} }
} }
@ -389,36 +412,40 @@ void StreamConfigDialog::LoadCurrentStream()
{ {
// L3 | IP // L3 | IP
{ {
leIpVersion->setText(str.setNum(pStream->l3.ip.ver)); leIpVersion->setText(str.setNum(pStream->ip()->ver()));
cbIpVersionOverride->setChecked((pStream->l3.ip.ipMask & IM_OVERRIDE_VERSION) > 0); cbIpVersionOverride->setChecked(
leIpHdrLen->setText(str.setNum(pStream->l3.ip.hdrLen)); pStream->ip()->ipFlags().testFlag(IpProtocol::IpOverrideVersion));
cbIpHdrLenOverride->setChecked((pStream->l3.ip.ipMask & IM_OVERRIDE_HDRLEN) > 0); leIpHdrLen->setText(str.setNum(pStream->ip()->hdrLen()));
cbIpHdrLenOverride->setChecked(
pStream->ip()->ipFlags().testFlag(IpProtocol::IpOverrideHdrLen));
leIpTos->setText(uintToHexStr(pStream->l3.ip.tos, str, 1)); leIpTos->setText(uintToHexStr(pStream->ip()->tos(), str, 1));
leIpLength->setText(str.setNum(pStream->l3.ip.totLen)); leIpLength->setText(str.setNum(pStream->ip()->totLen()));
cbIpLengthOverride->setChecked((pStream->l3.ip.ipMask & IM_OVERRIDE_TOTLEN) > 0); cbIpLengthOverride->setChecked(
pStream->ip()->ipFlags().testFlag(IpProtocol::IpOverrideTotLen));
leIpId->setText(uintToHexStr(pStream->l3.ip.id, str, 2)); leIpId->setText(uintToHexStr(pStream->ip()->id(), str, 2));
leIpFragOfs->setText(str.setNum(pStream->l3.ip.fragOfs)); leIpFragOfs->setText(str.setNum(pStream->ip()->fragOfs()));
cbIpFlagsDf->setChecked((pStream->l3.ip.flags & IP_FLAG_DF) > 0); cbIpFlagsDf->setChecked((pStream->ip()->flags() & IP_FLAG_DF) > 0);
cbIpFlagsMf->setChecked((pStream->l3.ip.flags & IP_FLAG_MF) > 0); cbIpFlagsMf->setChecked((pStream->ip()->flags() & IP_FLAG_MF) > 0);
leIpTtl->setText(str.setNum(pStream->l3.ip.ttl)); leIpTtl->setText(str.setNum(pStream->ip()->ttl()));
leIpProto->setText(uintToHexStr(pStream->l3.ip.proto, str, 1)); leIpProto->setText(uintToHexStr(pStream->ip()->proto(), str, 1));
leIpCksum->setText(uintToHexStr(pStream->l3.ip.cksum, str, 2)); leIpCksum->setText(uintToHexStr(pStream->ip()->cksum(), str, 2));
cbIpCksumOverride->setChecked((pStream->l3.ip.ipMask & IM_OVERRIDE_CKSUM) > 0); cbIpCksumOverride->setChecked(
pStream->ip()->ipFlags().testFlag(IpProtocol::IpOverrideCksum));
leIpSrcAddr->setText(QHostAddress(pStream->l3.ip.srcIp).toString()); leIpSrcAddr->setText(QHostAddress(pStream->ip()->srcIp()).toString());
cmbIpSrcAddrMode->setCurrentIndex(pStream->l3.ip.srcIpMode); cmbIpSrcAddrMode->setCurrentIndex(pStream->ip()->srcIpMode());
leIpSrcAddrCount->setText(str.setNum(pStream->l3.ip.srcIpCount)); leIpSrcAddrCount->setText(str.setNum(pStream->ip()->srcIpCount()));
leIpSrcAddrMask->setText(QHostAddress(pStream->l3.ip.srcIpMask).toString()); leIpSrcAddrMask->setText(QHostAddress(pStream->ip()->srcIpMask()).toString());
leIpDstAddr->setText(QHostAddress(pStream->l3.ip.dstIp).toString()); leIpDstAddr->setText(QHostAddress(pStream->ip()->dstIp()).toString());
cmbIpDstAddrMode->setCurrentIndex(pStream->l3.ip.dstIpMode); cmbIpDstAddrMode->setCurrentIndex(pStream->ip()->dstIpMode());
leIpDstAddrCount->setText(str.setNum(pStream->l3.ip.dstIpCount)); leIpDstAddrCount->setText(str.setNum(pStream->ip()->dstIpCount()));
leIpDstAddrMask->setText(QHostAddress(pStream->l3.ip.dstIpMask).toString()); leIpDstAddrMask->setText(QHostAddress(pStream->ip()->dstIpMask()).toString());
} }
// L3 | ARP // L3 | ARP
@ -427,6 +454,7 @@ void StreamConfigDialog::LoadCurrentStream()
} }
} }
#if 0
// L4 // L4
{ {
// L4 | TCP // L4 | TCP
@ -477,6 +505,7 @@ void StreamConfigDialog::LoadCurrentStream()
// TODO // TODO
} }
} }
#endif
} }
void StreamConfigDialog::StoreCurrentStream() void StreamConfigDialog::StoreCurrentStream()
@ -487,30 +516,31 @@ void StreamConfigDialog::StoreCurrentStream()
qDebug("storing pStream %p", pStream); qDebug("storing pStream %p", pStream);
#if 1 // FIXME: Temp till we use protobuff accessors
// Meta Data // Meta Data
pStream->meta.patternMode = (Stream::DataPatternMode) cmbPatternMode->currentIndex(); pStream->setPatternMode((Stream::DataPatternMode) cmbPatternMode->currentIndex());
pStream->meta.pattern = lePattern->text().remove(QChar(' ')).toULong(&isOk, 16); pStream->setPattern(lePattern->text().remove(QChar(' ')).toULong(&isOk, 16));
pStream->meta.lenMode = (Stream::FrameLengthMode) cmbPktLenMode->currentIndex();
pStream->meta.frameLen = lePktLen->text().toULong(&isOk);
pStream->meta.frameLenMin = lePktLenMin->text().toULong(&isOk);
pStream->meta.frameLenMax = lePktLenMax->text().toULong(&isOk);
pStream->setLenMode((Stream::FrameLengthMode) cmbPktLenMode->currentIndex());
pStream->setFrameLen(lePktLen->text().toULong(&isOk));
pStream->setFrameLenMin(lePktLenMin->text().toULong(&isOk));
pStream->setFrameLenMax(lePktLenMax->text().toULong(&isOk));
#endif
// Protocols // Protocols
{ {
if (rbFtNone->isChecked()) if (rbFtNone->isChecked())
pStream->proto.ft = Stream::e_ft_none; pStream->setFrameType(Stream::e_ft_none);
else if (rbFtEthernet2->isChecked()) else if (rbFtEthernet2->isChecked())
pStream->proto.ft = Stream::e_ft_eth_2; pStream->setFrameType(Stream::e_ft_eth_2);
else if (rbFt802Dot3Raw->isChecked()) else if (rbFt802Dot3Raw->isChecked())
pStream->proto.ft = Stream::e_ft_802_3_raw; pStream->setFrameType(Stream::e_ft_802_3_raw);
else if (rbFt802Dot3Llc->isChecked()) else if (rbFt802Dot3Llc->isChecked())
pStream->proto.ft = Stream::e_ft_802_3_llc; pStream->setFrameType(Stream::e_ft_802_3_llc);
else if (rbFtLlcSnap->isChecked()) else if (rbFtLlcSnap->isChecked())
pStream->proto.ft = Stream::e_ft_snap; pStream->setFrameType(Stream::e_ft_snap);
qDebug("store ft(%d)\n", pStream->frameType());
qDebug("store ft = %d\n", pStream->proto.ft);
#if 0
pStream->proto.dsap = leDsap->text().remove(QChar(' ')).toULong(&isOk, 16); pStream->proto.dsap = leDsap->text().remove(QChar(' ')).toULong(&isOk, 16);
pStream->proto.ssap = leSsap->text().remove(QChar(' ')).toULong(&isOk, 16); pStream->proto.ssap = leSsap->text().remove(QChar(' ')).toULong(&isOk, 16);
pStream->proto.ctl = leControl->text().remove(QChar(' ')).toULong(&isOk, 16); pStream->proto.ctl = leControl->text().remove(QChar(' ')).toULong(&isOk, 16);
@ -531,24 +561,33 @@ void StreamConfigDialog::StoreCurrentStream()
pStream->proto.protoMask |= PM_L4_PROTO_NONE; pStream->proto.protoMask |= PM_L4_PROTO_NONE;
else if (rbL4Other->isChecked()) else if (rbL4Other->isChecked())
pStream->proto.protoMask |= PM_L4_PROTO_OTHER; pStream->proto.protoMask |= PM_L4_PROTO_OTHER;
#endif
} }
// L2 // L2
{ {
// L2 | Ethernet // L2 | Ethernet
{ {
pStream->l2.eth.dstMacMshw = leDstMac->text().remove(QChar(' ')).left(4).toULong(&isOk, 16); pStream->mac()->setDstMac(
pStream->l2.eth.dstMacLsw = leDstMac->text().remove(QChar(' ')).right(8).toULong(&isOk, 16); leDstMac->text().remove(QChar(' ')).toULongLong(&isOk, 16));
pStream->l2.eth.dstMacMode = (Stream::MacAddrMode) cmbDstMacMode->currentIndex(); pStream->mac()->setDstMacMode(
pStream->l2.eth.dstMacCount = leDstMacCount->text().toULong(&isOk); (MacProtocol::MacAddrMode) cmbDstMacMode->currentIndex());
pStream->l2.eth.dstMacStep = leDstMacStep->text().toULong(&isOk); pStream->mac()->setDstMacCount(
leDstMacCount->text().toULong(&isOk));
pStream->mac()->setDstMacStep(
leDstMacStep->text().toULong(&isOk));
pStream->l2.eth.srcMacMshw = leSrcMac->text().remove(QChar(' ')).left(4).toULong(&isOk, 16); pStream->mac()->setSrcMac(
pStream->l2.eth.srcMacLsw = leSrcMac->text().remove(QChar(' ')).right(8).toULong(&isOk, 16); leSrcMac->text().remove(QChar(' ')).toULongLong(&isOk, 16));
pStream->l2.eth.srcMacMode = (Stream::MacAddrMode) cmbSrcMacMode->currentIndex(); pStream->mac()->setSrcMacMode(
pStream->l2.eth.srcMacCount = leSrcMacCount->text().toULong(&isOk); (MacProtocol::MacAddrMode) cmbSrcMacMode->currentIndex());
pStream->l2.eth.srcMacStep = leSrcMacStep->text().toULong(&isOk); pStream->mac()->setSrcMacCount(
leSrcMacCount->text().toULong(&isOk));
pStream->mac()->setSrcMacStep(
leSrcMacStep->text().toULong(&isOk));
#if 0
pStream->l2.eth.vlanMask = 0; pStream->l2.eth.vlanMask = 0;
pStream->l2.eth.cvlanPrio = cmbCvlanPrio->currentIndex(); pStream->l2.eth.cvlanPrio = cmbCvlanPrio->currentIndex();
@ -568,6 +607,7 @@ void StreamConfigDialog::StoreCurrentStream()
pStream->l2.eth.vlanMask |= VM_SVLAN_TPID_OVERRIDE; pStream->l2.eth.vlanMask |= VM_SVLAN_TPID_OVERRIDE;
if (gbSvlan->isChecked()) if (gbSvlan->isChecked())
pStream->l2.eth.vlanMask |= VM_SVLAN_TAGGED; pStream->l2.eth.vlanMask |= VM_SVLAN_TAGGED;
#endif
} }
} }
@ -575,42 +615,48 @@ void StreamConfigDialog::StoreCurrentStream()
{ {
// L3 | IP // L3 | IP
{ {
pStream->l3.ip.ipMask = 0; IpProtocol *ip = pStream->ip();
IpProtocol::IpFlags f;
pStream->l3.ip.ver = leIpVersion->text().toULong(&isOk); ip->setVer(leIpVersion->text().toULong(&isOk));
if (cbIpVersionOverride->isChecked()) if (cbIpVersionOverride->isChecked())
pStream->l3.ip.ipMask |= IM_OVERRIDE_VERSION; f |= IpProtocol::IpOverrideVersion;
pStream->l3.ip.hdrLen = leIpHdrLen->text().toULong(&isOk); ip->setHdrLen(leIpHdrLen->text().toULong(&isOk));
if (cbIpHdrLenOverride->isChecked()) if (cbIpHdrLenOverride->isChecked())
pStream->l3.ip.ipMask |= IM_OVERRIDE_HDRLEN; f |= IpProtocol::IpOverrideHdrLen;
pStream->l3.ip.tos = leIpTos->text().toULong(&isOk, 16); ip->setTos(leIpTos->text().toULong(&isOk, 16));
pStream->l3.ip.totLen = leIpLength->text().toULong(&isOk); ip->setTotLen(leIpLength->text().toULong(&isOk));
if (cbIpLengthOverride->isChecked()) if (cbIpLengthOverride->isChecked())
pStream->l3.ip.ipMask |= IM_OVERRIDE_TOTLEN; f |= IpProtocol::IpOverrideHdrLen;
pStream->l3.ip.id = leIpId->text().remove(QChar(' ')).toULong(&isOk, 16); ip->setId(leIpId->text().remove(QChar(' ')).toULong(&isOk, 16));
pStream->l3.ip.fragOfs = leIpFragOfs->text().toULong(&isOk); ip->setFragOfs(leIpFragOfs->text().toULong(&isOk));
if (cbIpFlagsDf->isChecked()) pStream->l3.ip.ipMask |= IP_FLAG_DF;
if (cbIpFlagsMf->isChecked()) pStream->l3.ip.ipMask |= IP_FLAG_MF;
pStream->l3.ip.ttl = leIpTtl->text().toULong(&isOk); int ff;
pStream->l3.ip.proto = leIpProto->text().remove(QChar(' ')).toULong(&isOk, 16); if (cbIpFlagsDf->isChecked()) ff |= IP_FLAG_DF;
if (cbIpFlagsMf->isChecked()) ff |= IP_FLAG_MF;
ip->setFlags(ff);
pStream->l3.ip.cksum = leIpCksum->text().remove(QChar(' ')).toULong(&isOk); ip->setTtl(leIpTtl->text().toULong(&isOk));
ip->setProto(leIpProto->text().remove(QChar(' ')).toULong(&isOk, 16));
ip->setCksum(leIpCksum->text().remove(QChar(' ')).toULong(&isOk));
if (cbIpCksumOverride->isChecked()) if (cbIpCksumOverride->isChecked())
pStream->l3.ip.ipMask |= IM_OVERRIDE_CKSUM; f |= IpProtocol::IpOverrideCksum;
pStream->l3.ip.srcIp = QHostAddress(leIpSrcAddr->text()).toIPv4Address(); ip->setSrcIp(QHostAddress(leIpSrcAddr->text()).toIPv4Address());
pStream->l3.ip.srcIpMode = (Stream::IpAddrMode) cmbIpSrcAddrMode->currentIndex(); ip->setSrcIpMode((IpProtocol::IpAddrMode) cmbIpSrcAddrMode->currentIndex());
pStream->l3.ip.srcIpCount = leIpSrcAddrCount->text().toULong(&isOk); ip->setSrcIpCount(leIpSrcAddrCount->text().toULong(&isOk));
pStream->l3.ip.srcIpMask = QHostAddress(leIpSrcAddrMask->text()).toIPv4Address(); ip->setSrcIpMask(QHostAddress(leIpSrcAddrMask->text()).toIPv4Address());
pStream->l3.ip.dstIp = QHostAddress(leIpDstAddr->text()).toIPv4Address(); ip->setDstIp(QHostAddress(leIpDstAddr->text()).toIPv4Address());
pStream->l3.ip.dstIpMode = (Stream::IpAddrMode) cmbIpDstAddrMode->currentIndex(); ip->setDstIpMode((IpProtocol::IpAddrMode) cmbIpDstAddrMode->currentIndex());
pStream->l3.ip.dstIpCount = leIpDstAddrCount->text().toULong(&isOk); ip->setDstIpCount(leIpDstAddrCount->text().toULong(&isOk));
pStream->l3.ip.dstIpMask = QHostAddress(leIpDstAddrMask->text()).toIPv4Address(); ip->setDstIpMask(QHostAddress(leIpDstAddrMask->text()).toIPv4Address());
ip->setIpFlags(f);
} }
// L3 | ARP // L3 | ARP
@ -619,6 +665,8 @@ void StreamConfigDialog::StoreCurrentStream()
} }
} }
// TODO
#if 0
// L4 // L4
{ {
// L4 | TCP // L4 | TCP
@ -676,6 +724,7 @@ void StreamConfigDialog::StoreCurrentStream()
// TODO // TODO
} }
} }
#endif
} }
void StreamConfigDialog::on_pbOk_clicked() void StreamConfigDialog::on_pbOk_clicked()
{ {

View File

@ -37,6 +37,7 @@ private:
private slots: private slots:
void on_cmbDstMacMode_currentIndexChanged(QString mode); void on_cmbDstMacMode_currentIndexChanged(QString mode);
void on_cmbSrcMacMode_currentIndexChanged(QString mode);
void on_pbPrev_clicked(); void on_pbPrev_clicked();
void on_pbNext_clicked(); void on_pbNext_clicked();
@ -56,7 +57,7 @@ private slots:
void on_pbOk_clicked(); void on_pbOk_clicked();
}; };
QString & uintToHexStr(quint32 num, QString &hexStr, quint8 octets); QString & uintToHexStr(quint64 num, QString &hexStr, quint8 octets);
#endif #endif

View File

@ -33,7 +33,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<string/> <string/>
</property> </property>
<property name="currentIndex" > <property name="currentIndex" >
<number>2</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="widget" > <widget class="QWidget" name="widget" >
<attribute name="title" > <attribute name="title" >
@ -191,7 +191,7 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<item row="1" column="0" colspan="3" > <item row="1" column="0" colspan="3" >
<widget class="QTabWidget" name="twProto" > <widget class="QTabWidget" name="twProto" >
<property name="currentIndex" > <property name="currentIndex" >
<number>2</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="tab_7" > <widget class="QWidget" name="tab_7" >
<attribute name="title" > <attribute name="title" >
@ -2145,12 +2145,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>147</x> <x>252</x>
<y>238</y> <y>288</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>147</x> <x>252</x>
<y>238</y> <y>317</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2161,12 +2161,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>147</x> <x>252</x>
<y>238</y> <y>388</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>147</x> <x>252</x>
<y>238</y> <y>417</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2177,12 +2177,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>31</x>
<y>238</y> <y>259</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>41</x>
<y>238</y> <y>317</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2193,12 +2193,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>31</x>
<y>238</y> <y>259</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>81</x>
<y>238</y> <y>317</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2209,12 +2209,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>31</x>
<y>238</y> <y>259</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>133</x> <x>120</x>
<y>238</y> <y>317</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2225,12 +2225,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>31</x>
<y>238</y> <y>259</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>147</x> <x>252</x>
<y>238</y> <y>288</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2241,12 +2241,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>31</x>
<y>238</y> <y>359</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>41</x>
<y>238</y> <y>417</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2257,12 +2257,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>31</x>
<y>238</y> <y>359</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>120</x>
<y>238</y> <y>417</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2273,12 +2273,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>31</x>
<y>238</y> <y>359</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>147</x> <x>252</x>
<y>238</y> <y>388</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2289,12 +2289,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>31</x>
<y>238</y> <y>359</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>81</x>
<y>238</y> <y>417</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2305,12 +2305,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>123</x>
<y>276</y> <y>305</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>123</x>
<y>276</y> <y>305</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2321,12 +2321,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>123</x>
<y>276</y> <y>305</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>123</x>
<y>276</y> <y>305</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2401,12 +2401,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>123</x>
<y>276</y> <y>305</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>123</x>
<y>276</y> <y>305</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -2417,12 +2417,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>101</x> <x>123</x>
<y>276</y> <y>305</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>101</x> <x>123</x>
<y>276</y> <y>305</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -3121,12 +3121,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>224</x> <x>381</x>
<y>207</y> <y>140</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>224</x> <x>381</x>
<y>209</y> <y>174</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -3137,12 +3137,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>125</x> <x>30</x>
<y>207</y> <y>69</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>191</x> <x>85</x>
<y>236</y> <y>285</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -3153,12 +3153,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>125</x> <x>30</x>
<y>207</y> <y>94</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>173</x> <x>67</x>
<y>236</y> <y>331</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>
@ -3169,12 +3169,12 @@ QLineEdit:enabled[inputMask = "HH HH HH HH HH HH; "] { background-color: #ccccff
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel" >
<x>125</x> <x>30</x>
<y>207</y> <y>94</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel" >
<x>224</x> <x>222</x>
<y>216</y> <y>189</y>
</hint> </hint>
</hints> </hints>
</connection> </connection>

View File

@ -125,7 +125,7 @@ bool StreamModel::setData(const QModelIndex &index, const QVariant &value, int r
return true; return true;
break; break;
case StreamStatus: case StreamStatus:
mCurrentPort->mStreams[index.row()].setEnabled(value.toBool()); mCurrentPort->mStreams[index.row()].setIsEnabled(value.toBool());
return true; return true;
break; break;

14
common/Makefile Normal file
View File

@ -0,0 +1,14 @@
RM=del
PROTOC=protoc
#-#-#
all: protocol.pb.cc
protocol.pb.cc: protocol.proto
$(PROTOC) --cpp_out=. $<
clean:
$(RM) *.pb.h *.pb.cc
distclean: clean

302
common/protocol.proto Normal file
View File

@ -0,0 +1,302 @@
// stream.proto
// FIXME: Re-evaluate Tag Values
package OstProto;
// Ethernet
message Mac {
enum MacAddrMode {
e_mm_fixed = 0;
e_mm_inc = 1;
e_mm_dec = 2;
}
// Dst Mac
optional uint64 dst_mac = 1;
optional MacAddrMode dst_mac_mode = 2 [default = e_mm_fixed];
optional uint32 dst_mac_count = 3 [default = 16];
optional uint32 dst_mac_step = 4 [default = 1];
// Src Mac
optional uint32 src_mac = 5;
optional MacAddrMode src_mac_mode = 6 [default = e_mm_fixed];
optional uint32 src_mac_count = 7 [default = 16];
optional uint32 src_mac_step = 8 [default = 1];
}
message Llc {
optional uint32 dsap = 1;
optional uint32 ssap = 2;
optional uint32 ctl = 3;
}
message Snap {
optional uint32 oui = 1;
optional uint32 type = 2;
}
message Eth2 {
optional uint32 type = 1;
}
message Vlan {
// VLAN presence/absence
optional bool is_cvlan_tagged = 9;
optional bool is_ctpid_override = 10;
optional bool is_svlan_tagged = 11;
optional bool is_stpid_override = 12;
// VLAN values
optional uint32 ctpid = 13;
optional uint32 cvlan_tag = 14; // includes prio, cfi and cvlanid
optional uint32 stpid = 15;
optional uint32 svlan_tag = 16; // includes pcp, de and svlanid
}
// IP
message Ip {
enum IpAddrMode {
e_im_fixed = 0;
e_im_inc_host = 1;
e_im_dec_host = 2;
e_im_random_host = 3;
}
optional bool is_override_ver = 1;
optional bool is_override_hdrlen = 2;
optional bool is_override_totlen = 3;
optional bool is_override_cksum = 4;
optional uint32 ver_hdrlen = 5 [default = 0x45];
optional uint32 tos = 6;
optional uint32 tot_len = 7;
optional uint32 id = 8 [default = 1234];
// TODO: rename flags to frag_flags
optional uint32 flags = 9;
optional uint32 frag_ofs = 10;
optional uint32 ttl = 11 [default = 127];
optional uint32 proto = 12;
optional uint32 cksum = 13;
// Source IP
optional fixed32 src_ip = 14;
optional IpAddrMode src_ip_mode = 15 [default = e_im_fixed];
optional uint32 src_ip_count = 16 [default = 16];
optional fixed32 src_ip_mask = 17 [default = 0xFFFFFFFF];
// Destination IP
optional fixed32 dst_ip = 18;
optional IpAddrMode dst_ip_mode = 19 [default = e_im_fixed];
optional uint32 dst_ip_count = 20 [default = 16];
optional fixed32 dst_ip_mask = 21 [default = 0xFFFFFFFF];
// TODO: Options
}
message Arp {
// TODO: ARP
}
message Tcp {
optional bool is_override_hdrlen = 1;
optional bool is_override_cksum = 2;
optional uint32 src_port = 3 [default = 8902];
optional uint32 dst_port = 4 [default = 80];
optional uint32 seq_num = 5 [default = 129018];
optional uint32 ack_num = 6 [default = 98223];
optional uint32 hdrlen_rsvd = 7 [default = 0x50];
optional uint32 flags = 8;
optional uint32 window = 9 [default = 1024];
optional uint32 cksum = 10;
optional uint32 urg_ptr = 11;
}
// UDP
message Udp {
optional bool is_override_totlen = 1;
optional bool is_override_cksum = 2;
optional uint32 src_port = 3 [default = 8902];
optional uint32 dst_port = 4 [default = 80];
optional uint32 totLen = 5;
optional uint32 cksum = 6;
}
// TODO: ICMP
message Icmp {
}
// TODO: IGMP
message Igmp {
}
message StreamCore {
enum FrameType {
e_ft_none = 0;
e_ft_eth_2 = 1;
e_ft_802_3_raw = 2;
e_ft_802_3_llc = 3;
e_ft_snap = 4;
}
enum L3Proto {
e_l3_none = 0;
e_l3_other = 1;
e_l3_ip = 2;
e_l3_arp = 3;
}
enum L4Proto {
e_l4_none = 0;
e_l4_other = 1;
e_l4_tcp = 2;
e_l4_udp = 3;
e_l4_icmp = 4;
e_l4_igmp = 5;
}
enum DataPatternMode {
e_dp_fixed = 0;
e_dp_inc = 1;
e_dp_dec = 2;
e_dp_random = 3;
}
enum FrameLengthMode {
e_fl_fixed = 0;
e_fl_inc = 1;
e_fl_dec = 2;
e_fl_random = 3;
}
// Basics
optional string name = 1;
optional bool is_enabled = 2;
optional uint32 ordinal = 3;
// Data Pattern
optional DataPatternMode pattern_mode = 11;
optional uint32 pattern = 12;
optional uint32 data_start_ofs = 13;
// Frame Length (includes CRC)
optional FrameLengthMode len_mode = 14;
optional uint32 frame_len = 15;
optional uint32 frame_len_min = 16;
optional uint32 frame_len_max = 17;
// Currently Selected Protocols
optional FrameType ft = 21 [default = e_ft_none];
optional L3Proto l3_proto = 22;
optional L4Proto l4_proto = 23;
}
message StreamId {
required uint32 port_id = 1;
required uint32 stream_id = 2;
}
message Stream {
required StreamId id = 1;
optional StreamCore core = 2;
// Protocol data - L2
optional Mac mac = 51;
optional Llc llc = 52;
optional Snap snap = 53;
optional Eth2 eth2 = 54;
// Protocol data - L3
optional Ip ip = 61;
optional Arp arp = 62;
// Protocol data - L4
optional Tcp tcp = 71;
optional Udp udp = 72;
optional Icmp icmp = 73;
optional Igmp igmp = 74;
}
message Void {
// nothing!
}
message Ack {
// TODO
}
message PortIdList {
repeated uint32 port_id = 1;
}
message StreamIdList {
repeated StreamId id = 1;
}
message PortConfig {
required uint32 port_id = 1;
optional string name = 2;
optional string description = 3;
optional bool is_enabled = 4;
optional bool is_oper_up = 5;
optional bool is_exclusive_control = 6;
}
message PortConfigList {
repeated PortConfig list = 1;
}
message StreamConfigList {
repeated Stream stream = 1;
}
message CaptureBuffer {
// TODO
}
message CaptureBufferList {
repeated CaptureBuffer list = 1;
}
message PortStats {
// TODO
}
message PortStatsList {
repeated PortStats list = 1;
}
service OstService {
rpc getPortIdList(Void) returns (PortIdList);
rpc getPortConfig(PortIdList) returns (PortConfigList);
rpc getStreamIdList(PortIdList) returns (StreamIdList);
rpc getStreamConfig(StreamIdList) returns (StreamConfigList);
rpc addStream(StreamIdList) returns (Ack);
rpc deleteStream(StreamIdList) returns (Ack);
rpc modifyStream(StreamConfigList) returns (Ack);
rpc startTx(PortIdList) returns (Ack);
rpc stopTx(PortIdList) returns (Ack);
rpc startCapture(PortIdList) returns (Ack);
rpc stopCapture(PortIdList) returns (Ack);
rpc getCaptureBuffer(PortIdList) returns (CaptureBufferList);
rpc getStats(PortIdList) returns (PortStatsList);
rpc clearStats(PortIdList) returns (Ack);
}

66
rpc/pbhelper.h Normal file
View File

@ -0,0 +1,66 @@
#ifndef _PB_HELPER_H
#define _PB_HELPER_H
#include <google/protobuf/message.h>
#include <google/protobuf/descriptor.h>
#include <qDebug.h>
class PbHelper
{
public:
bool update(
::google::protobuf::Message *target,
::google::protobuf::Message *source)
{
::google::protobuf::Message::Reflection *sourceRef;
::google::protobuf::Message::Reflection *targetRef;
std::vector<const ::google::protobuf::FieldDescriptor*> srcFieldList;
qDebug("In %s", __FUNCTION__);
if (source->GetDescriptor()->full_name() !=
target->GetDescriptor()->full_name())
goto _error_exit;
sourceRef = source->GetReflection();
targetRef = target->GetReflection();
sourceRef->ListFields(&srcFieldList);
for (uint i=0; i < srcFieldList.size(); i++)
{
const ::google::protobuf::FieldDescriptor *srcField, *targetField;
srcField = srcFieldList[i];
targetField = target->GetDescriptor()->FindFieldByName(
srcField->name());
switch(targetField->type())
{
case ::google::protobuf::FieldDescriptor::TYPE_UINT32:
targetRef->SetUInt32(targetField,
sourceRef->GetUInt32(srcField));
break;
case ::google::protobuf::FieldDescriptor::TYPE_BOOL:
targetRef->SetBool(targetField,
sourceRef->GetBool(srcField));
break;
case ::google::protobuf::FieldDescriptor::TYPE_STRING:
targetRef->SetString(targetField,
sourceRef->GetString(srcField));
break;
default:
qDebug("unhandled Field Type");
break;
}
}
return true;
_error_exit:
qDebug("%s: error!", __FUNCTION__);
return false;
}
};
#endif

13
rpc/pbrpc.pro Normal file
View File

@ -0,0 +1,13 @@
TEMPLATE = lib
CONFIG += qt
QT += network
DEFINES += HAVE_REMOTE
INCLUDEPATH += "c:\msys\1.0\local\include"
LIBS += -L"C:\msys\1.0\local\lib" -lprotobuf
HEADERS += rpcserver.h pbrpccontroller.h pbrpcchannel.h
SOURCES += rpcserver.cpp pbrpcchannel.cpp
client.path = ..\client\debug
client.files = debug\libpbrpc.a debug\pbrpc.dll
server.path = ..\server\debug
server.files = debug\libpbrpc.a debug\pbrpc.dll
INSTALLS += client server

189
rpc/pbrpcchannel.cpp Normal file
View File

@ -0,0 +1,189 @@
#include "pbrpcchannel.h"
//#include "../common/protocol.pb.h"
PbRpcChannel::PbRpcChannel(QHostAddress ip, quint16 port)
{
isPending = false;
pendingMethodId = -1; // don't care as long as isPending is false
controller = NULL;
done = NULL;
response = NULL;
mServerAddress = ip;
mServerPort = port;
mpSocket = new QTcpSocket(this);
// FIXME: Not quite sure why this ain't working!
// QMetaObject::connectSlotsByName(this);
connect(mpSocket, SIGNAL(connected()),
this, SLOT(on_mpSocket_connected()));
connect(mpSocket, SIGNAL(disconnected()),
this, SLOT(on_mpSocket_disconnected()));
connect(mpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
this, SLOT(on_mpSocket_stateChanged(QAbstractSocket::SocketState)));
connect(mpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(on_mpSocket_error(QAbstractSocket::SocketError)));
connect(mpSocket, SIGNAL(readyRead()),
this, SLOT(on_mpSocket_readyRead()));
}
PbRpcChannel::~PbRpcChannel()
{
delete mpSocket;
}
void PbRpcChannel::establish()
{
qDebug("In %s", __FUNCTION__);
mpSocket->connectToHost(mServerAddress, mServerPort);
}
void PbRpcChannel::establish(QHostAddress ip, quint16 port)
{
mServerAddress = ip;
mServerPort = port;
establish();
}
void PbRpcChannel::tearDown()
{
qDebug("In %s", __FUNCTION__);
mpSocket->disconnectFromHost();
}
void PbRpcChannel::CallMethod(
const ::google::protobuf::MethodDescriptor *method,
::google::protobuf::RpcController *controller,
const ::google::protobuf::Message *req,
::google::protobuf::Message *response,
::google::protobuf::Closure* done)
{
char msg[1024]; // FIXME: hardcoding
char *p = (char *)&msg;
int len;
qDebug("In %s", __FUNCTION__);
pendingMethodId = method->index();
this->controller=controller;
this->done=done;
this->response=response;
isPending = true;
*((quint16*)(p+0)) = HTONS(PB_MSG_TYPE_REQUEST); // type
qDebug("CLi:GET16 = %d/%d, type = %d", GET16(p+0), NTOHS(GET16(p+0)),
PB_MSG_TYPE_REQUEST);
*((quint16*)(p+2)) = HTONS(method->index()); // method id
// (p+4) len later after serialization
*((quint16*)(p+6)) = HTONS(0); // rsvd
// SerialData is at offset 8
req->SerializeToArray((void*) (p+8), sizeof(msg));
len = req->ByteSize();
*((quint16*)(p+4)) = HTONS(len); // len
qDebug("client(%s) sending %d bytes encoding <%s>", __FUNCTION__, len+8,
req->ShortDebugString().c_str());
BUFDUMP(msg, len+8);
mpSocket->write(msg, len + 8);
}
void PbRpcChannel::on_mpSocket_readyRead()
{
char msg[1024]; // FIXME: hardcoding;
char *p = (char*)&msg;
int msgLen;
quint16 type, method, len, rsvd;
PbRpcController *controller;
qDebug("In %s", __FUNCTION__);
msgLen = mpSocket->read(msg, sizeof(msg));
qDebug("client(%s) rcvd %d bytes", __FUNCTION__, msgLen);
BUFDUMP(msg, msgLen);
type = NTOHS(GET16(p+0));
method = NTOHS(GET16(p+2));
len = NTOHS(GET16(p+4));
rsvd = NTOHS(GET16(p+6));
if (!isPending)
{
qDebug("not waiting for response");
goto _error_exit;
}
if (type != PB_MSG_TYPE_RESPONSE)
{
qDebug("invalid msgType %d (expected = %d)", type,
PB_MSG_TYPE_RESPONSE);
goto _error_exit;
}
if (pendingMethodId != method)
{
qDebug("invalid method id %d (expected = %d)", method,
pendingMethodId);
goto _error_exit;
}
// Serialized data starts from offset 8
response->ParseFromArray((void*) &msg[8], len);
qDebug("client(%s): Parsed as %s", __FUNCTION__,
response->DebugString().c_str());
pendingMethodId = -1;
controller = NULL;
//done = NULL;
response = NULL;
isPending = false;
done->Run();
return;
_error_exit:
qDebug("client(%s) discarding received msg", __FUNCTION__);
return;
}
void PbRpcChannel::on_mpSocket_stateChanged(
QAbstractSocket::SocketState socketState)
{
qDebug("In %s", __FUNCTION__);
emit stateChanged(socketState);
}
void PbRpcChannel::on_mpSocket_connected()
{
qDebug("In %s", __FUNCTION__);
emit connected();
}
void PbRpcChannel::on_mpSocket_disconnected()
{
qDebug("In %s", __FUNCTION__);
emit disconnected();
}
void PbRpcChannel::on_mpSocket_error(QAbstractSocket::SocketError socketError)
{
qDebug("In %s", __FUNCTION__);
emit error(socketError);
}

74
rpc/pbrpcchannel.h Normal file
View File

@ -0,0 +1,74 @@
#ifndef _PB_RPC_CHANNEL_H
#define _PB_RPC_CHANNEL_H
#include <QTcpServer>
#include <QTcpSocket>
#include <google/protobuf/message.h>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/service.h>
#include "pbrpccommon.h"
#include "pbrpccontroller.h"
class PbRpcChannel : public QObject, public ::google::protobuf::RpcChannel
{
Q_OBJECT
// If isPending is TRUE, then controller, done, response
// and pendingMethodId correspond to the last method called by
// the service stub
bool isPending;
int pendingMethodId;
// controller, done, response are set to the corresponding values
// passed by the stub to CallMethod(). They are reset to NULL when
// we get a response back from the server in on_mpSocket_readyRead()
// after calling done->Run().
//
// TODO(?): change controller, done and response to references
// instead of pointers?
::google::protobuf::RpcController *controller;
::google::protobuf::Closure *done;
::google::protobuf::Message *response;
QHostAddress mServerAddress;
quint16 mServerPort;
QTcpSocket *mpSocket;
public:
PbRpcChannel(QHostAddress ip, quint16 port);
~PbRpcChannel();
void establish();
void establish(QHostAddress ip, quint16 port);
void tearDown();
const QHostAddress& serverAddress() const { return mServerAddress; }
quint16 serverPort() const { return mServerPort; }
QAbstractSocket::SocketState state() const
{ return mpSocket->state(); }
void CallMethod(const ::google::protobuf::MethodDescriptor *method,
::google::protobuf::RpcController *controller,
const ::google::protobuf::Message *req,
::google::protobuf::Message *response,
::google::protobuf::Closure* done);
signals:
void connected();
void disconnected();
void error(QAbstractSocket::SocketError socketError);
void stateChanged(QAbstractSocket::SocketState socketState);
private slots:
void on_mpSocket_connected();
void on_mpSocket_disconnected();
void on_mpSocket_stateChanged(QAbstractSocket::SocketState socketState);
void on_mpSocket_error(QAbstractSocket::SocketError socketError);
void on_mpSocket_readyRead();
};
#endif

52
rpc/pbrpccommon.h Normal file
View File

@ -0,0 +1,52 @@
#ifndef _PB_RPC_COMMON_H
#define _PB_RPC_COMMON_H
// FIXME: check which one is right - wrong one seems to be working!!!!!
#if 0
#define GET16(p) (quint16)( \
(*((quint8*)(p)+0) << 8 ) \
| (*((quint8*)(p)+1)))
#else
#define GET16(p) (quint16)( \
(*((quint8*)(p)+1) << 8 ) \
| (*((quint8*)(p)+0)))
#endif
#define BYTESWAP4(x) \
(((x & 0xFF000000) >> 24) | \
((x & 0x00FF0000) >> 8) | \
((x & 0x0000FF00) << 8) | \
((x & 0x000000FF) << 24))
#define BYTESWAP2(x) \
(((x & 0xFF00) >> 8) | \
((x & 0x00FF) << 8))
// TODO: portability
#if 1
#define HTONL(x) BYTESWAP4(x)
#define NTOHL(x) BYTESWAP4(x)
#define HTONS(x) BYTESWAP2(x)
#define NTOHS(x) BYTESWAP2(x)
#else
#define HTONL(x) (x)
#define NTOHL(x) (x)
#define HTONS(x) (x)
#define NTOHS(x) (x)
#endif
// Print a HexDump
#define BUFDUMP(ptr, len) qDebug("%s", QString(QByteArray((char*)(ptr), \
(len)).toHex()).toAscii().data());
/*
** RPC Header (8)
** - MSG_TYPE (2)
** - METHOD_ID (2)
** - LEN (2) [not including this header]
** - RSVD (2)
*/
#define PB_MSG_TYPE_REQUEST 1
#define PB_MSG_TYPE_RESPONSE 2
#endif

27
rpc/pbrpccontroller.h Normal file
View File

@ -0,0 +1,27 @@
#ifndef _PB_RPC_CONTROLLER_H
#define _PB_RPC_CONTROLLER_H
#include <google/protobuf/service.h>
class PbRpcController : public ::google::protobuf::RpcController
{
bool failed;
std::string errStr;
public:
PbRpcController() { failed = false; }
// Client Side Methods
void Reset() { failed=false;}
bool Failed() const { return failed; }
void StartCancel() { /* TODO */}
std::string ErrorText() const { return errStr; }
// Server Side Methods
void SetFailed(const std::string &reason)
{ failed = true; errStr = reason; }
bool IsCanceled() const { return false; };
void NotifyOnCancel(::google::protobuf::Closure *callback) { /*TODO*/ }
};
#endif

180
rpc/rpcserver.cpp Normal file
View File

@ -0,0 +1,180 @@
#include "pbhelper.h"
#include "rpcserver.h"
RpcServer::RpcServer()
{
server = NULL;
clientSock = NULL;
service = NULL;
isPending = false;
pendingMethodId = -1; // don't care as long as isPending is false
}
RpcServer::~RpcServer()
{
if (server)
delete server;
}
bool RpcServer::registerService(::google::protobuf::Service *service,
quint16 tcpPortNum)
{
this->service = service;
server = new QTcpServer();
connect(server, SIGNAL(newConnection()), this, SLOT(when_newConnection()));
if (!server->listen(QHostAddress::Any, tcpPortNum))
{
LogInt(tr("Unable to start the server: %1").arg(server->errorString()));
return false;
}
LogInt(tr("The server is running on %1:%2").arg(server->serverAddress().toString()).arg(server->serverPort()));
return true;
}
void RpcServer::done(::google::protobuf::Message *resp, PbRpcController *PbRpcController)
{
char msg[1024]; // FIXME: hardcoding
char *p = (char *)&msg;
int len;
qDebug("In RpcServer::done");
// TODO: check PbRpcController to see if method failed
if (PbRpcController->Failed())
{
qDebug("rpc failed");
goto _exit;
}
*((quint16*)(p+0)) = HTONS(PB_MSG_TYPE_RESPONSE); // type TODO:RESPONSE
*((quint16*)(p+2)) = HTONS(pendingMethodId); // method
*((quint16*)(p+6)) = HTONS(0); // rsvd
// SerialData is at offset 8
resp->SerializeToArray((void*) (p+8), sizeof(msg));
len = resp->ByteSize();
(*(quint16*)(p+4)) = HTONS(len); // len
qDebug("Server(%s): sending %d bytest to client encoding <%s>",
__FUNCTION__, len + 8, resp->DebugString().c_str());
BUFDUMP(msg, len + 8);
clientSock->write(msg, len + 8);
_exit:
delete PbRpcController;
isPending = false;
}
void RpcServer::when_newConnection()
{
if (clientSock)
{
QTcpSocket *sock;
LogInt(tr("already connected, no new connections will be accepted\n"));
// Accept and close connection
// TODO: Send reason msg to client
sock = server->nextPendingConnection();
sock->disconnectFromHost();
sock->deleteLater();
goto _exit;
}
clientSock = server->nextPendingConnection();
LogInt(tr("accepting new connection from %1:%2").arg(clientSock->peerAddress().toString()).arg(clientSock->peerPort()));
connect(clientSock, SIGNAL(readyRead()),
this, SLOT(when_dataAvail()));
connect(clientSock, SIGNAL(disconnected()),
this, SLOT(when_disconnected()));
connect(clientSock, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(when_error(QAbstractSocket::SocketError)));
_exit:
return;
}
void RpcServer::when_disconnected()
{
LogInt(tr("connection closed from %1:%2").arg(clientSock->peerAddress().toString()).arg(clientSock->peerPort()));
clientSock->deleteLater();
clientSock = NULL;
}
void RpcServer::when_error(QAbstractSocket::SocketError socketError)
{
LogInt(clientSock->errorString());
}
void RpcServer::when_dataAvail()
{
char msg[1024]; // FIXME: hardcoding;
int msgLen;
char *p = (char*) &msg;
quint16 type, method, len, rsvd;
const ::google::protobuf::MethodDescriptor *methodDesc;
::google::protobuf::Message *req, *resp;
PbRpcController *controller;
msgLen = clientSock->read(msg, sizeof(msg));
LogInt(QString(QByteArray(msg, msgLen).toHex()));
qDebug("Server %s: rcvd %d bytes", __FUNCTION__, msgLen);
BUFDUMP(msg, msgLen);
type = NTOHS(GET16(p+0));
qDebug("GET16 = %d/%d, type = %d", GET16(p+0), NTOHS(GET16(p+0)), type);
method = NTOHS(GET16(p+2));
len = NTOHS(GET16(p+4));
rsvd = NTOHS(GET16(p+6));
if (type != PB_MSG_TYPE_REQUEST)
{
qDebug("server(%s): unexpected msg type %d (expected %d)", __FUNCTION__,
type, PB_MSG_TYPE_REQUEST);
goto _error_exit;
}
methodDesc = service->GetDescriptor()->method(method);
if (!methodDesc)
{
qDebug("server(%s): invalid method id %d", __FUNCTION__, method);
goto _error_exit; // TODO: Return Error to client
}
if (isPending)
{
qDebug("server(%s): rpc pending, try again", __FUNCTION__);
goto _error_exit; // TODO: Return Error to client
}
pendingMethodId = method;
isPending = true;
req = service->GetRequestPrototype(methodDesc).New();
resp = service->GetResponsePrototype(methodDesc).New();
// Serialized data starts from offset 8
req->ParseFromArray((void*) (msg+8), len);
controller = new PbRpcController;
service->CallMethod(methodDesc, controller, req, resp,
NewCallback(this, &RpcServer::done, resp, controller));
return;
_error_exit:
qDebug("server(%s): discarding msg from client", __FUNCTION__);
return;
}

44
rpc/rpcserver.h Normal file
View File

@ -0,0 +1,44 @@
#ifndef _RPC_SERVER_H
#define _RPC_SERVER_H
#include <google/protobuf/message.h>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/service.h>
#include <QTcpServer>
#include <QTcpSocket>
#include "pbrpccommon.h"
#include "pbrpccontroller.h"
class RpcServer : public QObject
{
Q_OBJECT
QTcpServer *server;
QTcpSocket *clientSock;
::google::protobuf::Service *service;
bool isPending;
int pendingMethodId;
void LogInt (QString log) {qDebug("%s", log.toAscii().data());}
public:
RpcServer(); // TODO: use 'parent' param
virtual ~RpcServer();
bool registerService(::google::protobuf::Service *service,
quint16 tcpPortNum);
void done(::google::protobuf::Message *resp, PbRpcController *controller);
private slots:
void when_newConnection();
void when_disconnected();
void when_dataAvail();
void when_error(QAbstractSocket::SocketError socketError);
};
#endif

View File

@ -5,7 +5,9 @@ class AbstractHost
{ {
public: public:
virtual void Log(const char* str) = 0; virtual void Log(const char* str) = 0;
#if 0 // PB
virtual int SendMsg(const void* msg, int size) = 0; virtual int SendMsg(const void* msg, int size) = 0;
#endif
}; };
#endif #endif

View File

@ -6,13 +6,19 @@ Drone::Drone(QDialog *parent)
: QDialog(parent) : QDialog(parent)
{ {
ui.setupUi(this); ui.setupUi(this);
#if 0 // PB
rxtx = new RxTx(this);
#endif
rpcServer = new RpcServer();
service = new MyService(this);
rpcServer->registerService(service, myport?myport:7878);
#if 0 // PB
serverPortNum = DRONE_PORT; serverPortNum = DRONE_PORT;
clientSock = NULL; clientSock = NULL;
if (myport) if (myport)
serverPortNum = myport; serverPortNum = myport);
rxtx = new RxTx(this);
server = new QTcpServer(this); server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(when_newConnection())); connect(server, SIGNAL(newConnection()), this, SLOT(when_newConnection()));
@ -21,6 +27,7 @@ Drone::Drone(QDialog *parent)
LogInt(tr("Unable to start the server: %1").arg(server->errorString())); LogInt(tr("Unable to start the server: %1").arg(server->errorString()));
else else
LogInt(tr("The server is running on %1:%2").arg(server->serverAddress().toString()).arg(server->serverPort())); LogInt(tr("The server is running on %1:%2").arg(server->serverAddress().toString()).arg(server->serverPort()));
#endif
} }
void Drone::Log(const char* str) void Drone::Log(const char* str)
@ -28,17 +35,20 @@ void Drone::Log(const char* str)
ui.teLog->append(QString(str)); ui.teLog->append(QString(str));
} }
#if 0 // PB
int Drone::SendMsg(const void* msg, int size) int Drone::SendMsg(const void* msg, int size)
{ {
qDebug("Inside SendMsg\n"); qDebug("Inside SendMsg\n");
clientSock->write((char*) msg, size); clientSock->write((char*) msg, size);
} }
#endif
void Drone::LogInt(const QString &str) void Drone::LogInt(const QString &str)
{ {
ui.teLog->append(str); ui.teLog->append(str);
} }
#if 0 // PB
void Drone::when_newConnection() void Drone::when_newConnection()
{ {
if (clientSock) if (clientSock)
@ -83,3 +93,4 @@ void Drone::when_error(QAbstractSocket::SocketError socketError)
{ {
LogInt(clientSock->errorString()); LogInt(clientSock->errorString());
} }
#endif

View File

@ -5,7 +5,11 @@
#include <QTcpSocket> #include <QTcpSocket>
#include "ui_drone.h" #include "ui_drone.h"
#include "abstracthost.h" #include "abstracthost.h"
#if 0 // PB
#include "rxtx.h" #include "rxtx.h"
#endif
#include "rpcserver.h"
#include "myservice.h"
class Drone : public QDialog, AbstractHost class Drone : public QDialog, AbstractHost
@ -13,24 +17,31 @@ class Drone : public QDialog, AbstractHost
Q_OBJECT Q_OBJECT
public: public:
Ui::Drone ui;
Drone(QDialog *parent = 0); Drone(QDialog *parent = 0);
void Log(const char *msg); void Log(const char *msg);
#if 0 // PB
int SendMsg(const void* msg, int msgLen); int SendMsg(const void* msg, int msgLen);
#endif
Ui::Drone ui;
private: private:
#if 0 // PB
RxTx *rxtx; RxTx *rxtx;
#endif
RpcServer *rpcServer;
OstProto::OstService *service;
void LogInt(const QString &msg);
#if 0 // PB
QTcpServer *server; QTcpServer *server;
QTcpSocket *clientSock; QTcpSocket *clientSock;
#define DRONE_PORT 7878 #define DRONE_PORT 7878
quint16 serverPortNum; quint16 serverPortNum;
// Ui::Drone ui;
void LogInt(const QString &msg);
private slots: private slots:
void when_newConnection(); void when_newConnection();
void when_disconnected(); void when_disconnected();
void when_dataAvail(); void when_dataAvail();
void when_error(QAbstractSocket::SocketError socketError); void when_error(QAbstractSocket::SocketError socketError);
#endif
}; };
#endif #endif

View File

@ -2,8 +2,14 @@ TEMPLATE = app
CONFIG += qt CONFIG += qt
QT += network QT += network
DEFINES += HAVE_REMOTE DEFINES += HAVE_REMOTE
INCLUDEPATH += "c:\msys\1.0\local\include"
INCLUDEPATH += "C:\DevelLibs\WpdPack\Include" INCLUDEPATH += "C:\DevelLibs\WpdPack\Include"
INCLUDEPATH += "..\rpc"
LIBS += -L"C:\DevelLibs\WpdPack\Lib" -lwpcap LIBS += -L"C:\DevelLibs\WpdPack\Lib" -lwpcap
LIBS += -L"..\rpc\debug" -lpbrpc
HEADERS += drone.h HEADERS += drone.h
FORMS += drone.ui FORMS += drone.ui
SOURCES += drone_main.cpp drone.cpp rxtx.cpp SOURCES += drone_main.cpp drone.cpp
SOURCES += myservice.cpp
SOURCES += "..\common\protocol.pb.cc"

290
server/myservice.cpp Normal file
View File

@ -0,0 +1,290 @@
#include "myservice.h"
#include "qdebug.h"
#define LOG(...) {sprintf(logStr, __VA_ARGS__); host->Log(logStr);}
MyService::MyService(AbstractHost *host)
{
pcap_if_t *dev;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];
// Init Data
this->host = host;
numPorts = 0;
alldevs = NULL;
LOG("Retrieving the device list from the local machine\n");
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
LOG("Error in pcap_findalldevs_ex: %s\n", errbuf);
goto _fail;
}
/* Count number of local ports */
for(dev = alldevs; dev != NULL; dev = dev->next)
numPorts++;
portInfo = new PortInfo[numPorts];
/* Populate and Print the list */
for(i=0, dev=alldevs; dev!=NULL; i++, dev=dev->next)
{
#if 0 // PB
//portInfo[i].portId = i;
//portInfo[i].dev = dev;
//portInfo[i].streamHead = NULL;
//portInfo[i].streamTail = NULL;
#endif
portInfo[i].setId(i);
portInfo[i].setPcapDev(dev);
#if 1
LOG("%d. %s", i, dev->name);
if (dev->description)
{
LOG(" (%s)\n", dev->description);
}
else
LOG(" (No description available)\n");
#endif
}
if (i == 0)
{
LOG("\nNo interfaces found! Make sure WinPcap is installed.\n");
goto _fail;
}
_fail:
return;
}
MyService::~MyService()
{
unsigned int i;
#if 0 // PB?????
for (i = 0; i < numPorts; i++)
DeleteAllStreams(i);
#endif
pcap_freealldevs(alldevs);
}
void MyService::getPortIdList(
::google::protobuf::RpcController* controller,
const ::OstProto::Void* request,
::OstProto::PortIdList* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
for (uint i = 0; i < numPorts; i++)
response->add_port_id(portInfo[i].d.port_id());
qDebug("Server(%s): portid count = %d", __FUNCTION__, response->port_id_size());
qDebug("Server(%s): %s", __FUNCTION__, response->DebugString().c_str());
done->Run();
}
void MyService::getPortConfig(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::PortConfigList* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
for (int i=0; i < request->port_id_size(); i++)
{
unsigned int id;
id = request->port_id(i);
if (id < numPorts)
{
OstProto::PortConfig *p;
p = response->add_list();
p->CopyFrom(portInfo[request->port_id(i)].d);
}
}
done->Run();
}
void MyService::getStreamIdList(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::StreamIdList* response,
::google::protobuf::Closure* done)
{
for (int i = 0; i < request->port_id_size(); i++)
{
unsigned int portId;
portId = request->port_id(i);
if (portId >= numPorts)
{
qDebug("%s: Invalid port id %d", __FUNCTION__, portId);
continue; // TODO: Partial status of RPC
}
for (int j = 0; j < portInfo[portId].streamList.size(); j++)
{
OstProto::StreamId *s, *q;
q = portInfo[portId].streamList[j].d.mutable_id();
assert(q->port_id() == portId);
s = response->add_id();
s->set_port_id(portId);
s->set_stream_id(q->stream_id());
}
}
done->Run();
}
void MyService::getStreamConfig(::google::protobuf::RpcController* controller,
const ::OstProto::StreamIdList* request,
::OstProto::StreamConfigList* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
for (int i = 0; i < request->id_size(); i++)
{
unsigned int portId;
unsigned int streamId;
portId = request->id(i).port_id();
if (portId >= numPorts)
{
qDebug("%s: Invalid port id %d", __FUNCTION__, portId);
continue; // TODO: Partial status of RPC
}
streamId = request->id(i).stream_id();
if (streamId >= numPorts)
{
qDebug("%s: Invalid port id %d", __FUNCTION__, portId);
continue; // TODO: Partial status of RPC
}
for (int j = 0; j < portInfo[portId].streamList.size(); j++)
{
OstProto::Stream *s, *q;
#if 0
q = portInfo[portId].streamList[j].d.e_stream();
assert(q->port_id() == portId);
s = response->add_stream();
s->set_port_id(portId);
s->set_stream_id(q->stream_id());
#endif
// TODO: more params
}
}
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::addStream(::google::protobuf::RpcController* controller,
const ::OstProto::StreamIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::deleteStream(::google::protobuf::RpcController* controller,
const ::OstProto::StreamIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::modifyStream(::google::protobuf::RpcController* controller,
const ::OstProto::StreamConfigList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::startTx(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::stopTx(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::startCapture(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::stopCapture(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::getCaptureBuffer(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::CaptureBufferList* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::getStats(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::PortStatsList* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}
void MyService::clearStats(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done)
{
qDebug("In %s", __FUNCTION__);
controller->SetFailed("Not Implemented");
done->Run();
}

146
server/myservice.h Normal file
View File

@ -0,0 +1,146 @@
#ifndef _MY_SERVICE_H
#define _MY_SERVICE_H
#if 0
#include <google/protobuf/message.h>
#include <google/protobuf/service.h>
#endif
#include "../common/protocol.pb.h"
#include "abstracthost.h"
#include <pcap.h>
#include <QList>
#define MAX_PKT_HDR_SIZE 1536
#define MAX_STREAM_NAME_SIZE 64
class MyService;
class StreamInfo
{
friend class MyService;
OstProto::Stream d;
#if 0 // PB
unsigned int id;
char name[MAX_STREAM_NAME_SIZE];
unsigned char pktHdr[MAX_PKT_HDR_SIZE];
unsigned short hdrLen;
unsigned short pktLen;
unsigned int dataPattern;
unsigned int flags;
#define STREAM_FLAG_MASK_STATUS 0x00000001
#define STREAM_FLAG_VALUE_STATUS_DISABLED 0x00000000
#define STREAM_FLAG_VALUE_STATUS_ENABLED 0x00000001
struct _Stream *next;
#endif
};
class PortInfo
{
friend class MyService;
OstProto::PortConfig d;
pcap_if_t *dev;
QList<StreamInfo> streamList;
#if 0 // PB
unsigned int portId; // FIXME:need?
Stream *streamHead;
Stream *streamTail;
#endif
public:
// TODO(LOW): Both setId and setPcapDev() should together form the ctor
void setId(unsigned int id) { d.set_port_id(id); }
void setPcapDev(pcap_if_t *dev)
{
this->dev = dev;
d.set_name("eth"); // FIXME: suffix portid
d.set_description(dev->description);
d.set_is_enabled(true); // FIXME:check
d.set_is_oper_up(true); // FIXME:check
d.set_is_exclusive_control(false); // FIXME: check
}
};
class MyService: public OstProto::OstService
{
AbstractHost *host;
char logStr[1024];
unsigned numPorts;
PortInfo *portInfo;
pcap_if_t *alldevs;
public:
MyService(AbstractHost* host);
virtual ~MyService();
//static const ::google::protobuf::ServiceDescriptor* descriptor();
virtual void getPortIdList(::google::protobuf::RpcController* controller,
const ::OstProto::Void* request,
::OstProto::PortIdList* response,
::google::protobuf::Closure* done);
virtual void getPortConfig(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::PortConfigList* response,
::google::protobuf::Closure* done);
virtual void getStreamIdList(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::StreamIdList* response,
::google::protobuf::Closure* done);
virtual void getStreamConfig(::google::protobuf::RpcController* controller,
const ::OstProto::StreamIdList* request,
::OstProto::StreamConfigList* response,
::google::protobuf::Closure* done);
virtual void addStream(::google::protobuf::RpcController* controller,
const ::OstProto::StreamIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done);
virtual void deleteStream(::google::protobuf::RpcController* controller,
const ::OstProto::StreamIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done);
virtual void modifyStream(::google::protobuf::RpcController* controller,
const ::OstProto::StreamConfigList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done);
virtual void startTx(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done);
virtual void stopTx(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done);
virtual void startCapture(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done);
virtual void stopCapture(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done);
virtual void getCaptureBuffer(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::CaptureBufferList* response,
::google::protobuf::Closure* done);
virtual void getStats(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::PortStatsList* response,
::google::protobuf::Closure* done);
virtual void clearStats(::google::protobuf::RpcController* controller,
const ::OstProto::PortIdList* request,
::OstProto::Ack* response,
::google::protobuf::Closure* done);
};
#endif

View File

@ -1,6 +1,12 @@
File Not used anymore
#if 0
#include "qtglobal" // FIXME: needed only for qdebug #include "qtglobal" // FIXME: needed only for qdebug
#include "rxtx.h" #include "rxtx.h"
#if 0 // PB
#include "../common/protocol.h" #include "../common/protocol.h"
#endif
@ -157,7 +163,9 @@ void RxTx::SendCapabilityInfo(void)
} }
host->Log("Sending msg\n"); host->Log("Sending msg\n");
host->Log(logStr); host->Log(logStr);
#if 0 // PB
host->SendMsg(pktBuff, msgLen); host->SendMsg(pktBuff, msgLen);
#endif
} }
void RxTx::ProcessPortConfig(const char* msg, int len) void RxTx::ProcessPortConfig(const char* msg, int len)
@ -503,4 +511,4 @@ Stream* RxTx::GetStream(unsigned int port, unsigned int streamId)
return NULL; return NULL;
} }
#endif

View File

@ -1,9 +1,16 @@
File not used anymore
#if 0
#ifndef _RXTX_H #ifndef _RXTX_H
#define _RXTX_H #define _RXTX_H
#include "pcap.h" #include "pcap.h"
#include "abstracthost.h" #include "abstracthost.h"
#include "../common/protocol.h"
#define GET16(x) (UINT16)( \ #define GET16(x) (UINT16)( \
(*((UINT8*)x+0) << 16 ) \ (*((UINT8*)x+0) << 16 ) \
| (*((UINT8*)x+1))) | (*((UINT8*)x+1)))
@ -74,3 +81,4 @@ class RxTx
}; };
#endif #endif
#endif