Checksum failure logging to stderr for debugging

checksum-failure-logging
Paul Hollinsky 2019-11-06 10:24:55 -05:00
parent f0582697a6
commit f16ee630ee
2 changed files with 37 additions and 1 deletions

View File

@ -41,6 +41,7 @@ bool Packetizer::input(const std::vector<uint8_t>& inputBytes) {
state = ReadState::ParseHeader;
currentIndex = 1;
} else {
std::cerr << "Discarding byte " << std::hex << std::setw(2) << std::setfill('0') << int(bytes.front()) << std::endl;
bytes.pop_front(); // Discard
}
break;
@ -81,6 +82,21 @@ bool Packetizer::input(const std::vector<uint8_t>& inputBytes) {
* payload, and not the header or checksum.
*/
if(packetLength < 4 || packetLength > 4000) {
std::cerr << "====================================\n";
std::cerr << "An improper packet has occurred!\n";
std::cerr << "Packet: (" << std::dec << packetLength << ")\n";
std::cerr << '\t';
for(auto i = 0; i < std::min(packetLength, 16); i++)
std::cerr << std::hex << std::setw(2) << std::setfill('0') << int(bytes[i]) << ' ';
std::cerr << std::endl;
std::cerr << "Previous: (" << std::dec << previousPacket.data.size() << ") " << previousPacket.network << '\n';
for(auto i = 0; i < previousPacket.data.size(); i += 16) {
std::cerr << '\t';
for(auto j = 0; j < 16 && (i + j) < previousPacket.data.size(); j++)
std::cerr << std::hex << std::setw(2) << std::setfill('0') << int(previousPacket.data[i+j]) << ' ';
std::cerr << std::endl;
}
std::cerr << "====================================\n";
bytes.pop_front();
EventManager::GetInstance().add(APIEvent::Type::FailedToRead, APIEvent::Severity::Error);
state = ReadState::SearchForHeader;
@ -112,8 +128,28 @@ bool Packetizer::input(const std::vector<uint8_t>& inputBytes) {
} else {
if(gotGoodPackets) // Don't complain unless we've already gotten a good packet, in case we started in the middle of a stream
report(APIEvent::Type::PacketChecksumError, APIEvent::Severity::Error);
std::cerr << "====================================\n";
std::cerr << "A checksum error has occurred!\n";
std::cerr << "Packet: (" << std::dec << packet.data.size() << ") " << packet.network << '\n';
for(auto i = 0; i < packet.data.size(); i += 16) {
std::cerr << '\t';
for(auto j = 0; j < 16 && (i + j) < packet.data.size(); j++)
std::cerr << std::hex << std::setw(2) << std::setfill('0') << int(packet.data[i+j]) << ' ';
std::cerr << std::endl;
}
std::cerr << "Previous: (" << std::dec << previousPacket.data.size() << ") " << previousPacket.network << '\n';
for(auto i = 0; i < previousPacket.data.size(); i += 16) {
std::cerr << '\t';
for(auto j = 0; j < 16 && (i + j) < previousPacket.data.size(); j++)
std::cerr << std::hex << std::setw(2) << std::setfill('0') << int(previousPacket.data[i+j]) << ' ';
std::cerr << std::endl;
}
std::cerr << "====================================\n";
bytes.pop_front(); // Drop the first byte so it doesn't get picked up again
}
previousPacket = packet;
// Reset for the next packet
currentIndex = 0;

View File

@ -37,7 +37,7 @@ private:
int headerSize = 0;
bool checksum = false;
bool gotGoodPackets = false; // Tracks whether we've ever gotten a good packet
Packet packet;
Packet packet, previousPacket;
std::deque<uint8_t> bytes;
std::vector<std::shared_ptr<Packet>> processedPackets;