Skip to content
Snippets Groups Projects
Commit c38b9b58 authored by Jan David Mol's avatar Jan David Mol
Browse files

Task #3696: Split PacketReader into .h + .cc

parent 40d39e3a
Branches
Tags
No related merge requests found
......@@ -3625,6 +3625,7 @@ RTCP/InputProc/src/CMakeLists.txt -text
RTCP/InputProc/src/Generator.cc -text
RTCP/InputProc/src/Generator.h -text
RTCP/InputProc/src/OMPThread.h -text
RTCP/InputProc/src/PacketReader.cc -text
RTCP/InputProc/src/PacketReader.h -text
RTCP/InputProc/src/Poll.h -text
RTCP/InputProc/src/Ranges.cc -text
......
......@@ -4,6 +4,7 @@ lofar_add_library(inputproc
Package__Version.cc
BufferSettings.cc
Generator.cc
PacketReader.cc
Ranges.cc
SharedMemory.cc
StationID.cc
......
#include <lofar_config.h>
#include "PacketReader.h"
#include <Common/LofarLogger.h>
#include <Stream/SocketStream.h>
#include <Interface/RSPTimeStamp.h>
#include <Interface/Stream.h>
#include <boost/format.hpp>
namespace LOFAR {
namespace RTCP {
PacketReader::PacketReader( const std::string &logPrefix, const std::string &streamDescriptor, const struct BufferSettings &settings )
:
logPrefix(str(boost::format("%s [PacketReader] ") % logPrefix)),
settings(settings),
nrReceived(0),
nrBadSize(0),
nrBadTime(0),
nrBadData(0),
nrBadMode(0),
hadSizeError(false),
hadModeError(false)
{
inputStream = createStream(streamDescriptor, true);
SocketStream *asSocket = dynamic_cast<SocketStream *>(inputStream.get());
bool isUDP = asSocket && asSocket->protocol == SocketStream::UDP;
supportPartialReads = !isUDP;
}
bool PacketReader::readPacket( struct RSP &packet )
{
if (supportPartialReads) {
// read header first
inputStream->read(&packet.header, sizeof packet.header);
// read rest of packet
inputStream->read(&packet.payload.data, packet.packetSize() - sizeof packet.header);
++nrReceived;
} else {
// read full packet at once -- numbytes will tell us how much we've actually read
size_t numbytes = inputStream->tryRead(&packet, sizeof packet);
++nrReceived;
if( numbytes < sizeof(struct RSP::Header)
|| numbytes != packet.packetSize() ) {
if (!hadSizeError) {
LOG_ERROR_STR( logPrefix << "Packet is " << numbytes << " bytes, but should be " << packet.packetSize() << " bytes" );
hadSizeError = true;
}
++nrBadSize;
return false;
}
}
// illegal timestamp means illegal packet
if (packet.header.timestamp == ~0U) {
++nrBadTime;
return false;
}
// check sanity of packet
// discard packets with errors
if (packet.payloadError()) {
++nrBadData;
return false;
}
// check whether the station configuration matches ours
if (packet.clockMHz() * 1000000 != settings.station.clock
|| packet.bitMode() != settings.station.bitmode) {
if (!hadModeError) {
LOG_ERROR_STR( logPrefix << "Packet has mode (" << packet.clockMHz() << " MHz, " << packet.bitMode() << " bit), but should be mode (" << settings.station.clock / 1000000 << " MHz, " << settings.station.bitmode << " bit)");
hadModeError = true;
}
++nrBadMode;
return false;
}
return true;
}
void PacketReader::logStatistics()
{
LOG_INFO_STR( logPrefix << "Received " << nrReceived << " packets: " << nrBadTime << " bad timestamps, " << nrBadSize << " bad sizes, " << nrBadData << " payload errors, " << nrBadMode << " clock/bitmode errors" );
nrReceived = 0;
nrBadTime = 0;
nrBadSize = 0;
nrBadData = 0;
nrBadMode = 0;
hadSizeError = false;
hadModeError = false;
}
}
}
#ifndef __PACKETREADER__
#define __PACKETREADER__
#include <Common/LofarLogger.h>
#include <Stream/Stream.h>
#include <Stream/SocketStream.h>
#include <Interface/RSPTimeStamp.h>
#include <Interface/SmartPtr.h>
#include <Interface/Stream.h>
#include <IONProc/RSP.h>
#include "SampleBuffer.h"
#include "BufferSettings.h"
#include <boost/format.hpp>
#include <string>
namespace LOFAR {
......@@ -39,102 +33,6 @@ private:
bool hadSizeError, hadModeError;
};
PacketReader::PacketReader( const std::string &logPrefix, const std::string &streamDescriptor, const struct BufferSettings &settings )
:
logPrefix(str(boost::format("%s [PacketReader] ") % logPrefix)),
settings(settings),
nrReceived(0),
nrBadSize(0),
nrBadTime(0),
nrBadData(0),
nrBadMode(0),
hadSizeError(false),
hadModeError(false)
{
inputStream = createStream(streamDescriptor, true);
SocketStream *asSocket = dynamic_cast<SocketStream *>(inputStream.get());
bool isUDP = asSocket && asSocket->protocol == SocketStream::UDP;
supportPartialReads = !isUDP;
}
bool PacketReader::readPacket( struct RSP &packet )
{
if (supportPartialReads) {
// read header first
inputStream->read(&packet.header, sizeof packet.header);
// read rest of packet
inputStream->read(&packet.payload.data, packet.packetSize() - sizeof packet.header);
++nrReceived;
} else {
// read full packet at once -- numbytes will tell us how much we've actually read
size_t numbytes = inputStream->tryRead(&packet, sizeof packet);
++nrReceived;
if( numbytes < sizeof(struct RSP::Header)
|| numbytes != packet.packetSize() ) {
if (!hadSizeError) {
LOG_ERROR_STR( logPrefix << "Packet is " << numbytes << " bytes, but should be " << packet.packetSize() << " bytes" );
hadSizeError = true;
}
++nrBadSize;
return false;
}
}
// illegal timestamp means illegal packet
if (packet.header.timestamp == ~0U) {
++nrBadTime;
return false;
}
// check sanity of packet
// discard packets with errors
if (packet.payloadError()) {
++nrBadData;
return false;
}
// check whether the station configuration matches ours
if (packet.clockMHz() * 1000000 != settings.station.clock
|| packet.bitMode() != settings.station.bitmode) {
if (!hadModeError) {
LOG_ERROR_STR( logPrefix << "Packet has mode (" << packet.clockMHz() << " MHz, " << packet.bitMode() << " bit), but should be mode (" << settings.station.clock / 1000000 << " MHz, " << settings.station.bitmode << " bit)");
hadModeError = true;
}
++nrBadMode;
return false;
}
return true;
}
void PacketReader::logStatistics()
{
LOG_INFO_STR( logPrefix << "Received " << nrReceived << " packets: " << nrBadTime << " bad timestamps, " << nrBadSize << " bad sizes, " << nrBadData << " payload errors, " << nrBadMode << " clock/bitmode errors" );
nrReceived = 0;
nrBadTime = 0;
nrBadSize = 0;
nrBadData = 0;
nrBadMode = 0;
hadSizeError = false;
hadModeError = false;
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment