Track smac/dmac resolve failures when building packet list

This commit is contained in:
Srivats P 2019-02-05 18:31:43 +05:30
parent 2726192b9c
commit 88b3c287d0
8 changed files with 113 additions and 10 deletions

View File

@ -596,7 +596,8 @@ int AbstractProtocol::protocolFramePayloadSize(int streamIndex) const
the FrameValue of all the 'frame' fields of the protocol also taking care of
fields which are not an integral number of bytes\n
*/
QByteArray AbstractProtocol::protocolFrameValue(int streamIndex, bool forCksum) const
QByteArray AbstractProtocol::protocolFrameValue(int streamIndex, bool forCksum,
FrameValueAttrib */*attrib*/) const
{
QByteArray proto, field;
uint bits, lastbitpos = 0;

View File

@ -36,6 +36,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#define BASE_DEC (10)
#define BASE_HEX (16)
class FrameValueAttrib;
class StreamBase;
class ProtocolListIterator;
@ -147,8 +148,8 @@ public:
const OstProto::VariableField& variableField(int index) const;
OstProto::VariableField* mutableVariableField(int index);
QByteArray protocolFrameValue(int streamIndex = 0,
bool forCksum = false) const;
virtual QByteArray protocolFrameValue(int streamIndex = 0,
bool forCksum = false, FrameValueAttrib *attrib = nullptr) const;
virtual int protocolFrameSize(int streamIndex = 0) const;
int protocolFrameOffset(int streamIndex = 0) const;
int protocolFramePayloadSize(int streamIndex = 0) const;

49
common/framevalueattrib.h Normal file
View File

@ -0,0 +1,49 @@
/*
Copyright (C) 2019 Srivats P.
This file is part of "Ostinato"
This is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
#ifndef _FRAME_VALUE_ATTRIB_H
#define _FRAME_VALUE_ATTRIB_H
#include <QFlags>
struct FrameValueAttrib
{
enum ErrorFlag {
UnresolvedSrcMacError = 0x1,
UnresolvedDstMacError = 0x2,
};
Q_DECLARE_FLAGS(ErrorFlags, ErrorFlag);
ErrorFlags errorFlags{0};
// TODO?: int len;
FrameValueAttrib& operator+=(const FrameValueAttrib& rhs) {
errorFlags |= rhs.errorFlags;
return *this;
}
FrameValueAttrib operator+(const FrameValueAttrib& rhs) {
FrameValueAttrib result = *this;
result += rhs;
return result;
}
};
Q_DECLARE_OPERATORS_FOR_FLAGS(FrameValueAttrib::ErrorFlags)
#endif

View File

@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "mac.h"
#include "framevalueattrib.h"
#include "../common/streambase.h"
#include <QRegExp>
@ -371,3 +372,28 @@ int MacProtocol::protocolFrameVariableCount() const
return count;
}
QByteArray MacProtocol::protocolFrameValue(int streamIndex, bool /*forCksum*/,
FrameValueAttrib *attrib) const
{
QByteArray ba;
ba.resize(12);
quint64 dstMac = fieldData(mac_dstAddr, FieldValue, streamIndex)
.toULongLong();
quint64 srcMac = fieldData(mac_srcAddr, FieldValue, streamIndex)
.toULongLong();
char *p = ba.data();
*(quint32*)(p ) = qToBigEndian(quint32(dstMac >> 16));
*(quint16*)(p + 4) = qToBigEndian(quint16(dstMac & 0xffff));
*(quint32*)(p + 6) = qToBigEndian(quint32(srcMac >> 16));
*(quint16*)(p + 10) = qToBigEndian(quint16(srcMac & 0xffff));
if (attrib) {
if (!dstMac && data.dst_mac_mode() == OstProto::Mac::e_mm_resolve)
attrib->errorFlags |= FrameValueAttrib::UnresolvedDstMacError;
if (!srcMac && data.src_mac_mode() == OstProto::Mac::e_mm_resolve)
attrib->errorFlags |= FrameValueAttrib::UnresolvedSrcMacError;
}
return ba;
}

View File

@ -65,6 +65,9 @@ public:
virtual int protocolFrameVariableCount() const;
virtual QByteArray protocolFrameValue(int streamIndex = 0,
bool forCksum = false, FrameValueAttrib *attrib = nullptr) const;
private:
OstProto::Mac data;
mutable bool forResolve_;

View File

@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "streambase.h"
#include "abstractprotocol.h"
#include "framevalueattrib.h"
#include "protocollist.h"
#include "protocollistiterator.h"
#include "protocolmanager.h"
@ -536,7 +537,8 @@ int StreamBase::frameCount() const
// Returns packet length - if bufMaxSize < frameLen(), returns truncated
// length i.e. bufMaxSize
int StreamBase::frameValue(uchar *buf, int bufMaxSize, int frameIndex) const
int StreamBase::frameValue(uchar *buf, int bufMaxSize, int frameIndex,
FrameValueAttrib *attrib) const
{
int maxSize, size, pktLen, len = 0;
@ -556,10 +558,13 @@ int StreamBase::frameValue(uchar *buf, int bufMaxSize, int frameIndex) const
while (iter->hasNext())
{
AbstractProtocol *proto;
QByteArray ba;
QByteArray ba;
FrameValueAttrib protoAttrib;
proto = iter->next();
ba = proto->protocolFrameValue(frameIndex);
ba = proto->protocolFrameValue(frameIndex, false, &protoAttrib);
if (attrib)
*attrib += protoAttrib;
size = qMin(ba.size(), maxSize-len);
memcpy(buf+len, ba.constData(), size);

View File

@ -28,6 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
const int kFcsSize = 4;
class AbstractProtocol;
class FrameValueAttrib;
class ProtocolList;
class ProtocolListIterator;
@ -136,7 +137,8 @@ public:
int frameVariableCount() const;
int frameProtocolLength(int frameIndex) const;
int frameCount() const;
int frameValue(uchar *buf, int bufMaxSize, int frameIndex) const;
int frameValue(uchar *buf, int bufMaxSize, int frameIndex,
FrameValueAttrib *attrib = nullptr) const;
quint64 deviceMacAddress(int frameIndex) const;
quint64 neighborMacAddress(int frameIndex) const;

View File

@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "abstractport.h"
#include "../common/abstractprotocol.h"
#include "../common/framevalueattrib.h"
#include "../common/streambase.h"
#include "devicemanager.h"
#include "interfaceinfo.h"
@ -219,6 +220,7 @@ void AbstractPort::updatePacketList()
void AbstractPort::updatePacketListSequential()
{
FrameValueAttrib packetListAttrib;
long sec = 0;
long nsec = 0;
@ -320,8 +322,10 @@ void AbstractPort::updatePacketListSequential()
if (j == 0 || frameVariableCount > 1)
{
FrameValueAttrib attrib;
len = streamList_[i]->frameValue(
pktBuf_, sizeof(pktBuf_), j);
pktBuf_, sizeof(pktBuf_), j, &attrib);
packetListAttrib += attrib;
}
if (len <= 0)
continue;
@ -392,10 +396,14 @@ void AbstractPort::updatePacketListSequential()
_stop_no_more_pkts:
isSendQueueDirty_ = false;
// FIXME: send attrib back in Ack
qDebug("PacketListAttrib = %x", (int)packetListAttrib.errorFlags);
}
void AbstractPort::updatePacketListInterleaved()
{
FrameValueAttrib packetListAttrib;
int numStreams = 0;
quint64 minGap = ULLONG_MAX;
quint64 duration = quint64(1e9);
@ -540,11 +548,14 @@ void AbstractPort::updatePacketListInterleaved()
}
else
{
FrameValueAttrib attrib;
isVariable.append(false);
pktBuf.append(QByteArray());
pktBuf.last().resize(kMaxPktSize);
pktLen.append(streamList_[i]->frameValue(
(uchar*)pktBuf.last().data(), pktBuf.last().size(), 0));
(uchar*)pktBuf.last().data(), pktBuf.last().size(),
0, &attrib));
packetListAttrib += attrib;
}
numStreams++;
@ -573,9 +584,11 @@ void AbstractPort::updatePacketListInterleaved()
{
if (isVariable.at(i))
{
FrameValueAttrib attrib;
buf = pktBuf_;
len = streamList_[i]->frameValue(pktBuf_, sizeof(pktBuf_),
pktCount[i]);
pktCount[i], &attrib);
packetListAttrib += attrib;
}
else
{
@ -629,6 +642,9 @@ void AbstractPort::updatePacketListInterleaved()
qDebug("loop Delay = %lld/%lld", delaySec, delayNsec);
setPacketListLoopMode(true, delaySec, delayNsec);
isSendQueueDirty_ = false;
// FIXME: send attrib back in Ack
qDebug("PacketListAttrib = %x", (int)packetListAttrib.errorFlags);
}
void AbstractPort::stats(PortStats *stats)