Skip to content

Commit

Permalink
cmd_pipe_reader: fix broken logic when receiving split block transfer…
Browse files Browse the repository at this point in the history
… data

If a NextHeaderPointer was present in an incoming packet it was used as
the start of the payload data. This old code worked before Continuation
frames were added. Now it just broke the incoming data framing.

This makes long block transfers work via the command pipe again!
  • Loading branch information
flueke committed Oct 22, 2024
1 parent 2b3a8bd commit a5082c6
Showing 1 changed file with 5 additions and 30 deletions.
35 changes: 5 additions & 30 deletions src/mesytec-mvlc/mvlc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -551,39 +551,14 @@ void cmd_pipe_reader(ReaderContext &context)
ec = packet.ec;
bytesTransferred += packet.bytesTransferred; // This includes all eth overhead.

size_t headerOffsetWords = 0;

// If a header pointer is present use it as the start of the payload
// data. Otherwise use the full payload contained in the packet.
if (packet.hasNextHeaderPointer())
{
if (packet.isNextHeaderPointerValid())
{
headerOffsetWords = packet.nextHeaderPointer();
}
else if (!ec)
{
logger->warn("cmd_pipe_reader: invalid nextHeaderPointer ({}) in packet containing {} data words ({} payload words, ec={})",
packet.nextHeaderPointer(), packet.dataWordCount(), packet.availablePayloadWords(), ec.message());
}
}

if (headerOffsetWords > 0)
if (packet.bytesTransferred > 0 && packet.hasNextHeaderPointer() && !packet.isNextHeaderPointerValid())
{
logger->warn("skipped {} words of packet data to start payload data from the given nextHeaderPointer ({})",
headerOffsetWords, packet.nextHeaderPointer());
logger->warn(eth::eth_header0_to_string(packet.header0()));
logger->warn(eth::eth_header1_to_string(packet.header1()));
basic_string_view<u32> packetView(reinterpret_cast<const u32*>(packet.buffer), packet.bytesTransferred / sizeof(u32));
log_buffer(logger, spdlog::level::warn, packetView, "cmd_pipe_reader packet buffer", LogBuffersMaxWords);
if (packet.isNextHeaderPointerValid())
{
u32 firstFrameHeader = *(packetView.data() + 2 + packet.nextHeaderPointer());
logger->warn("*nextHeaderPointer=0x{:08x}", firstFrameHeader);
}
logger->warn("cmd_pipe_reader: invalid nextHeaderPointer ({}) in packet containing {} data words ({} payload words, ec={}, packetTotalBytes={})",
packet.nextHeaderPointer(), packet.dataWordCount(), packet.availablePayloadWords(), ec.message(),
packet.bytesTransferred);
}

const u32 *payloadBegin = packet.payloadBegin() + headerOffsetWords;
const u32 *payloadBegin = packet.payloadBegin();
const u32 *payloadEnd = packet.payloadEnd();

// Actual payload goes to the buffer.
Expand Down

0 comments on commit a5082c6

Please sign in to comment.