Read nanosec PCAP files natively in non-pdml mode
In PDML mode, nanosecond support is already present - in fact, only nanosecond is supported not microseconds. Updates #238
This commit is contained in:
parent
a89400a4e5
commit
0f322fb2d8
@ -33,6 +33,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
const quint32 kPcapFileMagic = 0xa1b2c3d4;
|
const quint32 kPcapFileMagic = 0xa1b2c3d4;
|
||||||
const quint32 kPcapFileMagicSwapped = 0xd4c3b2a1;
|
const quint32 kPcapFileMagicSwapped = 0xd4c3b2a1;
|
||||||
|
const quint32 kNanoSecondPcapFileMagic = 0xa1b23c4d;
|
||||||
|
const quint32 kNanoSecondPcapFileMagicSwapped = 0x4d3cb2a1;
|
||||||
const quint16 kPcapFileVersionMajor = 2;
|
const quint16 kPcapFileVersionMajor = 2;
|
||||||
const quint16 kPcapFileVersionMinor = 4;
|
const quint16 kPcapFileVersionMinor = 4;
|
||||||
const quint32 kMaxSnapLen = 65535;
|
const quint32 kMaxSnapLen = 65535;
|
||||||
@ -92,11 +94,12 @@ bool PcapFileFormat::open(const QString fileName,
|
|||||||
QTemporaryFile file2;
|
QTemporaryFile file2;
|
||||||
quint32 magic;
|
quint32 magic;
|
||||||
uchar gzipMagic[2];
|
uchar gzipMagic[2];
|
||||||
|
bool nsecResolution = false;
|
||||||
int len;
|
int len;
|
||||||
PcapFileHeader fileHdr;
|
PcapFileHeader fileHdr;
|
||||||
PcapPacketHeader pktHdr;
|
PcapPacketHeader pktHdr;
|
||||||
OstProto::Stream *prevStream = NULL;
|
OstProto::Stream *prevStream = NULL;
|
||||||
uint lastUsec = 0;
|
quint64 lastXsec = 0;
|
||||||
int pktCount;
|
int pktCount;
|
||||||
qint64 byteCount = 0;
|
qint64 byteCount = 0;
|
||||||
qint64 byteTotal;
|
qint64 byteTotal;
|
||||||
@ -166,15 +169,22 @@ _retry:
|
|||||||
{
|
{
|
||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
else if (magic == kPcapFileMagicSwapped)
|
else if (magic == kNanoSecondPcapFileMagic)
|
||||||
|
{
|
||||||
|
nsecResolution = true;
|
||||||
|
}
|
||||||
|
else if ((magic == kPcapFileMagicSwapped)
|
||||||
|
|| (magic == kNanoSecondPcapFileMagicSwapped))
|
||||||
{
|
{
|
||||||
// Toggle Byte order
|
// Toggle Byte order
|
||||||
if (fd_.byteOrder() == QDataStream::BigEndian)
|
if (fd_.byteOrder() == QDataStream::BigEndian)
|
||||||
fd_.setByteOrder(QDataStream::LittleEndian);
|
fd_.setByteOrder(QDataStream::LittleEndian);
|
||||||
else
|
else
|
||||||
fd_.setByteOrder(QDataStream::BigEndian);
|
fd_.setByteOrder(QDataStream::BigEndian);
|
||||||
|
|
||||||
|
nsecResolution = (magic == kNanoSecondPcapFileMagicSwapped);
|
||||||
}
|
}
|
||||||
else // Not a pcap file
|
else // Not a pcap file (could be pcapng or something else)
|
||||||
{
|
{
|
||||||
if (tryConvert)
|
if (tryConvert)
|
||||||
{
|
{
|
||||||
@ -460,6 +470,7 @@ _retry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_non_pdml:
|
_non_pdml:
|
||||||
|
qDebug("pcap resolution: %s", nsecResolution ? "nsec" : "usec");
|
||||||
emit status("Reading Packets...");
|
emit status("Reading Packets...");
|
||||||
emit target(100); // in percentage
|
emit target(100); // in percentage
|
||||||
pktCount = 1;
|
pktCount = 1;
|
||||||
@ -487,17 +498,17 @@ _non_pdml:
|
|||||||
stream->mutable_control()->set_num_packets(1);
|
stream->mutable_control()->set_num_packets(1);
|
||||||
|
|
||||||
// setup packet rate to the timing in pcap (as close as possible)
|
// setup packet rate to the timing in pcap (as close as possible)
|
||||||
const double kUsecsInSec = 1e6;
|
const double kXsecsInSec = nsecResolution ? 1e9 : 1e6;
|
||||||
uint usec = (pktHdr.tsSec*kUsecsInSec + pktHdr.tsUsec);
|
quint64 xsec = (pktHdr.tsSec*kXsecsInSec + pktHdr.tsUsec);
|
||||||
uint delta = usec - lastUsec;
|
quint64 delta = xsec - lastXsec;
|
||||||
|
|
||||||
if ((pktCount != 1) && delta)
|
if ((pktCount != 1) && delta)
|
||||||
stream->mutable_control()->set_packets_per_sec(kUsecsInSec/delta);
|
stream->mutable_control()->set_packets_per_sec(kXsecsInSec/delta);
|
||||||
|
|
||||||
if (prevStream)
|
if (prevStream)
|
||||||
prevStream->mutable_control()->CopyFrom(stream->control());
|
prevStream->mutable_control()->CopyFrom(stream->control());
|
||||||
|
|
||||||
lastUsec = usec;
|
lastXsec = xsec;
|
||||||
prevStream = stream;
|
prevStream = stream;
|
||||||
pktCount++;
|
pktCount++;
|
||||||
qDebug("pktCount = %d", pktCount);
|
qDebug("pktCount = %d", pktCount);
|
||||||
|
Loading…
Reference in New Issue
Block a user